automated_uniapp/cool/store/user.ts
2025-01-09 16:16:11 +08:00

95 lines
1.8 KiB
TypeScript

import { defineStore } from "pinia";
import { ref } from "vue";
import { deepMerge, storage } from "../utils";
import { router } from "../router";
import { service } from "../service";
import type { User } from "../types";
// 本地缓存
const data = storage.info();
const useUserStore = defineStore("user", function () {
// 标识
const token = ref(data.token || "");
// 设置标识
function setToken(data: User.Token) {
token.value = data.token;
// 访问
storage.set("token", data.token, data.expire - 5);
// 刷新
storage.set("refreshToken", data.refreshToken, data.refreshExpire - 5);
}
// 刷新标识
async function refreshToken() {
return service.user.login
.refreshToken({
refreshToken: storage.get("refreshToken"),
})
.then((res) => {
setToken(res);
return res.token;
});
}
// 用户信息
const info = ref<User.Info | undefined>(data.userInfo);
// 设置用户信息
function set(value: User.Info) {
info.value = value;
storage.set("userInfo", value);
}
// 更新用户信息
async function update(data: User.Info & { [key: string]: any }) {
set(deepMerge(info.value, data));
return service.user.info.updatePerson(data);
}
// 清除用户
function clear() {
storage.remove("userInfo");
storage.remove("token");
storage.remove("refreshToken");
token.value = "";
info.value = undefined;
}
// 退出
function logout() {
clear();
router.login({ reLaunch: true });
}
// 获取用户信息
async function get() {
return service.user.info
.person()
.then((res) => {
if (res) {
set(res);
}
return res;
})
.catch(() => {
logout();
});
}
return {
token,
setToken,
refreshToken,
info,
get,
set,
update,
logout,
};
});
export { useUserStore };