diff --git a/frontend/src/utils.js b/frontend/src/utils.js
index 7ce6e1a..73bb4cd 100644
--- a/frontend/src/utils.js
+++ b/frontend/src/utils.js
@@ -6,6 +6,40 @@ export function sanitizeHtml(html) {
return DOMPurify.sanitize(html || '')
}
+// ---------- 缩略图 ----------
+// 时间线只展示小图:把我们存储上的图片直链改写为 /uploads/thumb/{key}?w=,
+// 后端懒生成并永久缓存。识别规则:以 uploads_public_base 开头的直链,
+// 或同源的 /uploads/ 相对路径(本地存储兜底)。外链(图床/头像)原样返回。
+// base 由 site.js 拉到站点设置后经 setThumbBase 注入(不走 import 避免循环依赖)。
+const IMG_EXT = /\.(jpe?g|png|gif)([?#].*)?$/i
+let thumbBase = ''
+
+export function setThumbBase(base) {
+ thumbBase = (base || '').replace(/\/+$/, '')
+}
+
+export function thumbURL(u, w = 480) {
+ if (!u || typeof u !== 'string') return u
+ let key = ''
+ if (thumbBase && u.startsWith(thumbBase + '/')) key = u.slice(thumbBase.length + 1)
+ else if (u.startsWith('/uploads/') && !u.startsWith('/uploads/thumb/')) key = u.slice('/uploads/'.length)
+ else return u
+ if (!IMG_EXT.test(key)) return u
+ return '/uploads/thumb/' + key + '?w=' + w
+}
+
+// 时间线正文 HTML(短文全文 / 长文 600 字符截断)里的
![]()
换缩略图 + 补懒加载。
+// 只在展示层重写,库里存的正文不动。截断的 HTML 可能带半截标签,
+// 正则只匹配完整的
![]()
,坏尾巴交给 sanitize/浏览器容错。
+export function thumbifyHtml(html, w = 480) {
+ if (!html) return html
+ return html.replace(/
![]()
]*?>/gi, (tag) => {
+ let out = tag.replace(/\bsrc="([^"]*)"/i, (m, src) => 'src="' + thumbURL(src, w) + '"')
+ if (!/\bloading=/i.test(out)) out = out.replace(/^
![]()