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: [],
|
|
|
|
|
}),
|
|
|
|
|
|
2025-06-24 19:46:34 +08:00
|
|
|
// 配置持久化
|
|
|
|
|
persist: {
|
|
|
|
|
key: 'user-store',
|
|
|
|
|
storage: localStorage,
|
|
|
|
|
// 只持久化关键的用户信息,排除敏感信息
|
|
|
|
|
pick: ['name', 'avatar', 'role', 'permission', 'accountId', 'email'],
|
|
|
|
|
},
|
|
|
|
|
|
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);
|
2025-06-24 19:46:34 +08:00
|
|
|
|
|
|
|
|
// 设置基本用户信息
|
|
|
|
|
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-24 19:46:34 +08:00
|
|
|
|
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) {
|
2025-06-24 19:46:34 +08:00
|
|
|
// 生产环境下可以使用日志服务记录错误
|
|
|
|
|
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;
|