import { getStore, setStore } from '@/util/store' import { isURL, validatenull } from '@/util/validate' import { loginByMobile, loginBySocial, loginByUsername, LoginBySSO, logout, refreshToken, LoginByMSL } from '@/api/login' import { deepClone, encryption } from '@/util/util' import webiste from '@/const/website' import { resetRouter } from '@/router/router' import { getMenu, getTopMenu } from '@/api/admin/menu' function addPath(ele, first) { const menu = webiste.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) }) } } // 优化设置session的Auth参数 By Luxn function setAuth(data, commit) { commit('SET_ACCESS_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_EXPIRES_IN', data.expires_in) commit('SET_USER_INFO', data.user_info) commit('SET_PERMISSIONS', data.user_info.authorities || []) // 将相关Auth参数存入localStrorage By Luxn setAuthLocalStorage(data) } function setAuthLocalStorage(data) { const auth = { access_token: data.access_token, refresh_token: data.refresh_token, expires_in: data.expires_in, user_info: data.user_info, date_time: new Date().getTime() } localStorage.setItem('authorization', JSON.stringify(auth)) } function getAuthLocalStorage(commit) { return JSON.stringify(localStorage.getItem('authorization')) } const user = { state: { userInfo: getStore({ name: 'userInfo' }) || {}, permissions: getStore({ name: 'permissions' }) || [], roles: [], menu: getStore({ name: 'menu' }) || [], menuAll: [], expires_in: getStore({ name: 'expires_in' }) || '', access_token: getStore({ name: 'access_token' }) || '', refresh_token: getStore({ name: 'refresh_token' }) || '' }, actions: { // 根据用户名登录 LoginByUsername({ commit }, userInfo) { const user = encryption({ data: userInfo, key: 'pigxpigxpigxpigx', param: ['password'] }) return new Promise((resolve, reject) => { loginByUsername(user.username, user.password, user.code, user.randomStr) .then((response) => { setAuth(response.data, commit) commit('CLEAR_LOCK') resolve() }) .catch((error) => { reject(error) }) }) }, // 单点登录 LoginBySSO({ commit }, accessToken) { return new Promise((resolve, reject) => { LoginBySSO(accessToken) .then((response) => { const data = response.data commit('SET_ACCESS_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_EXPIRES_IN', data.expires_in) commit('SET_USER_INFO', data.user_info) commit('SET_PERMISSIONS', data.user_info.authorities || []) commit('CLEAR_LOCK') resolve() }) .catch((error) => { reject(error) }) }) }, // 根据手机号登录 LoginByPhone({ commit }, userInfo) { return new Promise((resolve, reject) => { loginByMobile(userInfo.mobile, userInfo.code) .then((response) => { setAuth(response.data, commit) commit('CLEAR_LOCK') resolve() }) .catch((error) => { reject(error) }) }) }, // 根据OpenId登录 LoginBySocial({ commit }, param) { return new Promise((resolve, reject) => { loginBySocial(param.state, param.code) .then((response) => { setAuth(response.data, commit) commit('CLEAR_LOCK') resolve() }) .catch((error) => { reject(error) }) }) }, // 刷新token RefreshToken({ commit, state }) { return new Promise((resolve, reject) => { refreshToken(state.refresh_token) .then((response) => { const data = response.data commit('SET_ACCESS_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_EXPIRES_IN', data.expires_in) commit('CLEAR_LOCK') resolve() }) .catch((error) => { reject(error) }) }) }, // 登出 LogOut({ commit }) { return new Promise((resolve, reject) => { logout() .then((res) => { if (res.data.data) { window.location.href = res.data.data } else { resetRouter() commit('SET_MENU', []) commit('SET_PERMISSIONS', []) commit('SET_USER_INFO', {}) commit('SET_ACCESS_TOKEN', '') commit('SET_REFRESH_TOKEN', '') commit('SET_EXPIRES_IN', '') commit('SET_ROLES', []) commit('DEL_ALL_TAG') commit('CLEAR_LOCK') resolve() } }) .catch((error) => { reject(error) }) }) }, // 注销session FedLogOut({ commit }) { return new Promise((resolve) => { resetRouter() 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') commit('CLEAR_LOCK') resolve() }) }, // 获取系统菜单 GetMenu({ commit }, obj) { return new Promise((resolve) => { getMenu(obj.id).then((res) => { const data = res.data.data const menu = deepClone(data) menu.forEach((ele) => { addPath(ele) }) const type = obj.type commit('SET_MENU', { type, menu }) resolve(menu) }) }) }, // 顶部菜单 GetTopMenu() { return new Promise((resolve) => { getTopMenu().then((res) => { const data = res.data.data || [] resolve(data) }) }) }, // 根据马上聊登录 LoginByMSL({ commit }, userInfo) { return new Promise((resolve, reject) => { LoginByMSL(userInfo.username, userInfo.password) .then((response) => { setAuth(response.data, commit) 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_EXPIRES_IN: (state, expires_in) => { state.expires_in = expires_in setStore({ name: 'expires_in', content: state.expires_in, type: 'session' }) }, SET_REFRESH_TOKEN: (state, rfToken) => { state.refresh_token = rfToken setStore({ name: 'refresh_token', content: state.refresh_token, type: 'session' }) }, SET_USER_INFO: (state, userInfo) => { state.userInfo = userInfo setStore({ name: 'userInfo', content: userInfo, type: 'session' }) }, SET_MENU: (state, params = {}) => { const { menu, type } = params if (type !== false) state.menu = menu setStore({ name: 'menu', content: menu, type: 'session' }) }, SET_MENU_ALL: (state, menuAll) => { state.menuAll = menuAll }, SET_ROLES: (state, roles) => { state.roles = roles }, SET_PERMISSIONS: (state, permissions) => { const list = {} for (let i = 0; i < permissions.length; i++) { list[permissions[i].authority] = true } state.permissions = list setStore({ name: 'permissions', content: list, type: 'session' }) } } } export default user