Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
153 lines
4.2 KiB
Go
153 lines
4.2 KiB
Go
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)
|
||
}
|