import Cookies from "js-cookie";
|
import { useUserStoreHook } from "@/store/modules/user";
|
import { storageLocal, isString, isIncludeAllChildren } from "@pureadmin/utils";
|
import type { nowRoleType } from "@/store/types";
|
|
export interface DataInfo<T> {
|
/** token */
|
accessToken: string;
|
/** `accessToken`的过期时间(时间戳) */
|
expires: T;
|
/** 用于调用刷新accessToken的接口时所需的token */
|
refreshToken: string;
|
/** 头像 */
|
avatar?: string;
|
/** 用户名 */
|
username?: string;
|
/** 昵称 */
|
nickname?: string;
|
/** 当前登录用户的角色列表 */
|
exRoles?: Array<string>;
|
/** 当前登录用户的角色 */
|
roles?: Array<string>;
|
/** 当前登录用户的按钮级别权限 */
|
permissions?: Array<string>;
|
}
|
/**
|
* AdminResult_CusExtendDto,全局返回结果
|
*/
|
export interface ResponseEnterprise {
|
/**
|
* 状态码
|
*/
|
code?: number;
|
/**
|
* 附加数据
|
*/
|
extras?: null;
|
/**
|
* 错误信息
|
*/
|
message?: null | string;
|
result?: CusExtendDto;
|
/**
|
* 时间
|
*/
|
time?: Date;
|
/**
|
* 类型success、warning、error
|
*/
|
type?: null | string;
|
}
|
|
/**
|
* CusExtendDto,用户角色资料
|
*/
|
export interface CusExtendDto {
|
/**
|
* 企业银行账号
|
*/
|
bankAccount?: null | string;
|
/**
|
* 企业开户行
|
*/
|
bankName?: null | string;
|
/**
|
* 营业执照文件路径
|
*/
|
businessLicense?: null | string;
|
/**
|
* 企业邮箱
|
*/
|
enterpriseEmail?: null | string;
|
/**
|
* 企业名称
|
*/
|
enterpriseName?: null | string;
|
/**
|
* 企业联系电话
|
*/
|
enterprisePhone?: null | string;
|
/**
|
* 企业类型 从企业类型中选择 来源企业类型
|
*/
|
enterpriseType?: null | string;
|
/**
|
* 企业成立时间
|
*/
|
establishmentTime?: Date;
|
/**
|
* 主键
|
*/
|
id?: number | null;
|
/**
|
* 法定代表人身份证文件路径
|
*/
|
legalRepresentativeIdCard?: null | string;
|
/**
|
* 法定代表人身份证号码
|
*/
|
legalRepresentativeIdNumber?: null | string;
|
/**
|
* 法定代表人姓名
|
*/
|
legalRepresentativeName?: null | string;
|
/**
|
* 法定代表人联系电话
|
*/
|
legalRepresentativePhone?: null | string;
|
/**
|
* 企业主营业务
|
*/
|
mainBusiness?: null | string;
|
/**
|
* 业务经办人身份证文件路径或标识(上传后存储信息)
|
*/
|
operatorIdCard?: null | string;
|
/**
|
* 业务经办人身份证号码
|
*/
|
operatorIdNumber?: null | string;
|
/**
|
* 业务经办人姓名
|
*/
|
operatorName?: null | string;
|
/**
|
* 业务经办人联系电话
|
*/
|
operatorPhone?: null | string;
|
/**
|
* 注册资金(单位:万元 )
|
*/
|
registeredCapital?: null | string;
|
/**
|
* 企业住所(下拉选择,需结合实际可选值,先字符串接收 )
|
*/
|
residence?: null | string;
|
/**
|
* 交易主体 代码 同角色代码
|
*/
|
transactionCode: string;
|
/**
|
* 交易主体名称
|
*/
|
transactionName?: null | string;
|
/**
|
* 统一社会信用代码
|
*/
|
unifiedSocialCreditCode?: null | string;
|
}
|
|
export const userKey = "user-info";
|
export const TokenKey = "authorized-token";
|
/**
|
* 通过`multiple-tabs`是否在`cookie`中,判断用户是否已经登录系统,
|
* 从而支持多标签页打开已经登录的系统后无需再登录。
|
* 浏览器完全关闭后`multiple-tabs`将自动从`cookie`中销毁,
|
* 再次打开浏览器需要重新登录系统
|
* */
|
export const multipleTabsKey = "multiple-tabs";
|
|
/** 获取`token` */
|
export function getToken(): DataInfo<number> {
|
// 此处与`TokenKey`相同,此写法解决初始化时`Cookies`中不存在`TokenKey`报错
|
return Cookies.get(TokenKey)
|
? JSON.parse(Cookies.get(TokenKey))
|
: storageLocal().getItem(userKey);
|
}
|
|
/**
|
* @description 设置`token`以及一些必要信息并采用无感刷新`token`方案
|
* 无感刷新:后端返回`accessToken`(访问接口使用的`token`)、`refreshToken`(用于调用刷新`accessToken`的接口时所需的`token`,`refreshToken`的过期时间(比如30天)应大于`accessToken`的过期时间(比如2小时))、`expires`(`accessToken`的过期时间)
|
* 将`accessToken`、`expires`、`refreshToken`这三条信息放在key值为authorized-token的cookie里(过期自动销毁)
|
* 将`avatar`、`username`、`nickname`、`exRoles`、`permissions`、`refreshToken`、`expires`这七条信息放在key值为`user-info`的localStorage里(利用`multipleTabsKey`当浏览器完全关闭后自动销毁)
|
*/
|
export function setToken(data: DataInfo<Date>) {
|
let expires = 0;
|
const { accessToken, refreshToken } = data;
|
const { isRemembered, loginDay } = useUserStoreHook();
|
expires = new Date(data.expires).getTime(); // 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可
|
const cookieString = JSON.stringify({ accessToken, expires, refreshToken });
|
|
expires > 0
|
? Cookies.set(TokenKey, cookieString, {
|
expires: (expires - Date.now()) / 86400000
|
})
|
: Cookies.set(TokenKey, cookieString);
|
|
Cookies.set(
|
multipleTabsKey,
|
"true",
|
isRemembered
|
? {
|
expires: loginDay
|
}
|
: {}
|
);
|
|
function setUserKey({
|
avatar,
|
username,
|
nickname,
|
exRoles,
|
permissions,
|
roles
|
}) {
|
useUserStoreHook().SET_AVATAR(avatar);
|
useUserStoreHook().SET_USERNAME(username);
|
useUserStoreHook().SET_NICKNAME(nickname);
|
useUserStoreHook().SET_EXROLES(exRoles);
|
useUserStoreHook().SET_ROLES(roles);
|
useUserStoreHook().SET_PERMS(permissions);
|
storageLocal().setItem(userKey, {
|
refreshToken,
|
expires,
|
avatar,
|
username,
|
nickname,
|
exRoles,
|
roles,
|
permissions
|
});
|
}
|
|
if (data.exRoles && data.roles) {
|
const { username, exRoles, roles } = data;
|
setUserKey({
|
avatar: data?.avatar ?? "",
|
username,
|
nickname: data?.nickname ?? "",
|
exRoles,
|
roles,
|
permissions: data?.permissions ?? []
|
});
|
} else {
|
const avatar =
|
storageLocal().getItem<DataInfo<number>>(userKey)?.avatar ?? "";
|
const username =
|
storageLocal().getItem<DataInfo<number>>(userKey)?.username ?? "";
|
const nickname =
|
storageLocal().getItem<DataInfo<number>>(userKey)?.nickname ?? "";
|
const exRoles =
|
storageLocal().getItem<DataInfo<number>>(userKey)?.exRoles ?? [];
|
const roles =
|
storageLocal().getItem<DataInfo<number>>(userKey)?.roles ?? [];
|
const permissions =
|
storageLocal().getItem<DataInfo<number>>(userKey)?.permissions ?? [];
|
setUserKey({
|
avatar,
|
username,
|
nickname,
|
exRoles,
|
roles,
|
permissions
|
});
|
}
|
}
|
|
export function setEnterpriseInfo(data: CusExtendDto) {
|
useUserStoreHook().SET_ENTERPRISEINFO(data);
|
useUserStoreHook().SET_USERNAME(data.enterpriseName);
|
storageLocal().setItem("enterpriseInfo", data);
|
const obj = storageLocal().getItem(userKey);
|
obj.username = data.enterpriseName;
|
storageLocal().setItem(userKey, obj);
|
}
|
|
export function setRoleListInfo(data: DataInfo<string>) {
|
useUserStoreHook().SET_EXROLES_LIST(data);
|
storageLocal().setItem("rolesList", data);
|
}
|
|
export function setNowRole(data: nowRoleType) {
|
const list = storageLocal().getItem<DataInfo<number>>(userKey)?.exRoles ?? [];
|
if (list.length > 0) {
|
const obj = list.find(item => {
|
return item.code == data.code;
|
});
|
data = { ...obj, ...data };
|
}
|
useUserStoreHook().SET_ROLES([data.name]);
|
useUserStoreHook().SET_NOW_ROLE(data);
|
storageLocal().setItem("nowRole", data);
|
}
|
|
export function removeEnterpriseInfo() {
|
storageLocal().removeItem("enterpriseInfo");
|
}
|
|
/** 删除`token`以及key值为`user-info`的localStorage信息 */
|
export function removeToken() {
|
Cookies.remove(TokenKey);
|
Cookies.remove(multipleTabsKey);
|
storageLocal().removeItem(userKey);
|
}
|
|
/** 格式化token(jwt格式) */
|
export const formatToken = (token: string): string => {
|
return "Bearer " + token;
|
};
|
|
/** 是否有按钮级别的权限(根据登录接口返回的`permissions`字段进行判断)*/
|
export const hasPerms = (value: string | Array<string>): boolean => {
|
if (!value) return false;
|
const allPerms = "*:*:*";
|
const { permissions } = useUserStoreHook();
|
if (!permissions) return false;
|
if (permissions.length === 1 && permissions[0] === allPerms) return true;
|
const isAuths = isString(value)
|
? permissions.includes(value)
|
: isIncludeAllChildren(value, permissions);
|
return isAuths ? true : false;
|
};
|