Files
filestoragesystem/go/main.go
T
2026-08-23 00:48:10 +08:00

89 lines
2.1 KiB
Go

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))
}
}