From 4080fba0bfd60dfd1a2e957933a118a32330b7cb Mon Sep 17 00:00:00 2001 From: Serge Gao Date: Fri, 15 Feb 2019 11:06:02 +0800 Subject: [PATCH] feat role management --- src/api/role.js | 31 +++++ src/mock/index.js | 9 +- src/mock/role.js | 174 +++++++++++++++++++++++ src/mock/routes.js | 45 +++--- src/store/modules/permission.js | 2 + src/views/permission/role.vue | 240 ++++++++++++++++++++++++++++++++ 6 files changed, 483 insertions(+), 18 deletions(-) create mode 100644 src/api/role.js create mode 100644 src/mock/role.js create mode 100644 src/views/permission/role.vue diff --git a/src/api/role.js b/src/api/role.js new file mode 100644 index 00000000..b1720835 --- /dev/null +++ b/src/api/role.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +export function fetchRoles() { + return request({ + url: '/roles', + method: 'get' + }) +} + +export function deleteRole(id) { + return request({ + url: `/roles/${id}`, + method: 'delete' + }) +} + +export function newRole(data) { + return request({ + url: '/roles', + method: 'post', + data + }) +} + +export function updateRole(id, data) { + return request({ + url: `/roles/${id}`, + method: 'put', + data + }) +} diff --git a/src/mock/index.js b/src/mock/index.js index 08afec3b..45d64eaf 100644 --- a/src/mock/index.js +++ b/src/mock/index.js @@ -4,6 +4,7 @@ import articleAPI from './article' import remoteSearchAPI from './remoteSearch' import transactionAPI from './transaction' import routesAPI from './routes' +import roleAPI from './role' // 修复在使用 MockJS 情况下,设置 withCredentials = true,且未被拦截的跨域请求丢失 Cookies 的问题 // https://github.com/nuysoft/Mock/issues/300 @@ -19,7 +20,7 @@ Mock.XHR.prototype.send = function() { // timeout: '350-600' // }) -// 路由表相关 +// 路由相关 Mock.mock(/\/routes/, 'get', routesAPI.getAsyncRoutesMap) // 登录相关 @@ -27,6 +28,12 @@ Mock.mock(/\/login\/login/, 'post', loginAPI.loginByUsername) Mock.mock(/\/login\/logout/, 'post', loginAPI.logout) Mock.mock(/\/user\/info\.*/, 'get', loginAPI.getUserInfo) +// 角色相关 +Mock.mock(/\/roles/, 'get', roleAPI.getRoles) +Mock.mock(/\/roles$/, 'post', roleAPI.newRole) +Mock.mock(/\/roles\/[A-Za-z0-9]+/, 'put', roleAPI.updateRole) +Mock.mock(/\/roles\/[A-Za-z0-9]+/, 'delete', roleAPI.deleteRole) + // 文章相关 Mock.mock(/\/article\/list/, 'get', articleAPI.getList) Mock.mock(/\/article\/detail/, 'get', articleAPI.getArticle) diff --git a/src/mock/role.js b/src/mock/role.js new file mode 100644 index 00000000..615a3859 --- /dev/null +++ b/src/mock/role.js @@ -0,0 +1,174 @@ +import Mock from 'mockjs' + +// admin 角色可以访问所有菜单 +const roles = [ + { + id: 'editor', // 角色id + name: 'editor', + description: '编辑', + accessibleRoutes: [ + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + '18', + '19', + '20', + '21', + '22', + '23', + '24', + '25', + '26', + '27', + '28', + '29', + '30', + '31', + '32', + '33', + '34', + '35', + '36', + '37', + '38', + '39', + '40', + '41', + '42', + '43', + '44', + '45', + '46', + '47', + '48', + '49', + '50', + '51', + '52', + '53', + '54', + '55', + '56', + '57', + '58', + '59', + '60', + '61', + '62', + '63', + '64', + '65', + '66', + '67' + ] // 可访问的菜单id列表 + }, + { + id: '2', // 角色id + name: 'operator', + description: '运营', + accessibleRoutes: [ + '1', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + '18', + '19', + '20', + '21', + '22', + '23', + '24', + '25', + '26', + '27', + '28', + '29', + '30', + '31', + '32', + '33', + '34', + '35', + '36', + '37', + '38', + '39', + '40', + '41', + '42', + '43', + '44', + '45', + '46', + '47', + '48', + '49', + '50', + '51', + '52', + '53', + '54', + '55', + '56', + '57', + '58', + '59', + '60', + '61', + '62', + '63', + '64', + '65' + ] // 可访问的菜单id列表 + } +] + +export default { + getRoles() { + return roles + }, + newRole() { + const res = { + data: Mock.mock('id') + } + return res + }, + updateRole() { + const res = { + data: 'success' + } + return res + }, + deleteRole() { + const res = { + data: 'success' + } + return res + } +} diff --git a/src/mock/routes.js b/src/mock/routes.js index 330e903f..480334a4 100644 --- a/src/mock/routes.js +++ b/src/mock/routes.js @@ -30,6 +30,16 @@ const asyncRoutesMap = [ title: 'directivePermission', roles: ['admin', 'editor'] } + }, + { + id: '66', + path: 'role', + component: 'permission/role', + name: 'role', + meta: { + title: 'roleManagement', + roles: ['admin'] + } } ] }, @@ -406,6 +416,7 @@ const asyncRoutesMap = [ redirect: 'noredirect', children: [ { + id: '67', path: 'log', component: 'errorLog/index', name: 'ErrorLog', @@ -450,23 +461,23 @@ const asyncRoutesMap = [ ] }, - // { - // id: '53', - // path: '/zip', - // component: 'layout/Layout', - // redirect: '/zip/download', - // alwaysShow: true, - // meta: { title: 'zip', icon: 'zip', roles: ['admin', 'editor'] }, - // children: [ - // { - // id: '54', - // path: 'download', - // component: 'zip/index', - // name: 'ExportZip', - // meta: { title: 'exportZip', roles: ['admin', 'editor'] } - // } - // ] - // }, + { + id: '53', + path: '/zip', + component: 'layout/Layout', + redirect: '/zip/download', + alwaysShow: true, + meta: { title: 'zip', icon: 'zip', roles: ['admin', 'editor'] }, + children: [ + { + id: '54', + path: 'download', + component: 'zip/index', + name: 'ExportZip', + meta: { title: 'exportZip', roles: ['admin', 'editor'] } + } + ] + }, { id: '55', diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 96038dc2..f52287b8 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -8,6 +8,8 @@ const _import = path => () => import(`@/views/${path}`) * @param route */ function hasPermission(roles, route) { + // 如果是隐藏的菜单, 都是可访问的, 因为隐藏的菜单不会出现在左侧菜单栏, 不可编辑权限 + if (route.hidden) return true if (route.meta && route.meta.roles) { return roles.some(role => route.meta.roles.includes(role)) } else { diff --git a/src/views/permission/role.vue b/src/views/permission/role.vue new file mode 100644 index 00000000..b6023a55 --- /dev/null +++ b/src/views/permission/role.vue @@ -0,0 +1,240 @@ + + + + +