feat: redirect to login page if login expired (close #18)

This commit is contained in:
JustSong 2023-04-26 11:42:56 +08:00
parent 03491029f2
commit f16a2a5645
3 changed files with 14 additions and 6 deletions

View File

@ -16,7 +16,7 @@ func authHelper(c *gin.Context, minRole int) {
id := session.Get("id") id := session.Get("id")
status := session.Get("status") status := session.Get("status")
if username == nil { if username == nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusUnauthorized, gin.H{
"success": false, "success": false,
"message": "无权进行此操作,未登录", "message": "无权进行此操作,未登录",
}) })

View File

@ -10,7 +10,7 @@ import {
Modal, Modal,
Segment, Segment,
} from 'semantic-ui-react'; } 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 { UserContext } from '../context/User';
import { API, showError, showSuccess } from '../helpers'; import { API, showError, showSuccess } from '../helpers';
@ -20,6 +20,7 @@ const LoginForm = () => {
password: '', password: '',
wechat_verification_code: '', wechat_verification_code: '',
}); });
const [searchParams, setSearchParams] = useSearchParams();
const [submitted, setSubmitted] = useState(false); const [submitted, setSubmitted] = useState(false);
const { username, password } = inputs; const { username, password } = inputs;
const [userState, userDispatch] = useContext(UserContext); const [userState, userDispatch] = useContext(UserContext);
@ -28,6 +29,9 @@ const LoginForm = () => {
const [status, setStatus] = useState({}); const [status, setStatus] = useState({});
useEffect(() => { useEffect(() => {
if (searchParams.get("expired")) {
showError('未登录或登录已过期,请重新登录!');
}
let status = localStorage.getItem('status'); let status = localStorage.getItem('status');
if (status) { if (status) {
status = JSON.parse(status); status = JSON.parse(status);

View File

@ -54,14 +54,18 @@ export function showError(error) {
console.error(error); console.error(error);
if (error.message) { if (error.message) {
if (error.name === 'AxiosError') { if (error.name === 'AxiosError') {
switch (error.message) { switch (error.response.status) {
case 'Request failed with status code 429': case 401:
// toast.error('错误:未登录或登录已过期,请重新登录!', showErrorOptions);
window.location.href = '/login?expired=true';
break;
case 429:
toast.error('错误:请求次数过多,请稍后再试!', showErrorOptions); toast.error('错误:请求次数过多,请稍后再试!', showErrorOptions);
break; break;
case 'Request failed with status code 500': case 500:
toast.error('错误:服务器内部错误,请联系管理员!', showErrorOptions); toast.error('错误:服务器内部错误,请联系管理员!', showErrorOptions);
break; break;
case 'Request failed with status code 405': case 405:
toast.info('本站仅作演示之用,无服务端!'); toast.info('本站仅作演示之用,无服务端!');
break; break;
default: default: