likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 30

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

回顾

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

同步逻辑设计

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

  • 新增逻辑
    @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解析进去,至于如何用模型入参,有兴趣的小伙伴可以尝试一下

  • 更新逻辑
@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)
  • 删除逻辑
    @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数据
    @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的数据

先来第一种... 数据工厂系列(24)项目同步-下篇 以apidoc数据为准,通过函数名,查找匹配数据,匹配到了,进行俩俩比对,数据没变化,不更新数据,数据有变化,更新数据;如果没匹配到,就是新数据,直接新增一条数据

第二种... 数据工厂系列(24)项目同步-下篇 以表里数据为准,通过函数名,查找匹配数据,匹配到了,不处理数据,匹配不到数据,说明最新的apidoc数据里没有这条数据

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

处理同步信息

数据工厂系列(24)项目同步-下篇 这里为了前端展示更加好看,用了p标签和span标签包裹着同步信息--此idea来源于pity,无敌哥yyds

数据同步逻辑补充

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

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

效果展示

数据工厂系列(24)项目同步-下篇 好像有点翻车,看看前端代码,用的是哪个字段 数据工厂系列(24)项目同步-下篇 前端用的是msg字段的数据进行展示,emmmm,那我们改一下返参吧

数据工厂系列(24)项目同步-下篇 修改后,展示效果 数据工厂系列(24)项目同步-下篇

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

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

总结

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