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 @@
搜索
-
- {{Number(scope.row.id).toFixed()}}
+ {{ getSerialNumber(scope.$index) }}
-
+
{{ scope.row.type | typeFilter }}
@@ -26,41 +25,41 @@
- {{ scope.row.requestUri}}
+ {{ scope.row.requestUri }}
- {{scope.row.remoteAddr}}
+ {{ scope.row.remoteAddr }}
- {{scope.row.method}}
+ {{ scope.row.method }}
- {{scope.row.params}}
+ {{ scope.row.params }}
- {{scope.row.time}}
+ {{ scope.row.time}}
- {{scope.row.createTime | parseTime('{y}-{m}-{d} {h}:{i}')}}
+ {{ scope.row.createTime | moment('YYYY-MM-DD HH:mm') }}
-
+
删除
@@ -120,6 +119,9 @@ export default {
});
},
methods: {
+ getSerialNumber(index) {
+ return index + 1 + (this.listQuery.page - 1) * this.listQuery.limit;
+ },
getList() {
this.listLoading = true;
this.listQuery.orderByField = "create_time";
diff --git a/src/views/admin/menu/index.vue b/src/views/admin/menu/index.vue
index 6e456bcb4967d034f627bf90191e75cd159834e3..45b4b8716a3eac1e1ca611ef915623b06717b2db 100644
--- a/src/views/admin/menu/index.vue
+++ b/src/views/admin/menu/index.vue
@@ -12,13 +12,15 @@
@@ -96,6 +98,14 @@
name: undefined
},
treeData: [],
+ oExpandedKey: {
+ // key (from tree id) : expandedOrNot boolean
+ },
+ oTreeNodeChildren: {
+ // id1 : [children] (from tree node id1)
+ // id2 : [children] (from tree node id2)
+ },
+ aExpandedKeys: [],
defaultProps: {
children: 'children',
label: 'name'
@@ -148,9 +158,46 @@
})
},
filterNode(value, data) {
+ // console.log(value);
if (!value) return true
return data.label.indexOf(value) !== -1
},
+
+ nodeExpand(data) {
+ let aChildren = data.children
+ if (aChildren.length > 0) {
+ this.oExpandedKey[data.id] = true
+ this.oTreeNodeChildren[data.id] = aChildren
+ }
+ this.setExpandedKeys()
+ },
+ nodeCollapse(data) {
+ this.oExpandedKey[data.id] = false
+ // 如果有子节点
+ this.treeRecursion(this.oTreeNodeChildren[data.id], (oNode) => {
+ this.oExpandedKey[oNode.id] = false
+ });
+ this.setExpandedKeys()
+ },
+ setExpandedKeys() {
+ let oTemp = this.oExpandedKey
+ this.aExpandedKeys = []
+ for (let sKey in oTemp) {
+ if (oTemp[sKey]) {
+ this.aExpandedKeys.push(parseInt(sKey));
+ }
+ }
+ },
+ treeRecursion(aChildren, fnCallback) {
+ if (aChildren) {
+ for (let i = 0; i < aChildren.length; ++i) {
+ let oNode = aChildren[i]
+ fnCallback && fnCallback(oNode)
+ this.treeRecursion(oNode.children, fnCallback)
+ }
+ }
+ },
+
getNodeData(data) {
if (!this.formEdit) {
this.formStatus = 'update'
diff --git a/static/aes.js b/static/aes.js
new file mode 100644
index 0000000000000000000000000000000000000000..f23a0e02d8ddb912f946e46117dfffcf3c782f5a
--- /dev/null
+++ b/static/aes.js
@@ -0,0 +1,105 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS = CryptoJS || function (u, p) {
+ var d = {}, l = d.lib = {}, s = function () { }, t = l.Base = { extend: function (a) { s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function () { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } },
+ r = l.WordArray = t.extend({
+ init: function (a, c) { a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function (a) { return (a || v).stringify(this) }, concat: function (a) { var c = this.words, e = a.words, j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++)c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4)c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function () {
+ var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 <<
+ 32 - 8 * (c % 4); a.length = u.ceil(c / 4)
+ }, clone: function () { var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var c = [], e = 0; e < a; e += 4)c.push(4294967296 * u.random() | 0); return new r.init(c, a) }
+ }), w = d.enc = {}, v = w.Hex = {
+ stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) { var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function (a) {
+ for (var c = a.length, e = [], j = 0; j < c; j += 2)e[j >>> 3] |= parseInt(a.substr(j,
+ 2), 16) << 24 - 4 * (j % 8); return new r.init(e, c / 2)
+ }
+ }, b = w.Latin1 = { stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++)e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function (a) { for (var c = a.length, e = [], j = 0; j < c; j++)e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new r.init(e, c) } }, x = w.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } },
+ q = l.BufferedBlockAlgorithm = t.extend({
+ reset: function () { this._data = new r.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var c = this._data, e = c.words, j = c.sigBytes, k = this.blockSize, b = j / (4 * k), b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * k; j = u.min(4 * a, j); if (a) { for (var q = 0; q < a; q += k)this._doProcessBlock(e, q); q = e.splice(0, a); c.sigBytes -= j } return new r.init(q, j) }, clone: function () {
+ var a = t.clone.call(this);
+ a._data = this._data.clone(); return a
+ }, _minBufferSize: 0
+ }); l.Hasher = q.extend({
+ cfg: t.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { q.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (b, e) { return (new a.init(e)).finalize(b) } }, _createHmacHelper: function (a) {
+ return function (b, e) {
+ return (new n.HMAC.init(a,
+ e)).finalize(b)
+ }
+ }
+ }); var n = d.algo = {}; return d
+}(Math);
+(function () {
+ var u = CryptoJS, p = u.lib.WordArray; u.enc.Base64 = {
+ stringify: function (d) { var l = d.words, p = d.sigBytes, t = this._map; d.clamp(); d = []; for (var r = 0; r < p; r += 3)for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r + 1 >>> 2] >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l[r + 2 >>> 2] >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++)d.push(t.charAt(w >>> 6 * (3 - v) & 63)); if (l = t.charAt(64)) for (; d.length % 4;)d.push(l); return d.join("") }, parse: function (d) {
+ var l = d.length, s = this._map, t = s.charAt(64); t && (t = d.indexOf(t), -1 != t && (l = t)); for (var t = [], r = 0, w = 0; w <
+ l; w++)if (w % 4) { var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4), b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4); t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4); r++ } return p.create(t, r)
+ }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
+ }
+})();
+(function (u) {
+ function p(b, n, a, c, e, j, k) { b = b + (n & a | ~n & c) + e + k; return (b << j | b >>> 32 - j) + n } function d(b, n, a, c, e, j, k) { b = b + (n & c | a & ~c) + e + k; return (b << j | b >>> 32 - j) + n } function l(b, n, a, c, e, j, k) { b = b + (n ^ a ^ c) + e + k; return (b << j | b >>> 32 - j) + n } function s(b, n, a, c, e, j, k) { b = b + (a ^ (n | ~c)) + e + k; return (b << j | b >>> 32 - j) + n } for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++)b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0; r = r.MD5 = v.extend({
+ _doReset: function () { this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878]) },
+ _doProcessBlock: function (q, n) {
+ for (var a = 0; 16 > a; a++) { var c = n + a, e = q[c]; q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360 } var a = this._hash.words, c = q[n + 0], e = q[n + 1], j = q[n + 2], k = q[n + 3], z = q[n + 4], r = q[n + 5], t = q[n + 6], w = q[n + 7], v = q[n + 8], A = q[n + 9], B = q[n + 10], C = q[n + 11], u = q[n + 12], D = q[n + 13], E = q[n + 14], x = q[n + 15], f = a[0], m = a[1], g = a[2], h = a[3], f = p(f, m, g, h, c, 7, b[0]), h = p(h, f, m, g, e, 12, b[1]), g = p(g, h, f, m, j, 17, b[2]), m = p(m, g, h, f, k, 22, b[3]), f = p(f, m, g, h, z, 7, b[4]), h = p(h, f, m, g, r, 12, b[5]), g = p(g, h, f, m, t, 17, b[6]), m = p(m, g, h, f, w, 22, b[7]),
+ f = p(f, m, g, h, v, 7, b[8]), h = p(h, f, m, g, A, 12, b[9]), g = p(g, h, f, m, B, 17, b[10]), m = p(m, g, h, f, C, 22, b[11]), f = p(f, m, g, h, u, 7, b[12]), h = p(h, f, m, g, D, 12, b[13]), g = p(g, h, f, m, E, 17, b[14]), m = p(m, g, h, f, x, 22, b[15]), f = d(f, m, g, h, e, 5, b[16]), h = d(h, f, m, g, t, 9, b[17]), g = d(g, h, f, m, C, 14, b[18]), m = d(m, g, h, f, c, 20, b[19]), f = d(f, m, g, h, r, 5, b[20]), h = d(h, f, m, g, B, 9, b[21]), g = d(g, h, f, m, x, 14, b[22]), m = d(m, g, h, f, z, 20, b[23]), f = d(f, m, g, h, A, 5, b[24]), h = d(h, f, m, g, E, 9, b[25]), g = d(g, h, f, m, k, 14, b[26]), m = d(m, g, h, f, v, 20, b[27]), f = d(f, m, g, h, D, 5, b[28]), h = d(h, f,
+ m, g, j, 9, b[29]), g = d(g, h, f, m, w, 14, b[30]), m = d(m, g, h, f, u, 20, b[31]), f = l(f, m, g, h, r, 4, b[32]), h = l(h, f, m, g, v, 11, b[33]), g = l(g, h, f, m, C, 16, b[34]), m = l(m, g, h, f, E, 23, b[35]), f = l(f, m, g, h, e, 4, b[36]), h = l(h, f, m, g, z, 11, b[37]), g = l(g, h, f, m, w, 16, b[38]), m = l(m, g, h, f, B, 23, b[39]), f = l(f, m, g, h, D, 4, b[40]), h = l(h, f, m, g, c, 11, b[41]), g = l(g, h, f, m, k, 16, b[42]), m = l(m, g, h, f, t, 23, b[43]), f = l(f, m, g, h, A, 4, b[44]), h = l(h, f, m, g, u, 11, b[45]), g = l(g, h, f, m, x, 16, b[46]), m = l(m, g, h, f, j, 23, b[47]), f = s(f, m, g, h, c, 6, b[48]), h = s(h, f, m, g, w, 10, b[49]), g = s(g, h, f, m,
+ E, 15, b[50]), m = s(m, g, h, f, r, 21, b[51]), f = s(f, m, g, h, u, 6, b[52]), h = s(h, f, m, g, k, 10, b[53]), g = s(g, h, f, m, B, 15, b[54]), m = s(m, g, h, f, e, 21, b[55]), f = s(f, m, g, h, v, 6, b[56]), h = s(h, f, m, g, x, 10, b[57]), g = s(g, h, f, m, t, 15, b[58]), m = s(m, g, h, f, D, 21, b[59]), f = s(f, m, g, h, z, 6, b[60]), h = s(h, f, m, g, C, 10, b[61]), g = s(g, h, f, m, j, 15, b[62]), m = s(m, g, h, f, A, 21, b[63]); a[0] = a[0] + f | 0; a[1] = a[1] + m | 0; a[2] = a[2] + g | 0; a[3] = a[3] + h | 0
+ }, _doFinalize: function () {
+ var b = this._data, n = b.words, a = 8 * this._nDataBytes, c = 8 * b.sigBytes; n[c >>> 5] |= 128 << 24 - c % 32; var e = u.floor(a /
+ 4294967296); n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360; n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360; b.sigBytes = 4 * (n.length + 1); this._process(); b = this._hash; n = b.words; for (a = 0; 4 > a; a++)c = n[a], n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360; return b
+ }, clone: function () { var b = v.clone.call(this); b._hash = this._hash.clone(); return b }
+ }); t.MD5 = v._createHelper(r); t.HmacMD5 = v._createHmacHelper(r)
+})(Math);
+(function () {
+ var u = CryptoJS, p = u.lib, d = p.Base, l = p.WordArray, p = u.algo, s = p.EvpKDF = d.extend({ cfg: d.extend({ keySize: 4, hasher: p.MD5, iterations: 1 }), init: function (d) { this.cfg = this.cfg.extend(d) }, compute: function (d, r) { for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q;) { n && s.update(n); var n = s.update(d).finalize(r); s.reset(); for (var a = 1; a < p; a++)n = s.finalize(n), s.reset(); b.concat(n) } b.sigBytes = 4 * q; return b } }); u.EvpKDF = function (d, l, p) {
+ return s.create(p).compute(d,
+ l)
+ }
+})();
+CryptoJS.lib.Cipher || function (u) {
+ var p = CryptoJS, d = p.lib, l = d.Base, s = d.WordArray, t = d.BufferedBlockAlgorithm, r = p.enc.Base64, w = p.algo.EvpKDF, v = d.Cipher = t.extend({
+ cfg: l.extend(), createEncryptor: function (e, a) { return this.create(this._ENC_XFORM_MODE, e, a) }, createDecryptor: function (e, a) { return this.create(this._DEC_XFORM_MODE, e, a) }, init: function (e, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = e; this._key = a; this.reset() }, reset: function () { t.reset.call(this); this._doReset() }, process: function (e) { this._append(e); return this._process() },
+ finalize: function (e) { e && this._append(e); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function (e) { return { encrypt: function (b, k, d) { return ("string" == typeof k ? c : a).encrypt(e, b, k, d) }, decrypt: function (b, k, d) { return ("string" == typeof k ? c : a).decrypt(e, b, k, d) } } }
+ }); d.StreamCipher = v.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var b = p.mode = {}, x = function (e, a, b) {
+ var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var d = 0; d < b; d++)e[a + d] ^=
+ c[d]
+ }, q = (d.BlockCipherMode = l.extend({ createEncryptor: function (e, a) { return this.Encryptor.create(e, a) }, createDecryptor: function (e, a) { return this.Decryptor.create(e, a) }, init: function (e, a) { this._cipher = e; this._iv = a } })).extend(); q.Encryptor = q.extend({ processBlock: function (e, a) { var b = this._cipher, c = b.blockSize; x.call(this, e, a, c); b.encryptBlock(e, a); this._prevBlock = e.slice(a, a + c) } }); q.Decryptor = q.extend({
+ processBlock: function (e, a) {
+ var b = this._cipher, c = b.blockSize, d = e.slice(a, a + c); b.decryptBlock(e, a); x.call(this,
+ e, a, c); this._prevBlock = d
+ }
+ }); b = b.CBC = q; q = (p.pad = {}).Pkcs7 = { pad: function (a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4)l.push(d); c = s.create(l, c); a.concat(c) }, unpad: function (a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({
+ cfg: v.cfg.extend({ mode: b, padding: q }), reset: function () {
+ v.reset.call(this); var a = this.cfg, b = a.iv, a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor; else c = a.createDecryptor, this._minBufferSize = 1; this._mode = c.call(a,
+ this, b && b.words)
+ }, _doProcessBlock: function (a, b) { this._mode.processBlock(a, b) }, _doFinalize: function () { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var b = this._process(!0) } else b = this._process(!0), a.unpad(b); return b }, blockSize: 4
+ }); var n = d.CipherParams = l.extend({ init: function (a) { this.mixIn(a) }, toString: function (a) { return (a || this.formatter).stringify(this) } }), b = (p.format = {}).OpenSSL = {
+ stringify: function (a) {
+ var b = a.ciphertext; a = a.salt; return (a ? s.create([1398893684,
+ 1701076831]).concat(a).concat(b) : b).toString(r)
+ }, parse: function (a) { a = r.parse(a); var b = a.words; if (1398893684 == b[0] && 1701076831 == b[1]) { var c = s.create(b.slice(2, 4)); b.splice(0, 4); a.sigBytes -= 16 } return n.create({ ciphertext: a, salt: c }) }
+ }, a = d.SerializableCipher = l.extend({
+ cfg: l.extend({ format: b }), encrypt: function (a, b, c, d) { d = this.cfg.extend(d); var l = a.createEncryptor(c, d); b = l.finalize(b); l = l.cfg; return n.create({ ciphertext: b, key: c, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) },
+ decrypt: function (a, b, c, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); return a.createDecryptor(c, d).finalize(b.ciphertext) }, _parse: function (a, b) { return "string" == typeof a ? b.parse(a, this) : a }
+ }), p = (p.kdf = {}).OpenSSL = { execute: function (a, b, c, d) { d || (d = s.random(8)); a = w.create({ keySize: b + c }).compute(a, d); c = s.create(a.words.slice(b), 4 * c); a.sigBytes = 4 * b; return n.create({ key: a, iv: c, salt: d }) } }, c = d.PasswordBasedCipher = a.extend({
+ cfg: a.cfg.extend({ kdf: p }), encrypt: function (b, c, d, l) {
+ l = this.cfg.extend(l); d = l.kdf.execute(d,
+ b.keySize, b.ivSize); l.iv = d.iv; b = a.encrypt.call(this, b, c, d.key, l); b.mixIn(d); return b
+ }, decrypt: function (b, c, d, l) { l = this.cfg.extend(l); c = this._parse(c, l.format); d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt); l.iv = d.iv; return a.decrypt.call(this, b, c, d.key, l) }
+ })
+}();
+(function () {
+ for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++)a[c] = 128 > c ? c << 1 : c << 1 ^ 283; for (var e = 0, j = 0, c = 0; 256 > c; c++) { var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4, k = k >>> 8 ^ k & 255 ^ 99; l[e] = k; s[k] = e; var z = a[e], F = a[z], G = a[F], y = 257 * a[k] ^ 16843008 * k; t[e] = y << 24 | y >>> 8; r[e] = y << 16 | y >>> 16; w[e] = y << 8 | y >>> 24; v[e] = y; y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e; b[k] = y << 24 | y >>> 8; x[k] = y << 16 | y >>> 16; q[k] = y << 8 | y >>> 24; n[k] = y; e ? (e = z ^ a[a[a[G ^ z]]], j ^= a[a[j]]) : e = j = 1 } var H = [0, 1, 2, 4, 8,
+ 16, 32, 64, 128, 27, 54], d = d.AES = p.extend({
+ _doReset: function () {
+ for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++)if (j < d) e[j] = c[j]; else { var k = e[j - 1]; j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24, k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255], k ^= H[j / d | 0] << 24); e[j] = e[j - d] ^ k } c = this._invKeySchedule = []; for (d = 0; d < a; d++)j = a - d, k = d % 4 ? e[j] : e[j - 4], c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>>
+ 8 & 255]] ^ n[l[k & 255]]
+ }, encryptBlock: function (a, b) { this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l) }, decryptBlock: function (a, c) { var d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d; this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s); d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d }, _doCryptBlock: function (a, b, c, d, e, j, l, f) {
+ for (var m = this._nRounds, g = a[b] ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++)var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++], s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++], t =
+ d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++], n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++], g = q, h = s, k = t; q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++]; s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++]; t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++]; n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++]; a[b] = q; a[b + 1] = s; a[b + 2] = t; a[b + 3] = n
+ }, keySize: 8
+ }); u.AES = p._createHelper(d)
+})();
\ No newline at end of file