import {setToken, setRefreshToken, removeToken, removeRefreshToken} from '@/util/auth' import {Message} from 'element-ui' import {setStore, getStore} from '@/util/store' import {isURL, validatenull} from '@/util/validate' import {deepClone} from '@/util/util' import website from '@/config/website' import {loginByUsername, getUserInfo, logout, refreshToken, getButtons} from '@/api/user' import {getTopMenu, getRoutes} from '@/api/system/menu' import md5 from 'js-md5' function addPath(ele, first) { const menu = website.menu; const propsConfig = menu.props; const propsDefault = { label: propsConfig.label || 'name', path: propsConfig.path || 'path', icon: propsConfig.icon || 'icon', children: propsConfig.children || 'children' } const icon = ele[propsDefault.icon]; ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon; const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0; if (!isChild) ele[propsDefault.children] = []; if (!isChild && first && !isURL(ele[propsDefault.path])) { ele[propsDefault.path] = ele[propsDefault.path] + '/index' } else { ele[propsDefault.children].forEach(child => { addPath(child); }) } } const user = { state: { tenantId: getStore({name: 'tenantId'}) || '', userInfo: getStore({name: 'userInfo'}) || [], permission: getStore({name: 'permission'}) || {}, roles: [], menu: getStore({name: 'menu'}) || [], menuId: getStore({name: 'menuId'}) || [], menuAll: getStore({name: 'menuAll'}) || [], token: getStore({name: 'token'}) || '', refreshToken: getStore({name: 'refreshToken'}) || '', auth: getStore({name: 'auth'}) || '', }, actions: { //根据用户名登录 LoginByUsername({commit}, userInfo) { return new Promise((resolve, reject) => { loginByUsername(userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code,userInfo.loginType).then(res => { const data = res.data; if (data.error_description) { Message({ message: data.error_description, type: 'error' }) } else { // 判断是否为客服 data.is_admin = data.role_name === 'operate' || data.role_name === 'muser' // 判断是否为管理员账号 data.is_master = ['administrator','admin','operate'].includes(data.role_name) commit('SET_AUTH', data.auth); commit('SET_TOKEN', data.access_token); commit('SET_REFRESH_TOKEN', data.refresh_token); commit('SET_TENANT_ID', data.tenant_id); commit('SET_USER_INFO', data); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); } resolve(); }).catch(error => { reject(error); }) }) }, GetButtons({commit}) { return new Promise((resolve) => { getButtons().then(res => { const data = res.data.data; commit('SET_PERMISSION', data); resolve(); }) }) }, //根据手机号登录 LoginByPhone({commit}, userInfo) { return new Promise((resolve) => { loginByUsername(userInfo.phone, userInfo.code).then(res => { const data = res.data.data; commit('SET_TOKEN', data); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); resolve(); }) }) }, GetUserInfo({commit}) { return new Promise((resolve, reject) => { getUserInfo().then((res) => { const data = res.data.data; commit('SET_ROLES', data.roles); resolve(data); }).catch(err => { reject(err); }) }) }, //刷新token refreshToken({state, commit}) { window.console.log('handle refresh token') return new Promise((resolve, reject) => { var authType = state.userInfo.login_type; refreshToken(state.refreshToken, state.tenantId, authType).then(res => { const data = res.data; commit('SET_TOKEN', data.access_token); commit('SET_REFRESH_TOKEN', data.refresh_token); resolve(); }).catch(error => { reject(error) }) }) }, // 登出 LogOut({commit}) { return new Promise((resolve, reject) => { logout().then(() => { commit('SET_AUTH', ''); commit('SET_TOKEN', ''); commit('SET_MENU', []); commit('SET_MENU_ID', {}); commit('SET_MENU_ALL', []); commit('SET_ROLES', []); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); commit('RESET_CONFIG'); removeToken(); removeRefreshToken(); resolve(); }).catch(error => { reject(error) }) }) }, //注销session FedLogOut({commit}) { return new Promise(resolve => { commit('SET_TOKEN', ''); commit('SET_MENU_ID', {}); commit('SET_MENU_ALL', []); commit('SET_MENU', []); commit('SET_ROLES', []); commit('DEL_ALL_TAG'); commit('CLEAR_LOCK'); removeToken(); removeRefreshToken(); resolve(); }) }, //获取顶部菜单 GetTopMenu() { return new Promise(resolve => { getTopMenu().then((res) => { const data = res.data.data || []; resolve(data) }) }) }, //获取系统菜单 GetMenu({commit, dispatch}, topMenuId) { return new Promise(resolve => { getRoutes(topMenuId).then((res) => { const data = res.data.data let menu = deepClone(data); menu.forEach(ele => { addPath(ele, true); }); commit('SET_MENU', menu) dispatch('GetButtons'); resolve(menu) }) }) }, }, mutations: { SET_TOKEN: (state, token) => { setToken(token); state.token = token; setStore({name: 'token', content: state.token, type: 'session'}) }, SET_MENU_ID(state, menuId) { state.menuId = menuId; setStore({name: 'menuId', content: state.menuId, type: 'session'}) }, SET_MENU_ALL: (state, menuAll) => { state.menuAll = menuAll setStore({name: 'menuAll', content: state.menuAll, type: 'session'}) }, SET_REFRESH_TOKEN: (state, refreshToken) => { setRefreshToken(refreshToken) state.refreshToken = refreshToken; setStore({name: 'refreshToken', content: state.refreshToken, type: 'session'}) }, SET_TENANT_ID: (state, tenantId) => { state.tenantId = tenantId; setStore({name: 'tenantId', content: state.tenantId, type: 'session'}) }, SET_USER_INFO: (state, userInfo) => { state.userInfo = userInfo; setStore({name: 'userInfo', content: state.userInfo}) }, SET_MENU: (state, menu) => { state.menu = menu; let menuAll = state.menuAll; if (!validatenull(menu)) { const obj = menuAll.filter(ele => ele.path === menu[0].path)[0]; if (!obj) { menuAll = menuAll.concat(menu); state.menuAll = menuAll } setStore({name: 'menuAll', content: menuAll, type: 'session'}) } setStore({name: 'menu', content: state.menu, type: 'session'}) }, SET_ROLES: (state, roles) => { state.roles = roles; }, SET_PERMISSION: (state, permission) => { let result = []; function getCode(list) { list.forEach(ele => { if (typeof (ele) === 'object') { const chiildren = ele.children; const code = ele.code; if (chiildren) { getCode(chiildren) } else { result.push(code); } } }) } getCode(permission); state.permission = {}; result.forEach(ele => { state.permission[ele] = true; }); setStore({name: 'permission', content: state.permission, type: 'session'}) }, SET_AUTH(state, auth){ state.auth = auth setStore({name: 'auth', content: auth, type: 'session'}) } } } export default user