路由权限重构

This commit is contained in:
2026-09-16 11:04:34 +08:00
parent 30c2a79f51
commit c35f7252d1
15 changed files with 2773 additions and 1400 deletions
@@ -68,7 +68,7 @@ function handleDropdown(key: DropdownKey) {
if (key === 'logout') { if (key === 'logout') {
logout(); logout();
} else { } else {
routerPushByKey('systemmanage_changepassword'); routerPushByKey('changepassword');
} }
} }
</script> </script>
+4 -4
View File
@@ -224,14 +224,16 @@ const local: App.I18n.Schema = {
403: '无权限', 403: '无权限',
404: '页面不存在', 404: '页面不存在',
500: '服务器错误', 500: '服务器错误',
details: '详情',
details_closedoc: '资料关闭详情',
details_index: '变更详情',
changepassword: '修改密码',
home: '首页', home: '首页',
my: '我的操作台', my: '我的操作台',
my_initiatechange: '发起变更', my_initiatechange: '发起变更',
my_highrisk: '本专业高风险', my_highrisk: '本专业高风险',
my_highriskdetail: '高风险场景详情',
my_mytask: '我的任务', my_mytask: '我的任务',
my_mydraft: '我的草稿', my_mydraft: '我的草稿',
my_pending: '待我处理',
my_pendingchange: '待投用变更', my_pendingchange: '待投用变更',
my_effect: '变更投入和效果', my_effect: '变更投入和效果',
my_datachangecenter: '变更数据中心', my_datachangecenter: '变更数据中心',
@@ -249,12 +251,10 @@ const local: App.I18n.Schema = {
systemmanage_template: '审批模板管理', systemmanage_template: '审批模板管理',
my_pssr: 'PSSR监督', my_pssr: 'PSSR监督',
riskstatistics: '安全与风险统计', riskstatistics: '安全与风险统计',
report: '统计报表', report: '统计报表',
signstatistics: '质量会签统计', signstatistics: '质量会签统计',
factoryoverview: '全工厂统计概览', factoryoverview: '全工厂统计概览',
systemmanage_setting: '系统配置', systemmanage_setting: '系统配置',
systemmanage_changepassword: '修改密码'
}, },
form: { form: {
required: '不能为空', required: '不能为空',
+3 -3
View File
@@ -20,7 +20,10 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
500: () => import("@/views/_builtin/500/index.vue"), 500: () => import("@/views/_builtin/500/index.vue"),
changeledger_mychanges: () => import("@/views/changeLedger/myChanges/index.vue"), changeledger_mychanges: () => import("@/views/changeLedger/myChanges/index.vue"),
changeledger_workshopchanges: () => import("@/views/changeLedger/workshopChanges/index.vue"), changeledger_workshopchanges: () => import("@/views/changeLedger/workshopChanges/index.vue"),
changepassword: () => import("@/views/changePassword/index.vue"),
changestatistics: () => import("@/views/changeStatistics/index.vue"), changestatistics: () => import("@/views/changeStatistics/index.vue"),
details_closedoc: () => import("@/views/details/closeDoc/index.vue"),
details_index: () => import("@/views/details/index/index.vue"),
docs_archives: () => import("@/views/docs/archives/index.vue"), docs_archives: () => import("@/views/docs/archives/index.vue"),
docs_query: () => import("@/views/docs/query/index.vue"), docs_query: () => import("@/views/docs/query/index.vue"),
factoryoverview: () => import("@/views/factoryOverview/index.vue"), factoryoverview: () => import("@/views/factoryOverview/index.vue"),
@@ -30,17 +33,14 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
my_datachangecenter: () => import("@/views/my/dataChangeCenter/index.vue"), my_datachangecenter: () => import("@/views/my/dataChangeCenter/index.vue"),
my_effect: () => import("@/views/my/effect/index.vue"), my_effect: () => import("@/views/my/effect/index.vue"),
my_highrisk: () => import("@/views/my/highRisk/index.vue"), my_highrisk: () => import("@/views/my/highRisk/index.vue"),
my_highriskdetail: () => import("@/views/my/highRiskDetail/index.vue"),
my_initiatechange: () => import("@/views/my/initiateChange/index.vue"), my_initiatechange: () => import("@/views/my/initiateChange/index.vue"),
my_mydraft: () => import("@/views/my/myDraft/index.vue"), my_mydraft: () => import("@/views/my/myDraft/index.vue"),
my_mytask: () => import("@/views/my/myTask/index.vue"), my_mytask: () => import("@/views/my/myTask/index.vue"),
my_pending: () => import("@/views/my/pending/index.vue"),
my_pendingchange: () => import("@/views/my/pendingChange/index.vue"), my_pendingchange: () => import("@/views/my/pendingChange/index.vue"),
my_pssr: () => import("@/views/my/pssr/index.vue"), my_pssr: () => import("@/views/my/pssr/index.vue"),
report: () => import("@/views/report/index.vue"), report: () => import("@/views/report/index.vue"),
riskstatistics: () => import("@/views/riskStatistics/index.vue"), riskstatistics: () => import("@/views/riskStatistics/index.vue"),
signstatistics: () => import("@/views/signStatistics/index.vue"), signstatistics: () => import("@/views/signStatistics/index.vue"),
systemmanage_changepassword: () => import("@/views/systemManage/changePassword/index.vue"),
systemmanage_role: () => import("@/views/systemManage/role/index.vue"), systemmanage_role: () => import("@/views/systemManage/role/index.vue"),
systemmanage_setting: () => import("@/views/systemManage/setting/index.vue"), systemmanage_setting: () => import("@/views/systemManage/setting/index.vue"),
systemmanage_template: () => import("@/views/systemManage/template/index.vue"), systemmanage_template: () => import("@/views/systemManage/template/index.vue"),
+48 -33
View File
@@ -70,6 +70,17 @@ export const generatedRoutes: GeneratedRoute[] = [
} }
] ]
}, },
{
name: 'changepassword',
path: '/changepassword',
component: 'layout.base$view.changepassword',
meta: {
title: '修改密码',
i18nKey: 'route.changepassword',
constant: true,
hideInMenu: true
}
},
{ {
name: 'changestatistics', name: 'changestatistics',
path: '/changestatistics', path: '/changestatistics',
@@ -81,6 +92,41 @@ export const generatedRoutes: GeneratedRoute[] = [
i18nKey: 'route.changestatistics' i18nKey: 'route.changestatistics'
} }
}, },
{
name: 'details',
path: '/details',
component: 'layout.base',
meta: {
title: '详情',
i18nKey: 'route.details',
constant: true,
hideInMenu: true
},
children: [
{
name: 'details_closedoc',
path: '/details/closedoc',
component: 'view.details_closedoc',
meta: {
title: '资料关闭详情',
i18nKey: 'route.details_closedoc',
constant: true,
hideInMenu: true
}
},
{
name: 'details_index',
path: '/details/index',
component: 'view.details_index',
meta: {
title: '变更详情',
i18nKey: 'route.details_index',
constant: true,
hideInMenu: true
}
}
]
},
{ {
name: 'docs', name: 'docs',
path: '/docs', path: '/docs',
@@ -141,9 +187,9 @@ export const generatedRoutes: GeneratedRoute[] = [
props: true, props: true,
meta: { meta: {
title: '登录', title: '登录',
i18nKey: 'route.login',
constant: true, constant: true,
hideInMenu: true, hideInMenu: true
i18nKey: 'route.login'
} }
}, },
{ {
@@ -193,17 +239,6 @@ export const generatedRoutes: GeneratedRoute[] = [
i18nKey: 'route.my_highrisk' i18nKey: 'route.my_highrisk'
} }
}, },
{
name: 'my_highriskdetail',
path: '/my/highriskdetail',
component: 'view.my_highriskdetail',
meta: {
title: '变更详情',
constant: true,
hideInMenu: true,
i18nKey: 'route.my_highriskdetail'
}
},
{ {
name: 'my_initiatechange', name: 'my_initiatechange',
path: '/my/initiatechange', path: '/my/initiatechange',
@@ -231,15 +266,6 @@ export const generatedRoutes: GeneratedRoute[] = [
i18nKey: 'route.my_mytask' i18nKey: 'route.my_mytask'
} }
}, },
{
name: 'my_pending',
path: '/my/pending',
component: 'view.my_pending',
meta: {
title: '待我处理',
i18nKey: 'route.my_pending'
}
},
{ {
name: 'my_pendingchange', name: 'my_pendingchange',
path: '/my/pendingchange', path: '/my/pendingchange',
@@ -304,17 +330,6 @@ export const generatedRoutes: GeneratedRoute[] = [
i18nKey: 'route.systemmanage' i18nKey: 'route.systemmanage'
}, },
children: [ children: [
{
name: 'systemmanage_changepassword',
path: '/systemmanage/changepassword',
component: 'view.systemmanage_changepassword',
meta: {
title: '修改密码',
i18nKey: 'route.systemmanage_changepassword',
constant: true,
order: 5
}
},
{ {
name: 'systemmanage_role', name: 'systemmanage_role',
path: '/systemmanage/role', path: '/systemmanage/role',
+4 -3
View File
@@ -169,7 +169,11 @@ const routeMap: RouteMap = {
"changeledger": "/changeledger", "changeledger": "/changeledger",
"changeledger_mychanges": "/changeledger/mychanges", "changeledger_mychanges": "/changeledger/mychanges",
"changeledger_workshopchanges": "/changeledger/workshopchanges", "changeledger_workshopchanges": "/changeledger/workshopchanges",
"changepassword": "/changepassword",
"changestatistics": "/changestatistics", "changestatistics": "/changestatistics",
"details": "/details",
"details_closedoc": "/details/closedoc",
"details_index": "/details/index",
"docs": "/docs", "docs": "/docs",
"docs_archives": "/docs/archives", "docs_archives": "/docs/archives",
"docs_query": "/docs/query", "docs_query": "/docs/query",
@@ -181,18 +185,15 @@ const routeMap: RouteMap = {
"my_datachangecenter": "/my/datachangecenter", "my_datachangecenter": "/my/datachangecenter",
"my_effect": "/my/effect", "my_effect": "/my/effect",
"my_highrisk": "/my/highrisk", "my_highrisk": "/my/highrisk",
"my_highriskdetail": "/my/highriskdetail",
"my_initiatechange": "/my/initiatechange", "my_initiatechange": "/my/initiatechange",
"my_mydraft": "/my/mydraft", "my_mydraft": "/my/mydraft",
"my_mytask": "/my/mytask", "my_mytask": "/my/mytask",
"my_pending": "/my/pending",
"my_pendingchange": "/my/pendingchange", "my_pendingchange": "/my/pendingchange",
"my_pssr": "/my/pssr", "my_pssr": "/my/pssr",
"report": "/report", "report": "/report",
"riskstatistics": "/riskstatistics", "riskstatistics": "/riskstatistics",
"signstatistics": "/signstatistics", "signstatistics": "/signstatistics",
"systemmanage": "/systemmanage", "systemmanage": "/systemmanage",
"systemmanage_changepassword": "/systemmanage/changepassword",
"systemmanage_role": "/systemmanage/role", "systemmanage_role": "/systemmanage/role",
"systemmanage_setting": "/systemmanage/setting", "systemmanage_setting": "/systemmanage/setting",
"systemmanage_template": "/systemmanage/template", "systemmanage_template": "/systemmanage/template",
+16 -3
View File
@@ -232,11 +232,24 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => {
/** Init static auth route */ /** Init static auth route */
function initStaticAuthRoute() { function initStaticAuthRoute() {
const { authRoutes: staticAuthRoutes } = createStaticRoutes(); const { authRoutes: staticAuthRoutes } = createStaticRoutes();
const filteredRoutes = filterRoutesByPaths(staticAuthRoutes, localStg.get('userInfo')?.perms); // 全部静态路由
let allowRouter = staticAuthRoutes
// 权限
let perms = localStg.get('userInfo')?.perms || []
if(perms){
if(perms.length>0 && perms[0]!=='*'){
const filteredRoutes = filterRoutesByPaths(staticAuthRoutes, perms);
if (filteredRoutes.length) {
allowRouter = filteredRoutes
}
}
}
if (authStore.isStaticSuper) { if (authStore.isStaticSuper) {
addAuthRoutes(filteredRoutes); addAuthRoutes(allowRouter);
} else { } else {
const filteredAuthRoutes = filterAuthRoutesByRoles(filteredRoutes, authStore.userInfo.roles); const filteredAuthRoutes = filterAuthRoutesByRoles(allowRouter, authStore.userInfo.roles);
addAuthRoutes(filteredAuthRoutes); addAuthRoutes(filteredAuthRoutes);
} }
+9 -6
View File
@@ -23,7 +23,11 @@ declare module "@elegant-router/types" {
"changeledger": "/changeledger"; "changeledger": "/changeledger";
"changeledger_mychanges": "/changeledger/mychanges"; "changeledger_mychanges": "/changeledger/mychanges";
"changeledger_workshopchanges": "/changeledger/workshopchanges"; "changeledger_workshopchanges": "/changeledger/workshopchanges";
"changepassword": "/changepassword";
"changestatistics": "/changestatistics"; "changestatistics": "/changestatistics";
"details": "/details";
"details_closedoc": "/details/closedoc";
"details_index": "/details/index";
"docs": "/docs"; "docs": "/docs";
"docs_archives": "/docs/archives"; "docs_archives": "/docs/archives";
"docs_query": "/docs/query"; "docs_query": "/docs/query";
@@ -35,18 +39,15 @@ declare module "@elegant-router/types" {
"my_datachangecenter": "/my/datachangecenter"; "my_datachangecenter": "/my/datachangecenter";
"my_effect": "/my/effect"; "my_effect": "/my/effect";
"my_highrisk": "/my/highrisk"; "my_highrisk": "/my/highrisk";
"my_highriskdetail": "/my/highriskdetail";
"my_initiatechange": "/my/initiatechange"; "my_initiatechange": "/my/initiatechange";
"my_mydraft": "/my/mydraft"; "my_mydraft": "/my/mydraft";
"my_mytask": "/my/mytask"; "my_mytask": "/my/mytask";
"my_pending": "/my/pending";
"my_pendingchange": "/my/pendingchange"; "my_pendingchange": "/my/pendingchange";
"my_pssr": "/my/pssr"; "my_pssr": "/my/pssr";
"report": "/report"; "report": "/report";
"riskstatistics": "/riskstatistics"; "riskstatistics": "/riskstatistics";
"signstatistics": "/signstatistics"; "signstatistics": "/signstatistics";
"systemmanage": "/systemmanage"; "systemmanage": "/systemmanage";
"systemmanage_changepassword": "/systemmanage/changepassword";
"systemmanage_role": "/systemmanage/role"; "systemmanage_role": "/systemmanage/role";
"systemmanage_setting": "/systemmanage/setting"; "systemmanage_setting": "/systemmanage/setting";
"systemmanage_template": "/systemmanage/template"; "systemmanage_template": "/systemmanage/template";
@@ -86,7 +87,9 @@ declare module "@elegant-router/types" {
| "404" | "404"
| "500" | "500"
| "changeledger" | "changeledger"
| "changepassword"
| "changestatistics" | "changestatistics"
| "details"
| "docs" | "docs"
| "factoryoverview" | "factoryoverview"
| "home" | "home"
@@ -117,7 +120,10 @@ declare module "@elegant-router/types" {
| "500" | "500"
| "changeledger_mychanges" | "changeledger_mychanges"
| "changeledger_workshopchanges" | "changeledger_workshopchanges"
| "changepassword"
| "changestatistics" | "changestatistics"
| "details_closedoc"
| "details_index"
| "docs_archives" | "docs_archives"
| "docs_query" | "docs_query"
| "factoryoverview" | "factoryoverview"
@@ -127,17 +133,14 @@ declare module "@elegant-router/types" {
| "my_datachangecenter" | "my_datachangecenter"
| "my_effect" | "my_effect"
| "my_highrisk" | "my_highrisk"
| "my_highriskdetail"
| "my_initiatechange" | "my_initiatechange"
| "my_mydraft" | "my_mydraft"
| "my_mytask" | "my_mytask"
| "my_pending"
| "my_pendingchange" | "my_pendingchange"
| "my_pssr" | "my_pssr"
| "report" | "report"
| "riskstatistics" | "riskstatistics"
| "signstatistics" | "signstatistics"
| "systemmanage_changepassword"
| "systemmanage_role" | "systemmanage_role"
| "systemmanage_setting" | "systemmanage_setting"
| "systemmanage_template" | "systemmanage_template"
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -171,7 +171,7 @@ const tabChange = (k: string) => {
// 高风险场景查看变更 // 高风险场景查看变更
const openSceneChange = (record: any) => { const openSceneChange = (record: any) => {
routerPushByKey('home_highriskdetail', { query: { params: JSON.stringify(record) } }) routerPushByKey('details_index', { query: { params: JSON.stringify(record) } })
}; };
// 查看分析记录 // 查看分析记录
const viewAnalysis = (record: any) => { const viewAnalysis = (record: any) => {
+1 -1
View File
@@ -91,7 +91,7 @@ const opts = computed<Opt[]>(() => {
// 打开详情、修改重报 // 打开详情、修改重报
const openDetail = (c: any,type:string = '') => { const openDetail = (c: any,type:string = '') => {
if(type==='detail'){ if(type==='detail'){
routerPushByKey("my_highriskdetail",{ query: { id: c.change_id.toString() } }); routerPushByKey("details_index",{ query: { id: c.change_id.toString() } });
} }
if(type==='edit'){ if(type==='edit'){
routerPushByKey("my_initiatechange",{ query: { id: c.change_id.toString() } }); routerPushByKey("my_initiatechange",{ query: { id: c.change_id.toString() } });
+1 -1
View File
@@ -61,7 +61,7 @@ const downloadFile = (record: any) => {
}; };
// 打开变更单 // 打开变更单
const openChange = (record: any) => { const openChange = (record: any) => {
routerPushByKey('home_highriskdetail', { query: { params: JSON.stringify(record) } }) routerPushByKey('details_index', { query: { params: JSON.stringify(record) } })
}; };
// 填写投用日期 // 填写投用日期
const fillUseTime = (record: any) => { const fillUseTime = (record: any) => {
+1 -1
View File
@@ -136,7 +136,7 @@ const downloadTemplate = (record: any) => {
}; };
// 打开变更单 // 打开变更单
const openChange = (record: any) => { const openChange = (record: any) => {
routerPushByKey('home_highriskdetail', { query: { params: JSON.stringify(record) } }) routerPushByKey('details_index', { query: { params: JSON.stringify(record) } })
}; };
onMounted(() => { onMounted(() => {
+22 -12
View File
@@ -169,22 +169,32 @@ const getAllPaths = (tree:any) => {
}) })
return paths return paths
} }
// 过滤路由
const filterRoutes = (routes:any) => {
return routes
.filter((route:any) => route.name != null && route.meta?.constant !== true)
.map((route:any) => ({
...route,
children: Array.isArray(route.children)
? filterRoutes(route.children)
: route.children
}));
}
// 获取所有路由 // 获取所有路由
const getAllRoutes = () => { const getAllRoutes = () => {
console.log(router.getRoutes()) // 过滤路由
const filtered = router.getRoutes().filter((item:any) => { const result = filterRoutes(router.getRoutes());
// 条件1:有name且非常量 console.log(router.getRoutes());
if (item.name === undefined || item.meta?.constant === true) return false; // 过滤一级路由
// 条件2path中斜杠数量 < 2(即只有一级) const filtered = result.filter((route:any) => {
const path = item.path || ''; // 计算 path 中 '/' 的个数
const slashCount = (path.match(/\//g) || []).length; const slashCount = (route.path.match(/\//g) || []).length;
if (slashCount >= 2) return false; return slashCount <= 1;
return true; });
}) // 复制title到顶层
const tree = filtered.map((item:any) => copyTitleToTop(item)); const tree = filtered.map((item:any) => copyTitleToTop(item));
routeTree.value = tree; routeTree.value = tree;
console.log(tree)
allPaths.value = getAllPaths(tree); allPaths.value = getAllPaths(tree);
} }