108 lines
2.6 KiB
TypeScript
108 lines
2.6 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
|
|
import { getToken, setToken, removeToken } from '@/utils/auth';
|
|
import { loginApi, logoutApi } from '@/api/auth';
|
|
import { getUserInfo } from '@/api/user';
|
|
import { resetRouter } from '@/router';
|
|
import { store } from '@/store';
|
|
import { LoginData } from '@/api/auth/types';
|
|
import { ref } from 'vue';
|
|
import { UserInfo } from '@/api/user/types';
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
// state
|
|
const Token = ref<string>(getToken() || '');
|
|
const nickname = ref<string>('');
|
|
const userId = ref<string>('');
|
|
const avatar = ref<string>('');
|
|
const roles = ref<Array<string>>([]); // 用户角色编码集合 → 判断路由权限
|
|
const perms = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
|
|
const badgeval = ref('')
|
|
|
|
// actions
|
|
|
|
// 登录
|
|
function login(loginData: LoginData) {
|
|
return new Promise<void>((resolve, reject) => {
|
|
loginApi(loginData)
|
|
.then(response => {
|
|
const { token } = response.data;
|
|
Token.value = token;
|
|
setToken(token);
|
|
resolve();
|
|
})
|
|
.catch(error => {
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
|
|
// 获取信息(用户昵称、头像、角色集合、权限集合)
|
|
function getInfo() {
|
|
return new Promise<UserInfo>((resolve, reject) => {
|
|
getUserInfo()
|
|
.then(({ data }) => {
|
|
if (!data) {
|
|
return reject('Verification failed, please Login again.');
|
|
}
|
|
if (!data.roles || data.roles.length <= 0) {
|
|
reject('getUserInfo: roles must be a non-null array!');
|
|
}
|
|
nickname.value = data.userInfo.nickname;
|
|
userId.value = data.userInfo.id;
|
|
avatar.value = data.userInfo.avatar;
|
|
roles.value = data.roles;
|
|
perms.value = data.permissions;
|
|
resolve(data);
|
|
})
|
|
.catch(error => {
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
|
|
// 注销
|
|
function logout() {
|
|
return new Promise<void>((resolve, reject) => {
|
|
logoutApi()
|
|
.then(() => {
|
|
resetRouter();
|
|
resetToken();
|
|
resolve();
|
|
})
|
|
.catch(error => {
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
|
|
// 重置
|
|
function resetToken() {
|
|
removeToken();
|
|
Token.value = '';
|
|
nickname.value = '';
|
|
userId.value = '';
|
|
avatar.value = '';
|
|
roles.value = [];
|
|
perms.value = [];
|
|
}
|
|
return {
|
|
Token,
|
|
nickname,
|
|
userId,
|
|
avatar,
|
|
roles,
|
|
perms,
|
|
login,
|
|
getInfo,
|
|
logout,
|
|
resetToken,
|
|
badgeval
|
|
};
|
|
});
|
|
|
|
// 非setup
|
|
export function useUserStoreHook() {
|
|
return useUserStore(store);
|
|
}
|