150 lines
3.6 KiB
TypeScript
150 lines
3.6 KiB
TypeScript
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);
|
||
});
|
||
});
|
||
},
|
||
},
|
||
});
|