user.ts
1.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { defineStore } from "pinia";
import { ref, computed } from "vue";
export const useUserStore = defineStore("user", () => {
// State
const token = ref(localStorage.getItem("token") || "");
const userInfo = ref(JSON.parse(localStorage.getItem("userInfo") || "null"));
// Getters
const isAuthenticated = computed(() => !!token.value);
const userName = computed(() => userInfo.value?.name || "游客");
const userAvatar = computed(() => userInfo.value?.avatar || "");
// Actions
function setToken(newToken: string) {
token.value = newToken;
localStorage.setItem("token", newToken);
}
function setUserInfo(info: any) {
userInfo.value = info;
localStorage.setItem("userInfo", JSON.stringify(info));
}
async function login(_credentials: any) {
try {
// TODO: 调用登录 API
// const response = await loginAPI(credentials);
// setToken(response.data.token);
// setUserInfo(response.data.user);
// 模拟登录
setToken("mock-token-123456");
setUserInfo({
id: 1,
name: "张三",
email: "zhangsan@example.com",
avatar: "",
});
return { success: true };
} catch (error) {
return { success: false, error: (error as Error).message };
}
}
function logout() {
token.value = "";
userInfo.value = null;
localStorage.removeItem("token");
localStorage.removeItem("userInfo");
}
return {
// state
token,
userInfo,
// getters
isAuthenticated,
userName,
userAvatar,
// actions
setToken,
setUserInfo,
login,
logout,
};
});