Files
note-manager/main.go
T
Your Name 74fa759274 feat: 云笔记增强 - 安全加固 + 回收站/版本历史/分享/批量导出 + 前端优化
- 安全: 认证改随机token会话(弃固定cookie), 笔记密码SHA256升级为bcrypt(自动迁移),
  堵住GET /api/notes/:id泄露带密码笔记, CORS收紧+SameSite防CSRF, 上传图片内容嗅探
- 回收站: 软删除(deleted_at), 列表/恢复/彻底删除/清空, 目录子树连删连恢复
- 版本历史: note_versions表存快照, 每次保存自动留档, 支持查看/回滚
- 分享: 生成随机token分享链接, 支持过期时间, 公开阅读页share.html
- 批量导出: 全部笔记打包zip(按目录结构+front matter)
- 前端: 深色模式, Mermaid图表, 待办清单checkbox, 字数统计;
  后台新增回收站/历史/分享面板和批量导出按钮
- 新增deploy/note-manager.service systemd单元与smoke_test.py
2026-08-11 11:21:29 +08:00

61 lines
1.6 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)
noteHandler := handler.NewNoteHandler(noteService)
adminHandler := handler.NewAdminHandler(noteService, cfg)
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, 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("后台登录密码请通过 ADMIN_PASS 环境变量配置(生产环境务必修改默认密码)")
if err := engine.Run(addr); err != nil {
log.Fatalf("启动服务失败: %v", err)
}
}