Files
school-developer/src/stores/userInfo.ts
2026-03-19 15:55:37 +08:00

150 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineStore } from 'pinia';
import {Local, Session} from '/@/utils/storage';
import { getUserInfo, login, loginByMobile, loginBySocial, refreshTokenApi } from '/@/api/login/index';
import { useMessage } from '/@/hooks/message';
import { initUserTableConfigs } from '/@/api/admin/usertable';
/**
* @function useUserInfo
* @returns {UserInfosStore}
*/
export const useUserInfo = defineStore('userInfo', {
state: (): UserInfosState => ({
userInfos: {
userName: '',
photo: '',
time: 0,
roles: [],
roleCodes: [],
authBtnList: [],
},
}),
actions: {
/**
* 统一写入 token 到缓存登录成功、URL 参数 token 等共用)
* @param token 访问令牌
* @param refreshToken 刷新令牌,可选
*/
setTokenCache(token: string, refreshToken?: string) {
Session.set('token', token);
if (refreshToken != null && refreshToken !== '') {
Session.set('refresh_token', refreshToken);
}
},
/**
* 登录方法
* @function login
* @async
* @param {Object} data - 登录数据
* @returns {Promise<Object>}
*/
async login(data:any) {
data.grant_type = 'password';
data.scope = 'server';
return new Promise((resolve, reject) => {
login(data)
.then((res) => {
this.setTokenCache(res.access_token, res.refresh_token);
Local.remove('roleCode');
Local.remove('roleName');
Local.remove('roleId');
resolve(res);
})
.catch((err) => {
useMessage().error(err?.msg || '系统异常请联系管理员');
reject(err);
});
});
},
/**
* 手机登录方法
* @function loginByMobile
* @async
* @param {Object} data - 登录数据
* @returns {Promise<Object>}
*/
async loginByMobile(data) {
return new Promise((resolve, reject) => {
loginByMobile(data.mobile, data.code)
.then((res) => {
this.setTokenCache(res.access_token, res.refresh_token);
resolve(res);
})
.catch((err) => {
useMessage().error(err?.msg || '系统异常请联系管理员');
reject(err);
});
});
},
/**
* 社交账号登录方法
* @function loginBySocial
* @async
* @param {string} state - 状态
* @param {string} code - 代码
* @returns {Promise<Object>}
*/
async loginBySocial(state, code) {
return new Promise((resolve, reject) => {
loginBySocial(state, code)
.then((res) => {
this.setTokenCache(res.access_token, res.refresh_token);
resolve(res);
})
.catch((err) => {
useMessage().error(err?.msg || '系统异常请联系管理员');
reject(err);
});
});
},
/**
* 刷新token方法
* @function refreshToken
* @async
* @returns {Promise<any>}
*/
async refreshToken() {
return new Promise((resolve, reject) => {
const refreshToken = Session.get('refresh_token');
refreshTokenApi(refreshToken)
.then((res) => {
this.setTokenCache(res.access_token, res.refresh_token);
resolve(res);
})
.catch((err) => {
useMessage().error(err.msg);
reject(err);
});
});
},
/**
* 获取用户信息方法
* @function setUserInfos
* @async
*/
async setUserInfos() {
await getUserInfo().then((res) => {
const userInfo: any = {
user: res.data.sysUser,
time: new Date().getTime(),
roles: res.data.roles,
roleCodes: res.data.roleCodes || [],
authBtnList: res.data.permissions,
};
this.userInfos = userInfo;
// 初始化用户表格配置(登录后获取一次所有配置并保存到本地)
initUserTableConfigs().catch((err) => {
console.error('初始化用户表格配置失败:', err);
});
});
},
},
});