Commit 3cee922e69a36fef734173e6d510bd97e486d8d4
1 parent
a13fb613
优化 permission 相关的注释
Showing
8 changed files
with
27 additions
and
23 deletions
yudao-ui-admin/src/components/TopNav/index.vue
yudao-ui-admin/src/directive/index.js
| ... | ... | @@ -5,6 +5,7 @@ import dialogDragWidth from './dialog/dragWidth' |
| 5 | 5 | import dialogDragHeight from './dialog/dragHeight' |
| 6 | 6 | import clipboard from './module/clipboard' |
| 7 | 7 | |
| 8 | +// Vue:自定义指令:https://v2.cn.vuejs.org/v2/guide/custom-directive.html | |
| 8 | 9 | const install = function(Vue) { |
| 9 | 10 | Vue.directive('hasRole', hasRole) |
| 10 | 11 | Vue.directive('hasPermi', hasPermi) | ... | ... |
yudao-ui-admin/src/directive/permission/hasPermi.js
| ... | ... | @@ -2,22 +2,21 @@ |
| 2 | 2 | * 操作权限处理 |
| 3 | 3 | * Copyright (c) 2019 ruoyi |
| 4 | 4 | */ |
| 5 | - | |
| 6 | 5 | import store from '@/store' |
| 7 | 6 | |
| 8 | 7 | export default { |
| 9 | 8 | inserted(el, binding, vnode) { |
| 10 | 9 | const { value } = binding |
| 11 | - const all_permission = "*:*:*"; | |
| 12 | - const permissions = store.getters && store.getters.permissions | |
| 10 | + const all_permission = "*:*:*"; // 全部权限 | |
| 11 | + const permissions = store.getters && store.getters.permissions // 用户拥有的权限标识的数组 | |
| 13 | 12 | |
| 14 | 13 | if (value && value instanceof Array && value.length > 0) { |
| 14 | + // 判断是否有权限 | |
| 15 | 15 | const permissionFlag = value |
| 16 | - | |
| 17 | 16 | const hasPermissions = permissions.some(permission => { |
| 18 | 17 | return all_permission === permission || permissionFlag.includes(permission) |
| 19 | 18 | }) |
| 20 | - | |
| 19 | + // 如果没有权限,则移除元素 | |
| 21 | 20 | if (!hasPermissions) { |
| 22 | 21 | el.parentNode && el.parentNode.removeChild(el) |
| 23 | 22 | } | ... | ... |
yudao-ui-admin/src/directive/permission/hasRole.js
| ... | ... | @@ -2,22 +2,22 @@ |
| 2 | 2 | * 角色权限处理 |
| 3 | 3 | * Copyright (c) 2019 ruoyi |
| 4 | 4 | */ |
| 5 | - | |
| 5 | + | |
| 6 | 6 | import store from '@/store' |
| 7 | 7 | |
| 8 | 8 | export default { |
| 9 | 9 | inserted(el, binding, vnode) { |
| 10 | 10 | const { value } = binding |
| 11 | 11 | const super_admin = "admin"; |
| 12 | - const roles = store.getters && store.getters.roles | |
| 12 | + const roles = store.getters && store.getters.roles // 用户拥有的角色标识的数组 | |
| 13 | 13 | |
| 14 | 14 | if (value && value instanceof Array && value.length > 0) { |
| 15 | + // 判断是否有角色 | |
| 15 | 16 | const roleFlag = value |
| 16 | - | |
| 17 | 17 | const hasRole = roles.some(role => { |
| 18 | 18 | return super_admin === role || roleFlag.includes(role) |
| 19 | 19 | }) |
| 20 | - | |
| 20 | + // 如果没有角色,则移除元素 | |
| 21 | 21 | if (!hasRole) { |
| 22 | 22 | el.parentNode && el.parentNode.removeChild(el) |
| 23 | 23 | } | ... | ... |
yudao-ui-admin/src/layout/components/Sidebar/index.vue
yudao-ui-admin/src/permission.js
| ... | ... | @@ -24,11 +24,11 @@ router.beforeEach((to, from, next) => { |
| 24 | 24 | isRelogin.show = true |
| 25 | 25 | // 获取字典数据 add by 芋艿 |
| 26 | 26 | store.dispatch('dict/loadDictDatas') |
| 27 | - // 判断当前用户是否已拉取完user_info信息 | |
| 27 | + // 判断当前用户是否已拉取完 user_info 信息 | |
| 28 | 28 | store.dispatch('GetInfo').then(() => { |
| 29 | 29 | isRelogin.show = false |
| 30 | 30 | store.dispatch('GenerateRoutes').then(accessRoutes => { |
| 31 | - // 根据roles权限生成可访问的路由表 | |
| 31 | + // 根据 roles 权限生成可访问的路由表 | |
| 32 | 32 | router.addRoutes(accessRoutes) // 动态添加可访问路由表 |
| 33 | 33 | next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 |
| 34 | 34 | }) | ... | ... |
yudao-ui-admin/src/router/index.js
| ... | ... | @@ -8,18 +8,20 @@ Vue.use(Router) |
| 8 | 8 | /** |
| 9 | 9 | * Note: 路由配置项 |
| 10 | 10 | * |
| 11 | - * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 | |
| 11 | + * hidden: true // 【重要】当设置 true 的时候该路由不会再侧边栏出现 如 401,login 等页面,或者如一些编辑页面 /edit/1 | |
| 12 | 12 | * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 |
| 13 | 13 | * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 |
| 14 | 14 | * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 |
| 15 | 15 | * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 |
| 16 | + * path: '/login', // 【重要】访问的 URL 路径 | |
| 17 | + * component: Layout, // 【重要】对应的组件;也可以是 (resolve) => require(['@/views/login'], resolve), | |
| 16 | 18 | * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 |
| 17 | - * name:'router-name' // 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题 | |
| 19 | + * name:'router-name' // 【重要】设定路由的名字,一定要填写不然使用 <keep-alive> 时会出现各种问题 | |
| 18 | 20 | * meta : { |
| 19 | - noCache: true // 如果设置为true,则不会被 <keep-alive> 缓存(默认 false) | |
| 20 | - title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 | |
| 21 | - icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg | |
| 22 | - breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 | |
| 21 | + noCache: true // 【重要】如果设置为 true,则不会被 <keep-alive> 缓存(默认 false) | |
| 22 | + title: 'title' // 【重要】设置该路由在侧边栏和面包屑中展示的名字 | |
| 23 | + icon: 'svg-name' // 【重要】设置该路由的图标,对应路径 src/assets/icons/svg | |
| 24 | + breadcrumb: false // 如果设置为 false,则不会在 breadcrumb 面包屑中显示 | |
| 23 | 25 | activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 |
| 24 | 26 | } |
| 25 | 27 | */ | ... | ... |
yudao-ui-admin/src/store/modules/permission.js
| ... | ... | @@ -8,7 +8,8 @@ const permission = { |
| 8 | 8 | state: { |
| 9 | 9 | routes: [], |
| 10 | 10 | addRoutes: [], |
| 11 | - sidebarRouters: [] | |
| 11 | + sidebarRouters: [], // 左侧边菜单的路由,被 Sidebar/index.vue 使用 | |
| 12 | + topbarRouters: [], // 顶部菜单的路由,被 TopNav/index.vue 使用 | |
| 12 | 13 | }, |
| 13 | 14 | mutations: { |
| 14 | 15 | SET_ROUTES: (state, routes) => { |
| ... | ... | @@ -29,10 +30,10 @@ const permission = { |
| 29 | 30 | // 生成路由 |
| 30 | 31 | GenerateRoutes({ commit }) { |
| 31 | 32 | return new Promise(resolve => { |
| 32 | - // 向后端请求路由数据 | |
| 33 | + // 向后端请求路由数据(菜单) | |
| 33 | 34 | getRouters().then(res => { |
| 34 | - const sdata = JSON.parse(JSON.stringify(res.data)) | |
| 35 | - const rdata = JSON.parse(JSON.stringify(res.data)) | |
| 35 | + const sdata = JSON.parse(JSON.stringify(res.data)) // 【重要】用于菜单中的数据 | |
| 36 | + const rdata = JSON.parse(JSON.stringify(res.data)) // 用于最后添加到 Router 中的数据 | |
| 36 | 37 | const sidebarRoutes = filterAsyncRouter(sdata) |
| 37 | 38 | const rewriteRoutes = filterAsyncRouter(rdata, false, true) |
| 38 | 39 | rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }) |
| ... | ... | @@ -57,7 +58,7 @@ function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { |
| 57 | 58 | icon: route.icon, |
| 58 | 59 | noCache: !route.keepAlive, |
| 59 | 60 | } |
| 60 | - // 路由地址转首字母大写驼峰,作为路由名称,适配keepAlive | |
| 61 | + // 路由地址转首字母大写驼峰,作为路由名称,适配 keepAlive | |
| 61 | 62 | route.name = toCamelCase(route.path, true) |
| 62 | 63 | route.hidden = !route.visible |
| 63 | 64 | // 处理 component 属性 | ... | ... |