// 会话管理:真实登录/注册,token + 资料持久化到 localStorage import { reactive } from 'vue' import { api } from '../api/index.js' const STORAGE_KEY = 'xpx_session' export const session = reactive({ token: '', profile: null, ready: false }) function persist() { try { localStorage.setItem(STORAGE_KEY, JSON.stringify({ token: session.token, profile: session.profile })) } catch (e) { /* ignore */ } } function applySession(data) { session.token = data.token session.profile = data.profile session.ready = true persist() } // 首屏同步读取本地缓存(供路由守卫判断登录态) export function hydrateSession() { try { const raw = localStorage.getItem(STORAGE_KEY) if (raw) { const data = JSON.parse(raw) if (data && data.token && data.profile) { session.token = data.token session.profile = data.profile } } } catch (e) { /* ignore */ } session.ready = true } export function isLoggedIn() { return !!session.token && !!session.profile } // 登录(手机号 + 密码) export async function login(phone, password) { const data = await api.login(phone, password) applySession(data) return session.profile } // 注册(返回后自动登录) export async function register(payload) { const data = await api.register(payload) applySession(data) return session.profile } // 退出登录 export function logout() { session.token = '' session.profile = null try { localStorage.removeItem(STORAGE_KEY) } catch (e) { /* ignore */ } } // 需要已登录的资料(未登录时抛错,配合路由守卫使用) export async function ensureLogin() { if (session.profile) return session.profile throw new Error('未登录') }