数据工厂系列(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运行日志、平台数据统计...

相关推荐
RainbowJie15 分钟前
Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力
java·服务器·spring boot·后端·python·单元测试·maven
工作碎碎念7 分钟前
NumPy------数值计算
python
工作碎碎念15 分钟前
pandas
python
A7bert7771 小时前
【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
c++·人工智能·python·深度学习·yolo·目标检测·机器学习
冷月半明1 小时前
时间序列篇:Prophet负责优雅,LightGBM负责杀疯
python·算法
教练我想打篮球_基本功重塑版2 小时前
L angChain 加载大模型
python·langchain
三翼鸟数字化技术团队2 小时前
AI应用--接口测试篇
测试
跟橙姐学代码4 小时前
手把手教你玩转 multiprocessing,让程序跑得飞起
前端·python·ipython
LCS-3124 小时前
Python爬虫实战: 爬虫常用到的技术及方案详解
开发语言·爬虫·python
穷儒公羊4 小时前
第二章 设计模式故事会之策略模式:魔王城里的勇者传说
python·程序人生·设计模式·面试·跳槽·策略模式·设计规范