wangzhibo
4 天以前 10595d8632f959d0954d1939243196f4eed02372
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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 };