13c53fea0a
- 管理员可管理任意用户笔记(读取/修改/删除/回收站/标签/图谱/FTS 全平台) - 普通用户仍数据隔离, 越权返回404 - 新增注册开关: 管理员后台⚙设置可开/关, 支持REGISTRATION_ENABLED环境变量 - 注册关闭时前台/登录页隐藏注册入口, 注册接口返回400 - 冒烟测试扩展到91用例全过
82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|