Halo 是一款强大易用的开源建站工具,它让你无需太多的技术知识就可以快速搭建一个博客、网站或者内容管理系统。具备可插拔架构、主题套用、富文本编辑器等多重特性,支持用户根据自己的喜好选择不同类型的插件及主题模板来定制化自己的站点功能及外观。让内容创作和发布更加便捷生动。

截至目前(2023 年 Q4 季度),Halo 已经在 Docker Hub 获得了超过 200 万次下载,GitHub Star 数突破 30 k,并拥有一百多名社区贡献者。

2024 年 02 月 01 日,强大易用的开源建站工具 Halo 正式发布 2.12.0 版本。

在这个版本中,Halo 主要支持了 2FA 认证和模型索引机制,以及其他 40 多项功能优化和问题修复。

亮点更新

支持索引机制,优化查询效率和内存占用

从 Halo 2.0 开始,我们提供了一种新的模型定义方式,开发者可以非常方便的定义数据模型并进行数据操作。但此机制在数据量达到一定程度时,可能会造成一定的性能问题,反馈到最终使用体验就是数据查询速度慢以及消耗更多的服务器资源。

所以在这个版本中为了解决此问题,我们引入了索引机制。有了此机制之后,在服务内部查询数据或者过滤数据的时候就不再需要扫描全表,可以带来更高的查询效率和更低的资源消耗。

支持 2FA 认证

在 2.12 中,我们为系统用户添加了两步验证的功能,并内置了 TOTP 的验证方式。有了这个功能之后,可以更好的保障用户的账户安全。

配置 TOTP 验证器:

登录之后跳转到两步验证的页面:

编辑器更新

在 2.12 版本中,我们继续为编辑器进行了大量优化和功能更新,

搜索与替换

现在,你可以在编辑器中使用快捷键(Ctrl / Command + F)调出搜索框,可以根据关键词进行文本搜索,同时支持大小写、正则等验证。此外,也支持关键词替换和批量替换。

图片插入

在这个版本中,我们重构了图片的内容块,现在支持插入图片之后选择图片的来源并上传,也可以从附件库选择。与此同时,优化了粘贴和拖拽图片上传的功能,现在可以及时查看到图片的上传进度,也支持取消上传。

上传图片支持显示上传进度,不再是等待上传完成才显示图片:

支持替换图片:

重新发行 Jar 包

从 Halo 2.0 开始,我们推荐使用 Docker 进行部署,并且未提供原生的 Jar 包部署方式,目的是为了提供更加简单快捷和统一的部署方式,这可以一定程度上抹平配置环境带来的差异。但后续收到不少关于仍然需要 Jar 运行方式的反馈,所以从此版本开始重新发行 Jar 包,并提供相关的部署文档。

完整更新日志

新特性

  • 新增自定义模型索引机制,优化查询效率和内存占用。 by @guqing in #5121
  • 支持发布构建产物 halo-x.y.z.jar。 by @JohnNiang in #5170
  • 支持 2FA 认证方式。 by @JohnNiang & @ruibaby in #4737
  • 为默认富文本编辑器添加查找与搜索的功能扩展。 by @LIlGG in #5206
  • 使用索引功能检索文章以显著降低资源消耗并提供更快、更高效的文章检索体验。 by @guqing in #5230

功能优化

  • 为默认富文本编辑器 table 组件渲染后的 html 增加 colgroup 元素与 width 属性。 by @LIlGG in #5176
  • 为默认富文本编辑器表格组件增加退格键删除方式。 by @LIlGG in #5163
  • 在 Console 和 UC 的页面底部添加 Powered by 信息。 by @ruibaby in #5153
  • 在 Console 的概览页面添加使用 H2 数据库的警告。 by @ruibaby in #5072
  • Console 端的用户管理列表支持在地址栏记录筛选条件。 by @ruibaby in #5071
  • 当编辑器切换组件中有不可用编辑器时,添加提示。 by @ruibaby in #5070
  • 修复 Halo 还未处于准备就绪时访问页面或接口出现“Scheme not found”错误的问题。 by @JohnNiang in #5032
  • 添加 Tabbar 组件内容超出时的水平方向滚动指示器。 by @AeroWang in #4979
  • 重构编辑器图片块上传逻辑,增加选择文件上传、上传进度条、取消、重试等机制。 by @LIlGG in #5159
  • 修改文章编辑角色的显示名称为文章管理员。 by @ruibaby in #5224
  • 优化角色模板依赖的相关功能,优化文章相关角色的翻译。 by @ruibaby in #5227
  • 优化富文本编辑器中表格组件可滚动时的显示效果。 by @LIlGG in #5191
  • 优化 Console 左侧菜单的展开逻辑,支持通过点击图标来展开子菜单。 by @ruibaby in #5244
  • 优化文章数据的调协过程以降低 Halo 启动时文章的调协耗时同时提高性能和资源利用率。 by @guqing in #5250
  • 为个人中心的文章适配自动保存功能。 by @LIlGG in #5272
  • 优化头像上传,防止因为后端服务异常导致无法重新上传。 by @ruibaby in #5270
  • 重构 Console 仪表盘中小部件的数据获取方式。 by @ruibaby in #5280
  • 为通知类型设置添加 UI 权限判断。 by @ruibaby in #5286

问题修复

  • 解决默认编辑器表格合并单元格后行丢失的问题。 by @LIlGG in #5166
  • 解决在 Firefox 浏览器下的代码块编辑问题。 by @LIlGG in #5140
  • 修复个人中心创建新文章时无法上传图片的问题。 by @ruibaby in #5114
  • 修复编辑器中无法删除有序/无序列表后空行的问题。 by @AirboZH in #5102
  • 解决默认编辑器中具有重名标题时,锚点只会跳转至首个的问题。 by @LIlGG in #5101
  • 修复个人中心用户登录方式仅显示解绑问题。 by @xzyone in #5079
  • 修复 labelSelector 单字符值查询无效的问题。 by @OnlyTL in #5007
  • 修复文章渲染后内容中标题不存在 id 的问题。 by @LIlGG in #4997
  • 修复默认编辑器中图片无法等比例拖动放大缩小的问题。 by @pillar-cat in #4993
  • 修复在默认编辑器中无法使用拼音输入法输入标题的问题。 by @ruibaby in #4975
  • 解决默认富文本编辑器中表格后的文本选中后无法删除的问题。 by @LIlGG in #5234
  • 修复同一个自定义模型构建出的 Scheme 不相等导致无法正确从 SchemeManager 中移除的问题。 by @guqing in #5245
  • 解决编辑器冒泡菜单会被顶部工具栏遮挡的问题。 by @LIlGG in #5246
  • 修复当浏览器标签页不活跃时,文章编辑页面的 health 接口没有定时请求的问题。 by @ruibaby in #5266
  • 修复摘要中包含特殊字符导致无法解析页面的问题。 by @JohnNiang in #5263
  • 修复创建 PAT 之后,点击复制按钮无法复制 token 的问题。 by @ruibaby in #5274
  • 优化启动时用户头像获取不到的错误提示。 by @guqing in #5269
  • 修复文章列表的贡献者数据顺序不固定的问题。 by @guqing in #5279
  • 修复个人令牌创建表单中,角色设置显示了非模板角色的问题。 by @ruibaby in #5291
  • 解决默认富文本编辑器内容刷新后空白字符丢失的问题。 by @LIlGG in #5292

依赖更新

开发者相关

  • 修复开发环境运行 Console 报错的问题。 by @pillar-cat in #4983
  • 重构 Console 和 UC 的菜单生成逻辑,支持配置二级菜单项。 by @ruibaby in #5177
  • 导出必要的默认编辑器扩展及工具类。 by @LIlGG in #5104
  • 重构 UI 的 Modal 组件,支持通过 v-if 控制是否显示(渲染)。 by @ruibaby in #5078
  • 为 Console 提供工具页面和菜单项,方便插件集成。 by @ruibaby in #5252
  • 为 Console 和 UC 添加 Vue 社区新的 Dev Tools。 by @ruibaby in #5134

文档

https://docs.halo.run

资源

适用于 2.0 的插件和主题可查阅:

Full Changelog: v2.11.0...v2.12.0

如果可以像升级插件/主题一样,可以在console panel里直接升级Halo就好啦

    太棒了,希望社区的支持人员变得更多,带动整个产品的功能性提升

    66666666666666666666666666666666666666

    登录后台转圈圈要好久,不知道修复这个没有

    我两步验证的验证码输入正确,但是后台验证失败,我现在无法进入后台,怎么解决

      aloha 我知道问题了,我开启了两步验证,但是未进行配置,虽然我能接收到两步验证的验证码,但是后台无法验证成功。我现在无法进入后台,请问我该怎么办?

      我开启了两步验证,但是未进行配置,虽然我能接收到两步验证的验证码,但是后台无法验证成功。我现在无法进入后台,请问我该怎么办?

        aloha 无法验证成功的表现是?

        但是未进行配置

        未配置怎么会在登录之后要求输入验证码?

        目前存在bug,上传附件照片有几率会导致照片加载异常!
        尝试刷新缓存和重置索引,无效,服务器版本已回退,在本地部署新docker也会出现这问题

          11 天 后

          linux中可以直接java -jar运行,在windows中java -jar 启动报错不知道是什么原因,
          最后报错结果如下,删除相关目录没有用
          Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.r2dbc.pool.ConnectionPool]: Factory method 'connectionFactory' threw exception with message: Illegal character in path at index 11: r2dbc:///C:\Users\wangy/.halo2/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
          at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.11.jar!/:6.0.11]
          at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655) ~[spring-beans-6.0.11.jar!/:6.0.11]
          ... 129 common frames omitted
          Caused by: java.lang.IllegalArgumentException: Illegal character in path at index 11: r2dbc:///C:\Users\wangy/.halo2/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
          at java.base/java.net.URI.create(URI.java:906) ~[na:na]
          at io.r2dbc.spi.ConnectionUrlParser.parseQuery(ConnectionUrlParser.java:93) ~[r2dbc-spi-1.0.0.RELEASE.jar!/:na]
          at io.r2dbc.spi.ConnectionFactoryOptions.parse(ConnectionFactoryOptions.java:138) ~[r2dbc-spi-1.0.0.RELEASE.jar!/:na]
          at org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration$PropertiesR2dbcConnectionDetails.getConnectionFactoryOptions(R2dbcAutoConfiguration.java:75) ~[spring-boot-autoconfigure-3.1.2.jar!/:3.1.2]
          at org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsInitializer.initialize(ConnectionFactoryOptionsInitializer.java:51) ~[spring-boot-autoconfigure-3.1.2.jar!/:3.1.2]
          at org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations.createConnectionFactory(ConnectionFactoryConfigurations.java:65) ~[spring-boot-autoconfigure-3.1.2.jar!/:3.1.2]
          at org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryConfigurations$PoolConfiguration$PooledConnectionFactoryConfiguration.connectionFactory(ConnectionFactoryConfigurations.java:97) ~[spring-boot-autoconfigure-3.1.2.jar!/:3.1.2]
          at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
          at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
          at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
          at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
          at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.11.jar!/:6.0.11]
          ... 130 common frames omitted
          Caused by: java.net.URISyntaxException: Illegal character in path at index 11: r2dbc:///C:\Users\wangy/.halo2/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
          at java.base/java.net.URI$Parser.fail(URI.java:2976) ~[na:na]
          at java.base/java.net.URI$Parser.checkChars(URI.java:3147) ~[na:na]
          at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3229) ~[na:na]
          at java.base/java.net.URI$Parser.parse(URI.java:3177) ~[na:na]
          at java.base/java.net.URI.<init>(URI.java:623) ~[na:na]
          at java.base/java.net.URI.create(URI.java:904) ~[na:na]
          ... 141 common frames omitted

            4 天 后

            备份--恢复的功能建议改进
            目前有两台运行centos7+docker部署2.12的设备,一台实体小主机,一台高性能主机的vmware,局域网访问。
            都没有成功恢复2.11做的备份
            备份文件2.1GB,大约1000多篇文章。
            都是几分钟到达上传100%状态,维持很久没有变化。
            小主机等待1个多小时也没有成功,重试也是一样的。
            虚拟机100%维持10分钟左右,显示上传失败。

            能否在备份的时候,支持部分备份,部分恢复这样的机制来避免大文件的隐含风险?
            上传文件过程可否增加断点续传?