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.
166 lines
3.9 KiB
166 lines
3.9 KiB
|
1 year ago
|
import { defineStore } from 'pinia';
|
||
|
|
import type { RouteRecordRaw } from 'vue-router';
|
||
|
|
import { store } from '@/store';
|
||
|
|
import { login } from '@/api/login';
|
||
|
|
import { ACCESS_TOKEN_KEY } from '@/enums/cacheEnum';
|
||
|
|
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;
|
||
|
|
name: string;
|
||
|
|
avatar: string;
|
||
|
|
// like [ 'sys:user:add', 'sys:user:update' ]
|
||
|
|
perms: string[];
|
||
|
|
menus: RouteRecordRaw[];
|
||
|
|
userInfo: Partial<API.AdminUserInfo>;
|
||
|
|
}
|
||
|
|
|
||
|
|
const userInfo = {
|
||
|
|
name: '路飞',
|
||
|
|
nickName: '',
|
||
|
|
email: 'qa894178522@qq.com',
|
||
|
|
phone: '15622472425',
|
||
|
|
remark: null,
|
||
|
|
headImg: 'https://buqiyuan.gitee.io/img/logo.jpg',
|
||
|
|
loginIp: '112.20.118.45',
|
||
|
|
};
|
||
|
|
|
||
|
|
const perms = [
|
||
|
|
'sys:user:add',
|
||
|
|
'sys:user:delete',
|
||
|
|
'sys:menu:add',
|
||
|
|
'sys:menu:delete',
|
||
|
|
'sys:menu:list',
|
||
|
|
'sys:menu:info',
|
||
|
|
'sys:menu:update',
|
||
|
|
'sys:dept:move',
|
||
|
|
'sys:role:delete',
|
||
|
|
'sys:role:add',
|
||
|
|
'sys:role:update',
|
||
|
|
'sys:role:list',
|
||
|
|
'sys:role:page',
|
||
|
|
'sys:role:info',
|
||
|
|
'sys:dept:list',
|
||
|
|
'sys:dept:info',
|
||
|
|
'sys:user:page',
|
||
|
|
'sys:user:info',
|
||
|
|
'sys:user:update',
|
||
|
|
'sys:dept:transfer',
|
||
|
|
'sys:dept:add',
|
||
|
|
'sys:dept:delete',
|
||
|
|
'sys:dept:update',
|
||
|
|
'sys:online:list',
|
||
|
|
'sys:online:kick',
|
||
|
|
'sys:log:login:page',
|
||
|
|
'sys:task:page',
|
||
|
|
'sys:task:info',
|
||
|
|
'sys:task:add',
|
||
|
|
'sys:task:update',
|
||
|
|
'sys:task:once',
|
||
|
|
'sys:task:start',
|
||
|
|
'sys:task:stop',
|
||
|
|
'sys:task:delete',
|
||
|
|
'sys:log:task:page',
|
||
|
|
'sys:user:password',
|
||
|
|
'netdisk:manage:list',
|
||
|
|
'netdisk:manage:mkdir',
|
||
|
|
'netdisk:manage:token',
|
||
|
|
'netdisk:manage:rename',
|
||
|
|
'netdisk:manage:check',
|
||
|
|
'netdisk:manage:download',
|
||
|
|
'netdisk:manage:info',
|
||
|
|
'netdisk:manage:mark',
|
||
|
|
'netdisk:manage:copy',
|
||
|
|
];
|
||
|
|
|
||
|
|
const menus = [];
|
||
|
|
|
||
|
|
export const useUserStore = defineStore({
|
||
|
|
id: 'user',
|
||
|
|
state: (): UserState => ({
|
||
|
|
token: Storage.get(ACCESS_TOKEN_KEY, null),
|
||
|
|
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) {
|
||
|
|
this.token = token ?? '';
|
||
|
|
const ex = 7 * 24 * 60 * 60 * 1000;
|
||
|
|
Storage.set(ACCESS_TOKEN_KEY, this.token, ex);
|
||
|
|
},
|
||
|
|
/** 登录 */
|
||
|
|
async login(params: API.LoginParams) {
|
||
|
|
try {
|
||
|
|
// const { data } = await login(params);
|
||
|
|
// this.setToken(data.accessToken);
|
||
|
|
this.setToken('111');
|
||
|
|
|
||
|
|
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()]);
|
||
|
|
this.perms = perms;
|
||
|
|
this.name = userInfo.name;
|
||
|
|
this.avatar = userInfo.headImg;
|
||
|
|
this.userInfo = userInfo as any;
|
||
|
|
// 生成路由
|
||
|
|
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);
|
||
|
|
}
|