import { pinia } from "@/pinia" import { LoginData } from "@/common/apis/ab98/type" // 本地存储键名常量 const STORAGE_KEYS = { FACE: 'ab98_face', SEX: 'ab98_sex', NAME: 'ab98_name', USERID: 'ab98_userid', REGISTERED: 'ab98_registered', TEL: 'ab98_tel', TOKEN: 'ab98_token' } /** * AB98用户信息存储 * @description 管理AB98系统用户相关状态信息 */ export const useAb98UserStore = defineStore("ab98User", () => { // 用户面部图像URL const storedFace = localStorage.getItem(STORAGE_KEYS.FACE) const face_img = ref(storedFace ? atob(storedFace) : '') // 用户性别(男/女) const storedSex = localStorage.getItem(STORAGE_KEYS.SEX) const sex = ref(storedSex ? atob(storedSex) : '') // 用户真实姓名 const storedName = localStorage.getItem(STORAGE_KEYS.NAME) const name = ref(storedName ? atob(storedName) : '') // AB98系统用户唯一标识 const storedUserId = localStorage.getItem(STORAGE_KEYS.USERID) const userid = ref(storedUserId ? atob(storedUserId) : "") // 是否已完成注册流程 const registered = ref(JSON.parse(localStorage.getItem(STORAGE_KEYS.REGISTERED) || "false")) // 用户绑定手机号 const storedTel = localStorage.getItem(STORAGE_KEYS.TEL) const tel = ref(storedTel ? atob(storedTel) : "") // 用户认证令牌 const storedToken = localStorage.getItem(STORAGE_KEYS.TOKEN) const token = ref(storedToken ? atob(storedToken) : "") // 用户登录状态 const isLogin = ref(false); isLogin.value = tel.value ? true : false; /** * 更新用户基本信息 * @param data - 登录接口返回的用户数据 */ const setUserInfo = (data: LoginData) => { face_img.value = data.face_img localStorage.setItem(STORAGE_KEYS.FACE, btoa(data.face_img)) sex.value = data.sex localStorage.setItem(STORAGE_KEYS.SEX, btoa(data.sex)) name.value = data.name localStorage.setItem(STORAGE_KEYS.NAME, btoa(data.name)) userid.value = data.userid localStorage.setItem(STORAGE_KEYS.USERID, btoa(data.userid)) registered.value = data.registered localStorage.setItem(STORAGE_KEYS.REGISTERED, JSON.stringify(data.registered)) tel.value = data.tel localStorage.setItem(STORAGE_KEYS.TEL, btoa(data.tel)) } /** * 清空用户敏感信息 * @description 用于用户登出或会话过期时 */ const clearUserInfo = () => { face_img.value = "" localStorage.removeItem(STORAGE_KEYS.FACE) sex.value = "" localStorage.removeItem(STORAGE_KEYS.SEX) name.value = "" localStorage.removeItem(STORAGE_KEYS.NAME) userid.value = "" localStorage.removeItem(STORAGE_KEYS.USERID) registered.value = false localStorage.removeItem(STORAGE_KEYS.REGISTERED) tel.value = "" localStorage.removeItem(STORAGE_KEYS.TEL) localStorage.removeItem(STORAGE_KEYS.TOKEN) } /** * 设置认证令牌 * @param value - JWT格式的认证令牌 */ const setToken = (value: string) => { localStorage.setItem(STORAGE_KEYS.TOKEN, btoa(value)) token.value = value } const setTel = (value: string) => { localStorage.setItem(STORAGE_KEYS.TEL, btoa(value)) tel.value = value } const setIsLogin = (value: boolean) => { isLogin.value = value; } return { face_img, sex, name, userid, registered, tel, token, isLogin, setUserInfo, setToken, setTel, setIsLogin, clearUserInfo } }) /** * @description 在非setup上下文或SSR场景中使用store */ export function useAb98UserStoreOutside() { return useAb98UserStore(pinia) }