From f0e1a649ee80e67e75652896d46eda3708e093e5 Mon Sep 17 00:00:00 2001 From: hurole <1192163814@qq.com> Date: Sat, 6 Sep 2025 20:42:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E7=99=BB=E5=BD=95=E4=BF=A1=E6=81=AF=E6=9C=AA?= =?UTF-8?q?=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/server/controllers/auth/index.ts | 16 ++++++++++++++-- apps/server/middlewares/authorization.ts | 3 +-- apps/server/prisma/data/dev.db | Bin 24576 -> 24576 bytes apps/web/src/pages/home/index.tsx | 11 +++++++---- apps/web/src/pages/login/service.ts | 22 +++++++++++++++++----- apps/web/src/pages/login/types.ts | 12 +++++++++++- apps/web/src/stores/global.tsx | 2 ++ 7 files changed, 52 insertions(+), 14 deletions(-) diff --git a/apps/server/controllers/auth/index.ts b/apps/server/controllers/auth/index.ts index f1e85a5..46132b5 100644 --- a/apps/server/controllers/auth/index.ts +++ b/apps/server/controllers/auth/index.ts @@ -17,11 +17,17 @@ export class AuthController { @Post('/login') async login(ctx: Context) { - if (!ctx.session.isNew) { + if (ctx.session.user) { return ctx.session.user; } const { code } = ctx.request.body as LoginRequestBody; - const { access_token } = await gitea.getToken(code); + const { access_token, refresh_token, expires_in } = + await gitea.getToken(code); + const giteaAuth = { + access_token, + refresh_token, + expires_at: Date.now() + expires_in * 1000, + }; const giteaUser = await gitea.getUserInfo(access_token); log.debug(this.TAG, 'gitea user: %o', giteaUser); const exist = await prisma.user.findFirst({ @@ -61,9 +67,15 @@ export class AuthController { log.debug(this.TAG, '更新用户信息成功 %o', updatedUser); ctx.session.user = updatedUser; } + ctx.session.gitea = giteaAuth; return ctx.session.user; } + @Get('logout') + async logout(ctx: Context) { + ctx.session.user = null; + } + @Get('info') async info(ctx: Context) { return ctx.session?.user; diff --git a/apps/server/middlewares/authorization.ts b/apps/server/middlewares/authorization.ts index 0c98ec8..11607bd 100644 --- a/apps/server/middlewares/authorization.ts +++ b/apps/server/middlewares/authorization.ts @@ -10,11 +10,10 @@ export class Authorization implements Middleware { apply(app: Koa) { app.use(async (ctx: Koa.Context, next: Koa.Next) => { - console.log('ctx.path', ctx.path) if (this.ignoreAuth.includes(ctx.path)) { return next(); } - if (ctx.session.isNew) { + if (ctx.session.user == null) { ctx.throw(401, 'Unauthorized'); } await next(); diff --git a/apps/server/prisma/data/dev.db b/apps/server/prisma/data/dev.db index cead5ad60947dcb0ee493a631ab5cb862fbd14cd..d04979eb9269ee07f85841b500237f85f8e55fbf 100644 GIT binary patch delta 36 ncmZoTz}Rqrae_3X=tLQ3M$wH46XFHrdD^*(D~n4~b0H)E+P@57 delta 36 ncmZoTz}Rqrae_3X@I)DBM&XSK6XFGAm+$i_t}HG|&4rKv>8=fK diff --git a/apps/web/src/pages/home/index.tsx b/apps/web/src/pages/home/index.tsx index 6bcebda..0a317e8 100644 --- a/apps/web/src/pages/home/index.tsx +++ b/apps/web/src/pages/home/index.tsx @@ -10,6 +10,7 @@ import { useState } from 'react'; import Logo from '@assets/images/logo.svg?react'; import { Link, Outlet } from 'react-router'; import { useGlobalStore } from '../../stores/global'; +import { loginService } from '@pages/login/service'; function Home() { const [collapsed, setCollapsed] = useState(false); @@ -56,18 +57,20 @@ function Home() {
- + 退出登录 } > -
- +
+ avatar({ + const { data, code } = await net.request({ method: 'POST', url: '/api/auth/login', data: { @@ -26,14 +27,25 @@ class LoginService { }, }); if (code === 0) { - localStorage.setItem('user', JSON.stringify(data)); + useGlobalStore.getState().setUser(data); navigate('/'); Notification.success({ title: '提示', - content: '登录成功' + content: '登录成功', }); } } + + async logout() { + const { code } = await net.request({ + method: 'GET', + url: '/api/auth/logout', + }); + if (code === 0) { + Message.success('登出成功'); + window.location.href = '/login'; + } + } } export const loginService = new LoginService(); diff --git a/apps/web/src/pages/login/types.ts b/apps/web/src/pages/login/types.ts index cd5456a..bda3385 100644 --- a/apps/web/src/pages/login/types.ts +++ b/apps/web/src/pages/login/types.ts @@ -1,5 +1,15 @@ import type { APIResponse } from '@shared'; +export interface User { + id: string; + username: string; + email: string; + avatar_url: string; + active: boolean; +} + export type AuthURLResponse = APIResponse<{ url: string; -}> +}>; + +export type AuthLoginResponse = APIResponse; diff --git a/apps/web/src/stores/global.tsx b/apps/web/src/stores/global.tsx index ddd34ce..26ce27e 100644 --- a/apps/web/src/stores/global.tsx +++ b/apps/web/src/stores/global.tsx @@ -11,11 +11,13 @@ interface User { interface GlobalStore { user: User | null; + setUser: (user: User) => void; refreshUser: () => Promise; } export const useGlobalStore = create((set) => ({ user: null, + setUser: (user: User) => set({ user }), async refreshUser() { const { data } = await net.request>({ method: 'GET',