208 lines
5.8 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 { store } from "@/store";
import type { userType } from "../types";
import { routerArrays } from "@/layout/types";
import { router, resetRouter } from "@/router";
import { storageLocal } from "@pureadmin/utils";
import { getLogin, refreshTokenApi } from "@/api/login";
import type { LoginResult } from "@/api/login";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import {
type UserInfo,
type UserToken,
setToken,
removeToken,
userInfoKey,
userTokenKey
} from "@/utils/auth";
export const useUserStore = defineStore({
id: "user",
state: (): userType => ({
// 用户名
username: storageLocal().getItem<UserInfo>(userInfoKey)?.username ?? "",
// 页面级别权限
permissions:
storageLocal().getItem<UserInfo>(userInfoKey)?.permissions ?? [],
// 前端生成的验证码(按实际需求替换)
verifyCode: "",
// 判断登录页面显示哪个组件0登录默认、1手机登录、2二维码登录、3注册、4忘记密码,1,2预留暂不开发
currentPage: 0,
/**用户头像 */
avatar: storageLocal().getItem<UserInfo>(userInfoKey)?.avatar ?? "",
/**用户数据库ID */
id: storageLocal().getItem<UserInfo>(userInfoKey)?.id ?? "",
/**用户Token */
accessToken:
storageLocal().getItem<UserToken>(userTokenKey)?.accessToken ?? "",
/**用户刷新Token*/
refreshToken:
storageLocal().getItem<UserToken>(userTokenKey)?.refreshToken ?? "",
/**过期时间 */
expires: storageLocal().getItem<UserToken>(userTokenKey)?.expiresTime ?? 0,
// 是否勾选了登录页的免登录
isRemembered: false,
// 登录页的免登录存储几天默认2天
loginDay: 2,
/***
* 用户手机号
*/
phone: storageLocal().getItem<UserInfo>(userInfoKey)?.phone ?? "",
/***
* 用户邮箱
*/
email: storageLocal().getItem<UserInfo>(userInfoKey)?.email ?? "",
/***
* 用户昵称
*/
nickname: storageLocal().getItem<UserInfo>(userInfoKey)?.nickname ?? "",
/***
* 用户性别
*/
gender: storageLocal().getItem<UserInfo>(userInfoKey)?.gender ?? 0,
/***
* 用户角色
*/
roles: storageLocal().getItem<UserInfo>(userInfoKey)?.roles ?? [],
/***
* 部门ID
*/
department_id:
storageLocal().getItem<UserInfo>(userInfoKey)?.department_id ?? ""
}),
actions: {
/** 存储用户名 */
SET_USERNAME(username: string) {
this.username = username;
},
/** 存储权限 */
SET_PERMISSIONS(permissions: Array<string>) {
this.permissions = permissions;
},
/** 存储前端生成的验证码 */
SET_VERIFYCODE(verifyCode: string) {
this.verifyCode = verifyCode;
},
/** 存储登录页面显示哪个组件 */
SET_CURRENTPAGE(value: number) {
this.currentPage = value;
},
/**存储用户头像 */
SET_AVATAR(value: string) {
this.avatar = value;
},
/**存储用户数据库ID */
SET_ID(value: string) {
this.id = value;
},
/**存储用户Token */
SET_ACCESSTOKEN(value: string) {
this.accessToken = value;
},
/**存储用户刷新Token */
SET_REFRESHTOKEN(value: string) {
this.refreshToken = value;
},
/**存储用户Token过期时间戳 */
SET_EXPIRES(value: number) {
this.expires = value;
},
/** 存储是否勾选了登录页的免登录 */
SET_ISREMEMBERED(bool: boolean) {
this.isRemembered = bool;
},
/** 设置登录页的免登录存储几天 */
SET_LOGINDAY(value: number) {
this.loginDay = Number(value);
},
/** 存储用户手机号 */
SET_PHONE(value: string) {
this.phone = value;
},
/** 存储用户邮箱 */
SET_EMAIL(value: string) {
this.email = value;
},
/** 存储用户昵称 */
SET_NICKNAME(value: string) {
this.nickname = value;
},
/** 存储用户性别 */
SET_GENDER(value: number) {
this.gender = value;
},
/** 存储用户角色 */
SET_ROLES(value: Array<string>) {
this.roles = value;
},
/** 存储用户部门ID */
SET_DEPARTMENT_ID(value: string) {
this.department_id = value;
},
/** 登入 */
async loginByUsername(data: {
username: string;
password: string;
loginDay?: number;
uuid?: string;
code?: string;
}) {
return new Promise<ResponseResult<LoginResult>>((resolve, reject) => {
getLogin(data)
.then(data => {
if (data.success) {
setToken(data.data);
}
resolve(data);
})
.catch(error => {
reject(error);
});
});
},
/** 前端登出(不调用接口) */
logOut() {
this.username = "";
this.permissions = [];
this.verifyCode = "";
this.currentPage = 0;
this.avatar = "";
this.id = "";
this.accessToken = "";
this.refreshToken = "";
this.expires = 0;
this.isRemembered = false;
this.loginDay = 2;
this.phone = "";
this.email = "";
this.nickname = "";
this.gender = 0;
this.roles = [];
this.department_id = "";
removeToken();
useMultiTagsStoreHook().handleTags("equal", [...routerArrays]);
resetRouter();
router.push("/login");
},
/** 刷新`token` */
async handRefreshToken(data: { refreshToken: string }) {
return new Promise<ResponseResult<LoginResult>>((resolve, reject) => {
refreshTokenApi(data)
.then(data => {
if (data.success) {
setToken(data.data);
}
resolve(data);
})
.catch(error => {
reject(error);
});
});
}
}
});
export function useUserStoreHook() {
return useUserStore(store);
}