Files
jindengchen-ai-report/cool-unix/cool/store/user.ts

186 lines
3.6 KiB
TypeScript
Raw Normal View History

2025-11-13 10:36:23 +08:00
import { computed, ref } from "vue";
import { forInObject, isNull, isObject, parse, storage } from "../utils";
import { router } from "../router";
import { request } from "../service";
import type { UserInfo } from "@/types";
export type Token = {
token: string; // 访问token
expire: number; // token过期时间
refreshToken: string; // 刷新token
refreshExpire: number; // 刷新token过期时间
};
export class User {
/**
*
*/
info = ref<UserInfo | null>(null);
/**
* tokennull
*/
token: string | null = null;
constructor() {
// 获取本地用户信息
const userInfo = storage.get("userInfo");
// 获取本地token
const token = storage.get("token") as string | null;
// 如果token为空字符串则置为null
this.token = token == "" ? null : token;
// 初始化用户信息
if (userInfo != null && isObject(userInfo)) {
this.set(userInfo);
}
}
/**
*
* @returns Promise<void>
*/
async get() {
if (this.token != null) {
await request({
url: "/app/user/info/person"
})
.then((res) => {
if (res != null) {
this.set(res);
}
})
.catch(() => {
// this.logout();
});
}
}
/**
*
* @param data
*/
set(data: any) {
if (isNull(data)) {
return;
}
// 设置
this.info.value = parse<UserInfo>(data)!;
// 持久化到本地存储
storage.set("userInfo", data, 0);
}
/**
*
* @param data
*/
async update(data: any) {
if (isNull(data) || isNull(this.info.value)) {
return;
}
// 本地同步更新
forInObject(data, (value, key) => {
this.info.value![key] = value;
});
// 同步到服务端
await request({
url: "/app/user/info/updatePerson",
method: "POST",
data
});
}
/**
*
*/
remove() {
this.info.value = null;
storage.remove("userInfo");
}
/**
*
* @returns boolean
*/
isNull() {
return this.info.value == null;
}
/**
* token
*/
clear() {
storage.remove("userInfo");
storage.remove("token");
storage.remove("refreshToken");
this.token = null;
this.remove();
}
/**
* 退
*/
logout() {
this.clear();
router.login();
}
/**
* token并存储到本地
* @param data Token对象
*/
setToken(data: Token) {
this.token = data.token;
// 访问token提前5秒过期防止边界问题
storage.set("token", data.token, data.expire - 5);
// 刷新token提前5秒过期
storage.set("refreshToken", data.refreshToken, data.refreshExpire - 5);
}
/**
* tokentoken
* @returns Promise<string> token
*/
refreshToken(): Promise<string> {
return new Promise((resolve, reject) => {
request({
url: "/app/user/login/refreshToken",
method: "POST",
data: {
refreshToken: storage.get("refreshToken")
}
})
.then((res) => {
if (res != null) {
const token = parse<Token>(res);
if (token != null) {
this.setToken(token);
resolve(token.token);
}
}
})
.catch((err) => {
reject(err);
});
});
}
}
/**
*
*/
export const user = new User();
/**
*
*/
export const userInfo = computed(() => user.info.value);