Skip to main content
后台「博客设置」页的所有内容都持久化到 D1 的 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「缺少配置对象」
云端设置会覆盖静态配置:site_info.copyright 覆盖 config.js 的 footer.copyrightName,site_info.footerText 覆盖 footer.decl,nav_menu 覆盖内置 NAV 数组,footer_nav 覆盖 footer.contact,friend_links 覆盖 footer.links,profile.email 覆盖 footer.email。只有 D1 里该键存在且非空时才覆盖,否则继续用 config.js 的兜底值。

moderate_comments 的取值

判定是严格等值比较(v === '1'),"true" / "on" / 数字 1(会存成 "1",可生效)等写法请统一用字符串 "1"。详见评论 · 评论审核开关。

表结构

相关页面

  • 评论审核开关的作用范围:评论
  • 前台如何解析这些键(pageSize / footer.* / ads.* 等静态配置):配置说明
  • 导航与页脚的优先级:云端 D1 设置 > config.js 静态兜底