数据工厂系列(24)项目同步-下篇

大家好~我是小方,欢迎大家关注笋货测试笔记 体完记得俾个like

回顾

在上篇最后环节,我们只是设计了脚本表结构,同步逻辑暂未编写完毕,今天目标:把剩下的步骤完成

同步逻辑设计

同步逻辑,其实就是apidoc数据跟表里的数据相互比对,先查询,后根据比对结果进行增删改操作,所以接下来,先设计cases的crud功能

  • 新增逻辑
python 复制代码
    @classmethod
    def insert_case(cls, project_id: int , title: str, name: str, description: str, group_name: str, header: str, owner: str, path: str,
                    param_in: str, param_out: str, example_param_in: str, example_param_out: str, user: dict) -> None:
        """
        新增造数场景
        :param project_id: 项目id
        :param title: 标题
        :param name: 方法名
        :param description: 描述信息
        :param group_name: 分组名
        :param header: 请求头
        :param owner: 负责人
        :param path: 路径
        :param param_in: 请求参数
        :param param_out: 返回参数
        :param example_param_in: 请求示例
        :param example_param_out: 返回示例
        :param user: 用户数据
        :return:
        """
        ant = cls.get_with_existed(project_id = project_id, name = name)
        if ant:
            raise BusinessException("造数场景已存在!!!")
        case = DataFactoryCases(project_id, title, name, description, group_name, header, owner, path, param_in,
                                 param_out, example_param_in, example_param_out, user)
        cls.insert_by_model(model_obj = case)

这里我没用模型进行入参,因为考虑到解析回来的apidoc数据都是dict类型,到时候直接**xxx解析进去,至于如何用模型入参,有兴趣的小伙伴可以尝试一下

  • 更新逻辑
python 复制代码
@classmethod
    def update_case(cls, cases_id: int, title: str, name: str, description: str, group_name: str, header: str, owner: str, path: str,
                    param_in: str, param_out: str, example_param_in: str, example_param_out: str, user: dict) -> None:
        """
        更新造数场景
        :param cases_id: 主键id
        :param title: 标题
        :param name: 方法名
        :param description: 描述信息
        :param group_name: 分组名
        :param header: 请求头
        :param owner: 负责人
        :param path: 路径
        :param param_in: 请求参数
        :param param_out: 返回参数
        :param example_param_in: 请求示例
        :param example_param_out: 返回示例
        :param user: 用户数据
        :return:
        """
        ant = cls.get_with_existed(id=cases_id)
        if not ant:
            raise BusinessException("造数场景不存在!!!")
        update_map = {
            "id": cases_id,
            "title": title,
            "name": name,
            "description": description,
            "group_name": group_name,
            "header": header,
            "owner": owner,
            "path": path,
            "param_in": param_in,
            "param_out": param_out,
            "example_param_in": example_param_in,
            "example_param_out": example_param_out
        }
        cls.update_by_id(model = update_map, user = user)
  • 删除逻辑
python 复制代码
    @classmethod
    def delete_case(cls, cases_id: int, user: dict) -> None:
        """
        删除造数场景
        :param cases_id: 主键id
        :param user: 用户数据
        :return:
        """
        ant = cls.get_with_existed(id=cases_id)
        if not ant:
            raise BusinessException("造数场景不存在!!!")
        cls.delete_by_id(id = cases_id, user = user)
  • 根据项目id查询case数据
python 复制代码
    @classmethod
    def get_projet_case(cls, project_id: int) -> DataFactoryCases:
        """
        获取项目下的所有造数场景
        :param project_id: 项目id
        :return:
        """
        case_infos = cls.get_with_params(project_id = project_id, _fields = CaseDto)
        return case_infos

上面的这几个增删改查逻辑比较简单,大家有空可以看看源码

  • 数据比对 这里数据比对,主要分为两种,第一种,以apidoc数据为准,遍历表里的数据,第二种,以表里的数据为准,反匹配apidoc的数据

先来第一种... 以apidoc数据为准,通过函数名,查找匹配数据,匹配到了,进行俩俩比对,数据没变化,不更新数据,数据有变化,更新数据;如果没匹配到,就是新数据,直接新增一条数据

第二种... 以表里数据为准,通过函数名,查找匹配数据,匹配到了,不处理数据,匹配不到数据,说明最新的apidoc数据里没有这条数据

  • 最终返回 最后返回一个字典,里面存放新增/删除/更新的case标题

处理同步信息

这里为了前端展示更加好看,用了p标签和span标签包裹着同步信息--此idea来源于pity,无敌哥yyds

数据同步逻辑补充

还记得之前的步骤么?这里我们算是设计完整个同步逻辑,将这些步骤都放进去吧~ project_logic.py补充逻辑

python 复制代码
def sync_project_logic(id: int):
    # 记录是谁同步脚本,顺便判断一下权限
    user = REQUEST_CONTEXT.get().user
    project = ProjectDao.project_detail(id, user)
    
    # step1 git pull 更新项目
    project_path, script_path = ProjectPath.get(project.git_project, project.directory)
    Git.git_pull(project_path, project.git_branch)
    api_doc = ApiDocParse(project_path, script_path)
    
    # step2 执行api_doc命令, 生成api_data.json
    api_doc.exec()
    
    # step3 解析apidoc数据入库,暂时先返回api_data.json数据
    api_data = api_doc.parse_apidoc()
    
    # step4 获取该项目的所有造数场景
    from fastapi.encoders import jsonable_encoder
    project_cases = CaseDao.get_projet_case(project.id)
    project_cases = jsonable_encoder(project_cases)
    
    # step5 处理同步数据
    msg_dict = api_doc.sync_data(project.id, api_data, project_cases, user)
    
    # step6 处理同步消息
    msg = api_doc.sync_msg(**msg_dict)
    return msg

效果展示

好像有点翻车,看看前端代码,用的是哪个字段 前端用的是msg字段的数据进行展示,emmmm,那我们改一下返参吧

修改后,展示效果

总结

截止今天,已经完成了同步项目的逻辑设计,完结撒花,接下来就是围绕case相关的功能设计,点赞、收藏、参数组合、case展示、case运行、case运行日志、平台数据统计...

相关推荐
2501_941875281 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj1 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
泡海椒4 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb4 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
sanjiaomao3335 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
linweidong7 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
小玮看世界7 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
萧鼎7 小时前
2026实战:用 tomlkit 优雅读写 TOML 配置,告别手写解析器
python·开源·教程·python库
小刘在重生~8 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
2601_962099468 小时前
Python xlwt设置excel单元格字体及格式
python·excel·xlwt·样式设置·单元格格式