diff --git a/src/mock/login.js b/src/mock/login.js index 8693ef98f78d72f661a9029d9b575dfc619c575f..b9694f0995911fda685116a72ecdbd0bc31ff5cc 100644 --- a/src/mock/login.js +++ b/src/mock/login.js @@ -2,14 +2,14 @@ import { param2Obj } from '@/utils' const userMap = { admin: { - role: ['admin'], + roles: ['admin'], token: 'admin', introduction: '我是超级管ç†å‘˜', avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', name: 'Super Admin' }, editor: { - role: ['editor'], + roles: ['editor'], token: 'editor', introduction: '我是编辑', avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', diff --git a/src/permission.js b/src/permission.js index e3400588345395bb70f11ea6fbb7d9db0a2adefc..87a591e5cc85aeb18e8fd87cf9d37b2ca54285ca 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,11 +1,13 @@ import router from './router' import store from './store' +import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css'// progress bar style import { getToken } from '@/utils/auth' // getToken from cookie -import { Message } from 'element-ui' -// permissiom judge +NProgress.configure({ showSpinner: false })// NProgress Configuration + +// permissiom judge function function hasPermission(roles, permissionRoles) { if (roles.indexOf('admin') >= 0) return true // admin permission passed directly if (!permissionRoles) return true @@ -16,15 +18,16 @@ const whiteList = ['/login', '/authredirect']// no redirect whitelist router.beforeEach((to, from, next) => { NProgress.start() // start progress bar - if (getToken()) { // 判æ–是å¦æœ‰token + if (getToken()) { // determine if there has token + /* has token*/ if (to.path === '/login') { next({ path: '/' }) - NProgress.done() // router在hash模å¼ä¸‹ 手动改å˜hash é‡å®šå‘å›žæ¥ ä¸ä¼šè§¦å‘afterEach æš‚æ—¶hack方案 ps:history模å¼ä¸‹æ— 问题,å¯åˆ é™¤è¯¥è¡Œï¼ + NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it } else { if (store.getters.roles.length === 0) { // 判æ–当å‰ç”¨æˆ·æ˜¯å¦å·²æ‹‰å–完user_infoä¿¡æ¯ store.dispatch('GetUserInfo').then(res => { // 拉å–user_info - const roles = res.data.role - store.dispatch('GenerateRoutes', { roles }).then(() => { // 生æˆå¯è®¿é—®çš„路由表 + const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop'] + store.dispatch('GenerateRoutes', { roles }).then(() => { // æ ¹æ®rolesæƒé™ç”Ÿæˆå¯è®¿é—®çš„路由表 router.addRoutes(store.getters.addRouters) // 动æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨ next({ ...to, replace: true }) // hack方法 ç¡®ä¿addRouteså·²å®Œæˆ ,set the replace: true so the navigation will not leave a history record }) @@ -36,21 +39,21 @@ router.beforeEach((to, from, next) => { }) } else { // 没有动æ€æ”¹å˜æƒé™çš„需求å¯ç›´æŽ¥next() åˆ é™¤ä¸‹æ–¹æƒé™åˆ¤æ– ↓ - if (hasPermission(store.getters.roles, to.meta.role)) { + if (hasPermission(store.getters.roles, to.meta.roles)) { next()// } else { - next({ path: '/401', query: { noGoBack: true }}) - NProgress.done() // router在hash模å¼ä¸‹ 手动改å˜hash é‡å®šå‘å›žæ¥ ä¸ä¼šè§¦å‘afterEach æš‚æ—¶hack方案 ps:history模å¼ä¸‹æ— 问题,å¯åˆ é™¤è¯¥è¡Œï¼ + next({ path: '/401', replace: true, query: { noGoBack: true }}) } // å¯åˆ ↑ } } } else { + /* has no token*/ if (whiteList.indexOf(to.path) !== -1) { // 在å…登录白åå•ï¼Œç›´æŽ¥è¿›å…¥ next() } else { next('/login') // å¦åˆ™å…¨éƒ¨é‡å®šå‘到登录页 - NProgress.done() // router在hash模å¼ä¸‹ 手动改å˜hash é‡å®šå‘å›žæ¥ ä¸ä¼šè§¦å‘afterEach æš‚æ—¶hack方案 ps:history模å¼ä¸‹æ— 问题,å¯åˆ é™¤è¯¥è¡Œï¼ + NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it } } }) diff --git a/src/router/index.js b/src/router/index.js index 221ec7eb0e71825d44bc67074315a0fcbcd10e2f..bdb318168890bb011d3036141ea83955b9dc6a5c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -18,7 +18,7 @@ import Layout from '../views/layout/Layout' * redirect: noredirect if `redirect:noredirect` will no redirct in the breadcrumb * name:'router-name' the name is used by <keep-alive> (must set!!!) * meta : { - role: ['admin','editor'] will control the page role (you can set multiple roles) + roles: ['admin','editor'] will control the page roles (you can set multiple roles) title: 'title' the name show in submenu and breadcrumb (recommend set) icon: 'svg-name' the icon show in the sidebar, noCache: true if fasle ,the page will no be cached(default is false) @@ -54,7 +54,7 @@ export const constantRouterMap = [ ] export default new Router({ - // mode: 'history', //åŽç«¯æ”¯æŒå¯å¼€ + // mode: 'history', // require service support scrollBehavior: () => ({ y: 0 }), routes: constantRouterMap }) @@ -64,7 +64,7 @@ export const asyncRouterMap = [ path: '/permission', component: Layout, redirect: '/permission/index', - meta: { role: ['admin'] }, + meta: { roles: ['admin'] }, // you can set roles in root nav children: [{ path: 'index', component: _import('permission/index'), @@ -72,7 +72,7 @@ export const asyncRouterMap = [ meta: { title: 'permission', icon: 'lock', - role: ['admin'] + roles: ['admin'] // or you can only set roles in sub nav } }] }, diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 50e2bbe8e09e99061a410a63644d368f547082a5..ce1aafa63d8994c2a1845531c08f6dc02d2aa9b3 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -6,8 +6,8 @@ import { asyncRouterMap, constantRouterMap } from '@/router' * @param route */ function hasPermission(roles, route) { - if (route.meta && route.meta.role) { - return roles.some(role => route.meta.role.indexOf(role) >= 0) + if (route.meta && route.meta.roles) { + return roles.some(role => route.meta.roles.indexOf(role) >= 0) } else { return true } diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 8cf6d18a9e7898061a92c358eda4da552a511828..18c9357002354b3b388a3f7f8ad4da71c869c658 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -67,7 +67,7 @@ const user = { reject('error') } const data = response.data - commit('SET_ROLES', data.role) + commit('SET_ROLES', data.roles) commit('SET_NAME', data.name) commit('SET_AVATAR', data.avatar) commit('SET_INTRODUCTION', data.introduction) @@ -116,13 +116,13 @@ const user = { }, // 动æ€ä¿®æ”¹æƒé™ - ChangeRole({ commit }, role) { + ChangeRoles({ commit }, role) { return new Promise(resolve => { commit('SET_TOKEN', role) setToken(role) getUserInfo(role).then(response => { const data = response.data - commit('SET_ROLES', data.role) + commit('SET_ROLES', data.roles) commit('SET_NAME', data.name) commit('SET_AVATAR', data.avatar) commit('SET_INTRODUCTION', data.introduction) diff --git a/src/views/permission/index.vue b/src/views/permission/index.vue index 73a64e3eb11de0d649b359d963de88faaf59f6a6..9056a0763d578fa351e05a83dbd89c65622cbf33 100644 --- a/src/views/permission/index.vue +++ b/src/views/permission/index.vue @@ -2,7 +2,7 @@ <div class="app-container"> <div style="margin-bottom:15px;">{{$t('permission.roles')}}: {{roles}}</div> {{$t('permission.switchRoles')}}: - <el-radio-group v-model="role"> + <el-radio-group v-model="switchRoles"> <el-radio-button label="editor"></el-radio-button> </el-radio-group> </div> @@ -15,7 +15,7 @@ export default{ name: 'permission', data() { return { - role: '' + switchRoles: '' } }, computed: { @@ -24,8 +24,8 @@ export default{ ]) }, watch: { - role(val) { - this.$store.dispatch('ChangeRole', val).then(() => { + switchRoles(val) { + this.$store.dispatch('ChangeRoles', val).then(() => { this.$router.push({ path: '/permission/index?' + +new Date() }) }) }