feat: 扫描整理并行化、WebSocket 实时进度与统计看板

- 移动阶段并行处理文件,按原子计数上报累计进度
- 扫描遍历阶段实时上报已发现文件数,界面不再卡在 0/0
- 新增 /api/scan/ws WebSocket 实时推送扫描状态;前端断线指数退避自动重连,并以低频轮询兜底
- 新增统计看板与媒体库筛选/排序,目录选择器路径不存在时回退到最近可用父目录
- 存放目录支持自定义并持久化,默认输出到 KMP已整理
This commit is contained in:
2025-05-08 21:16:20 +08:00
parent 36d7ecced8
commit f915a9b1ac
22 changed files with 1342 additions and 281 deletions
+17 -4
View File
@@ -52,10 +52,23 @@ func (c *FsController) List(ctx *gin.Context) {
Error(ctx, http.StatusBadRequest, "路径解析失败: "+err.Error())
return
}
st, err := os.Stat(abs)
if err != nil || !st.IsDir() {
Error(ctx, http.StatusBadRequest, "目录不存在或不可访问: "+abs)
return
// 目录不存在/不可访问时向上回退到最近的已存在父目录,避免阻塞目录选择器
for {
st, statErr := os.Stat(abs)
if statErr == nil && st.IsDir() {
break
}
parent := filepath.Dir(abs)
if parent == abs {
// 已到根仍不存在:回退到盘符层
if runtime.GOOS == "windows" {
Success(ctx, FsListResult{Drives: listLogicalDrives()})
return
}
abs = string(os.PathSeparator)
break
}
abs = parent
}
entries, err := os.ReadDir(abs)