fix: 安装时创建管理员用户,登录从数据库验证
Build and Deploy / build (push) Failing after 1m49s
Build and Deploy / deploy (push) Has been skipped

This commit is contained in:
2026-07-16 18:50:54 +00:00
parent 67bef239b0
commit a6b03a6152
3 changed files with 48 additions and 25 deletions
+13 -6
View File
@@ -32,11 +32,6 @@ func main() {
log.Fatalf("数据库初始化失败: %v", err) log.Fatalf("数据库初始化失败: %v", err)
} }
defer database.Close() defer database.Close()
// 确保 admin 用户存在
if err := database.EnsureAdminUser(); err != nil {
log.Printf("警告: 创建管理员用户失败: %v", err)
}
} }
// 创建 Gin 引擎 // 创建 Gin 引擎
@@ -165,7 +160,19 @@ func handleInstall(c *gin.Context) {
// 保存配置 // 保存配置
if err := config.Save(cfg); err != nil { 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 return
} }
+18 -4
View File
@@ -62,8 +62,8 @@ func Close() error {
return nil return nil
} }
// 确保 admin 用户存在 // 确保 admin 用户存在(仅在安装时调用)
func EnsureAdminUser() error { func EnsureAdminUser(username, password string) error {
var count int64 var count int64
DB.Model(&model.User{}).Where("role = ?", model.RoleAdmin).Count(&count) DB.Model(&model.User{}).Where("role = ?", model.RoleAdmin).Count(&count)
if count > 0 { if count > 0 {
@@ -71,8 +71,8 @@ func EnsureAdminUser() error {
} }
admin := &model.User{ admin := &model.User{
Username: "admin", Username: username,
HashedPassword: HashPassword("admin"), HashedPassword: HashPassword(password),
Role: model.RoleAdmin, Role: model.RoleAdmin,
Balance: 1000000, Balance: 1000000,
} }
@@ -80,6 +80,20 @@ func EnsureAdminUser() error {
return DB.Create(admin).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 { func HashPassword(password string) string {
// 简化处理,实际应使用 bcrypt // 简化处理,实际应使用 bcrypt
// 后续补充完整实现 // 后续补充完整实现
+11 -9
View File
@@ -4,6 +4,7 @@ import (
"net/http" "net/http"
"anticaptcha/internal/captcha" "anticaptcha/internal/captcha"
"anticaptcha/internal/database"
"anticaptcha/internal/middleware" "anticaptcha/internal/middleware"
"anticaptcha/internal/model" "anticaptcha/internal/model"
@@ -86,9 +87,14 @@ func (h *CaptchaHandler) Login(c *gin.Context) {
return return
} }
// TODO: 验证用户密码 // 从数据库验证用户
if req.Username == "admin" && req.Password == "admin" { user, err := database.ValidateUser(req.Username, req.Password)
token, err := middleware.GenerateToken(1, "admin", "admin") if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
return
}
token, err := middleware.GenerateToken(int(user.ID), user.Username, string(user.Role))
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "生成令牌失败"}) c.JSON(http.StatusInternalServerError, gin.H{"error": "生成令牌失败"})
return return
@@ -97,13 +103,9 @@ func (h *CaptchaHandler) Login(c *gin.Context) {
c.JSON(http.StatusOK, model.LoginResponse{ c.JSON(http.StatusOK, model.LoginResponse{
AccessToken: token, AccessToken: token,
TokenType: "bearer", TokenType: "bearer",
Role: "admin", Role: string(user.Role),
Balance: 1000000, Balance: user.Balance,
}) })
return
}
c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
} }
// 验证令牌 // 验证令牌