platform-vue/src/stores/auth.js
2026-04-01 15:14:37 +08:00

125 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
// 平台登录缓存仅保留以下字段(不含 tid、group_id
const defaultUser = {
id: '',
account: '',
name: '',
rid: '',
avatar: '',
role_name: ''
}
/**
* 规范化写入 localStorage 的用户信息,去掉 tid、group_id 等废弃字段;
* 若仅有历史 group_id则迁移到 rid。
*/
function normalizePlatformUser(raw) {
if (!raw || typeof raw !== 'object') {
return { ...defaultUser }
}
let rid = raw.rid
if (rid === undefined || rid === null || rid === '') {
const legacy = raw.group_id
if (legacy !== undefined && legacy !== null && legacy !== '') {
rid = legacy
}
}
return {
id: parseInt(raw.id, 10) || null,
account: raw.account || '',
name: raw.name || '',
rid: rid !== undefined && rid !== null && rid !== '' ? rid : '',
avatar: raw.avatar || '',
role_name: raw.role_name || ''
}
}
export const useAuthStore = defineStore('auth', () => {
const token = ref(localStorage.getItem('token') || '')
const isLoggedIn = ref(!!token.value)
const user = reactive({ ...defaultUser })
// 从缓存加载用户信息
function loadUserFromCache() {
const cachedUser = localStorage.getItem('userInfo')
if (cachedUser) {
try {
const parsed = JSON.parse(cachedUser)
const normalized = normalizePlatformUser(parsed)
Object.assign(user, normalized)
localStorage.setItem('userInfo', JSON.stringify(normalized))
} catch (e) {
console.error('Failed to parse user info from cache:', e)
}
}
}
// 初始化时加载用户信息
loadUserFromCache()
// 保存登录信息token 和用户信息)
function setLoginInfo(loginData) {
const userInfo = loginData.user || loginData
const normalizedUser = normalizePlatformUser(userInfo)
const accessToken = loginData.token || ''
token.value = accessToken
isLoggedIn.value = !!accessToken
localStorage.setItem('token', accessToken)
Object.assign(user, normalizedUser)
localStorage.setItem('userInfo', JSON.stringify(normalizedUser))
}
// 设置 token兼容旧代码
function setToken(newToken) {
token.value = newToken
isLoggedIn.value = true
localStorage.setItem('token', newToken)
}
// 清除登录信息
function clearToken() {
token.value = ''
isLoggedIn.value = false
Object.assign(user, { ...defaultUser })
localStorage.removeItem('token')
localStorage.removeItem('userInfo')
}
// 检查认证状态
function checkAuth() {
const storedToken = localStorage.getItem('token')
if (storedToken) {
token.value = storedToken
isLoggedIn.value = true
loadUserFromCache()
} else {
token.value = ''
isLoggedIn.value = false
Object.assign(user, { ...defaultUser })
}
}
// 更新用户信息(合并后仍只持久化平台字段)
function updateUserInfo(partial) {
const merged = normalizePlatformUser({ ...user, ...partial })
Object.assign(user, merged)
localStorage.setItem('userInfo', JSON.stringify(merged))
}
return {
token,
isLoggedIn,
user,
setLoginInfo,
setToken,
clearToken,
checkAuth,
updateUserInfo
}
})