b 4 tháng trước cách đây
mục cha
commit
c8c8e3568e
1 tập tin đã thay đổi với 55 bổ sung29 xóa
  1. 55 29
      src/gin/jwtx/InitGroup.go

+ 55 - 29
src/gin/jwtx/InitGroup.go

@@ -9,8 +9,8 @@ import (
 	"git.ooo.ink/root/go-kit/src/gin/jwtx/db/dao/model"
 	"git.ooo.ink/root/go-kit/src/gin/jwtx/db/dao/model"
 	"git.ooo.ink/root/go-kit/src/gin/jwtx/tool"
 	"git.ooo.ink/root/go-kit/src/gin/jwtx/tool"
 	"git.ooo.ink/root/go-kit/src/gorm/mysqlx"
 	"git.ooo.ink/root/go-kit/src/gorm/mysqlx"
+	"git.ooo.ink/root/go-kit/src/logx"
 	"git.ooo.ink/root/go-kit/src/utilx"
 	"git.ooo.ink/root/go-kit/src/utilx"
-	"github.com/5-say/go-tool/logx"
 	"github.com/jinzhu/configor"
 	"github.com/jinzhu/configor"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
 	"gorm.io/gorm/logger"
@@ -18,64 +18,90 @@ import (
 	_ "embed"
 	_ "embed"
 )
 )
 
 
-// 初始化分组(支持多次调用)
+// InitGroup 初始化 JWTX 认证分组(支持多次调用,用于多租户场景
 //
 //
-//	group          string 分组名称
-//	configPath     string 分组配置文件路径
-//	privateKeyPath string 分组私钥文件路径
+// 该函数负责为指定的认证分组进行完整的初始化配置,包括:
+// - 配置文件管理(自动创建默认配置)
+// - 私钥文件管理(自动生成新私钥)
+// - 数据库连接初始化
+// - 数据库表结构迁移
+// - 配置热重载设置
 //
 //
-// e.g.
+// 参数说明:
 //
 //
-//	jwtx.InitGroup("admin", "jwtx/config/admin.yaml", "jwtx/config/admin.key")
-//	jwtx.InitGroup("user",  "jwtx/config/user.yaml",  "jwtx/config/user.key")
+//	group          string 分组名称 - 认证分组标识(如:"admin", "user", "merchant" 等)
+//	configPath     string 分组配置文件路径 - YAML 格式的配置文件路径
+//	privateKeyPath string 分组私钥文件路径 - PEM 格式的私钥文件路径
+//
+// 返回值:
+//
+//	*SingletonT - 返回单例对象,支持链式调用其他方法
+//
+// 注意事项:
+// - 配置文件支持热重载(每秒自动检测更新)
+// - 如果配置文件不存在,会自动创建默认配置
+// - 如果私钥文件不存在,会自动生成新的私钥
+// - 数据库连接使用配置中的 MySQL DSN
+// - 关键步骤失败会 panic,确保系统在正确配置下运行
+//
+// 使用示例:
+//
+//	// 初始化管理员认证分组
+//	jwtx.InitGroup("admin", "jwtx/config/admin.yaml", "jwtx/config/admin.pem")
+//
+//	// 初始化用户认证分组
+//	jwtx.InitGroup("user", "jwtx/config/user.yaml", "jwtx/config/user.pem")
+//
+//	// 初始化商户认证分组
+//	jwtx.InitGroup("merchant", "jwtx/config/merchant.yaml", "jwtx/config/merchant.pem")
 func InitGroup(group, configPath, privateKeyPath string) *SingletonT {
 func InitGroup(group, configPath, privateKeyPath string) *SingletonT {
-	// 配置文件不存在则创建
+	// 配置文件不存在则创建 - 确保配置文件存在,如果不存在会自动创建默认配置
 	createConfigFileIfNotExist(configPath)
 	createConfigFileIfNotExist(configPath)
 
 
-	// 私钥文件不存在则创建
+	// 私钥文件不存在则创建 - 确保私钥文件存在,如果不存在会自动生成新的私钥
 	createKeyFileIfNotExist(privateKeyPath)
 	createKeyFileIfNotExist(privateKeyPath)
 
 
-	// 取得单例
+	// 取得单例 - 如果全局单例对象尚未初始化,则进行初始化
 	if Singleton == nil {
 	if Singleton == nil {
 		Singleton = &SingletonT{}
 		Singleton = &SingletonT{}
-		Singleton.DB = make(map[string]*gorm.DB)
-		Singleton.Config = make(map[string]GroupConfig)
-		Singleton.PrivateKey = make(map[string]ed25519.PrivateKey)
+		Singleton.DB = make(map[string]*gorm.DB)                   // 初始化数据库连接映射,按分组存储
+		Singleton.Config = make(map[string]GroupConfig)            // 初始化配置映射,按分组存储
+		Singleton.PrivateKey = make(map[string]ed25519.PrivateKey) // 初始化私钥映射,按分组存储
 	}
 	}
 
 
-	// 引用简化
+	// 引用简化 - 使用局部变量简化代码书写
 	var s = Singleton
 	var s = Singleton
 
 
-	// 初始化分组配置,每秒自动更新
+	// 初始化分组配置,每秒自动更新 - 使用 configor 库加载配置文件,支持热重载
 	var config GroupConfig
 	var config GroupConfig
 	err := configor.New(&configor.Config{AutoReload: true}).Load(&config, configPath)
 	err := configor.New(&configor.Config{AutoReload: true}).Load(&config, configPath)
 	if err != nil {
 	if err != nil {
-		panic(err)
+		panic(err) // 配置文件加载失败,系统无法正常运行
 	}
 	}
-	s.Config[group] = config
+	s.Config[group] = config // 将配置存储到对应分组
 
 
-	// 初始化分组数据库连接
+	// 初始化分组数据库连接 - 根据配置中的 MySQL DSN 创建数据库连接
 	s.DB[group], err = mysqlx.New(config.MysqlDSN, logx.GormLogger(logger.Config{
 	s.DB[group], err = mysqlx.New(config.MysqlDSN, logx.GormLogger(logger.Config{
-		SlowThreshold:             200 * time.Millisecond,
-		IgnoreRecordNotFoundError: false,
-		ParameterizedQueries:      false,
-		LogLevel:                  logger.Warn,
+		SlowThreshold:             200 * time.Millisecond, // 慢查询阈值:200毫秒
+		IgnoreRecordNotFoundError: false,                  // 不忽略记录未找到错误
+		ParameterizedQueries:      false,                  // 不使用参数化查询
+		LogLevel:                  logger.Warn,            // 日志级别:警告
 	}))
 	}))
 	if err != nil {
 	if err != nil {
-		panic(err)
+		panic(err) // 数据库连接失败,系统无法正常运行
 	}
 	}
 
 
-	// 初始化数据库结构
+	// 初始化数据库结构 - 自动创建或更新 JWT token 表结构
 	s.DB[group].AutoMigrate(&model.JwtxToken{})
 	s.DB[group].AutoMigrate(&model.JwtxToken{})
 
 
-	// 初始化分组私钥
+	// 初始化分组私钥 - 从文件加载私钥用于 JWT token 签名
 	privateKey, err := tool.GetPrivateKey(privateKeyPath)
 	privateKey, err := tool.GetPrivateKey(privateKeyPath)
 	if err != nil {
 	if err != nil {
-		panic(err)
+		panic(err) // 私钥加载失败,系统无法正常运行
 	}
 	}
-	s.PrivateKey[group] = *privateKey
+	s.PrivateKey[group] = *privateKey // 将私钥存储到对应分组
 
 
-	return s
+	return s // 返回单例对象,便于链式调用
 }
 }
 
 
 //go:embed example/demo.yaml
 //go:embed example/demo.yaml