153 lines
4.3 KiB
JavaScript
153 lines
4.3 KiB
JavaScript
import { api } from '@/api/index'
|
|
|
|
// Token 刷新定时器(每 23 小时自动续期)
|
|
let refreshTimer = null
|
|
const REFRESH_INTERVAL = 23 * 60 * 60 * 1000
|
|
|
|
export default {
|
|
namespaced: true,
|
|
state: {
|
|
isLogin: false,
|
|
token: '',
|
|
deviceUuid: '',
|
|
userInfo: {
|
|
id: '',
|
|
username: '',
|
|
isSuper: false,
|
|
permissionEnterpriseIds: ''
|
|
},
|
|
// 企业信息(仅存储在内存中,不缓存本地)
|
|
enterpriseInfo: {
|
|
enterpriseName: '',
|
|
fullEnterpriseName: '',
|
|
enterpriseId: ''
|
|
}
|
|
},
|
|
mutations: {
|
|
SET_LOGIN(state, status) {
|
|
state.isLogin = status
|
|
},
|
|
SET_TOKEN(state, token) {
|
|
state.token = token
|
|
},
|
|
SET_DEVICE_UUID(state, uuid) {
|
|
state.deviceUuid = uuid
|
|
},
|
|
SET_USER_INFO(state, userInfo) {
|
|
state.userInfo = userInfo
|
|
},
|
|
SET_ENTERPRISE_INFO(state, enterpriseInfo) {
|
|
state.enterpriseInfo = { ...state.enterpriseInfo, ...enterpriseInfo }
|
|
},
|
|
CLEAR_ENTERPRISE_INFO(state) {
|
|
state.enterpriseInfo = {
|
|
enterpriseName: '',
|
|
fullEnterpriseName: '',
|
|
enterpriseId: ''
|
|
}
|
|
},
|
|
LOGOUT(state) {
|
|
state.isLogin = false
|
|
state.token = ''
|
|
state.deviceUuid = ''
|
|
state.userInfo = {
|
|
id: '',
|
|
username: '',
|
|
isSuper: false,
|
|
permissionEnterpriseIds: ''
|
|
}
|
|
// 清除企业信息
|
|
state.enterpriseInfo = {
|
|
enterpriseName: '',
|
|
fullEnterpriseName: '',
|
|
enterpriseId: ''
|
|
}
|
|
}
|
|
},
|
|
actions: {
|
|
login({ commit, dispatch }, { token, userInfo, deviceUuid }) {
|
|
commit('SET_TOKEN', token)
|
|
commit('SET_USER_INFO', userInfo)
|
|
commit('SET_DEVICE_UUID', deviceUuid || '')
|
|
commit('SET_LOGIN', true)
|
|
|
|
// 保存到本地存储
|
|
uni.setStorageSync('token', token)
|
|
uni.setStorageSync('userInfo', userInfo)
|
|
uni.setStorageSync('deviceUuid', deviceUuid || '')
|
|
|
|
// 启动 Token 自动续期定时器
|
|
dispatch('startTokenRefresh')
|
|
},
|
|
logout({ commit }) {
|
|
// 清除定时器
|
|
if (refreshTimer) {
|
|
clearInterval(refreshTimer)
|
|
refreshTimer = null
|
|
}
|
|
|
|
// 尝试通知服务端登出
|
|
api.logout().catch(() => {})
|
|
|
|
commit('LOGOUT')
|
|
|
|
// 清除本地存储
|
|
uni.removeStorageSync('token')
|
|
uni.removeStorageSync('userInfo')
|
|
uni.removeStorageSync('deviceUuid')
|
|
uni.reLaunch({ url: '/pages/login/login' })
|
|
},
|
|
startTokenRefresh({ state }) {
|
|
if (refreshTimer) {
|
|
clearInterval(refreshTimer)
|
|
}
|
|
refreshTimer = setInterval(() => {
|
|
if (state.token) {
|
|
api.refreshToken().catch(() => {})
|
|
}
|
|
}, REFRESH_INTERVAL)
|
|
},
|
|
updateUserInfo({ commit, state }, updates) {
|
|
const newUserInfo = { ...state.userInfo, ...updates }
|
|
commit('SET_USER_INFO', newUserInfo)
|
|
|
|
// 更新本地存储
|
|
uni.setStorageSync('userInfo', newUserInfo)
|
|
},
|
|
// 获取企业信息(有缓存则直接返回,否则从网络获取)
|
|
async getEnterpriseInfo({ commit, state }) {
|
|
// 如果已有企业信息,直接返回
|
|
if (state.enterpriseInfo.enterpriseName || state.enterpriseInfo.fullEnterpriseName) {
|
|
return state.enterpriseInfo
|
|
}
|
|
|
|
// 否则从网络获取
|
|
try {
|
|
const res = await api.defaultInfo()
|
|
console.log('获取企业信息', res)
|
|
if (res.code === 1000) {
|
|
const enterpriseInfo = {
|
|
enterpriseName: res.data.enterprise_name || '',
|
|
fullEnterpriseName: res.data.full_enterprise_name || '',
|
|
enterpriseId: res.data.eid || ''
|
|
}
|
|
commit('SET_ENTERPRISE_INFO', enterpriseInfo)
|
|
return enterpriseInfo
|
|
}
|
|
return null
|
|
} catch (error) {
|
|
console.error('获取企业信息失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
},
|
|
getters: {
|
|
isAdmin: state => state.userInfo.isSuper,
|
|
hasPermission: state => permission => {
|
|
return state.userInfo.permissionEnterpriseIds === '*' ||
|
|
(state.userInfo.permissionEnterpriseIds || '').split(',').includes(permission)
|
|
},
|
|
enterpriseName: state => state.enterpriseInfo.fullEnterpriseName || state.enterpriseInfo.enterpriseName || '',
|
|
enterpriseInfo: state => state.enterpriseInfo
|
|
}
|
|
} |