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('') 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 } })