Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
E
EMS
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hejie
EMS
Commits
1f4d2a52
提交
1f4d2a52
authored
5月 07, 2025
作者:
詹银鑫
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: token刷新更新
上级
520c88d8
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
7 行增加
和
64 行删除
+7
-64
auth.ts
src/utils/auth.ts
+2
-2
index.ts
src/utils/http/index.ts
+0
-57
index.vue
src/views/login/index.vue
+5
-5
没有找到文件。
src/utils/auth.ts
浏览文件 @
1f4d2a52
...
@@ -47,11 +47,11 @@ export function getToken(): DataInfo<number> {
...
@@ -47,11 +47,11 @@ export function getToken(): DataInfo<number> {
* 将`accessToken`、`expires`、`refreshToken`这三条信息放在key值为authorized-token的cookie里(过期自动销毁)
* 将`accessToken`、`expires`、`refreshToken`这三条信息放在key值为authorized-token的cookie里(过期自动销毁)
* 将`avatar`、`username`、`nickname`、`roles`、`permissions`、`refreshToken`、`expires`这七条信息放在key值为`user-info`的localStorage里(利用`multipleTabsKey`当浏览器完全关闭后自动销毁)
* 将`avatar`、`username`、`nickname`、`roles`、`permissions`、`refreshToken`、`expires`这七条信息放在key值为`user-info`的localStorage里(利用`multipleTabsKey`当浏览器完全关闭后自动销毁)
*/
*/
export
function
setToken
(
data
:
DataInfo
<
Date
>
)
{
export
function
setToken
(
data
:
DataInfo
<
number
>
)
{
let
expires
=
0
;
let
expires
=
0
;
const
{
accessToken
,
refreshToken
}
=
data
;
const
{
accessToken
,
refreshToken
}
=
data
;
const
{
isRemembered
,
loginDay
}
=
useUserStoreHook
();
const
{
isRemembered
,
loginDay
}
=
useUserStoreHook
();
expires
=
new
Date
(
data
.
expires
).
getTime
()
;
// 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可
expires
=
data
.
expires
;
// 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可
const
cookieString
=
JSON
.
stringify
({
accessToken
,
expires
,
refreshToken
});
const
cookieString
=
JSON
.
stringify
({
accessToken
,
expires
,
refreshToken
});
expires
>
0
expires
>
0
...
...
src/utils/http/index.ts
浏览文件 @
1f4d2a52
...
@@ -82,7 +82,6 @@ class PureHttp {
...
@@ -82,7 +82,6 @@ class PureHttp {
const
data
=
getToken
();
const
data
=
getToken
();
if
(
data
)
{
if
(
data
)
{
const
now
=
new
Date
().
getTime
();
const
now
=
new
Date
().
getTime
();
console
.
log
(
"time"
,
parseInt
(
data
.
expires
)
-
now
);
const
expired
=
parseInt
(
data
.
expires
)
-
now
<=
0
;
const
expired
=
parseInt
(
data
.
expires
)
-
now
<=
0
;
if
(
expired
)
{
if
(
expired
)
{
if
(
!
PureHttp
.
isRefreshing
)
{
if
(
!
PureHttp
.
isRefreshing
)
{
...
@@ -138,63 +137,7 @@ class PureHttp {
...
@@ -138,63 +137,7 @@ class PureHttp {
return
response
.
data
;
return
response
.
data
;
},
},
(
error
:
PureHttpError
)
=>
{
(
error
:
PureHttpError
)
=>
{
// A0301 TOKEN错误 A0201
const
$error
=
error
;
const
$error
=
error
;
if
((
$error
.
response
.
data
as
{
code
:
string
})?.
code
===
"A0301"
)
{
/** 请求白名单,放置一些不需要`token`的接口(通过设置请求白名单,防止`token`过期后再请求造成的死循环问题) */
console
.
log
(
"error"
,
$error
.
config
);
const
whiteList
=
[
"/refresh-token"
,
"/login"
];
return
whiteList
.
some
(
url
=>
$error
.
config
.
url
.
endsWith
(
url
))
?
$error
.
config
:
new
Promise
(()
=>
{
const
data
=
getToken
();
if
(
data
)
{
if
(
!
PureHttp
.
isRefreshing
)
{
PureHttp
.
isRefreshing
=
true
;
// token过期刷新
useUserStoreHook
()
.
handRefreshToken
({
refreshToken
:
data
.
refreshToken
})
.
then
(
res
=>
{
console
.
log
(
"res"
,
res
);
const
token
=
res
.
data
.
jwt
;
// let refreshToken = res.data.refreshToken;
// console.log("token", token);
$error
.
config
.
headers
[
"Authorization"
]
=
formatToken
(
token
);
// 遍历并执行存储的回调函数
PureHttp
.
requests
.
forEach
(
cb
=>
cb
(
token
));
PureHttp
.
requests
=
[];
// 清空队列
// 重新发起原始请求
return
PureHttp
.
axiosInstance
.
request
(
$error
.
config
);
// PureHttp.retryOriginalRequest($error.config);
// PureHttp.requests.forEach(cb => {
// console.log("cb", cb);
// cb(token);
// });
// PureHttp.requests = [];
})
.
finally
(()
=>
{
PureHttp
.
isRefreshing
=
false
;
});
// }
// resolve());
// } else {
// config.headers["Authorization"] = formatToken(
// data.accessToken
// );
// resolve(config);
// }
// } else {
// resolve(config);
}
}
});
}
$error
.
isCancelRequest
=
Axios
.
isCancel
(
$error
);
$error
.
isCancelRequest
=
Axios
.
isCancel
(
$error
);
// 关闭进度条动画
// 关闭进度条动画
NProgress
.
done
();
NProgress
.
done
();
...
...
src/views/login/index.vue
浏览文件 @
1f4d2a52
...
@@ -137,12 +137,13 @@ const onLogin = async (formEl: FormInstance | undefined) => {
...
@@ -137,12 +137,13 @@ const onLogin = async (formEl: FormInstance | undefined) => {
.
then
(
res
=>
{
.
then
(
res
=>
{
if
(
res
.
status
===
200
||
res
.
success
)
{
if
(
res
.
status
===
200
||
res
.
success
)
{
// 登录成功,设置 token
// 登录成功,设置 token
console
.
log
(
"res"
,
res
.
data
.
refreshToken
);
debugger
;
console
.
log
(
"res"
,
res
);
setToken
({
setToken
({
// accessToken: res.data.jwt,
accessToken
:
res
.
data
.
jwt
,
accessToken
:
"1213123"
,
refreshToken
:
res
.
data
.
refreshToken
,
refreshToken
:
res
.
data
.
refreshToken
,
expires
:
new
Date
(
Date
.
now
()
+
9999999
*
1000
)
expires
:
res
.
data
.
expires
// expires: new Date(Date.now() + 9999999 * 1000)
});
});
console
.
log
(
"getToken"
,
getToken
);
console
.
log
(
"getToken"
,
getToken
);
// 初始化路由
// 初始化路由
...
@@ -152,7 +153,6 @@ const onLogin = async (formEl: FormInstance | undefined) => {
...
@@ -152,7 +153,6 @@ const onLogin = async (formEl: FormInstance | undefined) => {
router
router
.
push
(
getTopMenu
(
true
).
path
)
.
push
(
getTopMenu
(
true
).
path
)
.
then
(()
=>
{
.
then
(()
=>
{
debugger
;
// 显示登录成功消息
// 显示登录成功消息
message
(
t
(
"login.pureLoginSuccess"
),
{
type
:
"success"
});
message
(
t
(
"login.pureLoginSuccess"
),
{
type
:
"success"
});
})
})
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论