package main import ( "fmt" "log" "os" "github.com/gin-gonic/gin" "note-manager/config" "note-manager/handler" "note-manager/repository" "note-manager/router" "note-manager/service" ) // getDefaultReg 返回注册开关默认值(来自环境变量 REGISTRATION_ENABLED,默认开启) func getDefaultReg() string { if v := os.Getenv("REGISTRATION_ENABLED"); v != "" { return v } return "true" } func main() { // 加载配置 cfg := config.Load() // 初始化数据库 repo, err := repository.NewNoteRepository(cfg.DBPath) if err != nil { log.Fatalf("初始化数据库失败: %v", err) } // 初始化各层 noteService := service.NewNoteService(repo, cfg.PageSize) userRepo := repository.NewUserRepository(repo.DB()) userService := service.NewUserService(userRepo) noteHandler := handler.NewNoteHandler(noteService) authHandler := handler.NewAuthHandler(userService) adminHandler := handler.NewAdminHandler(userService) imageHandler := handler.NewImageHandler(cfg.UploadDir) // 初始化图片上传目录 if err := imageHandler.Init(); err != nil { log.Fatalf("初始化上传目录失败: %v", err) } // 确保系统设置表存在(注册开关等) if err := userRepo.EnsureSettingsTable(); err != nil { log.Fatalf("初始化系统设置表失败: %v", err) } // 注册开关默认值来自环境变量 REGISTRATION_ENABLED(默认开启) userService.SetRegistrationDefault(getDefaultReg()) // 注入角色判定,使管理员能跨租户管理笔记 noteService.RegisterRoleChecker(userService) // 初始化 Gin(设置模板目录) gin.SetMode(gin.ReleaseMode) engine := gin.Default() // 加载 HTML 模板(使用 Gin 的 LoadHTMLGlob 会自动处理路径) engine.LoadHTMLGlob("./web/admin/*.html") // 加载静态文件服务 engine.Static("/assets", "./web/admin") // 初始化路由 router.Setup(engine, noteHandler, authHandler, adminHandler, imageHandler, cfg) // 启动服务 addr := fmt.Sprintf(":%s", cfg.Port) log.Printf("云笔记服务启动成功,监听端口 %s", cfg.Port) log.Printf("前台展示: http://localhost%s/", addr) log.Printf("后台管理: http://localhost%s/admin/", addr) log.Printf("图片上传目录: %s", cfg.UploadDir) log.Printf("多租户模式:首个注册用户自动成为管理员") if err := engine.Run(addr); err != nil { log.Fatalf("启动服务失败: %v", err) } }