新增与优化,建议升级
- 新增世界频道首屏聚合,减少首屏多接口并发请求。
- 友链管理页改用聚合接口加载核心数据,移除分散请求链路,提高加载速度。
- 星链资讯页面优化数据加载链路,减少重复请求,修复部分 RSS 来源列表重复展示和加载不稳定问题。
- 世界频道新增历史阅读位置提示,可快速回到上次阅读位置;同时优化未读提示、@ 提醒、自定义表情包、成员列表、右键 @TA、引用消息等交互。
侧边栏新增模块:
博主信息卡片增强:
社交图标更新:
升级后建议进入 主题设置 > 侧边栏设置,查看新增的公告栏、标签云和公众号二维码配置项,默认均为关闭状态,按需开启即可。

Full Changelog: v1.16.0...v1.16.1
Generated from v1.16.1
全局样式 -> 启用访客配色切换 开启paper 配色ink 配色的文字对比度Full Changelog: 2.4.0...2.5.0
Generated from 2.5.0
Full Changelog: 4.0.3...4.0.4
Generated from 4.0.4
详情请参阅更新日志(在 GitHub 上查看)。
Please refer to Changelog (view on GitHub) for details.
howiehz-higan-zh-hans.zip为简体中文默认安装包,仅包含.br。
howiehz-higan-zh-hans-tiny.zip为简体中文轻量安装包,移除默认字体资源,默认 logo 资源将替换为 1x1 占位图,不包含预压缩文件,且不注入 Mermaid / instant.page 运行时。
howiehz-higan-zh-hans-full-precompressed.zip为简体中文完整预压缩包,包含.gz/.br/.zst。
howiehz-higan-en.zipis the English default package with.bronly.
howiehz-higan-en-tiny.zipis the English tiny package that removes the default font assets, replaces the default logo asset with a 1x1 placeholder image, omits precompressed assets, and excludes Mermaid / instant.page runtime injection.
howiehz-higan-en-full-precompressed.zipis the English full precompressed package with.gz/.br/.zst.
Full Changelog: 4.0.2...4.0.3
Generated from 4.0.3
新增个人资料卡页面
完善了文章页面
后台新增资料卡设置
后台新增限制微信/QQ 内置浏览器访问设置
后台新增移动端显示比例设置
后台桌面内容宽度设置
修复:长图折叠功能多项缺陷
sticky 失效,自动降级为 absolute 定位languageRequirement,可自定义多语言回复规则二次元少女风格的 Halo 2.x 博客主题。本次为功能新增与问题修复。
<halo:head/> / <halo:footer/>),提升与各类 Halo 插件的兼容性。Halo 2.14.0 及以上版本。
完整说明见仓库 README。
Generated from v1.0.9
Generated from v2.3.23
>=2.25.0 by @ruibabyFull Changelog: v1.3.2…v1.4.0
Generated from v1.4.0
Full Changelog: v1.5.1...v1.5.2
Generated from v1.5.2
Full Changelog: v1.5.0...v1.5.1
Generated from v1.5.1
/docs、/docs/{librarySlug}、/docs/{librarySlug}/{docSlug} 页面,含侧边目录树与可配置布局的文档库首页DocContentHandler(正文后处理)与 DocDetailModelHandler(阅读页 Model 注入)两个扩展点Halo >= 2.25.0,必须先安装并启用 Halo AI Foundation。
这是应用市场首个公开版本。从早期 ai-assistant 插件升级时,插件会迁移兼容数据;Embedding 模型或向量维度变化后需要重建索引。
模型调用可能产生第三方费用,站点内容会发送给管理员配置的模型服务商。
二次元少女风格的 Halo 2.x 博客主题。本次为功能新增与体验优化。
/console,可按需改为 /login 等。Halo 2.14.0 及以上版本。
完整说明见仓库 README。
Generated from v1.0.7
halo-theme-cosolar 是一款为 Halo 2.20+ 打造的现代博客主题,专为技术写作者设计。它把"内容"放回舞台中央 —— 干净的排版、克制的动效、合理的留白,让代码与文字都能舒适呼吸。同时在小屏与移动端做了完整自适应:贴底毛玻璃操作栏、抽屉式目录、自动隐藏的侧边栏,让手机阅读体验与桌面端同样顺滑。
#10B981,可在后台一键换色,全站按钮 / 链接 / 标签 / 进度条联动vite-plugin-halo-theme,产物精简,按模板分块
<p style=""> 等 HTML 片段。修复内容:
src/assets/utils/toc.ts setActiveHeading 重写:
src/assets/styles/main.css 为 .toc 添加滚动上下文:
Full Changelog: v1.4.4...v1.5.0
Generated from v1.5.0
⚠️兼容性升级至 Halo 2.25.0,不再支持更早版本
🛡️ 更新详情
优化全局文章页面footer与内容适配空间
部分feature组件回退1.2版本配置
修复缩约图部分引入错误
修复其它的一些小bug
document-hidden 切换到可见状态后的封面视频启动时机,避免 Safari 媒体加载器未准备好导致视频一直等待并回退到封面图。详情请参阅更新日志(在 GitHub 上查看)。
Please refer to Changelog (view on GitHub) for details.
howiehz-higan-zh-hans.zip为简体中文默认安装包,仅包含.br。
howiehz-higan-zh-hans-tiny.zip为简体中文轻量安装包,移除默认字体资源,默认 logo 资源将替换为 1x1 占位图,不包含预压缩文件,且不注入 Mermaid / instant.page 运行时。
howiehz-higan-zh-hans-full-precompressed.zip为简体中文完整预压缩包,包含.gz/.br/.zst。
howiehz-higan-en.zipis the English default package with.bronly.
howiehz-higan-en-tiny.zipis the English tiny package that removes the default font assets, replaces the default logo asset with a 1x1 placeholder image, omits precompressed assets, and excludes Mermaid / instant.page runtime injection.
howiehz-higan-en-full-precompressed.zipis the English full precompressed package with.gz/.br/.zst.
优化桌面端大屏显示效果:内容区、正文、卡片、顶栏、页脚、预载入页和悬浮按钮会随屏幕宽度连续适配,大屏阅读不再显得过细过长。
优化音乐播放体验:顶部唱片按钮播放中支持根据当前音乐封面主色进行轻微变色,并加入更自然的颜色注入动画。
优化音乐状态同步:改善音乐瞬间卡片、音乐播放器卡片和顶部唱片按钮在播放、暂停、切歌、PJAX 返回后的状态一致性。
优化 Plus 点赞昵称加载:点赞昵称不再等待授权状态后才拉取,支持短缓存和批量请求,刷新页面时点赞昵称显示更及时。
优化 PJAX 进入/返回稳定性,减少快速切换页面时的异常刷新和状态丢失。
优化首屏预载入逻辑:点赞昵称预加载不再阻塞页面预载入结束,首屏进入更顺滑。
调整音乐卡片、文章页、信息流、发布弹窗、归档弹窗等界面细节,使整体比例在不同桌面尺寸下更协调。
Plus 用户请确保 Morpho Plus 插件已更新到最新版。
replaceWith 替换 DOM 后未重新绑定点击事件,导致后续导航退化为整页加载--tw-prose-th-borders / --tw-prose-td-borders<h1> 改为 <h2>,修复一页多 <h1> 的文档层级问题color-mix 从 --earthquake-surface 派生overflow-x: autofocus-visible 全局样式--codeblock-bg,暗色亮色独立控制th:if / th:unless 互斥保证不重复渲染Full Changelog: v1.0.0-beta.3...v1.0.0-beta.4
Generated from v1.0.0-beta.4
此版本移除了模型配置,统一使用 Halo 官方提供的 AI Foundation,所以在升级之后所有模型需要在 AI Foundation 配置,并且功能模型选择都需要重新设置。基于 AI Foundation 的好处:
style(css): 更新文章标题样式并添加图标标记
feat(content): 添加表格内容增强功能并更新主题版本
Full Changelog: 1.0.0-beta8...1.0.0-beta9
Generated from 1.0.0-beta9
Generated from 4.0.2
一句话概括:从「可配置的主题」进化为「可视化搭建的设计系统」
适用版本:Halo 2.25.0+ | 发布时间:2026 年 7 月
| 维度 | 升级前 (1.2) | 升级后 (1.3) | 您的收益 |
|---|---|---|---|
| 搭建效率 | 看文档、对照代码、反复试错 | 后台直接看缩略图选布局 | 配置时间缩短 70%+ |
| 页面表现 | 固定几种模板 | 17+ 种布局组合随心搭 | 覆盖 90% 落地页场景 |
| 移动体验 | 单一抽屉菜单 | 7 种移动菜单样式 | 手机端像 App 一样顺滑 |
| 视觉冲击 | 静态页面 | 动态背景 + 60fps 动画 | 访客停留时长显著提升 |
| 加载速度 | 全量加载 300KB+ | 按需加载,首屏 < 1.5s | SEO 更友好,跳出率更低 |
| 风格 | 效果预览 | 适合场景 |
|---|---|---|
| 经典便当 | 网格轮播 + 右侧快捷入口 | 内容型站点、博客、资讯 |
| 全景画框 | 沉浸式大图 + 动态标题 | 作品集、摄影、设计展示 |
| 分屏视界 | 左右分屏联动切换 | SaaS 官网、产品落地页、双栏对比 |
💡 后台操作:主题设置 → Hero 模块 → 直接点缩略图选中即可,所见即所得
| 布局类型 | 视觉特点 | 典型用途 |
|---|---|---|
| 基础图文 | 左图右文/浏览器模拟器 | 功能介绍、产品展示 |
| 卡片列表 | 两种卡片风格随意切 | 服务清单、优势罗列 |
| 磁贴轮播 | 大图配右侧标签切换 | 版本更新、案例轮播 |
| 网格布局 | 左大图右网格卡片 | 团队介绍、合作伙伴 |
| 分类橱窗 | 两级嵌套分类卡片 | 产品矩阵、课程目录 |
| 团队展示 | 头像/Logo 两种模式 | 关于我们、核心成员 |
| 画廊/跑马灯 | 评价轮播/无缝滚动 | 客户见证、品牌动态 |
| 行动召唤(CTA) | 色块+多按钮 | 注册引导、下载入口 |
| 问答手风琴 | 经典/网格两种样式 | 常见问题、帮助中心 |
| 博客列表 | 内嵌 4 种文章样式 | 首页最新动态、专题聚合 |
🎯 零代码搭建:后台「Feature 模块」→ 添加区块 → 选缩略图 → 填内容 → 保存即时生效
| 新能力 | 说明 |
|---|---|
| 3 种文章模板 | 经典/轴心分栏/时间轴 —— 换个风格像换主题 |
| 侧边栏 5 合 1 | 订阅区/目录/小组件/图片广告/文字广告随意切 |
| 评论双模式 | 主题精美样式 / Halo 原生样式 任选 |
| 分享重构 | 一键复制 + 微信二维码 + 精美弹窗动画 |
| 点赞/收藏/分享 | 固定侧边栏 + 悬浮按钮,交互不漏埋点 |
| 页面 | 新增布局 | 亮点 |
|---|---|---|
| 文章归档 | 3 种 | 时光轴/详情卡片/原版 |
| 分类目录 | 列表 2 种 + 详情 3 种 | 支持封面图、子分类展开、文章计数 |
| 标签云 | 列表 2 种 + 详情 3 种 | 7 天新增计数、热门 Top 10 |
1.3.0 配置系统完全重写,旧版配置无法自动迁移
升级后需重新在后台配置一次,建议预留 30-60 分钟
theme-alba-1.3.0.zip 或从应用市场更新| 问题 | 解答 |
|---|---|
| 旧配置会丢吗? | 可能会,Halo 只保留旧版同名元数据配置,需提前导出配置,后续可切回 1.2.0 恢复 |
| 需要懂代码吗? | 完全不需要,全程可视化点击配置 |
| 会影响收录/SEO 吗? | 不会,HTML 结构更语义化,加载更快,对 SEO 有利 |
| 手机端会乱吗? | 1.3.0 专门强化了移动端,7 种菜单任选一款即可完美适配 |
| 可以先试用吗? | 建议在测试站/本地先体验,确认无误再上线 |
| 您的站点类型 | 推荐配置组合 |
|---|---|
| 个人博客/技术博客 | Hero: 经典便当 + Feature: 基础图文/卡片列表 + Blog: 列表样式 |
| 企业官网/产品落地页 | Hero: 分屏视界 + Feature: CTA/网格/团队 + Widget: 胶囊悬浮 |
| 作品集/设计师/摄影 | Hero: 全景画框 + Feature: 画廊/磁贴 + 文章: 轴心模版 |
| 知识库/文档/帮助中心 | Hero: 经典便当 + Feature: 问答/分类橱窗 + 归档: 时光轴 |
| 资讯/新闻/内容聚合 | Hero: 经典便当 + Feature: 博客列表/卡片 + 侧边栏: 订阅区 |
| 指标 | 1.2.0 | 1.3.0 | 提升 |
|---|---|---|---|
| 首屏加载 (LCP) | ~2.8s | ~1.3s | 53% ↓ |
| 交互就绪 (TTI) | ~3.5s | ~1.8s | 49% ↓ |
| 累积布局偏移 (CLS) | 0.12 | 0.02 | 83% ↓ |
| 移动端性能分 | 72 | 94 | +22 分 |
| 首包体积 | 303KB | ~85KB | 72% ↓ |
测试环境:Halo 2.24 / 2核2G / 启用 CDNginxgzip + 静态资源CDN
序白 Alba 1.3.0 —— 让搭建网站像搭积木一样简单,让访客体验像用 App 一样流畅。
ThemeNets 创意驱动新视界
详情请参阅更新日志(在 GitHub 上查看)。
Please refer to Changelog (view on GitHub) for details.
howiehz-higan-zh-hans.zip为简体中文默认安装包,仅包含.br。
howiehz-higan-zh-hans-tiny.zip为简体中文轻量安装包,移除默认字体资源,默认 logo 资源将替换为 1x1 占位图,不包含预压缩文件,且不注入 Mermaid / instant.page 运行时。
howiehz-higan-zh-hans-full-precompressed.zip为简体中文完整预压缩包,包含.gz/.br/.zst。
howiehz-higan-en.zipis the English default package with.bronly.
howiehz-higan-en-tiny.zipis the English tiny package that removes the default font assets, replaces the default logo asset with a 1x1 placeholder image, omits precompressed assets, and excludes Mermaid / instant.page runtime injection.
howiehz-higan-en-full-precompressed.zipis the English full precompressed package with.gz/.br/.zst.
Full Changelog: v1.0.0-beta.2...v1.0.0-beta.3
Generated from v1.0.0-beta.3
Warning
此版本为破坏性更新,升级后需要重新配置插件。
v4 对前台助手、RAG 知识库、Agent 能力、对话配置和部分样式配置进行了重构。旧版本配置可能无法完全兼容,请升级后进入插件设置重新检查并保存配置。
使用知识库能力前,建议重新导入资料或执行一次重建索引。
宠物 + 对话、仅显示宠物。{url} / {encodedUrl} / {path} 模板。Full Changelog: 4.0.0...4.0.1
Generated from 4.0.1
Generate from v3.3.0
Full Changelog: 1.0.4...1.0.5
Generated from 1.0.5
Warning
此版本为破坏性更新,升级后需要重新配置插件。
v4 对前台助手、RAG 知识库、Agent 能力、对话配置和部分样式配置进行了重构。旧版本配置可能无法完全兼容,请升级后进入插件设置重新检查并保存配置。
使用知识库能力前,建议重新导入资料或执行一次重建索引。
Warning
此版本为破坏性更新,升级后需要重新配置插件。
v4 对前台助手、RAG 知识库、Agent 能力、对话配置和部分样式配置进行了重构。旧版本配置可能无法完全兼容,请升级后进入插件设置重新检查并保存配置。
使用知识库能力前,建议重新导入资料或执行一次重建索引。
>= 2.25.0。>= 2.25.0。Generated from 4.0.0
MomentsIntegrationService,通过 SchemeManager 检测 Moment 扩展注册状态,避免直接引用导致的 NoClassDefFoundErrorContextExtractor 适配 Moment 上下文:使用 moment name 作为关联标识,通过 Unstructured 单次 fetch 获取瞬间实际内容(spec.content.raw/html)和发布时间(spec.releaseTime)作为 AI 上下文FilterService 对 Moment 评论读取 momentsEnabled 配置决定是否触发 AI 回复CommentPreFilterService.check() 新增 commentOwner 参数,将昵称纳入 AI 分类输入{{output_guidance}}、{{sentiment_hint}}、{{language_requirement}} 三个占位符,将输出规范、情感提示、语言要求拆分为独立模块{{sentiment_hint}} 占位符原位注入;旧模板不含该占位符时自动降级为末尾追加,保持向后兼容buildPrompt 重载的代码重复,统一委托给单一核心组装方法/moments 列表页改为 /moments/{name} 具体瞬间页ReviewService 在审核服务不可用或异常时不再自动通过,改为返回 FAIL 并拦截发布,避免未经审核的 AI 回复被自动发布renderContent 仅移除 <script> 和 <iframe> 标签,未过滤 on* 事件处理器和 javascript: 协议。现已全面清理所有事件处理器、危险协议和嵌入标签:disabled="loading" 防止重复请求falsePositiveTarget,可能导致重开时显示旧数据AiReplyOrchestrator 指数退避无上限 — retryCount 较高时延迟可达 43 分钟,超过处理锁 TTL 导致锁提前过期。新增 300 秒上限ContextExtractor 空指针风险 — extractCommentContent/extractCommentOwner/extractReplyContent 未检查 spec == null,畸形数据会触发 NPE 中断整个处理链SettingsView 邮箱防抖定时器未清理 — 组件卸载时 emailDebounce 定时器仍在运行,导致内存泄漏。新增 onUnmounted 清理HomeView 刷新数据 Toast 提前弹出 — refreshData 未等待异步请求完成就提示成功。改为 await Promise.all() 后再提示PromptBuilder 安全提示词可被绕过 — 自定义模板若遗漏 {{safety_prompt}} 占位符,安全约束会被静默丢弃。新增安全网:检测到遗漏时强制前置注入安全规范AiReplyOrchestrator.processFalsePositive 无去重锁 — 误报处理流程未使用处理锁,重复触发会创建重复 AI 回复。新增 processingLocks 机制AiReplyOrchestrator.processFalsePositive 失败后记录卡在 PENDING — 处理失败时记录未被标记为 FAIL,用户无法重试。新增 onErrorResume 将记录标记为 FAILAiReplyOrchestrator.hasExistingReply 错误时静默放行 — 数据库异常时去重检查返回 false 导致重复创建记录。改为返回 true(失败关闭,宁可跳过也不重复)AiReplyCleanupService 删除处理中记录 — 清理逻辑未过滤 PENDING/REVIEWING 状态记录,可能破坏正在进行的 AI 回复流程。新增状态过滤AiReplyCleanupService null subscribe 消费者 — .subscribe(null, ...) 传入 null 成功消费者,可能导致 NPE。改为空 lambdaAiReplyCleanupService 清理开关默认值不一致 — ConfigMap 存在但 data 为 null 时返回 false(禁用),与其他情况返回 true 不一致。统一为 trueInteger.parseInt 对非数字参数抛出 500 错误。新增 parseIntSafely 安全解析toLowerCase() 不区分大小写flatMap 默认并发 256,大批量操作可能压垮数据库。限制为 10autoRefreshing 标志位ReplyReconciler.isAiReply 空指针风险 — 未检查 spec == null,畸形 Reply 数据会触发 NPEContextExtractor 瞬间内容重复 fetch — getMomentContent 和 getMomentReleaseDate 各自独立 fetch 同一个瞬间扩展,产生 2 次重复查询。合并为 getMomentContentAndDate 单次 fetchContextExtractor 瞬间分支缺少容错 — buildContext 的 Moment 分支缺少 onErrorResume 和 defaultIfEmpty,异常时静默跳过而非降级处理。已补齐与 Post/SinglePage 一致的容错AiReplyOrchestrator.processFalsePositive 锁竞态条件 — 锁值存储过期时间(未来时间戳),过期后 putIfAbsent 不覆盖旧值导致去重失效。改为存储获取时间,与 processComment 一致cleanupStaleLocks 无法清理误报处理锁 — 误报处理锁值是未来时间戳,cleanupStaleLocks 计算 age 为负数永远不清理。统一为存储获取时间ContextExtractor.getCommentCount 空指针风险 — reply.getSpec() 可能为 null 时直接调用 getCommentName() 触发 NPE。fetchConversationHistory 同样问题已一并修复首页封面支持视频背景,可配置本地附件或外链视频,并支持移动端开关、图片封面兜底。
封面视频支持手动开启声音,滚动离开封面区自动淡出静音,返回封面区柔和恢复。
声场播放器优化为唱片图标,播放时旋转,暂停时保留当前旋转角度。
顶部声场歌词支持自动横向滚动,长歌词会尽量在当前句结束前完整展示。
前台发布瞬间支持外链附件:图片、实况照片、视频直链、音频直链、音乐封面外链、歌词外链。
在线音乐发布体验增强。
新增封面视频、音乐播放、加载预热等调试日志开关。
following / mutual 时,才允许显示“删除友链 / 解除关系”按钮。feat(theme): 添加产品商城主题配置选项
fix(gateway): 修复脚本加载和产品插件配置
feat(theme): 添加留言页功能支持
feat(config): 添加插件安装提示和路由说明信息
Full Changelog: 1.0.0-beta7...1.0.0-beta8
Generated from 1.0.0-beta8
fix(member): 优化用户注册邀请过滤器行为和错误处理
演示站防护是一个 Halo 插件,用来限制“演示角色”在 Halo 控制台、用户中心和核心 API 中执行高风险写操作。它适合公开演示站、试用环境、售前演示环境这类场景:访客可以登录体验后台,但不能发布文章、改用户、删资源、上传附件、改主题插件配置,别让人一顿乱点把站点霍霍没了。
| 地址 | 账号/密码 |
|---|---|
| 管理端 | demo/demo123. |
metadata.name,插件会读取当前登录用户的真实角色绑定。POST、PUT、PATCH 写请求和 DELETE 删除请求。* 单段通配、** 多段通配。403 和 application/problem+json,提示 当前演示用户禁止操作。这个插件是演示环境的兜底防护,不是 Halo RBAC 的替代品。演示账号本身也别乱给超级管理员权限,除非你已经把所有危险接口都配进保护路径里,不然就是往门口挂个锁、后墙留个洞,闹呢。
>= 2.25.0./gradlew build
build/libs 目录找到插件 jar,例如:build/libs/plugin-demo-guard-1.0.0-SNAPSHOT.jar
进入 Halo 控制台,打开 插件 页面。
上传并安装插件 jar。
启用插件后,进入插件设置页配置防护规则。
升级线上环境时,一定要上传新构建出来的 jar。只改本地代码不升级线上插件,线上当然没反应,这个锅代码不背。
如果你现在只想拦截这个发布接口:
/apis/api.console.halo.run/v1alpha1/posts/019f1b47-2f0e-75fa-a868-d5231f673d24/publish
保护路径应该配置成通配形式:
/apis/api.console.halo.run/v1alpha1/posts/*/publish
同时确认:
启用演示站防护:开启
拦截写请求:开启
演示角色标识:选择演示用户绑定的角色 metadata.name
发布文章接口是 PUT 请求,所以只开“拦截删除请求”没用,这地方别拧巴。
在 Halo 控制台创建一个专门给演示用户使用的角色,例如 演示角色。
插件配置里最终保存的是角色的 metadata.name,通常类似:
role-jlijn3me
不用手填也行,插件设置页的“演示角色标识”会从 Halo 角色列表中选择并保存实际角色名。
创建或选择一个演示用户,例如 demo,并给它绑定上一步创建的演示角色。
如果演示用户没有绑定这个角色,插件不会把它当作演示用户处理。
在插件设置中配置:
启用演示站防护:开启
演示角色标识:选择演示角色
拦截写请求:开启
拦截删除请求:按需开启
保护路径只写 URL path,不要写协议、域名、端口和查询参数。
正确:
/apis/api.console.halo.run/v1alpha1/posts/*/publish
错误:
http://localhost:8090/apis/api.console.halo.run/v1alpha1/posts/*/publish
多个路径可以用换行、空格、逗号或分号分隔:
/apis/api.console.halo.run/v1alpha1/posts/*/publish
/apis/api.console.halo.run/v1alpha1/posts/*/unpublish
/apis/api.console.halo.run/v1alpha1/posts/*/recycle
也可以写成一行:
/apis/api.console.halo.run/v1alpha1/posts/*/publish /apis/api.console.halo.run/v1alpha1/posts/*/unpublish /apis/api.console.halo.run/v1alpha1/posts/*/recycle
放行路径优先级高于保护路径。默认放行插件自身接口:
/apis/console.demoguard.muyin.site/**
不要把放行路径写得太宽,例如:
/apis/**
这会把所有 Halo API 都放掉,防护直接变空气,配置了等于没配置。
| 配置项 | 说明 | 建议 |
|---|---|---|
| 启用演示站防护 | 总开关,关闭后不拦截任何请求。 | 配完角色和路径后再开启。 |
| 演示角色标识 | 演示角色的 metadata.name 数组。 |
使用设置页下拉选择,不要填显示名。 |
| 拦截写请求 | 拦截命中保护路径的 POST、PUT、PATCH。 |
演示站通常开启。 |
| 拦截删除请求 | 拦截命中保护路径的 DELETE。 |
演示站通常开启。 |
| 保护路径 | 需要禁止演示用户访问的 API path。 | 只写 path,支持 * 和 **。 |
| 放行路径 | 优先放行的 API path。 | 保留插件自身接口,别写太宽。 |
* 匹配单个路径段。** 匹配多个路径段。GET 请求不会被“拦截写请求”拦截。DELETE 请求只受“拦截删除请求”控制。示例:禁止演示角色发布任意文章:
/apis/api.console.halo.run/v1alpha1/posts/*/publish
可匹配:
/apis/api.console.halo.run/v1alpha1/posts/019f1b47-2f0e-75fa-a868-d5231f673d24/publish
如果接口带查询参数,例如:
/apis/api.console.halo.run/v1alpha1/posts/xxx/publish?async=true
保护路径仍然只写:
/apis/api.console.halo.run/v1alpha1/posts/*/publish
下面这些路径和插件默认配置保持一致,可以按你的演示站开放范围删减。原则很简单:不想让演示用户改的,就别心软。
文章发布、取消发布、回收:
/apis/api.console.halo.run/v1alpha1/posts/*/publish
/apis/api.console.halo.run/v1alpha1/posts/*/unpublish
/apis/api.console.halo.run/v1alpha1/posts/*/recycle
文章底层资源:
/apis/content.halo.run/v1alpha1/posts/**
用户、角色和权限:
/apis/console.api.security.halo.run/v1alpha1/users/**
/apis/api.console.halo.run/v1alpha1/users
/apis/api.console.halo.run/v1alpha1/users/test/permissions
/apis/api.console.halo.run/v1alpha1/users/-/password
/apis/api.console.halo.run/v1alpha1/users/-
/api/v1alpha1/users/**
/api/v1alpha1/roles/**
附件:
/apis/api.console.halo.run/v1alpha1/attachments/upload
/apis/storage.halo.run/v1alpha1/attachments/**
独立页面:
/apis/content.halo.run/v1alpha1/singlepages/**
主题和插件:
/apis/api.console.halo.run/v1alpha1/themes/*/reset-config
/apis/theme.halo.run/v1alpha1/themes/**
/apis/api.console.halo.run/v1alpha1/plugins/*/plugin-state
/apis/api.console.halo.run/v1alpha1/plugins/*/reset-config
/apis/plugin.halo.run/v1alpha1/plugins/**
系统配置和迁移:
/apis/console.api.halo.run/v1alpha1/systemconfigs/basic
/apis/migration.halo.run/v1alpha1/backups
/apis/console.api.migration.halo.run/v1alpha1/restorations
用户中心安全项:
/apis/uc.api.security.halo.run/v1alpha1/personalaccesstokens
/apis/uc.api.security.halo.run/v1alpha1/authentications/two-factor/settings/enabled
/apis/uc.api.security.halo.run/v1alpha1/authentications/two-factor/totp
不同 Halo 版本或插件可能会调整接口路径。拿不准就打开当前站点的 Swagger:
/swagger-ui/index.html
照真实接口路径配置,别靠猜。尤其是 reset-config、resetconfig 这种命名,猜错一个字符就全白搭。
403,响应体包含 当前演示用户禁止操作。如果演示用户和管理员都被拦,通常是角色配错或账号角色混了;如果谁都不拦,先看总开关、请求方法、真实 path 和线上 jar 版本。别上来就怀疑玄学,十有八九是配置没对上。
命中防护后,插件返回:
HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
响应体:
{
"status": 403,
"title": "当前演示用户禁止操作",
"detail": "当前演示用户禁止操作",
"message": "当前演示用户禁止操作"
}
如果前端仍然只显示 403: Forbidden,说明前端统一错误处理没有读取 detail 或 message 字段。后端已经把话递过去了,前端不接,那就是前端自己的脾气。
优先检查这几件事:
enabled 是否为 true。metadata.name。PUT,需要开启“拦截写请求”。/apis/**。旧版本只按换行和逗号拆分路径。一整行空格分隔会被当成一个超长路径模式,自然匹配不到真实接口。
当前版本已经支持空格、换行、逗号和分号分隔。线上要获得这个能力,必须升级到包含该修复的新 jar。
通常是当前请求没有可用登录态,或者插件版本还在使用较旧的过滤器链。当前版本在 Halo 安全认证之后读取用户信息,正常登录请求会进入演示角色判断。
确认配置的是角色 metadata.name,不是显示名。显示名可以叫“演示角色”,但真正保存和匹配的一般是:
role-xxxxxxxx
新建 Halo 插件必须优先使用官方脚手架:
pnpm create halo-plugin
不要复制已有插件目录改名初始化,容易带入脏配置、缓存和错误依赖。
启动 Halo 开发服务:
./gradlew haloServer
前端开发:
cd ui
pnpm install
pnpm dev
热加载插件:
./gradlew reload
运行测试和构建:
./gradlew test
./gradlew build
GPL-3.0 © Lywq
新增微信读书阅读统计集成,支持通过 WeRead Agent API 获取阅读时长、阅读天数、日均时长、读过、读完、笔记等统计数据。
新增阅读统计面板,支持按周、月、年、全部范围查看数据。
新增年度统计视图,支持年份切换、年度热力图和月度柱状图展示。
新增微信读书 API Key 配置项,用于调用阅读统计等高级接口。
新增 Cookie 状态展示,包括 Cookie 是否有效、微信读书用户名、最近刷新时间。
新增书籍管理顶部筛选工具栏,支持按书名/作者搜索、分类、显示状态、阅读状态筛选。
新增书籍笔记详情接口和抽屉视图,用于查看单本书的划线、想法和书评内容。
优化微信读书 Cookie 管理逻辑,增强 CookieCloud 配置、刷新和状态反馈。
优化同步流程,支持同步划线内容、想法/评论、书评等笔记数据。
优化微信读书接口调用兼容性,改进 notebook、bookmark、review 等数据解析。
优化书籍管理页面布局和白色主题视觉,统计、筛选、书籍列表和笔记抽屉更统一。
优化阅读统计年度热力图,月份标签按真实周列对齐,并减少大屏空白。
优化偏好作者统计口径,按当前范围内本地书籍作者本数统计,避免官方统计字段含义不一致。
优化设置页,提供更清晰的 CookieCloud、API Key、同步和 Cookie 状态管理入口。
修复划线记录、想法/评论同步为空的问题。
修复笔记数量统计不准确的问题。
修复官方阅读统计不可用时页面无数据的问题,现在会回退到本地同步数据。
修复统计卡片单位重复显示的问题,例如 17本 本。
修复年度热力图在部分数据格式下错位或无法正确显示的问题。
AiReplyOrchestrator.retryOrFail 重试计数失效 — .then() 丢弃了更新后的记录导致 retryCount 始终为 0,AI 生成失败时陷入无限重试。改为 .flatMap() 传递更新后的记录.subscribe() 在异步流程中过早触发,导致 AI 回复生成完成后被空字符串覆盖。改为在 .doOnSuccess() 中触发异步生成PersonaResolver 在响应式上下文中使用 .block() — 调用阻塞方法会阻塞 Reactor 线程。改为返回 Mono<String> 并使用 Flux.concatMap().next() 替代 for 循环penalizeComment/penalizeReply 缺少乐观锁重试 — 并发更新 Comment/Reply 时可能静默失败。添加 Retry.backoff(3, 100ms) 重试approveOriginalComment 缺少乐观锁重试 — 同上,添加 Retry.backoff(3, 100ms) 重试FAIL 状态记录 — 仅接受 FILTERED 和 FALSE_POSITIVE 状态,AI 生成失败的记录无法重试。现接受 FAIL 状态tag-NEUTRAL 缺少 CSS 样式 — 中性情感标签无样式显示。补充样式定义handleTriggerAiReply 缺少加载保护 — 触发 AI 回复按钮可被重复点击导致重复提交。添加 loading 状态filterKeyword 输入未做防抖 — 每次按键都触发搜索,性能开销大。添加 300ms 防抖performCleanup 逻辑错误 — 清理逻辑存在判断错误extractChoice 分类匹配优先级 — 优先匹配违规类别(advertising/abuse/sensitive/meaningless),再匹配 normal,避免正常评论被误判为违规类别Generate from v3.1.0
二次元少女风格的 Halo 2.x 博客主题。本次为问题修复。
Halo 2.14.0 及以上版本。
完整说明见仓库 README。
Generated from v1.0.5
Full Changelog: v1.4.2...v1.4.3
Generated from v1.4.3
二次元少女风格的 Halo 2.x 博客主题。本次为功能新增与体验优化。
color-scheme 声明,原生控件(下拉、滚动条等)跟随明暗模式显示。Halo 2.14.0 及以上版本。
完整说明见仓库 README。
Generated from v1.0.4
🐛 修复:插件 CSS 不再覆盖主题代码块样式
.ce-pre 中多余的重置样式(background: transparent、padding: 0、border: 0 等),主题的代码块背景色、内边距、滚动条等样式完整保留reverseProxy.yaml,修正资源路径去掉多余 /static/ 层级,CSS/JS 文件恢复正常加载pluginName 字段🎉 重大精简:移除所有非核心功能,专注折叠体验
data-src、data-original、data-lazy 等常见懒加载属性aria-label、aria-expanded、:focus-visible升级说明:
Generated from v0.0.18
Full Changelog: 1.0.0-beta6...1.0.0-beta7
Generated from 1.0.0-beta7
当前版本完成 QSL 通联网格地图插件的首个可测试版本发布:
新增公开地图页面,展示 qsl-management 提供的 QSO 通联网格数据。
支持天地图瓦片服务,应用 key 可在后台插件设置中配置。
支持默认中心网格、默认缩放级别、最小/最大缩放级别后台配置。
默认中心点为 OM89,刷新和数据加载后不再被全量网格自动框选覆盖。
新增 [qsl-grid-map] 短码,可在文章或页面中嵌入地图。
新增 Halo 默认编辑器 / 菜单小组件,插入后显示预览卡片。
仅提供公开只读页面接口,不新增写入接口和角色模板。
Full Changelog: 2.3.0...2.4.0
Generated from 2.4.0
Generated from v2.3.22
Full Changelog: 1.6.2...1.6.3
Generated from 1.6.3
新增桌面端外侧背景功能,可在「外观」中上传背景图并选择显示强度。
桌面背景支持低分辨率图片自适应处理,避免小图拉伸后过度模糊突兀。
优化桌面背景下的深色模式、文章页、底部栏和右下角按钮显示效果。
新增右下角「深浅色切换」和「返回顶部」按钮开关,可在后台分别控制是否显示。
优化文章页在桌面背景下的外侧区域显示,减少灰色背景残留。
优化前台开发者调试日志,减少背景相关日志刷屏。
细化点赞 / 评论区域的分隔线和交互细节,使信息流观感更统一。
Generated from v2.3.21
第一个版本发布啦 🎉🎉🎉
二次元少女风格的 Halo 2.x 博客主题。本次为功能更新与问题修复。
Halo 2.14.0 及以上版本。
完整说明见仓库 README。
Generated from v1.0.3
新增点赞/评论按钮卡片弹出的动画效果
调整外链卡片尺寸
修复点赞数量显示异常bug
修复主题版权显示逻辑
Full Changelog: 1.4.0...v1.4.1
新增aiCron配置项支持自定义Cron表达式
将固定凌晨2点的AI生成任务改为动态可配置
监听配置变更自动重新加载定时任务
提供常用预设时间选项方便快速选择
Generated from v1.4.1
2.1.0。fa-solid fa-location-arrow。本版本带来两项核心改进——Steam 数据缓存定时预热架构与游戏元数据补全,并对公开 REST API 的响应结构做了规范化调整。
自本版本起,公开 REST API(/profile、/games、/recent、/badges)的响应字段统一从 Steam 原始的 snake_case 改为 camelCase,并裁剪了内部字段、补充了格式化字段(如 headerImageUrl、delisted、playtimeFormatted 等)。已通过 REST API 调用这些接口的主题或自定义前端需要同步更新 ,Finder API 不受影响。
完整字段定义请参考 README - REST API 与 使用指南 - API 接口,或 Halo 后台的 OpenAPI(Swagger)文档。
IStoreBrowseService/GetItems 为库外游戏或 Steam API 暂未返回名称的游戏补全本地化名称、真实封面与商店链接(新发布游戏的封面带内容哈希,已无法靠 AppID 拼接)appdetails 接口 success:false 的处理:先用 GetItems 的 visible=false 二次确认是否真的不可见,避免接口限流时把正常游戏误判为下架headerImageUrl 行为调整:无真实封面时改为返回 null(旧版返回 appId 拼接路径,对新游戏本就是 404)。appdetails 的 success 字段语义、修正 header_image 示例地址,完善 GetItems 行为说明AstraHub 星图库采用 REST API + WebSocket 的方式对外提供数据。
主题页面建议先请求状态接口,用于判断 AstraHub 插件是否已启用、星图库数据是否可用。
const statusRes = await fetch('/apis/anonymous.astrahub.halo.run/v1alpha1/star-gallery/-/status', {
method: 'GET',
credentials: 'same-origin',
headers: {
Accept: 'application/json',
},
});
if (!statusRes.ok) {
// 插件未安装、未启用,或接口不可用
}
const status = await statusRes.json();
if (!status.available) {
// 插件已启用,但星图库数据尚不可用
}
返回示例:
{
"available": true,
"generatedAt": "2026-06-28T00:00:00Z",
"relationCount": 64
}
状态可用后,请求完整快照接口。
const snapshotRes = await fetch('/apis/anonymous.astrahub.halo.run/v1alpha1/star-gallery/-/snapshot', {
method: 'GET',
credentials: 'same-origin',
headers: {
Accept: 'application/json',
},
});
const snapshot = await snapshotRes.json();
快照主要字段:
snapshot.profile // 本站 / 本星系信息snapshot.sectors // 星系联盟卡片snapshot.posts // 星际资讯每个星系卡片会提供 planetsUrl,主题可以直接请求该地址获取星系成员。
const planetsRes = await fetch(`${sector.planetsUrl}?page=1&pageSize=24`, {
method: 'GET',
credentials: 'same-origin',
headers: {
Accept: 'application/json',
},
});
const planets = await planetsRes.json();
返回示例:
{
"items": [],
"page": 1,
"pageSize": 24,
"total": 98,
"hasMore": true
}
主题可选接入 WebSocket。当 AstraHub 同步到新数据时,前台可以自动刷新星图库。
const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
const ws = new WebSocket(
`${protocol}//${location.host}/apis/anonymous.astrahub.halo.run/v1alpha1/astrahub/ws/star-gallery`
);
ws.addEventListener('message', (event) => {
const snapshot = JSON.parse(event.data);
// 使用新的 snapshot 重新渲染页面
});
posts 中推荐按以下字段处理:
post.url // 文章类资讯的原文地址post.siteUrl // 星球 / 站点地址post.type // 资讯类型推荐逻辑:
const isArticle = ['rss', 'article', 'post'].includes(
String(post.type || '').toLowerCase()
);
if (isArticle && post.url) {
// 显示:打开原文
// 跳转:post.url
}
if (!isArticle && post.siteUrl) {
// 显示:定位星球
// 跳转:post.siteUrl
}
如果状态接口请求失败,主题可提示:
需要安装或启动 AstraHub 星链插件
请在 Halo 后台启用 AstraHub 星链插件,并同步星图库数据。
QQ 交流群:1040502725
主题设置新增【菜单栏】设置选项
顶部导航栏支持新增自定义按钮
预加载页面载入页逻辑优化
修复了部分已知 bug
对博客内容页面进行了适配。
修复了一些bug
feat(theme): 添加产品管理和项目集功能支持
Full Changelog: 1.0.0-beta5...1.0.0-beta6
Generated from 1.0.0-beta6