问题工单后台管理
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.3 KiB

1 year ago
import { defineStore } from 'pinia';
import type { RouteRecordRaw } from 'vue-router';
import { store } from '@/store';
import { login, getUserInfo } from '@/api/login';
1 year ago
import { ACCESS_TOKEN_KEY } from '@/enums/cacheEnum';
import { ACCESS_TOKEN_NAME } from '@/enums/cacheEnum';
1 year ago
import { Storage } from '@/utils/Storage';
import { logout, getInfo, permmenu } from '@/api/account';
// 动态路由生成
import { generatorDynamicRouter } from '@/router/generator-router';
import { resetRouter } from '@/router';
interface UserState {
token: string;
tokenName: string;
1 year ago
name: string;
avatar: string;
// like [ 'sys:user:add', 'sys:user:update' ]
perms: string[];
menus: RouteRecordRaw[];
userInfo: Partial<API.AdminUserInfo>;
}
const userInfo = {};
1 year ago
const perms = [];
1 year ago
const menus = [];
export const useUserStore = defineStore({
id: 'user',
state: (): UserState => ({
token: Storage.get(ACCESS_TOKEN_KEY, null),
tokenName: Storage.get(ACCESS_TOKEN_NAME, null),
1 year ago
name: 'amdin',
avatar: '',
perms: [],
menus: [],
userInfo: {},
}),
getters: {
getToken(): string {
return this.token;
},
getAvatar(): string {
return this.avatar;
},
getName(): string {
return this.name;
},
getPerms(): string[] {
return this.perms;
},
},
actions: {
/** 清空token及用户信息 */
resetToken() {
this.avatar = this.token = this.name = '';
this.perms = [];
this.menus = [];
this.userInfo = {};
Storage.clear();
},
/** 登录成功保存token */
setToken(token: string, tokenName: string) {
1 year ago
this.token = token ?? '';
this.tokenName = tokenName ?? '';
1 year ago
const ex = 7 * 24 * 60 * 60 * 1000;
Storage.set(ACCESS_TOKEN_KEY, this.token, ex);
Storage.set(ACCESS_TOKEN_NAME, this.tokenName, ex);
1 year ago
},
/** 登录 */
async login(params: API.LoginParams) {
try {
const res = await login(params);
console.log('res2222: ', res);
this.setToken(res.tokenValue, res.tokenName);
1 year ago
return this.afterLogin();
} catch (error) {
console.log('error: ', error);
return Promise.reject(error);
}
},
/** 登录成功之后, 获取用户信息以及生成权限路由 */
async afterLogin() {
try {
// const [userInfo, { perms, menus }] = await Promise.all([getInfo(), permmenu()]);
const userInfo = await getUserInfo();
console.log('userInfo: ', userInfo);
// this.perms = perms;
this.name = userInfo.account;
// this.avatar = userInfo.headImg;
this.userInfo = {
...userInfo,
name: userInfo.account,
username: userInfo.username,
};
1 year ago
// 生成路由
const generatorResult = await generatorDynamicRouter([]);
console.timeEnd('generatorDynamicRouter');
this.menus = generatorResult.menus.filter((item) => !item.meta?.hideInMenu);
console.log('this.menus: ', this.menus);
return { menus, perms, userInfo };
} catch (error) {
return this.logout();
}
},
/** 登出 */
async logout() {
this.resetToken();
resetRouter();
},
},
});
// 在组件setup函数外使用
export function useUserStoreWithOut() {
return useUserStore(store);
}