# fisco-api-demo **Repository Path**: nb-sb/fisco-api-demo ## Basic Information - **Project Name**: fisco-api-demo - **Description**: python flask 调用fisco api 案例 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-04-09 - **Last Updated**: 2025-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fisco-api-demo #### 介绍 🐮🍺 **润物细无声** :封装了所有合约通用的后端api可以快速开发! 🍫区块链基础系统开发后端脚手架,在python flask中已经封装了mysql、redis、fisco bcos的api调用流程,并且对调用接口封装了通用调用流程 ⛵️而且里面包含使用docker一件部署开发环境,包括fisco bcos链,webase front,mysql,redis等,让开发者可以快速开发,里面如果用不到可以自行进行删减和扩展 也就是说 封装完善的python flask后端👝 + 一键部署开发环境的脚本 📒 😁强强联合,开发 区块链 应用从此简单 👍 优点:docker-compose一键架链和相关环境+封装好的python代码可以动态匹配合约abi自适用 首先将代码下载到本地 ![image-20240411183932293](./doc/image-20240411183932293.png) ## 零、超级简单的配置方法 仅需配置数据库的相关信息和redis,webase-front的相关信息即可完成90%的接口编写了 ![image-20240410203427065](./doc/image-20240410203427065-2832385.png) 问:我是小白,这个数据库啥的安装很费时间的!感觉给我解决!!! 答:使用docker-compose一件部署环境,已经写好了脚本了,仅需上传到自己虚拟机(linux服务器)中,直接执行启动脚本 bash start.sh 即可一键部署mysql、redis、webase front、node节点环境,傻瓜式部署! ![image-20240410203713350](./doc/image-20240410203713350-2832385.png) 此脚本让你`1分钟`配置好你做基本区块链系统的所有环境!别人还在找教程搜一些环境中怎么搭建,搭建过程中各种bug报错,而你就已经开始沉浸式写代码啦!使用该脚本可以让你省下非常多的时间! 此脚本还可以和此系统进行配套使用,快速开发! 不懂的可以问我(无偿解答,但是要排队,随缘回答,一杯奶茶15¥可以插队) 完整部署流程(linux下部署环境)直接运行下面代码即可 ```shell apt install git git clone https://gitee.com/nb-sb/fisco-api-demo.git cd fisco-api-demo/docker bash start.sh ``` 即可启动webase fron等相关环境,启动后访问自己的webase front地址即可 ## 一、提供了通用的访问webase front的通用api接口 仅需一个接口,就可以调用所有合约方法!无需每个方法写一个接口,避免重复的臃肿代码,让你的代码更加优雅! 封装的通用访问webase front的方式,避免多余的硬编码(也就是没用的cv操作和固定值写法) 比如你想判断接口传入的参数a是string格式,就得用硬编码方式type(a) == str方式一个一个进行判断参数类型,如果参数较多就得很多代码,而且如果这个参数不用了还得硬编码方式进行删除!如果合约参数要100个那是不是得写上千行用于判断类型的代码了?呃呃呃是不是听上去也太SB了吧。。。 为此我写了一个通用的工具包,进行解析合约abi进行动态判断,简直不要太爽。。。 好处就是就算合约无论怎么改动,后端都不用动,自动根据abi适配 代码中会自动根据配置文件中的abi进行解析,并且验证传入的参数类型等是否正确,确保接口安全 ![image-20240410202055605](./doc/image-20240410202055605-2752269-2752753-2832385.png) 并且这个接口会自动根据合约的abi进行自动进行验证传入的参数时候正确,并有相应的提示 ![image-20240410202255319](./doc/image-20240410202255319-2752753-2832385.png) 合约中的set方法如下,会自动验证这个每个参数中是否正确 合约案例如下: ```solidity function set(string memory _a,string _b ,int _c) public returns (string){ a = _a; b = _b; c = _c; return "ok"; } ``` 具体验证参数的代码为: ```python @app.route('/executeContract/', methods=["POST"]) def executeContract(): data = request.get_json() func_name = data.get('func_name') param = data.get('param') if func_name is None or param is None: return gen_result(500, "func_name or param is null") function = parseAbi.get_func_map(func_name) # 判断方法是否存在 if function is None: return gen_result(500, "func_name is not exist") # 如果有参数输入的话 判断输入参数类型时候正确 typename = parseAbi.get_func_map(func_name) for i in range(len(typename)): a = typename[i]['type'] if not parseAbi.type_valid(param[i],a): return gen_result(500, f"param {param[i]} type is not correct,type shoud be {a}") # 如果abi中不需要传入参数的话那么直接为null即可 if not typename: param = None res = common_utils.common_bc_req(func_name,param) if parseAbi.get_result_type_map(func_name) != "null": return gen_result(1, res.text) if res.status_code == 200: res_json = res.json() if res_json['status'] == '0x0': return success_result else: return gen_result(500, res_json['message']) else: return gen_result(res.status_code, res.text) ``` ## 二、提供了通用的调用mysql数据库方法 flask代码示例: 这里以调用查询方法为例 ```python @app.route('/query/', methods=["GET"]) def query(): result = select(request.args.get('field'),request.args.get('tableName'), request.args.get('condition'),request.args.get('current_page'),request.args.get('per_page')) # 返回查询结果 return gen_result(1, result) ``` ![image-20240410202805647](./doc/image-20240410202805647-2752753-2832385.png) 等等,这里以查询为例,还可以自行进行扩展具体的删除、更新、添加等方法,这里仅查询作为事例 ## 三、提供redis的封装方法 使用案例: 仅作为案例,实际开发中应考虑缓存击穿、雪崩等问题对代码进行扩展 ```python @app.route('/getredis/', methods=["POST"]) def getredis(): redis_utils = RedisUtils() redis_utils.set("key1", "value1") print(redis_utils.get("key1")) return redis_utils.get("key1") ``` ## 联系作者解决各种开发难题,你遇到的各种bug问题我都遇到过 作者会Python Flask、Django、Java Spring,Golang、Rest、Rust、Vue、Ts、Js各种框架源码、各种架构如MVC、DDD、六边形等,还有各种附加代码经验 支持定制开发,团队成员9年jd大厂 cto(架构师)、在读研究生4年合约安全研究经验(打过ctf区块链合约安全)、ruoyi后台管理系统框架开发者数年全栈开发经验还有我等都可以帮你协助解决问题 作者WeChat:whn3500079813