我想要试着做一下本地小说分类
预计调整如下: 浏览器 indexdb volumes 新增 tag 表 表字段 tag_id: number , tag_name: string 修改 metadata 表 新增 tag_ids: number[]
页面优化 我的收藏:本地小说 /favorite/local/default 支持管理标签,批量对文章分类
Sakura工作区 /workspace/sakura 本地小说 支持管理标签,批量对文章分类 任务记录 批量对文章分类
如果没问题的话,我就开始按这个计划去调整
没啥问题,收藏夹自定义标签也是计划里的。不过有几点需要改下:
- 不需要tag表和tag_id,直接用string表示tag。因为:
- tag应是独一无二的,因此tag本身就起到了id的作用。
- 和网络/文库小说的tag一致。
- 任务记录不应该做“批量对文章分类”。因为:
- 工作区的用户很多样,很多用户只翻译网络/文库小说。有朋友反馈说希望隐藏掉工作区里面的本地小说功能。
- 和侧栏的本地小说重复了,等到搞定本地小说多收藏夹之后,翻译批次可以通过单独的“待翻译”收藏夹来操作。
- 任务记录本身和小说不是一种实体,加入太多小说的逻辑之后不方便任务记录本身乃至工作区的更新。
题外话,localstorage的setting里可以加个tag表,用来存预设标签和颜色,比如:predefinedKeywords: { id: string, color: 'red'|'blue' }[]。不过这不影响标签本身实现,等标签做好再说也不迟。
不需要tag表和tag_id,直接用string表示tag
我是想可能会有编辑标签的情况,还有方便查询本地的全部标签 如果没有标签表的话,还得要先循环全部的文章取出标签,再分类展示
翻译批次可以通过单独的“待翻译”收藏夹来操作
我也有设想要做这个,但是前提是要先把标签做出来才能进一步扩展
我是想可能会有编辑标签的情况
编辑标签是个麻烦的问题,但这个操作不常见。另外即使有tag表,在删除tag的时候,还是避免不了扫一遍。
还有方便查询本地的全部标签
关于这点有个前置问题,indexeddb在什么数量级需要分页。如果这个数字足够大,大到超过本地小说的可能大小的话,那么首次进入本地小说统计一次标签也是没问题的。等我睡一觉起来,测测看上限在哪吧。
PS. 找到一张性能图:
来自:https://rxdb.info/slow-indexeddb.html
另外即使有tag表,在删除tag的时候,还是避免不了扫一遍
那也比每次获取分类要先循环全部的文章取出标签要好吧
那么首次进入本地小说统计一次标签也是没问题的
感觉这样有点多此一举了,单独拆分标签表就行
我是觉得小说信息跟标签应该解耦,标签单独存一张表进行管理
这样既方便标签的维护,也方便之后扩展
如果标签名称也存到 metadata 的话,这张表既需要维护小说的信息,还要作为标签表去管理
localstorage的setting里可以加个tag表,用来存预设标签和颜色,比如:predefinedKeywords: { id: string, color: 'red'|'blue' }[]
标签表直接放在localstorage也不是不行,比如:predefinedKeywords: { id: number, name: string, color: 'red'|'blue' }[]
我是觉得小说信息跟标签应该解耦,标签单独存一张表进行管理
我觉得有点过早优化了,但如果你不嫌麻烦的话也行吧。
那我就按着以下调整去初步实现这个功能
浏览器 indexdb volumes 新增 tag 表 表字段 tag_id: number , tag_name: string 修改 metadata 表 新增 tag_ids: number[]
页面优化 我的收藏:本地小说 /favorite/local/default 支持管理标签,批量对文章分类
Sakura工作区 /workspace/sakura 本地小说 支持管理标签,批量对文章分类
ok
有个问题,现在我做了标签管理,但是以前的数据库是没有tag_ids的
要筛选显示的话就只能这样了,要不然之前的小说查不到了
把 默认收藏夹 当成 全部收藏夹 了
const sortedVolumes = computed(() => {
let _volumes = volumes.value;
if (props.favoredId && props.favoredId != 'default') {
_volumes = _volumes.filter((v) => v.tag_ids?.includes(props.favoredId));
}
return BookshelfLocalUtil.filterAndSortVolumes(_volumes, {
...search,
order: setting.value.localVolumeOrder,
});
});