FishHawk / auto-novel

轻小说机翻网站,支持网络小说/文库小说/本地小说
https://books.fishhawk.top/
GNU General Public License v3.0
365 stars 40 forks source link

我想要试着做一下本地小说分类 #87

Open 153264 opened 3 months ago

153264 commented 3 months ago

预计调整如下: 浏览器 indexdb volumes 新增 tag 表 表字段 tag_id: number , tag_name: string 修改 metadata 表 新增 tag_ids: number[]

页面优化 我的收藏:本地小说 /favorite/local/default 支持管理标签,批量对文章分类

Sakura工作区 /workspace/sakura 本地小说 支持管理标签,批量对文章分类 任务记录 批量对文章分类

如果没问题的话,我就开始按这个计划去调整

FishHawk commented 3 months ago

没啥问题,收藏夹自定义标签也是计划里的。不过有几点需要改下:

题外话,localstorage的setting里可以加个tag表,用来存预设标签和颜色,比如:predefinedKeywords: { id: string, color: 'red'|'blue' }[]。不过这不影响标签本身实现,等标签做好再说也不迟。

153264 commented 3 months ago

不需要tag表和tag_id,直接用string表示tag

我是想可能会有编辑标签的情况,还有方便查询本地的全部标签 如果没有标签表的话,还得要先循环全部的文章取出标签,再分类展示

153264 commented 3 months ago

翻译批次可以通过单独的“待翻译”收藏夹来操作

我也有设想要做这个,但是前提是要先把标签做出来才能进一步扩展

FishHawk commented 3 months ago

我是想可能会有编辑标签的情况

编辑标签是个麻烦的问题,但这个操作不常见。另外即使有tag表,在删除tag的时候,还是避免不了扫一遍。

还有方便查询本地的全部标签

关于这点有个前置问题,indexeddb在什么数量级需要分页。如果这个数字足够大,大到超过本地小说的可能大小的话,那么首次进入本地小说统计一次标签也是没问题的。等我睡一觉起来,测测看上限在哪吧。

PS. 找到一张性能图: image 来自:https://rxdb.info/slow-indexeddb.html

153264 commented 3 months ago

另外即使有tag表,在删除tag的时候,还是避免不了扫一遍

那也比每次获取分类要先循环全部的文章取出标签要好吧

那么首次进入本地小说统计一次标签也是没问题的

感觉这样有点多此一举了,单独拆分标签表就行 我是觉得小说信息跟标签应该解耦,标签单独存一张表进行管理 这样既方便标签的维护,也方便之后扩展 如果标签名称也存到 metadata 的话,这张表既需要维护小说的信息,还要作为标签表去管理

153264 commented 3 months ago

localstorage的setting里可以加个tag表,用来存预设标签和颜色,比如:predefinedKeywords: { id: string, color: 'red'|'blue' }[]

标签表直接放在localstorage也不是不行,比如:predefinedKeywords: { id: number, name: string, color: 'red'|'blue' }[]

FishHawk commented 3 months ago

我是觉得小说信息跟标签应该解耦,标签单独存一张表进行管理

我觉得有点过早优化了,但如果你不嫌麻烦的话也行吧。

153264 commented 3 months ago

那我就按着以下调整去初步实现这个功能

浏览器 indexdb volumes 新增 tag 表 表字段 tag_id: number , tag_name: string 修改 metadata 表 新增 tag_ids: number[]

页面优化 我的收藏:本地小说 /favorite/local/default 支持管理标签,批量对文章分类

Sakura工作区 /workspace/sakura 本地小说 支持管理标签,批量对文章分类

FishHawk commented 3 months ago

ok

153264 commented 3 months ago

有个问题,现在我做了标签管理,但是以前的数据库是没有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,
  });
});