shanshanzhong 1d81df6664
Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
add:添加短链接服务
2026-01-24 00:32:08 -08:00

153 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}