Files
leaser_front/src/store/modules/user/index.ts
T

146 lines
3.4 KiB
TypeScript
Raw Normal View History

2025-06-22 23:55:55 +08:00
import { defineStore } from 'pinia';
import {
login as userLogin,
logout as userLogout,
getUserInfo,
LoginData,
getUserPermission,
} from '@/api/user';
import { setToken, clearToken } from '@/utils/auth';
import { removeRouteListener } from '@/utils/route-listener';
import { UserState } from './types';
import useAppStore from '../app';
const useUserStore = defineStore('user', {
state: (): UserState => ({
name: undefined,
avatar: undefined,
job: undefined,
organization: undefined,
location: undefined,
email: undefined,
introduction: undefined,
personalWebsite: undefined,
jobName: undefined,
organizationName: undefined,
locationName: undefined,
phone: undefined,
registrationDate: undefined,
accountId: undefined,
certification: undefined,
role: '',
permission: [],
2026-01-23 01:14:47 +08:00
projects: undefined,
currentProjectId: undefined,
2025-06-22 23:55:55 +08:00
}),
// 配置持久化
persist: {
key: 'user-store',
storage: localStorage,
// 只持久化关键的用户信息,排除敏感信息
2026-01-23 01:14:47 +08:00
pick: [
'name',
'avatar',
'role',
'permission',
'accountId',
'email',
'projects',
'currentProjectId',
],
},
2025-06-22 23:55:55 +08:00
getters: {
userInfo(state: UserState): UserState {
return { ...state };
},
},
actions: {
switchRoles() {
return new Promise((resolve) => {
this.role = this.role === 'user' ? 'admin' : 'user';
resolve(this.role);
});
},
// Set user's information
setInfo(partial: Partial<UserState>) {
this.$patch(partial);
},
// Reset user's information
resetInfo() {
this.$reset();
},
// Get user's information
async info() {
const res = await getUserInfo();
this.setInfo(res.data);
},
// 登陆
async login(loginForm: LoginData) {
try {
const res = await userLogin(loginForm);
setToken(res.data.token);
// 设置基本用户信息
this.setInfo({
name: loginForm.username,
role: 'admin',
});
// 登录成功后获取完整的用户信息和权限
try {
await this.info();
await this.getUserPermissionData();
} catch (infoError) {
// 如果获取用户信息失败,不影响登录流程
// eslint-disable-next-line no-console
console.warn('获取用户详细信息失败:', infoError);
}
2025-06-22 23:55:55 +08:00
} catch (err) {
clearToken();
throw err;
}
},
logoutCallBack() {
const appStore = useAppStore();
this.resetInfo();
clearToken();
removeRouteListener();
appStore.clearServerMenu();
},
// Logout
async logout() {
try {
await userLogout();
} finally {
this.logoutCallBack();
}
},
async getUserPermissionData() {
try {
const res = await getUserPermission();
2025-06-22 23:55:55 +08:00
// 将权限数据存储到store中
if (res.data && res.data.length > 0) {
this.setInfo({ permission: res.data[0].permission });
}
} catch (err) {
// 生产环境下可以使用日志服务记录错误
if (process.env.NODE_ENV === 'development') {
// eslint-disable-next-line no-console
console.error('获取权限失败:', err);
}
2025-06-22 23:55:55 +08:00
throw err;
}
},
},
});
export default useUserStore;