恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。 == 此快照内容 == - 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091) - 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static) - 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB) - 交接文档 go.md + go-code-reference/endpoints/entities/database.md - 多代理建设脚本 .claude/wf-*.js == 状态 == - 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板) - 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用 - W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成) - 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456 == 排除(gitignore, 可再生) == node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui) 完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules) 时间戳: 20260615-191517 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.9 KiB
4.9 KiB
路由规范(凯迪 ERP+OA 一体化平台)
本平台融合了致远 OA 复刻 + 凯迪 ERP 扩建 + 多套部门系统。为避免「层级套用、前缀冗余」, 统一收敛为一套两段式扁平路由体系。本文档是唯一规范,新增页面必须遵守。
1. 顶层约定
| 项 | 取值 | 说明 |
|---|---|---|
| 路由模式 | createWebHistory() |
HTML5 history,干净 /... 网址,无 # 片段 |
| 站点 base | / |
原 /modern/app/(OFBiz 遗留)已废弃 |
| 路由前缀 | 无 | 原 /oa/ 前缀已全量去除 |
| 命名层级 | 两段 /<module>/<page> |
不允许第三段嵌套 |
| 路由 name | oa:<moduleId>:<key> |
由目录自动生成,全局唯一 |
历史层级 /<base>/#/oa/<module>/<page>(三~四段 + #)-> 规范后 /<module>/<page>(两段,无 #)。
去掉
#的前提(已满足):history 模式要求服务端把「任意未知路径」回退到index.html, 否则直接刷新内页会 404。vite dev/preview 服务器默认自带该 SPA fallback,当前运行环境即此。 若将来把构建产物部署到裸静态服务器/nginx,需补一条try_files $uri /index.html之类的回退规则。
2. 单一数据源
路由不手写。src/data/oaModules.ts 是唯一权威目录,每个页面一条记录:
{ key: 'accounts', label: '会计科目', kind: 'list', path: '/finance/accounts' }
src/router/index.ts 从 oaAllPages 自动生成路由表:
path直接取page.pathname=oa:${moduleId}:${key}- 组件解析
pageComponent(moduleId, key)->import.meta.glob('../oa/pages/**/*.vue')命中pages/<moduleId>/<key>.vue则用真实页面,否则回退OaGenericPage按kind渲染原型。
关键解耦:组件解析走
moduleId+key,与path无关。改path不需要改页面文件名/目录。
3. 顶层模块段(module)
业务域即顶层段,扁平并列,互不嵌套:
collab goal rd meeting masterdata knowledge hr budget culture report
payment ehs archive appdev sealcenter ops intel contract mfg lab
finance doccollab design crm bidding supervision mobile itasset audit
特殊页(不入顶部导航):
/个人空间门户(portal)/contacts通讯录/org-space、/template-space空间占位/collab/handle?id=…事项办理详情(由待办行点击进入)/login登录跳转/:pathMatch(.*)*-> NotFoundView
4. 命名规则
- module 段:小写、业务域语义(
finance而非cw),多词用连字符。 - page 段(key):小写、动作或视图语义(
ledger台账 /board看板 /cockpit驾驶舱 /accounts列表)。 - 同一业务概念只允许一条规范路由。禁止重复:如「合同台账」统一为
/contract/ledger, 已删除原/masterdata/contract重复路由(pages/contract/ledger.vue以 import 复用pages/masterdata/contract.vue的组件,属文件级复用,非第二条路由)。
5. 后端 API 命名(不随前端路由变动)
后端 API 是独立命名空间,与前端路由解耦,不参与本次重构:
| 项 | 取值 |
|---|---|
| Base | /api/oa(dev 由 vite proxy 转发到 :8090) |
| 客户端 | http.get('/contracts') -> 实际 /api/oa/contracts |
| 风格 | 资源复数名词,统一 ApiResp{code,message,data}(code 0 = 成功) |
前端路由用「业务域/视图」语义(给人看),后端 API 用「资源」语义(给程序用),两者各自规范、互不耦合。 改前端路由不影响 API 调用——API 客户端 base 路径未动。
6. 新增页面流程(务必遵守)
- 在
oaModules.ts对应模块的pages[]加一条{ key, label, kind, path: '/<module>/<key>' }。 - 在
src/oa/pages/<moduleId>/<key>.vue放真实页面(文件名 = key)。 - 路由自动生成,无需改
router/index.ts。 - 跨页跳转、搜索命中映射(
api/search.ts的HIT_ROUTE)、移动端快捷入口 一律引用规范path,不得硬编码旧/oa/...。
7. 验收基线(本次重构已达成)
- 路由总数 118;其中
oa:*命名路由 112,112/112 自映射通过,0 冲突、0 被遮蔽、0 落到 not-found。 - 伪造路径正确落 not-found;6 个特殊路由全部解析正常。
vue-tsc --noEmit通过(0 error);全量 emoji/箭头扫描 0。- 无残留
/oa/路由字面量(仅余/api/oa/与文件级 import,均正确)。 - history 模式(去
#)实测:直接加载/刷新深链/contract/ledger正常渲染(vite SPA fallback 生效, 5 条数据);裸输/zzz/...落 in-app NotFound;全站 live 导航网址均无#(anyHashAnywhere=false)。 全代码仅 1 处createWebHashHistory->createWebHistory+ 2 处href="#/"锚点改为路由跳转;无location.hash逻辑。