package main import ( "context" "fmt" "os" "time" "github.com/golang-jwt/jwt/v5" "github.com/google/uuid" "github.com/redis/go-redis/v9" "gopkg.in/yaml.v3" "gorm.io/driver/mysql" "gorm.io/gorm" ) // 配置结构 type AppConfig struct { JwtAuth struct { AccessSecret string `yaml:"AccessSecret"` } `yaml:"JwtAuth"` MySQL struct { Addr string `yaml:"Addr"` Dbname string `yaml:"Dbname"` Username string `yaml:"Username"` Password string `yaml:"Password"` Config string `yaml:"Config"` } `yaml:"MySQL"` Redis struct { Host string `yaml:"Host"` Pass string `yaml:"Pass"` DB int `yaml:"DB"` } `yaml:"Redis"` } func main() { fmt.Println("====== 本地测试用户创建 ======") // 1. 读取配置 cfgData, err := os.ReadFile("configs/ppanel.yaml") if err != nil { fmt.Printf("读取配置失败: %v\n", err) return } var cfg AppConfig if err := yaml.Unmarshal(cfgData, &cfg); err != nil { fmt.Printf("解析配置失败: %v\n", err) return } // 2. 连接 Redis rdb := redis.NewClient(&redis.Options{ Addr: cfg.Redis.Host, Password: cfg.Redis.Pass, DB: cfg.Redis.DB, }) ctx := context.Background() if err := rdb.Ping(ctx).Err(); err != nil { fmt.Printf("Redis 连接失败: %v\n", err) return } fmt.Println("✅ Redis 连接成功") // 3. 连接数据库 dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", cfg.MySQL.Username, cfg.MySQL.Password, cfg.MySQL.Addr, cfg.MySQL.Dbname, cfg.MySQL.Config) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { fmt.Printf("数据库连接失败: %v\n", err) return } fmt.Println("✅ 数据库连接成功") // 4. 查找一个有 refer_code 的用户 var user struct { Id int64 `gorm:"column:id"` ReferCode string `gorm:"column:refer_code"` } result := db.Table("user"). Where("refer_code IS NOT NULL AND refer_code != ''"). First(&user) if result.Error != nil { // 没有找到有 refer_code 的用户,查找第一个用户并添加 refer_code fmt.Println("没有找到有 refer_code 的用户,正在更新第一个用户...") result = db.Table("user").First(&user) if result.Error != nil { fmt.Printf("没有找到用户: %v\n", result.Error) return } // 更新 refer_code newReferCode := fmt.Sprintf("TEST%d", time.Now().Unix()%10000) db.Table("user").Where("id = ?", user.Id).Update("refer_code", newReferCode) user.ReferCode = newReferCode fmt.Printf("已为用户 ID=%d 添加 refer_code: %s\n", user.Id, newReferCode) } fmt.Printf("✅ 找到用户: ID=%d, ReferCode=%s\n", user.Id, user.ReferCode) // 5. 生成 JWT Token sessionId := uuid.New().String() now := time.Now() expireAt := now.Add(time.Hour * 24 * 7) // 7 天 claims := jwt.MapClaims{ "UserId": user.Id, "SessionId": sessionId, "DeviceId": 0, "LoginType": "", "iat": now.Unix(), "exp": expireAt.Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenString, err := token.SignedString([]byte(cfg.JwtAuth.AccessSecret)) if err != nil { fmt.Printf("生成 token 失败: %v\n", err) return } // 6. 在 Redis 中创建 session // 正确格式:auth:session_id:sessionId = userId sessionKey := fmt.Sprintf("auth:session_id:%s", sessionId) err = rdb.Set(ctx, sessionKey, fmt.Sprintf("%d", user.Id), time.Hour*24*7).Err() if err != nil { fmt.Printf("创建 session 失败: %v\n", err) return } fmt.Printf("✅ Session 创建成功: %s = %d\n", sessionKey, user.Id) // 7. 清除旧的短链接缓存,确保重新生成 cacheKey := "cache:invite:short_link:" + user.ReferCode rdb.Del(ctx, cacheKey) fmt.Printf("✅ 已清除旧缓存: %s\n", cacheKey) // 7. 输出测试信息 fmt.Println("\n====================================") fmt.Println("测试 Token 生成成功!") fmt.Println("====================================") fmt.Printf("\n用户 ID: %d\n", user.Id) fmt.Printf("邀请码: %s\n", user.ReferCode) fmt.Printf("Session ID: %s\n", sessionId) fmt.Printf("过期时间: %s\n", expireAt.Format("2006-01-02 15:04:05")) fmt.Println("\n====== Token ======") fmt.Println(tokenString) fmt.Println("\n====== 测试命令 ======") fmt.Printf("curl -s 'http://127.0.0.1:8080/v1/public/user/info' \\\n") fmt.Printf(" -H 'authorization: %s' | jq '.'\n", tokenString) }