package main import ( "electricity_bill_calc/cache" "electricity_bill_calc/config" "electricity_bill_calc/global" "electricity_bill_calc/logger" "electricity_bill_calc/model" "electricity_bill_calc/repository" "electricity_bill_calc/router" "electricity_bill_calc/service" "electricity_bill_calc/types" "fmt" "time" "go.uber.org/zap" ) func init() { l := logger.Named("Init") err := config.SetupSetting() if err != nil { l.Fatal("服务配置文件加载失败!", zap.Error(err)) } l.Info("服务配置已经完成加载。") err = global.SetupDatabaseConnection() if err != nil { l.Fatal("主数据库连接失败!", zap.Error(err)) } l.Info("主数据库已经连接。") err = global.SetupRedisConnection() if err != nil { l.Fatal("主缓存数据库连接失败!", zap.Error(err)) } l.Info("主缓存数据库已经连接。") err = intializeSingularity() if err != nil { l.Fatal("奇点账号初始化失败。", zap.Error(err)) } l.Info("奇点账号已经完成初始化。") } func intializeSingularity() error { l := logger.Named("Init", "Singularity") singularityExists, err := repository.UserRepository.IsUserExists("000") if err != nil { l.Error("检测奇点账号失败。", zap.Error(err)) return fmt.Errorf("检测奇点账号失败: %w", err) } if singularityExists { l.Info("奇点账号已经存在,跳过剩余初始化步骤。") return nil } singularityId := "000" singularityExpires, err := types.ParseDate("2099-12-31") if err != nil { l.Error("奇点用户账号过期时间解析失败。", zap.Error(err)) return fmt.Errorf("奇点用户账号过期时间解析失败: %w", err) } singularity := &model.ManagementAccountCreationForm{ Id: &singularityId, Username: "singularity", Name: "Singularity", Type: 2, Enabled: true, Expires: singularityExpires, } verifyCode, err := service.UserService.CreateUserAccount( singularity.IntoUser(), singularity.IntoUserDetail()) if err != nil { l.Error("创建奇点账号失败。", zap.Error(err)) return fmt.Errorf("创建奇点账号失败: %w", err) } logger.Info( fmt.Sprintf("奇点账号已经完成创建, 首次登录需要使用验证码 [%s] 重置密码。", *verifyCode), zap.String("账号名称", "singularity"), zap.String("验证码", *verifyCode), ) return nil } // 清理Redis缓存中的孤儿键。 func RedisOrphanCleanup() { cleanLogger := logger.Named("Cache").With(zap.String("function", "Cleanup")) for range time.Tick(2 * time.Minute) { cleanLogger.Info("Proceeding cleanup orphan keys.") err := cache.ClearOrphanRelationItems() if err != nil { cleanLogger.Error("Orphan keys clear failed.") continue } } } func main() { go RedisOrphanCleanup() app := router.App() app.Listen(fmt.Sprintf(":%d", config.ServerSettings.HttpPort)) }