20260913231607

This commit is contained in:
oneao committed 2026-09-13 23:16:08 +08:00
1 parent f3ad727f1c
commit c31329d387
179 files changed
+10846 -2684

No files matched your search

+4 -4
View File
@@ -54,10 +54,10 @@ router.beforeEach(async (to) => {
return '/dashboard'
}
// 模块中心(/module/*)是系统管理员的专用页面:非 g3soft 一律拦回工作台。
// 这是路由层的特殊判断,与菜单树无关(菜单隐藏与路由放行由同一管理员判定决定),
// 避免「菜单上看不见、手输地址却能进」的越权。
if (to.path.startsWith('/module/') && !permissionStore.isG3soft) {
// 系统管理员专用页面(meta.adminOnly,当前为模块中心 /module/*):
// 非 g3soft 一律拦回工作台。按路由标记而非路径前缀判断,避免「菜单上看不见、
// 手输地址却能进」的越权;侧栏入口同样仅对 g3soft 渲染(AppSidebar)。
if (to.matched.some((r) => r.meta.adminOnly) && !permissionStore.isG3soft) {
return '/dashboard'
}
}
+8 -2
View File
@@ -64,11 +64,13 @@ export const routes = [
component: () => import('@/views/detail/DetailPage.vue'),
meta: { title: '详情', cacheByKey: true },
},
// 模块中心:元数据驱动的配置页集合
// 模块中心:元数据驱动的配置页集合(系统管理员专用,meta.adminOnly:
// 路由守卫拦截非 g3soft,菜单管理「路由地址」下拉整体排除本组页面)
// 分组节点(见上方「路由分组」注释:不写 component,子页写相对路径)
{
path: '/module',
redirect: '/module/module-management',
meta: { adminOnly: true },
children: [
// 模块管理:元数据驱动的模块配置中心(先静态路由,权限/动态菜单后续接入)
{
@@ -108,6 +110,8 @@ const EXCLUDED_PATHS = new Set(['/login'])
/**
* 收集可作为菜单入口的页面路由(递归展开布局容器与分组节点)。
* 过滤规则:
* - meta.adminOnly 的路由(系统管理员专用页,如模块中心)连同子树整体排除,
* 系统页面不进业务菜单,「路由地址」下拉配不出第二入口;
* - 含 children 的节点(布局容器 / 分组节点)不是最终页面,只向下递归;
* - 含动态段(:id)或通配(*)的路由无法作为固定菜单入口;
* - 登录页等独立布局页排除在外。
@@ -118,6 +122,8 @@ const EXCLUDED_PATHS = new Set(['/login'])
export function collectMenuRoutes(list = routes, parentPath = '') {
const result = []
for (const route of list || []) {
// 系统管理员专用页面(meta.adminOnly):整体排除,不作为业务菜单入口
if (route.meta?.adminOnly) continue
const rawPath = route.path || ''
// 绝对路径原样使用;相对路径(分组节点的 children)拼到父路径上
const path = rawPath.startsWith('/') ? rawPath : joinPath(parentPath, rawPath)
@@ -144,7 +150,7 @@ function joinPath(parentPath, childPath) {
/**
* 菜单管理「路由地址」下拉选项:按路径排序,配合 Select 的本地包含匹配(like)筛选。
* label 同时含路径与标题,输入 "/module" 或 "模块" 都能命中。
* label 同时含路径与标题,输入路径片段或标题关键词都能命中。
*/
export const menuRouteOptions = collectMenuRoutes().toSorted((a, b) =>
a.value.localeCompare(b.value, 'zh-Hans-CN'),