From a6b03a6152453630339ab5c782e58e5d39aa72d0 Mon Sep 17 00:00:00 2001 From: Admin Date: Thu, 16 Jul 2026 18:50:54 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=89=E8=A3=85=E6=97=B6=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E7=AE=A1=E7=90=86=E5=91=98=E7=94=A8=E6=88=B7=EF=BC=8C?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BB=8E=E6=95=B0=E6=8D=AE=E5=BA=93=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/server/main.go | 19 +++++++++++++------ internal/database/database.go | 22 ++++++++++++++++++---- internal/handler/captcha.go | 32 +++++++++++++++++--------------- 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 5c33e5b..e1357b3 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -32,11 +32,6 @@ func main() { log.Fatalf("数据库初始化失败: %v", err) } defer database.Close() - - // 确保 admin 用户存在 - if err := database.EnsureAdminUser(); err != nil { - log.Printf("警告: 创建管理员用户失败: %v", err) - } } // 创建 Gin 引擎 @@ -165,7 +160,19 @@ func handleInstall(c *gin.Context) { // 保存配置 if err := config.Save(cfg); err != nil { - c.JSON(500, gin.H{"error": "保存配置失败"}) + c.JSON(500, gin.H{"error": "保存配置失败: " + err.Error()}) + return + } + + // 初始化数据库 + if err := database.Init(&cfg.Database); err != nil { + c.JSON(500, gin.H{"error": "数据库初始化失败: " + err.Error()}) + return + } + + // 创建管理员用户 + if err := database.EnsureAdminUser(req.Admin.Username, req.Admin.Password); err != nil { + c.JSON(500, gin.H{"error": "创建管理员用户失败: " + err.Error()}) return } diff --git a/internal/database/database.go b/internal/database/database.go index 7758523..3a8c75d 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -62,8 +62,8 @@ func Close() error { return nil } -// 确保 admin 用户存在 -func EnsureAdminUser() error { +// 确保 admin 用户存在(仅在安装时调用) +func EnsureAdminUser(username, password string) error { var count int64 DB.Model(&model.User{}).Where("role = ?", model.RoleAdmin).Count(&count) if count > 0 { @@ -71,8 +71,8 @@ func EnsureAdminUser() error { } admin := &model.User{ - Username: "admin", - HashedPassword: HashPassword("admin"), + Username: username, + HashedPassword: HashPassword(password), Role: model.RoleAdmin, Balance: 1000000, } @@ -80,6 +80,20 @@ func EnsureAdminUser() error { return DB.Create(admin).Error } +// 验证用户登录 +func ValidateUser(username, password string) (*model.User, error) { + var user model.User + if err := DB.Where("username = ?", username).First(&user).Error; err != nil { + return nil, err + } + + if user.HashedPassword != password { + return nil, fmt.Errorf("密码错误") + } + + return &user, nil +} + func HashPassword(password string) string { // 简化处理,实际应使用 bcrypt // 后续补充完整实现 diff --git a/internal/handler/captcha.go b/internal/handler/captcha.go index 1be24f6..ada2636 100644 --- a/internal/handler/captcha.go +++ b/internal/handler/captcha.go @@ -4,6 +4,7 @@ import ( "net/http" "anticaptcha/internal/captcha" + "anticaptcha/internal/database" "anticaptcha/internal/middleware" "anticaptcha/internal/model" @@ -86,24 +87,25 @@ func (h *CaptchaHandler) Login(c *gin.Context) { return } - // TODO: 验证用户密码 - if req.Username == "admin" && req.Password == "admin" { - token, err := middleware.GenerateToken(1, "admin", "admin") - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"error": "生成令牌失败"}) - return - } - - c.JSON(http.StatusOK, model.LoginResponse{ - AccessToken: token, - TokenType: "bearer", - Role: "admin", - Balance: 1000000, - }) + // 从数据库验证用户 + user, err := database.ValidateUser(req.Username, req.Password) + if err != nil { + c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"}) return } - c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"}) + token, err := middleware.GenerateToken(int(user.ID), user.Username, string(user.Role)) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "生成令牌失败"}) + return + } + + c.JSON(http.StatusOK, model.LoginResponse{ + AccessToken: token, + TokenType: "bearer", + Role: string(user.Role), + Balance: user.Balance, + }) } // 验证令牌