大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个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的数据
先来第一种...
以apidoc数据为准,通过函数名,查找匹配数据,匹配到了,进行俩俩比对,数据没变化,不更新数据,数据有变化,更新数据;如果没匹配到,就是新数据,直接新增一条数据
第二种...
以表里数据为准,通过函数名,查找匹配数据,匹配到了,不处理数据,匹配不到数据,说明最新的apidoc数据里没有这条数据
- 最终返回 最后返回一个字典,里面存放新增/删除/更新的case标题
处理同步信息
这里为了前端展示更加好看,用了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
效果展示
好像有点翻车,看看前端代码,用的是哪个字段
前端用的是
msg
字段的数据进行展示,emmmm,那我们改一下返参吧
修改后,展示效果
总结
截止今天,已经完成了同步项目的逻辑设计,完结撒花,接下来就是围绕case相关的功能设计,点赞、收藏、参数组合、case展示、case运行、case运行日志、平台数据统计...
- 项目地址