Merge remote-tracking branch 'roozen/main'

This commit is contained in:
roozen 2023-07-21 09:43:54 +08:00
commit 1f14be09dc
22 changed files with 361 additions and 319 deletions

View File

@ -1,6 +1,6 @@
{
"name": "halo-theme-hao",
"version": "1.1.6",
"version": "1.2.0",
"dependencies": {
}
}

View File

@ -107,6 +107,7 @@ spec:
bikan:
remen:
shiyong:
techStack:
children:
- $formkit: select
name: bannersBackground
@ -117,7 +118,22 @@ spec:
value: default
- label: 个人技术栈
value: techStack
help: 自定义技术栈需要在【个人】中配置
- $formkit: repeater
name: techStack
label: 个人技术栈
value: [ ]
children:
- $formkit: text
name: name
label: 名称
placeholder: 请输入名称
- $formkit: attachment
name: url
label: 路径
placeholder: 请输入图标路径
- $formkit: color
name: background
label: 背景色
- $formkit: textarea
name: bannersTitleBig
label: 大标题
@ -839,26 +855,29 @@ spec:
- $formkit: repeater
name: bdageitem
label: 徽标配置项
value: []
value:
- link: "https://halo.run/"
shields: "https://npm.elemecdn.com/hao-theme-static@1.2.0/templates/images/Frame-Halo-blue.svg"
message: "博客框架为halo2.x"
children:
- $formkit: url
name: link
label: 链接
placeholder: 请输入内容
value: "https://hexo.io/"
value: "https://halo.run/"
validation: required
- $formkit: attachment
name: shields
label: 徽标
placeholder: 请输入内容
validation: required
value: "https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Frame-Hexo.svg"
value: "https://npm.elemecdn.com/hao-theme-static@1.2.0/templates/images/Frame-Halo-blue.svg"
- $formkit: text
name: message
label: 徽标 title
placeholder: 请输入内容
validation: required
value: "博客框架为Hexo_v5.4.0"
value: "博客框架为halo2.x"
- group: post
@ -1080,6 +1099,15 @@ spec:
value: "https://moments.0206.ink/randomfriend"
label: 随机访问地址
help: 注意格式 (你的鱼塘token地址 + randomfriend)
- $formkit: url
name: fcircleUrl
value: "/fcircle"
label: 鱼塘链接
- $formkit: url
name: linksUrl
value: "/links"
label: 友链链接
- group: fcircle
label: 友链鱼塘
@ -1088,7 +1116,7 @@ spec:
name: backgroundImg
validation: url
label: 图片
value: https://img.cdn.yzczi.com/img/64624940e3623.jpeg
value: https://npm.elemecdn.com/hao-theme-static@1.2.0/templates/images/64624940e3623.jpeg
placeholder: 请输入图片地址
- $formkit: text
name: smallTitle
@ -1179,23 +1207,6 @@ spec:
name: helloAbout
label: 我的问候
value: Hello there!
- $formkit: repeater
name: techStack
label: 个人技术栈
value: [ ]
children:
- $formkit: text
name: name
label: 名称
placeholder: 请输入名称
- $formkit: url
name: url
label: 路径
placeholder: 请输入图标路径
validation: url
- $formkit: color
name: background
label: 背景色
- $formkit: group
name: authorCareers
label: 职业生涯
@ -1294,6 +1305,7 @@ spec:
game_title:
game_uid:
game_bg:
loading_bar:
children:
- $formkit: text
name: game_tips
@ -1315,6 +1327,11 @@ spec:
label: 爱好游戏背景
placeholder: 请输入内容
value: https://img.zhheo.com/i/2022/08/31/630efa7ae39fe.webp
- $formkit: attachment
name: loading_bar
label: 爱好游戏logo
placeholder: 请输入内容
value: https://npm.elemecdn.com/hao-theme-static@1.2.0/templates/images/64795eaece0fc.png
- $formkit: group
name: game2
label: 爱好游戏 2
@ -1544,11 +1561,12 @@ spec:
- group: envelope_comment
label: 留言板
formSchema:
- $formkit: text
- $formkit: textarea
name: title
label: 标题
placeholder: 请输入内容
value: 留言板
value: <div align="center">留言板</div>
help: 支持 HTML 语法
- $formkit: group
name: custom_pic
label: 信笺图片
@ -1744,25 +1762,21 @@ spec:
value: false
- $formkit: text
name: id
if: $get(nav_musicEnable).value
label: 音乐的id
help: 歌单的id可以从音乐歌单分享的链接中获取
value: "8668419170"
- $formkit: text
name: server
if: $get(nav_musicEnable).value
label: 服务
help: 歌单的服务商例如netease网易云音乐,tencent腾讯,kugou酷狗,xiami小米音乐,baidu百度音乐
value: "tencent"
- $formkit: url
name: all_playlist
if: $get(nav_musicEnable).value
label: 播放列表地址
help: 用于右键查看所有歌曲
value: https://y.qq.com/n/ryqq/playlist/8668419170
- $formkit: url
name: meting_api
if: $get(nav_musicEnable).value
label: 音乐图片api
value: https://api.i-meto.com/meting/api?server=:server&type=:type&id=:id&r=:r
- $formkit: group

File diff suppressed because one or more lines are too long

View File

@ -17030,19 +17030,6 @@ span.hexo-douban-pagenum {
overflow: hidden;
}
.loading-bar::after {
content: "";
position: absolute;
top: 500px;
left: 0;
filter: drop-shadow(0 -500px 0 #ece5d8);
width: 500px;
height: 62.5px;
background: url("https://img.cdn.yzczi.com/img/64795eaece0fc.png") no-repeat left 100%;
background-size: 500px 62.5px;
background-position-x: 0;
}
.author-content-item.game-lol:hover .loading-bar::after {
animation: loading-bar 3.5s cubic-bezier(0.28, 0.11, 0.32, 1) infinite forwards;
}

View File

@ -12,7 +12,9 @@
</header>
<main class="layout hide-aside" id="content-inner">
<div id="page">
<h1 >[[${theme.config.envelope_comment.title}]]</h1>
<th:block th:if="${not #strings.isEmpty(theme.config.envelope_comment.title)}"
th:utext="${theme.config.envelope_comment.title}">
</th:block>
<div id="article-container">
<style>
@media screen and (max-width:600px) {
@ -136,23 +138,11 @@
</div>
</div>
<hr>
<!-- 评论模块 -->
<!--/* 评论组件 */-->
<th:block
th:if="${theme.config.comments.twikooEnable && #strings.equals(theme.config.comments.use, 'Twikoo') && not #strings.isEmpty(theme.config.comments.twikoos.envId)}">
<div th:replace="~{modules/twikoo :: twikoo}"></div>
</th:block>
<div id="post-comment"
th:if="${pluginFinder.available('PluginCommentWidget') && #strings.equals(theme.config.comments.use, 'commentWidget')}">
<div class="comment-head">
<div class="comment-headline"><i class="iconfont icon-comment-alt"></i> <span>评论</span></div>
<div class="comment-privacy"><a href="/privacy">隐私政策</a></div>
<div class="comment-tips" id="comment-tips">
<span>你无需删除空行,直接评论以获取最佳展示效果</span>
</div>
</div>
<halo:comment group="content.halo.run" kind="SinglePage"
th:attr="name=${singlePage.metadata.name}" colorScheme="document.documentElement.getAttribute('data-theme')" />
</div>
th:replace="~{modules/comment :: comment(group = 'content.halo.run',
kind = 'SinglePage',
name = ${singlePage.metadata.name})}"/>
</div>

View File

@ -36,7 +36,9 @@
href="javascript:fetchRandomPost();"><i
class="haofont hao-icon-arrow-rotate-right"></i></a>
</div>
<div class="title-h2-a-right"><a class="random-post-all" href="/links">全部友链</a></div>
<div th:if="${not #strings.isEmpty(theme.config.link.linksUrl)}" class="title-h2-a-right">
<a class="random-post-all" th:href="${theme.config.link.linksUrl}">全部友链</a>
</div>
</div>
<div id="random-post"></div>
<script type="text/javascript">

View File

@ -11,165 +11,14 @@
</header>
<main class="layout hide-aside" id="content-inner">
<div id="page">
<div class="flink" id="banners">
<div class="banners-title">
<div class="banners-title-small">[[${theme.config.link.smallTitle}]]</div>
<div class="banners-title-big">[[${theme.config.link.bigTitle}]]</div>
</div>
<div class="banner-button-group">
<a class="banner-button secondary" data-pjax-state="" onclick="travelling()">
<i class="haofont hao-icon-paper-plane1"></i>
<span class="banner-button-text">随机访问</span>
</a>
<a class="banner-button" href="#post-comment" rel="external nofollow">
<i class="iconfont icon-link"></i>
<span class="banner-button-text">申请友链</span>
</a>
</div>
<div class="tags-group-all nowrapMove">
<div class="tags-group-wrapper">
<th:block th:each="group : ${groups}">
<th:block th:each="link,iterStat : ${group.links}" th:if="${group.links.size > 2}">
<div class="tags-group-icon-pair" th:if="${iterStat.even}">
<a class="tags-group-icon" target="_blank"
th:href="${linkOdd.spec.url}"
th:title="${linkOdd.spec.displayName}"
th:with="linkOdd = ${group.links.get(iterStat.index - 1)}">
<img th:src="@{${linkOdd.spec.logo}}"
th:title="${linkOdd.spec.displayName}">
</a>
<a class="tags-group-icon" target="_blank"
th:href="${linkEven.spec.url}"
th:title="${linkEven.spec.displayName}"
th:with="linkEven = ${link}">
<img th:src="@{${linkEven.spec.logo}}"
th:title="${linkEven.spec.displayName}">
</a>
</div>
</th:block>
</th:block>
</div>
</div>
</div>
<!--钓鱼-->
<th:block th:if="${not #lists.isEmpty(groups) && theme.config.fcircle.linksRandomFriendsEnable}" >
<div class="title-h2-a">
<div class="title-h2-a-left">
<h2 style="padding-top:0;margin:.6rem 0 .6rem">🎣 钓鱼</h2><a class="random-post-start"
href="javascript:fetchRandomPost();"><i class="haofont hao-icon-arrow-rotate-right"></i></a>
</div>
<div class="title-h2-a-right"><a class="random-post-all" href="/fcircle" data-pjax-state="">查看鱼塘</a></div>
</div>
<div id="random-post"></div>
<script type="text/javascript">
var fdataUser = {
apiurl: [[${theme.config.fcircle.apiurl}]],
defaultFish: 500,
hungryFish: 500,
}
</script>
<script th:src="${assets_link + '/libs/moments/random-friends-post.js'}"></script>
</th:block>
<div class="flink" id="article-container">
<th:block th:each="group,iterStat : ${groups}">
<h2 th:if="${not #lists.isEmpty(group.spec.displayName)}">
<a class="headerlink" th:href="'#'+${group.spec.displayName}+'-'+${group.links.size}" th:title="${group.spec.displayName}+ '('+${group.links.size}+')'"></a>
[[${group.spec.displayName}]] ([[${group.links.size}]])
</h2>
<div class="flink-desc">[[${group.spec.description}]]</div>
<!-- 第一个,使用卡片展示 -->
<div th:if="${#strings.equals(group.spec.displayStyle,'beautify') && not #lists.isEmpty(group.spec.displayStyle)}" class="site-card-group" >
<div class="site-card" th:each="link : ${group.links}">
<span th:if="${not #lists.isEmpty(link.spec.label)}" th:style="'background-color:' + ${link.spec.labelColor}" class="site-card-tag">[[${link.spec.label}]]</span>
<a class="img" target="_blank" th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<img class="flink-avatar" style="pointer-events: none;"
th:alt="${link.spec.displayName}" th:src="@{${#strings.isEmpty(link.spec.siteshot) ? link.spec.logo : link.spec.siteshot}}">
</a>
<a class="info cf-friends-link" target="_blank" th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<div class="site-card-avatar">
<img class="flink-avatar cf-friends-avatar"
th:alt="${link.spec.displayName}" th:src="${link.spec.logo}">
</div>
<div class="site-card-text">
<span class="title cf-friends-name" th:text="${link.spec.displayName}"></span>
<span class="desc" th:text="${link.spec.description}"
th:title="${link.spec.description}"></span>
</div>
</a>
</div>
</div>
<div class="flink-list" th:if="${#strings.equals(group.spec.displayStyle,'default') && not #lists.isEmpty(group.spec.displayStyle)}">
<div class="flink-list-item" th:each="link : ${group.links}">
<span th:if="${not #lists.isEmpty(link.spec.label)}" th:style="'background-color:' + ${link.spec.labelColor}" class="site-card-tag">[[${link.spec.label}]]</span>
<a class="cf-friends-link" rel="external nofollow"
target="_blank"
th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<img class="flink-avatar cf-friends-avatar"
th:alt="${link.spec.displayName}"
th:src="${link.spec.logo}">
<div class="flink-item-info">
<span class="flink-item-name cf-friends-name"
th:text="${link.spec.displayName}"></span>
<span class="flink-item-desc" th:text="${link.spec.description}"
th:title="${link.spec.description}"></span>
<img th:src="${link.spec.logo}"
class="entered loaded">
</div>
</a>
</div>
</div>
<div class="flink-list mini" th:if="${#strings.equals(group.spec.displayStyle,'deprecated') && not #lists.isEmpty(group.spec.displayStyle)}">
<div class="flink-list-item" th:each="link : ${group.links}">
<a class="cf-friends-link" rel="external nofollow"
target="_blank"
th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<img class="flink-avatar cf-friends-avatar entered loaded"
th:src="${link.spec.logo}"
th:alt="${link.spec.displayName}">
<div class="img-alt is-center">[[${link.spec.displayName}]]</div>
<div class="flink-item-info">
<span class="flink-item-name cf-friends-name">[[${link.spec.displayName}]]</span>
<span class="flink-item-desc" th:title="${link.spec.description}">[[${link.spec.description}]]</span>
</div>
</a>
</div>
</div>
</th:block>
</div>
<th:block th:replace="~{macro/content-links :: content-links(${htmlType})}" />
<hr/>
<!-- 评论模块 -->
<th:block th:if="${theme.config.comments.twikooEnable && #strings.equals(theme.config.comments.use, 'Twikoo') && not #strings.isEmpty(theme.config.comments.twikoos.envId)}">
<div th:replace="~{modules/twikoo :: twikoo}"></div>
</th:block>
<div id="post-comment" th:if="${pluginFinder.available('PluginCommentWidget') && #strings.equals(theme.config.comments.use, 'commentWidget')}">
<div class="comment-head">
<div class="comment-headline"><i class="iconfont icon-comment-alt"></i> <span>评论</span></div>
<div class="comment-privacy"><a href="/privacy">隐私政策</a></div>
<div class="comment-tips" id="comment-tips">
<span>你无需删除空行,直接评论以获取最佳展示效果</span>
</div>
</div>
<halo:comment group="content.halo.run" kind="SinglePage" th:attr="name='links'" colorScheme="document.documentElement.getAttribute('data-theme')" />
</div>
<!--/* 评论组件 */-->
<th:block
th:replace="~{modules/comment :: comment(group = 'content.halo.run',
kind = 'SinglePage',
name = 'links')}"/>
</div>
</main>

View File

@ -0,0 +1,151 @@
<th:block th:fragment="content-links(htmlType)">
<th:block th:with="groups = ${linkFinder.groupBy()}">
<div class="flink" id="banners">
<div class="banners-title">
<div class="banners-title-small">[[${theme.config.link.smallTitle}]]</div>
<div class="banners-title-big">[[${theme.config.link.bigTitle}]]</div>
</div>
<div class="banner-button-group">
<a class="banner-button secondary" data-pjax-state="" onclick="travelling()">
<i class="haofont hao-icon-paper-plane1"></i>
<span class="banner-button-text">随机访问</span>
</a>
<a class="banner-button" href="#post-comment" rel="external nofollow">
<i class="iconfont icon-link"></i>
<span class="banner-button-text">申请友链</span>
</a>
</div>
<div class="tags-group-all nowrapMove">
<div class="tags-group-wrapper">
<th:block th:each="group : ${groups}">
<th:block th:each="link,iterStat : ${group.links}" th:if="${group.links.size > 2}">
<div class="tags-group-icon-pair" th:if="${iterStat.even}">
<a class="tags-group-icon" target="_blank" th:href="${linkOdd.spec.url}"
th:title="${linkOdd.spec.displayName}"
th:with="linkOdd = ${group.links.get(iterStat.index - 1)}">
<img th:src="@{${linkOdd.spec.logo}}" th:title="${linkOdd.spec.displayName}">
</a>
<a class="tags-group-icon" target="_blank" th:href="${linkEven.spec.url}"
th:title="${linkEven.spec.displayName}" th:with="linkEven = ${link}">
<img th:src="@{${linkEven.spec.logo}}" th:title="${linkEven.spec.displayName}">
</a>
</div>
</th:block>
</th:block>
</div>
</div>
</div>
<!--钓鱼-->
<th:block th:if="${not #lists.isEmpty(groups) && theme.config.fcircle.linksRandomFriendsEnable}">
<div class="title-h2-a">
<div class="title-h2-a-left">
<h2 style="padding-top:0;margin:.6rem 0 .6rem">🎣 钓鱼</h2>
<a class="random-post-start" href="javascript:fetchRandomPost();">
<i class="haofont hao-icon-arrow-rotate-right"></i>
</a>
</div>
<div th:if="${not #strings.isEmpty(theme.config.link.fcircleUrl)}" class="title-h2-a-right">
<a class="random-post-all" th:href="${theme.config.link.fcircleUrl}" data-pjax-state="">查看鱼塘</a>
</div>
</div>
<div id="random-post"></div>
<script type="text/javascript">
var fdataUser = {
apiurl: [[${ theme.config.fcircle.apiurl }]],
defaultFish: 500,
hungryFish: 500,
}
</script>
<script th:src="${assets_link + '/libs/moments/random-friends-post.js'}"></script>
</th:block>
<div class="flink" id="article-container">
<th:block th:each="group,iterStat : ${groups}">
<h2 th:if="${not #lists.isEmpty(group.spec.displayName)}">
<a class="headerlink" th:href="'#'+${group.spec.displayName}+'-'+${group.links.size}"
th:title="${group.spec.displayName}+ '('+${group.links.size}+')'"></a>
[[${group.spec.displayName}]] ([[${group.links.size}]])
</h2>
<div class="flink-desc">[[${group.spec.description}]]</div>
<!-- 第一个,使用卡片展示 -->
<div th:if="${#strings.equals(group.spec.displayStyle,'beautify') && not #lists.isEmpty(group.spec.displayStyle)}"
class="site-card-group">
<div class="site-card" th:each="link : ${group.links}">
<span th:if="${not #lists.isEmpty(link.spec.label)}"
th:style="'background-color:' + ${link.spec.labelColor}"
class="site-card-tag">[[${link.spec.label}]]</span>
<a class="img" target="_blank" th:href="${link.spec.url}" th:title="${link.spec.displayName}">
<img class="flink-avatar" style="pointer-events: none;" th:alt="${link.spec.displayName}"
th:src="@{${#strings.isEmpty(link.spec.siteshot) ? link.spec.logo : link.spec.siteshot}}">
</a>
<a class="info cf-friends-link" target="_blank" th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<div class="site-card-avatar">
<img class="flink-avatar cf-friends-avatar" th:alt="${link.spec.displayName}"
th:src="${link.spec.logo}">
</div>
<div class="site-card-text">
<span class="title cf-friends-name" th:text="${link.spec.displayName}"></span>
<span class="desc" th:text="${link.spec.description}"
th:title="${link.spec.description}"></span>
</div>
</a>
</div>
</div>
<div class="flink-list"
th:if="${#strings.equals(group.spec.displayStyle,'default') && not #lists.isEmpty(group.spec.displayStyle)}">
<div class="flink-list-item" th:each="link : ${group.links}">
<span th:if="${not #lists.isEmpty(link.spec.label)}"
th:style="'background-color:' + ${link.spec.labelColor}"
class="site-card-tag">[[${link.spec.label}]]</span>
<a class="cf-friends-link" rel="external nofollow" target="_blank" th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<img class="flink-avatar cf-friends-avatar" th:alt="${link.spec.displayName}"
th:src="${link.spec.logo}">
<div class="flink-item-info">
<span class="flink-item-name cf-friends-name" th:text="${link.spec.displayName}"></span>
<span class="flink-item-desc" th:text="${link.spec.description}"
th:title="${link.spec.description}"></span>
<img th:src="${link.spec.logo}" class="entered loaded">
</div>
</a>
</div>
</div>
<div class="flink-list mini"
th:if="${#strings.equals(group.spec.displayStyle,'deprecated') && not #lists.isEmpty(group.spec.displayStyle)}">
<div class="flink-list-item" th:each="link : ${group.links}">
<a class="cf-friends-link" rel="external nofollow" target="_blank" th:href="${link.spec.url}"
th:title="${link.spec.displayName}">
<img class="flink-avatar cf-friends-avatar entered loaded" th:src="${link.spec.logo}"
th:alt="${link.spec.displayName}">
<div class="img-alt is-center">[[${link.spec.displayName}]]</div>
<div class="flink-item-info">
<span class="flink-item-name cf-friends-name">[[${link.spec.displayName}]]</span>
<span class="flink-item-desc"
th:title="${link.spec.description}">[[${link.spec.description}]]</span>
</div>
</a>
</div>
</div>
</th:block>
<th:block th:if="${htmlType == 'page'}" th:utext="${singlePage.content.content}">
</th:block>
</div>
</th:block>
</th:block>

View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="comment(group, kind, name)">
<th:block
th:if="${theme.config.comments.twikooEnable && #strings.equals(theme.config.comments.use, 'Twikoo') && not #strings.isEmpty(theme.config.comments.twikoos.envId)}">
<div th:replace="~{modules/twikoo :: twikoo}"></div>
</th:block>
<!-- 已知问题 PJAX 下comment 首次请求会出错。当前的临时解决办法是使用 js 重试 -->
<div id="post-comment"
th:if="${pluginFinder.available('PluginCommentWidget') && #strings.equals(theme.config.comments.use, 'commentWidget')}">
<div class="comment-head">
<div class="comment-headline"><i class="iconfont icon-comment-alt"></i> <span>评论</span></div>
<div class="comment-privacy"><a href="/privacy">隐私政策</a></div>
<div class="comment-tips" id="comment-tips">
<span>你无需删除空行,直接评论以获取最佳展示效果</span>
</div>
</div>
<halo:comment th:attr="name=${name},kind=${kind},group=${group}" colorScheme="document.documentElement.getAttribute('data-theme')"/>
</div>
</th:block>
</html>

View File

@ -30,7 +30,9 @@
<h3 class="footer-title" th:text="${menuItem.status.displayName}"></h3>
<div class="footer-links">
<a class="footer-item" th:each="childMenu : ${menuItem.children}"
th:href="@{${childMenu.status.href}}" th:text="${childMenu.status.displayName}">
th:href="@{${childMenu.status.href}}"
th:target="${childMenu.spec.target?.value}"
th:text="${childMenu.status.displayName}">
</a>
</div>
</div>
@ -49,6 +51,8 @@
</th:block>
<!-- 底部 banner -->
<halo:footer />
<div th:if="${theme.config.footer.footerContent.footerStyle == 'default'}" id="footer-banner">
<div class="footer-banner-links">
<div class="footer-banner-left">

View File

@ -232,7 +232,7 @@
var GLOBAL_CONFIG = {
// 页面类型 index,page,post,tag,category
htmlType: [[${ htmlType }]],
postTitle: [[${ htmlType == 'post' ? post.spec.title : ''}]],
postTitle: [[${ htmlType == 'post' ? post.spec.title : htmlType == 'page' ? singlePage.spec.title : ''}]],
isanchor: true,
isPost: [[${htmlType == 'post'}]],
isHome: [[${ htmlType == 'index'}]],
@ -264,7 +264,7 @@
css: 'https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/fancybox/3.5.7/jquery.fancybox.min.css'
},
twikoo:{
js: 'https://cdn.staticfile.org/twikoo/1.6.16/twikoo.all.min.js'
js: '/themes/theme-hao/assets/libs/twikoo/twikoo.all.min.js'
}
},
date_suffix: {
@ -295,6 +295,10 @@
if (GLOBAL_CONFIG.postTitle != '')
title = GLOBAL_CONFIG.postTitle
break;
case 'page':
if (GLOBAL_CONFIG.postTitle != '')
title = GLOBAL_CONFIG.postTitle
break;
case 'archive':
title = '归档'
break;

View File

@ -211,6 +211,7 @@
// 页脚友链
addFriendLinksInFooter: function () {
var linksUrl = '[[${theme.config.link.linksUrl}]]'
var fetchUrl = [[${theme.config.footer.footer_group.fetchUrl}]]
fetch(fetchUrl)
.then(res => res.json())
@ -222,7 +223,7 @@
var item = randomFriendLinks[i]
htmlText += `<a class='footer-item' href='${item.link}' target="_blank" rel="noopener nofollow">${item.name}</a>`;
}
htmlText += `<a class='footer-item' href='/links'>更多</a>`
htmlText += `<a class='footer-item' href='${linksUrl}'>更多</a>`
document.getElementById("friend-links-in-footer").innerHTML = htmlText;
})
}

View File

@ -13,51 +13,51 @@
<div class="tags-group-all">
<!-- banners 使用默认值-->
<div class="tags-group-wrapper"
th:if="${#strings.equals(theme.config.top.bannersBackground, 'default')}">
th:if="${#strings.equals(theme.config.top.BannerLeft.bannersBackground, 'default')}">
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#989bf8">
<img th:src="${assets_link + '/images/icons/AfterEffect.png'}"
title="AfterEffect">
title="AfterEffect">
</div>
<div class="tags-group-icon" style="background:#fff">
<img th:src="${assets_link + '/images/icons/Sketch.png'}"
title="Sketch">
title="Sketch">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#57b6e6">
<img th:src="${assets_link + '/images/icons/Docker.png'}"
title="Docker">
title="Docker">
</div>
<div class="tags-group-icon" style="background:#4082c3">
<img th:src="${assets_link + '/images/icons/Photoshop.png'}"
title="Photoshop">
title="Photoshop">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#fff">
<img th:src="${assets_link + '/images/icons/FinalCutPro.png'}"
title="FinalCutPro">
title="FinalCutPro">
</div>
<div class="tags-group-icon" style="background:#fff">
<img th:src="${assets_link + '/images/icons/Python.png'}"
title="Python">
title="Python">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#eb6840">
<img th:src="${assets_link + '/images/icons/Swift.png'}"
title="Swift">
title="Swift">
</div>
<div class="tags-group-icon" style="background:#8f55ba">
<img th:src="${assets_link + '/images/icons/Principle.png'}"
title="Principle">
title="Principle">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#f29e39">
<img th:src="${assets_link + '/images/icons/illustrator.png'}"
title="illustrator">
title="illustrator">
</div>
<div class="tags-group-icon" style="background:#2c51db">
<img th:src="${assets_link + '/images/icons/CSS3.png'}" title="CSS3">
@ -77,53 +77,53 @@
</div>
<div class="tags-group-icon" style="background:#e65164">
<img th:src="${assets_link + '/images/icons/Apifox.webp'}"
title="Apifox">
title="Apifox">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#989bf8">
<img th:src="${assets_link + '/images/icons/AfterEffect.png'}"
title="AfterEffect">
title="AfterEffect">
</div>
<div class="tags-group-icon" style="background:#fff">
<img th:src="${assets_link + '/images/icons/Sketch.png'}"
title="Sketch">
title="Sketch">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#57b6e6">
<img th:src="${assets_link + '/images/icons/Docker.png'}"
title="Docker">
title="Docker">
</div>
<div class="tags-group-icon" style="background:#4082c3">
<img th:src="${assets_link + '/images/icons/Photoshop.png'}"
title="Photoshop">
title="Photoshop">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#fff">
<img th:src="${assets_link + '/images/icons/FinalCutPro.png'}"
title="FinalCutPro">
title="FinalCutPro">
</div>
<div class="tags-group-icon" style="background:#fff">
<img th:src="${assets_link + '/images/icons/Python.png'}"
title="Python">
title="Python">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#eb6840">
<img th:src="${assets_link + '/images/icons/Swift.png'}"
title="Swift">
title="Swift">
</div>
<div class="tags-group-icon" style="background:#8f55ba">
<img th:src="${assets_link + '/images/icons/Principle.png'}"
title="Principle">
title="Principle">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#f29e39">
<img th:src="${assets_link + '/images/icons/illustrator.png'}"
title="illustrator">
title="illustrator">
</div>
<div class="tags-group-icon" style="background:#2c51db">
<img th:src="${assets_link + '/images/icons/CSS3.png'}" title="CSS3">
@ -143,29 +143,29 @@
</div>
<div class="tags-group-icon" style="background:#e65164">
<img th:src="${assets_link + '/images/icons/Apifox.webp'}"
title="Apifox">
title="Apifox">
</div>
</div>
</div>
<!-- banners 使用默认值-->
<div class="tags-group-wrapper"
th:if="${#strings.equals(theme.config.top.bannersBackground, 'techStack')}"
th:with="techs = ${theme.config.about.techStack}">
th:if="${#strings.equals(theme.config.top.BannerLeft.bannersBackground, 'techStack')}"
th:with="techs = ${theme.config.top.BannerLeft.techStack}">
<th:block th:each="tech,iterStat : ${techs}">
<div class="tags-group-icon-pair" th:if="${iterStat.odd}">
<div class="tags-group-icon"
th:style="'background:' + ${techOdd.background}"
th:with="techOdd = ${techs.get(iterStat.index - 1)}">
th:style="'background:' + ${techOdd.background}"
th:with="techOdd = ${techs.get(iterStat.index - 1)}">
<img th:src="@{${techOdd.url}}"
th:title="${techOdd.name}">
th:title="${techOdd.name}">
</div>
<div class="tags-group-icon"
th:style="'background:' + ${techEven.background}"
th:with="techEven = ${tech}">
th:style="'background:' + ${techEven.background}"
th:with="techEven = ${tech}">
<img th:src="@{${techEven.url}}"
th:title="${techEven.name}">
th:title="${techEven.name}">
</div>
</div>
</th:block>
@ -176,13 +176,13 @@
<!-- banners 使用默认值-->
<div class="skills-list"
th:if="${#strings.equals(theme.config.top.bannersBackground, 'default')}"
th:with="techs = ${theme.config.about.techStack}">
th:if="${#strings.equals(theme.config.top.BannerLeft.bannersBackground, 'default')}"
th:with="techs = ${theme.config.top.BannerLeft.techStack}">
<div class="skill-info">
<div class="skill-icon" style="background:#989bf8">
<img th:src="${assets_link + '/images/icons/AfterEffect.png'}"
title="AfterEffect">
title="AfterEffect">
</div>
<div class="skill-name"><span>AfterEffect</span></div>
</div>
@ -211,7 +211,7 @@
<div class="skill-info">
<div class="skill-icon" style="background:#ffffff">
<img th:src="${assets_link + '/images/icons/FinalCutPro.png'}"
title="FinalCutPro">
title="FinalCutPro">
</div>
<div class="skill-name"><span>FinalCutPro</span></div>
</div>
@ -240,7 +240,7 @@
<div class="skill-info">
<div class="skill-icon" style="background:#f29e39">
<img th:src="${assets_link + '/images/icons/illustrator.png'}"
title="illustrator">
title="illustrator">
</div>
<div class="skill-name"><span>illustrator</span></div>
</div>
@ -283,14 +283,16 @@
<div class="etc">...</div>
</div>
<div class="skills-list"
th:if="${#strings.equals(theme.config.top.bannersBackground, 'techStack')}"
th:with="techs = ${theme.config.about.techStack}">
th:if="${#strings.equals(theme.config.top.BannerLeft.bannersBackground, 'techStack')}"
th:with="techs = ${theme.config.top.BannerLeft.techStack}">
<th:block th:each="tech : ${techs}">
<div class="skill-info">
<div class="skill-icon" th:style="'background:' + ${tech.background}">
<img th:src="@{${tech.url}}" th:title="${tech.name}">
</div>
<div class="skill-name"><span th:title="${tech.name}"></span></div>
<div class="skill-name">
<span>[[${tech.name}]]</span>
</div>
</div>
</th:block>
</div>
@ -302,17 +304,17 @@
<div class="card-content">
<div class="author-content-item-tips">生涯</div>
<span class="author-content-item-title"
th:text="${theme.config.about.authorCareers.authorCareersTitle}">无限进步</span>
th:text="${theme.config.about.authorCareers.authorCareersTitle}">无限进步</span>
<div class="careers-group"
th:if="${not #lists.isEmpty(theme.config.about.authorCareers.authorCareersTags)}"
th:with="careersTags = ${theme.config.about.authorCareers.authorCareersTags}">
th:if="${not #lists.isEmpty(theme.config.about.authorCareers.authorCareersTags)}"
th:with="careersTags = ${theme.config.about.authorCareers.authorCareersTags}">
<div class="careers-item" th:each="tag : ${careersTags}">
<div class="circle" th:style="'background:' + ${tag.background}"></div>
<div class="name" th:text="${tag.desc}"></div>
</div>
</div>
<img alt="生涯" class="author-content-img"
th:src="@{${#strings.isEmpty(theme.config.about.authorCareers.authorCareersBackground) ? assets_link + '/images/hao-logo.jpg' : theme.config.about.authorCareers.authorCareersBackground}}">
th:src="@{${#strings.isEmpty(theme.config.about.authorCareers.authorCareersBackground) ? assets_link + '/images/hao-logo.jpg' : theme.config.about.authorCareers.authorCareersBackground}}">
</div>
</div>
</div>

View File

@ -29,6 +29,20 @@
</div>
</div>
</div>
<style>
.loading-bar::after {
content: "";
position: absolute;
top: 500px;
left: 0;
filter: drop-shadow(0 -500px 0 #ece5d8);
width: 500px;
height: 62.5px;
background: url([[${theme.config.about.game.loading_bar}]]) no-repeat left 100%;
background-size: 500px 62.5px;
background-position-x: 0;
}
</style>
</div>
</html>

View File

@ -134,7 +134,7 @@
<!-- banners 使用默认值-->
<div class="tags-group-wrapper"
th:if="${#strings.equals(theme.config.top.BannerLeft.bannersBackground, 'techStack')}"
th:with="techs = ${theme.config.about.techStack}">
th:with="techs = ${theme.config.top.BannerLeft.techStack}">
<th:block th:each="tech,iterStat : ${techs}">
<div class="tags-group-icon-pair" th:if="${iterStat.odd}">
<div class="tags-group-icon"

View File

@ -19,7 +19,7 @@
<div class="back-menu-list">
<th:block th:each="childMenu : ${menuItem.children}">
<a class="back-menu-item" rel="external nofollow"
target="_blank" th:href="@{${childMenu.status.href}}">
th:target="${childMenu.spec.target?.value}" th:href="@{${childMenu.status.href}}">
<!-- icon 预留 -->
<img th:if="${!#strings.isEmpty(#annotations.getOrDefault(childMenu, 'icon', ''))}"
class="back-menu-item-icon"

View File

@ -9,7 +9,9 @@
<div class="menus_item" th:each="menuItem : ${menuFinder.getPrimary().menuItems}">
<!-- javascript:void(0);" -->
<a th:if="${#lists.isEmpty(menuItem.children)}" class="site-page" rel="external nofollow"
<a class="site-page" rel="external nofollow"
th:if="${#lists.isEmpty(menuItem.children)}"
th:target="${menuItem.spec.target?.value}"
th:href="@{${menuItem.status.href}}">
<span th:text="${menuItem.status.displayName}"></span>
</a>
@ -23,9 +25,7 @@
<!-- 子菜单 -->
<ul class="menus_item_child">
<li th:each="childMenu : ${menuItem.children}">
<a class="site-page child" th:href="@{${childMenu.status.href}}">
<!-- 这里应该有一个 icon 暂时还不支持 -->
<!--<i class="fa-fw fa-duotone fa-list-timeline"></i>-->
<a class="site-page child" th:target="${childMenu.spec.target?.value}" th:href="@{${childMenu.status.href}}">
<i th:if="${!#strings.isEmpty(#annotations.getOrDefault(childMenu, 'icon', ''))}"
th:class="${#annotations.getOrDefault(childMenu, 'icon', '')}"
style="font-size:.9em"></i>

View File

@ -70,23 +70,11 @@
</div>
<script>heo.reflashEssayWaterFall();</script>
<hr/>
<!-- 评论模块 -->
<!--/* 评论组件 */-->
<th:block
th:if="${theme.config.comments.twikooEnable && #strings.equals(theme.config.comments.use, 'Twikoo') && not #strings.isEmpty(theme.config.comments.twikoos.envId)}">
<div th:replace="~{modules/twikoo :: twikoo}"></div>
</th:block>
<div id="post-comment"
th:if="${pluginFinder.available('PluginCommentWidget') && #strings.equals(theme.config.comments.use, 'commentWidget')}">
<div class="comment-head">
<div class="comment-headline"><i class="iconfont icon-comment-alt"></i> <span>评论</span></div>
<div class="comment-privacy"><a href="/privacy">隐私政策</a></div>
<div class="comment-tips" id="comment-tips">
<span>你无需删除空行,直接评论以获取最佳展示效果</span>
</div>
</div>
<halo:comment group="content.halo.run" kind="SinglePage" th:attr="name='moments'"
colorScheme="document.documentElement.getAttribute('data-theme')"/>
</div>
th:replace="~{modules/comment :: comment(group = 'content.halo.run',
kind = 'SinglePage',
name = 'moments')}"/>
</div>

View File

@ -13,23 +13,12 @@
<div id="page">
<div id="article-container" th:utext="${singlePage.content.content}"></div>
<hr>
<!-- 评论模块 -->
<!--/* 评论组件 */-->
<th:block
th:if="${singlePage.spec.allowComment && theme.config.comments.twikooEnable && #strings.equals(theme.config.comments.use, 'Twikoo') && not #strings.isEmpty(theme.config.comments.twikoos.envId)}">
<div th:replace="~{modules/twikoo :: twikoo}"></div>
</th:block>
<div id="post-comment"
th:if="${singlePage.spec.allowComment && pluginFinder.available('PluginCommentWidget') && #strings.equals(theme.config.comments.use, 'commentWidget')}">
<div class="comment-head">
<div class="comment-headline"><i class="iconfont icon-comment-alt"></i> <span>评论</span></div>
<div class="comment-privacy"><a href="/privacy">隐私政策</a></div>
<div class="comment-tips" id="comment-tips">
<span>你无需删除空行,直接评论以获取最佳展示效果</span>
</div>
</div>
<halo:comment group="content.halo.run" kind="SinglePage"
th:attr="name=${singlePage.metadata.name}" colorScheme="document.documentElement.getAttribute('data-theme')" />
</div>
th:replace="~{modules/comment :: comment(group = 'content.halo.run',
kind = 'SinglePage',
name = ${singlePage.metadata.name})}"/>
</div>
<!-- 侧栏 -->

33
templates/page_links.html Normal file
View File

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en" th:replace="~{modules/layouts/layout :: layout(content = ~{::content}, htmlType = 'page')}"
xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="content">
<div class="page" id="body-wrap">
<header class="not-top-img" id="page-header">
<nav th:replace="~{modules/nav :: nav(title = null)}"></nav>
<link rel="stylesheet" type="text/css" th:href="${assets_link + '/zhheo/heo-fcircle3.css'}">
</header>
<main class="layout hide-aside" id="content-inner">
<div id="page">
<th:block th:replace="~{macro/content-links :: content-links(${htmlType})}" />
<hr/>
<!--/* 评论组件 */-->
<th:block
th:replace="~{modules/comment :: comment(group = 'content.halo.run',
kind = 'SinglePage',
name = ${singlePage.metadata.name})}"/>
</div>
</main>
<!-- 底部 -->
<footer th:replace="~{modules/footer :: footer}"></footer>
</div>
</th:block>
</html>

View File

@ -272,22 +272,11 @@
</div>
</div>
<hr>
<!-- 评论模块 -->
<!--/* 评论组件 */-->
<th:block
th:if="${post.spec.allowComment && theme.config.comments.twikooEnable && #strings.equals(theme.config.comments.use, 'Twikoo') && not #strings.isEmpty(theme.config.comments.twikoos.envId)}">
<div th:replace="~{modules/twikoo :: twikoo}"></div>
</th:block>
<div id="post-comment"
th:if="${post.spec.allowComment && pluginFinder.available('PluginCommentWidget') && #strings.equals(theme.config.comments.use, 'commentWidget')}">
<div class="comment-head">
<div class="comment-headline"><i class="iconfont icon-comment-alt"></i> <span>评论</span></div>
<div class="comment-privacy"><a href="/privacy">隐私政策</a></div>
<div class="comment-tips" id="comment-tips">
<span>你无需删除空行,直接评论以获取最佳展示效果</span>
</div>
</div>
<halo:comment group="content.halo.run" kind="Post" th:attr="name=${post.metadata.name}" colorScheme="document.documentElement.getAttribute('data-theme')" />
</div>
th:replace="~{modules/comment :: comment(group = 'content.halo.run',
kind = 'Post',
name = ${post.metadata.name})}"/>
</div>

View File

@ -9,6 +9,10 @@ spec:
website: https://liuzhihang.com
customTemplates:
page:
- name: 友情链接页面模版
description: 支持可预设文本的友链
screenshot:
file: page_links.html
- name: 关于页面模版
description: 关于页面
screenshot:
@ -35,5 +39,5 @@ spec:
repo: https://github.com/liuzhihang/halo-theme-hao
settingName: "theme-hao-setting"
configMapName: "theme-hao-configMap"
version: "1.1.5"
require: ">=2.0.0"
version: "1.2.0"
require: ">=2.6.0"