package cmd import ( "fmt" "api-server/internal/auth" "api-server/internal/db" "github.com/spf13/cobra" ) var userCmd = &cobra.Command{ Use: "user", Short: "用户管理", } func openDB(cmd *cobra.Command) (*db.DB, error) { dbDriver, _ := cmd.Flags().GetString("db-driver") dbDSN, _ := cmd.Flags().GetString("db-dsn") return db.Open(db.Config{Driver: db.Driver(dbDriver), DSN: dbDSN}) } var userListCmd = &cobra.Command{ Use: "list", Short: "列出所有用户", RunE: func(cmd *cobra.Command, args []string) error { database, err := openDB(cmd) if err != nil { return err } defer database.Close() users, err := database.ListUsers() if err != nil { return err } for _, u := range users { fmt.Printf(" [%d] %s %s %s\n", u.ID, u.Role, u.Email, u.Name) } return nil }, } var userPromoteCmd = &cobra.Command{ Use: "promote ", Short: "提升用户为管理员", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { database, err := openDB(cmd) if err != nil { return err } defer database.Close() if err := database.PromoteUser(args[0]); err != nil { return fmt.Errorf("提升失败: %w", err) } fmt.Printf("✅ 用户 %s 已提升为管理员\n", args[0]) return nil }, } var userCreateCmd = &cobra.Command{ Use: "create [name]", Short: "创建用户(默认角色 user)", Args: cobra.RangeArgs(2, 3), RunE: func(cmd *cobra.Command, args []string) error { database, err := openDB(cmd) if err != nil { return err } defer database.Close() email, password := args[0], args[1] name := "" if len(args) > 2 { name = args[2] } isAdmin, _ := cmd.Flags().GetBool("admin") hash, err := auth.HashPassword(password) if err != nil { return fmt.Errorf("密码加密失败: %w", err) } user, err := database.CreateUser(email, hash, name) if err != nil { return fmt.Errorf("创建失败: %w", err) } if isAdmin { if err := database.PromoteUser(email); err != nil { return fmt.Errorf("提升为管理员失败: %w", err) } } fmt.Printf("✅ 用户 [%d] %s 创建成功 (role=%s)\n", user.ID, user.Email, user.Role) return nil }, } var userDeleteCmd = &cobra.Command{ Use: "delete ", Short: "删除用户", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { database, err := openDB(cmd) if err != nil { return err } defer database.Close() if err := database.DeleteUser(args[0]); err != nil { return fmt.Errorf("删除失败: %w", err) } fmt.Printf("✅ 用户 %s 已删除\n", args[0]) return nil }, } var userResetPwdCmd = &cobra.Command{ Use: "reset-password ", Short: "重置用户密码", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { database, err := openDB(cmd) if err != nil { return err } defer database.Close() hash, err := auth.HashPassword(args[1]) if err != nil { return fmt.Errorf("密码加密失败: %w", err) } if err := database.UpdatePassword(args[0], hash); err != nil { return fmt.Errorf("密码重置失败: %w", err) } fmt.Printf("✅ 用户 %s 密码已重置\n", args[0]) return nil }, } func init() { userCmd.PersistentFlags().String("db-driver", "sqlite", "数据库驱动") userCmd.PersistentFlags().String("db-dsn", "./data/api.db", "数据库 DSN") userCmd.AddCommand(userListCmd) userCmd.AddCommand(userPromoteCmd) userCmd.AddCommand(userCreateCmd) userCmd.AddCommand(userDeleteCmd) userCmd.AddCommand(userResetPwdCmd) userCreateCmd.Flags().Bool("admin", false, "创建后直接提升为管理员") }