Repository navigation
v0.28.0
ToneCore v0.28.0
功能性按钮收纳进「更多」菜单(方便以后拓展);删除改为彻底删除(不走回收站)。
变更
1. 功能按钮收纳进「更多」菜单
新增可复用组件 RowActions(apps/web/src/components/RowActions.vue)。
为什么收纳:此前每个功能各占一个按钮(详情 / 删除 / 刮削…),
列表行已经被挤满,再加功能就没地方放了。
收纳后的好处:以后新增功能只需在 rowActions() 里加一项,
不用再改每一处的布局 —— 这正是你说的"方便以后功能性拓展"。
菜单当前包含:查看详情 / 加入队列 / 重新刮削 / 彻底删除。
细节处理:
- 点击外部、按 Esc、页面滚动时都会关闭 —— 滚动不关的话,
弹层会脱离原行浮在别处,挡住后面的行 - 危险项(彻底删除)用红色标注,与常规项区分
- 「加入队列」是高频操作,仍留在行内,不收进菜单
组件用法:
<RowActions :items="[{ label: '详情', icon: 'info', run: () => {} }]" />2. 删除改为彻底删除
按你的要求:不走回收站,直接删。
服务端:Library.remove(relPath, hard) 新增 hard 参数
| hard | 行为 |
|---|---|
true |
直接 unlinkSync 从磁盘删除(不可恢复) |
false |
移入 <dataDir>/_trash/(保留,默认) |
两种模式共用同一套前置校验(目录穿越 / 文件不存在 / 索引清理),
只有最终「怎么处理文件」这一步不同,避免两处逻辑各自漂移。
接口:POST /api/library/delete 接受 hard;前端 libraryDelete(path, hard)。
关于二次确认 —— 我保留了,请看完这段再决定要不要去掉:
彻底删除是不可逆的真删盘操作。一次误点就永久丢失,代价远大于多一次确认。
所以我保留了确认弹窗,文案也写清了后果:
彻底删除「歌名」?
将直接从磁盘删除音频文件(及同名 .lrc),不可恢复。
确定要继续吗?
如果你确实想连确认也不要,告诉我,我去掉。
同步修正文案:详情弹窗按钮由「移入回收站」改为「彻底删除」——
行为变了而文案没变,会让用户以为还能找回。
验证
npm run build ✅ web + server 均通过
npm test ✅ 15 项全过
硬删的手工验证方式(未加自动测试)
现有 5 个测试均为纯函数单测(tags / player / queue / cover),
不碰数据库与真实音乐目录;而 remove() 依赖 loadConfig() 与真实 SQLite,
写自动测试会动到你的真实曲库 —— 风险大于收益,所以没加。
需要验证时按这个步骤(用一首无关紧要的测试曲目):
- 记下测试曲目的路径与磁盘上的文件
- 主页 → 该曲右侧「更多」→ 彻底删除 → 确认
- 确认:列表里该曲消失、统计数 -1、磁盘上音频文件确实没有了
/data/_trash/下不应出现该文件(这是与旧软删的关键区别)
未改动(仍是待办)
- 歌词「提前跑完」:v0.26.0 实测过,跑偏的集中在
online来源
(在线按歌名匹配,易命中翻唱版,时间轴天然对不上本地文件)。
修法是按真实时长校验候选、命中率低就回退本地/内嵌来源,需更多样本验证。 - 锁屏不显示动态歌词:Media Session API 不提供歌词接口,属浏览器能力边界,非 bug。
- 酷我(kw)在线搜索封面;音源状态显示口径。