10 KiB
开发交接文档 — leaudit-platform 前后端
本会话时间:2026-04-29 ~ 2026-04-30 工作目录:
/home/wren-dev/Porject/leaudit-platform/
仓库信息
| 项目 | 路径 | 分支 | Remote |
|---|---|---|---|
| 后端 | /home/wren-dev/Porject/leaudit-platform/ |
main |
无(需配置) |
| 前端 | /home/wren-dev/Porject/leaudit-platform/new_doc_review/ |
wren |
http://git.7bm.co:1024/jande/new_doc_review.git |
后端未推送(无 remote),前端 wren 分支领先 origin 7 个提交。
数据库
| 项 | 值 |
|---|---|
| Host | nas.7bm.co:54302 |
| 用户 | docauditai_admin |
| 密码 | zhfw*123* |
| 数据库 | leaudit_platform |
一、已完成的工作
1. 首页入口模块 RBAC 过滤修复
问题:内部公文 入口模块配置存在(id=3, path=/home),但首页不显示。
根因:HomeServiceImpl 做二次过滤——入口模块的 targetPath 必须匹配用户有路由权限的路径。provincial_admin 的 role_route 里没有 /home。
修复:插入 role_route — role_id=2, route_id=10 (/home), permission='RW', status=1。
后端提交:19c70d2
2. 首页地区过滤修正
问题:provincial_admin 跳过了入口模块的 areas 地区过滤,导致取消地区后仍可见。
修复:homeServiceImpl.py 的 bypass_area 逻辑从包含 provincial_admin 改为只包含 super_admin。
后端提交:c16bb84
3. 细粒度权限执行
问题:后端 _assertManagePermission 只检查用户是否属于 super_admin/provincial_admin/admin(粗粒度),不检查具体的 rbac:roles:create 等细粒度权限。
修复:
- 新增
_assertPermission(CurrentUserId, PermissionKey)方法 - 所有 RBAC 管理端点补全细粒度权限检查:
CreateRole→rbac:roles:createUpdateRole→rbac:roles:updateDeleteRole→rbac:roles:deleteListRoles/GetRoleRoutes/GetRolePermissions→rbac:roles:readListUsers/ListRoleUsers/GetUserRoles→rbac:users:readAssignUserRoles/RevokeUserRole→rbac:user_roles:writeUpdateRoleRoutes→rbac:role_routes:writeSaveRolePermissions→rbac:role_permissions:writeGetRoutePermissions→rbac:permissions:readsuper_admin自动跳过细粒度权限检查
- 数据库给
provincial_admin(role_id=2) 和admin(role_id=3) 补充了缺失的权限点 后端提交:33255e8,b6d7f15
4. 统一异常处理
问题:LeauditException 没有注册 FastAPI exception handler,所有业务异常都变成 500。
修复:app.py 新增 @app.exception_handler(BusinessException),返回带状态码的 JSON。
后端提交:292b187
5. 403 错误信息中文化
问题:403 返回 "缺少权限: rbac:roles:delete" 显示的是 permission key。
修复:_assertPermission 查 permissions 表的 display_name,改为显示 "缺少「删除角色」权限"。
后端提交:ab31c80
前端:axios 拦截器不再硬编码 "无权限",改为透传后端的具体消息。frontendJWT 改为 canEdit,包含 provincial_admin + admin 两个角色。
前端提交:185f55c, e2ae791
6. 上传页 PostgREST 依赖替换
问题:上传页 loader 里 getTodayDocuments、getDocumentTypes、getQueueStatus 调 PostgREST 返回 404。
后端新增:
GET /api/document-types— 文档类型列表GET /api/documents/list新增userId、dateFrom、dateTo过滤参数GET /api/v2/system/queue/status— 队列状态(查询leaudit_documents的processing_status统计) 后端提交:8f307ae,9e1b7a6,e6e129c
前端:
getDocumentTypes()→GET /api/document-typesgetTodayDocuments()→GET /api/documents/list?userId=&dateFrom=getQueueStatus()→ 404 时返回空状态不报错 前端提交:dd249cc
7. 上传接口对齐
问题:前端上传 POST ${UPLOAD_URL}/upload 用的是嵌套 JSON 的 upload_info 格式,与新后端 POST /api/upload 的扁平 multipart/form-data 不兼容。
修复:
uploadDocumentToServer()重写,用扁平 FormData(typeId, region, fileRole, createdBy, autoRun, speed)handleFileUpload()适配:从userInfo.area取region,从Priority枚举映射speed- 响应类型从
FileUploadResponse改为UploadResult(documentId替代result.id) 前端提交:73fd861
8. 文档类型 CRUD 后端
新增端点:
POST /api/document-types 创建(含 rule_set_ids 自动绑定)
PUT /api/document-types/{id} 更新(rule_set_ids 全量替换)
DELETE /api/document-types/{id} 软删除(级联解绑 rule_type_bindings)
GET /api/document-types/{id} 详情
GET /api/document-types 列表(扩展字段:description, entryModuleId, isEnabled, ruleSetIds)
关键实现:
DocumentTypeItemVO新增description,entryModuleId,isEnabled,ruleSetIdsDocumentTypeCreateDTO/DocumentTypeUpdateDTO支持ruleSetIds传入- 创建/更新时自动调用
_syncRuleBindings()全量替换leaudit_rule_type_bindings - 软删除级联清理 bindings
后端提交:
52c2bed
9. 文档类型管理前端页面
文件:
app/api/document-types/document-types.ts— 重写,调用新后端/api/document-types+/api/rule-setsapp/routes/document-types._index.tsx— 列表页(编码、名称、入口模块、规则集数量、状态)app/routes/document-types.new.tsx— 新建/编辑页(编码、名称、描述、入口模块下拉、规则集多选)
前端提交:81c5e98, 477bcaf
10. 文档类型路由注册
修复:
_MANAGEABLE_ROUTE_BLUEPRINTS添加/document-types路由_MANAGEABLE_PERMISSION_BLUEPRINTS添加doc_type:*权限定义_MINIMAL_VISIBLE_ROUTE_PREFIXES添加/document-types(关键!)_PERMISSION_PREFIXES_BY_PATH添加/document-types→["doc_type:"]- 数据库
sys_routes和role_route已补/document-types后端提交:283c822,acdcfeb
二、关键代码位置速查
后端
| 功能 | 文件 |
|---|---|
| 异常处理 | fastapi_admin/app.py:67-76 |
| 权限检查 | rbacAdminServiceImpl.py:571-606 (_assertPermission) |
| 用户上下文 | rbacAdminServiceImpl.py:608-620 (_getCurrentUserContext) |
| 文档上传 | documentServiceImpl.py:44-246 (Upload) |
| 文档列表 | documentServiceImpl.py:248-443 (ListDocuments) |
| 文档类型 CRUD | documentServiceImpl.py:477-560 |
| 文档类型列表 | documentController.py:87-130 |
| 队列状态 | documentController.py:135-180 |
| 路由可见白名单 | rbacServiceImpl.py:21-29 (_MINIMAL_VISIBLE_ROUTE_PREFIXES) |
| 权限前缀映射 | rbacServiceImpl.py:539-550 (_PERMISSION_PREFIXES_BY_PATH) |
| 首页地区过滤 | homeServiceImpl.py:39 (bypass_area) |
| 首页路由过滤 | homeServiceImpl.py:91-108 |
前端
| 功能 | 文件 |
|---|---|
| 上传 API | app/api/files/files-upload.ts |
| 文档类型 API | app/api/document-types/document-types.ts |
| 上传页面 | app/routes/files.upload.tsx |
| 文档类型列表 | app/routes/document-types._index.tsx |
| 文档类型编辑 | app/routes/document-types.new.tsx |
| 403 拦截器 | app/api/axios-client.ts:183-190 |
数据库关键表
| 表 | 用途 |
|---|---|
leaudit_document_types |
文档类型(20 条种子数据) |
leaudit_rule_type_bindings |
文档类型→规则集绑定 |
leaudit_rule_sets |
规则集 |
leaudit_documents |
文档(含版本管理) |
leaudit_document_files |
文档文件 |
role_permissions |
角色细粒度权限 |
role_route |
角色路由授权 |
sys_routes |
系统路由定义 |
三、未完成 / 待做
高优先级
-
上传端到端验证 — 上传接口已重写但未实际测试。需在前端上传一份文件,确认
POST /api/upload返回正确、文件入 MinIO、leaudit_documents有记录。 -
附件上传 —
appendContractAttachments和uploadContractTemplate仍调用旧 API,后端无对应接口。需新增:POST /api/documents/{id}/attachments(fileRole=attachment)POST /api/documents/{id}/template(fileRole=template)
-
文档列表字段精简 —
documents.ts里LeauditListItem → DocumentUI有 80 行映射代码(mapLeauditDocToAuditStatus、mapProcessingStatusToFileStatus等)。建议逐步直接消费新后端字段名。
中优先级
-
文档 CRUD 补全 — 后端缺:
DELETE /api/documents/{id}— 软删除PUT /api/documents/{id}— 更新元数据(备注、测试标记)GET /api/documents/{id}— 文档详情
-
文档类型管理页 CSS —
document-types._index.tsx用了.data-table、.tag、.status-badge等类名,需要检查document-types_index.css是否包含这些样式,或改用现有组件(如Table)。 -
前端 role-permissions 页面权限 UI — 规则集绑定已改为
ruleSetIds(替代老系统的group_ids),但 role-permissions 页面显示的权限分组文案可能需要更新。
低优先级
-
规则集选择器优化 — 当前新建/编辑文档类型页以 checkbox 列表展示所有规则集。规则集数量增长后需要加搜索/分组。
-
队列状态接口完善 — 当前
/api/v2/system/queue/status只查了数据库的processing_status,未接入 Celery 实时队列深度。后续可以调 Celery inspect API 补充pending_tasks/processing_tasks。 -
后端推送 — 后端仓库无 git remote,需要配置后推送。
-
旧 PostgREST 完全清理 — 确认无其他 PostgREST 调用后移除旧 RPC 函数。
四、当前用户/角色状态
| 角色 | role_key | ID | 用户数 |
|---|---|---|---|
| 系统超级管理员 | super_admin | 1 | 0 |
| 省级管理员 | provincial_admin | 2 | 1 (id=5, username=admin, area=梅州) |
| 地区管理员 | admin | 3 | 4 (揭阳惠来烟草, 梅州烟草, 云浮烟草, 潮州烟草) |
| 普通用户 | common | 4 | ~200 (000... 用户) |
省级管理员 (id=5) 拥有所有权限点,包括新增的 doc_type:*(通过 _ensureAdminSeeds 自动补种)。