From f16a2a56455297dd21d7eecc547d80a6e631ec9c Mon Sep 17 00:00:00 2001 From: JustSong Date: Wed, 26 Apr 2023 11:42:56 +0800 Subject: [PATCH] feat: redirect to login page if login expired (close #18) --- middleware/auth.go | 2 +- web/src/components/LoginForm.js | 6 +++++- web/src/helpers/utils.js | 12 ++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/middleware/auth.go b/middleware/auth.go index dade849fb9..6279d00883 100644 --- a/middleware/auth.go +++ b/middleware/auth.go @@ -16,7 +16,7 @@ func authHelper(c *gin.Context, minRole int) { id := session.Get("id") status := session.Get("status") if username == nil { - c.JSON(http.StatusOK, gin.H{ + c.JSON(http.StatusUnauthorized, gin.H{ "success": false, "message": "无权进行此操作,未登录", }) diff --git a/web/src/components/LoginForm.js b/web/src/components/LoginForm.js index d54c811f87..27351d6096 100644 --- a/web/src/components/LoginForm.js +++ b/web/src/components/LoginForm.js @@ -10,7 +10,7 @@ import { Modal, Segment, } from 'semantic-ui-react'; -import { Link, useNavigate } from 'react-router-dom'; +import { Link, useNavigate, useSearchParams } from 'react-router-dom'; import { UserContext } from '../context/User'; import { API, showError, showSuccess } from '../helpers'; @@ -20,6 +20,7 @@ const LoginForm = () => { password: '', wechat_verification_code: '', }); + const [searchParams, setSearchParams] = useSearchParams(); const [submitted, setSubmitted] = useState(false); const { username, password } = inputs; const [userState, userDispatch] = useContext(UserContext); @@ -28,6 +29,9 @@ const LoginForm = () => { const [status, setStatus] = useState({}); useEffect(() => { + if (searchParams.get("expired")) { + showError('未登录或登录已过期,请重新登录!'); + } let status = localStorage.getItem('status'); if (status) { status = JSON.parse(status); diff --git a/web/src/helpers/utils.js b/web/src/helpers/utils.js index 37464aea77..31d1b9085a 100644 --- a/web/src/helpers/utils.js +++ b/web/src/helpers/utils.js @@ -54,14 +54,18 @@ export function showError(error) { console.error(error); if (error.message) { if (error.name === 'AxiosError') { - switch (error.message) { - case 'Request failed with status code 429': + switch (error.response.status) { + case 401: + // toast.error('错误:未登录或登录已过期,请重新登录!', showErrorOptions); + window.location.href = '/login?expired=true'; + break; + case 429: toast.error('错误:请求次数过多,请稍后再试!', showErrorOptions); break; - case 'Request failed with status code 500': + case 500: toast.error('错误:服务器内部错误,请联系管理员!', showErrorOptions); break; - case 'Request failed with status code 405': + case 405: toast.info('本站仅作演示之用,无服务端!'); break; default: