shop-web/src/pinia/stores/ab98-user.ts

137 lines
4.3 KiB
TypeScript
Raw Normal View History

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',
LOGIN_CODE: 'ab98_login_code'
}
/**
* AB98用户信息存储
* @description AB98系统用户相关状态信息
*/
export const useAb98UserStore = defineStore("ab98User", () => {
// 用户面部图像URL
const storedFace = localStorage.getItem(STORAGE_KEYS.FACE)
const face_img = ref<string>(storedFace ? decodeURIComponent(storedFace) : '')
// 用户性别(男/女)
const storedSex = localStorage.getItem(STORAGE_KEYS.SEX)
const sex = ref<string>(storedSex ? decodeURIComponent(storedSex) : '')
// 用户真实姓名
const storedName = localStorage.getItem(STORAGE_KEYS.NAME)
const name = ref<string>(storedName ? decodeURIComponent(storedName) : '')
// AB98系统用户唯一标识
const storedUserId = localStorage.getItem(STORAGE_KEYS.USERID)
const userid = ref<string>(storedUserId ? decodeURIComponent(storedUserId) : "")
// 是否已完成注册流程
const registered = ref<boolean>(JSON.parse(localStorage.getItem(STORAGE_KEYS.REGISTERED) || "false"))
// 用户绑定手机号
const storedTel = localStorage.getItem(STORAGE_KEYS.TEL)
const tel = ref<string>(storedTel ? decodeURIComponent(storedTel) : "")
// 用户认证令牌
const storedToken = localStorage.getItem(STORAGE_KEYS.TOKEN)
const token = ref<string>(storedToken ? decodeURIComponent(storedToken) : "");
const tokenLogin = ref<string>("");
// 登录验证码
const loginCode = '1'; // 默认验证码
// 用户登录状态
const isLogin = ref<boolean>(false);
const storedLoginCode = localStorage.getItem(STORAGE_KEYS.LOGIN_CODE);
isLogin.value = tel.value && storedLoginCode === String(loginCode) ? true : false;
/**
*
* @param data -
*/
const setUserInfo = (data: LoginData) => {
face_img.value = data.face_img
localStorage.setItem(STORAGE_KEYS.FACE, encodeURIComponent(data.face_img))
sex.value = data.sex
localStorage.setItem(STORAGE_KEYS.SEX, encodeURIComponent(data.sex))
name.value = data.name
localStorage.setItem(STORAGE_KEYS.NAME, encodeURIComponent(data.name))
userid.value = data.userid
localStorage.setItem(STORAGE_KEYS.USERID, encodeURIComponent(data.userid))
registered.value = data.registered
localStorage.setItem(STORAGE_KEYS.REGISTERED, JSON.stringify(data.registered))
tel.value = data.tel
localStorage.setItem(STORAGE_KEYS.TEL, encodeURIComponent(data.tel))
localStorage.setItem(STORAGE_KEYS.LOGIN_CODE, encodeURIComponent(loginCode))
}
/**
*
* @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)
localStorage.removeItem(STORAGE_KEYS.LOGIN_CODE)
}
/**
*
* @param value - JWT格式的认证令牌
*/
const setToken = (value: string) => {
localStorage.setItem(STORAGE_KEYS.TOKEN, encodeURIComponent(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;
}
const setTokenLogin = (value: string) => {
tokenLogin.value = value;
}
return {
face_img,
sex,
name,
userid,
registered,
tel,
token,
isLogin,
tokenLogin,
setUserInfo,
setToken,
setTel,
setIsLogin,
clearUserInfo,
setTokenLogin
}
})
/**
* @description setup上下文或SSR场景中使用store
*/
export function useAb98UserStoreOutside() {
return useAb98UserStore(pinia)
}