package cmd import ( "context" "time" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gcron" "easygoadmin/internal/logic" "easygoadmin/internal/router" "easygoadmin/utility/cache" // 空白导入:触发定时任务处理器 init 自注册 _ "easygoadmin/internal/task" ) // Run 服务启动入口 // // 启动流程: // 1. 缓存初始化(Redis 探测,失败降级内存) // 2. 中间件依赖接线(身份/租户加载器、日志落地器,由业务模块注册) // 3. 注册中间件链与全部路由 // 4. 阻塞运行 HTTP 服务 func Run(ctx context.Context) { // 缓存初始化(JWT黑名单/验证码/字典/身份缓存) cache.Init(ctx) // 依赖接线(业务模块通过 init 注册,见 internal/logic 各包) wireDependencies(ctx) // 创建服务实例,注册中间件链与全部路由 s := g.Server("easygoadmin") router.Register(s) g.Log().Info(ctx, "中间件链: CORS → Response → RateLimit → Demo → JWT → Tenant → OperationLog → Controller") // 定时任务调度器:延时确保 HTTP 监听就绪后,加载 status=1 的任务 go func() { time.Sleep(2 * time.Second) logic.DaemonInit(ctx) }() // 上传临时目录清理:每日 03:30 清理超过 file.tempExpireDays 天的 temp/日期 目录 _, _ = gcron.AddSingleton(ctx, "0 30 3 * * *", func(c context.Context) { days := g.Cfg().MustGet(c, "file.tempExpireDays").Int() if n := logic.CleanTemp(c, days); n > 0 { g.Log().Infof(c, "临时文件清理完成:删除 %d 个过期目录(保留 %d 天)", n, days) } }, "upload_temp_clean") // 阻塞运行 HTTP 服务 s.Run() }