diff --git a/Code/Fe/src/api/wms-interface.js b/Code/Fe/src/api/wms-interface.js index 8c28acf..fdcdf4a 100644 --- a/Code/Fe/src/api/wms-interface.js +++ b/Code/Fe/src/api/wms-interface.js @@ -13,6 +13,15 @@ export function getInterfaceBoard() { }) } +// 获取菜单数据 +export function getDefinitionMenu(IncludeTypes) { + return request({ + method:'get', + url: base_api + '/api/abp/application-configuration', + params:{IncludeLocalizationResources:true} + }) +} + // // 测试数据-明细-删除 // export function TestSchoolDetailList_delete(id) { // return request({ diff --git a/Code/Fe/src/layout/components/Navbar.vue b/Code/Fe/src/layout/components/Navbar.vue index d7fcd54..6f898db 100644 --- a/Code/Fe/src/layout/components/Navbar.vue +++ b/Code/Fe/src/layout/components/Navbar.vue @@ -78,8 +78,11 @@ export default { this.$store.dispatch("app/toggleSideBar"); }, async logout() { - await this.$store.dispatch("user/logout"); - this.$router.push(`/login?redirect=${this.$route.fullPath}`); + // await this.$store.dispatch("user/logout"); + // this.$router.push(`/login?redirect=${this.$route.fullPath}`); + localStorage.removeItem("interfaceBoardColumnsNames") + localStorage.removeItem("currentUserInfo") + this.$router.push('/login?isAutoLogin=false') }, handleClick() { diff --git a/Code/Fe/src/permission-0718.js b/Code/Fe/src/permission-0718.js new file mode 100644 index 0000000..fc99b88 --- /dev/null +++ b/Code/Fe/src/permission-0718.js @@ -0,0 +1,185 @@ +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' // get token from cookie +import getPageTitle from '@/utils/get-page-title' +import { + asyncRoutes +} from '@/router' +import { getInterfaceBoard } from "@/api/wms-interface" +import { login,getUsersByUserName } from "@/api/wms-auth" + +NProgress.configure({ + showSpinner: false +}) // NProgress Configuration + +const whiteList = ['/login', '/auth-redirect', '/testForm'] // no redirect whitelist + + +router.beforeEach(async (to, from, next) => { + // 添加路由信息,方便代码修改定位 + // console.log('----------------' + to.meta.title + '-----------------------'+ to.fullPath.substring(to.fullPath.lastIndexOf('-')+1,to.fullPath.length) + '.vue' ); + // start progress bar + NProgress.start() + + // set page title + document.title = getPageTitle() + + // 判断是否自动登录 + let isAutoLogin = JSON.parse(localStorage.getItem('isAutoLogin')) + // 如果路径中有isAutoLogin参数则优先,否则读取配置文件中的isAutoLogin参数 + let _url_isAutoLogin = to.query.isAutoLogin + if( _url_isAutoLogin== 'false' || _url_isAutoLogin == 'true'){ + isAutoLogin = JSON.parse(_url_isAutoLogin) + } + let userInfo = localStorage.getItem('currentUserInfo') + let _zh = localStorage.getItem('columnsApiNamesZh') + // 是否有用户信息: + // 1、如果没有判断是否为自动登录(是自动登录则自动执行登录,账号密码为配置信息中的值,不是自动登录则跳到登录页) + // 2、如果有用户信息:则检查是否有api接口的表头数据,没有的话重新获取 + if(!userInfo){ + if(isAutoLogin || to.query.loginName){ + // let loginForm= { + // userNameOrEmailAddress:localStorage.getItem("userNameOrEmailAddress"), + // password:localStorage.getItem("client_secret"), + // // rememberMe:true, + // // grant_type: 'password', + // // client_id: 'Auth_App', + // } + // store.dispatch('user/login', loginForm).then(() => { + // login(loginForm).then(()=>{ + getUsersByUserName(localStorage.getItem("userNameOrEmailAddress")).then(res=>{ + // todo:currentUserInfo全程需要优化 + localStorage.setItem("currentUserInfo", JSON.stringify(res)); + }) + .catch(err => { + console.log('获取用户信息失败,请重试') + }) + // 提前获取接口监控看板表头数据并存储 + getInterfaceBoard().then(result => { + localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); + next('/') + }) + .catch(err => { + console.log('获取表头失败,请重试') + }) + // }) + // .catch((error) => { + // console.log('登录失败') + // }) + }else{ + if (to.path != '/login') { + next('/login') + }else{ + next() + } + NProgress.done() + } + }else{ + // 重新获取api接口表头 + const _interfaceBoardColumnsNames = localStorage.getItem("interfaceBoardColumnsNames") + if( !_interfaceBoardColumnsNames || _interfaceBoardColumnsNames == 'undefined' || _interfaceBoardColumnsNames == 'null'){ + getInterfaceBoard().then(result => { + // todo-new:columnsApiNamesZh配置的地址补全(evel) + localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); + setTimeout(()=>{ + next() + },0) + }) + }else{ + next() + } + } + + + // determine whether the user has logged in + + // todo-new:如果token接口恢复做处理 + const hasToken = getToken() + // else if (hasToken) { + // // if(from.path != '/login'){ + // // let _interfaceBoardColumnsNames = localStorage.getItem("interfaceBoardColumnsNames") + // // if(!_interfaceBoardColumnsNames){ + // // // next({ + // // // path: '/' + // // // }) + // // // NProgress.done() + // // } + // // } + // if (to.path === '/login') { + // // if is logged in, redirect to the home page + // next({ + // path: '/' + // }) + // NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939 + // } else { + // // determine whether the user has obtained his permission roles through getInfo + // const hasRoles =await store.getters.roles && await store.getters.roles.length > 0 + // if (hasRoles) { + // next() + // } else { + // try { + // // get user info + // // note: roles must be a object array! such as: ['admin'] or ,['developer','editor'] + + // const { + // roles + // } = await store.dispatch('user/getInfo') + // // generate accessible routes map based on roles + + // // const accessRoutes = await store.dispatch('permission/generateRoutes', localStorage.getItem('userId')) + // // router.addRoutes(accessRoutes) + + // // 原码 防止刷新出现空白页(系统暂无出现所以注释) + // // const accessRoutes = await store.dispatch('permission/generateRoutes', roles) + // // router.addRoutes(accessRoutes) + + // // hack method to ensure that addRoutes is complete + // // set the replace: true, so the navigation will not leave a history record + // next({ + // ...to, + // replace: true + // }) + // } catch (error) { + // // remove token and go to login page to re-login + // await store.dispatch('user/resetToken') + // Message.error(error || 'Has Error') + // next(`/login?redirect=${to.path}`) + // NProgress.done() + // } + // } + // } + // } else { + // /* has no token*/ + + // if (whiteList.indexOf(to.path) !== -1) { + // // in the free login whitelist, go directly + // next() + // } else { + // // other pages that do not have permission to access are redirected to the login page. + // next(`/login?redirect=${to.path}`) + // NProgress.done() + // } + // } +}) + +router.afterEach(() => { + // element-ui 使用 Tooltip 提示时候,更换页面,提示依旧存在偶现bug处理。 + const mytooltipList = document.querySelectorAll('.el-tooltip__popper') // 获取页面所有tooltip的dom集合 + setTimeout(() => { + mytooltipList.forEach((value) => { + value.style.display = 'none' + if(value.parentElement){ + value.parentElement.removeChild(value) + } + }) + }, 1000) + // finish progress bar + NProgress.done() +}) diff --git a/Code/Fe/src/permission.js b/Code/Fe/src/permission.js index fc99b88..57ff2dc 100644 --- a/Code/Fe/src/permission.js +++ b/Code/Fe/src/permission.js @@ -43,58 +43,100 @@ router.beforeEach(async (to, from, next) => { // 是否有用户信息: // 1、如果没有判断是否为自动登录(是自动登录则自动执行登录,账号密码为配置信息中的值,不是自动登录则跳到登录页) // 2、如果有用户信息:则检查是否有api接口的表头数据,没有的话重新获取 - if(!userInfo){ - if(isAutoLogin || to.query.loginName){ - // let loginForm= { - // userNameOrEmailAddress:localStorage.getItem("userNameOrEmailAddress"), - // password:localStorage.getItem("client_secret"), - // // rememberMe:true, - // // grant_type: 'password', - // // client_id: 'Auth_App', - // } - // store.dispatch('user/login', loginForm).then(() => { - // login(loginForm).then(()=>{ - getUsersByUserName(localStorage.getItem("userNameOrEmailAddress")).then(res=>{ - // todo:currentUserInfo全程需要优化 - localStorage.setItem("currentUserInfo", JSON.stringify(res)); - }) - .catch(err => { - console.log('获取用户信息失败,请重试') - }) - // 提前获取接口监控看板表头数据并存储 - getInterfaceBoard().then(result => { - localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); - next('/') - }) - .catch(err => { - console.log('获取表头失败,请重试') - }) - // }) - // .catch((error) => { - // console.log('登录失败') - // }) + if(userInfo){ + if(store.getters.permission_routes && store.getters.permission_routes.length > 0){ + next() }else{ - if (to.path != '/login') { - next('/login') - }else{ - next() - } - NProgress.done() + const accessRoutes = await store.dispatch('permission/getApiColumnsNames') + console.log(accessRoutes) + router.addRoutes(accessRoutes) + next({ + ...to, + replace: true + }) } + // next({ + // ...to, + // replace: true + // }) + // if(menuList){ + // next() + // }else{ + // const accessRoutes = await store.dispatch('permission/getApiColumnsNames') + // router.addRoutes(accessRoutes) + // next() + // } + // if(store.getters.permission_routes && store.getters.permission_routes.length > 0){ + // next() + // }else{ + // // const accessRoutes = await store.dispatch('permission/getApiColumnsNames') + // // router.addRoutes(accessRoutes) + // next() + // } + // if(isAutoLogin || to.query.loginName){ + // // let loginForm= { + // // userNameOrEmailAddress:localStorage.getItem("userNameOrEmailAddress"), + // // password:localStorage.getItem("client_secret"), + // // // rememberMe:true, + // // // grant_type: 'password', + // // // client_id: 'Auth_App', + // // } + // // // store.dispatch('user/login', loginForm).then(() => { + // // login(loginForm).then(()=>{ + // let _username = to.query.loginName ? to.query.loginName : localStorage.getItem("userNameOrEmailAddress") + // getUsersByUserName(_username).then(res=>{ + // // todo:currentUserInfo全程需要优化 + // localStorage.setItem("currentUserInfo", JSON.stringify(res)); + // }) + // .catch(err => { + // console.log('获取用户信息失败,请重试') + // }) + // // 提前获取接口监控看板表头数据并存储 + // getInterfaceBoard().then(result => { + // localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); + // next('/') + // }) + // .catch(err => { + // console.log('获取表头失败,请重试') + // }) + // // }) + // // .catch((error) => { + // // console.log('登录失败') + // // }) + // } + // else{ + // if (to.path != '/login') { + // next('/login') + // }else{ + // next() + // } + // NProgress.done() + // } }else{ - // 重新获取api接口表头 - const _interfaceBoardColumnsNames = localStorage.getItem("interfaceBoardColumnsNames") - if( !_interfaceBoardColumnsNames || _interfaceBoardColumnsNames == 'undefined' || _interfaceBoardColumnsNames == 'null'){ - getInterfaceBoard().then(result => { - // todo-new:columnsApiNamesZh配置的地址补全(evel) - localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); - setTimeout(()=>{ - next() - },0) - }) - }else{ + if(to.path == '/login'){ next() + }else{ + next('/login') } + // if (to.path != '/login') { + // next('/login') + // }else{ + // next() + // } + NProgress.done() + // 重新获取api接口表头 + // const _interfaceBoardColumnsNames = localStorage.getItem("interfaceBoardColumnsNames") + // if( !_interfaceBoardColumnsNames || _interfaceBoardColumnsNames == 'undefined' || _interfaceBoardColumnsNames == 'null'){ + // getInterfaceBoard().then(result => { + // // todo-new:columnsApiNamesZh配置的地址补全(evel) + // localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); + // setTimeout(()=>{ + // next() + // },0) + // }) + // }else{ + // next() + // } } diff --git a/Code/Fe/src/router/index-0718.js b/Code/Fe/src/router/index-0718.js new file mode 100644 index 0000000..789cb70 --- /dev/null +++ b/Code/Fe/src/router/index-0718.js @@ -0,0 +1,193 @@ +import Vue from 'vue' +import Router from 'vue-router' + + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/* Router Modules */ +import baseConfig from './modules/baseConfig' +import interfaceBoardRouter from './modules/interfaceBoard' +import systemManage from './modules/systemManage' + +/** + * Note: sub-menu only appear when route children.length >= 1 + * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html + * + * hidden: true if set true, item will not show in the sidebar(default is false) + * alwaysShow: true if set true, will always show the root menu + * if not set alwaysShow, when item has more than one children route, + * it will becomes nested mode, otherwise not show the root menu + * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb + * name:'router-name' the name is used by (must set!!!) + * meta : { + roles: ['admin','editor'] control the page roles (you can set multiple roles) + title: 'title' the name show in sidebar and breadcrumb (recommend set) + icon: 'svg-name'/'el-icon-x' the icon show in the sidebar + noCache: true if set true, the page will no be cached(default is false) + affix: true if set true, the tag will affix in the tags-view + breadcrumb: false if set false, the item will hidden in breadcrumb(default is true) + activeMenu: '/example/list' if set path, the sidebar will highlight the path you set + } + */ + +/** + * constantRoutes + * a base page that does not have permission requirements + * all roles can be accessed + */ +export let constantRoutes = [ + { + path: '/redirect', + component: Layout, + hidden: true, + children: [{ + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect/index') + }] + }, + { + path: '/login', + component: () => import('@/views/login/index'), + hidden: true + }, + { + path: '/404', + component: () => import('@/views/error-page/404'), + hidden: true + }, + { + path: '/401', + component: () => import('@/views/error-page/401'), + hidden: true + }, + { + path: '/profileuser', + component: Layout, + redirect: '/profileuser/index', + hidden: true, + children: [{ + path: 'index', + component: () => import('@/views/profileuser/index'), + name: 'Profileuser', + meta: { + title: '个人中心', + icon: 'user', + noCache: true + } + }] + }, + { + path: '/', + component: Layout, + redirect: '/dashboard', + // hidden: true, + children: [{ + path: 'dashboard', + component: () => import('@/views/dashboard/index'), + name: 'Dashboard', + meta: { + keepAlive : true, + title: '系统首页', + icon: '系统首页', + outerFirst:true + // affix: true + } + }] + }, + // 系统 + // { + // path: '/systemManage', + // component: Layout, + // redirect: 'noRedirect', + // meta: { + // title: '系统权限管理11111', + // icon: '系统权限控制', + // roles:'skip' + // }, + // children: [{ + // path: 'UserManage', + // name: 'userManage', + // component: () => import('@/views/systemManage/userManage'), + // meta: { + // title: '用户信息维护', + // icon: '用户', + // roles: 'AbpIdentity.Users' + // } + // }, + // { + // path: 'RoleManage', + // name: 'roleManage', + // component: () => import('@/views/systemManage/roleManage'), + // meta: { + // title: 'PC权限信息维护', + // icon: '权限控制', + // roles: 'AbpIdentity.Roles' + // } + // }, + // { + // path: 'pcMenu', + // name: 'pcMenu', + // // hidden: true, + // component: () => import('@/views/systemManage/pcMenu'), + // meta: { + // title: 'PC权限菜单', + // icon: 'PDA权限菜单', + // roles: 'Auth.Menu' + // } + // }, + // { + // path: 'UserWorkGroup', + // name: 'UserWorkGroup', + // // hidden: true, + // component: () => import('@/views/systemManage/userWorkGroup'), + // meta: { + // title: '用户工作组对应关系', + // icon: '用户工作组对应关系', + // roles: 'Auth.UserWorkGroup' + // } + // }, + // ] + // } +] + +/** + * asyncRoutes + * the routes that need to be dynamically loaded based on user roles + */ +// 动态获取菜单信息 +export let asyncRoutes = [ + /** when your routing map is too long, you can split it into small modules **/ + // 404 page must be placed at the end !!! + baseConfig, + interfaceBoardRouter, + systemManage, + { + path: '*', + redirect: '/404', + hidden: true + } +] + +const createRouter = () => new Router({ + // mode: 'history', // require service support + scrollBehavior: () => ({ + y: 0 + }), + // todo-new:有token后使用去掉下一行代码 + routes: constantRoutes.concat(asyncRoutes) + // todo-new:有token后使打开下方代码,并检查是否有效 + // routes: constantRoutes +}) + +const router = createRouter() + +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 +export function resetRouter() { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + +export default router diff --git a/Code/Fe/src/router/index.js b/Code/Fe/src/router/index.js index 789cb70..0a35e17 100644 --- a/Code/Fe/src/router/index.js +++ b/Code/Fe/src/router/index.js @@ -97,61 +97,8 @@ export let constantRoutes = [ } }] }, - // 系统 - // { - // path: '/systemManage', - // component: Layout, - // redirect: 'noRedirect', - // meta: { - // title: '系统权限管理11111', - // icon: '系统权限控制', - // roles:'skip' - // }, - // children: [{ - // path: 'UserManage', - // name: 'userManage', - // component: () => import('@/views/systemManage/userManage'), - // meta: { - // title: '用户信息维护', - // icon: '用户', - // roles: 'AbpIdentity.Users' - // } - // }, - // { - // path: 'RoleManage', - // name: 'roleManage', - // component: () => import('@/views/systemManage/roleManage'), - // meta: { - // title: 'PC权限信息维护', - // icon: '权限控制', - // roles: 'AbpIdentity.Roles' - // } - // }, - // { - // path: 'pcMenu', - // name: 'pcMenu', - // // hidden: true, - // component: () => import('@/views/systemManage/pcMenu'), - // meta: { - // title: 'PC权限菜单', - // icon: 'PDA权限菜单', - // roles: 'Auth.Menu' - // } - // }, - // { - // path: 'UserWorkGroup', - // name: 'UserWorkGroup', - // // hidden: true, - // component: () => import('@/views/systemManage/userWorkGroup'), - // meta: { - // title: '用户工作组对应关系', - // icon: '用户工作组对应关系', - // roles: 'Auth.UserWorkGroup' - // } - // }, - // ] - // } ] +console.log(11111) /** * asyncRoutes @@ -161,14 +108,14 @@ export let constantRoutes = [ export let asyncRoutes = [ /** when your routing map is too long, you can split it into small modules **/ // 404 page must be placed at the end !!! - baseConfig, - interfaceBoardRouter, - systemManage, - { - path: '*', - redirect: '/404', - hidden: true - } + // baseConfig, + // interfaceBoardRouter, + // systemManage, + // { + // path: '*', + // redirect: '/404', + // hidden: true + // } ] const createRouter = () => new Router({ diff --git a/Code/Fe/src/store/modules/permission-0718.js b/Code/Fe/src/store/modules/permission-0718.js new file mode 100644 index 0000000..808cee0 --- /dev/null +++ b/Code/Fe/src/store/modules/permission-0718.js @@ -0,0 +1,163 @@ +import { + asyncRoutes, + constantRoutes +} from '@/router' +import Layout from '@/layout' +import { getWebMenu } from '@/api/wms-auth' +/** + * 静态路由懒加载 + * @param view 格式必须为 xxx/xxx 开头不要加斜杠 + * @returns + */ + export const loadView = (view) => { + return (resolve) => require([`@/views/${view}`], resolve) +} +/** + * 把从后端查询的菜单数据拼装成路由格式的数据 + * @param routes + * @param data 后端返回的菜单数据 + */ +export function generaMenu(routes, data) { + data.forEach(item => { + const menu = { + path: item.code, + component: item.component === '@/layout' ? Layout : loadView(item.component), + // hidden: item.status === 0, // 状态为0的隐藏 + children: [], + name: item.code, + // meta: item.meta + meta: { + title: item.name, + icon: item.icon || '', + roles: item.permission + }, + + } + // 一级菜单 二级菜单 特定属性 + if (item.component == '@/layout' || item.component == 'index') { + menu.alwaysShow = true + menu.redirect = 'noRedirect' + } + if (item.sort < 99) { + menu.level = 1 + } else if (item.sort > 99 && item.sort < 9999) { + menu.level = 2 + } else { + menu.level = 3 + } + // iframe页面处理 + // if (item.permission.indexOf('Report') > -1) { + // // delete menu.component + // menu.iframeComponent = item.component === '@/layout' ? Layout : loadView(item.component) + // menu.hasOpen = false // 是否打开过,默认false + // } + if (item.children && item.children.length > 0) { + generaMenu(menu.children, item.children) + } + // if (item.permission == 'skip' && item.children.length == 0) { + // } + routes.push(menu) + }) + return routes +} + +/** + * Use meta.role to determine if the current user has permission + * @param roles + * @param route + */ +function hasPermission(roles, route) { + if (route.meta && route.meta.roles) { + if (route.meta.roles == "skip") { + return true + } else { + return roles.some(role => route.meta.roles.includes(role)) + } + } else { + return false + } +} +const filterAccessedRoutes = (items,indexVal,childrenIndex) => { + const route = JSON.parse(JSON.stringify(items)) + route.forEach((val, index) => { + // debugger; + if(val.meta && val.meta.roles == "skip"){ + if (val.children && val.children.length != 0) { + filterAccessedRoutes(items[index-indexVal].children,childrenIndex) + } + if(items[index-indexVal].children && items[index-indexVal].children.length == 0){ + items.splice(index-indexVal, 1) + indexVal++ + } + } + }) + indexVal = 0 +} +/** + * Filter asynchronous routing tables by recursion + * @param routes asyncRoutes + * @param roles + */ +export function filterAsyncRoutes(routes, roles) { + const res = [] + routes.forEach(route => { + const tmp = { + ...route + } + if (hasPermission(roles, tmp)) { + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, roles) + } + res.push(tmp) + } + }) + return res +} + +const state = { + routes: [], + addRoutes: [] +} + +const mutations = { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + } +} +// todo-new:有token后使用generateRoutes,去掉下方一行代码 +state.routes = constantRoutes.concat(asyncRoutes) + +const actions = { + generateRoutes({ + commit + }, userId) { + return new Promise(resolve => { + // let accessedRoutes = asyncRoutes + // // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) + // let indexVal = 0 + // let childrenIndex = 0 + // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) + // commit('SET_ROUTES', accessedRoutes) + // resolve(accessedRoutes) + // todo-new:动态路由(等token接口恢复后处理) + getWebMenu({userId: userId}).then(res => { + let accessedRoutes = generaMenu(asyncRoutes, res) + let indexVal = 0 + let childrenIndex = 0 + filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) + commit('SET_ROUTES', accessedRoutes) + resolve(accessedRoutes) + }).catch(err => { + console.log(err) + }) + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/Code/Fe/src/store/modules/permission.js b/Code/Fe/src/store/modules/permission.js index 808cee0..90ca6f5 100644 --- a/Code/Fe/src/store/modules/permission.js +++ b/Code/Fe/src/store/modules/permission.js @@ -4,62 +4,7 @@ import { } from '@/router' import Layout from '@/layout' import { getWebMenu } from '@/api/wms-auth' -/** - * 静态路由懒加载 - * @param view 格式必须为 xxx/xxx 开头不要加斜杠 - * @returns - */ - export const loadView = (view) => { - return (resolve) => require([`@/views/${view}`], resolve) -} -/** - * 把从后端查询的菜单数据拼装成路由格式的数据 - * @param routes - * @param data 后端返回的菜单数据 - */ -export function generaMenu(routes, data) { - data.forEach(item => { - const menu = { - path: item.code, - component: item.component === '@/layout' ? Layout : loadView(item.component), - // hidden: item.status === 0, // 状态为0的隐藏 - children: [], - name: item.code, - // meta: item.meta - meta: { - title: item.name, - icon: item.icon || '', - roles: item.permission - }, - - } - // 一级菜单 二级菜单 特定属性 - if (item.component == '@/layout' || item.component == 'index') { - menu.alwaysShow = true - menu.redirect = 'noRedirect' - } - if (item.sort < 99) { - menu.level = 1 - } else if (item.sort > 99 && item.sort < 9999) { - menu.level = 2 - } else { - menu.level = 3 - } - // iframe页面处理 - // if (item.permission.indexOf('Report') > -1) { - // // delete menu.component - // menu.iframeComponent = item.component === '@/layout' ? Layout : loadView(item.component) - // menu.hasOpen = false // 是否打开过,默认false - // } - if (item.children && item.children.length > 0) { - generaMenu(menu.children, item.children) - } - // if (item.permission == 'skip' && item.children.length == 0) { - // } - routes.push(menu) - }) - return routes -} +import { getDefinitionMenu } from '@/api/wms-interface' /** * Use meta.role to determine if the current user has permission @@ -126,33 +71,208 @@ const mutations = { } } // todo-new:有token后使用generateRoutes,去掉下方一行代码 -state.routes = constantRoutes.concat(asyncRoutes) +// state.routes = constantRoutes.concat(asyncRoutes) +/** + * 静态路由懒加载 + * @param view 格式必须为 xxx/xxx 开头不要加斜杠 + * @returns + */ + export const loadView = (view) => { + return (resolve) => require([`@/views/menuList/${view}`], resolve) +} +/** + * 把从后端查询的菜单数据拼装成路由格式的数据 + * @param routes + * @param data 后端返回的菜单数据 + */ +export function generaMenu(routes, data, first) { + data.forEach(item => { + let _item = { + path: '/'+item.name, + component: loadView(item.name), + // hidden: item.status === 0, // 状态为0的隐藏 + name: item.name, + // meta: item.meta + meta: { + title: item.title, + icon: item.icon || '', + roles: item.permission, + outerFirst:first + }, + } + let menu = _item + if(first && item.component == '@/layout'){ + menu = { + path: '/', + component: Layout, + redirect: '/' + item.name, + children: [], + } + menu.children = [] + menu.children.push(_item) + } + // 一级菜单 二级菜单 特定属性 + // if (item.component == '@/layout' || item.component == 'index') { + // menu.alwaysShow = true + // menu.redirect = 'noRedirect' + // } + // if (item.sort < 99) { + // menu.level = 1 + // } else if (item.sort > 99 && item.sort < 9999) { + // menu.level = 2 + // } else { + // menu.level = 3 + // } + // iframe页面处理 + // if (item.permission.indexOf('Report') > -1) { + // // delete menu.component + // menu.iframeComponent = item.component === '@/layout' ? Layout : loadView(item.component) + // menu.hasOpen = false // 是否打开过,默认false + // } + if (item.children && item.children.length > 0) { + generaMenu(menu.children, item.children) + } + // if (item.permission == 'skip' && item.children.length == 0) { + // } + routes.push(menu) + }) + return routes +} +// todo:接口返回的层级菜单,与查重后最终显示的菜单数组做查重及组合处理 +export function initTreeMenusHandle(tree, list,zh,first) { + let _res = [] + tree.forEach(item=>{ + if(list.indexOf(item.name) >= 0){ + item.title = zh[item.name] || item.name + if(first)item.component = '@/layout' + if (item.children && item.children.length > 0) { + item.children = initTreeMenusHandle(item.children,list,zh) + } + _res.push(item) + } + }) + return _res +} const actions = { - generateRoutes({ + getApiColumnsNames({ commit }, userId) { return new Promise(resolve => { - // let accessedRoutes = asyncRoutes - // // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) + let accessedRoutes = asyncRoutes + // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) // let indexVal = 0 // let childrenIndex = 0 // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) // commit('SET_ROUTES', accessedRoutes) // resolve(accessedRoutes) - // todo-new:动态路由(等token接口恢复后处理) - getWebMenu({userId: userId}).then(res => { - let accessedRoutes = generaMenu(asyncRoutes, res) - let indexVal = 0 - let childrenIndex = 0 - filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) + getDefinitionMenu(true).then(res => { + let _allConfig = res.auth.grantedPolicies;//所有配置 + let _zh = res.localization.values[localStorage.getItem('columnsApiNamesZh')]; + localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(_zh)); + let _menuList = []//接口获取所有的菜单 + for(let item in _allConfig){ + let point_number = item.split('.').length - 1 + // 只选择配置项中的数据 + if(point_number == 1 && item.substring(0,item.indexOf('.')) == localStorage.getItem('columnsApiNamesZh')){ + _menuList.push(item.substring(item.indexOf('.') + 1,item.length)) + } + } + let _noShowMenus = ['Z.AsnDet']//不显示的菜单 + // 去掉不显示的菜单后全部显示的菜单 + let _showMenus = _menuList.filter(item1 => !_noShowMenus.some(item2 => item2 === item1)) + // 数据模拟,todo:接口获取 + let _treeMenusAll = [ + {name:"aaaaaaa"}, + {name:"ExportCustomUserSetting" + // ,children:[ + // {name:'OutgoingDataHistory',children:[ + // {name:'IncomingData',children:[ + // {name:'OutgoingDataHistory'}, + // {name:'IncomingData'}, + // {name:'333333'}, + // ]}, + // {name:'eee1111-bbb',children:[ + // {name:'ExportCustomUserSetting'}, + // {name:'MessageReceive'}, + // ]}, + // ]}, + // {name:'eee222'}, + // {name:'eee333'}, + // {name:'eee444'}, + // {name:'eee555'}, + // ] + }, + {name:"OutgoingDataHistory"}, + {name:"IncomingData"}, + {name:"IncomingDataHistory"}, + {name:"MesProductL7PartsNote"}, + {name:"MessageReceive"}, + {name:"OutgoingData"}, + {name:"AsnDet"}, + {name:"AsnMstr"}, + {name:"Bom"}, + {name:"CustPart"}, + {name:"Cust"}, + {name:"Inventory"}, + {name:"Loc"}, + {name:"Part"}, + {name:"PoDet"}, + {name:"PoMstr"}, + {name:"PrhHist"}, + {name:"ProdLine"}, + {name:"ReceiptDet"}, + {name:"ReceiptMstr"}, + {name:"ReturnDet"}, + {name:"ReturnMstr"}, + {name:"SodDet"}, + {name:"VendPart"}, + {name:"Vend"}, + ] + + let _initTreeMenus = [] + if(_treeMenusAll && _treeMenusAll.length > 0){ + _initTreeMenus = initTreeMenusHandle(_treeMenusAll,_showMenus,_zh,true) + }else{ + _initTreeMenus = _showMenus + } + // 最后查重+层级查重后的菜单 + let _initEndMenus = generaMenu(asyncRoutes, _initTreeMenus,true) + let accessedRoutes = _initEndMenus + // let indexVal = 0 + // let childrenIndex = 0 + // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) commit('SET_ROUTES', accessedRoutes) resolve(accessedRoutes) }).catch(err => { console.log(err) }) }) - } + }, + // generateRoutes({ + // commit + // }, userId) { + // return new Promise(resolve => { + // // let accessedRoutes = asyncRoutes + // // // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) + // // let indexVal = 0 + // // let childrenIndex = 0 + // // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) + // // commit('SET_ROUTES', accessedRoutes) + // // resolve(accessedRoutes) + // // todo-new:动态路由(等token接口恢复后处理) + // getWebMenu({userId: userId}).then(res => { + // let accessedRoutes = generaMenu(asyncRoutes, res) + // let indexVal = 0 + // let childrenIndex = 0 + // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) + // commit('SET_ROUTES', accessedRoutes) + // resolve(accessedRoutes) + // }).catch(err => { + // console.log(err) + // }) + // }) + // } } export default { @@ -160,4 +280,4 @@ export default { state, mutations, actions -} +} \ No newline at end of file diff --git a/Code/Fe/src/views/dashboard/index.vue b/Code/Fe/src/views/dashboard/index.vue index 2f72066..dab6cc1 100644 --- a/Code/Fe/src/views/dashboard/index.vue +++ b/Code/Fe/src/views/dashboard/index.vue @@ -7,7 +7,7 @@ v-for="(item,index) in navList" :key="index" > -
+
{{item.meta.title}}
diff --git a/Code/Fe/src/views/login/index.vue b/Code/Fe/src/views/login/index.vue index 2db65e4..5f2297f 100644 --- a/Code/Fe/src/views/login/index.vue +++ b/Code/Fe/src/views/login/index.vue @@ -165,9 +165,17 @@ export default { handleLogin () { this.$refs.loginForm.validate(valid => { if (valid) { + // todo-new:自动登录跳转处理(读取localStorage.getItem("userNameOrEmailAddress")) + getUsersByUserName(this.loginForm.username).then(res=>{ + // store.dispatch('user/setName',res) + localStorage.setItem("currentUserInfo", JSON.stringify(res)); + this.$router.push({ path: '/'}) + }) + return this.loading = true this.loginForm.userNameOrEmailAddress = this.loginForm.username // todo-new:与permission文件的登录统一封装 + let _zh = localStorage.getItem('columnsApiNamesZh') login(this.loginForm).then(()=>{ // this.$store.dispatch('user/login', this.loginForm).then(() => { // 提前获取接口监控看板表头数据并存储 @@ -176,7 +184,7 @@ export default { localStorage.setItem("currentUserInfo", JSON.stringify(res)); }) getInterfaceBoard().then(result => { - localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.localization.values.Winin)); + localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts)); this.$router.push({ path: '/'}) this.loading = false })