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();
|
}
|
}
|
});
|