diff --git a/src/api/login.js b/src/api/login.js index 9b7f347..7f75dad 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -24,3 +24,57 @@ export function logout() { method: 'post' }) } + +export function fetchList(params) { + return request({ + url: '/admin/list', + method: 'get', + params: params + }) +} + +export function createAdmin(data) { + return request({ + url: '/admin/register', + method: 'post', + data: data + }) +} + +export function updateAdmin(id, data) { + return request({ + url: '/admin/update/' + id, + method: 'post', + data: data + }) +} + +export function updateStatus(id, params) { + return request({ + url: '/admin/updateStatus/' + id, + method: 'post', + params: params + }) +} + +export function deleteAdmin(id) { + return request({ + url: '/admin/delete/' + id, + method: 'post' + }) +} + +export function getRoleByAdmin(id) { + return request({ + url: '/admin/role/' + id, + method: 'get' + }) +} + +export function allocRole(data) { + return request({ + url: '/admin/role/update', + method: 'post', + data: data + }) +} diff --git a/src/api/menu.js b/src/api/menu.js new file mode 100644 index 0000000..8c5493f --- /dev/null +++ b/src/api/menu.js @@ -0,0 +1,55 @@ +import request from '@/utils/request' + +export function fetchList(parentId, params) { + return request({ + url: '/menu/list/' + parentId, + method: 'get', + params: params + }) +} + +export function deleteMenu(id) { + return request({ + url: '/menu/delete/' + id, + method: 'post' + }) +} + +export function createMenu(data) { + return request({ + url: '/menu/create', + method: 'post', + data: data + }) +} + +export function updateMenu(id, data) { + return request({ + url: '/menu/update/' + id, + method: 'post', + data: data + }) +} + +export function getMenu(id) { + return request({ + url: '/menu/' + id, + method: 'get', + }) +} + +export function updateHidden(id, params) { + return request({ + url: '/menu/updateHidden/' + id, + method: 'post', + params: params + }) +} + +export function fetchTreeList() { + return request({ + url: '/menu/treeList', + method: 'get' + }) +} + diff --git a/src/api/resource.js b/src/api/resource.js new file mode 100644 index 0000000..ee2ca81 --- /dev/null +++ b/src/api/resource.js @@ -0,0 +1,39 @@ +import request from '@/utils/request' + +export function fetchList(params) { + return request({ + url: '/resource/list', + method: 'get', + params: params + }) +} + +export function createResource(data) { + return request({ + url: '/resource/create', + method: 'post', + data: data + }) +} + +export function updateResource(id, data) { + return request({ + url: '/resource/update/' + id, + method: 'post', + data: data + }) +} + +export function deleteResource(id) { + return request({ + url: '/resource/delete/' + id, + method: 'post' + }) +} + +export function fetchAllResourceList() { + return request({ + url: '/resource/listAll', + method: 'get' + }) +} diff --git a/src/api/resourceCategory.js b/src/api/resourceCategory.js new file mode 100644 index 0000000..5b69b6e --- /dev/null +++ b/src/api/resourceCategory.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +export function listAllCate() { + return request({ + url: '/resourceCategory/listAll', + method: 'get' + }) +} + +export function createResourceCategory(data) { + return request({ + url: '/resourceCategory/create', + method: 'post', + data: data + }) +} + +export function updateResourceCategory(id, data) { + return request({ + url: '/resourceCategory/update/' + id, + method: 'post', + data: data + }) +} + +export function deleteResourceCategory(id) { + return request({ + url: '/resourceCategory/delete/' + id, + method: 'post' + }) +} diff --git a/src/api/role.js b/src/api/role.js new file mode 100644 index 0000000..bb5cc3a --- /dev/null +++ b/src/api/role.js @@ -0,0 +1,78 @@ +import request from '@/utils/request' + +export function fetchList(params) { + return request({ + url: '/role/list', + method: 'get', + params: params + }) +} + +export function createRole(data) { + return request({ + url: '/role/create', + method: 'post', + data: data + }) +} + +export function updateRole(id, data) { + return request({ + url: '/role/update/' + id, + method: 'post', + data: data + }) +} + +export function updateStatus(id, params) { + return request({ + url: '/role/updateStatus/' + id, + method: 'post', + params: params + }) +} + +export function deleteRole(data) { + return request({ + url:'/role/delete', + method:'post', + data:data + }) +} + +export function fetchAllRoleList() { + return request({ + url: '/role/listAll', + method: 'get' + }) +} + +export function listMenuByRole(roleId) { + return request({ + url: '/role/listMenu/'+roleId, + method: 'get' + }) +} + +export function listResourceByRole(roleId) { + return request({ + url: '/role/listResource/'+roleId, + method: 'get' + }) +} + +export function allocMenu(data) { + return request({ + url: '/role/allocMenu', + method: 'post', + data:data + }) +} + +export function allocResource(data) { + return request({ + url: '/role/allocResource', + method: 'post', + data:data + }) +} diff --git a/src/icons/svg/ums-admin.svg b/src/icons/svg/ums-admin.svg new file mode 100644 index 0000000..8bf2af1 --- /dev/null +++ b/src/icons/svg/ums-admin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/ums-menu.svg b/src/icons/svg/ums-menu.svg new file mode 100644 index 0000000..ee7ffc1 --- /dev/null +++ b/src/icons/svg/ums-menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/ums-resource.svg b/src/icons/svg/ums-resource.svg new file mode 100644 index 0000000..20e396d --- /dev/null +++ b/src/icons/svg/ums-resource.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/ums-role.svg b/src/icons/svg/ums-role.svg new file mode 100644 index 0000000..0530da0 --- /dev/null +++ b/src/icons/svg/ums-role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/ums.svg b/src/icons/svg/ums.svg new file mode 100644 index 0000000..0f5aed9 --- /dev/null +++ b/src/icons/svg/ums.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/permission.js b/src/permission.js index ab64aa2..86c4623 100644 --- a/src/permission.js +++ b/src/permission.js @@ -15,7 +15,12 @@ router.beforeEach((to, from, next) => { } else { if (store.getters.roles.length === 0) { store.dispatch('GetInfo').then(res => { // 拉取用户信息 - next() + let menus=res.data.menus; + let username=res.data.username; + store.dispatch('GenerateRoutes', { menus,username }).then(() => { // 生成可访问的路由表 + router.addRoutes(store.getters.addRouters); // 动态添加可访问路由表 + next({ ...to, replace: true }) + }) }).catch((err) => { store.dispatch('FedLogOut').then(() => { Message.error(err || 'Verification failed, please login again') diff --git a/src/router/index.js b/src/router/index.js index 3bda3df..652e4bb 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -31,7 +31,10 @@ export const constantRouterMap = [ component: () => import('@/views/home/index'), meta: {title: '首页', icon: 'home'} }] - }, + } +] + +export const asyncRouterMap = [ { path: '/pms', component: Layout, @@ -57,20 +60,6 @@ export const constantRouterMap = [ meta: {title: '修改商品', icon: 'product-add'}, hidden: true }, - { - path: 'productRecycle', - name: 'productRecycle', - component: () => import('@/views/pms/product/index'), - meta: {title: '商品回收站', icon: 'product-recycle'}, - hidden: true - }, - { - path: 'productComment', - name: 'productComment', - component: () => import('@/views/pms/product/index'), - meta: {title: '商品评价', icon: 'product-comment'}, - hidden: true - }, { path: 'productCate', name: 'productCate', @@ -301,6 +290,74 @@ export const constantRouterMap = [ } ] }, + { + path:'/ums', + component: Layout, + redirect: '/ums/admin', + name: 'ums', + meta: {title: '权限', icon: 'ums'}, + children: [ + { + path: 'admin', + name: 'admin', + component: () => import('@/views/ums/admin/index'), + meta: {title: '用户列表', icon: 'ums-admin'} + }, + { + path: 'role', + name: 'role', + component: () => import('@/views/ums/role/index'), + meta: {title: '角色列表', icon: 'ums-role'} + }, + { + path: 'allocMenu', + name: 'allocMenu', + component: () => import('@/views/ums/role/allocMenu'), + meta: {title: '分配菜单'}, + hidden: true + }, + { + path: 'allocResource', + name: 'allocResource', + component: () => import('@/views/ums/role/allocResource'), + meta: {title: '分配资源'}, + hidden: true + }, + { + path: 'menu', + name: 'menu', + component: () => import('@/views/ums/menu/index'), + meta: {title: '菜单列表', icon: 'ums-menu'} + }, + { + path: 'addMenu', + name: 'addMenu', + component: () => import('@/views/ums/menu/add'), + meta: {title: '添加菜单'}, + hidden: true + }, + { + path: 'updateMenu', + name: 'updateMenu', + component: () => import('@/views/ums/menu/update'), + meta: {title: '修改菜单'}, + hidden: true + }, + { + path: 'resource', + name: 'resource', + component: () => import('@/views/ums/resource/index'), + meta: {title: '资源列表', icon: 'ums-resource'} + }, + { + path: 'resourceCategory', + name: 'resourceCategory', + component: () => import('@/views/ums/resource/categoryList'), + meta: {title: '资源分类'}, + hidden: true + } + ] + }, {path: '*', redirect: '/404', hidden: true} ] diff --git a/src/store/getters.js b/src/store/getters.js index 7fbf1f4..4dcc0c6 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -4,6 +4,8 @@ const getters = { token: state => state.user.token, avatar: state => state.user.avatar, name: state => state.user.name, - roles: state => state.user.roles + roles: state => state.user.roles, + addRouters: state => state.permission.addRouters, + routers: state => state.permission.routers } export default getters diff --git a/src/store/index.js b/src/store/index.js index 6b6be08..9bfa6a7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2,6 +2,7 @@ import Vue from 'vue' import Vuex from 'vuex' import app from './modules/app' import user from './modules/user' +import permission from './modules/permission' import getters from './getters' Vue.use(Vuex) @@ -9,7 +10,8 @@ Vue.use(Vuex) const store = new Vuex.Store({ modules: { app, - user + user, + permission }, getters }) diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js new file mode 100644 index 0000000..57643e8 --- /dev/null +++ b/src/store/modules/permission.js @@ -0,0 +1,110 @@ +import { asyncRouterMap, constantRouterMap } from '@/router/index'; + +//判断是否有权限访问该菜单 +function hasPermission(menus, route) { + if (route.name) { + let currMenu = getMenu(route.name, menus); + if (currMenu!=null) { + //设置菜单的标题、图标和可见性 + if (currMenu.title != null && currMenu.title !== '') { + route.meta.title = currMenu.title; + } + if (currMenu.icon != null && currMenu.title !== '') { + route.meta.icon = currMenu.icon; + } + if(currMenu.hidden!=null){ + route.hidden = currMenu.hidden !== 0; + } + if (currMenu.sort != null && currMenu.sort !== '') { + route.sort = currMenu.sort; + } + return true; + } else { + route.sort = 0; + if (route.hidden !== undefined && route.hidden === true) { + return true; + } else { + return false; + } + } + } else { + return true + } +} + +//根据路由名称获取菜单 +function getMenu(name, menus) { + for (let i = 0; i < menus.length; i++) { + let menu = menus[i]; + if (name===menu.name) { + return menu; + } + } + return null; +} + +//对菜单进行排序 +function sortRouters(accessedRouters) { + for (let i = 0; i < accessedRouters.length; i++) { + let router = accessedRouters[i]; + if(router.children && router.children.length > 0){ + router.children.sort(compare("sort")); + } + } + accessedRouters.sort(compare("sort")); +} + +//降序比较函数 +function compare(p){ + return function(m,n){ + let a = m[p]; + let b = n[p]; + return b - a; + } +} + +const permission = { + state: { + routers: constantRouterMap, + addRouters: [] + }, + mutations: { + SET_ROUTERS: (state, routers) => { + state.addRouters = routers; + state.routers = constantRouterMap.concat(routers); + } + }, + actions: { + GenerateRoutes({ commit }, data) { + return new Promise(resolve => { + const { menus } = data; + const { username } = data; + const accessedRouters = asyncRouterMap.filter(v => { + //admin帐号直接返回所有菜单 + // if(username==='admin') return true; + if (hasPermission(menus, v)) { + if (v.children && v.children.length > 0) { + v.children = v.children.filter(child => { + if (hasPermission(menus, child)) { + return child + } + return false; + }); + return v + } else { + return v + } + } + return false; + }); + //对菜单进行排序 + sortRouters(accessedRouters); + commit('SET_ROUTERS', accessedRouters); + resolve(); + }) + } + } +}; + +export default permission; + diff --git a/src/utils/request.js b/src/utils/request.js index b785801..e635d42 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -36,7 +36,7 @@ service.interceptors.response.use( }) // 401:未登录; - if (res.code === 401||res.code === 403) { + if (res.code === 401) { MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { confirmButtonText: '重新登录', cancelButtonText: '取消', diff --git a/src/utils/validate.js b/src/utils/validate.js index 0151723..f7e7f3a 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,6 +1,7 @@ export function isvalidUsername(str) { - const valid_map = ['admin', 'test'] - return valid_map.indexOf(str.trim()) >= 0 + // const valid_map = ['admin', 'test'] + // return valid_map.indexOf(str.trim()) >= 0 + return str.trim().length>=3 } /* 合法uri*/ diff --git a/src/views/layout/components/Sidebar/index.vue b/src/views/layout/components/Sidebar/index.vue index c4bd38f..c7671bb 100644 --- a/src/views/layout/components/Sidebar/index.vue +++ b/src/views/layout/components/Sidebar/index.vue @@ -23,10 +23,12 @@ export default { components: { SidebarItem, ScrollBar }, computed: { ...mapGetters([ - 'sidebar' + 'sidebar', + 'routers' ]), routes() { - return this.$router.options.routes + // return this.$router.options.routes + return this.routers }, isCollapse() { return !this.sidebar.opened diff --git a/src/views/ums/admin/index.vue b/src/views/ums/admin/index.vue new file mode 100644 index 0000000..f7b9522 --- /dev/null +++ b/src/views/ums/admin/index.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/src/views/ums/menu/add.vue b/src/views/ums/menu/add.vue new file mode 100644 index 0000000..f7dfb71 --- /dev/null +++ b/src/views/ums/menu/add.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/src/views/ums/menu/components/MenuDetail.vue b/src/views/ums/menu/components/MenuDetail.vue new file mode 100644 index 0000000..e56967f --- /dev/null +++ b/src/views/ums/menu/components/MenuDetail.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/ums/menu/index.vue b/src/views/ums/menu/index.vue new file mode 100644 index 0000000..0dbfc89 --- /dev/null +++ b/src/views/ums/menu/index.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/src/views/ums/menu/update.vue b/src/views/ums/menu/update.vue new file mode 100644 index 0000000..3e6be07 --- /dev/null +++ b/src/views/ums/menu/update.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/src/views/ums/resource/categoryList.vue b/src/views/ums/resource/categoryList.vue new file mode 100644 index 0000000..9fbce99 --- /dev/null +++ b/src/views/ums/resource/categoryList.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/views/ums/resource/index.vue b/src/views/ums/resource/index.vue new file mode 100644 index 0000000..a31c35a --- /dev/null +++ b/src/views/ums/resource/index.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/src/views/ums/role/allocMenu.vue b/src/views/ums/role/allocMenu.vue new file mode 100644 index 0000000..c9e028c --- /dev/null +++ b/src/views/ums/role/allocMenu.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/views/ums/role/allocResource.vue b/src/views/ums/role/allocResource.vue new file mode 100644 index 0000000..ef53912 --- /dev/null +++ b/src/views/ums/role/allocResource.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/src/views/ums/role/index.vue b/src/views/ums/role/index.vue new file mode 100644 index 0000000..169f78c --- /dev/null +++ b/src/views/ums/role/index.vue @@ -0,0 +1,286 @@ + + + + +