style: 统一代码格式和字符串引号使用

refactor: 优化代码结构和可读性

feat: 添加http_limit模块实现请求限制功能

fix: 修复异步任务中使用time.sleep的问题

chore: 更新依赖项并添加pytest测试框架

docs: 更新项目描述信息

perf: 优化Redis序列化方式使用JSON替代pickle

test: 添加测试相关配置和依赖
This commit is contained in:
zhangtao
2026-01-17 20:07:25 +08:00
parent 32b8f18b17
commit 1d54dca76c
139 changed files with 4920 additions and 2826 deletions
@@ -27,10 +27,14 @@ from .service import DictDataService, DictTypeService
DictRouter = APIRouter(route_class=OperationLogRoute, prefix="/dict", tags=["字典管理"])
@DictRouter.get("/type/detail/{id}", summary="获取字典类型详情", description="获取字典类型详情")
@DictRouter.get(
"/type/detail/{id}",
summary="获取字典类型详情",
description="获取字典类型详情",
)
async def get_type_detail_controller(
id: Annotated[int, Path(description="字典类型ID", ge=1)],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:detail"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:detail"]))],
) -> JSONResponse:
"""
获取字典类型详情
@@ -54,7 +58,7 @@ async def get_type_detail_controller(
async def get_type_list_controller(
page: Annotated[PaginationQueryParam, Depends()],
search: Annotated[DictTypeQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:query"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:query"]))],
) -> JSONResponse:
"""
查询字典类型
@@ -70,15 +74,25 @@ async def get_type_list_controller(
异常:
- CustomException: 查询字典类型失败时抛出异常。
"""
result_dict_list = await DictTypeService.get_obj_list_service(auth=auth, search=search, order_by=page.order_by)
result_dict = await PaginationService.paginate(data_list=result_dict_list, page_no=page.page_no, page_size=page.page_size)
result_dict_list = await DictTypeService.get_obj_list_service(
auth=auth, search=search, order_by=page.order_by
)
result_dict = await PaginationService.paginate(
data_list=result_dict_list,
page_no=page.page_no,
page_size=page.page_size,
)
log.info("查询字典类型列表成功")
return SuccessResponse(data=result_dict, msg="查询字典类型列表成功")
@DictRouter.get("/type/optionselect", summary="获取全部字典类型", description="获取全部字典类型")
@DictRouter.get(
"/type/optionselect",
summary="获取全部字典类型",
description="获取全部字典类型",
)
async def get_type_loptionselect_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:query"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:query"]))],
) -> JSONResponse:
"""
获取全部字典类型
@@ -101,7 +115,7 @@ async def get_type_loptionselect_controller(
async def create_type_controller(
data: DictTypeCreateSchema,
redis: Annotated[Redis, Depends(redis_getter)],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:create"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:create"]))],
) -> JSONResponse:
"""
创建字典类型
@@ -127,7 +141,7 @@ async def update_type_controller(
data: DictTypeUpdateSchema,
redis: Annotated[Redis, Depends(redis_getter)],
id: Annotated[int, Path(description="字典类型ID", ge=1)],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:update"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:update"]))],
) -> JSONResponse:
"""
修改字典类型
@@ -153,7 +167,7 @@ async def update_type_controller(
async def delete_type_controller(
redis: Annotated[Redis, Depends(redis_getter)],
ids: Annotated[list[int], Body(description="ID列表")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:delete"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:delete"]))],
) -> JSONResponse:
"""
删除字典类型
@@ -174,10 +188,14 @@ async def delete_type_controller(
return SuccessResponse(msg="删除字典类型成功")
@DictRouter.patch("/type/available/setting", summary="批量修改字典类型状态", description="批量修改字典类型状态")
@DictRouter.patch(
"/type/available/setting",
summary="批量修改字典类型状态",
description="批量修改字典类型状态",
)
async def batch_set_available_dict_type_controller(
data: BatchSetAvailable,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:patch"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:patch"]))],
) -> JSONResponse:
"""
批量修改字典类型状态
@@ -197,10 +215,10 @@ async def batch_set_available_dict_type_controller(
return SuccessResponse(msg="批量修改字典类型状态成功")
@DictRouter.post('/type/export', summary="导出字典类型", description="导出字典类型")
@DictRouter.post("/type/export", summary="导出字典类型", description="导出字典类型")
async def export_type_list_controller(
search: Annotated[DictTypeQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:export"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_type:export"]))],
) -> StreamingResponse:
"""
导出字典类型
@@ -218,21 +236,23 @@ async def export_type_list_controller(
# 获取全量数据
result_dict_list = await DictTypeService.get_obj_list_service(search=search, auth=auth)
export_result = await DictTypeService.export_obj_service(data_list=result_dict_list)
log.info('导出字典类型成功')
log.info("导出字典类型成功")
return StreamResponse(
data=bytes2file_response(export_result),
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
headers={
'Content-Disposition': 'attachment; filename=dict_type.xlsx'
}
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
headers={"Content-Disposition": "attachment; filename=dict_type.xlsx"},
)
@DictRouter.get("/data/detail/{id}", summary="获取字典数据详情", description="获取字典数据详情")
@DictRouter.get(
"/data/detail/{id}",
summary="获取字典数据详情",
description="获取字典数据详情",
)
async def get_data_detail_controller(
id: Annotated[int, Path(description="字典数据ID", ge=1)],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:detail"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:detail"]))],
) -> JSONResponse:
"""
获取字典数据详情
@@ -256,7 +276,7 @@ async def get_data_detail_controller(
async def get_data_list_controller(
page: Annotated[PaginationQueryParam, Depends()],
search: Annotated[DictDataQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:query"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:query"]))],
) -> JSONResponse:
"""
查询字典数据
@@ -275,8 +295,14 @@ async def get_data_list_controller(
order_by = [{"order": "asc"}]
if page.order_by:
order_by = page.order_by
result_dict_list = await DictDataService.get_obj_list_service(auth=auth, search=search, order_by=order_by)
result_dict = await PaginationService.paginate(data_list=result_dict_list, page_no=page.page_no, page_size=page.page_size)
result_dict_list = await DictDataService.get_obj_list_service(
auth=auth, search=search, order_by=order_by
)
result_dict = await PaginationService.paginate(
data_list=result_dict_list,
page_no=page.page_no,
page_size=page.page_size,
)
log.info("查询字典数据列表成功")
return SuccessResponse(data=result_dict, msg="查询字典数据列表成功")
@@ -285,7 +311,7 @@ async def get_data_list_controller(
async def create_data_controller(
data: DictDataCreateSchema,
redis: Annotated[Redis, Depends(redis_getter)],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:create"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:create"]))],
) -> JSONResponse:
"""
创建字典数据
@@ -311,7 +337,7 @@ async def update_data_controller(
data: DictDataUpdateSchema,
redis: Annotated[Redis, Depends(redis_getter)],
id: Annotated[int, Path(description="字典数据ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:update"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:update"]))],
) -> JSONResponse:
"""
修改字典数据
@@ -337,7 +363,7 @@ async def update_data_controller(
async def delete_data_controller(
redis: Annotated[Redis, Depends(redis_getter)],
ids: Annotated[list[int], Body(description="ID列表")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:delete"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:delete"]))],
) -> JSONResponse:
"""
删除字典数据
@@ -358,10 +384,14 @@ async def delete_data_controller(
return SuccessResponse(msg="删除字典数据成功")
@DictRouter.patch("/data/available/setting", summary="批量修改字典数据状态", description="批量修改字典数据状态")
@DictRouter.patch(
"/data/available/setting",
summary="批量修改字典数据状态",
description="批量修改字典数据状态",
)
async def batch_set_available_dict_data_controller(
data: BatchSetAvailable,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:patch"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:patch"]))],
) -> JSONResponse:
"""
批量修改字典数据状态
@@ -381,11 +411,11 @@ async def batch_set_available_dict_data_controller(
return SuccessResponse(msg="批量修改字典数据状态成功")
@DictRouter.post('/data/export', summary="导出字典数据", description="导出字典数据")
@DictRouter.post("/data/export", summary="导出字典数据", description="导出字典数据")
async def export_data_list_controller(
search: Annotated[DictDataQueryParam, Depends()],
page: Annotated[PaginationQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:export"]))]
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dict_data:export"]))],
) -> StreamingResponse:
"""
导出字典数据
@@ -401,23 +431,26 @@ async def export_data_list_controller(
异常:
- CustomException: 导出字典数据失败时抛出异常。
"""
result_dict_list = await DictDataService.get_obj_list_service(auth=auth, search=search, order_by=page.order_by)
result_dict_list = await DictDataService.get_obj_list_service(
auth=auth, search=search, order_by=page.order_by
)
export_result = await DictDataService.export_obj_service(data_list=result_dict_list)
log.info('导出字典数据成功')
log.info("导出字典数据成功")
return StreamResponse(
data=bytes2file_response(export_result),
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
headers={
'Content-Disposition': 'attachment; filename=dice_data.xlsx'
}
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
headers={"Content-Disposition": "attachment; filename=dice_data.xlsx"},
)
@DictRouter.get('/data/info/{dict_type}', summary="根据字典类型获取数据", description="根据字典类型获取数据")
@DictRouter.get(
"/data/info/{dict_type}",
summary="根据字典类型获取数据",
description="根据字典类型获取数据",
)
async def get_init_dict_data_controller(
dict_type: str,
redis: Annotated[Redis, Depends(redis_getter)]
dict_type: str, redis: Annotated[Redis, Depends(redis_getter)]
) -> JSONResponse:
"""
根据字典类型获取数据