- 新增 go-redis/v9 依赖 - 新增 config.yaml redis 配置段 + RedisConfig 结构体 + REDIS_PASSWORD 环境变量覆盖 - 新增 common/redis.go Redis 客户端初始化 - 完整实现 session/redis_store.go,实现 Store 接口全部 7 个方法 - Redis TTL 自动过期,无须后台清理 goroutine - deps_core.go 根据 cfg.Redis.Enabled 自动选择 RedisStore/MemoryStore - router.go + main.go 透传 redisClient 参数
67 lines
2.5 KiB
Go
67 lines
2.5 KiB
Go
package router
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"metazone.cc/metalab/internal/config"
|
|
"metazone.cc/metalab/internal/controller"
|
|
adminCtrl "metazone.cc/metalab/internal/controller/admin"
|
|
"metazone.cc/metalab/internal/middleware"
|
|
"metazone.cc/metalab/internal/repository"
|
|
"metazone.cc/metalab/internal/service"
|
|
"metazone.cc/metalab/internal/session"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type dependencies struct {
|
|
authCtrl *controller.AuthController
|
|
authMdw *middleware.AuthMiddleware
|
|
maintenanceMdw *middleware.MaintenanceMiddleware
|
|
settingsCtrl *controller.SettingsController
|
|
messageCtrl *controller.MessageController
|
|
postCtrl *controller.PostController
|
|
spaceCtrl *controller.SpaceController
|
|
studioCtrl *controller.StudioController
|
|
adminPostCtrl *adminCtrl.AdminPostController
|
|
adminCtrl *adminCtrl.AdminController
|
|
auditCtrl *adminCtrl.AuditController
|
|
siteSettingCtrl *adminCtrl.SiteSettingController
|
|
}
|
|
|
|
func buildDepsCore(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) (
|
|
*repository.UserRepo, *session.Manager, *service.AuthService,
|
|
*middleware.RateLimiter, *controller.AuthController,
|
|
*service.AvatarService, *middleware.AuthMiddleware, *adminCtrl.AdminController,
|
|
) {
|
|
userRepo := repository.NewUserRepo(db)
|
|
|
|
idleTimeout := time.Duration(cfg.Session.IdleTimeout) * time.Minute
|
|
rememberTimeout := time.Duration(cfg.Session.RememberTimeout) * time.Minute
|
|
|
|
var sessionStore session.Store
|
|
|
|
if cfg.Redis.Enabled && redisClient != nil {
|
|
// Redis 模式(生产环境推荐)
|
|
sessionStore = session.NewRedisStore(redisClient, idleTimeout, rememberTimeout)
|
|
log.Println("[Router] 会话存储: Redis")
|
|
} else {
|
|
// 内存模式(开发/单实例)
|
|
memStore := session.NewMemoryStore(idleTimeout, rememberTimeout)
|
|
memStore.StartCleanup(time.Duration(cfg.Session.CleanupInterval) * time.Second)
|
|
sessionStore = memStore
|
|
log.Println("[Router] 会话存储: 内存")
|
|
}
|
|
|
|
sessionMgr := session.NewManager(sessionStore, userRepo, cfg)
|
|
authService := service.NewAuthService(userRepo, sessionMgr, cfg, siteSettings)
|
|
rateLimiter := middleware.NewRateLimiter()
|
|
authCtrl := controller.NewAuthController(authService, sessionMgr, rateLimiter, cfg)
|
|
avatarSvc := service.NewAvatarService(userRepo)
|
|
authMdw := middleware.NewAuthMiddleware(cfg, sessionMgr)
|
|
adminController := adminCtrl.NewAdminController(service.NewAdminService(userRepo, sessionMgr))
|
|
return userRepo, sessionMgr, authService, rateLimiter, authCtrl, avatarSvc, authMdw, adminController
|
|
}
|