diff --git a/server/initialize/router.go b/server/initialize/router.go index f06d053..0e61fb1 100644 --- a/server/initialize/router.go +++ b/server/initialize/router.go @@ -57,6 +57,7 @@ func Routers() *gin.Engine { systemRouter := router.RouterGroupApp.System exampleRouter := router.RouterGroupApp.Example + appRouter := router.RouterGroupApp.App // 前台应用路由 // 如果想要不使用nginx代理前端网页,可以修改 web/.env.production 下的 // VUE_APP_BASE_API = / // VUE_APP_BASE_PATH = http://localhost @@ -67,9 +68,9 @@ func Routers() *gin.Engine { Router.StaticFS(global.GVA_CONFIG.Local.StorePath, justFilesFilesystem{http.Dir(global.GVA_CONFIG.Local.StorePath)}) // Router.Use(middleware.LoadTls()) // 如果需要使用https 请打开此中间件 然后前往 core/server.go 将启动模式 更变为 Router.RunTLS("端口","你的cre/pem文件","你的key文件") // 跨域,如需跨域可以打开下面的注释 - // Router.Use(middleware.Cors()) // 直接放行全部跨域请求 - // Router.Use(middleware.CorsByRules()) // 按照配置的规则放行跨域请求 - // global.GVA_LOG.Info("use middleware cors") + Router.Use(middleware.Cors()) // 直接放行全部跨域请求 + //Router.Use(middleware.CorsByRules()) // 按照配置的规则放行跨域请求 + global.GVA_LOG.Info("use middleware cors") docs.SwaggerInfo.BasePath = global.GVA_CONFIG.System.RouterPrefix Router.GET(global.GVA_CONFIG.System.RouterPrefix+"/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) global.GVA_LOG.Info("register swagger handler") @@ -117,6 +118,18 @@ func Routers() *gin.Engine { exampleRouter.InitAttachmentCategoryRouterRouter(PrivateGroup) // 文件上传下载分类 } + // 前台应用路由(新增) + { + appGroup := PublicGroup.Group("app") // 统一使用 /app 前缀 + appRouter.InitAuthRouter(appGroup) // 认证路由:/app/auth/* 和 /app/user/* + appRouter.InitCharacterRouter(appGroup) // 角色卡路由:/app/character/* + appRouter.InitConversationRouter(appGroup) // 对话路由:/app/conversation/* + appRouter.InitAIConfigRouter(appGroup) // AI配置路由:/app/ai-config/* + appRouter.InitPresetRouter(appGroup) // 预设路由:/app/preset/* + appRouter.InitUploadRouter(appGroup) // 上传路由:/app/upload/* + appRouter.InitWorldbookRouter(appGroup) // 世界书路由:/app/worldbook/* + appRouter.InitRegexScriptRouter(appGroup) // 正则脚本路由:/app/regex/* + } //插件路由安装 InstallPlugin(PrivateGroup, PublicGroup, Router) diff --git a/web-app/.env.development b/web-app/.env.development index f915f89..efe13ec 100644 --- a/web-app/.env.development +++ b/web-app/.env.development @@ -1 +1 @@ -VITE_API_BASE_URL=http://localhost:8888 +VITE_API_BASE_URL=http://192.168.100.160:8888 diff --git a/web-app/src/api/auth.ts b/web-app/src/api/auth.ts index ff7f556..65be39b 100644 --- a/web-app/src/api/auth.ts +++ b/web-app/src/api/auth.ts @@ -1,5 +1,12 @@ import apiClient from './client' +// 通用响应结构 +export interface ApiResponse { + code: number + data: T + msg: string +} + // 类型定义 export interface RegisterRequest { username: string @@ -61,12 +68,12 @@ export const authApi = { }, // 用户登录 - login: (data: LoginRequest): Promise<{ data: LoginResponse }> => { + login: (data: LoginRequest): Promise> => { return apiClient.post('/app/auth/login', data) }, // 刷新 Token - refreshToken: (refreshToken: string): Promise<{ data: LoginResponse }> => { + refreshToken: (refreshToken: string): Promise> => { return apiClient.post('/app/auth/refresh', { refreshToken }) }, @@ -76,7 +83,7 @@ export const authApi = { }, // 获取用户信息 - getUserInfo: (): Promise<{ data: User }> => { + getUserInfo: (): Promise> => { return apiClient.get('/app/auth/userinfo') }, diff --git a/web-app/src/pages/LoginPage.tsx b/web-app/src/pages/LoginPage.tsx index cfb672f..8ecb350 100644 --- a/web-app/src/pages/LoginPage.tsx +++ b/web-app/src/pages/LoginPage.tsx @@ -18,6 +18,12 @@ export default function LoginPage() { try { const response = await authApi.login({ username, password }) + + // 检查业务 code,只有 code === 0 才视为登录成功 + if (!response || response.code !== 0 || !response.data) { + throw new Error(response?.msg || '用户名或密码错误') + } + const { token, refreshToken, user } = response.data localStorage.setItem('token', token) @@ -26,7 +32,8 @@ export default function LoginPage() { navigate('/profile') } catch (err: any) { - setError(err || '登录失败,请检查用户名和密码') + const message = err?.message || err || '登录失败,请检查用户名和密码' + setError(message) } finally { setLoading(false) }