import { setToken, setRefreshToken, removeToken, removeRefreshToken, getToken, getRefreshToken, } from '@/utils/auth' import { setStore, getStore } from '@/utils/store' import { validatenull } from '@/utils/validate' import { deepClone, logOutFun } from '@/utils/util' import defaultAva from '@/assets/images/defaultava.png' import { loginByUsername, loginBySocial, loginBySso, loginByPhone, getUserInfo, logout, refreshToken, getButtons, registerUser, getParentDeptInfo } from '@/api/user' import { getRoutes, getTopMenu } from '@/api/system/menu' import { formatPath } from '@/router/avue-router' import { ElMessage } from 'element-plus' import { encrypt } from '@/utils/sm2' import md5 from 'js-md5' // 5是反制无人机菜单,7是系统菜单 const sysType = localStorage.getItem('sysType') || 5 const user = { state: { tenantId: getStore({ name: 'tenantId' }) || '', userInfo: getStore({ name: 'userInfo' }) || [], permission: getStore({ name: 'permission' }) || {}, roles: [], menuId: {}, menu: getStore({ name: 'menu' }) || [], menuAll: getStore({ name: 'menuAll' }) || [], token: getStore({ name: 'token' }) || '', refreshToken: getStore({ name: 'refreshToken' }) || '', parentDeptInfo: getStore({ name: 'parentDeptInfo' }) || '', }, actions: { //根据用户名登录 LoginByUsername ({ commit }, userInfo = {}) { return new Promise((resolve, reject) => { loginByUsername( userInfo.tenantId, userInfo.deptId, userInfo.roleId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code ) .then(res => { const data = res.data if (data.error_description) { ElMessage({ message: data.error_description, type: 'error', }) } else { 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('SET_PARENT_DEPT_INFO', data.dept_id) commit('DEL_ALL_TAG') commit('CLEAR_LOCK') } resolve() }) .catch(err => { reject(err) }) }) }, //根据第三方信息登录 LoginBySocial ({ commit }, userInfo) { return new Promise((resolve, reject) => { loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state) .then(res => { const data = res.data if (data.error_description) { ElMessage({ message: data.error_description, type: 'error', }) } else { commit('SET_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_USER_INFO', data) commit('SET_TENANT_ID', data.tenant_id) commit('DEL_ALL_TAG') commit('CLEAR_LOCK') } resolve() }) .catch(err => { reject(err) }) }) }, //根据单点信息登录 LoginBySso ({ commit }, userInfo) { return new Promise((resolve, reject) => { loginBySso(userInfo.state, userInfo.code) .then(res => { const data = res.data if (data.error_description) { ElMessage({ message: data.error_description, type: 'error', }) } else { commit('SET_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_USER_INFO', data) commit('SET_TENANT_ID', data.tenant_id) commit('DEL_ALL_TAG') commit('CLEAR_LOCK') } resolve() }) .catch(err => { reject(err) }) }) }, //根据手机信息登录 LoginByPhone ({ commit }, userInfo) { return new Promise((resolve, reject) => { loginByPhone( userInfo.tenantId, encrypt(userInfo.phone), userInfo.codeId, userInfo.codeValue ) .then(res => { const data = res.data if (data.error_description) { ElMessage({ message: data.error_description, type: 'error', }) } else { commit('SET_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_USER_INFO', data) commit('SET_TENANT_ID', data.tenant_id) commit('DEL_ALL_TAG') commit('CLEAR_LOCK') } resolve() }) .catch(err => { reject(err) }) }) }, //用户注册 RegisterUser ({ commit }, userInfo = {}) { return new Promise((resolve, reject) => { registerUser( userInfo.tenantId, userInfo.name, userInfo.account, encrypt(userInfo.password), userInfo.phone, userInfo.email ).then(res => { const data = res.data if (data.error_description) { ElMessage({ message: data.error_description, type: 'error', }) reject(data.error_description) } else { commit('SET_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_USER_INFO', data) commit('SET_TENANT_ID', data.tenant_id) 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 }, userInfo) { return new Promise((resolve, reject) => { refreshToken( getRefreshToken(), state.tenantId, !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id, !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id ) .then(res => { const data = res.data commit('SET_TOKEN', data.access_token) commit('SET_REFRESH_TOKEN', data.refresh_token) commit('SET_USER_INFO', data) resolve() }) .catch(error => { reject(error) }) }) }, // 登出 LogOut ({ commit }) { return new Promise((resolve, reject) => { const promiseRes = getToken() ? logout() : Promise.resolve() promiseRes.then(() => { commit('SET_TOKEN', '') commit('SET_MENU_ALL_NULL', []) commit('SET_MENU', []) commit('SET_ROLES', []) commit('DEL_ALL_TAG', []) commit('CLEAR_LOCK') removeToken() removeRefreshToken() removeToken() resolve() localStorage.clear() }) .catch(error => { reject(error) }) }) }, GetTopMenu () { return new Promise(resolve => { getTopMenu().then(res => { const data = res.data.data || [] resolve(data) }) }) }, GetMenu ({ commit, dispatch }, tenantId) { return new Promise(resolve => { getRoutes({tenantId,sysType}).then(res => { const data = res.data.data; let menu = deepClone(data); if (!res.data?.data?.length){ ElMessage.warning('当前角色没有配置菜单,请联系管理员配置') setTimeout(logOutFun,1500) return } menu.forEach(ele => formatPath(ele, true)) commit('SET_MENU', menu) commit('SET_MENU_ALL', menu) dispatch('GetButtons') resolve(menu) }).catch(err => { logOutFun() }) }) }, GetButtons ({ commit }) { return new Promise(resolve => { getButtons({ sysType}).then(res => { const data = res.data.data commit('SET_PERMISSION', data) resolve() }) }) }, }, mutations: { SET_PARENT_DEPT_INFO (state, deptId) { getParentDeptInfo({ deptId: deptId }).then(res => { const data = res.data.data state.parentDeptInfo = data setStore({ name: 'parentDeptInfo', content: data }) }) }, SET_TOKEN: (state, token) => { setToken(token) state.token = token setStore({ name: 'token', content: state.token }) }, SET_REFRESH_TOKEN: (state, refreshToken) => { setRefreshToken(refreshToken) state.refreshToken = refreshToken setStore({ name: 'refreshToken', content: state.refreshToken }) }, SET_MENU_ID (state, menuId) { state.menuId = menuId }, SET_TENANT_ID: (state, tenantId) => { state.tenantId = tenantId setStore({ name: 'tenantId', content: state.tenantId }) }, SET_USER_INFO: (state, userInfo) => { if (validatenull(userInfo.user_id) && validatenull(userInfo.account)) { state.userInfo = { user_name: 'unauth', role_name: 'unauth' } } else { if (validatenull(userInfo.avatar)) { userInfo.avatar = defaultAva } state.userInfo = userInfo } setStore({ name: 'userInfo', content: state.userInfo }) }, SET_MENU_ALL: (state, menuAll) => { let menu = state.menuAll menuAll.forEach(ele => { let index = menu.findIndex(item => item.path === ele.path) if (index === -1) { menu.push(ele) } else { menu[index] = ele } }) state.menuAll = menu setStore({ name: 'menuAll', content: state.menuAll }) }, SET_MENU_ALL_NULL: state => { state.menuAll = [] setStore({ name: 'menuAll', content: state.menuAll }) }, SET_MENU: (state, menu) => { state.menu = menu setStore({ name: 'menu', content: state.menu }) }, SET_ROLES: (state, roles) => { state.roles = roles }, SET_PERMISSION: (state, permission) => { let result = [] function getCode (list) { list.forEach(ele => { if (typeof ele === 'object') { const children = ele.children const code = ele.code if (children) { getCode(children) } else { result.push(code) } } }) } getCode(permission) state.permission = {} result.forEach(ele => { state.permission[ele] = true }) setStore({ name: 'permission', content: state.permission, type: 'session' }) }, }, } export default user