site_settings 表,通过 /api/settings 读写。这不是任意键值存储——业务上使用固定键,常用键如下:
features 由后台「功能开关」维护,包含 pageSize、homeTags、ads、navExtras、readingFont、highlight、bookmark、errorReport、commentGuard、richContent;comment_blocklist 也可由环境变量 COMMENT_BLOCKLIST 覆盖。功能开关(features)
后台 →「博客设置」→「功能开关」标签页,把原先只能改代码的开关搬到了界面上,存于 site_settings.features,保存即生效,无需改代码或重新部署:
关闭开关只隐藏界面,已保存的高亮与收藏记录不会被删除。
v2.10.91:博客设置会记住你上次停留的标签页,刷新不再跳回「站点基础信息」。
获取设置
settings 是扁平键值表,每个值都是** JSON 字符串**——site_info / profile 是对象,nav_menu / footer_nav / friend_links 是数组,moderate_comments 是裸字符串 "1" / "0"。读取端需自行 JSON.parse(moderate_comments 例外,它本身就是字符串)。
响应头 Cache-Control: public, s-maxage=60, stale-while-revalidate=300。
表里只需存在实际设置过的键:任何一个键缺失时对应位置回退到
config.js 的静态配置或内置默认值,接口不会补默认键。更新设置
POST /api/settings 亦可(与 PUT 等价);其他方法返回 405「Method not allowed」。JSON.stringify 序列化后存储):
saved 是本次写入的键数量。
- 写入为合并式 upsert(
INSERT ... ON CONFLICT(k) DO UPDATE SET v = excluded.v),只覆盖请求中包含的键,其余键保持不变 - 批量原子执行:任一键写入失败则整批回滚并返回
500「设置保存失败,请稍后重试」,不会出现「设置写了一半」 - 需要会话 Token 鉴权,缺少 / 无效返回
401 - 请求体不是对象返回
400「缺少配置对象」
moderate_comments 的取值
判定是严格等值比较(
v === '1'),"true" / "on" / 数字 1(会存成 "1",可生效)等写法请统一用字符串 "1"。详见评论 · 评论审核开关。
