package main import ( "fmt" "os" "path/filepath" "github.com/glebarez/sqlite" "go.uber.org/zap" "gorm.io/gorm" "filestoragesystem/internal/config" "filestoragesystem/internal/model" "filestoragesystem/internal/router" "filestoragesystem/internal/service" "filestoragesystem/internal/utils" ) func main() { // 1. 加载配置 cfg, err := config.Load("config.yaml") if err != nil { fmt.Println("加载配置失败:", err) os.Exit(1) } if err := cfg.EnsureDirs(); err != nil { fmt.Println("初始化目录失败:", err) os.Exit(1) } // 2. 初始化日志 log, err := utils.InitLogger(cfg.Log.Level, cfg.Log.Dir) if err != nil { fmt.Println("初始化日志失败:", err) os.Exit(1) } defer func() { _ = log.Sync() }() zap.ReplaceGlobals(log) // 3. 连接数据库 if cfg.Database.Driver != "sqlite" { log.Warn("当前仅支持sqlite驱动,将按sqlite处理", zap.String("driver", cfg.Database.Driver)) } db, err := gorm.Open(sqlite.Open(cfg.Database.Source), &gorm.Config{}) if err != nil { log.Fatal("连接数据库失败", zap.Error(err)) } sqlDB, err := db.DB() if err == nil { sqlDB.SetMaxOpenConns(10) } // 4. 迁移与种子数据 if err := model.AutoMigrate(db); err != nil { log.Fatal("数据库迁移失败", zap.Error(err)) } if err := model.SeedData(db); err != nil { log.Fatal("初始化种子数据失败", zap.Error(err)) } // 5. 系统日志异步落库 utils.InitSystemLog(db) // 6. JWT参数 utils.InitJWT(cfg.JWT.Secret, cfg.JWT.Expire) // 7. 服务与路由 svc := service.NewServices(cfg, db) // 8. 引导管理员账户 if err := svc.Auth.BootstrapAdmin(); err != nil { log.Error("初始化管理员账户失败", zap.Error(err)) } // 9. 启动HTTP服务 r := router.New(cfg, db, svc) addr := fmt.Sprintf(":%s", cfg.Server.Port) absRoot, _ := filepath.Abs(cfg.Storage.Root) log.Info("FileStorageSystem 启动", zap.String("addr", addr), zap.String("mode", cfg.Server.Mode), zap.String("domain", cfg.Server.Domain), zap.String("storage", absRoot), ) if err := r.Run(addr); err != nil { log.Fatal("服务启动失败", zap.Error(err)) } }