import { defineStore } from 'pinia'; import {login as apiLogin, logout as apiLogout, getInfo as apiGetInfo, } from '@/api/user'; import { getToken, setToken, removeToken } from '@/utils/auth'; import router, { resetRouter } from '@/router'; import tagsViewStore from './tagsView'; import permissionStore from './permission'; export interface IUserState { token: string; userId: string, name: string; avatar: string; introduction: string; roles: string[]; } export default defineStore({ id: 'user', state: ():{ address: string; signature: string; sex: string; roles: any[]; description: string; avatar: string; token: any; phone: string; nickname: string; id: string; email: string; age: string; username: string } => ({ token: getToken(), id:'', username:'', address:'', phone:'', email:'', age:'', signature:'', avatar:'', nickname:'', sex:'', description:'', roles:['admin'] }), getters: {}, actions: { // user login login(userInfo):Promise { const { username, password } = userInfo; return new Promise((resolve, reject) => { apiLogin({ user: username.trim(), password: password }).then(response => { const { data } = response; this.token = data.token; setToken(data.token); console.log("token", this.token) router.push('/') resolve(); console.log('2222',response) }).catch(error => { console.log('3333',error) reject(error); }); }); }, // get user info getInfo() { return new Promise((resolve, reject) => { apiGetInfo(this.token).then(response => { const { data } = response; console.log('66666',data) if (!data) { reject('Verification failed, please Login again.'); } const { id,username,address,phone,email,age,signature,avatar,nickname,sex,description } = data; // roles must be a non-empty array // if (!roles || roles.length <= 0) { // reject('getInfo: roles must be a non-null array!'); // } this.id = id; // this.roles = roles; // this.roles =['admin']; this.username = username; this.avatar = avatar; this.description = description; this.sex = sex; this.age = age; this.address = address; this.phone = phone; this.email = email; this.signature = signature; this.nickname = nickname; resolve(data); }).catch(error => { reject(error); }); }); }, // user logout logout():Promise { console.log("token",this.token) return new Promise((resolve, reject) => { apiLogout(this.token).then(() => { this.token = ''; this.roles = []; console.log('退出',this.token) 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() as any; let roles : any[] = []; if (infoRes.roles) { roles = infoRes.roles; } roles = ['admin'] 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(); } } });