# 首页入口接口落地说明 ## 1. 已落地内容 - 后端新增统一接口:`GET /api/home/entry-modules` - 后端来源统一收口到: - `leaudit_entry_modules` - `leaudit_document_types` - `sys_routes + role_route`(仅做页面可见性补充校验) - 前端首页改为只调用后端统一接口,不再直接查 PostgREST 的 `entry_modules + document_types` - 前端首页不再手工注入“智慧法务助手”模块 ## 2. 当前接口返回语义 返回结构: ```json { "code": 200, "message": "ok", "data": [ { "id": 1, "name": "合同智能审查", "description": "合同类文档入口,进入合同检索与评查主页", "targetPath": "/contract-template/search", "routePath": "/contract-template/search", "iconPath": "entryModule/contract.png", "sortOrder": 10, "requiresDocumentTypes": true, "areas": [], "documentTypes": [ { "id": 1, "name": "建设工程合同", "code": "contract.construction.general" } ] } ] } ``` 字段说明: - `targetPath` - 首页点击后真正跳转的前端路由 - `routePath` - 当前阶段与 `targetPath` 同值 - 预留给后续把“展示路径”和“权限判断路径”拆开 - `iconPath` - 模块图标路径 - 若以 `/images/` 开头,前端按静态资源处理 - 否则前端按 `DOCUMENT_URL + iconPath` 处理 - `requiresDocumentTypes` - `true`:模块必须挂文档类型才能进入 - `false`:允许零文档类型直接进入 - 当前兼容规则: - `/chat-with-llm/chat` → `false` - `/cross-checking` → `false` - 其他路径 → `true` ## 3. 当前过滤逻辑 后端按以下顺序过滤首页入口: 1. `leaudit_entry_modules.is_enabled = true` 2. `leaudit_entry_modules.deleted_at is null` 3. 地区过滤 - `super_admin / provincial_admin` 跳过地区过滤 - 其他用户按 `sso_users.area` 匹配 `leaudit_entry_modules.areas` - 若 `areas` 为空,则视为全地区可见 4. 页面权限过滤 - 若 `sys_routes` 里存在与 `path` 相同的页面路由,则要求当前用户角色在 `role_route` 中已授权 - 若 `sys_routes` 尚未配置该路由,则当前阶段放行,不阻塞首页展示 ### 3.1 `/home` 路由补充说明(2026-04-29) 这次联调里出现过一个容易忘的问题: - `leaudit_entry_modules` 里的 `内部公文` 入口配置本身是存在的 - 它当前配置的跳转路径是 `path = /home` - 但如果当前角色在 `role_route` 里没有 `/home` 的启用记录,首页接口会把这个入口过滤掉 实际排查结论: - 不是“内部公文入口模块丢了” - 也不是“地区过滤没命中” - 而是“入口模块目标路径存在,但角色没有对应页面路由授权” 本次已补充: - 给 `provincial_admin` 角色补上 `/home` 的 `role_route` 因此后续如果再次出现“首页某个入口配置明明在库里,但前端没显示”,优先按下面顺序排查: 1. `leaudit_entry_modules` 里该入口是否存在且 `is_enabled = true` 2. 该入口 `areas` 是否覆盖当前用户地区 3. 该入口 `path` 对应的页面路由是否存在于 `sys_routes` 4. 当前角色是否在 `role_route` 中对该 `path` 有 `status = 1` 特别注意: - `内部公文 -> /home` 这类首页型入口,对 `role_route` 很敏感 - 只配入口模块、不配页面路由授权,首页接口不会放出来 ## 4. 当前表语义 ### `leaudit_entry_modules` 当前阶段它只负责“首页业务入口配置”,核心字段语义如下: - `name`:首页模块名称 - `description`:首页模块描述 - `path`:当前阶段同时承担 `targetPath / routePath` - `icon_path`:首页卡片图标 - `areas`:地区可见范围 - `sort_order`:首页排序 - `is_enabled`:是否启用 ### `leaudit_document_types` - `entry_module_id`:文档类型归属的首页入口模块 - 首页进入某模块后,前端把该模块下的 `documentTypes[].id` 写入 `sessionStorage.documentTypeIds` - 后续列表、首页统计、规则页面仍复用现有 `documentTypeIds` 逻辑 ## 5. 前端改造点 已改造: - `new_doc_review/app/api/home/home.ts` - 改为请求 `/home/entry-modules` - `new_doc_review/app/routes/_index.tsx` - 直接使用后端返回的 `targetPath` - 直接使用后端返回的 `iconPath` - 按 `requiresDocumentTypes` 判断是否允许进入 未改造但仍兼容: - 系统设置入口仍沿用现有 `getUserRoutesByRole()` 逻辑 - 交叉评查专属端口模式仍保留 ## 6. 初始化数据 已补脚本: - `scripts/seed_home_entry_modules.sql` 脚本内容: - 按老系统真实数据初始化 5 个入口模块: - `合同管理` - `案卷智能评查` - `内部公文` - `智慧法务助手` - `交叉评查` - 其中: - `path` 存前端跳转路由 - `icon_path` 存老系统入口图片路径 - 自动把: - `contract.%` 绑定到 `合同管理` - `行政卷宗.%` 绑定到 `案卷智能评查` - `NBGW / internal.document` 绑定到 `内部公文` ## 7. 当前兼容性取舍 这次落地刻意没有直接改库结构新增: - `module_key` - `module_type` - `allow_empty_types` - `target_path` - `route_path` 而是先用现有字段完成可运行版本: - `path` 兼容成 `targetPath + routePath` - 特殊模块是否允许空文档类型,先按路径规则判断 同时和老系统保持语义对齐: - `icon_path` 承接老库 `entry_modules.path` 的图片路径语义 这样做的目的: - 先把首页入口能力真正跑起来 - 不阻塞当前前后端联调 - 后续若需要长期治理,再补结构性字段升级