Files
2026-06-02 15:28:25 +08:00

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