From b9bd29a1a81f6f7de479e3cc3fdfe3d85fc660bf Mon Sep 17 00:00:00 2001
From: he wei <858544502@qq.com>
Date: 星期三, 23 四月 2025 13:35:06 +0800
Subject: [PATCH] UA 整理提交

---
 src/store/user.js |  194 +++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 174 insertions(+), 20 deletions(-)

diff --git a/src/store/user.js b/src/store/user.js
index 71283c0..92ef5a2 100644
--- a/src/store/user.js
+++ b/src/store/user.js
@@ -1,21 +1,175 @@
-import { defineStore } from "pinia";
+import { defineStore, storeToRefs } from "pinia";
+import pinia from '@/utils/pinia';
+import { ref } from "vue";
+import { login as apiLogin, logout as apiLogout, getPermits } from '@/api/user';
+import { getToken, removeToken, setToken, getUname, setUname, removeUname, getUrole, setUrole, removeUrole, getSessionId, setSessionId, removeSessionId } from '@/utils/auth';
+import router, { resetRouter } from '@/router';
+import { useTagsViewStore } from './tagsView';
+import { usePermissionStore } from './permission';
+console.log('pinia', pinia, '=============');
 
-export const useUserStore = defineStore("user", () => ({
-  state() {
-    return {
-      uid: localStorage.getItem("uid"),
-      uname: localStorage.getItem("uname")
-    };
-  },
-  actions: {
-    setName(value) {
-      this.uname = value;
-      localStorage.setItem("uname", value);
-    },
-    setId(value) {
-      this.uid = value;
-      localStorage.setItem("uid", value);
-    },
-  },
-  getters: {},
-}));
+const tagsViewStore = useTagsViewStore(pinia);
+const permissionStore = usePermissionStore(pinia);
+const { delAllViews } = tagsViewStore;
+const { generateRoutes } = permissionStore;
+
+export const useUserStore = defineStore("user", () => {
+  const uid = ref(localStorage.getItem("uid"));
+  const uname = ref(localStorage.getItem("uname"));
+  const token = ref(getToken());
+  const urole = ref(getUrole());
+  const sessionid = ref(getSessionId());
+  const introduction = ref("");
+  const roles = ref([]);
+  const avatar = ref("");
+  let _permits = localStorage.getItem("permits");
+  const permits = ref(_permits ? JSON.parse(_permits) : []);
+
+  function updateSessionId(_sessionid) {
+    setSessionId(_sessionid);
+    sessionid.value = _sessionid;
+  }
+
+  function setPermits(_data) {
+    permits.value = Array.isArray(_data) ? _data : [];
+    localStorage.setItem('permits', JSON.stringify(_data));
+  }
+
+  function updatePermits() {
+    getPermits().then(res => {
+      setPermits(res.data2);
+    }).catch(error => {
+        console.log(error);
+    });
+  }
+
+  function login(userInfo) {
+    const { username, password } = userInfo;
+    return new Promise((resolve, reject) => {
+      apiLogin(username.trim(), password).then((response) => {
+        if (response.code === 1 && response.data) {
+          let name = response.data2.uname;
+          let role = response.data2.urole;
+          uname.value = name;
+          setUname(name);
+          token.value = 'admin';
+          setToken('admin');
+          urole.value = role;
+          setUrole(role);
+          resolve(response);
+          updatePermits();
+        } else {
+          // reject('鐢ㄦ埛鍚�/瀵嗙爜閿欒');
+          reject(response.msg);
+        }
+      }).catch(error => {
+        reject(error);
+      });
+    });
+  }
+
+  function 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'
+        name: getUname()
+      };
+      const { roles: _roles, name, avatar: _avatar, introduction: _introduction } = data;
+      roles.value = _roles;
+      uname.value = name;
+      avatar.value = _avatar;
+      introduction.value = _introduction;
+      
+      resolve(data);
+    });
+  }
+
+  function logout() {
+    return new Promise((resolve, reject) => {
+      apiLogout().then(() => {
+        token.value = '';
+        roles.value = [];
+        removeToken();
+        removeUname();
+        removeUrole();
+        resetRouter();
+
+        // reset visited views and cached views
+        // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
+        delAllViews();
+
+        resolve();
+      }).catch(error => {
+        reject(error);
+      });
+    });
+  }
+
+  function resetToken() {
+    token.value = '';
+    roles.value = [];
+    removeToken();
+  }
+
+  async function changeRoles(role) {
+    const _token = role + '-token';
+
+    token.value = _token;
+    setToken(_token);
+
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    const infoRes = await getInfo();
+    let _roles = [];
+    if (infoRes.roles) {
+      _roles = infoRes.roles;
+    }
+
+    resetRouter();
+
+    // generate accessible routes map based on roles
+    console.log('debug', _roles, '=============');
+    
+    const accessRoutes = await generateRoutes(_roles);
+    // dynamically add accessible routes
+    // router.addRoutes(accessRoutes);
+    accessRoutes.forEach(item => {
+      router.addRoute(item);
+    });
+
+    // reset visited views and cached views
+    delAllViews();
+  }
+
+  function setName(value) {
+    uname.value = value;
+    localStorage.setItem("uname", value);
+  }
+
+  function setId(value) {
+    uid.value = value;
+    localStorage.setItem("uid", value);
+  }
+  
+  return {
+    uid,
+    uname,
+    permits,
+    token,
+    urole,
+    sessionid,
+    introduction,
+    roles,
+    avatar,
+    login,
+    logout,
+    getInfo,
+    resetToken,
+    changeRoles,
+    setName,
+    setId,
+    updateSessionId
+  }
+});

--
Gitblit v1.9.1