| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- package services
- import (
- "context"
- "fmt"
- "image/color"
- "sync"
- "time"
- "github.com/jmoiron/sqlx"
- "github.com/go-redis/redis/v8"
- "github.com/gorilla/sessions"
- "github.com/mojocn/base64Captcha"
- )
- var (
- // 配置信息
- AppConfig = struct {
- SessionSecret string
- SessionName string
- CaptchaType string
- }{
- SessionSecret: "your-very-secret-key-change-in-production",
- SessionName: "auth_session",
- CaptchaType: "digit", // math, digit, audio, string
- }
- // 全局服务实例
- sessionStore *sessions.CookieStore
- captchaDriver base64Captcha.Driver
- initOnce sync.Once
- RedisClient *redis.Client
- MYSQL_DB *sqlx.DB
- JdbcClient *DBClient
- MinioClient *MinioService
- )
- // 验证码配置
- const (
- CaptchaExpireMin = 5 // 验证码过期时间(分钟)
- CaptchaRedisPrefix = "code-key-" // 验证码结果存储键前缀
- )
- const (
- BucketName = "process"
- )
- // InitConfig 初始化配置
- func InitConfig() {
- // 这里可以读取配置文件或环境变量
- // 例如:AppConfig.SessionSecret = os.Getenv("SESSION_SECRET")
- }
- // SessionStore 获取会话存储
- func SessionStore() *sessions.CookieStore {
- initOnce.Do(func() {
- sessionStore = sessions.NewCookieStore([]byte(AppConfig.SessionSecret))
- sessionStore.Options = &sessions.Options{
- Path: "/",
- MaxAge: 86400 * 7, // 7天
- HttpOnly: true,
- Secure: false, // 开发环境设为false,生产环境设为true
- }
- })
- return sessionStore
- }
- // InitServices 初始化服务
- func InitCaptcha() {
- // 初始化验证码驱动
- switch AppConfig.CaptchaType {
- case "digit":
- captchaDriver = base64Captcha.NewDriverDigit(80, 240, 4, 0.2, 10)
- case "math":
- captchaDriver = base64Captcha.NewDriverMath(
- 70, // 高度 - 适当高度,保证清晰度
- 240, // 宽度 - 足够宽度显示数学公式
- 0, // 干扰线数量 - 设置为0提高可读性
- 0, // 干扰点数量 - 设置为0提高可读性
- &color.RGBA{R: 255, G: 255, B: 255, A: 255}, // 白色背景
- nil, // 字体列表 - 使用默认
- []string{"RitaSmith.ttf"}, // 使用清晰字体
- )
- case "audio":
- captchaDriver = base64Captcha.NewDriverAudio(4, "en")
- default:
- captchaDriver = base64Captcha.NewDriverString(80, 240, 4, 0, 4, "1234567890", nil, nil, nil)
- }
- }
- func InitMyRedis(addr string, password string, dbn int) {
- RedisClient = redis.NewClient(&redis.Options{
- Addr: addr, // Redis地址
- Password: password, // Redis密码(无则留空)
- DB: dbn, // 使用的数据库
- })
- ctx := context.Background()
- err := RedisClient.Set(ctx, "mes", "mes-redis", 10*time.Second).Err()
- if err == nil {
- build_time := time.Now()
- build_time_str := build_time.Format(time.DateTime)
- fmt.Printf("%s redis客户端启动成功\n", build_time_str)
- } else {
- fmt.Printf("redis.err=====%v\n", err)
- }
- }
- func InitMysqlPool(user string, password string, host string, port int, dbname string, log bool) {
- db_config := DefaultConfig(user, password, host, port, dbname)
- MYSQL_DB = NewPool(db_config)
- JdbcClient = NewDBClient(MYSQL_DB, log)
- // // 准备预编译语句
- // stmt, err := MYSQL_DB.Preparex("SELECT VERSION()")
- // if err != nil {
- // print(err)
- // }
- // defer stmt.Close()
- // var version string
- // err = stmt.QueryRowx().Scan(&version)
- // if err != nil {
- // print(err)
- // }
- // print("Database Version: ", version,"\n")
- }
- func InitMinioServie(addr string, user string, password string, usessl bool) {
- MinioClient = NewMinioService(
- addr,
- user,
- password,
- usessl,
- )
- build_time := time.Now()
- build_time_str := build_time.Format(time.DateTime)
- ctx := context.Background()
- _, err := MinioClient.client.BucketExists(ctx, "process")
- if err == nil {
- fmt.Printf("%s minio客户端初始化成功\n", build_time_str)
- } else {
- fmt.Printf("minio客户端.err=====%v\n", err)
- }
- }
- // GetCaptchaDriver 获取验证码驱动
- func GetCaptchaDriver() base64Captcha.Driver {
- return captchaDriver
- }
- // GetRedisClient 获取Redis客户端
- func GetRedisClient() *redis.Client {
- return RedisClient
- }
- // func GetMysqlPool() *sqlx.DB {
- // return MYSQL_DB
- // }
- func GetMinioClient() *MinioService {
- return MinioClient
- }
|