diff --git a/ui/src/router/common.ts b/ui/src/router/common.ts new file mode 100644 index 000000000..c95538703 --- /dev/null +++ b/ui/src/router/common.ts @@ -0,0 +1,78 @@ +import { + createRouter, + createWebHistory, + type NavigationGuardNext, + type RouteLocationNormalized, + type RouteRecordRaw, + type RouteRecordName, +} from 'vue-router' +import { hasPermission, set_next_route } from '@/utils/permission/index' +export const getChildRouteList: ( + routeList: Array, + path: string, + name?: RouteRecordName | null | undefined, +) => Array = (routeList, path, name) => { + for (let index = 0; index < routeList.length; index++) { + const route = routeList[index] + if (name === route.name && path === route.path) { + return route.children || [] + } + if (route.children && route.children.length > 0) { + const result = getChildRouteList(route.children, path, name) + if (result && result?.length > 0) { + return result + } + } + } + return [] +} +/** + * 获取同级路由 + * @param routeList + * @param name + * @returns + */ +export const getSameRouteList: ( + routeList: Array, + name?: RouteRecordName | null | undefined, +) => Array = (routeList, name) => { + for (let index = 0; index < routeList.length; index++) { + const route = routeList[index] + if (name === route.name) { + return routeList + } + if (route.children && route.children.length > 0) { + const result = getSameRouteList(route.children, name) + if (result && result?.length > 0) { + return result + } + } + } + return [] +} + +/** + * 获取有权限的路由 + * @param routes + * @param to + * @returns + */ +export const getPermissionRoute = (routes: Array, to: RouteLocationNormalized) => { + const routeName: string = to.meta + ? to.meta.permissionRoute + ? (to.meta.permissionRoute as string) + : (to.name as string) + : (to.name as string) + const routeList = getSameRouteList(routes, routeName) + const route = routeList.find((route: any) => { + return ( + (to.meta.group ? to.meta.group == route.meta.group : true) && + (route.meta.permission ? hasPermission(route.meta.permission as any, 'OR') : true) + ) + }) + + if (route?.name) { + return { name: route?.name, params: to.params } + } + return { name: 'noPermission' } +} diff --git a/ui/src/router/index.ts b/ui/src/router/index.ts index 052001acf..3b86f2bd5 100644 --- a/ui/src/router/index.ts +++ b/ui/src/router/index.ts @@ -1,5 +1,7 @@ import { hasPermission, set_next_route } from '@/utils/permission/index' +import { getChildRouteList } from '@/router/common' import NProgress from 'nprogress' +import { getPermissionRoute } from '@/router/common' import { createRouter, createWebHistory, @@ -47,44 +49,16 @@ router.beforeEach( if (to.meta.permission ? hasPermission(to.meta.permission as any, 'OR') : true) { next() } else { - console.log('s') - if (to.meta.get_permission_route) { - const t = to.meta.get_permission_route() - console.log(t) - next(t) - return - } - // 如果没有权限则直接取404页面 - next({ path: '/no-permission' }) + const n = getPermissionRoute(routes, to) + next(n) } }, ) router.afterEach(() => { NProgress.done() }) - export const getChildRouteListByPathAndName = (path: any, name?: RouteRecordName | any) => { return getChildRouteList(routes, path, name) } -export const getChildRouteList: ( - routeList: Array, - path: string, - name?: RouteRecordName | null | undefined, -) => Array = (routeList, path, name) => { - for (let index = 0; index < routeList.length; index++) { - const route = routeList[index] - if (name === route.name && path === route.path) { - return route.children || [] - } - if (route.children && route.children.length > 0) { - const result = getChildRouteList(route.children, path, name) - if (result && result?.length > 0) { - return result - } - } - } - return [] -} - export default router diff --git a/ui/src/router/modules/application.ts b/ui/src/router/modules/application.ts index 86e5201b4..8f3a766b0 100644 --- a/ui/src/router/modules/application.ts +++ b/ui/src/router/modules/application.ts @@ -1,5 +1,4 @@ import { PermissionConst, EditionConst, RoleConst } from '@/utils/permission/data' -import { get_next_route } from '@/utils/permission' const applicationRouter = { path: '/application', name: 'application', @@ -12,6 +11,7 @@ const applicationRouter = { PermissionConst.APPLICATION_READ.getWorkspacePermissionWorkspaceManageRole, PermissionConst.APPLICATION_READ.getWorkspacePermission, ], + group: 'workspace', order: 1, }, redirect: '/application', @@ -20,7 +20,7 @@ const applicationRouter = { { path: '/application', name: 'application-index', - meta: { title: '应用主页', activeMenu: '/application' }, + meta: { title: '应用主页', activeMenu: '/application', sameRoute: 'application' }, component: () => import('@/views/application/index.vue'), hidden: true, }, diff --git a/ui/src/router/modules/document.ts b/ui/src/router/modules/document.ts index 2153f2bc3..264f6da70 100644 --- a/ui/src/router/modules/document.ts +++ b/ui/src/router/modules/document.ts @@ -19,6 +19,7 @@ const DocumentRouter = { active: 'document', parentPath: '/knowledge/:id/:folderId', parentName: 'KnowledgeDetail', + group: 'KnowledgeDetail', permission: [ RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE.getWorkspaceRole, @@ -43,6 +44,7 @@ const DocumentRouter = { active: 'problem', parentPath: '/knowledge/:id/:folderId', parentName: 'KnowledgeDetail', + group: 'KnowledgeDetail', permission: [ RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE.getWorkspaceRole, @@ -66,6 +68,7 @@ const DocumentRouter = { active: 'hit-test', parentPath: '/knowledge/:id/:folderId', parentName: 'KnowledgeDetail', + group: 'KnowledgeDetail', }, component: () => import('@/views/hit-test/index.vue'), }, @@ -80,6 +83,7 @@ const DocumentRouter = { parentPath: '/knowledge/:id/:folderId', parentName: 'KnowledgeDetail', resourceType: ChatUserResourceEnum.KNOWLEDGE, + group: 'KnowledgeDetail', permission: [ RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE.getWorkspaceRole, @@ -104,6 +108,7 @@ const DocumentRouter = { active: 'setting', parentPath: '/knowledge/:id/:folderId', parentName: 'KnowledgeDetail', + group: 'KnowledgeDetail', permission: [ RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE.getWorkspaceRole, diff --git a/ui/src/router/modules/knowledge.ts b/ui/src/router/modules/knowledge.ts index c04b2b26c..d3d71c35b 100644 --- a/ui/src/router/modules/knowledge.ts +++ b/ui/src/router/modules/knowledge.ts @@ -11,6 +11,7 @@ const ModelRouter = { PermissionConst.KNOWLEDGE_READ.getWorkspacePermission, PermissionConst.KNOWLEDGE_READ.getWorkspacePermissionWorkspaceManageRole, ], + group: 'workspace', order: 2, }, redirect: '/knowledge', @@ -19,7 +20,7 @@ const ModelRouter = { { path: '/knowledge', name: 'knowledge-index', - meta: { title: '知识库主页', activeMenu: '/knowledge' }, + meta: { title: '知识库主页', activeMenu: '/knowledge', sameRoute: 'knowledge' }, component: () => import('@/views/knowledge/index.vue'), }, diff --git a/ui/src/router/modules/model.ts b/ui/src/router/modules/model.ts index 937e04268..72c7461b7 100644 --- a/ui/src/router/modules/model.ts +++ b/ui/src/router/modules/model.ts @@ -11,6 +11,7 @@ const ModelRouter = { PermissionConst.MODEL_READ.getWorkspacePermission, PermissionConst.MODEL_READ.getWorkspacePermissionWorkspaceManageRole, ], + group: 'workspace', order: 4, }, redirect: '/model', @@ -22,6 +23,7 @@ const ModelRouter = { meta: { title: '模型主页', activeMenu: '/model', + sameRoute: 'model', }, component: () => import('@/views/model/index.vue'), }, diff --git a/ui/src/router/modules/tool.ts b/ui/src/router/modules/tool.ts index 5c23cf58f..5d838991b 100644 --- a/ui/src/router/modules/tool.ts +++ b/ui/src/router/modules/tool.ts @@ -11,6 +11,7 @@ const ModelRouter = { PermissionConst.TOOL_READ.getWorkspacePermission, PermissionConst.TOOL_READ.getWorkspacePermissionWorkspaceManageRole, ], + group: 'workspace', order: 3, }, redirect: '/tool', @@ -20,6 +21,7 @@ const ModelRouter = { path: '/tool', name: 'tool-index', meta: { title: '工具主页', activeMenu: '/tool' }, + sameRoute: 'tool', component: () => import('@/views/tool/index.vue'), }, ], diff --git a/ui/src/router/routes.ts b/ui/src/router/routes.ts index 9496591c0..7a1637b41 100644 --- a/ui/src/router/routes.ts +++ b/ui/src/router/routes.ts @@ -1,19 +1,8 @@ import type { RouteRecordRaw } from 'vue-router' const modules: any = import.meta.glob('./modules/*.ts', { eager: true }) import { hasPermission, set_next_route } from '@/utils/permission/index' + const rolesRoutes: RouteRecordRaw[] = [...Object.keys(modules).map((key) => modules[key].default)] -const get_workspace_permission_route = () => { - const route = rolesRoutes.find((route: any) => { - return ( - route.meta?.menu && - (route.meta.permission ? hasPermission(route.meta.permission as any, 'OR') : true) - ) - }) - if (route?.name) { - return { name: route?.name } - } - return { name: 'noPermission' } -} export const routes: Array = [ { @@ -21,12 +10,7 @@ export const routes: Array = [ name: 'home', redirect: '/application', children: [ - ...rolesRoutes.map((r) => { - if (r.meta) { - r.meta.get_permission_route = get_workspace_permission_route - } - return r - }), + ...rolesRoutes, { path: '/no-permission', name: 'noPermission',