#### What type of PR is this?
/kind bug
/kind improvement
/area core
#### What this PR does / why we need it:
This PR refactors post reconciler to reduce post updates and refines post events.
Previously, we need 3 - 4 updates per reconciliation, but now we only need 1. And all events collected in reconciler will be fired after updating post.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3121
#### Special notes for your reviewer:
0. Install search plugin
1. Create a public post and publish it
2. Search posts
3. Try to make the post private
4. Search posts
5. Try to make the post public
6. Search posts
7. Try to delete the post
8. Search posts
9. Try to recover the post
10. Search posts
#### Does this PR introduce a user-facing change?
```release-note
修复依然能搜索到已删除文章的问题
```
#### What type of PR is this?
/kind chore
/area core
#### What this PR does / why we need it:
Upgrade version to 2.6.0-SNAPSHOT for next development iteration.
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind bug
/area core
/milestone 2.6.x
#### What this PR does / why we need it:
This PR make the type of `site.url` to URL instead of URI. If we don't configure `halo.external-url`, the request URI will be used.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3908
#### Special notes for your reviewer:
Add the line below into any templates:
```html
<b th:text="${site.url}"></b>
```
And check if the output is correct by accessing `http://localhost:8090` or `http://127.0.0.1:8090` or `http://192.168.xxx.xxx:8090` when `halo.external-url` is not set.
Check if the output is correct by accessing `http://localhost:8090` or `http://127.0.0.1:8090` or `http://192.168.xxx.xxx:8090` when `halo.external-url` is set to `https://halo.run/`.
#### Does this PR introduce a user-facing change?
```release-note
修复 site.url 解析有误的问题
```
#### What type of PR is this?
/kind bug
/area core
/milestone 2.6.x
#### What this PR does / why we need it:
When we use curl or ab command to access any pages rendered by thymeleaf at first up, we will get the error described in <https://github.com/halo-dev/halo/issues/3861>.
This PR will resolve the problem by checking null value.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3861
#### Does this PR introduce a user-facing change?
```release-note
解决访问页面无法渲染的问题
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.6.x
#### What this PR does / why we need it:
修复部分 FormKit 的 radio 表单项的 label 设置不正确的问题。目前影响范围:
1. 使用了 type 为 `menuCheckbox` `menuRadio` 并将 validation 设置为了 `required`。

#### Which issue(s) this PR fixes:
Fixes#3876
#### Does this PR introduce a user-facing change?
```release-note
修复部分 FormKit 的 radio 表单项的 label 设置不正确的问题。
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.6.x
#### What this PR does / why we need it:
修复初始化时,预设插件安装失败的问题,目前的解决方案是重试安装操作。
#### Which issue(s) this PR fixes:
Fixes#3893
#### Special notes for your reviewer:
测试方式:
1. 建议参考 https://docs.halo.run/developer-guide/core/build 构建成 Docker 镜像再测试。
2. 测试初始化完成之后,预设插件是否正确安装以及启动即可。
#### Does this PR introduce a user-facing change?
```release-note
修复在初始化时,预设插件可能初始化失败的问题。
```
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.5.2
#### What this PR does / why we need it:
添加系统初始化检查,如果未初始化则重定向到控制台。
此检查只针对首页,当用户访问首页时检查到未初始化则跳转到 Console 让用户初始化以优化没有数据时的访问体验。
SetupStateCache 用于缓存系统初始化状态,当数据库状态改变时会更新缓存以优化性能,避免每次访问首页都查询数据。
#### Which issue(s) this PR fixes:
A part of #3230
#### Does this PR introduce a user-facing change?
```release-note
添加系统初始化检查,如果未初始化则重定向到控制台
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.6.x
#### What this PR does / why we need it:
修复用户头像不支持相对链接的问题。
#### Which issue(s) this PR fixes:
Fixes#3879
#### Special notes for your reviewer:
测试方式:
1. 创建或者编辑用户资料。
2. 从附件库选择头像,检查是否可以通过表单验证。
#### Does this PR introduce a user-facing change?
```release-note
修复创建用户或者修改用户资料时,头像链接不支持相对链接的问题。
```
解决删除某个插件项导致其他插件项渲染失败的问题
<!-- Thanks for sending a pull request! Here are some tips for you:
1. 如果这是你的第一次,请阅读我们的贡献指南:<https://github.com/halo-dev/halo/blob/master/CONTRIBUTING.md>。
1. If this is your first time, please read our contributor guidelines: <https://github.com/halo-dev/halo/blob/master/CONTRIBUTING.md>.
2. 请根据你解决问题的类型为 Pull Request 添加合适的标签。
2. Please label this pull request according to what type of issue you are addressing, especially if this is a release targeted pull request.
3. 请确保你已经添加并运行了适当的测试。
3. Ensure you have added or ran the appropriate tests for your PR.
-->
#### What type of PR is this?
/kind bug
<!--
添加其中一个类别:
Add one of the following kinds:
/kind bug
/kind cleanup
/kind documentation
/kind feature
/kind improvement
适当添加其中一个或多个类别(可选):
Optionally add one or more of the following kinds if applicable:
/kind api-change
/kind deprecation
/kind failing-test
/kind flake
/kind regression
-->
#### What this PR does / why we need it:
解决插件列表渲染问题
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3866
<!--
PR 合并时自动关闭 issue。
Automatically closes linked issue when PR is merged.
用法:`Fixes #<issue 号>`,或者 `Fixes (粘贴 issue 完整链接)`
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
-->
#### Special notes for your reviewer:
https://user-images.githubusercontent.com/106857035/235871211-ee469964-d7b3-41d3-ac9b-6997872ac507.mp4
#### Does this PR introduce a user-facing change?
<!--
如果当前 Pull Request 的修改不会造成用户侧的任何变更,在 `release-note` 代码块儿中填写 `NONE`。
否则请填写用户侧能够理解的 Release Note。如果当前 Pull Request 包含破坏性更新(Break Change),
Release Note 需要以 `action required` 开头。
If no, just write "NONE" in the release-note block below.
If yes, a release note is required:
Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".
-->
```release-note
NONE
```
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
修复插件缺失路径信息升级后无法使用的兼容性问题
how to test it?
1. 生产模式安装插件
2. 更新插件将插件中的 status.loadLocation 和 metadata.annotations["plugin.halo.run/plugin-path"] 删除
3. 查看插件功能是否正常
#### Does this PR introduce a user-facing change?
```release-note
修复插件缺失路径信息升级后无法使用的兼容性问题
```
#### What type of PR is this?
/kind improvement
#### What this PR does / why we need it:
升级默认主题的版本为 1.3.0:https://github.com/halo-dev/theme-earth/releases/tag/v1.3.0
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind bug
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
修复页面的链接不能包含特殊字符的问题。
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3808
#### Special notes for your reviewer:
测试方式:
1. 创建一个页面。
2. 尝试设置别名为中文或者其他字符。
3. 尝试包含多个 `/` 分隔符。
4. 尝试访问页面,检查是否能够正常访问。
#### Does this PR introduce a user-facing change?
```release-note
修复页面链接包含中文等字符后无法访问的问题。
```
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
为评论接口增加排序条件。当前只增加了根据创建时间进行正/倒序排列,后续持续进行补充。
#### Which issue(s) this PR fixes:
Fixes#3364
#### Special notes for your reviewer:
调用评论列表接口。增加排序条件 `sort=creationTimestamp,desc` ,查看列表是否正确排序。
#### Does this PR introduce a user-facing change?
```release-note
为评论列表接口增加按照创建时间进行最新/最早排序
```
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
优化插件的升级流程
how to test it?
1. 测试正常的插件升级是否正常
2. 测试插件升级失败后插件是否会被卸载的问题
3. 测试没有 version 的插件安装是否能成功
4. 在插件目录不会多出一个名为 `{升级插件名称}-null.jar` 的文件
#### Which issue(s) this PR fixes:
Fixes#3839
#### Does this PR introduce a user-facing
```release-note
优化插件的升级流程
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
修复在 Dialog 组件中,如果 onConfirm 方法出现异常,按钮加载状态没有复原的问题。
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3844
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind bug
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
This PR adds PostVisibleChangedEvent to synchronizing post indices when post visible is changed, whether from public to private or from private to public.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3438
#### Special notes for your reviewer:
1. Install Search plugin
2. Create a post
3. Try to search the post
4. Make post private
5. Try to search the post
6. Make post public
7. Try to search the post
#### Does this PR introduce a user-facing change?
```release-note
修复隐藏的文章已然能够被搜索到问题
```
#### What type of PR is this?
/kind feature
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
添加复制附件链接的功能,支持三种格式:URL、HTML 格式、Markdown 格式。
#### Which issue(s) this PR fixes:
Fixes#3801
#### Special notes for your reviewer:
测试方式:
1. 上传若干不同格式的附件。
2. 打开附件详情,检查列出的格式是否正确。
3. 检查复制链接的内容是否正确。
#### Does this PR introduce a user-facing change?
```release-note
Console 端的附件详情支持复制链接的功能。
```
#### What type of PR is this?
/kind bug
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
修复文章上下篇数据查询 NPE 问题
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind feature
/area core
/milestone 2.5.x
/kind api-change
#### What this PR does / why we need it:
为客户端提供一套 APIs
#### Which issue(s) this PR fixes:
Fixes#3661
#### Does this PR introduce a user-facing change?
```release-note
为访客端提供一套完整的 API
```
#### What type of PR is this?
/kind bug
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
修复插件安装后无法启动会导致卸载后插件 JAR 文件残留的问题
how to test it?
1. 安装一个无法启动的插件,比如在插件声明周期方法中抛一个异常
2. 启动插件,然后卸载插件看插件 JAR 是否被正确删除
3. 如果是插件开发模式则不会删除文件
#### Which issue(s) this PR fixes:
Fixes#3840
#### Does this PR introduce a user-facing change?
```release-note
修复插件安装后无法启动会导致卸载后插件 JAR 文件残留的问题
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.5.0
#### What this PR does / why we need it:
修复登录表单与顶部间距异常的问题,并解决在 https://github.com/halo-dev/halo/pull/3756 中提到的在低分辨率屏幕下,语言选择和表单元素重叠的问题。
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3806
#### Special notes for your reviewer:
测试方式:
1. 检查登录页面的表单是否和以前的版本一致即可。
2. 可以尝试调整浏览器的缩放大小,检查是否有样式问题。
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind improvement
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
修改 Vue Router 的 scrollBehavior 配置,添加是否是不同路由的跳转,如果是才会在跳转之后滚动到页面顶部。可以解决在 https://github.com/halo-dev/halo/issues/3833 中提到的打开附件详情之后,列表滚动到顶部的问题。这是因为在打开附件详情的时候会修改路由的参数。
#### Which issue(s) this PR fixes:
Fixes#3833
#### Special notes for your reviewer:
测试方式:
1. 上传若干附件,滚动到列表底部。
2. 然后打开某个附件详情,观察列表是否自动滚动到了顶部,如果没有,则修改有效。
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
修复文章分类和标签选择组件在 Repeater 组件中,下拉框无法完整显示的问题。
<img width="598" alt="image" src="https://user-images.githubusercontent.com/21301288/233818471-0334b449-e2eb-44aa-a5ce-ed9a4ad54e8b.png">
#### Which issue(s) this PR fixes:
Fixes#3479
#### Does this PR introduce a user-facing change?
```release-note
修复 Console 端的文章分类和标签选择组件在 Repeater 组件中,下拉框无法完整显示的问题。
```
#### What type of PR is this?
/kind improvement
/area core
/milestone 2.5.x
/kind api-change
#### What this PR does / why we need it:
提供自定义 API 用于创建用户账号
简化了创建用户账号需要先创建账号,再分配角色再重置密码的复杂流程。
需要 Console 端适配此 PR
#### Which issue(s) this PR fixes:
Fixes#2852
#### Does this PR introduce a user-facing change?
```release-note
优化用户账号创建流程
```
#### What type of PR is this?
/kind cleanup
/area core
#### What this PR does / why we need it:
Upgrade to Spring Boot 3.0.6.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3829
#### Does this PR introduce a user-facing change?
```release-note
升级 Spring Boot 至 3.0.6
```
#### What type of PR is this?
/kind bug
/area plugin
/area core
#### What this PR does / why we need it:
Close file system after reading plugin descriptor.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3720
#### How to test?
1. Build a plugin and install it
2. Update plugin.yaml of the plugin, rebuild and upgrade it
3. Check the change you modified
#### Does this PR introduce a user-facing change?
```release-note
修复无法正常升级插件的问题
```
#### What type of PR is this?
/kind improvement
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
为 FormKit 表单中包含了 required 验证的表单元素的 label 添加指示器(*),优化可访问性。
<img width="694" alt="image" src="https://user-images.githubusercontent.com/21301288/233822533-6a30b43e-738a-47f3-92c1-045d34cc1ba3.png">
#### Which issue(s) this PR fixes:
Fixes#3823
#### Special notes for your reviewer:
测试方式:
1. 检查 Console 端的表单中必填项的 label 是否添加了 * 即可。
#### Does this PR introduce a user-facing change?
```release-note
为 FormKit 表单中包含了 required 验证的表单元素的 label 添加指示器(*),优化可访问性。
```
#### What type of PR is this?
/kind improvement
/area console
#### What this PR does / why we need it:
调整 ESLint 的执行参数,添加 max-warnings 为 0,意味着在提交或者运行 CI 的时候不再允许包含 warning 级别的检测。
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind improvement
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
升级 @tanstack/vue-query 的版本至 [v4.29.1](https://github.com/TanStack/query/releases/tag/v4.29.1),并默认将 `refetchOnWindowFocus` 选项设置为 false。此选项的作用是当窗口重新聚焦时,刷新当前页面请求的状态(重新请求接口),目前暂时不需要使用它。
#### Does this PR introduce a user-facing change?
```release-note
升级 Console 端 `@tanstack/vue-query` 依赖的版本至 [v4.29.1](https://github.com/TanStack/query/releases/tag/v4.29.1)
```
#### What type of PR is this?
/kind bug
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
修复升级插件之后没有自动刷新页面的问题,一般情况来说,升级插件之后需要重载插件 Console 部分的资源。
#### Special notes for your reviewer:
测试方式:
1. 以 deployment 模式启动 Halo
2. 测试升级插件之后是否有正常刷新页面
#### Does this PR introduce a user-facing change?
```release-note
修复 Console 端升级插件之后没有自动刷新页面的问题。
```
#### What type of PR is this?
/kind feature
/area console
/milestone 2.5.0
#### What this PR does / why we need it:
为 Console 端添加 Description 组件。
#### Which issue(s) this PR fixes:
Fixes#3790
#### Special notes for your reviewer:
测试方式:
1. 检查主题管理、插件详情、认证方式详情页面的样式是否异常即可。
#### Does this PR introduce a user-facing change?
```release-note
为 Console 端添加 Description 组件。
```
#### What type of PR is this?
/kind improvement
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
支持在附件上传弹框中点击完成按钮关闭弹框。
<img width="647" alt="image" src="https://user-images.githubusercontent.com/21301288/232964793-d4e94e7a-fc81-4d1b-b0fc-b93d8f5bc537.png">
#### Special notes for your reviewer:
测试方式:
1. 测试上传完附件之后,点击完成按钮,观察是否关闭上传弹框即可。
#### Does this PR introduce a user-facing change?
```release-note
优化 Console 端上传附件的弹框,支持点击完成按钮以关闭弹框。
```
#### What type of PR is this?
/kind improvement
/area core
#### What this PR does / why we need it:
对初始超级管理员用户名增加合法性校验
#### Which issue(s) this PR fixes:
Fixes#3482
#### Does this PR introduce a user-facing change?
```release-note
对初始超级管理员用户名增加合法性校验
```
#### What type of PR is this?
/kind feature
/area core
/area plugin
#### What this PR does / why we need it:
This PR adds reconciliation mechanism for plugin. After that, we could define a `Reconciler<Request>` like the following when developing plugin:
```java
@Slf4j
@Component
public class ApplicationReconciler implements Reconciler<Reconciler.Request> {
@Override
public Result reconcile(Request request) {
log.info("Application {} changed.", request);
return Result.doNotRetry();
}
@Override
public Controller setupWith(ControllerBuilder builder) {
return builder
.extension(new Application())
.workerCount(1)
.build();
}
}
```
You can reconcile any extensions as needed.
Meanwhile, all plugins will be stopped when Halo is shutting down.
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3783
#### Does this PR introduce a user-facing change?
```release-note
支持在插件中定义 Reconciler
```
#### What type of PR is this?
/kind feature
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
为上传组件 Uppy 导入中文繁体的语言包。
#### Which issue(s) this PR fixes:
Ref https://github.com/halo-dev/halo/pull/3672
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind improvement
/area core
#### What this PR does / why we need it:
优化异常信息
- 5xx 服务器内部错误不显示异常详情到页面,如主题模板表达式错误
- 访问 `GET /apis/api.halo.run/v1alpha1/comments` 提示 400 且不会打印异常堆栈
- 访问不存在的主题静态资源提示 404 且不会打印异常堆栈,如 `GET /themes/guqing-higan/assets/dist/style1.css`
#### Which issue(s) this PR fixes:
Fixes#3483
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind improvement
/kind api-change
/area core
/milestone 2.5.x
#### What this PR does / why we need it:
Add property `halo.use-absolute-permalink`(default is `false`) to control permalink generation. Leave `halo.external-url` as `null` by default.
Meanwhile, I enhanced `ExternalUrlSupplier#getURL` to get URL from not only properties but only http request.
#### How to use it?
```yaml
halo:
use-absolute-permalink: false
```
Or:
```yaml
halo:
external-url: https://halo.run/
use-absolute-permalink: false
```
Or:
```yaml
halo:
external-url: https://halo.run/
use-absolute-permalink: true
```
#### Which issue(s) this PR fixes:
Fixes https://github.com/halo-dev/halo/issues/3762
#### Special notes for your reviewer:
#### Does this PR introduce a user-facing change?
```release-note
新增是否生成相对地址的配置
```
#### What type of PR is this?
/kind documentation
#### What this PR does / why we need it:
更新 SECURITY.md 文档中支持的版本。
#### Does this PR introduce a user-facing change?
```release-note
None
```
#### What type of PR is this?
/kind improvement
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
在主题列表激活主题之后,自动刷新页面。
#### Which issue(s) this PR fixes:
Fixes#3778
#### Special notes for your reviewer:
测试方式:
1. 打开主题列表,选择任意主题激活,观察是否刷新页面。
#### Does this PR introduce a user-facing change?
```release-note
优化 Console 端激活主题的流程,支持激活后自动刷新页面
```
#### What type of PR is this?
/kind improvement
/area console
/milestone 2.5.x
#### What this PR does / why we need it:
优化安装主题和升级主题的流程,支持在升级或者安装之后自动关闭弹框以及刷新数据。
#### Special notes for your reviewer:
测试方式:
1. 测试升级或者安装新主题之后是否关闭弹框以及是否有提示即可。
#### Does this PR introduce a user-facing change?
```release-note
优化 Console 端安装和升级主题的流程,支持自动关闭安装弹框和显示反馈提示
```