Skip to content

Commit c990ad7

Browse files
authored
feat: permission route (#3381)
1 parent 46fb1b1 commit c990ad7

File tree

8 files changed

+97
-51
lines changed

8 files changed

+97
-51
lines changed

ui/src/router/common.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import {
2+
createRouter,
3+
createWebHistory,
4+
type NavigationGuardNext,
5+
type RouteLocationNormalized,
6+
type RouteRecordRaw,
7+
type RouteRecordName,
8+
} from 'vue-router'
9+
import { hasPermission, set_next_route } from '@/utils/permission/index'
10+
export const getChildRouteList: (
11+
routeList: Array<RouteRecordRaw>,
12+
path: string,
13+
name?: RouteRecordName | null | undefined,
14+
) => Array<RouteRecordRaw> = (routeList, path, name) => {
15+
for (let index = 0; index < routeList.length; index++) {
16+
const route = routeList[index]
17+
if (name === route.name && path === route.path) {
18+
return route.children || []
19+
}
20+
if (route.children && route.children.length > 0) {
21+
const result = getChildRouteList(route.children, path, name)
22+
if (result && result?.length > 0) {
23+
return result
24+
}
25+
}
26+
}
27+
return []
28+
}
29+
/**
30+
* 获取同级路由
31+
* @param routeList
32+
* @param name
33+
* @returns
34+
*/
35+
export const getSameRouteList: (
36+
routeList: Array<RouteRecordRaw>,
37+
name?: RouteRecordName | null | undefined,
38+
) => Array<RouteRecordRaw> = (routeList, name) => {
39+
for (let index = 0; index < routeList.length; index++) {
40+
const route = routeList[index]
41+
if (name === route.name) {
42+
return routeList
43+
}
44+
if (route.children && route.children.length > 0) {
45+
const result = getSameRouteList(route.children, name)
46+
if (result && result?.length > 0) {
47+
return result
48+
}
49+
}
50+
}
51+
return []
52+
}
53+
54+
/**
55+
* 获取有权限的路由
56+
* @param routes
57+
* @param to
58+
* @returns
59+
*/
60+
export const getPermissionRoute = (routes: Array<RouteRecordRaw>, to: RouteLocationNormalized) => {
61+
const routeName: string = to.meta
62+
? to.meta.permissionRoute
63+
? (to.meta.permissionRoute as string)
64+
: (to.name as string)
65+
: (to.name as string)
66+
const routeList = getSameRouteList(routes, routeName)
67+
const route = routeList.find((route: any) => {
68+
return (
69+
(to.meta.group ? to.meta.group == route.meta.group : true) &&
70+
(route.meta.permission ? hasPermission(route.meta.permission as any, 'OR') : true)
71+
)
72+
})
73+
74+
if (route?.name) {
75+
return { name: route?.name, params: to.params }
76+
}
77+
return { name: 'noPermission' }
78+
}

ui/src/router/index.ts

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { hasPermission, set_next_route } from '@/utils/permission/index'
2+
import { getChildRouteList } from '@/router/common'
23
import NProgress from 'nprogress'
4+
import { getPermissionRoute } from '@/router/common'
35
import {
46
createRouter,
57
createWebHistory,
@@ -47,44 +49,16 @@ router.beforeEach(
4749
if (to.meta.permission ? hasPermission(to.meta.permission as any, 'OR') : true) {
4850
next()
4951
} else {
50-
console.log('s')
51-
if (to.meta.get_permission_route) {
52-
const t = to.meta.get_permission_route()
53-
console.log(t)
54-
next(t)
55-
return
56-
}
57-
// 如果没有权限则直接取404页面
58-
next({ path: '/no-permission' })
52+
const n = getPermissionRoute(routes, to)
53+
next(n)
5954
}
6055
},
6156
)
6257
router.afterEach(() => {
6358
NProgress.done()
6459
})
65-
6660
export const getChildRouteListByPathAndName = (path: any, name?: RouteRecordName | any) => {
6761
return getChildRouteList(routes, path, name)
6862
}
6963

70-
export const getChildRouteList: (
71-
routeList: Array<RouteRecordRaw>,
72-
path: string,
73-
name?: RouteRecordName | null | undefined,
74-
) => Array<RouteRecordRaw> = (routeList, path, name) => {
75-
for (let index = 0; index < routeList.length; index++) {
76-
const route = routeList[index]
77-
if (name === route.name && path === route.path) {
78-
return route.children || []
79-
}
80-
if (route.children && route.children.length > 0) {
81-
const result = getChildRouteList(route.children, path, name)
82-
if (result && result?.length > 0) {
83-
return result
84-
}
85-
}
86-
}
87-
return []
88-
}
89-
9064
export default router

ui/src/router/modules/application.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { PermissionConst, EditionConst, RoleConst } from '@/utils/permission/data'
2-
import { get_next_route } from '@/utils/permission'
32
const applicationRouter = {
43
path: '/application',
54
name: 'application',
@@ -12,6 +11,7 @@ const applicationRouter = {
1211
PermissionConst.APPLICATION_READ.getWorkspacePermissionWorkspaceManageRole,
1312
PermissionConst.APPLICATION_READ.getWorkspacePermission,
1413
],
14+
group: 'workspace',
1515
order: 1,
1616
},
1717
redirect: '/application',
@@ -20,7 +20,7 @@ const applicationRouter = {
2020
{
2121
path: '/application',
2222
name: 'application-index',
23-
meta: { title: '应用主页', activeMenu: '/application' },
23+
meta: { title: '应用主页', activeMenu: '/application', sameRoute: 'application' },
2424
component: () => import('@/views/application/index.vue'),
2525
hidden: true,
2626
},

ui/src/router/modules/document.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const DocumentRouter = {
1919
active: 'document',
2020
parentPath: '/knowledge/:id/:folderId',
2121
parentName: 'KnowledgeDetail',
22+
group: 'KnowledgeDetail',
2223
permission: [
2324
RoleConst.ADMIN,
2425
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
@@ -43,6 +44,7 @@ const DocumentRouter = {
4344
active: 'problem',
4445
parentPath: '/knowledge/:id/:folderId',
4546
parentName: 'KnowledgeDetail',
47+
group: 'KnowledgeDetail',
4648
permission: [
4749
RoleConst.ADMIN,
4850
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
@@ -66,6 +68,7 @@ const DocumentRouter = {
6668
active: 'hit-test',
6769
parentPath: '/knowledge/:id/:folderId',
6870
parentName: 'KnowledgeDetail',
71+
group: 'KnowledgeDetail',
6972
},
7073
component: () => import('@/views/hit-test/index.vue'),
7174
},
@@ -80,6 +83,7 @@ const DocumentRouter = {
8083
parentPath: '/knowledge/:id/:folderId',
8184
parentName: 'KnowledgeDetail',
8285
resourceType: ChatUserResourceEnum.KNOWLEDGE,
86+
group: 'KnowledgeDetail',
8387
permission: [
8488
RoleConst.ADMIN,
8589
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
@@ -104,6 +108,7 @@ const DocumentRouter = {
104108
active: 'setting',
105109
parentPath: '/knowledge/:id/:folderId',
106110
parentName: 'KnowledgeDetail',
111+
group: 'KnowledgeDetail',
107112
permission: [
108113
RoleConst.ADMIN,
109114
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,

ui/src/router/modules/knowledge.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const ModelRouter = {
1111
PermissionConst.KNOWLEDGE_READ.getWorkspacePermission,
1212
PermissionConst.KNOWLEDGE_READ.getWorkspacePermissionWorkspaceManageRole,
1313
],
14+
group: 'workspace',
1415
order: 2,
1516
},
1617
redirect: '/knowledge',
@@ -19,7 +20,7 @@ const ModelRouter = {
1920
{
2021
path: '/knowledge',
2122
name: 'knowledge-index',
22-
meta: { title: '知识库主页', activeMenu: '/knowledge' },
23+
meta: { title: '知识库主页', activeMenu: '/knowledge', sameRoute: 'knowledge' },
2324
component: () => import('@/views/knowledge/index.vue'),
2425
},
2526

ui/src/router/modules/model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const ModelRouter = {
1111
PermissionConst.MODEL_READ.getWorkspacePermission,
1212
PermissionConst.MODEL_READ.getWorkspacePermissionWorkspaceManageRole,
1313
],
14+
group: 'workspace',
1415
order: 4,
1516
},
1617
redirect: '/model',
@@ -22,6 +23,7 @@ const ModelRouter = {
2223
meta: {
2324
title: '模型主页',
2425
activeMenu: '/model',
26+
sameRoute: 'model',
2527
},
2628
component: () => import('@/views/model/index.vue'),
2729
},

ui/src/router/modules/tool.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const ModelRouter = {
1111
PermissionConst.TOOL_READ.getWorkspacePermission,
1212
PermissionConst.TOOL_READ.getWorkspacePermissionWorkspaceManageRole,
1313
],
14+
group: 'workspace',
1415
order: 3,
1516
},
1617
redirect: '/tool',
@@ -20,6 +21,7 @@ const ModelRouter = {
2021
path: '/tool',
2122
name: 'tool-index',
2223
meta: { title: '工具主页', activeMenu: '/tool' },
24+
sameRoute: 'tool',
2325
component: () => import('@/views/tool/index.vue'),
2426
},
2527
],

ui/src/router/routes.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,16 @@
11
import type { RouteRecordRaw } from 'vue-router'
22
const modules: any = import.meta.glob('./modules/*.ts', { eager: true })
33
import { hasPermission, set_next_route } from '@/utils/permission/index'
4+
45
const rolesRoutes: RouteRecordRaw[] = [...Object.keys(modules).map((key) => modules[key].default)]
5-
const get_workspace_permission_route = () => {
6-
const route = rolesRoutes.find((route: any) => {
7-
return (
8-
route.meta?.menu &&
9-
(route.meta.permission ? hasPermission(route.meta.permission as any, 'OR') : true)
10-
)
11-
})
12-
if (route?.name) {
13-
return { name: route?.name }
14-
}
15-
return { name: 'noPermission' }
16-
}
176

187
export const routes: Array<RouteRecordRaw> = [
198
{
209
path: '/',
2110
name: 'home',
2211
redirect: '/application',
2312
children: [
24-
...rolesRoutes.map((r) => {
25-
if (r.meta) {
26-
r.meta.get_permission_route = get_workspace_permission_route
27-
}
28-
return r
29-
}),
13+
...rolesRoutes,
3014
{
3115
path: '/no-permission',
3216
name: 'noPermission',

0 commit comments

Comments
 (0)