Files
huihuiSquare/digital-avatar-app/src/store/user.ts
2026-07-24 14:04:21 +08:00

83 lines
2.2 KiB
TypeScript
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 } from 'vue'
import { setAuthToken, sendSmsCode, loginBySms, loginByPassword, logoutUser, type UserProfile } from '@/api'
const TOKEN_KEY = 'hh_app_token'
const USER_KEY = 'hh_app_user'
// 会会短信登录的本地会话(打通 会会 userId ↔ 本系统用户)
export const useUserStore = defineStore('smsuser', () => {
const token = ref<string>('')
const user = ref<(UserProfile & { huihuiUserId?: string; phone?: string }) | null>(null)
const isLogin = ref(false)
// 启动时从本地恢复会话
const loadFromStorage = () => {
const t = localStorage.getItem(TOKEN_KEY)
const u = localStorage.getItem(USER_KEY)
if (t && u) {
try {
token.value = t
user.value = JSON.parse(u)
isLogin.value = true
setAuthToken(t)
} catch {
clearLocal()
}
}
}
const persist = () => {
localStorage.setItem(TOKEN_KEY, token.value)
localStorage.setItem(USER_KEY, JSON.stringify(user.value))
}
const clearLocal = () => {
localStorage.removeItem(TOKEN_KEY)
localStorage.removeItem(USER_KEY)
}
// 发送验证码(返回结果,演示模式含 devCode
const sendCode = async (phone: string) => {
return await sendSmsCode(phone)
}
// 短信登录
const login = async (phone: string, code: string) => {
const res: any = await loginBySms(phone, code)
token.value = res.token
user.value = { ...(res.user || {}), ...(res.huihui || {}) }
isLogin.value = true
setAuthToken(res.token)
persist()
return res
}
// 账号密码登录
const loginByPwd = async (account: string, password: string) => {
const res: any = await loginByPassword(account, password)
token.value = res.token
user.value = { ...(res.user || {}), ...(res.huihui || {}) }
isLogin.value = true
setAuthToken(res.token)
persist()
return res
}
// 退出
const logout = async () => {
try {
await logoutUser()
} catch {
/* 忽略网络错误,本地清除即可 */
}
token.value = ''
user.value = null
isLogin.value = false
setAuthToken(null)
clearLocal()
}
return { token, user, isLogin, loadFromStorage, sendCode, login, loginByPwd, logout }
})