更新日志
记录每一次迭代与改进
2026年10月
「文章点赞」全站上线:点赞按钮带粒子迸发动画与 tooltip 提示,首页/归档/分类/标签/搜索/详情页全量展示;点赞按 IP+UA 指纹去重防刷、Redis 限速(新增 /api/contents/likes/[cid] 与 /api/likes/counts 批量接口);后台文章管理新增点赞列与明细单条删除。已点赞用户打开页面不再闪一次自动播放的动画
「草稿云同步」:文章编辑页每 30 秒自动把正文同步到云端(autosave 仅同步正文,不动标题等元数据),刷新、断电、换机都不丢稿
「定时发布」:文章支持预约发布时间(编辑页新增时间控件),后台定时任务每分钟扫描,到点自动上线
「Feed 订阅扩展」:整站 RSS 之外新增分类/标签/文章评论三级订阅源(/feed/category/<slug>、/feed/tag/<slug>、/feed/comments/<cid>),各页面 head 自动标注 alternate,阅读器可自动发现
「MCP 接口」:新增 /api/mcp 只读 MCP 服务,15 个工具让 AI 助手可完整浏览站点——搜索、读全文、随机抽文、分类/标签文章列表、独立页面、友链、评论(全站最新+单篇)、更新日志、相关文章、站点信息;另含运维工具组(系统状态/日志/缓存诊断与清理,需运维令牌)
「日志系统与错误监控」:服务端日志分 8 类按天写入文件(access/audit/auth/external/cache/ratelimit/cron/monitor 等,console+文件双写);5xx 异常自动拦截并邮件通知站主(5 分钟去重抑制),客户端报错同步上报
「API 限流」:登录/评论/点赞等 7 类高风险端点接入限流中间件,超限返回 429 + Retry-After,Redis 优先、内存兜底
「邮件通知细分开关」:「通知站长」总开关下新增错误监控/评论/友链三类子开关(默认开,总开关关闭时子区置灰);通知邮件全面中文化;邮件日志开关移除、始终记录
「小程序审核模式」:新增构建期开关 features.miniFakeData,微信提审时小程序仅呈现一篇固定占位文章并关闭评论,避免真实内容被误判
「小程序数据实时同步」:小程序接口全部改为 no-store 不缓存,主站后台改动即时反映到小程序(此前有 5 分钟 HTTP 缓存窗口会看到旧数据)
「前台 SSR 化」:导航菜单、发布热力图、相关文章改为服务端直出,浏览器控制台不再出现额外 API 请求,首屏更干净
「验证码与登录」:图形验证码升级为 4 字符强干扰样式(扭曲曲线/噪点/字符粘连);登录失败时立即显示验证码并自动刷新
「后台骨架屏对齐」:后台各管理面板(仪表盘/评论/文章/分类/标签/友链/订阅等)与前台搜索页的加载骨架屏按真实内容对齐——骨架数量、表格列几何、移动端操作行都对上,加载时不再跳动
「后台响应式操作入口缺失」:文章管理窄屏(<1175px)卡片视图补上勾选框与全选行(此前该宽度下批量删除完全不可用);评论管理两套卡片补「全选」与「查看前台评论」;附件管理在触屏上复制链接/编辑/删除按钮不再透明不可见
「独立页面缓存」:后台修改协议/留言板后前台立即刷新(此前 ISR 缓存不随独立页面更新失效);订阅源「提交更新」后立即刷新状态反馈
「tooltip 二次弹出」:点击链接跳新窗口或切走再切回标签页时,链接 tooltip 不再二次显示
「404 状态码」:兜底 404 页与 /404 路由在服务端显式返回 404 状态码,搜索引擎不再把不存在页面当有效内容收录(soft-404)
「音乐链接转换」:修复音乐链接转播放容器的两处坏语法——容器未独立成行导致后续段落被吞进播放器;QQ 音乐新版字母数字 ID 匹配不上导致转换静默失效
「RSS 源重定向」:RSS 订阅源支持跟随 301/302 重定向(每跳重新校验防内网探测,最多 5 跳)
「部署 502 根治」:构建产物中的 npm 软链全部解成真实目录并补拷运行时依赖(postgres-array 等),根除 SFTP 上传后生产机模块找不到导致的 502/500(如 /feed);上传脚本未配置 CDN 前缀时直接拒绝,避免传错位置
「安全加固」:修复 3 个 SSRF/XSS 缺陷;拦截尾部点与 .localhost/.localdomain 子域名绕过内网防护的手法
2026年9月
后台仪表盘新增「部署方式」卡片,自动识别 Docker 容器 / 原生部署并显示对应图标;「构建哈希」改从 /api/admin/system-info 读取(新增 buildHash / isDocker / deploymentType 字段),修复 Docker 部署下构建哈希显示为空的问题
后台更新日志管理的删除改为批量进行:每行复选框 + 列表上方「全选 / 删除选中 (N)」工具栏(含半选态、选中行高亮、删除中 loading),新增 POST /api/admin/changelogs/batch-delete 接口(登录 + CSRF + ids 严格校验),删除后同步失效首页与 /changelogs 的页面缓存
SEO 站点地址统一跟随后台「站点地址」设置:canonical / og:url、站点地图 sitemap.xml、文章分享链接与二维码、首页标题里的域名、关于页品牌文字都改从后台设置读取(为空时回落 site.config.ts,不再两套来源);防镜像跳转仍固定用构建期域名,避免后台填错把全站访客弹去错误域名
后台设置页调整:密钥类输入框(百度内容审核、腾讯云 COS 等)不再掩码、直接明文显示与编辑;移除无消费点的百度 AppID 字段(内容审核只需 API Key / Secret Key);评论设置四组改双列栅格布局;各输入框提示由示例值改为格式 / 范围说明
后台操作失败提示统一:useToast 新增 error 字段,传入接口错误对象即自动提取其中的 message 作为描述、超长自动截断,各管理页与登录页的 catch 不再各自解析错误对象
服务启动时自动清空 Redis 页面缓存(flushdb,会话存文件 / 数据库不受影响):部署重启后从干净缓存开始,避免上次运行 / 旧构建残留的页面 ISR、搜索缓存导致读到陈旧内容
静态资源 CDN 引用收口:og:image / twitter:image、站点头像等改经 publicAsset / publicCdnAsset 统一包裹 CDN 前缀,不再依赖 301 重定向兜底
后台加载态补充骨架屏:账户界面按「头像 + 资料表单 + 安全设置 + 信任设备」结构占位、更新日志管理页按日志卡片结构占位,替代原先居中的 loading 转圈
修复生产环境会话 Cookie 与 CSP 响应头从未生效的问题:生产判定误用了 Nitro 产物里恒为 undefined 的 import.meta.env.PROD,导致 session / csrf / 验证码 / 信任设备 Cookie 缺少 Secure、SameSite 落为 lax,CSP 头从未注入;改用 NODE_ENV 判定后,生产响应带完整 CSP 头、Cookie 补齐 HttpOnly; Secure; SameSite=Strict
修复从其他页面切入含实况照片的页面时图片 / 视频偶发加载失败(net::ERR_FILE_NOT_FOUND):路由切换清理实况照片 Blob 缓存改为「延后一轮再释放」,不再当场 revoke 仍被页面过渡动画或新页面引用的 Blob
后台两步验证「信任此设备」的设备命名修复:未填自定义名称时自动以请求 UA 识别出的浏览器名命名(原先记为「未知设备」)
移除设置项的硬编码示例值兜底:后台未配置「音乐列表 ID」时页脚悬浮播放器整段隐藏(原先回落到内置示例歌单继续播放),未配置「图片分类 slug」时首页 / 分类 / 内容页不再按写死的 shot 分类展示图片瀑布流与「查看全部图片」入口
评论接口补齐服务端强制校验:「开启评论」「必填邮箱 / 链接」「最大回复层级」原先只由前端表单约束,绕过表单直接 POST 可在已关评的站点提交、跳过必填项、无限嵌套回复;现服务端拒收(关评 403、缺必填 400、超层级 400),相关设置与发布间隔合并为一次查库
安全加固:TRUSTED_PROXY 支持 CIDR 网段写法(原先只认精确 IP,填网段会静默失效,Docker 反代场景下所有访客 IP 会塌缩成网关 IP);SSR 内部请求密钥改为进程启动时随机生成,不再回落源码里的公开常量,封死伪造 x-ssr-internal-request 头绕过 Referer 门禁的路径
PWA 修复:manifest 改以 public/manifest.webmanifest 静态文件为唯一来源(原先构建时会用 nuxt 配置覆盖它,改 public 那份不生效),并从 Service Worker 预缓存列表移除 manifest,修复 Workbox 安装期 add-to-cache-list-conflicting-entries 冲突报错
无 Redis 部署不再「假 ISR」:页面整页缓存规则仅在配置了 Redis 时生成,未配置时页面实时 SSR(原先残留的 isr 规则会让页面静默落入短时文件缓存,「30 分钟内更新」语义失效);Redis 连接配置同步从 .env 的两套变量收敛到 site.config.ts 的 build.redis(仅生产构建生效)
图片灯箱整体换成自研组件(Lightbox.vue / useLightbox):工具条支持放大、缩小、自适应、左右旋转 90°、水平/垂直翻转与重置视图,另有缩略图条、左右箭头、图片计数与说明文字,支持滚轮缩放与拖拽平移;渲染进原生 <dialog>(top layer),因此天生支持 ESC 关闭、焦点陷阱、背景 inert,并能盖住页脚悬浮按钮;实况照片在灯箱内直接渲染、点击即播;协议页正文图片此前点不开灯箱,本次一并补上
灯箱切图性能优化:实况照片内嵌视频的提取结果改为会话级共享缓存(文章页与灯箱、灯箱内来回翻同一张只提取一次),切片改用 Blob.slice 惰性零拷贝、以 indexOf 定位 ftyp,首次切到某张不再卡顿;打开灯箱后用 requestIdleCallback 预热相邻的实况照片
灯箱切图过渡:相邻切换改为左右滑片(拖动时相邻那张跟手露出、两张之间留 16px 间距),点远端缩略图跨多张时仍走交叉淡化;说明文字与图片同一位移,拖动时读作一个整体;缩略图条两端按需羽化渐隐、去掉常驻滚动条
修复图片灯箱切图与关闭的一批问题:切图后 300ms 内再拖动,说明文字不跟手;切走时出场层按错误的 16:9 比例铺开、滑出去明显跳一下;关闭时计数跳成 m/0、图片与说明消失;拖拽松手被误判成点击而误关灯箱;开着灯箱切换路由后灯箱不关、把新页面挡死;图片 404 时浏览器破图占位从错误提示旁露出;暗色模式说明文字发黑、缩放锚点偏移
修复实况照片(正文与灯箱)播放错帧与浪费:换图后要等新视频就绪并重新确认身份,不再播到上一张、也不把已恢复的静态图又藏回去(此前表现为点一次没反应、按钮卡在播放态);静态图与视频同出一包、改用已提取的字节而非再请求一次,修掉「视频已就绪、图还在下载」的错帧;标了 #live 却没有内嵌视频时不再把整包文件做成 blob(最坏几十 MB);媒体缓存的清理改按页面路径触发,点目录锚点不再清空缓存;右键菜单的复制图片链接/下载文件名改取真实地址(此前实况照片拿到 blob: 地址,粘贴出去打不开、文件名是没有扩展名的 UUID)
后台改内容后前台立即刷新:新增缓存失效基建(server/utils/content-cache.ts 的 invalidateContentCaches),文章、分类、标签、内容↔分类/标签、评论(含小程序)、友链、订阅、更新日志、旅行、附件、站点设置、数据导入等写库成功后,按「本次改了什么→影响哪些页面」精确失效对应页面的 ISR 缓存,不必再等 30 分钟过期;订阅 RSS 同步完成后一并失效首页/订阅页/地图页,/sitemap 同步失效
统一全站缓存与刷新策略:ISR 各页面缓存统一为 30 分钟(原先 1 小时/12 小时/10 分钟/「永久」各不相同,文章详情与协议页的永久缓存也一并收敛),新发布内容最迟 30 分钟内可见;公开数据接口(RSS、站点地图、更新日志、博客网络、小程序评论、小程序码)缓存统一为 5 分钟;PWA 由 autoUpdate 改为 prompt,不再在新版 Service Worker 激活时自动整页刷新打断阅读,预缓存只留 manifest、favicon、字体三个稳定资源
修复地图「访客分布」卡片里「扫码在高德打开」二维码的干扰:二维码只对「我的足迹」地点(单点与聚合卡片)保留,访客分布视图关注「哪些城市的读者来过」,不再展示二维码
修复友链页可用性检测被中断后不续检:检测一开始就标记「未完成」并持久化、跑完才清除(一次请求失败返回空列表不再把中断标记抹掉);只有站内有友链且未被中断才刷新检测时间戳,避免 24 小时自动检测窗口被截断;localStorage 里的脏时间戳不再让自动检测永久失效
更新日志页条目排版调整:宽屏徽标居左、与正文首行基线对齐,胶囊样式对齐首页;窄屏徽标保留圆角方块并下移到文本下方;条目间距收紧
后台文章 / 页面编辑器接入 useEditorAutosave 自动保存:Ctrl+S 与停笔 2 秒静默落库,连续打字 60 秒兜底;保存前自动刷新 CSRF token(1 小时过期是长编辑保存 403 主因),会话 401/403 时把表单序列化备份到 localStorage、提示重登、回编辑页一键恢复
后台订阅源「手动更新」改为后台任务 + 两按钮分工:提交更新=后台并发抓取(上限 5)并立即返回,新增内存统计(重启归零)与每源「更新状态」列(成功=文章数+最新标题,失败=报错信息);「刷新订阅状态」仅重拉列表
后台 MarkdownEditor 查找替换体验升级:匹配高亮改用 ProseMirror Decoration,输入查询不再 setTextSelection/focus 拽走用户光标;滚动到当前匹配走 coordsAtPos 手算 scrollTop 落到视口中部偏上,不抢焦点、不改 selection;查找弹窗改可拖拽(柄 + localStorage 持久化坐标),跟容器宽度(@container + @md)响应式——移动端三行紧凑布局、桌面端单行两等宽输入
关于页「框架 / 主题」段补开源说明:新增 MarkdownRepo 卡片展示主站 imqi1-cms 与小程序 imqi1-mini 仓库(拉取 GitHub star / fork 实时显示);页脚版权行加「主题」链接指向 imqi1-cms,对齐备案号样式(移动端隐藏、无 hover 下划线)
后台富文本编辑器链接 mark 改为「只能显式创建 + 显式书写」:Link 扩展的 autolink / linkOnPaste / markdownLinks 与 Markdown.linkify / transformPastedText 全部关闭——输入 a.com / 粘贴纯 URL / 取消链接后切来切去不再被自动识别回链接;显式 markdown t ↔ 富文本 <a href> 双向转换保留,工具栏「插入链接」与 Cmd+K 快捷键仍可用
页脚音乐卡顿也计入失败次数、上限 5 次并显示重试徽标:连续播放失败自动暂停请求,避免无限重试拖慢体验;新增「重试」徽标引导用户手动触发
前台多页面响应式改进:首页 / 分类 / 标签 / 更新日志 / 内容详情 / 协议 / 订阅 页布局、组件与栅格断点统一梳理;首页订阅卡片极窄屏(< 350px)重排(头像下移、标题/描述顶部横排)
后台多页面响应式布局与样式优化:subscribes 编辑表单内联到被编辑行位置(不再跳顶部)、changelogs 条目窄屏重排、settings SMTP 卡片头部按钮窄屏允许换行;后台列表卡片、表单、徽标窄 / 宽屏断点统一调整
Markdown 表格转置加固:转置表重复行标签列与角顶保留;恒定 .markdown-table-wrap 包装;桌面端只包装不转置;转置表单元格 min-width 防文字挤压
MarkdownEditor 序列化 storage 空安全(卸载 / 重建瞬间不抛 reading 'getMarkdown' of undefined);Markdown 源码模式切回富文本时光标落回 textarea、防顶层 tab 触发器夺焦;查找替换弹窗两列断点 @md → @2xl
修复旅行地图 / 表格转置羽化溢出检测改读滚动容器 wrapper(wrap.scrollWidth>wrap.clientWidth)——之前测内层 table 永远判不出溢出导致 data-at-left/right 恒不设、羽化渐变永不触发;顺手把滚动条彻底隐藏(仅悬停显示)
后台变更日志窄屏标签筛选栏补渐入动画;后台弹窗生效时顶层未正确显示在最上层的 bug(z-index / portal 顺序修复)
footer 主题链接加悬浮下划线(对齐标题视觉权重);后台弹窗、骨架屏与数据列表列结构、列表项徽标窄 / 宽屏断点统一调整
登录安全升级:新增 TOTP 动态码两步验证(后台可扫码绑定动态码,RFC6238 免依赖实现 + 动态码步进录入)、自适应图形验证码(同一 IP 连续失败后触发)、「信任此设备」后下次免动态码、登录限流迁 Redis(INCR+EXPIRE 内存兜底);后台「账户设置」新增两步验证启用/停用卡片。
二维码能力:新增通用 /api/qr 渲染任意文本为 PNG;文章页「扫码在手机端查看本文」、足迹地图角落「扫码在高德打开」当前/首个足迹地点(uri.amap.com/marker)、2FA 启用弹层顶部二维码登记(保留密钥复制兜底);首页与足迹 InfoWindow 二维码统一复用 SiteQrcodeButton 弹层组件(Esc 关闭/焦点送回/无障碍 aria)。
文章页新增「小程序看」入口,懒加载微信小程序码(未配置 WECHAT_MINI_* 凭据或文章不存在时自动隐藏、不再打微信 API);配套微信小程序码服务端脚手架(access_token 内存缓存 7200s 提前刷新 + getwxacodeunlimit 生成 PNG,配置驱动)。
后台「已信任设备」管理:登录勾选「信任此设备」后写入数据库,后台可见每台设备的 IP/最近登录/到期时间并逐一撤回;支持给每台设备自定义名称、后台重命名(PUT /api/admin/2fa/devices/[id],≤100 字,空串清空回「未知设备」);重命名后本地乐观回填,保存不再闪现旧名。
底层数据库从 MySQL 迁移到 PostgreSQL:Prisma 适配器改用 PrismaPg、原生 SQL 语法适配(反引号→双引号、FOREIGN_KEY_CHECKS→session_replication_role)、索引/约束名 schema 级全局唯一改名、初始化脚本整体重写为 PG(SERIAL/TEXT/TIMESTAMP(3)/JSONB/pg_trgm GIN)、docker-compose 换 postgres:16-alpine、系统信息页 DB 标签更新;后台数据导出改流式分块 + keyset 游标分页,大数据量导出内存恒定、并发写不重不漏。
文章详情页「相关文章」区修复首帧 hydration mismatch(SSR/CSR 节点结构不一致),改为 onMounted 才触发加载、首帧两端结构一致。
修复未配置 SSR_INTERNAL_REQUEST_SECRET 时首页被 referer 门禁 403 拦截、无法直达取到最新文章的问题:缺省回落固定默认值并让内部请求头两端一致(运维仍可设随机长串覆盖)。
留言板(页面型内容)评论的邮件通知链接不再 404:页面改走 /<slug>(原 /content/contents/messages)、无分类文章兜底改「uncategorized」(与前台一致)、站点 URL 去尾斜杠防双斜杠;小程序码端点移出 /api/mini/*(主站 <img> 无 HMAC 签名会 401,改公开 /api/qrcode)。
评论入库 IP 修复:源站前有 CDN/云接入时此前把回源节点 IP 写成评论 IP(足迹去重/限流键同样塌缩),现通用化 nginx real_ip 恢复真实客户端(DEPLOY_TRUSTED_PROXY 配回源段,DEPLOY_REAL_IP_HEADER 默认 X-Forwarded-For),provider 无关、后端 getClientIp 无需改动。
上传脚本(COS/服务器)输出进度条重做:单行原地刷新不逐文件滚动、进度块锚定终端底部、上传完成后清空不占满屏幕、修复长文本残留。
构建哈希改由 /api/site 接口下发(runtimeConfig.public 清空,__NUXT__ 不再暴露站点配置),前端经 useSiteSettings 读取,供页脚/关于页/后台仪表盘展示。
后台设置面板新增搜索关键词结果缓存开关(searchCacheEnabled/Expire 持久化);搜索回归数据库逐分支模糊查询,放弃 Redis 倒排索引方案(避免分词召回缺口与跨架构部署的 EBADPLATFORM 问题)。
后台文章/页面编辑器新增「富文本 ⇄ Markdown 源码」双视图切换:源码模式由工具栏插入加粗/链接/图片/表格/10 类 ::: 容器语法,支持粘贴图片上传与 Ctrl+B/I/U/K、Alt+1-6 快捷键;富文本与源码共用撤销/重做且可跨视图撤销;切换视图时光标与滚动位置跟随到对应段落。
后台编辑器新增「查找和替换」:Ctrl+F / 工具栏按钮呼出悬浮面板,富文本与 Markdown 源码模式均可查找、替换当前处或全部,实时显示「第 n / 共 m 处」并自动滚动定位;配套 Tab 键插入 2 空格、Esc 关闭。
后台编辑器保存更可靠:保存前强制同步正文(含防抖未提交输入)、图片上传期间不再把占位 URL 落库、禁用富文本智能输入规则防 *字* 星号被自动转义;修复 Markdown 源码模式保存后被过期富文本回写覆盖、造成「明明已保存却回退到编辑前」的误判。
文章/页面正文中已知平台(GitHub/Gitee/微信/百度/谷歌/腾讯/Mozilla/npm)行内链接左侧的域名图标恢复显示:图标 URL 此前构建时被重写成带 hash 路径而 404,现改为运行时动态注入 CDN 地址绕过 Vite 重写。
关于页「技术栈」卡片在窄屏下改为单列自适应(grid-cols-1→sm:grid-cols-2→lg:grid-cols-3),不再横向溢出挤压。
搜索结果中的评论内容同时渲染表情并高亮关键词:表情占位符还原为内联小图,与关键词高亮互补不冲突。
RSS 订阅条目改用 <media:content> 暴露真实封面图(按扩展名标注 type/宽高/标题),描述开头不再拼接「<图片:标题>」中文占位符、正文直接起始,封面 URL 去掉 #live 等 mock 片段,给阅读器更干净的抓取。
小程序:修复原生 textarea 首帧闪现问题)。
关于页页脚与后台仪表盘新增「构建哈希」展示(YYYYMMDDHHmmss-8hex 格式),并通过 <meta name="build-hash"> 与 window.__BUILD_HASH__ 暴露给前端。
2026年8月
文章正文行内链接支持按目标域名展示品牌图标:GitHub/Gitee/百度/谷歌/腾讯/微信/MDN/npm 等常用域名的链接左侧带对应图标,一眼识别来源;风格与普通超链接一致,域名白名单可扩展
修复 Markdown 编辑器与正文语法显示:禁用 JetBrains Mono 程序连字,避免 :::/:// 等语法被渲染成「少字符」的假象
修复 Markdown 富组件渲染:Markdown Swiper 导航/分页作用域改到实例(不再干扰其它轮播);富组件水合改为挂载后移除占位灰框
修复页脚/内嵌播放器(APlayer TS 重构版):丢失的 HTML 转义导致 DOM XSS、异步歌词请求竞态导致「切走再回永久加载」、拖拽被打断导致进度/歌词停刷
修复全站多轮扫描发现的安全与真实 bug:后台写接口错误码透传(不再吞 403/404/400)、分类/标签/内容等接口防御性加固(参数类型收窄、分页限幅、外键冲突与记录不存在映射、预检防误删)、公开接口字段白名单
修复百度内容审核平台设置同步:AppID 不再是敏感字段(此前 GET 回显掩码、备份导出掩码导致不同步),导入备份可正确恢复;真实密钥仍掩码保护
修复主站 PWA 缓存预匹配并优化首页/胶囊标题(链接用站点域名 host);修复 mini 构建脚本(含子模块指针)
正文与列表渲染重构为复用组件/组合式(MarkdownBody、useMarkdownContent、ArticleCard、formatDate),文章/协议/分类/标签多页共用,行为保持一致、便于后续维护
站点与仓库统一命名 imqi1-cms;新增 /audit 体检 Skill;清理 21 个无引用的 Zod schema;沉淀多类踩坑记忆
搜索不再搜到不可见评论:评论检索只保留前台可见评论(留言板放行 + 仅已发布文章上的评论),草稿/隐藏文章上的评论不再命中结果、避免拼不出有效链接;无任何分类的文章评论详情链接兜底到 /content/uncategorized/<文章slug>
RSS 纯文本转换细化占位与排版:::: 容器/围栏代码块/表格/图片/音乐/仓库/折叠区块逐一格式化为中文占位(带语言、行数、行列数、标题、平台 id),卡片类改行间「<链接卡片:标题>」/「<外链卡片:标题>」格式(无标题仅占位);全文对中文与英文/数字相邻处自动补空格,占位与正文混排同时生效
修复页脚胶囊音乐「加载中」占位与「连续失败后隐藏」冲突:音频接口连续失败达上限(MAX_FAILURE_COUNT)后整颗胶囊连同加载占位一并消失(新增 isDisabled 状态,失败清零后恢复),不再出现加载中卡死的空壳
搜索功能大增强:新增「订阅和友链」「评论」「订阅文章」三类搜索,顶部 Tab 切换并同步 URL type 参数(支持浏览器前进/后退、直接改地址栏);评论结果附所在文章上下文并可锚点直达对应评论,留言板评论单独放行;订阅文章外链仅放行 http/https 防 RSS 投毒 XSS;搜索结果缓存 key 按类别区分(search:q:type),热门词不再跨类别串缓存
关于页站点统计新增「发布热力图」:按天聚合已发布文章与已审核评论数,支持按分类/标签维度筛选(新增 /api/heatmap 接口与 ActivityHeatmap 组件,星期标签/月份标签随年份切换)
后台管理缓存面板新增「清除搜索缓存」:一键清除自定义搜索结果缓存(search:* 前缀键精确匹配),不影响 Nuxt 页面/ISR 缓存
编辑器代码块升级为 lowlight 语法高亮:编辑态实时关键字着色、配色对齐前台 Shiki Islands 主题(亮/暗双主题),语言选择框保留;高亮走 ProseMirror decoration 不进文档模型,往返零差异
首页加载速度优化:英雄区与首载遮罩提升合成层(will-change),水合尾段主线程微任务洪峰不再让渐隐掉帧
页脚音乐播放器延迟到浏览器空闲时段初始化(requestIdleCallback + 1200ms),不再抢占首页加载关键路径;新增「音乐加载中」占位态,避免初始化前按钮位空缺
首页音乐面板改为首次激活时才挂载 APlayer,并移除 tiptap 手动分包——修复动态加载 APlayer 时被共享的 CJS 互操作 helper 牵连、整包拉取约 500KB Tiptap 的问题;就绪前显示加载占位符
RSS 输出改为 Markdown 正文转纯文本:新增 markdownToPlainText 管线,::: 自定义容器整块替换为「中文类型」占位(围栏代码块内的 ::: 当字面量),输出完整正文而非截断摘要,兼容所有阅读器
编辑器底部工具栏仅在把编辑器拖拽到高于默认高度(>720px)时才显示第二份,默认不再重复
修复编辑器链接输入状态继承问题:链接 mark 的 inclusive 改为 false,修复「建好链接后再输入的新文字永远继承链接、无法切回普通文本」
修复旅行地图切换视图后地图空白、放大后 POI 文字消失的问题:缩放上限改为 createCluster 建聚合时同步设置,避免「地图无点却允许深缩放」的窗口;底图 zooms 上限固定 20 保住高德 POI 标注层
修复图片分类白屏问题:实况照片(LivePhoto)视频元素改为按需挂载、播放结束/出错后卸载,修复部分浏览器 GPU 合成路径下残留 opacity:0 视频覆盖层盖住静态图导致的白屏
修复表情富文本输入框拖拽逻辑:直接按住单张表情拖动不再复制成图片 URL(覆盖浏览器原生 img 拖拽),实现真正的移动;外部纯文本拖入落在鼠标松手位置而非选区/末尾
修复导航栏按 Tab 时 tooltip 闪一下消失、焦点丢失的问题:禁用 floating-vue tooltip 自动聚焦(noAutoFocus)
修复热力图窄屏横向滚动时页面纵向抽搐:改用标准 Tailwind 间距类(gap-0.75 等)并加 overscroll-x-contain
关于页技能区块重构为四组:Agent 开发 / Python 开发 / 前端开发 / 其他技能,新增 LangChain、LangGraph、Nuxt、Pydantic、Docker、MySQL、Nginx、CI/CD 等 SVG 图标
MBTI 五维特质条改为滑块样式:主题色滑块 + 百分比标签 + 对立特质,对齐 16personalities 五维配色
后台 Markdown 编辑器从纯 textarea 整体重构为 Tiptap v3 所见即所得:粗体/斜体/标题/列表/代码块等标准语法即时渲染,::: 自定义容器渲染为不可编辑的可视化卡片,点击编辑按钮改原始源码
markdown 两段式分割器(markdownSplit.ts):::: 容器块永不进入 markdown 解析器,作为不透明原子节点保存原始全文,实现容器部分字节级往返保真;v-model 仍是 markdown 字符串,DB 存储格式不变
自定义容器节点的 Vue NodeView:按类型显示图标/标签/callout 变体色/源码预览,弹窗编辑原始 ::: 源码;代码块扩展叠加语言选择输入框(StarterKit CodeBlock 原本无改语言入口)
工具栏抽成独立组件 EditorToolbar.vue,顶部与底部各渲染一份(此前约 340 行 markup 复制两遍);光标进入表格时整条工具栏切换为行列增删/合并/拆分/删除
编辑器新增下划线按钮(Ctrl+U);为 13 个有快捷键的工具栏按钮在 title 提示中补上组合键(粗体 Ctrl+B、斜体 Ctrl+I、删除线 Ctrl+Shift+S、标题 Ctrl+Alt+1-6、引用 Ctrl+Shift+B、行内代码 Ctrl+E、代码块 Ctrl+Alt+C、链接 Ctrl+K、无/有序列表 Ctrl+Shift+8/7)
粘贴图片迁移到 ProseMirror handlePaste(同步拦截 + 异步上传,占位节点替换为真实 URL,挂起回写防占位 URL 落库);Mod-K 链接快捷键;空编辑器「开始写作…」占位提示
撤销/重做改用 StarterKit 自带 History,替代 textarea 时代的自研 useTextareaHistory 栈(该 composable 已删除)
编辑器外层 ClientOnly 包裹(disabled textarea 作为 SSR fallback);model↔doc 经 useDebounceFn(150ms) 防抖回写,聚焦时不回灌 + lastEmitted 防回环
2026年7月
评论输入框改造为 contenteditable 富文本组件(EmojiRichInput),表情渲染为内联图片、退格整张删除、不露出 :[key] 占位符
前台评论富文本编辑增强:自实现撤销/重做栈、Ctrl+A/C/V/X/Z/Y 快捷键、剪切、框内文字拖拽移动,并接入全站右键菜单(撤销/重做/剪切/复制/粘贴/全选/搜索)
服务端邮件通知把评论中的表情以 cid 内嵌附件形式发送(emoji-mail.ts),同一封邮件内重复表情自动去重
修复邮件标题、评论者名未做 HTML 转义导致的潜在 XSS(随邮件表情渲染一并修复)
最近评论接口识别并正确展示、链接留言板评论(不再要求分类关系与 status=1,链接走 /messages)
后台文章编辑器(MarkdownEditor)自管撤销/重做历史栈,工具栏新增撤回/重做按钮(栈空时自动灰显)
MarkdownEditor 快捷键:Ctrl+Z 撤回、Ctrl+Y/Ctrl+Shift+Z 重做、Ctrl+B/I/K 加粗/斜体/插入链接(中文输入法组字中不拦截)
修复 MarkdownEditor 工具栏按钮、图片粘贴走程序化改值导致原生 Ctrl+Z 撤不回的 bug
首页文章卡片链接重构,分类与标签可独立跳转,不再被卡片整体跳转冒泡
站点导航菜单项重构为 NuxtLink,借助 chunk 预取压缩点击后延迟
路由渐出时机提前到点击瞬间触发,修复点击后肉眼可见「等一下才渐出」
全局页面过渡新增纵向位移效果;首页、地图等全屏固定页跳过位移,避免破坏后代 fixed 定位
修复切换分类/标签时标题(menu/# 图标)被居中到屏幕中央、文章网格被误清空移除的问题(根因:旧 watch 用新 slug 误请求)
实况照片图片加载策略支持 lazy 属性动态切换懒加载/立即加载
实况照片静态图改用 cleanSrc 直接挂载,移除骨架屏占位,避免空 src 阶段渲染碎图图标
Firefox 不支持 HEVC 解码时,实况照片(含灯箱)静默退化为静态图
修复网易云等媒体/封面直链 http 被 CSP 与混合内容拦截(Firefox)的 bug,后端 meting 重定向统一升级为 https
页脚音乐播放按钮的进度条改为常驻显示,暂停时停在当前进度不再消失
EmojiParser 新增 size 尺寸档位,最近评论、后台表格、访客地图等紧凑场景渲染小尺寸表情
会话 ID 与登录令牌改用密码学安全随机源生成,消除可预测导致的会话劫持风险
登录接口加入 IP 限流与时延均衡,缓解暴力破解与用户名枚举
登录与账户信息接口收敛返回字段,不再回传内部登录令牌
系统初始化探测接口在已初始化后返回 404,避免被用于探测用户是否存在
前台友链申请与修改接口加入 CSRF 校验,防范跨站伪造提交
全站 CSRF 校验统一改为请求头携带,避免令牌出现在 URL、日志与 Referer 中
友链与订阅外链严格限制为 http/https 协议,杜绝 javascript:/data:等存储型跨站脚本
页面详情、随机文章等公开接口收敛返回字段,不再泄露内部与隐私信息
相关文章仅推荐有固定链接的内容,避免出现空链接死链
删除不存在的资源时返回 404,而非笼统的 500
首页数据改为按需查询,并精简后台类型定义,减少不必要的字段读取
支持通过 UPLOADS_DIR 自定义本地上传目录,将附件存储指向 .output 之外的独立路径,避免重新打包时已上传文件被清空;同时统一运行时资源(IP 库、验证码字体、WASM 等)的存储路径
完善 Docker 部署配置与运行时权限管理:自定义上传目录的卷挂载点自动跟随 UPLOADS_DIR,并优化容器内 node 用户对存储目录的写权限处理
优化 Dockerfile 构建流程与缓存策略,并自动化数据库初始化流程,首次部署时自动建表、写入默认设置与示例数据
修复 Docker 环境下 undici 依赖缺失导致的运行异常
启用 allowPublicKeyRetrieval 以解决 MySQL 8 连接失败的问题
移除未使用的依赖并优化脚本执行命令,加快安装与构建速度
新增运维脚本依赖管理与安装说明(bun run scripts:install),将较重的运维依赖从主项目拆分至 scripts/ 单独管理
小程序音乐支持完整歌单播放与切换,并新增实况照片(Live Photo)组件,点击静态图即可播放
修复小程序代码块图标字体显示为回滚字符(豆腐块)的问题:按需懒加载 Nerd Font 代码字体,仅在页面含代码块时加载,图标正常渲染
PWA 内联 workbox 运行时并支持缓存跨域资源,减少额外请求、提升离线可用性
小程序更新日志渲染支持行内 Markdown 与嵌套列表,展示更完整
小程序 API 新增 HMAC-SHA256 签名鉴权:请求需携带 X-Mini-Timestamp / X-Mini-Nonce / X-Mini-Sign 三个头,服务端按「方法+路径+时间戳+随机串」校验签名,时间戳偏差超过 ±300 秒视为过期,用定长比较防时序侧信道,挡住 curl 直连刷接口与评论机器人
修复验证码 svg2png WASM 文件加载路径:生产环境优先读构建产物 wasm/svg2png_wasm_bg.wasm,开发环境改用 require.resolve 按包解析定位 node_modules,不再依赖当前工作目录
移除 Prisma 迁移文件,改用统一的 SQL 初始化脚本(init-db.sql)建库
小程序升级到 2.0.0 版本,并重新选择了技术栈。新版小程序的技术栈使用uni-app (Vue 3 + Vite + TypeScript) ,UI 采用 wot-design-uni,原子化样式采用 UnoCSS。
404 页面新增 Singularity 黑洞背景效果(基于 WebGL ShaderToy)
修复地图 CDN 未配置时 CSP 拼接 undefined 的问题,补充地图交互样式
文章卡片改为封面全屏背景样式
优化图标按需加载策略,改进右键菜单与封面图
懒加载 Swiper 模块,直接动态导入 Swiper 具体模块文件以避免 barrel 整体打包
重构文件结构,移除冗余的 index.vue 与 index.get.ts 等路由文件
使用 v-scroll-reveal 指令替换旧的淡入动画实现
合并全局滚动监听至单一 rAF 调度器,减少滚动卡顿
修复 InspiraShaderToy 的 WebGL 上下文泄露:dispose 时断开 ResizeObserver 并移除 canvas 事件监听的 bug
修复文章页 MetingPlayer 子应用卸载时未 unmount,导致每次导航累积 Vue 子应用与 APlayer 实例的 bug
修复 image-loader 插件对已移除图片未取消观察,导致 SPA 导航时游离 img 引用常驻的 bug
修复文章页 Markdown 轮播 Swiper 实例卸载时未 destroy,泄露模块监听与 resize observer的 bug
修复关于页数字动画 RAF 循环与 initAnimations 递归 setTimeout 在卸载后仍执行的 bug
修复 APlayer 销毁时未清理 audio 事件、拖拽 document 监听与 skipTime/noticeTime 定时器的 bug
修复 useAudioPlayer 的 canplay 一次性监听在卸载时残留导致销毁后仍触发自动播放的 bug
移除 APlayer 全局 requestAnimationFrame polyfill 覆写,清理各组件未取消的定时器与死代码
地图组件卸载时主动调用 cluster.setMap(null) 触发聚合清理,不再单靠 map.destroy 兜底
2026年6月
引入 ESLint flat config 严格模式(含 stylistic 规则),修复全项目 lint 与 tsc 报错
建立独立 types 目录,统一 API 响应与组件类型定义,规范类型存放约定
统一 API 响应类型定义并优化类型推断,端到端类型走 Nitro InternalApi
APlayer 播放器从 JavaScript 重构为 TypeScript,补全类型定义
系统改造为单用户模式:移除用户管理总览与角色字段,账户设置页前置至原总览位置
新增数据库初始化脚本(db:init)与无用户探测接口 /api/auth/status
附件支持显示文件大小,上传时记录字节数并兼容历史记录
移除 Prisma 迁移与种子数据,改用幂等 SQL 脚本同步数据库结构
清理项目死代码:移除重复端点、未使用组件/工具函数与遗留迁移脚本
修复地图组件多余的 @amap/amap-jsapi-types 导入导致的生产构建报错
修复组件中的 Tailwind CSS 警告与 error 报错归一化
得益于全面的类型重构、死代码移除和用户模块精简,现在server的打包体积从23MB减少到14MB(压缩包)
重构更新日志数据模型,一条记录可承载多个更新条目并按类型分类展示
后台更新日志新增 JSON 文件一键导入能力
补充更新日志导入接口类型定义
首页更新日志展示调整为单条记录聚合展示
新增远程重启宝塔面板服务与清空 Redis 缓存接口
修复后台数据加载未完成时误显示暂无内容的问题
博客网络地图支持显示归属地和 ISP 信息
修复地图页面切换时重复缩放的问题
访客分布点改为显示头像(支持 Gravatar / Cravatar / WeAvatar,加载失败降级为首字母圆盘),不再只显示一个小圆点
优化地图渲染性能,新增标记 DOM 复用机制,解决缩放与聚散切换时头像闪烁、重复加载的问题
修复地图页 XSS 风险
修正访客分布聚合点数字,统一显示聚合点内访客人数
修正我的足迹省市统计,改为按坐标最近邻归类
IP 地址库由纯真 QQWry 切换为 ipdb,重写 IP 解析逻辑与数据同步脚本
优化主题切换颜色过渡,View Transition 期间禁用元素自身 transition,避免颜色滞后,顺便提升了亮暗模式切换的性能
移除评论提交后 3 秒的延迟,改为立即刷新列表,优化评论列表刷新时的布局偏移,增加静默刷新模式
修正部分城市坐标数据(安庆、烟台、昆明、西安等)
新增地图入口胶囊组件,在首页、分类、标签、留言、友链等页面展示旅行地图入口
文章版权区复用地图胶囊,支持按旅行地点逐个跳转
分类页、标签页、首页封面展示关联地图点数量角标
新增高德地图前端加载器与服务端代理配置
修复评论锚点 SPA 导航时的 scrollBehavior 告警
评论验证码由 SVG 明文改为 PNG 栅格化输出,降低被解析破解的风险
补充 robots、sitemap 与相关 API 字段