Files
form-center-front/src/router/routes.ts
T
chenxing d8f1a1fbfa
build / build (push) Successful in 3m8s
feat(t10-admin): 管理员体系前端——应用设置双 tab+单表单管理员+选人组件移植
- AppSettings.vue 应用设置页(基础/字典两 tab);修复 P86:Tabs 写 :value 而受控 prop 是 modelValue,致 ?tab=dicts 深链静默失效,改后深链实拍生效
- UserCheckModal.vue 自 notice 移植(view-ui-plus+ztree,sources 注入式数据源);public/libs 收录 jquery+ztree 本地件(index.html 引用)
- api/module/admin.ts + mock/adminapi.ts + types/admin.ts;AdminListPanel/FormAdminModal 组件
- routes/menuNav/menuRoute/modulePerms 适配管理员菜单与权限位;tree-icon 图标资源
2026-10-15 20:25:39 +08:00

137 lines
6.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { RouteRecordRaw } from "vue-router";
/**
* 表单中心路由骨架(T5)——一个 SPA 承载全部形态(执行手册 §2.1):
* 管理端 /admin/*、填报页 /f/:code、快应用上下文 /app/:appCode/*、我的填写 /my。
* 同仓同构建同一条静态路由,不建公开站、不拆第二个 front。
*
* 两处对齐约束:
* ① path 必须与 UserBase app_module.path 逐字一致(手册 §2.2 表;layout 优先按 path
* 匹配菜单高亮与面包屑);
* ② <b>本表刻意不写 meta.modId</b>——规范 §4「modId 全量对齐后端 /base/GetUserMod,禁臆造」。
* 手册 §2.2 v1.5 起中心五行的 customId 是显式数字(200~204),但把号段抄进路由就等于和
* UserBase 侧的配置耦死(改号即失配),而 layout 的高亮与面包屑本来就按 path 匹配
* (utils/menuRoute.ts 的 ROUTE_PATHS)。详情页需要父级高亮时用 meta.parentPath。
*
* 页面本体分任务落地:管理面/设计器 T6、填报页 T7、数据与统计与快应用 T8;
* 本轮 T5 只交付壳与四形态占位页,占位页不含领域逻辑。
*/
const routes: RouteRecordRaw[] = [
{
// 应用入口:拿到授权模块树后由 App.vue 跳第一个可用模块;无模块时留在此页给引导
path: "/",
name: "fc_entry",
component: () => import("@/views/Entry.vue"),
meta: { title: "表单中心" },
},
/* ---------------- 管理端(/admin/*,菜单行 path 与之逐字一致) ---------------- */
{
path: "/admin/forms",
name: "fc_admin_forms",
component: () => import("@/views/admin/Forms.vue"),
meta: { title: "表单设计" },
},
{
// 设计器子页面:UserBase 侧没有这条模块行(手册 §2.2 v1.5 只有五行:表单设计/数据管理/统计/应用设置/我的填写),
// 所以它不进左导航;高亮与面包屑由 layout 按 meta.parentPath 挂到「表单设计」行下。
// uuid 走 query 而非 path 参数,menuRoute 的 ROUTE_PATHS 才能把它当静态 path 收进去。
path: "/admin/forms/designer",
name: "fc_admin_form_designer",
component: () => import("@/views/admin/FormDesigner.vue"),
meta: { title: "表单设计器", parentPath: "/admin/forms" },
},
{
path: "/admin/data",
name: "fc_admin_data",
component: () => import("@/views/admin/Data.vue"),
meta: { title: "数据管理" },
},
{
// 答卷详情:数据面身份只用 uuid(V5),所以 answerId 走 query 而非 path 参数
// (同设计器先例——带参 path 不被 menuRoute 的 ROUTE_PATHS 收,且 uuid 形态固定 32 位,
// 放 path 里除了暴露在地址段没有任何好处)。不进左导航,面包屑挂「数据管理」行下。
path: "/admin/data/detail",
name: "fc_admin_data_detail",
component: () => import("@/views/admin/AnswerDetail.vue"),
meta: { title: "答卷详情", parentPath: "/admin/data" },
},
{
path: "/admin/stats",
name: "fc_admin_stats",
component: () => import("@/views/admin/Stats.vue"),
meta: { title: "统计" },
},
{
// 应用设置(手册 §2.2 v1.5 的行;页内两 tab:角色设置 / 字典管理,?tab= 深链)。
// tab 不占模块行、不进导航(同设计器子页的口径),高亮与面包屑就挂本行。
path: "/admin/app",
name: "fc_admin_app",
component: () => import("@/views/admin/AppSettings.vue"),
meta: { title: "应用设置" },
},
{
// 旧字典管理地址(六行版模块行时代的 path):只保留重定向,不再单独成页(T10 方案 §6.1)。
// 外部残留链接落到这里=进应用设置的字典 tab,避免出现"两条都能进、只有一条有守卫"的口径。
path: "/admin/dicts",
redirect: "/admin/app?tab=dicts",
},
/* ---------------- 填报页(分享/门户/快应用直落,code 寻址) ---------------- */
{
path: "/f/:code",
name: "fc_fill",
component: () => import("@/views/Fill.vue"),
meta: { title: "填报" },
},
/* ---------------- 快应用上下文(目标应用的模块树 + 范围矩阵,T8 落地) ---------------- */
{
path: "/app/:appCode",
name: "fc_app",
component: () => import("@/views/AppContext.vue"),
meta: { title: "应用表单" },
},
{
path: "/app/:appCode/:view",
name: "fc_app_view",
component: () => import("@/views/AppContext.vue"),
meta: { title: "应用表单" },
},
{
// P77:快应用上下文内的答卷详情走应用自己的路径段,不把用户弹出应用壳
// (T8 现状是恒推 /admin/data/detail——中心管理端那条路径)。
// 形态二选一的取舍见 docs/T9-report.md:选子路由而非内嵌 Modal——地址里保留 uuid 可深链/刷新,
// 且详情页(钉版渲染 + 三态空值 + 已删字段降级)只有一份实现。
// 带参 path 不进 menuRoute 的 ROUTE_PATHS(该表按"无 : 的静态 path"收集),故不写 parentPath。
path: "/app/:appCode/data/detail",
name: "fc_app_data_detail",
component: () => import("@/views/admin/AnswerDetail.vue"),
meta: { title: "答卷详情" },
},
/* ---------------- 我的填写(全员授权行) ---------------- */
// 两视图=两个独立入口,不做 query 参数分支(方案 §6.3「鉴权分支容易写漏」、V18):
// /my/submit = 我提交的(submitter=会话用户);/my/about = 关于我的(subject=会话用户)。
// /my 为兼容模块行 path(手册 §2.2 只登记了 /my 一行)保留,落在同一容器上,
// 由容器内的 Tab 在两个入口间切换(Tab 是 UI 导航,不是接口参数分支)。
{
path: "/my",
name: "fc_my",
component: () => import("@/views/My.vue"),
meta: { title: "我的填写" },
},
{
path: "/my/submit",
name: "fc_my_submit",
component: () => import("@/views/My.vue"),
meta: { title: "我提交的", parentPath: "/my" },
},
{
path: "/my/about",
name: "fc_my_about",
component: () => import("@/views/My.vue"),
meta: { title: "关于我的", parentPath: "/my" },
},
// 兜底:外部深链/残留配置落到未登记路由时不白屏,回入口由壳决定首个可用页
{ path: "/:pathMatch(.*)*", redirect: "/" },
];
export default routes;