diff --git a/backend/cmd/main.go b/backend/cmd/main.go index ec8d9b1..85bc481 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -25,8 +25,12 @@ var embeddedFiles embed.FS func main() { if len(os.Args) > 1 { switch os.Args[1] { + case "list-admin": + listAdmins() case "reset-password": resetPassword() + case "create-admin": + createAdmin() case "help", "-h", "--help": printHelp() default: @@ -42,13 +46,105 @@ func main() { func printHelp() { fmt.Println("用法:") - fmt.Println(" verify 启动服务器") + fmt.Println(" verify 启动服务器") + fmt.Println(" verify list-admin 列出所有管理员账号") fmt.Println(" verify reset-password <用户名> [新密码] 重置管理员密码") - fmt.Println(" verify help 显示帮助信息") + fmt.Println(" verify create-admin <用户名> <密码> [邮箱] 创建新管理员") + fmt.Println(" verify help 显示帮助信息") fmt.Println() fmt.Println("示例:") - fmt.Println(" verify reset-password admin 随机生成新密码") - fmt.Println(" verify reset-password admin newpass 设置指定密码") + fmt.Println(" verify list-admin") + fmt.Println(" verify reset-password admin") + fmt.Println(" verify reset-password admin newpass") + fmt.Println(" verify create-admin newadmin password123 admin@example.com") +} + +func listAdmins() { + config.Init() + database.Init() + + var users []struct { + ID uint + Username string + Email *string + Role string + Status string + CreatedAt string + } + + if err := database.DB.Table("users").Where("role = ?", "admin").Find(&users).Error; err != nil { + fmt.Printf("错误: 查询失败 - %v\n", err) + os.Exit(1) + } + + if len(users) == 0 { + fmt.Println("没有找到管理员账号") + return + } + + fmt.Println("管理员账号列表:") + fmt.Println("----------------------------------------") + for _, u := range users { + email := "" + if u.Email != nil { + email = *u.Email + } + fmt.Printf("ID: %d 用户名: %s 邮箱: %s 状态: %s\n", u.ID, u.Username, email, u.Status) + } + fmt.Println("----------------------------------------") +} + +func createAdmin() { + config.Init() + database.Init() + + if len(os.Args) < 4 { + fmt.Println("用法: verify create-admin <用户名> <密码> [邮箱]") + os.Exit(1) + } + + username := os.Args[2] + password := os.Args[3] + email := "" + if len(os.Args) >= 5 { + email = os.Args[4] + } + + if len(password) < 6 { + fmt.Println("错误: 密码长度至少6位") + os.Exit(1) + } + + var count int64 + database.DB.Table("users").Where("username = ?", username).Count(&count) + if count > 0 { + fmt.Printf("错误: 用户名 '%s' 已存在\n", username) + os.Exit(1) + } + + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + fmt.Printf("错误: 密码加密失败 - %v\n", err) + os.Exit(1) + } + + emailPtr := (*string)(nil) + if email != "" { + emailPtr = &email + } + + if err := database.DB.Table("users").Create(map[string]interface{}{ + "username": username, + "password": string(hashedPassword), + "email": emailPtr, + "role": "admin", + "status": "active", + }).Error; err != nil { + fmt.Printf("错误: 创建失败 - %v\n", err) + os.Exit(1) + } + + fmt.Printf("成功: 管理员账号 '%s' 已创建\n", username) } func resetPassword() {