import { defineStore } from 'pinia'; import { login as apiLogin, logout as apiLogout } from '@/api/user'; import { getToken, removeToken, setToken, getUname, setUname, removeUname, getUrole, setUrole, removeUrole } 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: getUname(), avatar: '', urole: getUrole(), 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) { let name = response.data2.uname; let role = response.data2.urole; this.name = name; setUname(name); this.token = 'admin'; setToken('admin'); this.urole = role; setUrole(role); resolve(response); } else { // reject('用户名/密码错误'); reject(response.msg); } }).catch(error => { reject(error); }); });u }, // 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' name: getUname() }; 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(); removeUname(); removeUrole(); 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(); } } });