perf: 登录

This commit is contained in:
pan
2024-03-13 16:59:32 +08:00
parent 52ab1f8a33
commit cdac80a1c2
17 changed files with 150 additions and 195 deletions

View File

@@ -7,12 +7,12 @@ export interface DataInfo<T> {
accessToken: string;
/** `accessToken`的过期时间(时间戳) */
expires: T;
/** 用于调用刷新accessToken的接口时所需的token */
refreshToken: string;
/** 用户名 */
username?: string;
/** 当前登陆用户的角色 */
roles?: Array<string>;
/** 当前登陆用户的角色 */
user?: any;
}
export const userKey = "user-info";
@@ -35,13 +35,13 @@ export function getToken(): DataInfo<number> {
/**
* @description 设置`token`以及一些必要信息并采用无感刷新`token`方案
* 无感刷新:后端返回`accessToken`(访问接口使用的`token`、`refreshToken`(用于调用刷新`accessToken`的接口时所需的`token``refreshToken`的过期时间比如30天应大于`accessToken`的过期时间比如2小时、`expires``accessToken`的过期时间)
* 无感刷新:后端返回`accessToken`(访问接口使用的`token`)(用于调用刷新`accessToken`的接口时所需的`token`的过期时间比如30天应大于`accessToken`的过期时间比如2小时、`expires``accessToken`的过期时间)
* 将`accessToken`、`expires`这两条信息放在key值为authorized-token的cookie里过期自动销毁
* 将`username`、`roles`、`refreshToken`、`expires`这四条信息放在key值为`user-info`的localStorage里利用`multipleTabsKey`当浏览器完全关闭后自动销毁)
* 将`username`、`roles`、`expires`这四条信息放在key值为`user-info`的localStorage里利用`multipleTabsKey`当浏览器完全关闭后自动销毁)
*/
export function setToken(data: DataInfo<Date>) {
let expires = 0;
const { accessToken, refreshToken } = data;
const { accessToken } = data;
const { isRemembered, loginDay } = useUserStoreHook();
expires = new Date(data.expires).getTime(); // 如果后端直接设置时间戳将此处代码改为expires = data.expires然后把上面的DataInfo<Date>改成DataInfo<number>即可
const cookieString = JSON.stringify({ accessToken, expires });
@@ -62,11 +62,15 @@ export function setToken(data: DataInfo<Date>) {
: {}
);
function setUserKey(username: string, roles: Array<string>) {
function setUserKey(
accessToken: string,
username: string,
roles: Array<string>
) {
useUserStoreHook().SET_USERNAME(username);
useUserStoreHook().SET_ROLES(roles);
storageLocal().setItem(userKey, {
refreshToken,
accessToken,
expires,
username,
roles
@@ -75,13 +79,13 @@ export function setToken(data: DataInfo<Date>) {
if (data.username && data.roles) {
const { username, roles } = data;
setUserKey(username, roles);
setUserKey(accessToken, username, roles);
} else {
const username =
storageLocal().getItem<DataInfo<number>>(userKey)?.username ?? "";
const roles =
storageLocal().getItem<DataInfo<number>>(userKey)?.roles ?? [];
setUserKey(username, roles);
setUserKey(accessToken, username, roles);
}
}

View File

@@ -12,6 +12,8 @@ import type {
import { stringify } from "qs";
import NProgress from "../progress";
import { getToken, formatToken } from "@/utils/auth";
import { message } from "@/utils/message";
// 相关配置请参考www.axios-js.com/zh-cn/docs/#axios-request-config-1
const defaultConfig: AxiosRequestConfig = {
// 请求超时时间
@@ -91,6 +93,7 @@ class PureHttp {
});
},
error => {
message("请求异常!", { type: "error" });
return Promise.reject(error);
}
);
@@ -116,6 +119,7 @@ class PureHttp {
return response.data;
},
(error: PureHttpError) => {
message("服务异常!", { type: "error" });
const $error = error;
$error.isCancelRequest = Axios.isCancel($error);
// 关闭进度条动画

14
src/utils/rsaEncrypt.ts Normal file
View File

@@ -0,0 +1,14 @@
import JSEncrypt from "jsencrypt";
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey =
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n" +
"2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ==";
// 加密
export const encrypt = (txt: string) => {
const crypt = new JSEncrypt();
// 设置公钥
crypt.setPublicKey(publicKey);
const enc = crypt.encrypt(txt);
return enc; // 对需要加密的数据进行加密
};