176 lines
4.4 KiB
TypeScript
176 lines
4.4 KiB
TypeScript
import defaultAvatar from '@/assets/images/default_avatar.png';
|
|
import useLayoutStore from './layout';
|
|
import { login, logout, getInfo } from '@/api/login';
|
|
import { setToken, removeToken } from '@/plugins/auth-token';
|
|
import { defineStore } from 'pinia';
|
|
import { TOKEN_RESPONSE_FIELD } from '@/constants/token-constants';
|
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
|
import { parseUrlPath } from '@/plugins/file-static-url';
|
|
|
|
/**用户信息类型 */
|
|
type UserInfo = {
|
|
/**用户ID */
|
|
forcePasswdChange: boolean;
|
|
/**用户ID */
|
|
userId: string;
|
|
/**登录账号 */
|
|
userName: string;
|
|
/**用户角色 字符串数组 */
|
|
roles: string[];
|
|
/**用户权限 字符串数组 */
|
|
permissions: string[];
|
|
/**用户头像 */
|
|
avatar: string;
|
|
/**用户昵称 */
|
|
nickName: string;
|
|
/**用户手机号 */
|
|
phone: string;
|
|
/**用户邮箱 */
|
|
email: string;
|
|
/**用户性别 */
|
|
sex: string | undefined;
|
|
/**其他信息 */
|
|
profile: Record<string, any>;
|
|
};
|
|
|
|
const useUserStore = defineStore('user', {
|
|
state: (): UserInfo => ({
|
|
forcePasswdChange: false,
|
|
userId: '',
|
|
userName: '',
|
|
roles: [],
|
|
permissions: [],
|
|
avatar: '',
|
|
nickName: '',
|
|
phone: '',
|
|
email: '',
|
|
sex: undefined,
|
|
profile: {},
|
|
}),
|
|
getters: {
|
|
/**
|
|
* 获取正确头像地址
|
|
* @param state 内部属性不用传入
|
|
* @returns 头像地址url
|
|
*/
|
|
getAvatar(state) {
|
|
if (!state.avatar) {
|
|
return defaultAvatar;
|
|
}
|
|
return parseUrlPath(state.avatar);
|
|
},
|
|
/**
|
|
* 获取基础信息属性
|
|
* @param state 内部属性不用传入
|
|
* @returns 基础信息
|
|
*/
|
|
getBaseInfo(state) {
|
|
return {
|
|
nickName: state.nickName,
|
|
phone: state.phone,
|
|
email: state.email,
|
|
sex: state.sex,
|
|
};
|
|
},
|
|
},
|
|
actions: {
|
|
/**
|
|
* 更新基础信息属性
|
|
* @param data 变更信息
|
|
*/
|
|
setBaseInfo(data: Record<string, any>) {
|
|
this.nickName = data.nickName;
|
|
this.phone = data.phone;
|
|
this.email = data.email;
|
|
this.sex = data.sex;
|
|
},
|
|
/**
|
|
* 更新头像
|
|
* @param avatar 上传后的地址
|
|
*/
|
|
setAvatar(avatar: string) {
|
|
this.avatar = avatar;
|
|
},
|
|
/**
|
|
* 获取正确头像地址
|
|
* @param avatar
|
|
*/
|
|
fnAvatar(avatar: string) {
|
|
if (!avatar) {
|
|
return defaultAvatar;
|
|
}
|
|
return parseUrlPath(avatar);
|
|
},
|
|
// 登录
|
|
async fnLogin(loginBody: Record<string, string>) {
|
|
const res = await login(loginBody);
|
|
if (res.code === RESULT_CODE_SUCCESS && res.data) {
|
|
const token = res.data[TOKEN_RESPONSE_FIELD];
|
|
setToken(token);
|
|
if (res.data?.forcePasswdChange) {
|
|
this.forcePasswdChange = true;
|
|
}
|
|
}
|
|
return res;
|
|
},
|
|
// 获取用户信息
|
|
async fnGetInfo() {
|
|
const res = await getInfo();
|
|
if (res.code === RESULT_CODE_SUCCESS && res.data) {
|
|
const { user, roles, permissions } = res.data;
|
|
this.userId = user.userId;
|
|
// 登录账号
|
|
this.userName = user.userName;
|
|
// 用户头像
|
|
this.avatar = user.avatar;
|
|
// 基础信息
|
|
this.nickName = user.nickName;
|
|
this.phone = user.phone;
|
|
this.email = user.email;
|
|
this.sex = user.sex;
|
|
|
|
// 验证返回的roles是否是一个非空数组
|
|
if (Array.isArray(roles) && roles.length > 0) {
|
|
this.roles = roles;
|
|
this.permissions = permissions;
|
|
} else {
|
|
this.roles = ['ROLE_DEFAULT'];
|
|
this.permissions = [];
|
|
}
|
|
|
|
// 水印文字信息=用户昵称 手机号
|
|
// let waterMarkContent = this.userName;
|
|
// if (this.phone) {
|
|
// waterMarkContent = `${this.userName} ${this.phone}`;
|
|
// }
|
|
// useLayoutStore().changeWaterMark(waterMarkContent);
|
|
useLayoutStore().changeWaterMark('');
|
|
// 强制修改密码
|
|
if (res.data?.forcePasswdChange) {
|
|
this.forcePasswdChange = true;
|
|
}
|
|
}
|
|
// 网络错误时退出登录状态
|
|
if (res.code === 0) {
|
|
removeToken();
|
|
window.location.reload();
|
|
}
|
|
return res;
|
|
},
|
|
// 退出系统
|
|
async fnLogOut() {
|
|
try {
|
|
await logout();
|
|
} catch (error) {
|
|
throw error;
|
|
} finally {
|
|
this.roles = [];
|
|
this.permissions = [];
|
|
removeToken();
|
|
}
|
|
},
|
|
},
|
|
});
|
|
|
|
export default useUserStore;
|