SiYuan v3.6.1 版本解析:外观主题内核 API `/api/setting/setTheme` 与 `/api/ui/reloadTheme` 落地详解

发布时间:2026/9/9 23:50:54

SiYuan v3.6.1 版本解析:外观主题内核 API `/api/setting/setTheme` 与 `/api/ui/reloadTheme` 落地详解 SiYuan v3.6.1 版本解析外观主题内核 API/api/setting/setTheme与/api/ui/reloadTheme落地详解【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuanSiYuan v3.6.1 是一次以细节打磨为主题的版本围绕快速制卡撤销、数据库视图、发布服务安全、桌面端加载与退出同步等 10 项体验改进展开同时为开发者新增了两个外观相关的内核 API/api/setting/setTheme与/api/ui/reloadTheme。读完本文你将完整掌握 v3.6.1 的全部变更点并理解两个新 API 的参数结构、鉴权要求与内核侧的完整调用链参数解析 → 配置落盘 → 广播刷新可直接用于插件开发、主题脚本编写或自建 Agent 的场景化主题切换。版本概述v3.6.1 官方概括为此版本改进了一些细节变更分为三类改进功能10 项、修复缺陷1 项、开发者3 项。该版本不引入新的大特性重点在于修复已知问题、加固安全边界并为内核 API 补齐了外观主题管理能力。变更清单见 v3.6.1 官方中文说明。改进功能逐项解读快速制卡的撤销逻辑改进在使用快速制卡闪卡功能后执行撤销Undo的行为。此前撤销可能把制卡操作连带的块结构一并回滚、或回滚位置不符合预期v3.6.1 修正了撤销操作与制卡产生块之间的关联处理使撤销后的文档状态更符合用户直觉。数据库属性视图相关改进两项与数据库Attribute View相关的改进关联字段的默认图标数据库中关联类型字段此前展示的默认图标不符合语义本版本更换为更贴切的图标预览图片加载改进了数据库中图片字段预览的加载逻辑减少图片不显示或加载异常的情况。其他体验改进关闭用户指南笔记本的体验用户指南是随工作区附带的示例笔记本优化了其关闭流程避免误操作导致的困惑块链接的导出改进 Markdown / PDF 等导出格式中块引用链接的生成使导出后的链接可正确指向被引用块停靠栏图标的持久性在启用或禁用插件时停靠栏Dock图标的状态不再被意外重置插件卸载/安装后原有停靠布局得以保留RTL 与行级公式从右到左RTL语言环境下的文本方向不再错误地应用到行内数学公式公式的渲染方向保持正常桌面端主窗口加载优化了桌面客户端主窗口的加载过程退出时的数据同步改进了应用退出瞬间的数据同步时机降低退出过程中本地数据未落盘/未同步的风险。安全修复v3.6.1 修复了若干安全漏洞并在改进项中专门改进了发布服务的安全性。发布Publish是 SiYuan 将工作区以只读站点形式对外发布的功能属于直接暴露到公网的服务面其安全加固对自托管用户尤为关键。结合仓库结构发布相关的访问控制与密钥处理涉及 发布访问控制模型 与 发布配置建议自托管并开启了发布服务的用户在升级到 v3.6.1 后核对发布配置如访问密码、访问路径。安全类修复的具体技术细节通常不做公开披露仓库中不附带该漏洞的说明文档升级即可。开发者新增内核 API/api/setting/setTheme这是 v3.6.1 对开发者最实质的贡献之一——此前内核缺少一个直接切换主题的 RPC 接口插件或外部脚本只能改文件后再整体刷新。现在可以通过一次 POST 请求完成选择主题 指定亮/暗模式 设置外观模式。路由与鉴权路由注册位于 router.goginServer.Handle(POST, /api/setting/setTheme, model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, setTheme)从三个中间件可以看出调用前提中间件含义model.CheckAuth需要携带有效认证Authorization请求头或会话 Cookiemodel.CheckAdminRole仅管理员角色可调用普通只读访问不可model.CheckReadonly只读模式下拒绝写操作请求参数处理函数setTheme位于 setting.go接受 JSON 参数{ theme: daylight, modes: [0, 1], appearanceMode: system }参数规则以源码为准themestring可选主题名。为空时本次调用不切换主题modesint 数组当theme非空时必填0表示应用到浅色模式1表示应用到深色模式[0,1]表示两种模式都应用。取值只允许 0 或 1出现其他值解析直接中断若theme非空而modes为空返回错误信息[modes] is required ([0] for light, [1] for dark, [0,1] for both)当theme为空时modes被静默忽略appearanceModestring可选外观模式取值为light/dark/system三种之一非法值返回invalid appearance mode错误。示例调用本地内核默认监听127.0.0.1:6806Authorization替换为你的访问密码curl -X POST http://127.0.0.1:6806/api/setting/setTheme \ -H Authorization: 你的访问密码 \ -H Content-Type: application/json \ -d {theme: midnight, modes: [0, 1]}内核侧实现校验与落盘setTheme校验通过后调用model.SetTheme(theme, modes, appearanceMode)其实现位于 appearance.go核心逻辑if theme ! { for _, mode : range modes { switch mode { case 0: if !containTheme(theme, Conf.Appearance.LightThemes) { return fmt.Errorf(theme [%s] not exists or not available for light mode, theme) } Conf.Appearance.ThemeLight theme case 1: if !containTheme(theme, Conf.Appearance.DarkThemes) { return fmt.Errorf(theme [%s] not exists or not available for dark mode, theme) } Conf.Appearance.ThemeDark theme } } } if appearanceMode ! { switch appearanceMode { case light: Conf.Appearance.ModeOS false Conf.Appearance.Mode 0 case dark: Conf.Appearance.ModeOS false Conf.Appearance.Mode 1 case system: Conf.Appearance.ModeOS true default: return fmt.Errorf(invalid appearance mode: %s, appearanceMode) } }从实现可以看到两层设计主题存在性校验containTheme会检查目标主题是否真实存在于已加载的主题列表中且分别匹配LightThemes/DarkThemes——也就是说一个主题能否用于浅色或深色模式取决于该主题自身声明了哪种模式主题目录内theme.json声明而不是调用方随意指定模式与跟随系统互斥light/dark会把ModeOS置为false并固定Mode为 0 或 1system则把ModeOS置为true让外观跟随操作系统。主题列表的加载入口是LoadThemesappearance.go它读取主题目录对应工作区外的themes目录仓库内置主题为 daylight 与 midnight。因此通过该 API 能切换到的主题必须以主题目录的形式真实存在于当前 SiYuan 的主题路径下——这正是/api/ui/reloadTheme存在的意义见下文。调用后的前端刷新setTheme落盘完成后setTheme处理函数还会执行model.InitAppearance() util.BroadcastByType(main, setAppearance, 0, , model.Conf.Appearance)即重新构建外观状态并通过 WebSocket 广播setAppearance事件把完整的外观配置推给所有已连接的前端客户端收到后即时换肤无需刷新页面。这一写配置 → 初始化外观 → 广播的三段式与内核中同类外观接口如setIcon见 setting.go保持一致是 SiYuan 外观类 API 的统一范式。开发者新增内核 API/api/ui/reloadTheme第二个新 API 用于在不重启内核的前提下重新扫描主题目录路由注册见 router.goginServer.Handle(POST, /api/ui/reloadTheme, model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, reloadTheme)处理函数位于 ui.gofunc reloadTheme(c *gin.Context) { ret : gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) model.LoadThemes() util.BroadcastByType(main, setAppearance, 0, , model.Conf.Appearance) }逻辑很直接调用LoadThemes()重新读取主题目录并刷新内存中的LightThemes/DarkThemes列表随后广播setAppearance让前端同步。鉴权要求与setTheme相同。两个 API 组合起来就构成一条完整的动态主题链路拷贝/写入主题文件到 themes 目录 │ ▼ POST /api/ui/reloadTheme 重新扫描主题目录 │ ▼ POST /api/setting/setTheme 选择主题并指定亮/暗模式、外观模式 │ ▼ 前端收到 setAppearance 广播即时换肤典型场景插件安装主题包后不必提示用户重启 SiYuan或者定时脚本根据系统时段在浅色/深色主题间切换。注意该能力要求客户端以管理员角色访问且目标主题文件本身合法含theme.json声明、CSS 资源齐全否则LoadThemes不会将其纳入可用列表setTheme的containTheme校验会直接报错。开发者表情符号全量展示页v3.6.1 还新增了一个静态 HTML 页面 emojis/index.html用于可视化展示当前渲染内核支持的全部 emoji 短码。其实现引用了编辑器渲染库 Lute 的GetEmojis()接口script src../../stage/protyle/js/lute/lute.min.js/script ... const emoji Lute.New().GetEmojis() Object.keys(emoji).forEach((key) { const value emoji[key].indexOf(http) -1 ? img src${emoji[key]}/ : emoji[key] emojiHTML div classemoji__item${value}nbsp;:${key}:/div })页面以网格形式渲染emoji 图形 短码配对如:smile:短码值若是外链图片则渲染为img。该页面对排查某个 emoji 短码在当前版本是否可用、显示为何种图形非常有用也便于插件开发者确认:key:形式的 emoji 语法全集无需再通过笔记逐一试探。配套的表情配置见 conf.json。版本获取v3.6.1 的发行包通过 SiYuan 官网下载页与 GitHub Releases 渠道发布见原文档下载一节。对于正在使用的用户直接通过客户端内置更新或下载对应平台安装包覆盖升级即可内核 API 的调用方插件、脚本、Agent 工具可在升级后按前文的路径与参数约定接入setTheme/reloadTheme无需修改现有配置。小结v3.6.1 的变更虽以细节修复为主但开发者侧的两个新 API 填补了内核外观管理的空缺/api/setting/setTheme提供了带存在性校验、支持亮/暗模式分别指定、并联动系统跟随模式的完整主题切换能力/api/ui/reloadTheme则打通了主题目录的热加载。两者都遵循 SiYuan 内核 API 的标准鉴权链CheckAuth→CheckAdminRole→CheckReadonly与落盘 setAppearance广播的刷新范式是插件生态和自动化脚本做主题管理的可靠落点。【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/9 23:45:54

UV坐标与Tiling Offset:Unity Shader纹理平铺深度解析

1. 从UV坐标到Tiling & Offset:先搞懂你操作的是什么做了这么多年的Unity Shader,我遇到过不少美术同学拿着材质球问:"为什么这个纹理重复了这么多?""为什么这个贴图位置老是偏的?"问题基本都…

2026/9/10 0:41:01

低代码平台动态引擎设计与实践:Liquor规则配置化与热更新

做低代码平台这几年,我最大的体会是:平台好不好用,不看你拖拽组件做了多少,而看业务逻辑能不能“动”起来。我说的“动”,不是改个字段、换张表单,而是不重新发版、不重启服务,就能动态修改一段…

2026/9/10 0:41:01

Matlab/Simulink双馈风机仿真:MPPT控制与参数观测实战

1. 选Matlab 2019而不是追新版本:双馈风机模型架构的搭建前提1.1 我为什么把项目锁死在Matlab 2019上先说个现实问题:做双馈风机(DFIG)仿真,版本选择真的会卡住进度。我这几年接触过不少做新能源控制的团队&#xff0c…

2026/9/10 0:41:01

光电测试技术全解析:从AOMTI 2026看行业未来趋势

1. 光电测试技术被低估的这些年:高精度背后全是细节仗光电测试技术这个行当,在外行眼里就是"拿个仪器测一测光",但在真正干这行的人心里,它几乎是现代工业的隐形地基。芯片制造里的光刻对准、光纤通信里每0.01dB的损耗波…

2026/9/10 0:36:01

PySide6开发桌面天气应用全攻略:从API对接、界面设计到打包部署

“桌面版天气预报应用”这个名字听起来简单,但真正动手做的时候,你会发现它几乎能逼你把桌面开发、网络请求、数据解析、状态管理、异常处理、打包分发这条路完整走一遍。我最初想做个桌面天气应用,纯粹是因为受够了手机天气推送的过度设计—…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码