Files
zgty-mas-m/nx/store/user.js
2025-11-27 16:12:25 +08:00

139 lines
3.8 KiB
JavaScript

import { defineStore } from 'pinia'
import userApi from '@/nx/api/user'
import { getSysParameterBizByName } from '@/nx/api/sys'
import md5 from 'md5'
import nx from '@/nx'
import { COMPANY_DEPT_RETRY_HEADER, VISIT_COMPANY_STORAGE_KEY, VISIT_DEPT_STORAGE_KEY } from '@/nx/config'
// 默认用户信息
const defaultUserInfo = {
avatar: '', // 头像
nickname: '', // 昵称
gender: 0, // 性别
mobile: '' // 手机号
}
const user = defineStore({
id: 'user',
state: () => ({
userInfo: uni.getStorageSync('userInfo') || { ...defaultUserInfo }, // 用户信息
token: uni.getStorageSync('token') || '',
isLogin: !!uni.getStorageSync('token'), // 登录状态
roleMenus: uni.getStorageSync('roleMenus') || [],
timeout: 10 * 60 * 1000,
lastRequestTime: null,
timeoutInterval: null
}),
actions: {
// 更新最后请求时间
updateLastRequestTime() {
this.lastRequestTime = Date.now()
},
// 检查是否超时
checkTimeout() {
if (!this.token || !this.lastRequestTime) return false
const currentTime = Date.now()
const elapsed = currentTime - this.lastRequestTime
if (this.timeout > 0 && elapsed > this.timeout) {
uni.showToast({
icon: 'none',
title: '登录超时,请重新登录'
})
this.logout()
return true
}
return false
},
startTimeoutChecker(interval = 60 * 1000) {
this.stopTimeoutChecker()
this.timeoutInterval = setInterval(() => {
this.checkTimeout()
}, interval)
},
stopTimeoutChecker() {
if (this.timeoutInterval) {
clearInterval(this.timeoutInterval)
this.timeoutInterval = null
}
},
async getDeviceTimeout() {
const result = await getSysParameterBizByName('lims_pda_timeout')
this.timeout = Number(result.dictValue) * 60 * 1000
},
async login(loginInfo) {
const info = await userApi.accountLogin(loginInfo)
if (info) {
this.setToken(info.accessToken)
await this.getUserInfo()
uni.showToast({
icon: 'success',
title: '登录成功'
})
// await this.getDeviceTimeout()
// this.startTimeoutChecker()
// 如果已经存在默认模块就跳转到对应的模块
const defaultModulePath = uni.getStorageSync('defaultModule')
if (defaultModulePath) {
uni.reLaunch({
url: defaultModulePath
})
} else {
uni.reLaunch({
url: '/pages/index/index'
})
}
}
},
async getUserInfo() {
const { user, menus } = await userApi.getInfo()
if (user) {
this.userInfo = user
uni.setStorageSync('userInfo', this.userInfo)
this.getRoleMenus(menus)
}
},
async getRoleMenus(menus) {
const parentNodePath = '/lims/mobile'
let result = menus.find(item => item.path === parentNodePath)
if (result) {
this.roleMenus = result.children
uni.setStorageSync('roleMenus', this.roleMenus)
}
},
// 设置token
setToken(token = '') {
this.token = token
if (token === '') {
this.isLogin = false
uni.removeStorageSync('token')
} else {
this.isLogin = true
uni.setStorageSync('token', token)
}
return this.isLogin
},
// 登出
async logout() {
this.stopTimeoutChecker()
this.clearUserInfo()
uni.reLaunch({
url: '/pages/login/login'
})
},
clearUserInfo() {
this.userInfo = {}
this.roleMenus = []
uni.setStorageSync('roleMenus', [])
this.setToken()
// 清空部门信息
uni.removeStorageSync(COMPANY_DEPT_RETRY_HEADER)
uni.removeStorageSync(VISIT_COMPANY_STORAGE_KEY)
uni.removeStorageSync(VISIT_DEPT_STORAGE_KEY)
}
}
})
export default user