Files
note-manager/main.go
T
Your Name d9793300f9 feat: 多租户账号体系 + 前台收藏按钮
- 新增 users 表(user_id 数据隔离,bcrypt 密码)
- 认证: 注册/登录(用户名+密码)/会话绑定用户, 首个用户成为管理员并接管旧数据
- 数据隔离: 笔记/分类/标签/回收站/版本/草稿/图谱/FTS 全部按用户隔离
- 前台: 登录/注册弹窗, 登录后★收藏自己的笔记, 游客只读公开笔记
- 后台: 用户名+密码登录, 每人管理自己的工作区, 越权访问返回404
- 冒烟测试重构+新增多租户隔离用例(78/78)
2026-08-11 12:58:12 +08:00

64 lines
1.7 KiB
Go

package main
import (
"fmt"
"log"
"github.com/gin-gonic/gin"
"note-manager/config"
"note-manager/handler"
"note-manager/repository"
"note-manager/router"
"note-manager/service"
)
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)
}
// 初始化 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)
}
}