Explorar o código

feat: redirect to login page if login expired

JustSong %!s(int64=2) %!d(string=hai) anos
pai
achega
65783feafa
Modificáronse 3 ficheiros con 23 adicións e 6 borrados
  1. 1 1
      middleware/auth.go
  2. 5 1
      web/src/components/LoginForm.js
  3. 17 4
      web/src/helpers/utils.js

+ 1 - 1
middleware/auth.go

@@ -14,7 +14,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": "无权进行此操作,未登录",
 		})

+ 5 - 1
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);

+ 17 - 4
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:
@@ -139,4 +143,13 @@ export function timestamp2string(timestamp) {
     ':' +
     second
   );
+}
+
+export function downloadTextAsFile(text, filename) {
+  let blob = new Blob([text], { type: 'text/plain;charset=utf-8' });
+  let url = URL.createObjectURL(blob);
+  let a = document.createElement('a');
+  a.href = url;
+  a.download = filename;
+  a.click();
 }