鸿蒙智能电子锁前端项目
whychdw
2024-12-18 45b4ff5c0b824d2e5b51a6af3c44076d05f0214d
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { defineStore } from 'pinia';
import { login as apiLogin, logout as apiLogout } from '@/api/user';
import { getToken, removeToken, setToken } from '@/utils/auth';
import router, { resetRouter } from '@/router';
import tagsViewStore from './tagsView';
import permissionStore from './permission';
 
export default defineStore({
  id: 'user',
  state: () => ({
    token: getToken(),
    userId: '',
    name: '',
    avatar: '',
    introduction: '',
    roles: []
  }),
  getters: {},
  actions: {
    // user login
    login(userInfo) {
      const { username, password } = userInfo;
      return new Promise((resolve, reject) => {
        apiLogin(username.trim(), password).then((response) => {
          if (response.code === 1 && response.data) {
            this.token = 'admin';
            setToken('admin');
            resolve(response);
          } else {
            reject('用户名/密码错误');
          }
        }).catch(error => {
          reject(error);
        });
      });
    },
 
    // get user info
    getInfo() {
      return new Promise((resolve) => {
        const data = {
          roles: ['admin'],
          introduction: 'I am a super administrator',
          avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
          name: 'Super Admin'
        };
        const { roles, name, avatar, introduction } = data;
        this.roles = roles;
        this.name = name;
        this.avatar = avatar;
        this.introduction = introduction;
        resolve(data);
      });
    },
 
    // user logout
    logout() {
      return new Promise((resolve, reject) => {
        apiLogout().then(() => {
          this.token = '';
          this.roles = [];
          removeToken();
          resetRouter();
 
          // reset visited views and cached views
          // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
          tagsViewStore().delAllViews();
 
          resolve();
        }).catch(error => {
          reject(error);
        });
      });
    },
 
    // remove token
    resetToken() {
      this.token = '';
      this.roles = [];
      removeToken();
    },
 
    // dynamically modify permissions
    async changeRoles(role) {
      const token = role + '-token';
 
      this.token = token;
      setToken(token);
 
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      const infoRes = await this.getInfo();
      let roles = [];
      if (infoRes.roles) {
        roles = infoRes.roles;
      }
 
      resetRouter();
 
      // generate accessible routes map based on roles
      const accessRoutes = await permissionStore().generateRoutes(roles);
      // dynamically add accessible routes
      // router.addRoutes(accessRoutes);
      accessRoutes.forEach(item => {
        router.addRoute(item);
      });
 
      // reset visited views and cached views
      tagsViewStore().delAllViews();
    }
  }
});