Commit 3cee922e69a36fef734173e6d510bd97e486d8d4

Authored by YunaiV
1 parent a13fb613

优化 permission 相关的注释

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