From 1d22894d8ee17d0125fe572ee63482497b27452d Mon Sep 17 00:00:00 2001 From: Jorben Date: Sun, 7 Jul 2024 13:18:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=B2=E9=80=9A=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E3=80=81=E5=9B=9E=E8=B0=83=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端 - 登录页支持回调请求 - 登录后jwt写入localstorage - api请求携带jwt --- router/api/menu.go | 8 +- router/api/user.go | 6 +- router/router.go | 6 +- web/src/index.js | 20 ++-- web/src/pages/Login.js | 201 ++++++++++++++++++++++++++++--------- web/src/services/client.js | 7 +- 6 files changed, 179 insertions(+), 69 deletions(-) diff --git a/router/api/menu.go b/router/api/menu.go index 25f3c5b..11704fd 100644 --- a/router/api/menu.go +++ b/router/api/menu.go @@ -8,8 +8,8 @@ import ( "league/service" ) -// GetIndexMenus 获取前台权限范围内的菜单项 -func GetIndexMenus(ctx *gin.Context) { +// MenuIndex 获取前台权限范围内的菜单项 +func MenuIndex(ctx *gin.Context) { c := context.CustomContext{Context: ctx} if menus, err := getMenus(ctx, model.MenuTypeIndex); err == nil { c.CJSON(errs.Success, menus) @@ -18,8 +18,8 @@ func GetIndexMenus(ctx *gin.Context) { } } -// GetAdminMenus 获取管理后台权限范围内的菜单项 -func GetAdminMenus(ctx *gin.Context) { +// MenuAdmin 获取管理后台权限范围内的菜单项 +func MenuAdmin(ctx *gin.Context) { c := context.CustomContext{Context: ctx} if menus, err := getMenus(ctx, model.MenuTypeAdmin); err == nil { c.CJSON(errs.Success, menus) diff --git a/router/api/user.go b/router/api/user.go index 7c4007e..7ea6b13 100644 --- a/router/api/user.go +++ b/router/api/user.go @@ -8,12 +8,12 @@ import ( "strconv" ) -// GetUserinfo 获取当前用户信息 -func GetUserinfo(ctx *gin.Context) { +// UserCurrent 获取当前用户信息 +func UserCurrent(ctx *gin.Context) { c := context.CustomContext{Context: ctx} strId := ctx.Value("UserId").(string) userId, err := strconv.ParseUint(strId, 10, 64) // 10进制 - if err != nil { + if err != nil || userId == 0 { c.CJSON(errs.ErrAuthNoLogin) return } diff --git a/router/router.go b/router/router.go index adf2741..5dcefe6 100644 --- a/router/router.go +++ b/router/router.go @@ -43,13 +43,13 @@ func SetupRouter(s *gin.Engine, feEmbed embed.FS) { backend.GET("/auth/logout", api.AuthLogout) // 菜单相关接口 - backend.GET("/menu", api.GetIndexMenus) + backend.GET("/menu", api.MenuIndex) // 用户相关接口 - backend.GET("/user/current", api.GetUserinfo) + backend.GET("/user/current", api.UserCurrent) backendAdmin := backend.Group("/admin") - backendAdmin.GET("/menu", api.GetAdminMenus) + backendAdmin.GET("/menu", api.MenuAdmin) s.StaticFS("/static", getFileSystem(feEmbed, "web/build/static")) s.NoRoute(func(ctx *gin.Context) { diff --git a/web/src/index.js b/web/src/index.js index b7534d5..7a6afdb 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -1,15 +1,20 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import {BrowserRouter as Router, Routes, Route, Navigate} from 'react-router-dom' -import {mainRoutes} from "./routes" -import AdminFrame from "./pages/admin/layout/AdminFrame" +import React from "react"; +import ReactDOM from "react-dom/client"; +import { + BrowserRouter as Router, + Routes, + Route, + Navigate, +} from "react-router-dom"; +import { mainRoutes } from "./routes"; +import AdminFrame from "./pages/admin/layout/AdminFrame"; -const root = ReactDOM.createRoot(document.getElementById('root')); +const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - } /> + } /> {mainRoutes.map((route, index) => { return ; })} @@ -18,4 +23,3 @@ root.render( ); - diff --git a/web/src/pages/Login.js b/web/src/pages/Login.js index 8e587a7..12555cc 100644 --- a/web/src/pages/Login.js +++ b/web/src/pages/Login.js @@ -1,53 +1,160 @@ -import React from 'react' -import { Col, Layout, Row, Divider, theme, Space, Button, QRCode, Flex } from 'antd'; -import {QqOutlined,GoogleOutlined, GithubOutlined} from '@ant-design/icons' -import Logo from '../components/Logo'; -import AdminFooter from './admin/layout/AdminFooter'; -import BackgroundImg from '../assets/images/loginbackground2@2x.png' +import React, { useEffect } from "react"; +import { + Col, + Layout, + Row, + Divider, + theme, + Space, + Button, + QRCode, + Flex, + Spin, + message, +} from "antd"; +import { + QqOutlined, + GoogleOutlined, + GithubOutlined, + LoadingOutlined, +} from "@ant-design/icons"; +import Logo from "../components/Logo"; +import AdminFooter from "./admin/layout/AdminFooter"; +import BackgroundImg from "../assets/images/loginbackground2@2x.png"; +import { useLocation, useNavigate } from "react-router-dom"; +import ApiClient from "../services/client"; function Login() { - const { token } = theme.useToken(); - return ( - -
- - - - - - - + const { token } = theme.useToken(); + const location = useLocation(); + const navigate = useNavigate(); + const searchParams = new URLSearchParams(location.search); + const isCallback = searchParams.get("callback"); + + const [messageApi, contextHolder] = message.useMessage(); - - -

微信登录

- -

使用微信扫一扫登录

"League"

-
-
- - - - 其他登录方式: -
- -
- ) + + + + + + )} + {contextHolder} + + ); } -export default Login +export default Login; diff --git a/web/src/services/client.js b/web/src/services/client.js index f809e21..247e75b 100644 --- a/web/src/services/client.js +++ b/web/src/services/client.js @@ -7,13 +7,12 @@ const ApiClient = axios.create({ ApiClient.interceptors.request.use((config) => { // TODO: 计算csrf token const csrfToken = "1234"; - const jwt = - "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJsZWFndWUiLCJleHAiOjE3MjAyOTIxOTMsIm5iZiI6MTcyMDI4NDY5MywiaWF0IjoxNzIwMjg0OTkzLCJqdGkiOiIxIn0.4Q2L3FfuxrBQ7d05NiY7_dNqZi_ckCM36lv2FSR3YLuUgkTeNrY8Wp5GGxt-GVh6"; + const jwt = JSON.parse(localStorage.getItem("jwt")); if (csrfToken) { config.headers["X-Csrf-Token"] = csrfToken; } - if (jwt) { - config.headers["X-Token"] = jwt; + if (jwt?.token) { + config.headers["X-Token"] = jwt?.token; } return config; });