merge origin master,菜单界面可缓存之前点击过的树节点状态(展开与否),增加moment时间插件,实现动态路由功能。

This commit is contained in:
zzz 2018-05-12 09:20:42 +08:00
parent 9d4d0272dc
commit fbbfb8f8b0
17 changed files with 923 additions and 556 deletions

View File

@ -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",

View File

@ -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 }
})
}

View File

@ -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
})
}

View File

@ -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) {

View File

@ -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({

View File

@ -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"]),

View File

@ -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
});
}
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()
}
}
// 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 {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next('/login')
NProgress.done();
}
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 {
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)
})

View File

@ -1,4 +1,4 @@
module.exports = (file, path) => {
if (!path) path = 'page'
return require(`../${path}/${file}.vue`)
}
if (!path) path = 'page'
return require(`../${path}/${file}.vue`)
}

View File

@ -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

View File

@ -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))
})

View File

@ -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

View File

@ -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

View File

@ -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);
}
let {
name
} = params
window.localStorage.removeItem(name)
window.sessionStorage.removeItem(name)
}

View File

@ -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
}

View File

@ -8,14 +8,13 @@
<el-button class="filter-item" type="primary" v-waves icon="search" @click="handleFilter">搜索</el-button>
</div>
<el-table :key='tableKey' :data="list" v-loading="listLoading" element-loading-text="给我一点时间" border fit highlight-current-row style="width: 99%">
<el-table-column align="center" label="序号">
<template slot-scope="scope">
<span>{{Number(scope.row.id).toFixed()}}</span>
<span>{{ getSerialNumber(scope.$index) }}</span>
</template>
</el-table-column>
<el-table-column label="类型" align="center">
<el-table-column align="center" label="类型">
<template slot-scope="scope">
<span>
<el-button type="success" v-if="scope.row.type == 0">{{ scope.row.type | typeFilter }}</el-button>
@ -26,41 +25,41 @@
<el-table-column label="请求接口" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.requestUri}}</span>
<span>{{ scope.row.requestUri }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="IP地址">
<template slot-scope="scope">
<span>{{scope.row.remoteAddr}}</span>
<span>{{ scope.row.remoteAddr }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="请求方式">
<template slot-scope="scope">
<span>{{scope.row.method}}</span>
<span>{{ scope.row.method }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="传入参数" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{scope.row.params}}</span>
<span>{{ scope.row.params }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="请求时间">
<template slot-scope="scope">
<span>{{scope.row.time}}</span>
<span>{{ scope.row.time}}</span>
</template>
</el-table-column>
<el-table-column align="center" label="创建时间">
<template slot-scope="scope">
<span>{{scope.row.createTime | parseTime('{y}-{m}-{d} {h}:{i}')}}</span>
<span>{{ scope.row.createTime | moment('YYYY-MM-DD HH:mm') }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="danger" v-if="sys_log_del" @click="handleDelete(scope.row)">删除
</el-button>
@ -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";

View File

@ -12,13 +12,15 @@
<el-col :span="8" style='margin-top:15px;'>
<el-tree
class="filter-tree"
:data="treeData"
node-key="id"
highlight-current
:props="defaultProps"
:data="treeData"
:default-expanded-keys="aExpandedKeys"
:filter-node-method="filterNode"
:props="defaultProps"
@node-click="getNodeData"
default-expand-all
@node-expand="nodeExpand"
@node-collapse="nodeCollapse"
>
</el-tree>
</el-col>
@ -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'

105
static/aes.js Normal file
View File

@ -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)
})();