build / build (push) Successful in 3m8s
- 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 图标资源
137 lines
6.6 KiB
TypeScript
137 lines
6.6 KiB
TypeScript
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;
|