tamakyi
770e752a7a
图片恢复支持对象存储(R2);专题也改成归人不归数据集
R2 上的图怎么救:库里的行没了就只剩桶里有那些键,不列桶无从得知它们叫什么。
给 internal/media 加了 ListObjects(ListObjectsV2 + SigV4 + 自动翻页 + XML 解析):
- 路径式访问、请求只到桶;查询串必须**先百分号编码再签名**(canonicalQuery 按原样取
RawQuery,两边得是同一份字节,prefix 里的 / 要写成 %2F)。
- ⚠️ R2 的 API Token 默认只给对象读写,没有 s3:ListBucket 就 403。列桶失败**不让整个
恢复失败**:本地那半照救,原因进 Warnings、页面用红色提示条显示(否则站长会以为恢复完了)。
- 候选对象 = 本地目录 ∪ 桶里 .webp(同键以本地为准);行的 storage 按「对象实际在哪」写,
bytes 用桶里报的 Size。另加一条 warning:挂回了却没配 s3_public_base ⇒ 行有了页面空白,
这比「没恢复」更难懂。
专题(用户拍板「一并做」):topics.dataset_id 同样带 CASCADE,删数据集带走专题,而专题
只存在这张表里、没有恢复来源。外键摘掉,所有查询 dataset_id → user_id(loadTopics、
topicPage、保存/删除/开关、pageBase.HasTopics);**内容仍照当前生效数据集算**
(topicContent 不动)——变的是「这份定义归谁」。Dataset 补 UserID 供前台按属主定位
用户级数据;管理专题不再要求有生效数据集。
导出链路未改动:place_images / topics / Dataset.UserID 都不参与 .rondbackup 导出,
全量验收(含导出保真、ZRAW 夹取、编号对齐那批)PASS=331 FAIL=0 SKIP=0。
2026-09-30 23:31:17 +08:00
..
2026-09-24 20:37:57 +08:00
2026-09-30 19:45:51 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 13:05:49 +08:00
2026-09-28 19:31:21 +08:00
2026-09-29 10:46:54 +08:00
2026-09-29 13:25:50 +08:00
2026-09-30 16:18:52 +08:00
2026-09-30 19:15:48 +08:00
2026-09-30 19:15:48 +08:00
2026-09-30 16:18:52 +08:00
2026-09-18 17:06:22 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 15:02:45 +08:00
2026-09-30 19:00:18 +08:00
2026-09-24 20:37:16 +08:00
2026-09-29 16:57:29 +08:00
2026-09-24 20:37:16 +08:00
2026-09-29 11:50:06 +08:00
2026-09-29 13:25:50 +08:00
2026-09-30 17:35:59 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:31:01 +08:00
2026-09-19 16:31:01 +08:00
2026-09-20 10:07:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 21:52:29 +08:00
2026-09-19 16:04:00 +08:00
2026-09-18 13:05:49 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:57 +08:00
2026-09-19 16:31:01 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-29 21:15:25 +08:00
2026-09-30 19:00:18 +08:00
2026-09-30 19:45:51 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 23:31:17 +08:00
2026-09-30 23:31:17 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 16:18:52 +08:00
2026-09-30 23:31:17 +08:00
2026-09-30 23:31:17 +08:00
2026-09-20 12:22:11 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-18 13:05:49 +08:00
2026-09-30 19:45:51 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 17:06:22 +08:00
2026-09-30 16:18:52 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 23:31:17 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-20 12:22:11 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 23:31:17 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 19:00:18 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:57 +08:00