refactor: 全面重构代码并加白话注释,移动全局并行,去掉去向/重复记录

- 重构后端与前端,全程大白话注释(不懂程序也能看懂)
- 移动阶段改为全局并行(MoveAll,工人数=CPU核心数)
- 去掉记录每个文件搬去哪了(删除去向回填,解决写库卡顿)
- 去掉重复文件标记与统计:重复判定改为 MD5+路径都相同才算,重复则原地忽略不移动;MD5 相同但路径不同仍照常搬
- 媒体库去掉归类目录列,看板去掉重复/归类分布统计
This commit is contained in:
2025-05-11 21:05:35 +08:00
parent f915a9b1ac
commit 8979c744a8
26 changed files with 1044 additions and 683 deletions
+12 -2
View File
@@ -1,3 +1,9 @@
// Package api 是程序的"门面",所有网页请求都先进这里。
//
// 这里的 router.go 是"指路牌",负责把不同的网址指给不同的窗口(controller):
// - /api/scan/... → 扫描整理
// - /api/media/... → 媒体库与统计看板
// - /api/fs/... → 文件目录浏览(页面上"选择目录"用)
package api
import (
@@ -9,27 +15,31 @@ import (
"kenaito-media-picker/internal/store"
)
// NewRouter 组装 Gin 路由:健康检查 + API 路由组
// NewRouter 把"网址 → 窗口"的路由都登记好,返回给主程序去跑。
func NewRouter(st *store.Store) *gin.Engine {
r := gin.New()
r.Use(gin.Recovery())
// 健康检查
// 健康检查:别的程序或人想知道"服务还活着吗",就访问这个
r.GET("/health/check", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "ok"})
})
// 所有 /api/ 开头的接口都归到这里
apiGroup := r.Group("/api")
{
// 媒体库 + 统计看板
mc := NewMediaController(st)
apiGroup.POST("/media/list", mc.List)
apiGroup.POST("/media/stats", mc.Stats)
// 扫描整理(开始 / 查进度 / 实时进度)
sc := NewScanController(service.NewScanService(st))
apiGroup.POST("/scan/start", sc.Start)
apiGroup.GET("/scan/status", sc.Status)
apiGroup.GET("/scan/ws", sc.Ws)
// 文件目录浏览(页面上"选择目录")
fc := NewFsController()
apiGroup.GET("/fs/list", fc.List)
}