refactor: 大规模代码重构与项目配置优化

- 调整前端路由前缀为 /web 并新增配置项
- 重构环境变量配置,替换旧环境文件为 dev/prod/test 版本
- 优化后端接口路由与参数校验,替换 dataclass 查询参数为 Pydantic 模型
- 整理后端导入顺序,延迟加载循环依赖模块
- 统一前端 API 调用命名,重构模块命名
- 新增多种响应类型支持,优化代码模板
- 简化后端路由装饰器写法,合并配置参数
This commit is contained in:
zhangtao
2026-07-04 01:23:43 +08:00
parent 845f412e61
commit 349ab7b525
80 changed files with 814 additions and 2004 deletions
@@ -17,11 +17,7 @@ DeptRouter = APIRouter(route_class=OperationLogRoute, prefix="/dept", tags=["部
_DEPT_NS = "dept"
@DeptRouter.get(
"/tree",
summary="查询部门树",
response_model=ResponseSchema[list[DeptOutSchema]],
)
@DeptRouter.get("/tree", summary="查询部门树", response_model=ResponseSchema[list[DeptOutSchema]])
@cache(expire=300, namespace=_DEPT_NS)
async def get_dept_tree_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dept:query"]))],
@@ -31,11 +27,7 @@ async def get_dept_tree_controller(
result_dict_tree = await DeptService(auth).tree(search=search, order_by=order_by)
return SuccessResponse(data=result_dict_tree, msg="查询部门树成功")
@DeptRouter.get(
"/detail/{id}",
summary="查询部门详情",
response_model=ResponseSchema[DeptOutSchema],
)
@DeptRouter.get("/detail/{id}", summary="查询部门详情", response_model=ResponseSchema[DeptOutSchema])
async def get_obj_detail_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dept:detail"]))],
id: Annotated[int, Path(description="部门ID")],
@@ -43,11 +35,7 @@ async def get_obj_detail_controller(
result_dict = await DeptService(auth).detail(id=id)
return SuccessResponse(data=result_dict, msg="查询部门详情成功")
@DeptRouter.post(
"/create",
summary="创建部门",
response_model=ResponseSchema[DeptOutSchema],
)
@DeptRouter.post("/create", summary="创建部门", response_model=ResponseSchema[DeptOutSchema])
async def create_obj_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dept:create"]))],
data: Annotated[DeptCreateSchema, Body(description="部门创建参数")],
@@ -56,11 +44,7 @@ async def create_obj_controller(
await FastAPICache.clear(namespace=_DEPT_NS)
return SuccessResponse(data=result_dict, msg="创建部门成功")
@DeptRouter.put(
"/update/{id}",
summary="修改部门",
response_model=ResponseSchema[DeptOutSchema],
)
@DeptRouter.put("/update/{id}", summary="修改部门", response_model=ResponseSchema[DeptOutSchema])
async def update_obj_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dept:update"]))],
id: Annotated[int, Path(description="部门ID")],
@@ -70,11 +54,7 @@ async def update_obj_controller(
await FastAPICache.clear(namespace=_DEPT_NS)
return SuccessResponse(data=result_dict, msg="修改部门成功")
@DeptRouter.delete(
"/delete",
summary="删除部门",
response_model=ResponseSchema[None],
)
@DeptRouter.delete("/delete", summary="删除部门", response_model=ResponseSchema[None])
async def delete_obj_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dept:delete"]))],
ids: Annotated[list[int], Body(description="ID列表")],
@@ -83,11 +63,7 @@ async def delete_obj_controller(
await FastAPICache.clear(namespace=_DEPT_NS)
return SuccessResponse(msg="删除部门成功")
@DeptRouter.patch(
"/status/batch",
summary="批量修改部门状态",
response_model=ResponseSchema[None],
)
@DeptRouter.patch("/status/batch", summary="批量修改部门状态", response_model=ResponseSchema[None])
async def batch_set_available_obj_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:dept:patch"]))],
data: Annotated[BatchSetAvailable, Body(description="状态设置")],
@@ -1,11 +1,7 @@
from dataclasses import dataclass
from fastapi import Query
from pydantic import BaseModel, ConfigDict, Field, field_validator
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
from app.common.enums import QueueEnum
from app.core.base_params import BaseQueryParam, TenantByQueryParam, UserByQueryParam
from app.core.base_schema import BaseSchema, TenantBySchema, UserBySchema
from app.core.base_schema import BaseQueryParam, BaseSchema, TenantByQueryParam, TenantBySchema, UserByQueryParam, UserBySchema
from app.core.validator import validate_required_code
@@ -63,14 +59,16 @@ class DeptTreeOutSchema(DeptOutSchema):
children: list["DeptTreeOutSchema"] | None = Field(default=None, description="子部门列表")
@dataclass
class DeptQueryParam(BaseQueryParam, UserByQueryParam, TenantByQueryParam):
"""部门管理查询参数"""
name: str | None = Query(None, description="部门名称")
status: int | None = Query(None, ge=0, le=1, description="状态(0:启动 1:停用)")
name: str | None = Field(None, description="部门名称")
status: int | None = Field(None, ge=0, le=1, description="状态(0:启动 1:停用)")
def __post_init__(self) -> None:
self.name = (QueueEnum.like.value, self.name)
@model_validator(mode="after")
def validate_query_params(self) -> "DeptQueryParam":
if self.name:
self.name = (QueueEnum.like.value, self.name)
if isinstance(self.status, int):
self.status = (QueueEnum.eq.value, self.status)
return self