diff --git a/package.json b/package.json index e5eb402f6610ab299a4e05b7dc5e856cded9d76a..236586238fdfae6f42ec3025c32f9e3fd0555bcd 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "vue": "2.5.2", "vue-axios": "^2.0.2", "vue-image-crop-upload": "^2.2.3", + "vue-moment": "^3.2.0", "vue-router": "^3.0.0", "vue-server-renderer": "2.5.2", "vue-template-compiler": "2.5.2", diff --git a/src/api/login.js b/src/api/login.js index 746c7e325fd0d448b6611bd20b616b0ede520183..342420b4edc23f74c3da36b859fe9d35eeabf392 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -3,16 +3,16 @@ import request from '@/router/axios' import { userInfo, tableData } from '@/mock/user' import { menu, menuAll } from '@/mock/menu' export const loginByUsername = (username, password, code, randomStr) => { - var grant_type = 'password' - var scope = 'server' - return request({ - url: '/auth/oauth/token', - headers: { - 'Authorization': 'Basic cGlnOnBpZw==' - }, - method: 'post', - params: { username, password, randomStr, code, grant_type, scope } - }) + var grant_type = 'password' + var scope = 'server' + return request({ + url: '/auth/oauth/token', + headers: { + 'Authorization': 'Basic cGlnOnBpZw==' + }, + method: 'post', + params: { username, password, randomStr, code, grant_type, scope } + }) } export function mobileLogin(mobile, code) { @@ -29,19 +29,16 @@ export function mobileLogin(mobile, code) { } export const getUserInfo = () => { - return request({ - url: '/admin/user/info', - method: 'get' - }) + return request({ + url: '/admin/user/info', + method: 'get' + }) } export const logout = (accesstoken, refreshToken) => { - return request({ - url: '/auth/authentication/removeToken', - method: 'post', - params: { accesstoken, refreshToken } - }) + return request({ + url: '/auth/authentication/removeToken', + method: 'post', + params: { accesstoken, refreshToken } + }) } - - - diff --git a/src/api/menu.js b/src/api/menu.js index 4758600e32f94d1b330733c82d0780c925347be4..086f8c8b8e2011eb7d97765edf4ec893932eee1a 100644 --- a/src/api/menu.js +++ b/src/api/menu.js @@ -1,58 +1,58 @@ import request from '@/router/axios' export function GetMenu() { - return request({ - url: '/admin/menu/userMenu', - method: 'get' - }) + return request({ + url: '/admin/menu/userMenu', + method: 'get' + }) } export function fetchTree(query) { - return request({ - url: '/admin/menu/allTree', - method: 'get', - params: query - }) + return request({ + url: '/admin/menu/allTree', + method: 'get', + params: query + }) } export function fetchAll() { - return request({ - url: '/admin/menu/navMenu', - method: 'get' - }) + return request({ + url: '/admin/menu/navMenu', + method: 'get' + }) } export function fetchUserTree() { - return request({ - url: '/admin/menu/userTree', - method: 'get' - }) + return request({ + url: '/admin/menu/userTree', + method: 'get' + }) } export function addObj(obj) { - return request({ - url: '/admin/menu/', - method: 'post', - data: obj - }) + return request({ + url: '/admin/menu/', + method: 'post', + data: obj + }) } export function getObj(id) { - return request({ - url: '/admin/menu/' + id, - method: 'get' - }) + return request({ + url: '/admin/menu/' + id, + method: 'get' + }) } export function delObj(id) { - return request({ - url: '/admin/menu/' + id, - method: 'delete' - }) + return request({ + url: '/admin/menu/' + id, + method: 'delete' + }) } export function putObj(obj) { - return request({ - url: '/admin/menu/', - method: 'put', - data: obj - }) + return request({ + url: '/admin/menu/', + method: 'put', + data: obj + }) } diff --git a/src/components/iframe/main.vue b/src/components/iframe/main.vue index f63a6a153a7cfd45c2c48822c521bddfaed7f20c..93bdc5f0afc4e2c9a57ee563168d5229efbc09c1 100644 --- a/src/components/iframe/main.vue +++ b/src/components/iframe/main.vue @@ -72,6 +72,9 @@ export default { //iframe窗口初始化 iframeInit() { const iframe = this.$refs.iframe; + if (!iframe) { + return + } const clientHeight = document.documentElement.clientHeight - 120; iframe.style.height = `${clientHeight}px`; if (iframe.attachEvent) { diff --git a/src/main.js b/src/main.js index d697b6f2bf47103ba1e5070ca4842a48af5da056..1f6b0369be1d5897d81db2f205e9c1736c435614 100644 --- a/src/main.js +++ b/src/main.js @@ -1,39 +1,46 @@ -import Vue from 'vue'; -import axios from './router/axios'; -import VueAxios from 'vue-axios'; -import App from './App'; +import Vue from 'vue' +import VueAxios from 'vue-axios' +import ElementUI from 'element-ui' +import VueMoment from 'vue-moment' +import axios from './router/axios' import './permission' // 权限 import './errorLog' // 错误日志 -import router from './router/router'; -import store from './store'; -import ELEMENT from 'element-ui'; -import AVUE from 'avue-cli/packages/index.js'; -import { - loadStyle -} from './util/util' -import * as urls from '@/config/env'; +import router from './router/router' +import store from './store' +import AVUE from 'avue-cli/packages/index.js' +import { loadStyle } from './util/util' +import * as urls from '@/config/env' import { iconfontUrl, iconfontVersion -} from '@/config/env'; +} from '@/config/env' import * as filters from './filters' // 全局filter -import './styles/common.scss'; +import './styles/common.scss' + +Vue.config.productionTip = false +Vue.use(ElementUI) +Vue.use(VueMoment) Vue.use(VueAxios, axios) Object.keys(urls).forEach(key => { - Vue.prototype[key] = urls[key]; + Vue.prototype[key] = urls[key] }) Object.keys(filters).forEach(key => { Vue.filter(key, filters[key]) }) + iconfontVersion.forEach(ele => { - loadStyle(iconfontUrl.replace('$key', ele)); + loadStyle(iconfontUrl.replace('$key', ele)) }) - -Vue.config.productionTip = false; - +// 默认加载根路径下的所有vue +const name = 'App.vue' +const App = (resolve) => { + require.ensure([], (require) => { + resolve(require.context('.', false, /\.vue$/)(`./${name}`)) + }, 'app') +} export function createApp() { const app = new Vue({ diff --git a/src/page/index/sidebar/index.vue b/src/page/index/sidebar/index.vue index c02138a5c78e05ec626d8dc2876511c0d9df6e8e..2f427a9bd25db4db2dad942e4923bb0f57deec36 100644 --- a/src/page/index/sidebar/index.vue +++ b/src/page/index/sidebar/index.vue @@ -13,6 +13,7 @@ import { setUrlPath } from "@/util/util"; import { mapGetters } from "vuex"; import SidebarItem from "./sidebarItem"; import logo from "./logo"; +import { initMenu } from '@/util/util' export default { name: "sidebar", components: { SidebarItem, logo }, @@ -20,7 +21,12 @@ export default { return {}; }, created() { - this.$store.dispatch("GetMenu").then(data => {}); + if (! this.$store.state.user.isInitMenu) { + this.$store.dispatch("GetMenu").then((data) => { + initMenu(this.$router, data) + this.$store.commit('IS_INIT_MENU', true) + }); + } }, computed: { ...mapGetters(["menu", "tag", "isCollapse"]), diff --git a/src/permission.js b/src/permission.js index 4744e9bd922a01a83d6ded3a2df82d526d37fb8b..382deb11d85021d40d5454d9bb63ed9a05efc016 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,108 +1,121 @@ import router from './router/router' import store from './store' import NProgress from 'nprogress' // progress bar -import 'nprogress/nprogress.css'// progress bar style +import 'nprogress/nprogress.css' // progress bar style import { getToken } from '@/util/auth' -import { setTitle } from '@/util/util'; -import { validatenull } from '@/util/validate'; -import { asyncRouterMap } from '@/router/router' -NProgress.configure({ showSpinner: false })// NProgress Configuration +import { setTitle } from '@/util/util' +import { validatenull } from '@/util/validate' + +// NProgress Configuration +NProgress.configure({ + showSpinner: false +}) + function hasPermission(roles, permissionRoles) { - if (!permissionRoles) return true - return roles.some(role => permissionRoles.indexOf(role) >= 0) + if (!permissionRoles) return true + return roles.some(role => permissionRoles.indexOf(role) >= 0) } const whiteList = ['/login', '/404', '/401', '/lock'] const lockPage = '/lock' -router.addRoutes(asyncRouterMap); // 动态添加可访问路由表 + router.beforeEach((to, from, next) => { - NProgress.start() // start progress bar - const value = to.query.src ? to.query.src : to.path; - const label = to.query.name ? to.query.name : to.name; - if (whiteList.indexOf(value) == -1) { - store.commit('ADD_TAG', { - label: label, - value: value, - query: to.query - }); + // start progress bar + NProgress.start() + const value = to.query.src ? to.query.src : to.path + const label = to.query.name ? to.query.name : to.name + if (whiteList.indexOf(value) === -1) { + store.commit('ADD_TAG', { + label: label, + value: value, + query: to.query + }) + } + if (store.getters.access_token) { // determine if there has token + /* has token*/ + if (store.getters.isLock && to.path !== lockPage) { + next({ + path: lockPage + }) + NProgress.done() + } else if (to.path === '/login') { + next({ + path: '/' + }) + NProgress.done() + } else { + if (store.getters.roles.length === 0) { + store.dispatch('GetUserInfo').then(res => { + const roles = res.roles + next({ ...to, + replace: true + }) + }).catch(() => { + store.dispatch('FedLogOut').then(() => { + next({ + path: '/login' + }) + NProgress.done() + }) + }) + } else { + next() + } } - if (store.getters.access_token) { // determine if there has token - /* has token*/ - if (store.getters.isLock && to.path != lockPage) { - next({ path: lockPage }) - NProgress.done(); - } else if (to.path === '/login') { - next({ path: '/' }) - NProgress.done(); - } else { - if (store.getters.roles.length === 0) { - store.dispatch('GetUserInfo').then(res => { - const roles = res.roles - next({ ...to, replace: true }) - }).catch(() => { - store.dispatch('FedLogOut').then(() => { - next({ path: '/login' }) - NProgress.done(); - }) - }) - } else { - next() - } - } + } else { + /* has no token*/ + if (whiteList.indexOf(to.path) !== -1) { + next() } else { - /* has no token*/ - if (whiteList.indexOf(to.path) !== -1) { - next() - } else { - next('/login') - NProgress.done(); - } + next('/login') + NProgress.done() } + } }) -//寻找子菜单的父类 +// 寻找子菜单的父类 function findMenuParent(tag) { - let tagCurrent = []; - const menu = store.getters.menu; - tagCurrent.push(tag); - return tagCurrent; - // //如果是一级菜单直接返回 - // for (let i = 0, j = menu.length; i < j; i++) { - // if (menu[i].href == tag.value) { - // tagCurrent.push(tag); - // return tagCurrent; - // } - // } - - // let currentPathObj = menu.filter(item => { - // if (item.children.length == 1) { - // return item.children[0].href === tag.value; - // } else { - // let i = 0; - // let childArr = item.children; - // let len = childArr.length; - // while (i < len) { - // if (childArr[i].href === tag.value) { - // return true; - // break; - // } - // i++; - // } - // return false; - // } - // })[0]; - // tagCurrent.push({ - // label: currentPathObj.label, - // value: currentPathObj.href - // }); - // tagCurrent.push(tag); - // return tagCurrent; + let tagCurrent = [] + const menu = store.getters.menu + tagCurrent.push(tag) + return tagCurrent + // //如果是一级菜单直接返回 + // for (let i = 0, j = menu.length; i < j; i++) { + // if (menu[i].href == tag.value) { + // tagCurrent.push(tag); + // return tagCurrent; + // } + // } + // let currentPathObj = menu.filter(item => { + // if (item.children.length == 1) { + // return item.children[0].href === tag.value; + // } else { + // let i = 0; + // let childArr = item.children; + // let len = childArr.length; + // while (i < len) { + // if (childArr[i].href === tag.value) { + // return true; + // break; + // } + // i++; + // } + // return false; + // } + // })[0]; + // tagCurrent.push({ + // label: currentPathObj.label, + // value: currentPathObj.href + // }); + // tagCurrent.push(tag); + // return tagCurrent; } + router.afterEach((to, from) => { - NProgress.done(); - setTimeout(() => { - const tag = store.getters.tag; - setTitle(tag.label); - store.commit('SET_TAG_CURRENT', findMenuParent(tag)); - }, 0); + NProgress.done() + setTimeout(() => { + const tag = store.getters.tag + setTitle(tag.label) + store.commit('SET_TAG_CURRENT', findMenuParent(tag)) + }, 0) }) diff --git a/src/router/_import.js b/src/router/_import.js index e4fc0bef59f63f6e2620fdda7b14a656aca837e1..14bc3dc5a78d5a897f03b936b4e3c686dc1b3137 100644 --- a/src/router/_import.js +++ b/src/router/_import.js @@ -1,4 +1,4 @@ module.exports = (file, path) => { - if (!path) path = 'page' - return require(`../${path}/${file}.vue`) -} \ No newline at end of file + if (!path) path = 'page' + return require(`../${path}/${file}.vue`) +} diff --git a/src/router/axios.js b/src/router/axios.js index 4bc7699ddbd93bf8ea4744eaac2601599a982e97..5ba7cbf189d824f9bcc7d33885325c8f0ac292e4 100644 --- a/src/router/axios.js +++ b/src/router/axios.js @@ -6,44 +6,41 @@ import axios from 'axios' import store from '../store' -import router from '../router/router'; -import { getToken, setToken, removeToken } from '@/util/auth'; +import router from '../router/router' +import { getToken, setToken, removeToken } from '@/util/auth' import { Message } from 'element-ui' import errorCode from '@/const/errorCode' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css'// progress bar style -//超时时间 -axios.defaults.timeout = 30000; -//跨域请求,允许保存cookie -axios.defaults.withCredentials = true; +// 超时时间 +axios.defaults.timeout = 30000 +// 跨域请求,允许保存cookie +axios.defaults.withCredentials = true NProgress.configure({ showSpinner: false })// NProgress Configuration - -let msg; - -//HTTPrequest拦截 +let msg +// HTTPrequest拦截 axios.interceptors.request.use(config => { - NProgress.start() // start progress bar - if (store.getters.access_token) { - config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改 - } - return config + NProgress.start() // start progress bar + if (store.getters.access_token) { + config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改 + } + return config }, error => { - return Promise.reject(error) + return Promise.reject(error) }) -//HTTPresponse拦截 +// HTTPresponse拦截 axios.interceptors.response.use(data => { - NProgress.done(); - return data + NProgress.done() + return data }, error => { - NProgress.done(); - let errMsg = error.toString(); - let code = errMsg.substr(errMsg.indexOf('code') + 5); - Message({ - message: errorCode[code] || errorCode['default'], - type: 'error' - }); - return Promise.reject(new Error(error)); - + NProgress.done() + let errMsg = error.toString() + let code = errMsg.substr(errMsg.indexOf('code') + 5) + Message({ + message: errorCode[code] || errorCode['default'], + type: 'error' + }) + return Promise.reject(new Error(error)) }) export default axios diff --git a/src/router/router.js b/src/router/router.js index 4f60609f34abd62e8680286f43eb55744168f88d..7a4e269393d9e69f266b61f2b793932ca8bcbff9 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -1,49 +1,99 @@ -import Vue from 'vue'; -import VueRouter from 'vue-router'; -import { routerMode } from '@/config/env'; +import Vue from 'vue' +import VueRouter from 'vue-router' +import { routerMode } from '@/config/env' import store from '@/store' - +import { formatRoutes } from '@/util/util' import Layout from '@/page/index/' -import viewRouter from './_router' -const _import = require('./_import'); -Vue.use(VueRouter); -export default new VueRouter({ - // mode: 'history', - strict: process.env.NODE_ENV !== 'production', - scrollBehavior(to, from, savedPosition) { - if (savedPosition) { - return savedPosition - } else { - if (from.meta.keepAlive) { - from.meta.savedPosition = document.body.scrollTop; - } - return { - x: 0, - y: to.meta.savedPosition || 0 - } - } - }, -}); -export const asyncRouterMap = [ - { path: '/login', name: '登录页', component: _import('login/index') }, - { path: '/lock', name: '锁屏页', component: _import('lock/index') }, - { path: '*', redirect: '/404', hidden: true }, - { path: '/404', component: _import('error-page/404', 'components'), name: '404' }, - { path: '/403', component: _import('error-page/403', 'components'), name: '403' }, - { path: '/500', component: _import('error-page/500', 'components'), name: '500' }, - { - path: '/myiframe', - component: Layout, - redirect: '/myiframe', - meta: { keepAlive: true }, - children: [ - { - path: ":routerPath", - name: 'iframe', - component: _import('iframe/main', 'components'), - props: true - } - ] +const _import = require('./_import') - } -].concat(viewRouter) +Vue.use(VueRouter) + +export default new VueRouter({ + // mode: 'history', + strict: process.env.NODE_ENV !== 'production', + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition + } else { + if (from.meta.keepAlive) { + from.meta.savedPosition = document.body.scrollTop + } + return { + x: 0, + y: to.meta.savedPosition || 0 + } + } + }, + routes: [ + { + path: '/', + name: '主页', + redirect: '/wel' + }, { + path: '/wel', + component: Layout, + redirect: '/wel/index', + children: [{ + path: 'index', + name: '首页', + component: _import('wel') + }] + }, { + path: '*', + redirect: '/404', + hidden: true + }, { + path: '/login', + name: '登录页', + component: _import('login/index') + }, { + path: '/lock', + name: '锁屏页', + component: _import('lock/index') + }, { + path: '/crud', + component: Layout, + redirect: '/crud/index', + children: [{ + path: 'index', + name: 'crud实例', + component: _import('crud/index', 'views') + }] + }, { + path: '/info', + component: Layout, + redirect: '/info/index', + children: [{ + path: 'index', + name: '修改信息', + component: _import('admin/user/info', 'views') + }] + }, { + path: '/404', + component: _import('error-page/404', 'components'), + name: '404' + }, { + path: '/403', + component: _import('error-page/403', 'components'), + name: '403' + }, { + path: '/500', + component: _import('error-page/500', 'components'), + name: '500' + }, { + path: '/myiframe', + component: Layout, + redirect: '/myiframe', + meta: { + keepAlive: true + }, + children: [{ + path: ':routerPath', + name: 'iframe', + component: _import('iframe/main', 'components'), + props: true + }] + } + // 防止F5刷新页面,app重新加载,动态新增路由消失 + ].concat(...formatRoutes(store.state.user.menu)) +}) diff --git a/src/store/modules/common.js b/src/store/modules/common.js index bbe6260c91d69b183841ef591ea48c2aa563b502..080fd85f57287274944b7ce166ab09779eb24a71 100644 --- a/src/store/modules/common.js +++ b/src/store/modules/common.js @@ -25,10 +25,10 @@ const common = { }) || '#409EFF', lockPasswd: getStore({ name: 'lockPasswd' - }) || '', + }) || '' }, actions: { - //获取字典公用类 + // 获取字典公用类 GetDic({ commit, state, @@ -37,9 +37,9 @@ const common = { return new Promise((resolve, reject) => { if (dic instanceof Array) { Promise.all(dic.map(ele => getDic(ele))).then(data => { - let result = {}; + const result = {} dic.forEach((ele, index) => { - result[ele] = data[index].data; + result[ele] = data[index].data }) resolve(result) }) @@ -49,13 +49,13 @@ const common = { }, mutations: { SET_COLLAPSE: (state, action) => { - state.isCollapse = !state.isCollapse; + state.isCollapse = !state.isCollapse }, SET_FULLSCREN: (state, action) => { - state.isFullScren = !state.isFullScren; + state.isFullScren = !state.isFullScren }, SET_LOCK: (state, action) => { - state.isLock = true; + state.isLock = true setStore({ name: 'isLock', content: state.isLock, @@ -63,14 +63,14 @@ const common = { }) }, SET_THEME: (state, color) => { - state.theme = color; + state.theme = color setStore({ name: 'theme', - content: state.theme, + content: state.theme }) }, SET_LOCK_PASSWD: (state, lockPasswd) => { - state.lockPasswd = lockPasswd; + state.lockPasswd = lockPasswd setStore({ name: 'lockPasswd', content: state.lockPasswd, @@ -78,15 +78,15 @@ const common = { }) }, CLEAR_LOCK: (state, action) => { - state.isLock = false; - state.lockPasswd = ''; + state.isLock = false + state.lockPasswd = '' removeStore({ name: 'lockPasswd' - }); + }) removeStore({ name: 'isLock' - }); - }, + }) + } } } export default common diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 999f25b1f8941809bf88548a142be62613bd49db..0332300225d6e42d99f44bda8720e2bea7523efe 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -4,133 +4,208 @@ import { validatenull } from '@/util/validate' import { loginByUsername, mobileLogin, getUserInfo, logout } from '@/api/login' import { GetMenu } from '@/api/menu' const user = { - state: { - userInfo: getStore({ name: 'userInfo' }) || {}, - permissions: getStore({ name: 'permissions' }) || {}, - roles: getStore({ name: 'roles' }) || [], - menu: [], - access_token: getStore({ name: 'access_token' }) || '', - refresh_token: getStore({ name: 'refresh_token' }) || '', + state: { + userInfo: getStore({ name: 'userInfo' }) || {}, + permissions: getStore({ name: 'permissions' }) || {}, + roles: getStore({ name: 'roles' }) || [], + menu: getStore({ name: 'menu' }) || [], + isInitMenu: getStore({ name: 'isInitMenu' }) || false, + access_token: getStore({ name: 'access_token' }) || '', + refresh_token: getStore({ name: 'refresh_token' }) || '' + }, + actions: { + // 根据用户名登录 + LoginByUsername({ + commit, + state, + dispatch + }, userInfo) { + return new Promise((resolve, reject) => { + loginByUsername(userInfo.username, userInfo.password, userInfo.code, userInfo.randomStr).then(response => { + const data = response.data + setToken(data.access_token) + commit('SET_ACCESS_TOKEN', data.access_token) + commit('SET_REFRESH_TOKEN', data.refresh_token) + commit('CLEAR_LOCK') + resolve() + }).catch(error => { + reject(error) + }) + }) }, - actions: { - //根据用户名登录 - LoginByUsername({ commit, state, dispatch }, userInfo) { - return new Promise((resolve, reject) => { - loginByUsername(userInfo.username, userInfo.password, userInfo.code, userInfo.randomStr).then(response => { - const data = response.data - setToken(data.access_token) - commit('SET_ACCESS_TOKEN', data.access_token) - commit('SET_REFRESH_TOKEN', data.refresh_token) - commit('CLEAR_LOCK'); - resolve(); - }, error => { - reject(); - }) - }) - }, - //根据手机号登录 - LoginByPhone({ commit, state, dispatch }, userInfo) { - const mobile = userInfo.mobile.trim() - return new Promise((resolve, reject) => { - mobileLogin(mobile, userInfo.code).then(response => { - const data = response.data - setToken(data.access_token) - commit('SET_ACCESS_TOKEN', data.access_token) - commit('SET_REFRESH_TOKEN', data.refresh_token) - commit('CLEAR_LOCK'); - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - GetTableData({ commit, state, dispatch }, page) { - return new Promise((resolve, reject) => { - getTableData(page).then(res => { - const data = res.data; - resolve(data); - }) - }) - }, - GetUserInfo({ commit, state, dispatch }) { - return new Promise((resolve, reject) => { - getUserInfo(state.token).then(response => { - const data = response.data.data - commit('SET_ROLES', data.roles) - commit('SET_USER_INFO', data.sysUser) - commit('SET_PERMISSIONS', data.permissions) - resolve(response) - }).catch(error => { - reject(error) - }) - }) - }, - // 登出 - LogOut({ commit, state }) { - return new Promise((resolve, reject) => { - logout(state.access_token, state.refresh_token).then(() => { - commit('SET_ACCESS_TOKEN', '') - commit('SET_REFRESH_TOKEN', '') - commit('SET_ROLES', []) - commit('DEL_ALL_TAG'); - removeToken() - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - //注销session - FedLogOut({ commit }) { - return new Promise(resolve => { - commit('SET_ACCESS_TOKEN', '') - commit('SET_REFRESH_TOKEN', '') - commit('SET_ROLES', []) - commit('DEL_ALL_TAG'); - removeToken() - resolve() - }) - }, - //获取系统菜单 - GetMenu({ commit }) { - return new Promise(resolve => { - GetMenu().then((res) => { - const data = res.data; - commit('SET_MENU', data); - resolve(data); - }) - }) - }, - + // 根据手机号登录 + LoginByPhone({ + commit, + state, + dispatch + }, userInfo) { + const mobile = userInfo.mobile.trim() + return new Promise((resolve, reject) => { + mobileLogin(mobile, userInfo.code).then(response => { + const data = response.data + setToken(data.access_token) + commit('SET_ACCESS_TOKEN', data.access_token) + commit('SET_REFRESH_TOKEN', data.refresh_token) + commit('CLEAR_LOCK') + resolve() + }).catch(error => { + reject(error) + }) + }) }, - mutations: { - SET_ACCESS_TOKEN: (state, access_token) => { - state.access_token = access_token; - setStore({ name: 'access_token', content: state.access_token, type: 'session' }) - }, - SET_MENU: (state, menu) => { - state.menu = menu; - }, - SET_USER_INFO: (state, userInfo) => { - state.userInfo = userInfo - setStore({ name: 'userInfo', content: state.userInfo, type: 'session' }) - }, - SET_REFRESH_TOKEN: (state, rfToken) => { - state.refresh_token = rfToken - setStore({ name: 'refresh_token', content: state.refresh_token, type: 'session' }) - }, - SET_ROLES: (state, roles) => { - state.roles = roles - setStore({ name: 'roles', content: state.roles, type: 'session' }) - }, - SET_PERMISSIONS: (state, permissions) => { - let list = {} - for (let i = 0; i < permissions.length; i++) { - list[permissions[i]] = true - } - state.permissions = list - setStore({ name: 'permissions', content: state.permissions, type: 'session' }) - } + GetTableData({ + commit, + state, + dispatch + }, page) { + return new Promise((resolve, reject) => { + // 未定义 + // getTableData(page).then(res => { + // const data = res.data + // resolve(data) + // }) + }) + }, + GetUserInfo({ + commit, + state, + dispatch + }) { + return new Promise((resolve, reject) => { + getUserInfo(state.token).then(response => { + const data = response.data.data + commit('SET_ROLES', data.roles) + commit('SET_USER_INFO', data.sysUser) + commit('SET_PERMISSIONS', data.permissions) + resolve(response) + }).catch(error => { + reject(error) + }) + }) + }, + // 登出 + LogOut({ + commit, + state + }) { + return new Promise((resolve, reject) => { + logout(state.access_token, state.refresh_token).then(() => { + // 清除菜单 + commit('SET_MENU', []) + // 清除权限 + commit('SET_PERMISSIONS', []) + // 清除用户信息 + commit('SET_USER_INFO', {}) + commit('SET_ACCESS_TOKEN', '') + commit('SET_REFRESH_TOKEN', '') + commit('SET_ROLES', []) + commit('DEL_ALL_TAG') + removeToken() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + // 注销session + FedLogOut({ + commit + }) { + return new Promise(resolve => { + // 清除菜单 + commit('SET_MENU', []) + // 清除权限 + commit('SET_PERMISSIONS', []) + // 清除用户信息 + commit('SET_USER_INFO', {}) + commit('SET_ACCESS_TOKEN', '') + commit('SET_REFRESH_TOKEN', '') + commit('SET_ROLES', []) + commit('DEL_ALL_TAG') + removeToken() + resolve() + }) + }, + // 获取系统菜单 + GetMenu({ + commit + }) { + return new Promise(resolve => { + GetMenu().then((res) => { + const data = res.data + commit('SET_MENU', data) + resolve(data) + }) + }) + } + }, + mutations: { + SET_ACCESS_TOKEN: (state, access_token) => { + state.access_token = access_token + setStore({ + name: 'access_token', + content: state.access_token, + type: 'session' + }) + }, + SET_MENU: (state, menu) => { + state.menu = menu || [] + setStore({ + name: 'menu', + content: state.menu, + type: 'session' + }) + state.isInitMenu = false + setStore({ + name: 'isInitMenu', + content: state.isInitMenu, + type: 'session' + }) + }, + IS_INIT_MENU: (state, isInitMenu) => { + state.isInitMenu = isInitMenu + setStore({ + name: 'isInitMenu', + content: state.isInitMenu, + type: 'session' + }) + }, + SET_USER_INFO: (state, userInfo) => { + state.userInfo = userInfo + setStore({ + name: 'userInfo', + content: state.userInfo, + type: 'session' + }) + }, + SET_REFRESH_TOKEN: (state, rfToken) => { + state.refresh_token = rfToken + setStore({ + name: 'refresh_token', + content: state.refresh_token, + type: 'session' + }) + }, + SET_ROLES: (state, roles) => { + state.roles = roles + setStore({ + name: 'roles', + content: state.roles, + type: 'session' + }) + }, + SET_PERMISSIONS: (state, permissions) => { + const list = {} + for (let i = 0; i < permissions.length; i++) { + list[permissions[i]] = true + } + state.permissions = list + setStore({ + name: 'permissions', + content: state.permissions, + type: 'session' + }) } + } } export default user diff --git a/src/util/store.js b/src/util/store.js index 394b0278373a02501d3cb454bc72ae758e82e424..b349d56b8bee7da8f69d25220919b6931abe508c 100644 --- a/src/util/store.js +++ b/src/util/store.js @@ -1,44 +1,55 @@ -import { validatenull } from '@/util/validate'; +import { validatenull } from '@/util/validate' /** * 存储localStorage */ export const setStore = (params) => { - let { name, content, type, datetime } = params; - let obj = { - dataType: typeof (content), - content: content, - type: type, - datetime: new Date().getTime() - } - if (type) window.sessionStorage.setItem(name, JSON.stringify(obj)); - else window.localStorage.setItem(name, JSON.stringify(obj)); + const { + name, + content, + type, + datetime + } = params + const obj = { + dataType: typeof (content), + content: content, + type: type, + datetime: new Date().getTime() + } + if (type) window.sessionStorage.setItem(name, JSON.stringify(obj)) + else window.localStorage.setItem(name, JSON.stringify(obj)) } /** * 获取localStorage */ export const getStore = (params) => { - let { name, type } = params; - let obj = {}, content; - obj = window.localStorage.getItem(name); - if (validatenull(obj)) obj = window.sessionStorage.getItem(name); - if (validatenull(obj)) return; - obj = JSON.parse(obj); - if (obj.dataType == 'string') { - content = obj.content; - } else if (obj.dataType == 'number') { - content = Number(obj.content); - } else if (obj.dataType == 'boolean') { - content = eval(obj.content); - } else if (obj.dataType == 'object') { - content = obj.content; - } - return content; + const { + name, + type + } = params + let obj = {} + let content + obj = window.localStorage.getItem(name) + if (validatenull(obj)) obj = window.sessionStorage.getItem(name) + if (validatenull(obj)) return + obj = JSON.parse(obj) + if (obj.dataType === 'string') { + content = obj.content + } else if (obj.dataType === 'number') { + content = Number(obj.content) + } else if (obj.dataType === 'boolean') { + content = eval(obj.content) + } else if (obj.dataType === 'object') { + content = obj.content + } + return content } /** * 删除localStorage */ export const removeStore = params => { - let { name } = params; - window.localStorage.removeItem(name); - window.sessionStorage.removeItem(name); -} \ No newline at end of file + let { + name + } = params + window.localStorage.removeItem(name) + window.sessionStorage.removeItem(name) +} diff --git a/src/util/util.js b/src/util/util.js index 8bea46f3a28dd68764ceb3031e939df6fdfbb3fe..78e85d798c5c2d5c91736ad56933d728d38c827e 100644 --- a/src/util/util.js +++ b/src/util/util.js @@ -1,207 +1,260 @@ import { validatenull } from './validate' import { baseUrl } from '@/config/env' +export const initMenu = (router, menu) => { + if (menu.length === 0) { + return + } + router.addRoutes(formatRoutes(menu)) +} + +export const formatRoutes = (aMenu) => { + const aRouter = [] + aMenu.forEach(oMenu => { + const { + path, + component, + name, + icon, + hidden, + redirect, + meta, + children + } = oMenu + const oRouter = { + path: path, + component(resolve) { + let componentPath = '' + if (component === 'Layout') { + require(['../page/index'], resolve) + return + } else if (component.indexOf('/') !== 0) { + componentPath = '/' + component + } else { + componentPath = component + } + require(['../views' + componentPath + '.vue'], resolve) + }, + name: name, + icon: icon, + hidden: hidden, + meta: meta, + children: (children && children instanceof Array) ? formatRoutes(children) : [] + } + if (redirect) { + oRouter.redirect = redirect + } + aRouter.push(oRouter) + }) + return aRouter +} /** * 加密处理 */ export const encryption = (params) => { - let { data, type, param, key } = params; - let result = JSON.parse(JSON.stringify(data)); - if (type == 'Base64') { - param.forEach(ele => { - result[ele] = btoa(result[ele]); - }) - } else if (type == 'Aes') { - param.forEach(ele => { - result[ele] = CryptoJS.AES.encrypt(result[ele], key).toString(); - }) - - } - return result; -}; + let { + data, + type, + param, + key + } = params + let result = JSON.parse(JSON.stringify(data)) + if (type === 'Base64') { + param.forEach(ele => { + result[ele] = btoa(result[ele]) + }) + } else if (type === 'Aes') { + param.forEach(ele => { + result[ele] = CryptoJS.AES.encrypt(result[ele], key).toString() + }) + } + return result +} /** * 设置浏览器头部标题 */ export const setTitle = function (title) { - title = title ? `${title}——Pig 微服务快速开发框架` : 'Pig 微服务快速开发框架'; - window.document.title = title; -}; + title = title ? `${title}——Pig 微服务快速开发框架` : 'Pig 微服务快速开发框架'; + window.document.title = title +} /** * 浏览器判断是否全屏 */ export const fullscreenToggel = () => { - if (fullscreenEnable()) { - exitFullScreen(); - } else { - reqFullScreen(); - } + if (fullscreenEnable()) { + exitFullScreen() + } else { + reqFullScreen() + } } /** * esc监听全屏 */ export const listenfullscreen = (callback) => { - function listen() { - callback() - } - document.addEventListener("fullscreenchange", function (e) { - listen(); - }); - document.addEventListener("mozfullscreenchange", function (e) { - listen(); - }); - document.addEventListener("webkitfullscreenchange", function (e) { - listen(); - }); - document.addEventListener("msfullscreenchange", function (e) { - listen(); - }); + function listen() { + callback() + } + document.addEventListener('fullscreenchange', function (e) { + listen() + }) + document.addEventListener('mozfullscreenchange', function (e) { + listen() + }) + document.addEventListener('webkitfullscreenchange', function (e) { + listen() + }) + document.addEventListener('msfullscreenchange', function (e) { + listen() + }) } + /** * 浏览器判断是否全屏 */ export const fullscreenEnable = () => { - var isFullscreen = document.fullscreenEnabled || - window.fullScreen || - document.mozFullscreenEnabled || - document.webkitIsFullScreen; - return isFullscreen; + var isFullscreen = document.fullscreenEnabled || + window.fullScreen || + document.mozFullscreenEnabled || + document.webkitIsFullScreen + return isFullscreen } /** * 浏览器全屏 */ export const reqFullScreen = () => { - if (document.documentElement.requestFullScreen) { - document.documentElement.requestFullScreen(); - } else if (document.documentElement.webkitRequestFullScreen) { - document.documentElement.webkitRequestFullScreen(); - } else if (document.documentElement.mozRequestFullScreen) { - document.documentElement.mozRequestFullScreen(); - } + if (document.documentElement.requestFullScreen) { + document.documentElement.requestFullScreen() + } else if (document.documentElement.webkitRequestFullScreen) { + document.documentElement.webkitRequestFullScreen() + } else if (document.documentElement.mozRequestFullScreen) { + document.documentElement.mozRequestFullScreen() + } } + /** * 浏览器退出全屏 */ export const exitFullScreen = () => { - if (document.documentElement.requestFullScreen) { - document.exitFullScreen(); - } else if (document.documentElement.webkitRequestFullScreen) { - document.webkitCancelFullScreen(); - } else if (document.documentElement.mozRequestFullScreen) { - document.mozCancelFullScreen(); - } + if (document.documentElement.requestFullScreen) { + document.exitFullScreen() + } else if (document.documentElement.webkitRequestFullScreen) { + document.webkitCancelFullScreen() + } else if (document.documentElement.mozRequestFullScreen) { + document.mozCancelFullScreen() + } } + /** * 递归寻找子类的父类 */ - export const findParent = (menu, id) => { - for (let i = 0; i < menu.length; i++) { - if (menu[i].children.length != 0) { - for (let j = 0; j < menu[i].children.length; j++) { - if (menu[i].children[j].id == id) { - return menu[i]; - } else { - if (menu[i].children[j].children.length != 0) { - return findParent(menu[i].children[j].children, id); - } - } - } + for (let i = 0; i < menu.length; i++) { + if (menu[i].children.length !== 0) { + for (let j = 0; j < menu[i].children.length; j++) { + if (menu[i].children[j].id === id) { + return menu[i] + } else { + if (menu[i].children[j].children.length !== 0) { + return findParent(menu[i].children[j].children, id) + } } - }; + } + } + } } /** * 总体路由处理器 */ export const resolveUrlPath = (url, name) => { - - let reqUrl = url; - if (url.indexOf("#") != -1 && url.indexOf("http") == -1) { - const port = reqUrl.substr(reqUrl.indexOf(':')); - reqUrl = `/myiframe/urlPath?src=${baseUrl}${port}${reqUrl.replace('#', '').replace(port, '')}}&name=${name}`; - } else if (url.indexOf("http") != -1) { - reqUrl = `/myiframe/urlPath?src=${reqUrl}&name=${name}`; - } else { - reqUrl = `${reqUrl}`; - } - return reqUrl; + let reqUrl = url + if (url.indexOf('#') !== -1 && url.indexOf('http') === -1) { + const port = reqUrl.substr(reqUrl.indexOf(':')) + reqUrl = `/myiframe/urlPath?src=${baseUrl}${port}${reqUrl.replace('#', '').replace(port, '')}}&name=${name}` + } else if (url.indexOf('http') !== -1) { + reqUrl = `/myiframe/urlPath?src=${reqUrl}&name=${name}` + } else { + reqUrl = `${reqUrl}` + } + return reqUrl } + /** * 总体路由设置器 */ export const setUrlPath = ($route) => { - let value = ""; - if ($route.query.src) { - value = $route.query.src; - } else { - value = $route.path; - } - return value; + let value = '' + if ($route.query.src) { + value = $route.query.src + } else { + value = $route.path + } + return value } + /** * 动态插入css */ - export const loadStyle = url => { - const link = document.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - const head = document.getElementsByTagName('head')[0]; - head.appendChild(link); + const link = document.createElement('link') + link.type = 'text/css' + link.rel = 'stylesheet' + link.href = url + const head = document.getElementsByTagName('head')[0] + head.appendChild(link) } + /** * 根据字典的value显示label */ export const findByvalue = (dic, value) => { - let result = ''; - if (validatenull(dic)) return value; - if (typeof (value) == 'string' || typeof (value) == 'number') { - let index = 0; - index = findArray(dic, value); - if (index != -1) { - result = dic[index].label; - } else { - result = value; - } - } else if (value instanceof Array) { - result = []; - let index = 0; - value.forEach(ele => { - index = findArray(dic, ele); - if (index != -1) { - result.push(dic[index].label); - } else { - result.push(value); - } - }); - result = result.toString(); + let result = '' + if (validatenull(dic)) return value + if (typeof (value) === 'string' || typeof (value) === 'number') { + let index = 0 + index = findArray(dic, value) + if (index !== -1) { + result = dic[index].label + } else { + result = value } - return result; + } else if (value instanceof Array) { + result = [] + let index = 0 + value.forEach(ele => { + index = findArray(dic, ele) + if (index !== -1) { + result.push(dic[index].label) + } else { + result.push(value) + } + }) + result = result.toString() + } + return result } + /** * 根据字典的value查找对应的index */ export const findArray = (dic, value) => { - for (let i = 0; i < dic.length; i++) { - if (dic[i].value == value) { - return i; - break; - } + for (let i = 0; i < dic.length; i++) { + if (dic[i].value === value) { + return i } - return -1; + } + return -1 } + /** * 生成随机len位数字 */ export const randomLenNum = (len, date) => { - let random = ''; - random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, len ? len : 4); - if (date) random = random + Date.now(); - return random; + let random = '' + random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, typeof len === 'number' ? len : 4) + if (date) random = random + Date.now() + return random } - - diff --git a/src/views/admin/log/index.vue b/src/views/admin/log/index.vue index d6bcf2a4d523b01e92866c67b88240d1f1c2837c..a828d05ccc713ed4a62706c6195f525b3ab26012 100644 --- a/src/views/admin/log/index.vue +++ b/src/views/admin/log/index.vue @@ -8,14 +8,13 @@ 搜索 - - +