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, '============='); 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); let _token = 'someone'; debugger; if (response.data2.uid && response.data2.uid <= 10000) { _token = 'manager'; if (response.data2.uid <= 100) { _token = 'admin'; } } token.value = _token; setToken(_token); 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'], roles: [token.value], introduction: 'I am a super administrator', avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', // name: 'Super Admin' name: uname.value }; 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) { debugger; 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 } });