chore: remove archived docs (#360)
考虑到此仓库的文档版本逐渐变多,会导致编译过慢,所以这个 PR 移除了 2.0-2.9 的历史版本,并将这些版本部署到了 https://v2.archive-docs.halo.run/ <img width="498" alt="image" src="https://github.com/halo-dev/docs/assets/21301288/64281dc1-28c0-4656-a2fc-10ccc050e2a7"> /kind improvement ```release-note None ```wan92hen-patch-1
@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.0",
|
|
||||||
"description": "The label for version 2.0"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.1",
|
|
||||||
"description": "The label for version 2.1"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.2",
|
|
||||||
"description": "The label for version 2.2"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.3",
|
|
||||||
"description": "The label for version 2.3"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.4",
|
|
||||||
"description": "The label for version 2.4"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.5",
|
|
||||||
"description": "The label for version 2.5"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.6",
|
|
||||||
"description": "The label for version 2.6"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.7",
|
|
||||||
"description": "The label for version 2.7"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.8",
|
|
||||||
"description": "The label for version 2.8"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"version.label": {
|
|
||||||
"message": "2.9",
|
|
||||||
"description": "The label for version 2.9"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.入门": {
|
|
||||||
"message": "入门",
|
|
||||||
"description": "The label for category 入门 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.安装指南": {
|
|
||||||
"message": "安装指南",
|
|
||||||
"description": "The label for category 安装指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.其他指南": {
|
|
||||||
"message": "其他指南",
|
|
||||||
"description": "The label for category 其他指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.用户指南": {
|
|
||||||
"message": "用户指南",
|
|
||||||
"description": "The label for category 用户指南 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.tutorial.category.参与贡献": {
|
|
||||||
"message": "参与贡献",
|
|
||||||
"description": "The label for category 参与贡献 in sidebar tutorial"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.系统开发": {
|
|
||||||
"message": "系统开发",
|
|
||||||
"description": "The label for category 系统开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.插件开发": {
|
|
||||||
"message": "插件开发",
|
|
||||||
"description": "The label for category 插件开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.基础": {
|
|
||||||
"message": "基础",
|
|
||||||
"description": "The label for category 基础 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.示例": {
|
|
||||||
"message": "示例",
|
|
||||||
"description": "The label for category 示例 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.API 参考": {
|
|
||||||
"message": "API 参考",
|
|
||||||
"description": "The label for category API 参考 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.主题开发": {
|
|
||||||
"message": "主题开发",
|
|
||||||
"description": "The label for category 主题开发 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.模板变量": {
|
|
||||||
"message": "模板变量",
|
|
||||||
"description": "The label for category 模板变量 in sidebar developer"
|
|
||||||
},
|
|
||||||
"sidebar.developer.category.Finder API": {
|
|
||||||
"message": "Finder API",
|
|
||||||
"description": "The label for category Finder API in sidebar developer"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 798 B |
Before Width: | Height: | Size: 2.5 MiB |
Before Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 208 KiB |
Before Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 186 KiB |
Before Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 204 KiB |
Before Width: | Height: | Size: 214 KiB |
Before Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 204 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 194 KiB |
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: 关于文档
|
|
||||||
description: 关于本文档站点的一些说明
|
|
||||||
---
|
|
||||||
|
|
||||||
:::note
|
|
||||||
此文档使用 [Docusaurus](https://docusaurus.io/) 搭建,感谢 [Docusaurus](https://github.com/facebook/docusaurus) 社区所做的贡献。
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 参与贡献
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
如果你发现文档中有不正确或者需要添加的内容,非常欢迎参与到文档编辑当中。
|
|
||||||
:::
|
|
||||||
|
|
||||||
当前文档的仓库地址为 [halo-dev/docs](https://github.com/halo-dev/docs) ,所以你可以 fork 此仓库,修改之后提交 `Pull request` 等待我们合并即可。
|
|
@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
title: 问题反馈
|
|
||||||
description: 问题反馈渠道及指南
|
|
||||||
---
|
|
||||||
|
|
||||||
:::info
|
|
||||||
如果您在使用过程中遇到了什么问题,您可以通过下面的方式反馈,但请尽量按照要求提出反馈。
|
|
||||||
:::
|
|
||||||
|
|
||||||
## GitHub Issues
|
|
||||||
|
|
||||||
链接:<https://github.com/halo-dev/halo/issues>
|
|
||||||
|
|
||||||
如果你在使用过程中,遇到了一些 bug 或者需要添加某些新特性,请尽量在 GitHub Issues 进行反馈,这非常有助于我们跟踪解决此问题,您也可以很方便的接收到处理状态。
|
|
||||||
|
|
||||||
建议步骤:
|
|
||||||
|
|
||||||
1. 在 [Issues 列表](https://github.com/halo-dev/halo/issues) 搜索相关问题,看看是否有其他人已经提到了此问题。
|
|
||||||
2. 如果当前还没有人遇到您类似的问题,那么请点击右上角的 `New issue` 按钮创建新的 issue。
|
|
||||||
3. 选择正确的反馈类型。
|
|
||||||
4. 请尽可能详细的按照模板填写内容。
|
|
||||||
5. 点击 `Submit new issue` 提交 issue。
|
|
||||||
|
|
||||||
## Halo 官方社区
|
|
||||||
|
|
||||||
链接:<https://bbs.halo.run>
|
|
||||||
|
|
||||||
此平台主要目的用于与其他 Halo 用户进行交流。但如果您对 GitHub 不是很熟悉或者没有账号,您也可以在此平台进行反馈。
|
|
@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
title: 系统结构
|
|
||||||
description: Halo 项目的构成
|
|
||||||
---
|
|
||||||
|
|
||||||
[Halo](https://github.com/halo-dev/halo) 博客系统分为以下四个部分:
|
|
||||||
|
|
||||||
| 项目名称 | 简介 |
|
|
||||||
| :------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| [halo](https://github.com/halo-dev/halo) | 提供整个系统的服务,采用 [Spring Boot](https://spring.io/) 开发 |
|
|
||||||
| [halo-admin](https://github.com/halo-dev/halo-admin) | 负责后台管理的渲染,采用 [Vue](https://vuejs.org/) 开发,已集成在 Halo 运行包内,无需独立部署。 |
|
|
||||||
| [halo-comment](https://github.com/halo-dev/halo-comment) | 评论插件,采用 [Vue](https://vuejs.org/) 开发,在主题中运行方式引入构建好的 `JavaScript` 文件即可 |
|
|
||||||
| [halo-theme-\*](https://github.com/halo-dev) | 主题项目集,采用 [FreeMarker](https://freemarker.apache.org/) 模板引擎编写,需要包含一些特殊的配置才能够被 halo 所使用 |
|
|
||||||
|
|
||||||
## 自定义配置
|
|
||||||
|
|
||||||
> 为什么要提前讲自定义配置呢?是因为在这里让大家了解到 `Halo` 的`配置方式`,以及`配置优先级`,不至于未来运行项目的时候不知道如何优雅地修改配置。
|
|
||||||
|
|
||||||
`Halo` 配置目录优先级如下(从上到下优先级越来越小,上层的配置将会覆盖下层):
|
|
||||||
|
|
||||||
- `Halo` 自定义配置
|
|
||||||
- file:~/.halo/
|
|
||||||
- file:~/.halo-dev/
|
|
||||||
- `Spring Boot` 默认配置
|
|
||||||
- file:./config/
|
|
||||||
- file:./
|
|
||||||
- classpath:/config/
|
|
||||||
- classpath:/
|
|
||||||
|
|
||||||
> 参考: [Application Property Files](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files)
|
|
||||||
|
|
||||||
在开发的时候,希望大家能够在 `~/halo-dev/application.yml` 中进行添加自定义配置。当然后面也会讲到如何用`运行参数` 和 `VM options` 进行控制配置,届时可根据具体情况进行选择。
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
开发的时候,我们不建议直接更改`项目源码`中的所包含的`配置文件`,包括 `application.yml`、`application-dev.yml`、`application-test.yml` 和 `application-user.yml`。
|
|
||||||
:::
|
|
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: 准备工作
|
|
||||||
description: 插件开发的准备工作
|
|
||||||
---
|
|
||||||
|
|
||||||
WIP
|
|
@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
title: 常用代码片段
|
|
||||||
description: 本文档介绍了常用的代码片段,以便于开发者快速上手。
|
|
||||||
---
|
|
||||||
|
|
||||||
## 布局模板
|
|
||||||
|
|
||||||
通常情况下,我们需要一个公共模板来定义页面的布局。
|
|
||||||
|
|
||||||
```html title="templates/layout.html"
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" xmlns:th="https://www.thymeleaf.org" th:fragment="html (head,content)">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2" />
|
|
||||||
<title th:text="${site.title}"></title>
|
|
||||||
<link rel="stylesheet" th:href="@{/assets/dist/style.css}" />
|
|
||||||
<script th:src="@{/assets/dist/main.iife.js}"></script>
|
|
||||||
<th:block th:if="${head != null}">
|
|
||||||
<th:block th:replace="${head}" />
|
|
||||||
</th:block>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<section>
|
|
||||||
<th:block th:replace="${content}" />
|
|
||||||
</section>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
```html title="templates/index.html"
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html
|
|
||||||
xmlns:th="https://www.thymeleaf.org"
|
|
||||||
th:replace="~{modules/layout :: html(head = null,content = ~{::content})}"
|
|
||||||
>
|
|
||||||
<th:block th:fragment="content">
|
|
||||||
<!-- 文章列表 -->
|
|
||||||
<ul>
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</th:block>
|
|
||||||
</html>
|
|
||||||
```
|
|
@ -1,89 +0,0 @@
|
|||||||
---
|
|
||||||
title: 配置文件
|
|
||||||
description: 关于主题配置文件的文档。
|
|
||||||
---
|
|
||||||
|
|
||||||
目前 Halo 2.0 的主题必须在根目录包含 `theme.yaml`,用于配置主题的基本信息,如主题名称、版本、作者等。
|
|
||||||
|
|
||||||
## 格式示例
|
|
||||||
|
|
||||||
```yaml title="theme.yaml"
|
|
||||||
apiVersion: theme.halo.run/v1alpha1
|
|
||||||
kind: Theme
|
|
||||||
metadata:
|
|
||||||
name: theme-foo
|
|
||||||
spec:
|
|
||||||
displayName: 示例主题
|
|
||||||
author:
|
|
||||||
name: halo-dev
|
|
||||||
website: https://halo.run
|
|
||||||
description: 一个示例主题
|
|
||||||
logo: https://halo.run/logo
|
|
||||||
website: https://github.com/halo-sigs/theme-foo
|
|
||||||
repo: https://github.com/halo-sigs/theme-foo.git
|
|
||||||
settingName: "theme-foo-setting"
|
|
||||||
configMapName: "theme-foo-configMap"
|
|
||||||
customTemplates:
|
|
||||||
post:
|
|
||||||
- name: 文档
|
|
||||||
description: 文档类型的文章
|
|
||||||
screenshot:
|
|
||||||
file: post_documentation.html
|
|
||||||
category:
|
|
||||||
- name: 知识库
|
|
||||||
description: 知识库类型的分类
|
|
||||||
screenshot:
|
|
||||||
file: category_knowledge.html
|
|
||||||
page:
|
|
||||||
- name: 关于
|
|
||||||
description: 关于页面
|
|
||||||
screenshot:
|
|
||||||
file: page_about.html
|
|
||||||
version: 1.0.0
|
|
||||||
require: 2.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
## 字段详解
|
|
||||||
|
|
||||||
| 字段 | 描述 | 是否必填 |
|
|
||||||
| ------------------------------- | ----------------------------------------------------------------------------- | -------- |
|
|
||||||
| `metadata.name` | 主题的唯一标识 | 是 |
|
|
||||||
| `spec.displayName` | 显示名称 | 是 |
|
|
||||||
| `spec.author.name` | 作者名称 | 否 |
|
|
||||||
| `spec.author.website` | 作者网站 | 否 |
|
|
||||||
| `spec.description` | 主题描述 | 否 |
|
|
||||||
| `spec.logo` | 主题 Logo | 否 |
|
|
||||||
| `spec.website` | 主题网站 | 否 |
|
|
||||||
| `spec.repo` | 主题托管地址 | 否 |
|
|
||||||
| `spec.settingName` | 设置表单定义的名称,需要同时创建对应的 `settings.yaml` 文件 | 否 |
|
|
||||||
| `spec.configMapName` | 设置持久化配置的 ConfigMap 名称 | 否 |
|
|
||||||
| `spec.customTemplates.post` | 文章的自定义模板配置,详细文档可查阅 [模板路由](./template-route-mapping#custom-templates) | 否 |
|
|
||||||
| `spec.customTemplates.category` | 分类的自定义模板配置,详细文档可查阅 [模板路由](./template-route-mapping#custom-templates) | 否 |
|
|
||||||
| `spec.customTemplates.page` | 独立页面的自定义模板配置,详细文档可查阅 [模板路由](./template-route-mapping#custom-templates) | 否 |
|
|
||||||
| `spec.version` | 主题版本 | 是 |
|
|
||||||
| `spec.require` | 所需 Halo 的运行版本 | 是 |
|
|
||||||
|
|
||||||
## 更新配置
|
|
||||||
|
|
||||||
由于目前 `theme.yaml` 是持久化存储在数据库中的,不会在修改之后主动更新,所以我们在 Console 的主题页面添加了 `重载主题配置` 的选项。
|
|
||||||
|
|
||||||
![重载主题配置](/img/theme/reload-theme-config.png)
|
|
||||||
|
|
||||||
## 从 1.x 迁移
|
|
||||||
|
|
||||||
为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移配置文件。
|
|
||||||
|
|
||||||
工具仓库地址:<https://github.com/halo-sigs/convert-theme-config-to-next>
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1.x 版本主题
|
|
||||||
cd path/to/theme
|
|
||||||
|
|
||||||
npx @halo-dev/convert-theme-config-to-next theme
|
|
||||||
```
|
|
||||||
|
|
||||||
执行完成之后即可看到主题目录下生成了 `theme.2.0.yaml` 文件,重命名为 `theme.yaml` 即可。
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
转换完成之后需要修改 `metadata.name`、`spec.settingName` 和 `spec.configMapName`。
|
|
||||||
:::
|
|
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: Finder API
|
|
||||||
description: 本文档介绍 Finder API 的使用方法。
|
|
||||||
---
|
|
||||||
|
|
||||||
import DocCardList from '@theme/DocCardList';
|
|
||||||
|
|
||||||
目前在主题模板中获取数据可以使用对应路由提供的 [模板变量](./template-variables),但为了满足在任意位置获取数据的需求,我们提供了 Finder API。
|
|
||||||
|
|
||||||
<DocCardList />
|
|
@ -1,187 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章分类
|
|
||||||
description: 文章分类 - CategoryFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md"
|
|
||||||
import CategoryTreeVo from "../vo/CategoryTreeVo.md"
|
|
||||||
|
|
||||||
## getByName(name)
|
|
||||||
|
|
||||||
```js
|
|
||||||
categoryFinder.getByName(name)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取文章分类。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `name:string` - 分类的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#CategoryVo](#categoryvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="category = ${categoryFinder.getByName('category-foo')}">
|
|
||||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"></a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## getByNames(names)
|
|
||||||
|
|
||||||
```js
|
|
||||||
categoryFinder.getByNames(names)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据一组 `metadata.name` 获取文章分类。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `names:List<string>` - 分类的唯一标识 `metadata.name` 的集合。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#CategoryVo](#categoryvo)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="categories = ${categoryFinder.getByNames(['category-foo', 'category-bar'])}">
|
|
||||||
<a th:each="category : ${categories}" th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"></a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## list(page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
categoryFinder.list(page,size)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据分页参数获取分类列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<CategoryVo\>](#listresultcategoryvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="categories = ${categoryFinder.list(1,10)}">
|
|
||||||
<li th:each="category : ${categories.items}">
|
|
||||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listAll()
|
|
||||||
|
|
||||||
```js
|
|
||||||
categoryFinder.listAll()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取所有文章分类。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#CategoryVo](#categoryvo)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="categories = ${categoryFinder.listAll()}">
|
|
||||||
<li th:each="category : ${categories}">
|
|
||||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listAsTree()
|
|
||||||
|
|
||||||
```js
|
|
||||||
categoryFinder.listAsTree()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取所有文章分类的多层级结构。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#CategoryTreeVo](#categorytreevo)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="categories = ${categoryFinder.listAsTree()}">
|
|
||||||
<ul>
|
|
||||||
<li th:replace="~{modules/category-tree :: single(categories=${categories})}" />
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
```html title="/templates/category-tree.html"
|
|
||||||
<ul th:fragment="next (categories)">
|
|
||||||
<li th:fragment="single (categories)" th:each="category : ${categories}">
|
|
||||||
<a th:href="@{${category.status.permalink}}">
|
|
||||||
<span th:text="${category.spec.displayName}"> </span>
|
|
||||||
</a>
|
|
||||||
<th:block th:if="${not #lists.isEmpty(category.children)}">
|
|
||||||
<th:block th:replace="~{modules/category-tree :: next (categories=${category.children})}"></th:block>
|
|
||||||
</th:block>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### ListResult<CategoryVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<CategoryVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#CategoryVo>", // 分类列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
|
|
||||||
### CategoryTreeVo
|
|
||||||
|
|
||||||
<CategoryTreeVo />
|
|
||||||
|
|
||||||
- [#CategoryTreeVo](#categorytreevo)
|
|
@ -1,155 +0,0 @@
|
|||||||
---
|
|
||||||
title: 评论
|
|
||||||
description: 评论 - CommentFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import CommentVo from "../vo/CommentVo.md"
|
|
||||||
import ReplyVo from "../vo/ReplyVo.md"
|
|
||||||
|
|
||||||
## getByName(name)
|
|
||||||
|
|
||||||
```js
|
|
||||||
commentFinder.getByName(name)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取评论。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `name:string` - 评论的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#CommentVo](#commentvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="comment = ${commentFinder.getByName('comment-foo')}">
|
|
||||||
<span th:text="${comment.spec.owner.displayName}"></span>
|
|
||||||
<div th:text="${comment.spec.content}"></div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## list(ref,page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
commentFinder.list(ref,page,size)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据评论的 `metadata.name` 和分页参数获取回复列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `ref:#Ref` - 评论的唯一标识 `metadata.name`。
|
|
||||||
2. `page:int` - 分页页码,从 1 开始
|
|
||||||
3. `size:int` - 分页条数
|
|
||||||
|
|
||||||
- [#Ref](#ref)
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<CommentVo\>](#listresultcommentvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="comments = ${commentFinder.list({ group: 'content.halo.run', version: 'v1alpha1', kind: 'Post', name: 'post-foo' },1,10)}">
|
|
||||||
<li th:each="comment : ${comments.items}">
|
|
||||||
<span th:text="${comment.spec.owner.displayName}"></span>
|
|
||||||
<div th:text="${comment.spec.content}"></div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listReply(commentName,page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
commentFinder.listReply(commentName,page,size)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据评论的 `metadata.name` 和分页参数获取回复列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `commentName:string` - 评论的唯一标识 `metadata.name`。
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<ReplyVo\>](#listresultreplyvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="replies = ${commentFinder.listReply('comment-foo',1,10)}">
|
|
||||||
<li th:each="reply : ${replies.items}">
|
|
||||||
<span th:text="${reply.spec.owner.displayName}"></span>
|
|
||||||
<div th:text="${reply.spec.content}"></div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CommentVo
|
|
||||||
|
|
||||||
<CommentVo />
|
|
||||||
|
|
||||||
### ListResult<CommentVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<CommentVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#CommentVo>", // 评论列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#CommentVo](#commentvo)
|
|
||||||
|
|
||||||
### ReplyVo
|
|
||||||
|
|
||||||
<ReplyVo />
|
|
||||||
|
|
||||||
### ListResult<ReplyVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<ReplyVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#ReplyVo>", // 回复列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ReplyVo](#replyvo)
|
|
||||||
|
|
||||||
### Ref
|
|
||||||
|
|
||||||
```json title="Ref"
|
|
||||||
{
|
|
||||||
"group": "string",
|
|
||||||
"kind": "string",
|
|
||||||
"version": "string",
|
|
||||||
"name": "string"
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,64 +0,0 @@
|
|||||||
---
|
|
||||||
title: 作者
|
|
||||||
description: 作者 - ContributorFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import Contributor from "../vo/Contributor.md"
|
|
||||||
|
|
||||||
## getContributor(name)
|
|
||||||
|
|
||||||
```js
|
|
||||||
contributorFinder.getContributor(name)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取作者。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `name:string` - 作者的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#Contributor](#contributor)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="contributor = ${contributorFinder.getContributor('contributor-foo')}">
|
|
||||||
<h1 th:text="${contributor.displayName}"></h1>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## getContributors(names)
|
|
||||||
|
|
||||||
```js
|
|
||||||
contributorFinder.getContributors(names)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据一组 `metadata.name` 获取作者。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `names:List<string>` - 作者的唯一标识 `metadata.name` 的集合。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#Contributor](#contributor)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="contributors = ${contributorFinder.getContributors(['contributor-foo, 'contributor-bar'])}">
|
|
||||||
<span th:each="contributor : ${contributors}" th:text="${contributor.displayName}"></span>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
@ -1,77 +0,0 @@
|
|||||||
---
|
|
||||||
title: 导航菜单
|
|
||||||
description: 导航菜单 - MenuFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import MenuItemVo from "../vo/MenuItemVo.md"
|
|
||||||
import MenuVo from "../vo/MenuVo.md"
|
|
||||||
|
|
||||||
## getByName(name)
|
|
||||||
|
|
||||||
```js
|
|
||||||
menuFinder.getByName(name)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取菜单。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `name:string` - 菜单的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#MenuVo](#menuvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="menu = ${menuFinder.getByName('menu-foo')}">
|
|
||||||
<ul th:with="menuItems = ${menu.menuItems}">
|
|
||||||
<li th:each="menuItem : ${menuItems}">
|
|
||||||
<a th:href="@{${menuItem.status.href}}" th:text="${menuItem.status.displayName}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## getPrimary()
|
|
||||||
|
|
||||||
```js
|
|
||||||
menuFinder.getPrimary()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取主菜单。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#MenuVo](#menuvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="menu = ${menuFinder.getPrimary()}">
|
|
||||||
<ul th:with="menuItems = ${menu.menuItems}">
|
|
||||||
<li th:each="menuItem : ${menuItems}">
|
|
||||||
<a th:href="@{${menuItem.status.href}}" th:text="${menuItem.status.displayName}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### MenuVo
|
|
||||||
|
|
||||||
<MenuVo />
|
|
||||||
|
|
||||||
### MenuItemVo
|
|
||||||
|
|
||||||
<MenuItemVo />
|
|
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
title: 插件
|
|
||||||
description: 插件 - PluginFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
## available(pluginName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
pluginFinder.available(pluginName)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
判断一个插件是否可用,会同时判断插件是否安装和启用。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `pluginName:string` - 插件的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
`boolean` - 插件是否可用
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!-- https://github.com/halo-sigs/plugin-search-widget -->
|
|
||||||
<li th:if="${pluginFinder.available('PluginSearchWidget')}">
|
|
||||||
<a href="javascript:SearchWidget.open()" title="搜索">
|
|
||||||
搜索
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
```
|
|
@ -1,430 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章
|
|
||||||
description: 文章 - PostFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md";
|
|
||||||
import TagVo from "../vo/TagVo.md";
|
|
||||||
import PostVo from "../vo/PostVo.md";
|
|
||||||
import ContentVo from "../vo/ContentVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md"
|
|
||||||
import ListedPostVo from "../vo/ListedPostVo.md"
|
|
||||||
|
|
||||||
## getByName(postName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.getByName(postName);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取文章。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `postName:string` - 文章的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#PostVo](#postvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="post = ${postFinder.getByName('post-foo')}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}"></a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## content(postName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.content(postName);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据文章的 `metadata.name` 单独获取文章内容。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `postName:string` - 文章的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ContentVo](#contentvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="content = ${postFinder.content('post-foo')}">
|
|
||||||
<div th:utext="${content.content}"></div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## cursor(postName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.cursor(postName);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据文章的 `metadata.name` 获取相邻的文章(上一篇 / 下一篇)。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `postName:string` - 文章的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#NavigationPostVo](#navigationpostvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html title="/templates/post.html"
|
|
||||||
<div th:with="postCursor = ${postFinder.cursor(post.metadata.name)}">
|
|
||||||
<a
|
|
||||||
th:if="${postCursor.hasPrevious()}"
|
|
||||||
th:href="@{${postCursor.previous.status.permalink}}"
|
|
||||||
>
|
|
||||||
<span th:text="${postCursor.previous.spec.title}"></span>
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
th:if="${postCursor.hasNext()}"
|
|
||||||
th:href="@{${postCursor.next.status.permalink}}"
|
|
||||||
>
|
|
||||||
<span th:text="${postCursor.next.spec.title}"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listAll()
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.listAll();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取所有文章。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#ListedPostVo](#listedpostvo)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="posts = ${postFinder.listAll()}">
|
|
||||||
<li th:each="post : ${posts}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## list(page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.list(page, size);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据分页参数获取文章列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<ListedPostVo\>](#listresultlistedpostvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="posts = ${postFinder.list(1,10)}">
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listByCategory(page,size,categoryName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.listByCategory(page, size, categoryName);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据分类标识和分页参数获取文章列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
3. `categoryName:string` - 文章分类唯一标识 `metadata.name`
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<ListedPostVo\>](#listresultlistedpostvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="posts = ${postFinder.listByCategory(1,10,'category-foo')}">
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listByTag(page,size,tag)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.listByTag(page, size, tag);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据标签标识和分页参数获取文章列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
3. `tag:string` - 文章分类唯一标识 `metadata.name`
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<ListedPostVo\>](#listresultlistedpostvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="posts = ${postFinder.listByTag(1,10,'tag-foo')}">
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## archives(page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.archives(page, size);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据分页参数获取文章归档列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<th:block th:with="archives = ${postFinder.archives(1,10)}">
|
|
||||||
<th:block th:each="archive : ${archives.items}">
|
|
||||||
<h1 th:text="${archive.year}"></h1>
|
|
||||||
<ul>
|
|
||||||
<th:block th:each="month : ${archive.months}">
|
|
||||||
<li th:each="post : ${month.posts}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}">
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</th:block>
|
|
||||||
</ul>
|
|
||||||
</th:block>
|
|
||||||
</th:block>
|
|
||||||
```
|
|
||||||
|
|
||||||
## archives(page,size,year)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.archives(page, size, year);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据年份和分页参数获取文章归档列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
3. `year:string` - 年份
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<th:block th:with="archives = ${postFinder.archives(1,10,'2022')}">
|
|
||||||
<th:block th:each="archive : ${archives.items}">
|
|
||||||
<h1 th:text="${archive.year}"></h1>
|
|
||||||
<ul>
|
|
||||||
<th:block th:each="month : ${archive.months}">
|
|
||||||
<li th:each="post : ${month.posts}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}">
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</th:block>
|
|
||||||
</ul>
|
|
||||||
</th:block>
|
|
||||||
</th:block>
|
|
||||||
```
|
|
||||||
|
|
||||||
## archives(page,size,year,month)
|
|
||||||
|
|
||||||
```js
|
|
||||||
postFinder.archives(page, size, year, month);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据年月和分页参数获取文章归档列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
3. `year:string` - 年份
|
|
||||||
4. `month:string` - 月份
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<PostArchiveVo\>](#listresultpostarchivevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<th:block th:with="archives = ${postFinder.archives(1,10,'2022','11')}">
|
|
||||||
<th:block th:each="archive : ${archives.items}">
|
|
||||||
<h1 th:text="${archive.year}"></h1>
|
|
||||||
<ul>
|
|
||||||
<th:block th:each="month : ${archive.months}">
|
|
||||||
<li th:each="post : ${month.posts}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}">
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</th:block>
|
|
||||||
</ul>
|
|
||||||
</th:block>
|
|
||||||
</th:block>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
||||||
|
|
||||||
### PostVo
|
|
||||||
|
|
||||||
<PostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
- [#ContentVo](#contentvo)
|
|
||||||
|
|
||||||
### ContentVo
|
|
||||||
|
|
||||||
<ContentVo />
|
|
||||||
|
|
||||||
### NavigationPostVo
|
|
||||||
|
|
||||||
```json title="NavigationPostVo"
|
|
||||||
{
|
|
||||||
"previous": "#PostVo", // 上一篇文章
|
|
||||||
"current": "#PostVo", // 当前文章
|
|
||||||
"next": "#PostVo" // 下一篇文章
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#PostVo](#postvo)
|
|
||||||
|
|
||||||
### ListedPostVo
|
|
||||||
|
|
||||||
<ListedPostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
### ListResult<ListedPostVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<ListedPostVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#ListedPostVo>", // 文章列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedPostVo](#listedpostvo)
|
|
||||||
|
|
||||||
### PostArchiveVo
|
|
||||||
|
|
||||||
```json title="PostArchiveVo"
|
|
||||||
{
|
|
||||||
"year": "string",
|
|
||||||
"months": [
|
|
||||||
{
|
|
||||||
"month": "string",
|
|
||||||
"posts": "#ListedPostVo"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedPostVo](#listedpostvo)
|
|
||||||
|
|
||||||
### ListResult<PostArchiveVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<PostArchiveVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#PostArchiveVo>", // 文章归档数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#PostArchiveVo](#postarchivevo)
|
|
@ -1,131 +0,0 @@
|
|||||||
---
|
|
||||||
title: 独立页面
|
|
||||||
description: 独立页面 - SinglePageFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import SinglePageVo from "../vo/SinglePageVo.md"
|
|
||||||
import ListedSinglePageVo from "../vo/ListedSinglePageVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md"
|
|
||||||
import ContentVo from "../vo/ContentVo.md"
|
|
||||||
|
|
||||||
## getByName(pageName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
singlePageFinder.getByName(pageName)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取独立页面。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `pageName:string` - 独立页面的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#SinglePageVo](#singlepagevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="singlePage = ${singlePageFinder.getByName('page-foo')}">
|
|
||||||
<a th:href="@{${singlePage.status.permalink}}" th:text="${singlePage.spec.title}"></a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## content(pageName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
singlePageFinder.content(pageName)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据独立页面的 `metadata.name` 单独获取独立页面内容。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `pageName:string` - 独立页面的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ContentVo](#contentvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="content = ${singlePageFinder.content('page-foo')}">
|
|
||||||
<div th:utext="${content.content}"></div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## list(page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
singlePageFinder.list(page,size)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据分页参数获取独立页面列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<ListedSinglePageVo\>](#listresultlistedsinglepagevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="singlePages = ${singlePageFinder.list(1,10)}">
|
|
||||||
<li th:each="singlePage : ${singlePages.items}">
|
|
||||||
<a th:href="@{${singlePage.status.permalink}}" th:text="${singlePage.spec.title}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### SinglePageVo
|
|
||||||
|
|
||||||
<SinglePageVo />
|
|
||||||
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
- [#ContentVo](#contentvo)
|
|
||||||
|
|
||||||
### ListedSinglePageVo
|
|
||||||
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
<ListedSinglePageVo />
|
|
||||||
|
|
||||||
### ListResult<ListedSinglePageVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<ListedSinglePageVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#ListedSinglePageVo>", // 自定义页面列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedSinglePageVo](#listedsinglepagevo)
|
|
||||||
|
|
||||||
### ContentVo
|
|
||||||
|
|
||||||
<ContentVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
title: 站点统计
|
|
||||||
description: 站点统计 - SiteStatsFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
## getStats()
|
|
||||||
|
|
||||||
```js
|
|
||||||
siteStatsFinder.getStats()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取站点的统计信息。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#SiteStatsVo](#sitestatsvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="stats = ${siteStatsFinder.getStats()}">
|
|
||||||
<li th:text="${stats.visit}"></li>
|
|
||||||
<li th:text="${stats.post}"></li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### SiteStatsVo
|
|
||||||
|
|
||||||
```json title="SiteStatsVo"
|
|
||||||
{
|
|
||||||
"visit": 0, // 访问数量
|
|
||||||
"upvote": 0, // 点赞数量
|
|
||||||
"comment": 0, // 评论数量
|
|
||||||
"post": 0, // 文章数量
|
|
||||||
"category": 0 // 分类数量
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,139 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章标签
|
|
||||||
description: 文章标签 - TagFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
import TagVo from "../vo/TagVo.md"
|
|
||||||
|
|
||||||
## getByName(name)
|
|
||||||
|
|
||||||
```js
|
|
||||||
tagFinder.getByName(name)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据 `metadata.name` 获取标签。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `name:string` - 标签的唯一标识 `metadata.name`。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#TagVo](#tagvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="tag = ${tagFinder.getByName('tag-foo')}">
|
|
||||||
<a th:href="@{${tag.status.permalink}}" th:text="${tag.spec.displayName}"></a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## getByNames(names)
|
|
||||||
|
|
||||||
```js
|
|
||||||
tagFinder.getByNames(names)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据一组 `metadata.name` 获取标签。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `names:List<string>` - 标签的唯一标识 `metadata.name` 的集合。
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#TagVo](#tagvo)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="tags = ${tagFinder.getByNames(['tag-foo', 'tag-bar'])}">
|
|
||||||
<a th:each="tag : ${tags}" th:href="@{${tag.status.permalink}}" th:text="${tag.spec.displayName}"></a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## list(page,size)
|
|
||||||
|
|
||||||
```js
|
|
||||||
tagFinder.list(page,size)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据分页参数获取标签列表。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
1. `page:int` - 分页页码,从 1 开始
|
|
||||||
2. `size:int` - 分页条数
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ListResult<TagVo\>](#listresulttagvo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="tags = ${tagFinder.list(1,10)}">
|
|
||||||
<li th:each="tag : ${tags.items}">
|
|
||||||
<a th:href="@{${tag.status.permalink}}" th:text="${tag.spec.displayName}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## listAll()
|
|
||||||
|
|
||||||
```js
|
|
||||||
tagFinder.listAll()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取所有文章标签。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
List<[#TagVo](#tagvo)>
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:with="tags = ${tagFinder.listAll()}">
|
|
||||||
<li th:each="tag : ${tags}">
|
|
||||||
<a th:href="@{${tag.status.permalink}}" th:text="${tag.spec.displayName}"></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### ListResult<TagVo\>
|
|
||||||
|
|
||||||
```json title="ListResult<TagVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#TagVo>", // 标签列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0 // 总页数
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#TagVo](#tagvo)
|
|
@ -1,119 +0,0 @@
|
|||||||
---
|
|
||||||
title: 主题
|
|
||||||
description: 主题 - ThemeFinder
|
|
||||||
---
|
|
||||||
|
|
||||||
## activation()
|
|
||||||
|
|
||||||
```js
|
|
||||||
themeFinder.activation()
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
获取当前激活的主题。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
无
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ThemeVo](#themevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="theme = ${themeFinder.activation()}">
|
|
||||||
<h1 th:text="${theme.spec.displayName}"></h1>
|
|
||||||
<p th:text="${theme.spec.version}"></p>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## getByName(themeName)
|
|
||||||
|
|
||||||
```js
|
|
||||||
themeFinder.getByName(themeName)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
根据主题的唯一标识 `metadata.name` 获取主题。
|
|
||||||
|
|
||||||
### 参数
|
|
||||||
|
|
||||||
- `themeName:string` - 主题名称
|
|
||||||
|
|
||||||
### 返回值
|
|
||||||
|
|
||||||
[#ThemeVo](#themevo)
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<div th:with="theme = ${themeFinder.getByName('theme-foo')}">
|
|
||||||
<h1 th:text="${theme.spec.displayName}"></h1>
|
|
||||||
<p th:text="${theme.spec.version}"></p>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### ThemeVo
|
|
||||||
|
|
||||||
```json title="ThemeVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T15:27:15.036Z", // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"displayName": "string", // 显示名称
|
|
||||||
"author": {
|
|
||||||
"name": "string", // 作者名称
|
|
||||||
"website": "string" // 作者网站
|
|
||||||
},
|
|
||||||
"description": "string", // 描述
|
|
||||||
"logo": "string", // Logo
|
|
||||||
"website": "string", // 网站
|
|
||||||
"repo": "string", // 仓库地址
|
|
||||||
"version": "string", // 版本
|
|
||||||
"require": "string", // 依赖 Halo 的版本
|
|
||||||
"settingName": "string", // 表单定义的名称,即 Setting 资源的 metadata.name
|
|
||||||
"configMapName": "string", // 设置项存储的名称,即 ConfigMap 资源的 metadata.name
|
|
||||||
"customTemplates": {
|
|
||||||
"post": [
|
|
||||||
{
|
|
||||||
"name": "string",
|
|
||||||
"description": "string",
|
|
||||||
"screenshot": "string",
|
|
||||||
"file": "string"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"category": [
|
|
||||||
{
|
|
||||||
"name": "string",
|
|
||||||
"description": "string",
|
|
||||||
"screenshot": "string",
|
|
||||||
"file": "string"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"page": [
|
|
||||||
{
|
|
||||||
"name": "string",
|
|
||||||
"description": "string",
|
|
||||||
"screenshot": "string",
|
|
||||||
"file": "string"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {}
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,135 +0,0 @@
|
|||||||
---
|
|
||||||
title: 设置选项
|
|
||||||
description: 介绍主题如何定义以及使用设置选项。
|
|
||||||
---
|
|
||||||
|
|
||||||
此文档将讲解如何在主题中定义和使用设置项,如 [表单定义](../form-schema) 中所说,目前 Halo 的 Console 端的所有表单都使用了 [FormKit](https://github.com/formkit/formkit) 的方案。
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
有关 FormKit 定义表单的更多信息,请参考 [表单定义](../form-schema),此文档仅针对主题中的设置项进行讲解。
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 定义表单
|
|
||||||
|
|
||||||
在主题中要使用设置项非常简单,只需要在主题根目录提供 `settings.yaml`,然后在 `theme.yaml` 中配置 `spec.settingName` 和 `spec.configMapName` 即可,在安装或者初始化主题的时候会自动识别并在 Console 端的主题设置中生成表单。
|
|
||||||
|
|
||||||
### 示例
|
|
||||||
|
|
||||||
```yaml title="theme-foo/theme.yaml" {14,15}
|
|
||||||
apiVersion: theme.halo.run/v1alpha1
|
|
||||||
kind: Theme
|
|
||||||
metadata:
|
|
||||||
name: theme-foo
|
|
||||||
spec:
|
|
||||||
displayName: 示例主题
|
|
||||||
author:
|
|
||||||
name: halo-dev
|
|
||||||
website: https://halo.run
|
|
||||||
description: 一个示例主题
|
|
||||||
logo: https://halo.run/logo
|
|
||||||
website: https://github.com/halo-sigs/theme-foo
|
|
||||||
repo: https://github.com/halo-sigs/theme-foo.git
|
|
||||||
settingName: "theme-foo-setting"
|
|
||||||
configMapName: "theme-foo-configMap"
|
|
||||||
version: 1.0.0
|
|
||||||
require: 2.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
`settingName` 和 `configMapName` 必须同时配置,且可以自定义名称,但是 `settingName` 必须和 Setting 的 `metadata.name` 一致。
|
|
||||||
:::
|
|
||||||
|
|
||||||
```yaml title="theme-foo/settings.yaml" {4}
|
|
||||||
apiVersion: v1alpha1
|
|
||||||
kind: Setting
|
|
||||||
metadata:
|
|
||||||
name: theme-foo-setting
|
|
||||||
spec:
|
|
||||||
forms:
|
|
||||||
- group: style
|
|
||||||
label: 样式
|
|
||||||
formSchema:
|
|
||||||
- $formkit: radio
|
|
||||||
name: color_scheme
|
|
||||||
label: 默认配色
|
|
||||||
value: system
|
|
||||||
options:
|
|
||||||
- label: 跟随系统
|
|
||||||
value: system
|
|
||||||
- label: 深色
|
|
||||||
value: dark
|
|
||||||
- label: 浅色
|
|
||||||
value: light
|
|
||||||
- $formkit: color
|
|
||||||
name: background_color
|
|
||||||
label: 背景颜色
|
|
||||||
value: "#f2f2f2"
|
|
||||||
- group: layout
|
|
||||||
label: 布局
|
|
||||||
formSchema:
|
|
||||||
- $formkit: radio
|
|
||||||
name: nav
|
|
||||||
label: 导航栏布局
|
|
||||||
value: "single"
|
|
||||||
options:
|
|
||||||
- label: 单栏
|
|
||||||
value: "single"
|
|
||||||
- label: 双栏
|
|
||||||
value: "double"
|
|
||||||
```
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
Setting 资源的 `metadata.name` 必须和 `theme.yaml` 中的 `spec.settingName` 一致。
|
|
||||||
:::
|
|
||||||
|
|
||||||
### 在主题模板中使用
|
|
||||||
|
|
||||||
在主题模板中,需要以 `theme.config.[group].[name]` 的形式进行调用。
|
|
||||||
|
|
||||||
其中:
|
|
||||||
|
|
||||||
1. `group`: 即 `spec.forms[].group`,如上面示例中的 `style` 和 `layout`。
|
|
||||||
2. `name`: 即 `spec.forms[].formSchema[].name`,如上面示例中的 `color_scheme` 和 `nav`。
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<body th:class="${theme.config.style.color_scheme}">
|
|
||||||
<!-- do something -->
|
|
||||||
</body>
|
|
||||||
```
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ul th:if="${theme.config.layout.nav == 'single'}">
|
|
||||||
<!-- do something -->
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div th:if="${theme.config.layout.nav == 'double'}">
|
|
||||||
<!-- do something -->
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 更新配置
|
|
||||||
|
|
||||||
与 `theme.yaml` 一样,`settings.yaml` 也是持久化存储在数据库中的,不会在修改之后主动更新。同样在主题详情页面点击 `重载主题配置` 即可。
|
|
||||||
|
|
||||||
![重载主题配置](/img/theme/reload-theme-config.png)
|
|
||||||
|
|
||||||
## 从 1.x 迁移
|
|
||||||
|
|
||||||
为了方便主题开发者从 1.x 迁移,我们提供了工具用于迁移设置表单配置文件。
|
|
||||||
|
|
||||||
工具仓库地址:<https://github.com/halo-sigs/convert-theme-config-to-next>
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1.x 版本主题
|
|
||||||
cd path/to/theme
|
|
||||||
|
|
||||||
npx @halo-dev/convert-theme-config-to-next settings
|
|
||||||
```
|
|
||||||
|
|
||||||
执行完成之后即可看到主题目录下生成了 `settings.2.0.yaml` 文件,重命名为 `settings.yaml` 即可。
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
转换完成之后需要修改 `metadata.name` 字段。
|
|
||||||
:::
|
|
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
title: 静态资源
|
|
||||||
description: 本文档介绍主题的静态资源的引用方法。
|
|
||||||
---
|
|
||||||
|
|
||||||
通过 [目录结构](./structure.md) 的讲解我们可以知道,目前主题的静态资源统一托管在 `/templates/assets/` 目录下,下面讲解一下如何在模板中使用,大致会分为两种引入方式。
|
|
||||||
|
|
||||||
## 模板标签引用
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" th:href="@{/assets/dist/style.css}" />
|
|
||||||
<script th:src="@{/assets/dist/main.iife.js}"></script>
|
|
||||||
|
|
||||||
<img th:src="@{/assets/images/logo.png}" />
|
|
||||||
```
|
|
||||||
|
|
||||||
其中 `@{/assets/dist/style.css}` 表示引用 `/templates/assets/dist/style.css` 文件。最终会被渲染为:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="stylesheet" href="/themes/my-theme/assets/dist/style.css" />
|
|
||||||
```
|
|
||||||
|
|
||||||
## API 引用
|
|
||||||
|
|
||||||
以上方式仅支持在 HTML 标签中使用,且必须使用 `@{}` 包裹才能渲染为正确的路径。如果需要在非 HTML 标签中得到正确的路径,我们提供了 `#theme.assets()` API。
|
|
||||||
|
|
||||||
:::info 注意
|
|
||||||
需要注意的是,调用 `#theme.assets()` 的时候,资源地址不需要添加 `/assets/`。
|
|
||||||
:::
|
|
||||||
|
|
||||||
比如我们需要在 JavaScript 中异步获取一些资源:
|
|
||||||
|
|
||||||
```html {3}
|
|
||||||
<script th:inline="javascript">
|
|
||||||
|
|
||||||
loadScript('[(${#theme.assets("/dist/main.iife.js")})]');
|
|
||||||
|
|
||||||
// loadScript('/themes/my-theme/assets/dist/main.iife.js');
|
|
||||||
|
|
||||||
function loadScript(url) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
var script = document.createElement('script');
|
|
||||||
script.type = 'text/javascript';
|
|
||||||
script.src = url;
|
|
||||||
script.onload = resolve;
|
|
||||||
script.onerror = reject;
|
|
||||||
document.head.appendChild(script);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info 提示
|
|
||||||
关于在 JavaScript 中使用 Thymeleaf 语法可以参考 Thymeleaf 官方文档:[JavaScript inlining](https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html#javascript-inlining)
|
|
||||||
:::
|
|
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
title: 目录结构
|
|
||||||
description: 主题的目录结构介绍
|
|
||||||
---
|
|
||||||
|
|
||||||
Halo 2.0 的主题基本目录结构如下:
|
|
||||||
|
|
||||||
```bash title="~/halo2-dev/themes/my-theme"
|
|
||||||
my-theme
|
|
||||||
├── templates/
|
|
||||||
│ ├── assets/
|
|
||||||
│ │ ├── css/
|
|
||||||
│ │ │ └── style.css
|
|
||||||
│ │ └── js/
|
|
||||||
│ │ └── main.js
|
|
||||||
│ ├── index.html
|
|
||||||
│ ├── post.html
|
|
||||||
│ ├── page.html
|
|
||||||
│ ├── tag.html
|
|
||||||
│ ├── tags.html
|
|
||||||
│ ├── category.html
|
|
||||||
│ ├── categories.html
|
|
||||||
│ └── archives.html
|
|
||||||
├── theme.yaml
|
|
||||||
└── settings.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
详细说明:
|
|
||||||
|
|
||||||
1. `/templates/` - 主题模板目录,存放主题模板文件,所有模板都需要放在这个目录。关于模板的详细说明,请查阅 [模板路由](./template-route-mapping)。
|
|
||||||
2. `/templates/assets/` - 主题静态资源目录,存放主题的静态资源文件,目前静态资源文件只能放在这个目录,引用方式请查阅 [静态资源](./static-resources)。
|
|
||||||
3. `/theme.yaml` - 主题配置文件,配置主题的基本信息,如主题名称、版本、作者等。详细文档请查阅 [配置文件](./config)。
|
|
||||||
4. `/settings.yaml` - 主题设置定义文件,配置主题的设置项表单。详细文档请查阅 [设置选项](./settings)。
|
|
@ -1,87 +0,0 @@
|
|||||||
---
|
|
||||||
title: 模板路由
|
|
||||||
description: 本文档介绍路由与模板的映射关系,以及自定义模板。
|
|
||||||
---
|
|
||||||
|
|
||||||
此文档讲解系统内部提供的路由与模板映射。
|
|
||||||
|
|
||||||
## 主要模板
|
|
||||||
|
|
||||||
### index.html
|
|
||||||
|
|
||||||
站点的首页模板,访问地址为 `/`。
|
|
||||||
|
|
||||||
### post.html
|
|
||||||
|
|
||||||
文章详情页面的模板,访问地址默认为 `/archives/:slug`。
|
|
||||||
|
|
||||||
### page.html
|
|
||||||
|
|
||||||
独立页面详情的模板,访问地址默认为 `/:slug`。
|
|
||||||
|
|
||||||
### archives.html
|
|
||||||
|
|
||||||
文章归档页面的模板,访问地址包括:
|
|
||||||
|
|
||||||
- `/archives`
|
|
||||||
- `/archives/:year`
|
|
||||||
- `/archives/:year/:month`
|
|
||||||
|
|
||||||
### tags.html
|
|
||||||
|
|
||||||
标签集合页面的模板,访问地址默认为 `/tags`。
|
|
||||||
|
|
||||||
### tag.html
|
|
||||||
|
|
||||||
标签归档页面的模板,访问地址默认为 `/tags/:slug`。
|
|
||||||
|
|
||||||
### categories.html
|
|
||||||
|
|
||||||
分类集合页面的模板,访问地址默认为 `/categories`。
|
|
||||||
|
|
||||||
### category.html
|
|
||||||
|
|
||||||
分类归档页面的模板,访问地址默认为 `/categories/:slug`。
|
|
||||||
|
|
||||||
## 自定义模板 {#custom-templates}
|
|
||||||
|
|
||||||
一般情况下,上文提到的模板已经能够满足大部分的需求,但如果需要针对某个特定的页面进行自定义,可以通过自定义模板来实现。目前系统支持为 **文章**、**独立页面**和**分类归档** 设置自定义模板:
|
|
||||||
|
|
||||||
在 `theme.yaml` 的 `spec` 节点下添加如下配置:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
customTemplates:
|
|
||||||
{type}:
|
|
||||||
- name: {name}
|
|
||||||
description: {description}
|
|
||||||
screenshot: {screenshot}
|
|
||||||
file: {file}.html
|
|
||||||
```
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
customTemplates:
|
|
||||||
post:
|
|
||||||
- name: 文档
|
|
||||||
description: 文档类型的文章
|
|
||||||
screenshot:
|
|
||||||
file: post_documentation.html
|
|
||||||
```
|
|
||||||
|
|
||||||
字段说明:
|
|
||||||
|
|
||||||
- `type`:模板类型,目前支持 `post` `page` `category`。
|
|
||||||
- `name`:模板名称
|
|
||||||
- `description`:模板描述
|
|
||||||
- `screenshot`:模板预览图
|
|
||||||
- `file`:模板文件名,需要在 `/templates/` 目录下创建
|
|
||||||
|
|
||||||
最终使用者即可在文章设置、独立页面设置、分类设置中选择自定义模板。
|
|
||||||
|
|
||||||
:::info 提示
|
|
||||||
|
|
||||||
1. 自定义模板与默认模板的功能相同,区别仅在于可以让使用者选择不同于默认模板风格的模板。
|
|
||||||
2. 自定义模板的文件名需要以 `.html` 结尾,且需要在 `/templates/` 目录下创建。
|
|
||||||
|
|
||||||
:::
|
|
@ -1,57 +0,0 @@
|
|||||||
---
|
|
||||||
title: 自定义标签
|
|
||||||
description: 本文档介绍 Halo 为模板引擎提供的专有标签。
|
|
||||||
---
|
|
||||||
|
|
||||||
Halo 为满足部分代码注入和模板扩展点的需求,提供了一些专有标签,本文档将列出已支持的标签以及介绍这些标签的使用方法。
|
|
||||||
|
|
||||||
## halo:comment
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
此标签用作评论组件的扩展点,如果有插件实现了这个扩展点,那么将在编写了此标签的模板中显示插件提供的内容。
|
|
||||||
|
|
||||||
### 使用示例
|
|
||||||
|
|
||||||
```html title="/templates/post.html"
|
|
||||||
<div th:if="${pluginFinder.available('PluginCommentWidget')}">
|
|
||||||
<halo:comment
|
|
||||||
group="content.halo.run"
|
|
||||||
kind="Post"
|
|
||||||
th:attr="name=${post.metadata.name}"
|
|
||||||
colorScheme="window.main.currentColorScheme"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
参数详解:
|
|
||||||
|
|
||||||
1. `group` - 自定义模型的分组,目前已支持的模型请参考下面表格。
|
|
||||||
2. `kind` - 自定义模型的类型,目前已支持的模型请参考下面表格。
|
|
||||||
3. `name` - 自定义模型数据的唯一标识。
|
|
||||||
4. `colorScheme` - 评论组件的颜色方案,支持 light 和 dark 两种,支持固定或者 JavaScript 变量。需要注意的是,如果需要固定一个值,那么需要添加单引号,如 'dark'。使用 JavaScript 变量时不需要。
|
|
||||||
|
|
||||||
已支持的模型列表:
|
|
||||||
|
|
||||||
| 对应模型 | group | kind |
|
|
||||||
| ---------- | ---------------- | ---------- |
|
|
||||||
| 文章 | content.halo.run | Post |
|
|
||||||
| 自定义页面 | content.halo.run | SinglePage |
|
|
||||||
|
|
||||||
## halo:footer
|
|
||||||
|
|
||||||
### 描述
|
|
||||||
|
|
||||||
支持将系统设置中的页脚代码注入内容插入到此标签。
|
|
||||||
|
|
||||||
### 使用示例
|
|
||||||
|
|
||||||
```html
|
|
||||||
<footer>
|
|
||||||
<halo:footer />
|
|
||||||
</footer>
|
|
||||||
```
|
|
||||||
|
|
||||||
:::info 注意
|
|
||||||
为了保证 Halo 的功能完整性,建议主题开发者尽可能在主题中实现此标签。
|
|
||||||
:::
|
|
@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
title: 模板变量
|
|
||||||
---
|
|
||||||
|
|
||||||
import DocCardList from '@theme/DocCardList';
|
|
||||||
|
|
||||||
<DocCardList />
|
|
@ -1,108 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章归档
|
|
||||||
description: archives.html - /archives
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md";
|
|
||||||
import TagVo from "../vo/TagVo.md";
|
|
||||||
import Contributor from "../vo/Contributor.md";
|
|
||||||
import ListedPostVo from "../vo/ListedPostVo.md";
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/archives.html`
|
|
||||||
- 访问路径
|
|
||||||
- `/archives`
|
|
||||||
- `/archives/:year`
|
|
||||||
- `/archives/:year/:month`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### archives
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#UrlContextListResult<PostArchiveVo\>](#urlcontextlistresultpostarchivevo)
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/archives.html"
|
|
||||||
<th:block th:each="archive : ${archives.items}">
|
|
||||||
<h1 th:text="${archive.year}"></h1>
|
|
||||||
<ul>
|
|
||||||
<th:block th:each="month : ${archive.months}">
|
|
||||||
<li th:each="post : ${month.posts}">
|
|
||||||
<a th:href="@{${post.status.permalink}}" th:text="${post.spec.title}">
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</th:block>
|
|
||||||
</ul>
|
|
||||||
</th:block>
|
|
||||||
<div th:if="${archives.hasPrevious() || archives.hasNext()}">
|
|
||||||
<a th:href="@{${archives.prevUrl}}">
|
|
||||||
<span>上一页</span>
|
|
||||||
</a>
|
|
||||||
<span th:text="${archives.page} +' / '+ ${archives.total}"></span>
|
|
||||||
<a th:href="@{${archives.nextUrl}}">
|
|
||||||
<span>下一页</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
||||||
|
|
||||||
### ListedPostVo
|
|
||||||
|
|
||||||
<ListedPostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
### PostArchiveVo
|
|
||||||
|
|
||||||
```json title="PostArchiveVo"
|
|
||||||
{
|
|
||||||
"year": "string", // 年份
|
|
||||||
"months": [ // 按月的文章集合
|
|
||||||
{
|
|
||||||
"month": "string", // 月份
|
|
||||||
"posts": "List<#ListedPostVo>" // 文章列表数据
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedPostVo](#listedpostvo)
|
|
||||||
|
|
||||||
### UrlContextListResult<PostArchiveVo\>
|
|
||||||
|
|
||||||
```json title="UrlContextListResult<PostArchiveVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#PostArchiveVo>", // 文章归档数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0, // 总页数
|
|
||||||
"nextUrl": "string", // 下一页链接
|
|
||||||
"prevUrl": "string" // 上一页链接
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#PostArchiveVo](#postarchivevo)
|
|
@ -1,54 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章分类集合
|
|
||||||
description: categories.html - /categories
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryTreeVo from "../vo/CategoryTreeVo.md"
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/categories.html`
|
|
||||||
- 访问路径:`/categories`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### categories
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
List<[#CategoryTreeVo](#categorytreevo)>
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/categories.html"
|
|
||||||
<ul>
|
|
||||||
<li th:replace="~{modules/category-tree :: single(categories=${categories})}" />
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
```html title="/templates/category-tree.html"
|
|
||||||
<ul th:fragment="next (categories)">
|
|
||||||
<li th:fragment="single (categories)" th:each="category : ${categories}">
|
|
||||||
<a th:href="@{${category.status.permalink}}">
|
|
||||||
<span th:text="${category.spec.displayName}"> </span>
|
|
||||||
</a>
|
|
||||||
<th:block th:if="${not #lists.isEmpty(category.children)}">
|
|
||||||
<th:block th:replace="~{modules/category-tree :: next (categories=${category.children})}"></th:block>
|
|
||||||
</th:block>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`categories`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryTreeVo
|
|
||||||
|
|
||||||
<CategoryTreeVo />
|
|
||||||
|
|
||||||
- [#CategoryTreeVo](#categorytreevo)
|
|
@ -1,105 +0,0 @@
|
|||||||
---
|
|
||||||
title: 分类归档
|
|
||||||
description: category.html - /categories/:slug
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md"
|
|
||||||
import TagVo from "../vo/TagVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md";
|
|
||||||
import ListedPostVo from "../vo/ListedPostVo.md"
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/category.html`
|
|
||||||
- 访问路径:`/categories/:slug`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### category
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#CategoryVo](#categoryvo)
|
|
||||||
|
|
||||||
### posts
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/category.html"
|
|
||||||
<div>
|
|
||||||
<h1 th:text="${category.spec.displayName}"></h1>
|
|
||||||
<ul>
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a
|
|
||||||
th:text="${post.spec.title}"
|
|
||||||
th:href="${post.status.permalink}"
|
|
||||||
></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div th:if="${posts.hasPrevious() || posts.hasNext()}">
|
|
||||||
<a
|
|
||||||
th:href="@{${posts.prevUrl}}"
|
|
||||||
>
|
|
||||||
<span>上一页</span>
|
|
||||||
</a>
|
|
||||||
<span th:text="${posts.page} +' / '+ ${posts.total}"></span>
|
|
||||||
<a
|
|
||||||
th:href="@{${posts.nextUrl}}"
|
|
||||||
>
|
|
||||||
<span>下一页</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`category`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
||||||
|
|
||||||
### ListedPostVo
|
|
||||||
|
|
||||||
<ListedPostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
### UrlContextListResult<ListedPostVo\>
|
|
||||||
|
|
||||||
```json title="UrlContextListResult<ListedPostVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#ListedPostVo>", // 文章列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0, // 总页数
|
|
||||||
"nextUrl": "string", // 下一页链接
|
|
||||||
"prevUrl": "string" // 上一页链接
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedPostVo](#listedpostvo)
|
|
@ -1,98 +0,0 @@
|
|||||||
---
|
|
||||||
title: 首页
|
|
||||||
description: index.html - /
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md"
|
|
||||||
import TagVo from "../vo/TagVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md";
|
|
||||||
import ListedPostVo from "../vo/ListedPostVo.md"
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/index.html`
|
|
||||||
- 访问路径:`/`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### posts
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/index.html"
|
|
||||||
<div>
|
|
||||||
<ul>
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a
|
|
||||||
th:text="${post.spec.title}"
|
|
||||||
th:href="${post.status.permalink}"
|
|
||||||
></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div th:if="${posts.hasPrevious() || posts.hasNext()}">
|
|
||||||
<a
|
|
||||||
th:href="@{${posts.prevUrl}}"
|
|
||||||
>
|
|
||||||
<span>上一页</span>
|
|
||||||
</a>
|
|
||||||
<span th:text="${posts.page} +' / '+ ${posts.total}"></span>
|
|
||||||
<a
|
|
||||||
th:href="@{${posts.nextUrl}}"
|
|
||||||
>
|
|
||||||
<span>下一页</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`index`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
||||||
|
|
||||||
### ListedPostVo
|
|
||||||
|
|
||||||
<ListedPostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
### UrlContextListResult<ListedPostVo\>
|
|
||||||
|
|
||||||
```json title="UrlContextListResult<ListedPostVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#ListedPostVo>", // 文章列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0, // 总页数
|
|
||||||
"nextUrl": "string", // 下一页链接
|
|
||||||
"prevUrl": "string" // 上一页链接
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedPostVo](#listedpostvo)
|
|
@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
title: 独立页面
|
|
||||||
description: page.html - /:slug
|
|
||||||
---
|
|
||||||
|
|
||||||
import SinglePageVo from "../vo/SinglePageVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md"
|
|
||||||
import ContentVo from "../vo/ContentVo.md"
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/page.html`
|
|
||||||
- 访问路径:`/:slug`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### singlePage
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#SinglePageVo](#singlepagevo)
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/page.html"
|
|
||||||
<article>
|
|
||||||
<h1 th:text="${singlePage.spec.title}"></h1>
|
|
||||||
<div th:utext="${singlePage.content.content}"> </div>
|
|
||||||
</article>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`page`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### SinglePageVo
|
|
||||||
|
|
||||||
<SinglePageVo />
|
|
||||||
|
|
||||||
- [#ContentVo](#contentvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
### ContentVo
|
|
||||||
|
|
||||||
<ContentVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
@ -1,65 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章
|
|
||||||
description: post.html - /archives/:slug
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md"
|
|
||||||
import TagVo from "../vo/TagVo.md"
|
|
||||||
import ContentVo from "../vo/ContentVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md"
|
|
||||||
import PostVo from "../vo/PostVo.md"
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/post.html`
|
|
||||||
- 访问路径:`/archives/:slug`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### post
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#PostVo](#postvo)
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/post.html"
|
|
||||||
<article>
|
|
||||||
<h1 th:text="${post.spec.title}"></h1>
|
|
||||||
<div th:utext="${post.content.content}"> </div>
|
|
||||||
</article>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`post`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
||||||
|
|
||||||
### ContentVo
|
|
||||||
|
|
||||||
<ContentVo />
|
|
||||||
|
|
||||||
### PostVo
|
|
||||||
|
|
||||||
<PostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
- [#ContentVo](#contentvo)
|
|
@ -1,105 +0,0 @@
|
|||||||
---
|
|
||||||
title: 标签归档
|
|
||||||
description: tag.html - /tags/:slug
|
|
||||||
---
|
|
||||||
|
|
||||||
import CategoryVo from "../vo/CategoryVo.md"
|
|
||||||
import TagVo from "../vo/TagVo.md"
|
|
||||||
import Contributor from "../vo/Contributor.md";
|
|
||||||
import ListedPostVo from "../vo/ListedPostVo.md"
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/tag.html`
|
|
||||||
- 访问路径:`/tags/:slug`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### tag
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#TagVo](#tagvo)
|
|
||||||
|
|
||||||
### posts
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
[#UrlContextListResult<ListedPostVo\>](#urlcontextlistresultlistedpostvo)
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/tag.html"
|
|
||||||
<div>
|
|
||||||
<h1 th:text="${tag.spec.displayName}"></h1>
|
|
||||||
<ul>
|
|
||||||
<li th:each="post : ${posts.items}">
|
|
||||||
<a
|
|
||||||
th:text="${post.spec.title}"
|
|
||||||
th:href="${post.status.permalink}"
|
|
||||||
></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div th:if="${posts.hasPrevious() || posts.hasNext()}">
|
|
||||||
<a
|
|
||||||
th:href="@{${posts.prevUrl}}"
|
|
||||||
>
|
|
||||||
<span>上一页</span>
|
|
||||||
</a>
|
|
||||||
<span th:text="${posts.page} +' / '+ ${posts.total}"></span>
|
|
||||||
<a
|
|
||||||
th:href="@{${posts.nextUrl}}"
|
|
||||||
>
|
|
||||||
<span>下一页</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`tag`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### CategoryVo
|
|
||||||
|
|
||||||
<CategoryVo />
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
||||||
|
|
||||||
### Contributor
|
|
||||||
|
|
||||||
<Contributor />
|
|
||||||
|
|
||||||
### ListedPostVo
|
|
||||||
|
|
||||||
<ListedPostVo />
|
|
||||||
|
|
||||||
- [#CategoryVo](#categoryvo)
|
|
||||||
- [#TagVo](#tagvo)
|
|
||||||
- [#Contributor](#contributor)
|
|
||||||
|
|
||||||
### UrlContextListResult<ListedPostVo\>
|
|
||||||
|
|
||||||
```json title="UrlContextListResult<ListedPostVo>"
|
|
||||||
{
|
|
||||||
"page": 0, // 当前页码
|
|
||||||
"size": 0, // 每页条数
|
|
||||||
"total": 0, // 总条数
|
|
||||||
"items": "List<#ListedPostVo>", // 文章列表数据
|
|
||||||
"first": true, // 是否为第一页
|
|
||||||
"last": true, // 是否为最后一页
|
|
||||||
"hasNext": true, // 是否有下一页
|
|
||||||
"hasPrevious": true, // 是否有上一页
|
|
||||||
"totalPages": 0, // 总页数
|
|
||||||
"nextUrl": "string", // 下一页链接
|
|
||||||
"prevUrl": "string" // 上一页链接
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [#ListedPostVo](#listedpostvo)
|
|
@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
title: 文章标签集合
|
|
||||||
description: tags.html - /tags
|
|
||||||
---
|
|
||||||
|
|
||||||
import TagVo from '../vo/TagVo.md'
|
|
||||||
|
|
||||||
## 路由信息
|
|
||||||
|
|
||||||
- 模板路径:`/templates/tags.html`
|
|
||||||
- 访问路径:`/tags`
|
|
||||||
|
|
||||||
## 变量
|
|
||||||
|
|
||||||
### tags
|
|
||||||
|
|
||||||
#### 变量类型
|
|
||||||
|
|
||||||
List<[#TagVo](#tagvo)>
|
|
||||||
|
|
||||||
#### 示例
|
|
||||||
|
|
||||||
```html title="/templates/tags.html"
|
|
||||||
<ul>
|
|
||||||
<li th:each="tag : ${tags}" th:text="${tag.spec.displayName}" th:href="${tag.status.permalink}" />
|
|
||||||
</ul>
|
|
||||||
```
|
|
||||||
|
|
||||||
### _templateId
|
|
||||||
|
|
||||||
#### 变量值
|
|
||||||
|
|
||||||
`tags`
|
|
||||||
|
|
||||||
## 类型定义
|
|
||||||
|
|
||||||
### TagVo
|
|
||||||
|
|
||||||
<TagVo />
|
|
@ -1,31 +0,0 @@
|
|||||||
```json title="CategoryVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T13:06:38.512Z", // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"displayName": "string", // 显示名称
|
|
||||||
"slug": "string", // 别名,通常用于生成 status.permalink
|
|
||||||
"description": "string", // 描述
|
|
||||||
"cover": "string", // 封面图
|
|
||||||
"template": "string", // 自定义渲染模板名称
|
|
||||||
"priority": 0, // 排序字段
|
|
||||||
"children": [ // 下级分类,分类的 metadata.name 集合
|
|
||||||
"string"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
"permalink": "string", // 固定链接
|
|
||||||
"postCount": 0, // 文章数
|
|
||||||
"visiblePostCount": 0 // 已发布文章数
|
|
||||||
},
|
|
||||||
"postCount": 0
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,53 +0,0 @@
|
|||||||
```json title="CommentVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T12:16:19.788Z" // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"raw": "string", // 原始文本,一般用于给编辑器使用
|
|
||||||
"content": "string", // 最终渲染的文本
|
|
||||||
"owner": { // 创建者关联
|
|
||||||
"kind": "string",
|
|
||||||
"name": "string",
|
|
||||||
"displayName": "string",
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"userAgent": "string", // 评论者 UserAgent 信息
|
|
||||||
"ipAddress": "string", // 评论者 IP 地址
|
|
||||||
"priority": 0, // 排序字段
|
|
||||||
"top": false, // 是否置顶
|
|
||||||
"allowNotification": true, // 是否允许通知
|
|
||||||
"approved": false,
|
|
||||||
"hidden": false,
|
|
||||||
"subjectRef": { // 引用关联,比如文章、自定义页面
|
|
||||||
"group": "string",
|
|
||||||
"version": "string",
|
|
||||||
"kind": "string",
|
|
||||||
"name": "string"
|
|
||||||
},
|
|
||||||
"lastReadTime": "2022-11-20T12:16:19.788Z"
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
"lastReplyTime": "2022-11-20T12:16:19.788Z",
|
|
||||||
"replyCount": 0, // 回复数量
|
|
||||||
"unreadReplyCount": 0,
|
|
||||||
"hasNewReply": true // 是否有新回复
|
|
||||||
},
|
|
||||||
"owner": { // 创建者信息
|
|
||||||
"kind": "string",
|
|
||||||
"name": "string",
|
|
||||||
"displayName": "string",
|
|
||||||
"avatar": "string",
|
|
||||||
"email": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,6 +0,0 @@
|
|||||||
```json title="ContentVo"
|
|
||||||
{
|
|
||||||
"raw": "string", // 原始文本,一般用于给编辑器使用
|
|
||||||
"content": "string" // 最终渲染的文本
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,8 +0,0 @@
|
|||||||
```json title="Contributor"
|
|
||||||
{
|
|
||||||
"name": "string", // 用户名
|
|
||||||
"displayName": "string", // 显示名称
|
|
||||||
"avatar": "string", // 头像
|
|
||||||
"bio": "string" // 描述
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,21 +0,0 @@
|
|||||||
```json title="MenuVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T14:44:58.984Z", // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"displayName": "string", // 显示名称
|
|
||||||
"menuItems": [ // 菜单的菜单项名称集合,即 MenuItem 的 metadata.name 的集合
|
|
||||||
"string"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"menuItems": "List<#MenuItemVo>" // 菜单项的集合
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,42 +0,0 @@
|
|||||||
```json title="ReplyVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T12:25:32.357Z" // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"raw": "string", // 原始文本,一般用于给编辑器使用
|
|
||||||
"content": "string", // 最终渲染的文本
|
|
||||||
"owner": { // 创建者关联
|
|
||||||
"kind": "string",
|
|
||||||
"name": "string",
|
|
||||||
"displayName": "string",
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"userAgent": "string", // 评论者 UserAgent 信息
|
|
||||||
"ipAddress": "string", // 评论者 IP 地址
|
|
||||||
"priority": 0, // 排序字段
|
|
||||||
"top": false, // 是否置顶
|
|
||||||
"allowNotification": true, // 是否允许通知
|
|
||||||
"approved": false,
|
|
||||||
"hidden": false,
|
|
||||||
"commentName": "string", // 被回复的评论名称,即 Comment 的 metadata.name
|
|
||||||
"quoteReply": "string" // 被回复的回复名称,即 Reply 的 metadata.name
|
|
||||||
},
|
|
||||||
"owner": { // 创建者信息
|
|
||||||
"kind": "string",
|
|
||||||
"name": "string",
|
|
||||||
"displayName": "string",
|
|
||||||
"avatar": "string",
|
|
||||||
"email": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,26 +0,0 @@
|
|||||||
```json title="TagVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T13:06:38.512Z", // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"displayName": "string", // 显示名称
|
|
||||||
"slug": "string", // 别名,通常用于生成 status.permalink
|
|
||||||
"color": "#F9fEB1", // 背景颜色
|
|
||||||
"cover": "string" // 封面图
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
"permalink": "string", // 固定链接
|
|
||||||
"visiblePostCount": 0, // 已发布文章数
|
|
||||||
"postCount": 0 // 文章数
|
|
||||||
},
|
|
||||||
"postCount": 0
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,36 +0,0 @@
|
|||||||
```json title="ThemeVo"
|
|
||||||
{
|
|
||||||
"metadata": {
|
|
||||||
"name": "string", // 唯一标识
|
|
||||||
"labels": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"annotations": {
|
|
||||||
"additionalProp1": "string"
|
|
||||||
},
|
|
||||||
"creationTimestamp": "2022-11-20T14:44:58.984Z" // 创建时间
|
|
||||||
},
|
|
||||||
"spec": {
|
|
||||||
"displayName": "string", // 显示名称
|
|
||||||
"author": { // 作者相关信息
|
|
||||||
"name": "string", // 作者名称
|
|
||||||
"website": "string" // 作者网站
|
|
||||||
},
|
|
||||||
"description": "string", // 主题描述
|
|
||||||
"logo": "string", // 主题 Logo
|
|
||||||
"website": "string", // 主题网站
|
|
||||||
"repo": "string", // 主题仓库地址
|
|
||||||
"version": "string", // 主题版本
|
|
||||||
"requires": "string", // 主题依赖 Halo 版本的设置
|
|
||||||
"settingName": "string", // 主题设置表单名称
|
|
||||||
"configMapName": "string", // 主题配置名称
|
|
||||||
"customTemplates": {} // 主题自定义模板设置
|
|
||||||
},
|
|
||||||
"config": {} // 主题配置
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
其中:
|
|
||||||
|
|
||||||
1. `customTemplates`:一般不会在模板引擎中使用,使用文档请参考:[模板路由#自定义模板](../template-route-mapping.md#custom-templates)
|
|
||||||
2. `config`:主题配置,使用文档请参考:[设置选项](../settings.md)
|
|
@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
title: 资源下载
|
|
||||||
description: 目前所有与 Halo 相关的下载地址
|
|
||||||
---
|
|
||||||
|
|
||||||
## GitHub
|
|
||||||
|
|
||||||
:::note
|
|
||||||
如果您的服务器在海外,推荐从 GitHub 下载。
|
|
||||||
:::
|
|
||||||
|
|
||||||
- [运行包](https://github.com/halo-dev/halo/releases)
|
|
||||||
- [配置文件](https://github.com/halo-dev/halo-common)
|
|
||||||
|
|
||||||
## 官方镜像源
|
|
||||||
|
|
||||||
- [https://download.halo.run](https://download.halo.run)
|
|
||||||
|
|
||||||
此镜像源由 [Nova Kwok](https://nova.moe/) 提供并维护。
|
|
||||||
|
|
||||||
## 三方镜像源
|
|
||||||
|
|
||||||
- [https://halo.cary.tech](https://halo.cary.tech)
|
|
||||||
|
|
||||||
此镜像源由 [新逸Cary](https://blog.xinac.cn) 提供并维护。
|
|
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
title: 第一篇文章
|
|
||||||
description: 安装完成后,如何写下第一篇文章。
|
|
||||||
---
|
|
||||||
|
|
||||||
![第一篇文章](/img/first-post.gif)
|
|
||||||
|
|
||||||
## 登录管理端
|
|
||||||
|
|
||||||
浏览器访问 `$HALO_EXTERNAL_URL/console/`(外部访问链接)即可进入 Halo 管理端。默认的管理员用户名为 `admin`,登录密码为安装时设置的 `HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD`,文档中的默认值为 `P@88w0rd`。
|
|
||||||
|
|
||||||
:::info
|
|
||||||
如果你在安装时没有设置 `HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD` 变量或忘记了设置的密码,可以参考[常见问题中的忘记密码章节](../user-guide/faq.md#忘记密码怎么办)进行处理。
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 新建文章
|
|
||||||
|
|
||||||
Halo 安装完成后,默认初始化了一篇 `Hello Halo` 文章,接下来我们将创建并发布一篇自己的文章。
|
|
||||||
|
|
||||||
在 Halo 管理端,点击仪表盘页面中的 `创建文章` 快捷入口,即可进入到文章编辑页面。
|
|
||||||
|
|
||||||
在文章编辑器中,你可以尽情写下你想展现的内容。
|
|
||||||
|
|
||||||
当内容编辑完成后,点击右上角的 `发布` 按钮,给文章设置一个合适的标题和别名,同时可以设置文章所属分类、标签及其他一些高级设置。
|
|
||||||
|
|
||||||
确认无误后,点击弹框下方的 `发布` 按钮,我们的第一篇文章就成功发布了。
|
|
||||||
|
|
||||||
:::info
|
|
||||||
关于文章相关其他功能及文章各种设置项的说明,请参考《[用户指南-文章](../user-guide/posts.md)》章节
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 查看文章
|
|
||||||
|
|
||||||
文章发布成功后,就可以在主题端查看到我们刚刚创建的文章了。
|
|
||||||
|
|
||||||
浏览器访问 `$HALO_EXTERNAL_URL` 进入站点首页,站点展示的内容及样式由当前启用的主题所决定。
|
|
||||||
|
|
||||||
接下来,选一款喜欢的主题,尽情体验 Halo 吧!
|
|
@ -1,17 +0,0 @@
|
|||||||
| 变量名 | 描述 |
|
|
||||||
| ---------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
||||||
| `SPRING_R2DBC_URL` | 数据库连接地址,详细可查阅下方的 `数据库配置` |
|
|
||||||
| `SPRING_R2DBC_USERNAME` | 数据库用户名 |
|
|
||||||
| `SPRING_R2DBC_PASSWORD` | 数据库密码 |
|
|
||||||
| `SPRING_SQL_INIT_PLATFORM` | 数据库平台名称,支持 `postgresql`、`mysql`、`h2`,需要与 `SPRING_R2DBC_URL` 对应 |
|
|
||||||
| `HALO_EXTERNAL_URL` | 外部访问链接,如果需要在公网访问,需要配置为实际访问地址 |
|
|
||||||
| `HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME` | 初始超级管理员用户名 |
|
|
||||||
| `HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD` | 初始超级管理员密码 |
|
|
||||||
|
|
||||||
数据库配置:
|
|
||||||
|
|
||||||
| 链接方式 | 链接地址格式 | `SPRING_SQL_INIT_PLATFORM` |
|
|
||||||
| ----------- | ---------------------------------------------------------------------------------- | -------------------------- |
|
|
||||||
| PostgreSQL | `r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE}` | postgresql |
|
|
||||||
| MySQL | `r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE}` | mysql |
|
|
||||||
| H2 Database | `r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE` | h2 |
|
|
@ -1,41 +0,0 @@
|
|||||||
---
|
|
||||||
title: 页面
|
|
||||||
description: 页面管理相关功能说明
|
|
||||||
---
|
|
||||||
|
|
||||||
Halo 中存在两种类型的页面,`功能页面` 和 `自定义页面`。
|
|
||||||
|
|
||||||
### 功能页面
|
|
||||||
|
|
||||||
功能页面通常由各个插件提供,页面功能及在控制台呈现的内容由具体提供该页面的插件决定。
|
|
||||||
|
|
||||||
例如[链接插件](https://github.com/halo-sigs/plugin-links)便实现了一个站点链接管理功能,用户可以通过该插件更加方便地管理与站点相关的友情链接。安装该插件后,在功能页面会出现列表会出现如下条目。
|
|
||||||
|
|
||||||
![链接功能页面](/img/user-guide/pages/page-links.png)
|
|
||||||
|
|
||||||
点击这个条目即可进入到链接插件提供的配置管理页面。
|
|
||||||
|
|
||||||
![链接功能页面](/img/user-guide/pages/page-links-edit.png)
|
|
||||||
|
|
||||||
你可以在这个页面中管理链接分组和链接条目。链接信息维护完成后,通过 `$HALO_EXTERNAL_URL/links/` 便可访问到对应的页面。
|
|
||||||
|
|
||||||
:::info
|
|
||||||
对于 `links` 页面的访问需要主题端支持,即安装使用的主题需要有对应的 `links.html` 模板,且在模板中正确处理链接插件提供的数据。
|
|
||||||
:::
|
|
||||||
|
|
||||||
### 自定义页面
|
|
||||||
|
|
||||||
自定义页面与文章类似,同样包含页面标题和富文本形式的页面内容。与文章不同的是自定义页面无法设置所属分类和标签信息,一般用于站点中单一展示功能的页面,例如常见的站点关于页面、联系我们页面等。
|
|
||||||
|
|
||||||
自定义页面的访问链接为 `$HALO_EXTERNAL_URL/{slug}/` 其中 `slug` 为自定义页面的别名。
|
|
||||||
|
|
||||||
对于如下的关于页面,便可以通过 `$HALO_EXTERNAL_URL/page/` 地址进行访问。
|
|
||||||
![链接功能页面](/img/user-guide/pages/page-about.png)
|
|
||||||
|
|
||||||
:::info
|
|
||||||
自定义页面默认使用主题端的 `page.html` 模板进行渲染,如果主题中提供了针对自定义页面的其他模板,用户可以通过修改自定义页面高级设置中的自定义模板设置进行使用。
|
|
||||||
:::
|
|
||||||
|
|
||||||
#### 自定义页面操作
|
|
||||||
|
|
||||||
对于自定义页面的新建、设置、发布及删除等操作,与文章操作基本一致,具体操作请参考[《用户指南-文章》](./posts.md)章节,此处不再赘述。
|
|
@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
title: 插件
|
|
||||||
description: 插件管理相关功能说明
|
|
||||||
---
|
|
||||||
|
|
||||||
插件是用于扩展 Halo 功能的软件包。插件独立于 Halo 核心应用,可以单独安装、升级、卸载。
|
|
||||||
|
|
||||||
:::info
|
|
||||||
当前 Halo 支持的插件可在[Awesome Halo](https://github.com/halo-sigs/awesome-halo)仓库查看。
|
|
||||||
:::
|
|
||||||
|
|
||||||
本文档仅对插件的基本管理功能进行说明,关于插件的详细使用说明请参考对应插件的文档。
|
|
||||||
|
|
||||||
## 安装插件
|
|
||||||
|
|
||||||
点击插件页面右上角的 `安装` 按钮,在弹出的文件上传对话框中上传插件文件即可完成插件安装。
|
|
||||||
|
|
||||||
![安装插件](/img/user-guide/plugins/plugin-install.png)
|
|
||||||
|
|
||||||
插件安装成功后,便会出现在已安装主题列表中。你可以点击某个插件进入到插件详情页面。
|
|
||||||
|
|
||||||
## 插件设置
|
|
||||||
|
|
||||||
点击插件列表中的某个插件进入插件详情页面。与主题设置类似,插件详情页面默认显示出了当前插件的详细信息,在详细信息标签页后方的标签页,即为插件提供的相关设置。不同的插件提供的设置项各不相同,设置项的详细说明请参考对应插件的文档。
|
|
||||||
|
|
||||||
![插件设置](/img/user-guide/plugins/plugin-setting.png)
|
|
||||||
|
|
||||||
以 Unsplash 插件为例,该提供仅在基本设置组中提供了 `Access Key` 一项配置,用于调用 Unsplash 接口。
|
|
||||||
|
|
||||||
## 启用/禁用插件
|
|
||||||
|
|
||||||
点击插件列表或插件详情页中的启用/禁用开关,即可切换插件的启用禁用状态。
|
|
||||||
|
|
||||||
![插件启用/禁用](/img/user-guide/plugins/plugin-switch.png)
|
|
||||||
|
|
||||||
## 升级插件
|
|
||||||
|
|
||||||
点击插件列表指定插件所在行后方的 `···` 更多操作按钮,选择其中的 `升级` 选项即可上传新的插件文件对当前插件进行升级。
|
|
||||||
|
|
||||||
## 卸载插件
|
|
||||||
|
|
||||||
点击插件列表指定插件所在行后方的 `···` 更多操作按钮,选择其中的 `卸载` 或 `卸载并删除配置` 选项即可对当前插件进行卸载。
|
|
||||||
![卸载插件](/img/user-guide/plugins/plugin-uninstall.png)
|
|
||||||
|
|
||||||
:::info
|
|
||||||
仅卸载插件时插件的配置信息会进行保留,当重新安装插件后还可以使用之前已保存的配置。
|
|
||||||
:::
|
|
@ -1,68 +0,0 @@
|
|||||||
---
|
|
||||||
title: 主题
|
|
||||||
description: 主题管理相关功能说明
|
|
||||||
---
|
|
||||||
|
|
||||||
主题包含了各种站点页面模板的资源包。用户访问 Halo 站点浏览到的内容及样式,由 Halo 管理端所配置使用的主题所决定。
|
|
||||||
:::info
|
|
||||||
当前 Halo 支持的主题可在[Awesome Halo](https://github.com/halo-sigs/awesome-halo)仓库查看。
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 安装主题
|
|
||||||
|
|
||||||
点击主题页面右上方的 `切换主题` 按钮即可弹出主题管理对话框。
|
|
||||||
|
|
||||||
目前 Halo 提供了两种主题安装方式:
|
|
||||||
|
|
||||||
1. 通过控制台上传安装
|
|
||||||
2. 将主题文件夹拷贝到服务器上的 `{Halo 工作目录}/themes/` 目录下等待 Halo 自动扫描
|
|
||||||
|
|
||||||
针对第一种安装方式,你可以点击主题管理对话框下方的 `安装主题` 按钮,在弹出的文件上传对话框中上传主题压缩包。
|
|
||||||
|
|
||||||
![安装主题](/img/user-guide/themes/theme-install.png)
|
|
||||||
|
|
||||||
主题安装成功后,便会出现在已安装主题列表中。
|
|
||||||
|
|
||||||
针对第二种方式,你需要手动将解压后的主题文件夹拷贝到服务器上的指定目录下,如果主题校验通过,你便可以在主题列表的 `未安装` 标签页中看到该主题。
|
|
||||||
|
|
||||||
之后点击主题所在行后方的 `安装` 按钮,即可完成该主题的安装。
|
|
||||||
|
|
||||||
![后台安装主题](/img/user-guide/themes/theme-install-alt.png)
|
|
||||||
|
|
||||||
## 切换主题
|
|
||||||
|
|
||||||
同样点击主题页面右上方的 `切换主题` 按钮弹出主题管理对话框。
|
|
||||||
|
|
||||||
在弹框中点击选中要切换的目标主题,此时页面返回到主题详情页,点击右上角的 `启用` 按钮即可将当前主题切换为实际使用的主题。
|
|
||||||
:::info
|
|
||||||
仅切换主题不点击右上角的 `启用` 按钮时,不会影响当前实际使用的主题。
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 修改主题设置
|
|
||||||
|
|
||||||
主题页面默认显示出了当前主题的详细信息,在详细信息标签页后方的标签页,即为主题提供的相关设置。不同的主题提供的设置项各不相同,设置项的详细说明请参考对应主题的文档。
|
|
||||||
|
|
||||||
![主题设置](/img/user-guide/themes/theme-setting.png)
|
|
||||||
|
|
||||||
以 Halo 的默认主题 Earth 为例,该主题提供了布局、样式、侧边栏、页脚及备案设置共五组配置项。
|
|
||||||
|
|
||||||
## 预览主题
|
|
||||||
|
|
||||||
通过预览功能,你可以在不更改当前启用主题的情况下查看不同主题的效果。点击主题详情页面右上角的 `预览` 按钮预览当前主题,或者进入已安装主题列表,通过后方 `···` 的更多操作中的预览选项预览指定的主题。
|
|
||||||
|
|
||||||
![主题设置](/img/user-guide/themes/theme-preview.png)
|
|
||||||
|
|
||||||
在主题预览页面你可以切换不同分辨率的设备,模拟主题在不同终端下的显示效果。也可以通过右上角的功能菜单切换预览的主题,或者调整当前主题的设置,查看不同设置下主题所展现的区别。
|
|
||||||
|
|
||||||
## 更新主题
|
|
||||||
|
|
||||||
点击主题详情页右上角的 `···` 更多操作按钮,选择其中的 `更新` 选项即可上传新的主题包对当前主题进行更新。
|
|
||||||
|
|
||||||
## 重载主题配置
|
|
||||||
|
|
||||||
如果当前主题提供的设置象发生变化,可以通过 `···` 更多中的 `重载主题配置` 选项对主体配置项进行更新。
|
|
||||||
|
|
||||||
## 卸载主题
|
|
||||||
|
|
||||||
进入已安装主题列表,通过后方 `···` 的更多操作中的卸载选项即可卸载指定的主题。
|
|
||||||
![卸载主题](/img/user-guide/themes/theme-uninstall.png)
|
|