写作绅士,读作丧尸 X岛揭示板
顺猴者昌 逆猴者亡 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 官方公众号:【X岛揭示板】 官方微博: 【@X岛极速版】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.68758003 - 一个本地NMB数据阅读器 - 技术宅


回应模式
No.68758003
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

一个本地NMB数据阅读器 无名氏 2026-06-01(一)18:07:05 ID:SLDLTVR [举报] [订阅] [只看PO] No.68758003 [回应] 管理
最开始只是想给大洛山的串留个档,然后

下都下了,整个本地阅读器吧( ´∀`)
整都整了,做个服务器版吧,手机就也能看了( ゚∀゚)
做都做了,把检索也加上吧( ゚ 3゚)
加都改加了,把整个流程改完整点吧(ゝ∀・)

现在觉得整这么麻烦为啥我不直接上岛看了(*゚ー゚)

总之这是个从下载数据到双端阅读的NMB阅读器|-` )
无标题 无名氏 2026-06-09(二)13:07:21 ID:SLDLTVR (PO主) [举报] No.68812635 管理
>>No.68812311
是要从写数据库开始就屏蔽某些cookie吗
感觉在前端留给用户自己填屏蔽的饼就行

然后冗余的字段如果只是没必要而不是有负面影响的话,我觉得就先保留。删掉某一字段应该比之后想追加的时候,重新加数据容易吧( ゚ 3゚)
无标题 无名氏 2026-06-09(二)13:15:28 ID:gEGGVQn [举报] No.68812678 管理
我新整理的是
TABLE post -- 存储所有post,串首是一个特殊的post,特别地,串首page_num = 0
-- post表只会发生插入,不会发生删除或更改
thread_id, INT -- 串首串号
id, INT -- 本条post串号,全局唯一,特别地,串首id = thread_id
cookie, CHAR(7)
page_num, INT -- 保持岛原有页码结构,不会发生更改
is_po, BOOL
is_sage, BOOL
is_admin, BOOL
created_at, INT UNSIGNED -- 这条post发布的时间,保证与id保持单调非递减,具体地,对于A.id < B.id,则A.created_at <= B.created_at
PRI(thread_id, id) -- 用于快速访问串内所有post,且保证每个串的所有post在物理存储上相邻
KEY(thread_id, page_num) -- 用于串内随机访问某页
KEY(thread_id, cookie) -- 用于串内查找某个cookie的发言
KEY(cookie, id) -- 用于全局查找某个cookie的发言
UNIQUE KEY(id) -- 用于快速获取引用
-- created_at排序与id排序在时间意义上一致

TABLE thread -- 存储所有串首数据
thread_id, INT
cookie, CHAR(7)
replies, INT -- 该串的回复数量
is_sage, BOOL
is_admin, BOOL
installment, DECIMAL(5,2) -- 展示用的系列内写作顺序,可能有间章
created_at, INT UNSIGNED -- 保证与thread_id保持单调非递减
PRI(thread_id)
KEY(replies) -- 按热度排序
KEY(cookie) -- 某个cookie的串
-- created_at排序与thread_id排序在时间意义上一致

TABLE post_body
id, INT
thread_id, INT
content, TEXT
img, VARCHAR(255) -- 图片在本地存储的相对位置
title, VARCHAR(64)
name, VARCHAR(64)
PRI(thread_id, id) -- 使内容按串在磁盘上邻近排列便于读取
UNIQUE KEY(id) -- 用于快速获取引用

TABLE tag_registry
tag_id, INT
tag_type, VARCHAR(16) -- 如“serie”、“status”
tag_name, VARCHAR(64) -- 如“大洛山系列”、“连载”
PRI(tag_id) AI
UNI(tag_type, tag_name)

TABLE thread_tag
thread_id, INT
tag_id, INT
tag_type, VARCHAR(16)
single_type, VARCHAR(16) VIRTUAL
/*
single_type VARCHAR(16) GENERATED ALWAYS AS (
CASE
WHEN tag_type = 'CUSTOM_TAG' THEN NULL
ELSE tag_type
END
) VIRTUAL
*/
PRI(thread_id, tag_id)
UNI(thread_id, single_type)
KEY(tag_id, thread_id)
删掉了thread_body和一些原本打算用来给manticore单表导入设计的冗余内容,之后导入的时候就JOIN吧
我是觉得没什么需要改的了
无标题 无名氏 2026-06-09(二)13:23:18 ID:SLDLTVR (PO主) [举报] No.68812712 管理
>>No.68812678
( ゚∀゚)bbbb
无标题 无名氏 2026-06-09(二)13:27:46 ID:SLDLTVR (PO主) [举报] No.68812736 管理
>>No.68812678
结构没啥了,不过这个图片地址存一下原本的图床链接如何

我现在程序里下载的时候是把图片名改成串号的,默认串号全局唯一的情况下,图片地址只要确定哪个串需要图片就能知道

保存原图床链接是想着,万一下载的时候retry次数都用完了也没下下来图片,之后有人再用的时候可以再试着访问一次
无标题 无名氏 2026-06-09(二)13:30:15 ID:gEGGVQn [举报] No.68812744 管理
>>No.68812736
那就把我们本地的图片存储目录做成跟岛图片服务器一样,然后前端或者管理员选择是否下载图片或者是否由服务器传输图片,否的话就urljoin到岛CDN( ゚∀。)
无标题 无名氏 2026-06-09(二)13:33:29 ID:gEGGVQn [举报] No.68812750 管理
>>No.68812736
主要取决于服务器提供的带宽,retry这个不用担心,我想的逻辑是如果服务器中转图片,那就访问本地这个img指向的位置,如果文件不存在则请求岛CDN,所以天然就能处理retry和merge(也就是如果一个串已经保存过,那么只需要请求原先的最后一页(因为这页可能还没满19条)加后续的页码),这也是我现在那个导出工具的逻辑
无标题 无名氏 2026-06-09(二)13:34:41 ID:gEGGVQn [举报] No.68812753 管理
至于图床链接,按照规范应当是常请求常新,不过岛好像没换过,硬编码也不是不行,就是有点丑( ゚∀。)
无标题 无名氏 2026-06-09(二)13:36:36 ID:gEGGVQn [举报] No.68812767 管理
>>No.68812750
我思维有点跳脱,取决于服务器带宽指的是要不要让图片由我们请求下载然后再提供给用户,这件事取决于我们的带宽( ゚∀。)
无标题 无名氏 2026-06-09(二)13:48:36 ID:SLDLTVR (PO主) [举报] No.68812827 管理
>>No.68812767
( ゚∀。)确实哦,我这服务器带宽十分有限。不过访问量也没多少应该没事

给别人本地部署用的话,优先检查本地是否有图片肯定是对的。我现在就是存的图片url,但是优先读取本地图片。我的下载程序也会检查一遍已经过去的页面图片和内容缺不缺这个倒是考虑到了(ゝ∀・)

至于图床链接变不变的|д` )这个似乎没辙,所以还是下载到本地最稳妥

真到了本地没存,图床链接也换了,那就到时候再重新请求一下这个页面的数据更新一下链接吧,正好有page_num
无标题 无名氏 2026-06-09(二)14:00:19 ID:SLDLTVR (PO主) [举报] No.68812903 管理
>>No.68812750
我还在整理几份报告(つд⊂)
等几天整理完报告之后,我总结一下我这现有的功能和之后的需求啥的。数据库就按上面的来( ゚∀゚)bbbb我再整理主要是前端部分的操作逻辑
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2026-06-09(二)14:24:54 ID:gEGGVQn [举报] No.68813061 管理
分享图片
无标题 无名氏 2026-06-09(二)14:58:18 ID:gEGGVQn [举报] No.68813245 管理
>>No.68812903
数据库操作这块不用太操心,我尽量封装好

UP主: