# 项目长期记忆(tms-erp-web-ws / Saber3) 配套后端:`/Users/gxwebsoft/JAVA/tms-api`(不是 tms-erp-api-ws,后者功能滞后)。 ## 页面结构:列表 + 独立表单页 + 独立详情页(同一组件分流) - `src/router/views/index.js` 里三条静态/菜单路由指向同一个 .vue:`/xxx`(后端菜单)、`/xxx/form`、`/xxx/detail`;form/detail 都是 `component: Layout` + 空 children,`meta: { keepAlive: false }`,detail 额外带 `activeMenu: '/xxx'`。 - 组件内按 `$route.path` 分流(如 `isFormPage` / `isDetailPage` / `isListPage`),列表部分统一 `v-if="!isStandalonePage"` 隐藏搜索栏/工具栏/表格/分页。 - 路由记录不同但组件相同 → Vue 复用实例,所以**必须**在 `watch: { $route(to, from) }` 里重新 init;`mounted` 只覆盖「直接打开/刷新」场景。切换详情与表单时不要只比 id,还要看当前 `dialogMode` 是否匹配。 - 跳转:`this.$router.push({ path: '/xxx/form', query: { mode, id, name: '新增xxx' } })`;标签标题由 avue-router 取 `query.name`。关闭:`this.$router.$avueRouter?.closeTag?.()` + push 列表。 - 已按此模式:contract-manage(form+detail)、waybill-manage、loading-manage(新增/编辑/重新派单/详情,2026-09-17 完成)。 - 底栏文案:只读详情页用「关闭」;表单页沿用「关闭/暂存/确认」。 ## 样式硬规则 - 底部操作栏:`display:flex; justify-content:flex-end;`,**不写 gap**(间距由 Element Plus 默认 `.el-button+.el-button{margin-left:12px}` 提供)。⚠️ 浮动底栏必须 `position:fixed`(祖先 overflow:hidden 让 sticky 失效),配套 `:global(.avue--collapse .x){left:60px}`、`:global(.avue-layout--horizontal .x){left:0}`,`:global()` 要包住整个选择器。 - 按钮层级:次要 = 不写 type;中间步骤 = `type="primary" plain`;主操作 = `type="primary"`(禁绿色 success,禁两个蓝实心)。顺序 `[辅助工具][取消][保存草稿][提交]`。 - ⚠️ **`