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, + }) } // 验证令牌