Compare commits

...

54 Commits
dev ... main

Author SHA1 Message Date
zhengyi 12e4e1720c Merge pull request 'update v1.1.7 from upstream' (PR#2) from merge into main
Build distribution theme / build (push) Successful in 21s Details
Build distribution theme / github-release (push) Has been skipped Details
Reviewed-on: #2
2023-12-15 16:58:32 +08:00
zhengyi e27b9f65d7 Merge branch 'main' into merge 2023-12-15 16:58:10 +08:00
zhengyi 9e0098984b Merge remote-tracking branch 'upstream/main' into merge 2023-12-15 16:54:13 +08:00
Jevon 7fe560649f
Merge pull request #166 from jiewenhuang/dev
update:优化部分细节
2023-12-15 11:59:16 +08:00
jiewenhuang c5f3ba7ffa update:优化部分细节 2023-12-15 11:58:11 +08:00
Jevon 00b4e8666c
Merge pull request #165 from jiewenhuang/dev
update:优化部分细节
2023-12-15 11:39:28 +08:00
jiewenhuang 0f677c78bb update:优化部分细节 2023-12-15 11:37:47 +08:00
Jevon d1f0a2b9cd
Merge pull request #164 from jiewenhuang/dev
update:v1.1.7
2023-12-15 00:35:45 +08:00
jiewenhuang 5a065dda7f update:优化部分细节 2023-12-15 00:34:28 +08:00
jiewenhuang 0008c1b23a update:waline留言暂时修改为只获取留言页一级评论 2023-12-15 00:26:11 +08:00
jiewenhuang 34f45f71a6 update:最低版本修改为2.11.0 2023-12-14 20:32:19 +08:00
jiewenhuang e1ec45f793 update:优化部分细节 2023-12-14 20:31:21 +08:00
jiewenhuang 8a0de51878 update:广告支持代码 2023-12-14 20:30:24 +08:00
jiewenhuang e07d58b48c Fix:文章页广告加载错误 2023-12-14 18:56:54 +08:00
jiewenhuang 3e7fbb9241 update:waline资源可设置化 2023-12-14 18:56:08 +08:00
jiewenhuang 8caf395e81 fix:非waline评论加载问题 2023-12-14 01:33:34 +08:00
jiewenhuang 60db56bfa4 update:优化部分细节 2023-12-13 23:46:57 +08:00
jiewenhuang 936eb4705d update:重构侧边栏设置 2023-12-13 23:45:26 +08:00
jiewenhuang 04ca092c35 update:重构轮播图,可自定义数据 2023-12-13 21:57:51 +08:00
jiewenhuang 678f732927 update:重构轮播图,可自定义数据 2023-12-13 21:51:03 +08:00
Jevon 495b0d125e
Merge pull request #156 from yundabei/dev
Dev
2023-12-13 20:44:32 +08:00
yundabei 37f7436c2c PC端导航栏icon居左对齐 2023-12-08 16:41:06 +08:00
yundabei 27b4387db7 修复首页文章加载形式为 加载 时,总文章数量小于文章列表显示条数,点击查看更多会导致重复加载文章 2023-12-08 14:06:12 +08:00
yundabei 75ba9dc223 Merge branch 'dev' of github.com:yundabei/halo-theme-joe3.0 into dev 2023-12-08 10:27:19 +08:00
yundabei 07f0e3f949 去除打赏图标 2023-12-08 10:26:23 +08:00
DAB d58f6219c9
Merge branch 'jiewenhuang:dev' into dev 2023-12-08 10:21:09 +08:00
yundabei 856a07cc90 新增QQ打赏选项,以及具体打赏途径文字标注 2023-12-08 10:19:55 +08:00
Jevon fb66e2384c
Merge pull request #154 from jiewenhuang/main
update:main to dev
2023-12-07 23:58:46 +08:00
Jevon d0c7fc9e5a
Merge pull request #153 from jiewenhuang/dev
Merge pull request #149 from jiewenhuang/main
2023-12-07 23:57:23 +08:00
Jevon c968bc9d9f
Merge pull request #152 from yundabei/main
修复控制台因非本地环境报错undefined
修复瞬时信息不显示博主名称 #84
修复文章页导航显示不全 #66
修复waline评论的gif功能导致footer元素异常 #141
新增PC端等级显示
版本号+1
2023-12-07 23:52:58 +08:00
yundabei 93cd06a3ce 评论区GIF修正 2023-12-07 17:47:42 +08:00
yundabei e248a90138 更新版号 2023-12-07 17:38:02 +08:00
yundabei fb19fd98d9 评论区Gif位置调整 2023-12-07 17:17:06 +08:00
yundabei 1182b5b674 文章页导航显示不全 2023-12-07 16:40:23 +08:00
yundabei 865b076855 修复瞬间页面昵称显示问题 2023-12-07 15:13:33 +08:00
yundabei 9152e903c8 修复瞬间页面昵称显示问题 2023-12-07 15:07:48 +08:00
yundabei ac5dacca8f 修复非瞬间页面昵称显示问题 2023-12-07 15:01:48 +08:00
yundabei c4b59aba10 修复非瞬间页面昵称显示以及PC博主信息等级显示 2023-12-07 14:36:46 +08:00
yundabei aa499207b9 修复非本地环境输出ThemeConfig.mode控制台报错undefined 2023-12-07 12:04:01 +08:00
zhengyi 143873d3c0 💚 Fix ci trigger
Build distribution theme / build (push) Successful in 15s Details
Build distribution theme / github-release (push) Has been skipped Details
2023-12-06 23:31:33 +08:00
zhengyi 524550b8cb 📝 Update document 2023-12-06 23:29:33 +08:00
zhengyi e676e20af9 Merge pull request 'PR' (#1) from zblog-web into main
Reviewed-on: #1
2023-12-06 23:19:26 +08:00
zhengyi 6100f19b8c Merge branch 'main' into zblog-web 2023-12-06 23:03:40 +08:00
zhengyi 7c4393d44a 💚 Add gitea ci 2023-12-06 23:02:18 +08:00
Jevon 7832547500
Merge pull request #149 from jiewenhuang/main
update:main to dev
2023-12-02 01:06:41 +08:00
Jevon 358cb28f43
Merge branch 'dev' into main 2023-12-02 01:06:30 +08:00
Jevon 40629b2cdc
Merge pull request #148 from justice2001/fix-custom-driven
fix bug #138
2023-12-02 00:52:24 +08:00
zhengyi 226dd783ac fix: 选项卡中无法自定义云服务提供商,缺少提示框
Link #138
2023-12-01 20:43:34 +08:00
zhengyi df65eb521d 🐛 Change raw name back 2023-11-25 23:27:31 +08:00
zhengyi 12ccbf5b5a 📝 Change theme id to zblog 2023-11-25 23:12:54 +08:00
jiewenhuang 8667dc3671 fix:自定义服务商不显示选项问题( #138) 2023-11-10 12:08:29 +08:00
Jevon e8dc93b81b
Merge pull request #135 from jiewenhuang/dev
update:v1.1.6
2023-11-09 13:36:50 +08:00
Jevon 4e673476d0
Merge pull request #134 from jiewenhuang/dev
fix:图库图片加载错误
2023-11-09 13:32:03 +08:00
Jevon b3f9b51bd1
Merge pull request #130 from jiewenhuang/dev
update:v1.1.5
2023-11-08 22:49:02 +08:00
40 changed files with 794 additions and 281 deletions

View File

@ -0,0 +1,50 @@
name: Bug 反馈
description: 提交 Bug 反馈
labels: [ bug ]
body:
- type: markdown
id: preface
attributes:
value: |
感谢你花时间填写此错误报告!在开始之前,我们非常推荐阅读一遍[《开源最佳实践》](https://github.com/LinuxSuRen/open-source-best-practice),这会在很大程度上提高我们彼此的效率。
- type: markdown
id: environment
attributes:
value: "## 环境信息"
- type: input
id: version
validations:
required: true
attributes:
label: "是什么版本出现了此问题?"
description: "可以在管理后台的关于页面中找到。"
- type: input
id: site-url
attributes:
label: "在线站点地址"
description: "如果可以的话,请提供你的站点地址。这可能会帮助我们更好的定位问题。"
placeholder: "ex. https://halo.run"
validations:
required: false
- type: markdown
id: details
attributes:
value: "## 详细信息"
- type: textarea
id: what-happened
attributes:
label: "发生了什么?"
description: "最好还告诉我们,你预计会发生什么。"
validations:
required: true
- type: textarea
id: logs
attributes:
label: "相关日志输出"
description: "请复制并粘贴任何相关的日志输出。 这将自动格式化为代码,因此无需反引号。"
render: shell
- type: textarea
id: additional-information
attributes:
label: "附加信息"
description: "如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。"

View File

@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: 对 Joe3 有其他问题
url: xxxxxx
about: 如果你还有其他疑问,可以加群沟通。

View File

@ -0,0 +1,31 @@
name: 新特性建议
description: 提交新特性建议
body:
- type: markdown
id: preface
attributes:
value: "你好!在开始之前,我们非常推荐阅读一遍[《开源最佳实践》](https://github.com/LinuxSuRen/open-source-best-practice),这会在很大程度上提高我们彼此的效率。"
- type: markdown
id: environment
attributes:
value: "## 环境信息"
- type: input
id: version
attributes:
label: "你当前使用的版本"
description: "可以在管理后台的关于页面中找到。"
- type: markdown
id: details
attributes:
value: "## 详细信息"
- type: textarea
id: description
attributes:
label: "描述一下此特性"
validations:
required: true
- type: textarea
id: additional-information
attributes:
label: "附加信息"
description: "如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。"

View File

@ -0,0 +1,90 @@
name: Build distribution theme
on:
release:
types:
- created
push:
branches:
- main
jobs:
build:
runs-on: debian-12
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Compress zip
run: |
PACKAGE_VERSION=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' package.json)
PRE_ZIP_FOLDER=halo-theme-Joe3-${PACKAGE_VERSION}
ARTIFACT_NAME=${PRE_ZIP_FOLDER}.zip
ARTIFACT_PATHNAME=dist/${ARTIFACT_NAME}
echo "halo-theme-Joe3 version $PACKAGE_VERSION"
echo "Artifact name: ${ARTIFACT_NAME}"
echo "Artifact pathname: ${ARTIFACT_PATHNAME}"
echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $GITHUB_ENV
echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV
echo "ARTIFACT_PATHNAME=${ARTIFACT_PATHNAME}" >> $GITHUB_ENV
echo "RELEASE_ID=${{ github.event.release.id }}" >> $GITHUB_ENV
mkdir $PRE_ZIP_FOLDER
mkdir dist
cp -r theme.yaml settings.yaml annotation-setting.yaml templates $PRE_ZIP_FOLDER/
zip -r $ARTIFACT_PATHNAME $PRE_ZIP_FOLDER
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: halo-theme-Joe3
path: |
dist/*.zip
retention-days: 7
github-release:
runs-on: debian-12
if: github.event_name == 'release'
steps:
- uses: actions/checkout@v3
with:
submodules: false
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Compress zip
run: |
PACKAGE_VERSION=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' package.json)
PRE_ZIP_FOLDER=halo-theme-Joe3-${PACKAGE_VERSION}
ARTIFACT_NAME=${PRE_ZIP_FOLDER}.zip
ARTIFACT_PATHNAME=dist/${ARTIFACT_NAME}
echo "halo-theme-Joe3 version $PACKAGE_VERSION"
echo "Artifact name: ${ARTIFACT_NAME}"
echo "Artifact pathname: ${ARTIFACT_PATHNAME}"
echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $GITHUB_ENV
echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV
echo "ARTIFACT_PATHNAME=${ARTIFACT_PATHNAME}" >> $GITHUB_ENV
echo "RELEASE_ID=${{ github.event.release.id }}" >> $GITHUB_ENV
mkdir $PRE_ZIP_FOLDER
mkdir dist
cp -r theme.yaml settings.yaml annotation-setting.yaml templates $PRE_ZIP_FOLDER/
zip -r $ARTIFACT_PATHNAME $PRE_ZIP_FOLDER
- name: Upload a release asset
uses: actions/github-script@v2
with:
github-token: ${{secrets.TOKEN}}
script: |
const fs = require('fs').promises;
const { repo: { owner, repo }, sha } = context;
console.log({ owner, repo, sha });
const releaseId = process.env.RELEASE_ID
const artifactPathName = process.env.ARTIFACT_PATHNAME
const artifactName = process.env.ARTIFACT_NAME
console.log('Releasing', releaseId, artifactPathName, artifactName)
await github.repos.uploadReleaseAsset({
owner, repo,
release_id: releaseId,
name: artifactName,
data: await fs.readFile(artifactPathName)
});

View File

@ -1,5 +1,9 @@
<h1 align="center"> Halo Theme Joe3 </h1>
> 🚧 [上游](https://github.com/jiewenhuang/halo-theme-joe3.0),定期从上游合并分支
<h1 align="center"> Halo Theme Joe3 ZBlog </h1>
Joe3 ZBlog专版
<p class="badge-row" align="center">
<a href="https://halo.run" target="_blank">

View File

@ -32,12 +32,38 @@ spec:
label: 默认
- value: waline
label: Waline
- $formkit: text
- $formkit: group
name: waline
if: "$get(comment_option).value === 'waline'"
name: waline_serverURL
label: Waline 服务端地址
value: ""
help: "Waline 服务端地址,如 https://waline-server.herokuapp.com 不要加结尾反斜杠"
label: Waline 设置
id: waline
children:
- $formkit: text
name: waline_serverURL
label: Waline 服务端地址
value: ""
help: "Waline 服务端地址,如 https://waline-server.herokuapp.com 不要加结尾反斜杠"
- $formkit: text
name: waline_css
label: Waline CSS地址
value: "https://unpkg.com/@waline/client@v2/dist/waline.css"
help: Waline 的主样式地址
- $formkit: text
name: waline_js_comment
label: 用于评论的 JS 地址
value: "https://unpkg.com/@waline/client@v2/dist/waline.mjs"
help: Waline 的评论 JS 地址
- $formkit: text
name: waline_js_leaving
label: 功能 JS
value: "https://cdn.jsdelivr.net/npm/@waline/client/dist/waline.mjs"
help: 用于加载留言板和最新评论的 JS 地址
- $formkit: text
name: waline_js_list
label: 列表 JS
value: "https://unpkg.com/@waline/client@v2/dist/comment.mjs"
help: 首页加载显示评论数的 JS 地址
- $formkit: radio
name: enable_source_link
id: enable_source_link
@ -604,15 +630,54 @@ spec:
- value: false
label: 关闭
- $formkit: repeater
if: "$get(enable_banner).value"
name: banner_source
label: 轮播图文章
value: [ ]
if: "$get(enable_banner).value === true"
name: banner_data_group
label: 轮播图数据设置
id: banner_data_group
value: []
children:
- $formkit: radio
name: banner_section_type
id: banner_section_type
label: 模块类型
value:
options:
- label: 已有文章
value: post
- label: 自定义数据
value: custom
- $formkit: postSelect
name: posts
label: 选择要推荐的文章(至少两个)
if: $value.banner_section_type === 'post'
name: data_by_post
label: 选择已有文章
id: data_by_post
value: ""
- $formkit: group
if: $value.banner_section_type === 'custom'
name: data_by_custom
label: 自定义数据
id: data_by_custom
value: [ ]
children:
- $formkit: text
name: banner_title
label: 标题
value: ""
validation: "required"
- $formkit: textarea
name: banner_subtitle
label: 描述(可留空)
value: ""
- $formkit: url
name: banner_url
label: 跳转链接
value: ""
validation: "required"
- $formkit: attachment
name: banner_img
label: 图片地址
value: ""
validation: "required"
- $formkit: radio
name: banner_direction
id: banner_direction
@ -1486,14 +1551,16 @@ spec:
name: template_aside
id: template_aside
label: "侧边栏模块"
value: "enable_lifetime"
value: "none"
options:
- value: "none"
label:
- value: "enable_blogger"
label: 博主信息
- value: "enable_notice"
label: 网站公告
- value: "enable_qrcode"
label: 二维码
- value: "enable_picture"
label: 图片
- value: "enable_music_player"
label: 音乐播放器
- value: "enable_newest_post"
@ -1506,63 +1573,128 @@ spec:
label: 标签云
- value: "enable_ads_aside"
label: 侧边栏广告
- $formkit: code
# if: "$get(template_aside).value === 'enable_notice'"
name: site_notice
label: 网站公告
value: "这是你的公告"
help: "网站公告信息,将展示在页面右侧,尽量简洁明了,不填不展示该模块(需要先在 “侧边栏” 中开启公告模块),支持html代码"
language: html
- $formkit: attachment
# if: "$get(template_aside).value === 'enable_qrcode'"
name: qrcode_url
label: 二维码图片
value: ""
- $formkit: text
# if: "$get(enable_qrcode).value === true"
name: qrcode_title
label: 二维码标题
value: "我的二维码"
- $formkit: textarea
# if: "$get(template_aside).value === 'enable_qrcode'"
name: qrcode_description
label: 二维码描述
value: ""
- $formkit: text
# if: "$get(template_aside).value === 'enable_music_player'"
name: music_id
label: 歌单ID
help: "为音乐播放器配置歌单ID大家在网页歌单页直接复制地址栏id参数后面那串数字即可不填或填错将不会展示播放器注意仅支持网易云歌单ID且不支持私密歌单"
value: ""
- $formkit: number
# if: "$get(template_aside).value === 'show_newreply'"
name: show_newreply_num
label: 展示最新评论
value: 3
help: "在侧边栏展示最新评论的数量"
- $formkit: select
# if: "$get(template_aside).value === 'enable_tag_cloud'"
name: tag_cloud_type
id: tag_cloud_type
label: 标签云类型
value: "3d"
help: "设置标签云的展示形式,默认为 “3D标签云”标签太多或卡顿时建议限制展示的标签数量使用列表形式"
options:
- value: 3d
label: 3D标签云
- value: list
label: 标签列表
- $formkit: select
# if: "$get(template_aside).value === 'enable_tag_cloud'"
name: tag_cloud_width
id: tag_cloud_width
label: 标签宽度
value: "static"
options:
- value: static
label: 固定宽度
- value: responsive
label: 自适应宽度
- $formkit: group
if: $value.template_aside === 'enable_notice'
name: aside_notice
label: 网站公告
value: [ ]
children:
- $formkit: text
name: notice_title
label: 公告标题
value: "网站公告"
help: "公告标题,留空则不显示"
- $formkit: code
name: site_notice
label: 网站公告内容
value: "这是你的公告"
help: "支持html代码"
language: html
- $formkit: group
if: $value.template_aside === 'enable_picture'
name: aside_picture
label: 图片
value: [ ]
children:
- $formkit: attachment
name: qrcode_url
label: 图片链接
value: ""
- $formkit: text
name: qrcode_title
label: 图片标题
value: "我的二维码"
- $formkit: textarea
name: qrcode_description
label: 图片描述
value: ""
- $formkit: group
if: $value.template_aside === 'enable_music_player'
name: aside_music_player
label: 音乐播放器
value: [ ]
children:
- $formkit: text
name: music_id
label: 歌单ID
help: "为音乐播放器配置歌单ID大家在网页歌单页直接复制地址栏id参数后面那串数字即可不填或填错将不会展示播放器注意仅支持网易云歌单ID且不支持私密歌单"
value: ""
- $formkit: group
if: $value.template_aside === 'show_newreply'
name: aside_newreply
label: 最新评论
value: [ ]
children:
- $formkit: number
name: show_newreply_num
label: 展示最新评论
value: 3
help: "在侧边栏展示最新评论的数量"
- $formkit: group
if: $value.template_aside === 'enable_tag_cloud'
name: aside_tag_cloud
label: 标签云
value: [ ]
children:
- $formkit: select
name: tag_cloud_type
id: tag_cloud_type
label: 标签云类型
value: "3d"
help: "设置标签云的展示形式,默认为 “3D标签云”标签太多或卡顿时建议限制展示的标签数量使用列表形式"
options:
- value: 3d
label: 3D标签云
- value: list
label: 标签列表
- $formkit: select
name: tag_cloud_width
id: tag_cloud_width
label: 标签宽度
value: "static"
options:
- value: static
label: 固定宽度
- value: responsive
label: 自适应宽度
- $formkit: group
if: $value.template_aside === 'enable_ads_aside'
name: aside_ads
label: 侧边栏广告
value: [ ]
children:
- $formkit: radio
name: aside_ads_type
id: aside_ads_type
label: 广告数据
value: ""
help: "广告类型,支持图片和自定义代码"
options:
- value: img
label: 图片
- value: code
label: 自定义代码
- $formkit: attachment
if: $value.aside_ads_type === 'img'
name: aside_ads_img
label: 侧边栏广告图片
value: ""
help: "侧边栏广告图片链接"
- $formkit: text
if: $value.aside_ads_type === 'img'
name: aside_ads_url
label: 广告链接
value: ""
help: "广告跳转链接"
- $formkit: code
if: $value.aside_ads_type === 'code'
name: aside_ads_code
label: 自定义代码
value: ""
help: "支持html代码"
language: html
#
- group: post
label: 文章页
@ -1876,6 +2008,15 @@ spec:
label: 微信二维码
value: ""
help: "打赏用的微信收款二维码链接,不填不显示"
- $formkit: attachment
# if: "$get(enable_donate).value === true"
name: qrcode_qq
label: QQ二维码
value: ""
help: "打赏用的QQ收款二维码链接不填不显示"
- group: tags
label: 标签页
formSchema:
@ -2226,83 +2367,116 @@ spec:
- group: ads
label: 广告
formSchema:
- $formkit: radio
name: enable_aside_ads
label: 是否启用侧边栏广告
value: false
help: "启用后需要再到侧边栏添加组件"
- $formkit: select
name: enable_ads_top
id: enable_ads_top
label: 启用文章顶部广告
value: none
options:
- value: true
label:
- value: false
label:
- $formkit: attachment
name: aside_ads_img
label: 侧边栏广告图片
value: ""
help: "侧边栏广告图片链接"
- $formkit: text
name: aside_ads_url
label: 广告链接
value: ""
help: "广告跳转链接"
- $formkit: radio
name: enable_post_ads_top
label: 是否启用文章顶部广告
value: false
options:
- value: true
label:
- value: false
label:
- $formkit: attachment
name: post_ads_top_img
- value: none
label: 不启用
- value: img
label: 图片
- value: code
label: 自定义代码
- $formkit: repeater
name: ads_top
label: 文章顶部广告图片
value: ""
help: "文章顶部广告图片链接"
- $formkit: text
name: post_ads_top_url
label: 广告链接
value: ""
help: "广告跳转链接"
- $formkit: radio
name: enable_post_ads_bottom
label: 是否启用文章底部广告
value: false
max: 1
min: 1
value: [ ]
children:
- $formkit: attachment
name: ads_img
id: ads_img
label: 广告图片
value:
- $formkit: text
name: ads_url
id: ads_url
label: 广告链接
value:
- $formkit: code
name: ads_code
id: ads_code
label: 自定义代码
value:
language: html
- $formkit: select
name: enable_ads_bottom
id: enable_ads_bottom
label: 启用文章底部广告
value: none
options:
- value: true
label:
- value: false
label:
- $formkit: attachment
name: post_ads_bottom_img
- value: none
label: 不启用
- value: img
label: 图片
- value: code
label: 自定义代码
- $formkit: repeater
name: ads_bottom
label: 文章底部广告图片
value: ""
help: "文章底部广告图片链接"
- $formkit: text
name: post_ads_bottom_url
label: 广告链接
value: ""
help: "广告跳转链接"
- $formkit: radio
name: enable_post_ads_aside
label: 是否启用文章侧边栏广告
value: false
max: 1
min: 1
value: [ ]
children:
- $formkit: attachment
name: ads_img
id: ads_img
label: 广告图片
value:
- $formkit: text
name: ads_url
id: ads_url
label: 广告链接
value:
- $formkit: code
name: ads_code
id: ads_code
label: 自定义代码
value:
language: html
- $formkit: select
name: enable_ads_aside
id: enable_ads_aside
label: 启用文章侧边栏广告
value: none
options:
- value: true
label:
- value: false
label:
- $formkit: attachment
name: post_ads_aside_img
- value: none
label: 不启用
- value: img
label: 图片
- value: code
label: 自定义代码
- $formkit: repeater
name: ads_aside
label: 文章侧边栏广告图片
value: ""
help: "文章底部广告图片链接"
- $formkit: text
name: post_ads_aside_url
label: 广告链接
value: ""
help: "广告跳转链接"
max: 1
min: 1
value: [ ]
children:
- $formkit: attachment
name: ads_img
id: ads_img
label: 广告图片
value:
- $formkit: text
name: ads_url
id: ads_url
label: 广告链接
value:
- $formkit: code
name: ads_code
id: ads_code
label: 自定义代码
value:
language: html
- group: footer
label: 页脚
@ -2392,6 +2566,7 @@ spec:
label:
- $formkit: select
name: driven_by
id: driven_by
label: 云服务提供商
value: "none"
help: "配置本站点由xxx云提供云服务"
@ -2414,6 +2589,15 @@ spec:
label: 金山云
- value: custom
label: 自定义
- $formkit: text
name: driven_by_custom_url
if: "$get(driven_by).value === 'custom'"
label: 跳转链接
- $formkit: attachment
name: driven_by_custom_img
if: "$get(driven_by).value === 'custom'"
label: 图片地址
- $formkit: radio
name: enable_rss
label: 展示 RSS

View File

@ -499,6 +499,10 @@ body {
visibility: visible;
opacity: 1;
transform: translateX(-50%) perspective(600px) rotateX(0);
li{
display: flex;
justify-content: flex-start;
}
}
}
}
@ -5670,6 +5674,7 @@ body {
color: var(--minor);
background: var(--background);
border-top: 1px solid var(--classD);
z-index: -1;
.joe_container {
position: relative;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -249,7 +249,7 @@
}
.is-collapsible {
max-height: 1000px;
// max-height: 1000px;
overflow: hidden;
transition: all 300ms ease-in-out;
}
@ -526,4 +526,12 @@
0% {
box-shadow: 0 0 0 0 var(--theme);
}
}
// 评论区 GIF 位置及大小调整
.wl-gif-popup.display{
bottom: 100% !important;
top:auto !important;
}
.wl-gallery{
max-height: 30vh !important;
}

View File

@ -172,7 +172,7 @@ const commonContext = {
}
// 代码复制
if (ThemeConfig.enable_code_copy) {
const text = $item.find("code[class*='language-']").text();
const text = $item.find("code[class='language-none'], code[class*='language-']").text();
const span = $(
"<span class=\"copy-button\"><i class=\"joe-font joe-icon-copy\" title=\"复制代码\"></i></span>"
);
@ -527,6 +527,7 @@ const commonContext = {
},
/* 初始化3D标签云 */
init3dTag() {
ThemeConfig.tag_cloud_type = document.getElementById('tags-3d') ? '3d' : 'list'
ThemeConfig.enable_tag_cloud=document.querySelector('.joe_aside__item.tags-cloud') !== null
// console.log(ThemeConfig.enable_tag_cloud)
if (

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,12 @@
/*!
* imagesLoaded PACKAGED v5.0.0
* JavaScript is all like "You images are done yet or what?"
* MIT License
*/
!function(t,e){"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,(function(){function t(){}let e=t.prototype;return e.on=function(t,e){if(!t||!e)return this;let i=this._events=this._events||{},s=i[t]=i[t]||[];return s.includes(e)||s.push(e),this},e.once=function(t,e){if(!t||!e)return this;this.on(t,e);let i=this._onceEvents=this._onceEvents||{};return(i[t]=i[t]||{})[e]=!0,this},e.off=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;let s=i.indexOf(e);return-1!=s&&i.splice(s,1),this},e.emitEvent=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;i=i.slice(0),e=e||[];let s=this._onceEvents&&this._onceEvents[t];for(let n of i){s&&s[n]&&(this.off(t,n),delete s[n]),n.apply(this,e)}return this},e.allOff=function(){return delete this._events,delete this._onceEvents,this},t})),
/*!
* imagesLoaded v5.0.0
* JavaScript is all like "You images are done yet or what?"
* MIT License
*/
function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,(function(t,e){let i=t.jQuery,s=t.console;function n(t,e,o){if(!(this instanceof n))return new n(t,e,o);let r=t;var h;("string"==typeof t&&(r=document.querySelectorAll(t)),r)?(this.elements=(h=r,Array.isArray(h)?h:"object"==typeof h&&"number"==typeof h.length?[...h]:[h]),this.options={},"function"==typeof e?o=e:Object.assign(this.options,e),o&&this.on("always",o),this.getImages(),i&&(this.jqDeferred=new i.Deferred),setTimeout(this.check.bind(this))):s.error(`Bad element for imagesLoaded ${r||t}`)}n.prototype=Object.create(e.prototype),n.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)};const o=[1,9,11];n.prototype.addElementImages=function(t){"IMG"===t.nodeName&&this.addImage(t),!0===this.options.background&&this.addElementBackgroundImages(t);let{nodeType:e}=t;if(!e||!o.includes(e))return;let i=t.querySelectorAll("img");for(let t of i)this.addImage(t);if("string"==typeof this.options.background){let e=t.querySelectorAll(this.options.background);for(let t of e)this.addElementBackgroundImages(t)}};const r=/url\((['"])?(.*?)\1\)/gi;function h(t){this.img=t}function d(t,e){this.url=t,this.element=e,this.img=new Image}return n.prototype.addElementBackgroundImages=function(t){let e=getComputedStyle(t);if(!e)return;let i=r.exec(e.backgroundImage);for(;null!==i;){let s=i&&i[2];s&&this.addBackground(s,t),i=r.exec(e.backgroundImage)}},n.prototype.addImage=function(t){let e=new h(t);this.images.push(e)},n.prototype.addBackground=function(t,e){let i=new d(t,e);this.images.push(i)},n.prototype.check=function(){if(this.progressedCount=0,this.hasAnyBroken=!1,!this.images.length)return void this.complete();let t=(t,e,i)=>{setTimeout((()=>{this.progress(t,e,i)}))};this.images.forEach((function(e){e.once("progress",t),e.check()}))},n.prototype.progress=function(t,e,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!t.isLoaded,this.emitEvent("progress",[this,t,e]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,t),this.progressedCount===this.images.length&&this.complete(),this.options.debug&&s&&s.log(`progress: ${i}`,t,e)},n.prototype.complete=function(){let t=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(t,[this]),this.emitEvent("always",[this]),this.jqDeferred){let t=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[t](this)}},h.prototype=Object.create(e.prototype),h.prototype.check=function(){this.getIsImageComplete()?this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.img.crossOrigin&&(this.proxyImage.crossOrigin=this.img.crossOrigin),this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.proxyImage.src=this.img.currentSrc||this.img.src)},h.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},h.prototype.confirm=function(t,e){this.isLoaded=t;let{parentNode:i}=this.img,s="PICTURE"===i.nodeName?i:this.img;this.emitEvent("progress",[this,s,e])},h.prototype.handleEvent=function(t){let e="on"+t.type;this[e]&&this[e](t)},h.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},h.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},h.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},d.prototype=Object.create(h.prototype),d.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url,this.getIsImageComplete()&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},d.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},d.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.element,e])},n.makeJQueryPlugin=function(e){(e=e||t.jQuery)&&(i=e,i.fn.imagesLoaded=function(t,e){return new n(this,t,e).jqDeferred.promise(i(this))})},n.makeJQueryPlugin(),n}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@
<div class="joe_main">
<div class="joe_index">
<!-- 轮播图-->
<th:block th:if="${theme.config.carousel.enable_banner} and ${not #lists.isEmpty(theme.config.carousel.banner_source)}">
<th:block th:if="${theme.config.carousel.enable_banner} and ${not #lists.isEmpty(theme.config.carousel.banner_data_group)}">
<th:block th:replace="~{modules/macro/banner :: banner}" />
</th:block>
@ -53,7 +53,7 @@
<th:block th:if="${!theme.config.home.enable_index_list_ajax}">
<th:block th:replace="~{modules/common/pagination :: pagination}" />
</th:block>
<th:block th:if="${theme.config.home.enable_index_list_ajax}">
<th:block th:if="${posts.hasNext()} and ${theme.config.home.enable_index_list_ajax}">
<div class="joe_load_container"
th:with="nextPage = ${posts.totalPages == posts.page?'':posts.nextUrl}">
<div class="joe_load" th:data-next="@{${nextPage}}">查看更多 </div>

View File

@ -89,7 +89,7 @@
</style>
<script type="module" th:inline="javascript">
import { init } from 'https://unpkg.com/@waline/client@v2/dist/waline.mjs';
import { init } from /*[[${theme.config.basic.waline.waline_js_comment}]]*/'';
init({
el: '#waline',

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<th:block th:fragment="ads_aside(ads_url, ads_img)">
<th:block th:fragment="ads_aside_img(ads_url, ads_img)">
<section class="joe_aside__item advert">
<a class="joe_advert" target="_blank" rel="noopener noreferrer nofollow" th:href="${ads_url}" title="广告">
<img class="omit lazyload" width="100%" th:data-src="${ads_img}" th:src="${theme.config.home.lazyload_thumbnail}" alt="广告"/>
@ -8,4 +8,9 @@
</a>
</section>
</th:block>
<th:block th:fragment="ads_aside_code(ads_code)">
<section class="joe_aside__item advert" th:utext="${ads_code}">
</section>
</th:block>
</html>

View File

@ -1,11 +1,16 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<th:block th:fragment="ads_post(ads_url, ads_img)">
<th:block th:fragment="ads_post(kind, data)">
<section class="joe_advert-large">
<a target="_blank" rel="noopener noreferrer nofollow" th:href="${ads_url}" title="广告">
<img class="omit" width="100%" th:src="${ads_img}" alt="广告"/>
<th:block th:if="${kind == 'img'}">
<a target="_blank" rel="noopener noreferrer nofollow" th:href="${data.ads_url}" title="广告">
<img class="omit" width="100%" th:src="${data.ads_img}" alt="广告"/>
<span class="icon">广告</span>
</a>
</th:block>
<th:block th:if="${kind == 'code'}" th:utext="${data.ads_code}">
</th:block>
</section>
</th:block>
</html>

View File

@ -4,7 +4,45 @@
<aside class="joe_aside"
th:classappend="${theme.config.aside.aside_position == 'left' ? 'pos_left':''}">
<th:block th:each="aside : ${theme.config.aside.enable_outpost_aside}">
<th:block th:replace="~{modules/widgets/asideWidget :: ${aside.template_aside}}" />
<th:block th:switch="${aside.template_aside}">
<th:block th:case="'enable_blogger'">
<!-- 博主信息-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_blogger}" />
</th:block>
<th:block th:case="'enable_notice'">
<!-- 公告-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_notice(notice_data = ${aside.aside_notice})}" />
</th:block>
<th:block th:case="'enable_picture'">
<!-- 图片-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_picture(pic_data = ${aside.aside_picture})}" />
</th:block>
<th:block th:case="'enable_music_player'">
<!-- 音乐播放器-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_music_player(music_data = ${aside.aside_music_player})}" />
</th:block>
<th:block th:case="'enable_newest_post'">
<!-- 最新文章-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_newest_post}" />
</th:block>
<th:block th:case="'enable_lifetime'">
<!-- 人生倒计时-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_lifetime}" />
</th:block>
<th:block th:case="'show_newreply'">
<!-- 最新评论-->
<th:block th:include="~{modules/widgets/asideWidget :: show_newreply(new_reply_data = ${aside.aside_newreply})}" />
</th:block>
<th:block th:case="'enable_tag_cloud'">
<!-- 标签云-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_tag_cloud(tag_cloud_data = ${aside.aside_tag_cloud})}" />
</th:block>
<th:block th:case="'enable_ads_aside'">
<!-- 侧边栏广告-->
<th:block th:include="~{modules/widgets/asideWidget :: enable_ads_aside(ads_data = ${aside.aside_ads})}" />
</th:block>
</th:block>
</th:block>

View File

@ -15,9 +15,10 @@
<th:block th:if="${theme.config.post.enable_relate_post == true}">
<th:block th:replace="~{modules/macro/relate :: relate}" />
</th:block>
<th:block th:if="${theme.config.ads.enable_post_ads_aside} and ${#strings.trim(theme.config.ads.post_ads_aside_img) !=''}">
<th:block th:replace="~{modules/ads/ads_aside :: ads_aside(ads_url=${theme.config.ads.post_ads_aside_url}, ads_img=${theme.config.ads.post_ads_aside_img})}" />
</th:block>
<th:block th:if="${theme.config.ads.enable_ads_aside != 'none'} and ${not #lists.isEmpty(theme.config.ads.ads_aside)}"
th:each="ads_data : ${theme.config.ads.ads_aside}">
<th:block th:replace="~{modules/ads/ads_post :: ads_post(kind = ${theme.config.ads.enable_ads_aside}, data = ${ads_data})}" />
</th:block>
</div>
</aside>
</th:block>

View File

@ -15,8 +15,7 @@
</th:block>
</div>
<a class="link" th:href="${site.url}" target="_blank" rel="noopener noreferrer nofollow">
[[${theme.config.blogger.nickname ?: site.title}]]
<!-- 这里应该还有一个等级-->
[[${theme.config.blogger.nickname ?: site.title}]]<img class="level" th:src="@{/assets/svg/level_1.svg}" alt="博主等级">
</a>
<th:block th:if="${theme.config.blogger.motto != ''}">
<p class="motto joe_motto">[[${theme.config.blogger.motto}]]</p>

View File

@ -73,6 +73,14 @@
</p>
</th:block>
<th:block th:if="${theme.config.footer.driven_by == 'custom'} and ${theme.config.footer.driven_by_custom_img != ''}">
<p class="site_driven">本站点由
<a th:href="${theme.config.footer.driven_by_custom_url}" target="_blank" rel="noopener noreferrer nofollow">
<img th:class="${theme.config.footer.driven_by}" th:src="${theme.config.footer.driven_by_custom_img}" alt="云服务商"/>
</a>提供云服务
</p>
</th:block>
</th:block>
<th:block th:if="${theme.config.footer.enable_birthday}">

View File

@ -30,8 +30,8 @@
<script id="theme-config-getter" type="text/javascript">
if (window.location.hostname === 'localhost'||window.location.hostname === '127.0.0.1') {
ThemeConfig['mode'] = "development"
console.log(ThemeConfig.mode)
}
console.log(ThemeConfig.mode)
if (ThemeConfig.mode === "development") {
console.log("Joe3主题配置", ThemeConfig);

View File

@ -2,15 +2,23 @@
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<th:block th:fragment="donate">
<div class="joe_donate">
<i class="joe-font joe-icon-shang"></i>
<th:block th:if="${theme.config.post.qrcode_zfb != ''} or ${theme.config.post.qrcode_wx != ''}">
<ol class="joe_donate_list"
th:classappend="${theme.config.post.qrcode_zfb != '' && theme.config.post.qrcode_wx != '' ?'two':''}">
<th:block th:if="${theme.config.post.qrcode_zfb}">
<li><img th:src="${theme.config.post.qrcode_zfb}" alt="qrcode alipay"/></li>
<th:block th:if="${theme.config.post.qrcode_zfb} and ${#strings.trim(theme.config.post.qrcode_wx) != ''}">
<li>
<p>支付宝打赏</p>
<img th:src="${theme.config.post.qrcode_zfb}" alt="qrcode alipay"/></li>
</th:block>
<th:block th:if="${theme.config.post.qrcode_wx}">
<li><img th:src="${theme.config.post.qrcode_wx}" alt="qrcode weixin"/></li>
<th:block th:if="${theme.config.post.qrcode_wx} and ${#strings.trim(theme.config.post.qrcode_wx) != ''}">
<li>
<p>微信打赏</p>
<img th:src="${theme.config.post.qrcode_wx}" alt="qrcode weixin"/></li>
</th:block>
<th:block th:if="${theme.config.post.qrcode_qq} and ${#strings.trim(theme.config.post.qrcode_qq) != ''}">
<li>
<p>QQ打赏</p>
<img th:src="${theme.config.post.qrcode_qq}" alt="qrcode qq"/></li>
</th:block>
</ol>
</th:block>

View File

@ -76,9 +76,9 @@
</th:block>
<link rel="preload stylesheet" as="style" th:href="${source_link+'/assets/css/min/responsive.min.css?v='+theme.spec.version}">
<link rel="stylesheet" th:href="${source_link+'/assets/lib/fancybox/jquery.fancybox.min.css'}">
<link
<link th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline.waline_serverURL) !=''}"
rel="stylesheet"
href="https://unpkg.com/@waline/client@v2/dist/waline.css"
th:href="${theme.config.basic.waline.waline_css}"
/>
<th:block th:if="${ttheme.config.other.enable_clean_mode != true} and ${theme.config.theme.cursor_skin != 'off'}">
<link rel="stylesheet" th:href="${source_link+'/assets/cursor/style/min/'+theme.config.theme.cursor_skin+'.min.css'}">

View File

@ -4,26 +4,16 @@
<div class="joe_index__banner">
<div class="swiper">
<div class="swiper-wrapper">
<th:block th:each="bannerData : ${theme.config.carousel.banner_source}">
<th:block th:with="post = ${postFinder.getByName(bannerData.posts)}">
<div class="swiper-slide">
<a class="item"
th:classappend="${post.status.permalink !='' ? 'clickable': ''}"
th:href="${post.status.permalink !='' ? post.status.permalink : 'javascript:;'}" target="_blank" rel="noopener noreferrer nofollow">
<img width="100%" height="100%" class="thumbnail lazyload" th:data-src="${post.spec.cover ?: '/themes/theme-Joe3/assets/img/Joe3.png'}" th:src="${theme.config.carousel.banner_lazyload_img}" th:alt="${post.spec.title}">
<div class="title-row">
<h3 class="title">[[${post.spec.title}]]</h3>
<th:block th:if="${post.status.excerpt != ''}">
<p class="subtitle">[[${post.status.excerpt}]]</p>
<th:block th:each="banner_data : ${theme.config.carousel.banner_data_group}">
<th:block th:switch="${banner_data.banner_section_type}">
<th:block th:case="'post'">
<th:block th:include="~{modules/macro/banner_item_data :: data_by_post(post_metadata = ${banner_data.data_by_post})}" />
</th:block>
</div>
<th:block th:case="'custom'">
<th:block th:include="~{modules/macro/banner_item_data :: data_by_custom(banner_url = ${banner_data.data_by_custom.banner_url}, banner_cover = ${banner_data.data_by_custom.banner_img}, banner_title = ${banner_data.data_by_custom.banner_title}, banner_excerpt = ${banner_data.data_by_custom.banner_subtitle})}" />
</th:block>
</th:block>
<i class="joe-font joe-icon-zhifeiji"></i>
</a>
</div>
</th:block>
</th:block>
</div>
<th:block th:if="${theme.config.carousel.enable_banner_pagination}">

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="data_by_post(post_metadata)">
<div class="swiper-slide" th:with="post = ${postFinder.getByName(post_metadata)}">
<a class="item"
th:classappend="${post.status.permalink !='' ? 'clickable': ''}"
th:href="${post.status.permalink !='' ? post.status.permalink : 'javascript:;'}" target="_blank" rel="noopener noreferrer nofollow">
<img width="100%" height="100%" class="thumbnail lazyload" th:data-src="${post.spec.cover ?: '/themes/theme-Joe3/assets/img/Joe3.png'}" th:src="${theme.config.carousel.banner_lazyload_img}" th:alt="${post.spec.title}">
<div class="title-row">
<h3 class="title">[[${post.spec.title}]]</h3>
<th:block th:if="${post.status.excerpt != ''}">
<p class="subtitle">[[${post.status.excerpt}]]</p>
</th:block>
</div>
<i class="joe-font joe-icon-zhifeiji"></i>
</a>
</div>
</th:block>
<th:block th:fragment="data_by_custom(banner_url, banner_cover, banner_title, banner_excerpt)">
<div class="swiper-slide">
<a class="item"
th:classappend="${banner_url !='' ? 'clickable': ''}"
th:href="${banner_url !='' ? banner_url : 'javascript:;'}" target="_blank" rel="noopener noreferrer nofollow">
<img width="100%" height="100%" class="thumbnail lazyload" th:data-src="${banner_cover ?: '/themes/theme-Joe3/assets/img/Joe3.png'}" th:src="${theme.config.carousel.banner_lazyload_img}" th:alt="${banner_title}">
<div class="title-row">
<h3 class="title">[[${banner_title}]]</h3>
<th:block th:if="${banner_excerpt != ''}">
<p class="subtitle">[[${banner_excerpt}]]</p>
</th:block>
</div>
<i class="joe-font joe-icon-zhifeiji"></i>
</a>
</div>
</th:block>
</html>

View File

@ -5,26 +5,26 @@
<div class="box_title">
<h2>评论区</h2>
</div>
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline_serverURL) ==''}">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline.waline_serverURL) ==''}">
<halo:comment
group="content.halo.run"
th:attr="name=${name},kind=${kind}"
colorScheme="document.documentElement.getAttribute('data-mode')"
/>
</th:block>
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline_serverURL) !=''}">
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline.waline_serverURL) !=''}">
<div id="waline"></div>
<style>
#waline .wl-count{color:var(--routine);}
</style>
<script type="module" th:inline="javascript">
import { init } from 'https://unpkg.com/@waline/client@v2/dist/waline.mjs';
import { init } from /*[[${theme.config.basic.waline.waline_js_comment}]]*/'';
init({
el: '#waline',
dark: 'html[data-mode="dark"]',
serverURL: /*[[${theme.config.basic.waline_serverURL}]]*/'',
serverURL: /*[[${theme.config.basic.waline.waline_serverURL}]]*/'',
comment: true,
requiredMeta:['nick', 'mail'],

View File

@ -23,16 +23,16 @@
<ul class="items">
<li>[[${#dates.format(post.spec.publishTime,'yyyy-MM-dd')}]]</li>
<li><i class="joe-font joe-icon-eye"></i>[[${post.stats.visit}]]</li>
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline_serverURL) ==''}">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline.waline_serverURL) ==''}">
<li><i class="joe-font joe-icon-message"></i>[[${post.stats.comment}]]</li>
</th:block>
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline_serverURL) !=''}">
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline.waline_serverURL) !=''}">
<li><i class="joe-font joe-icon-message"></i><span class="waline-comment-count" th:data-path="${post.status.permalink}">0</span></li>
<script type="module" th:inline="javascript">
import { commentCount } from 'https://unpkg.com/@waline/client@v2/dist/comment.mjs';
import { commentCount } from /*[[${theme.config.basic.waline.waline_js_list}]]*/'';
commentCount({
serverURL: /*[[${theme.config.basic.waline_serverURL}]]*/'',
serverURL: /*[[${theme.config.basic.waline.waline_serverURL}]]*/'',
path:/*[[${post.status.permalink}]]*/'' ,
// 可选的,用于自定选择器,默认为 `'.waline-pageview-count'`

View File

@ -43,9 +43,9 @@
<!--相册-->
<th:block th:if="${htmlType == 'photos'}">
<script th:src="${source_link+'/assets/lib/justifiedGallery/justifiedGallery.min.js'}"></script>
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
<script src="https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js"></script>
<script src="https://unpkg.com/imagesloaded@5/imagesloaded.pkgd.min.js"></script>
<script th:src="${source_link+'/assets/lib/masonry/masonry.pkgd.min.js'}"></script>
<script th:src="${source_link+'/assets/lib/masonry/isotope.pkgd.min.js'}"></script>
<script th:src="${source_link+'/assets/lib/masonry/imagesloaded.pkgd.min.js'}"></script>
</th:block>

View File

@ -15,7 +15,7 @@
weather_key : /*[[${theme.config.blogger.weather_key}]]*/ '',
link_behavior : /*[[${theme.config.theme.link_behavior}]]*/ 'default',
enable_tag_cloud : true,
tag_cloud_type : /*[[${theme.config.aside.tag_cloud_type}]]*/ '3d',
tag_cloud_type : document.getElementById('tags-3d') ? '3d' : 'list',
enable_fixed_header : /*[[${theme.config.navbar.enable_fixed_header}]]*/ true,
enable_clean_mode : /*[[${theme.config.other.enable_clean_mode}]]*/ false,
cursor_effect : /*[[${theme.config.theme.cursor_effect}]]*/ 'off',

View File

@ -3,40 +3,40 @@
<th:block th:fragment="enable_blogger">
<th:block th:replace="~{modules/common/blogger :: blogger}" />
</th:block>
<th:block th:fragment="enable_notice">
<th:block th:fragment="enable_notice(notice_data)">
<section class="joe_aside__item notice">
<div class="joe_aside__item-title">
<!-- <#&#45;&#45; <i class="joe-font joe-icon-speaker"></i> &ndash;&gt;-->
<th:block th:replace="~{modules/macro/speaker :: speaker}" />
<span class="text">公告信息</span>
<span class="text">[[${notice_data.notice_title}]]</span>
</div>
<div class="joe_aside__item-contain">
<div class="notice_content" th:utext="${theme.config.aside.site_notice}"></div>
<div class="notice_content" th:utext="${notice_data.site_notice}"></div>
</div>
</section>
</th:block>
<th:block th:fragment="enable_qrcode">
<th:block th:fragment="enable_picture(pic_data)">
<section class="joe_aside__item qrcode">
<div class="joe_aside__item-title">
<i class="joe-font joe-icon-qrcode"></i>
<span class="text">[[${theme.config.aside.qrcode_title}]]</span>
<span class="text">[[${pic_data.qrcode_title}]]</span>
</div>
<div class="joe_aside__item-contain">
<img class="qrcode_img lazyload" th:src="${theme.config.aside.qrcode_url}" th:data-src="${theme.config.aside.qrcode_url}" alt="二维码"/>
<th:block th:if="${theme.config.aside.qrcode_description != ''}">
<p class="qrcode_description">[[${theme.config.aside.qrcode_description}]]</p>
<img class="qrcode_img lazyload" th:src="${pic_data.qrcode_url}" th:data-src="${pic_data.qrcode_url}" th:alt="${pic_data.qrcode_title}"/>
<th:block th:if="${pic_data.qrcode_description != ''}">
<p class="qrcode_description">[[${pic_data.qrcode_description}]]</p>
</th:block>
</div>
</section>
</th:block>
<th:block th:fragment="enable_music_player">
<th:block th:if="${theme.config.aside.music_id != ''}">
<th:block th:fragment="enable_music_player(music_data)">
<th:block th:if="${music_data.music_id != ''}">
<section class="joe_aside__item timelife">
<div class="joe_aside__item-title">
<i class="joe-font joe-icon-yinfu"></i>
<span class="text">我的歌单</span>
</div>
<div id="aplayer" class="aplayer" th:data-id="${theme.config.aside.music_id}" list-max-height="20px" data-server="netease" data-type="playlist" data-fixed="false" data-listfolded="true" data-order="random" data-mode="#f3f3f7"></div>
<div id="aplayer" class="aplayer" th:data-id="${music_data.music_id}" list-max-height="20px" data-server="netease" data-type="playlist" data-fixed="false" data-listfolded="true" data-order="random" data-mode="#f3f3f7"></div>
</section>
</th:block>
</th:block>
@ -52,7 +52,7 @@
<div class="joe_aside__item-contain"></div>
</section>
</th:block>
<th:block th:fragment="show_newreply">
<th:block th:fragment="show_newreply(new_reply_data)">
<th:block th:if="${theme.config.other.enable_clean_mode !=true}">
<section class="joe_aside__item newreply">
<div class="joe_aside__item-title">
@ -61,9 +61,9 @@
</div>
<ul class="joe_aside__item-contain"
th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline_serverURL) ==''}">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline_serverURL) ==''}"
th:each="result : ${commentFinder.list(null,1,theme.config.aside.show_newreply_num)}">
th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline.waline_serverURL) ==''}">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline.waline_serverURL) ==''}"
th:each="result : ${commentFinder.list(null,1,new_reply_data.show_newreply_num)}">
<li class="item">
<div class="user">
<img width="35" height="35" class="avatar lazyload" th:data-src="${result.owner.avatar ?: '/themes/theme-Joe3/assets/img/peeps-avatar.png'} " th:src="${theme.config.blogger.lazyload_avatar}" alt="头像">
@ -109,7 +109,7 @@
</th:block>
</ul>
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline_serverURL) !=''}">
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline.waline_serverURL) !=''}">
<ul class="joe_aside__item-contain" id="waline-recent">
</ul>
<style>
@ -119,13 +119,13 @@
max-width: 100%;}
</style>
<script type="module" th:inline="javascript">
import { RecentComments } from 'https://cdn.jsdelivr.net/npm/@waline/client/dist/waline.mjs';
import { RecentComments } from /*[[${theme.config.basic.waline.waline_js_leaving}]]*/'';
RecentComments({
serverURL: /*[[${theme.config.basic.waline_serverURL}]]*/'',
count: /*[[${theme.config.aside.show_newreply_num}]]*/5,
serverURL: /*[[${theme.config.basic.waline.waline_serverURL}]]*/'',
count: /*[[${new_reply_data.show_newreply_num}]]*/5,
}).then(({ comments }) => {
document.getElementById('waline-recent').innerHTML = comments.data.map(
document.getElementById('waline-recent').innerHTML = comments.map(
(comment) =>{
const commentContent = document.createElement('div');
let commentText =''
@ -171,7 +171,7 @@
</section>
</th:block>
</th:block>
<th:block th:fragment="enable_tag_cloud">
<th:block th:fragment="enable_tag_cloud(tag_cloud_data)">
<section class="joe_aside__item tags-cloud" id="tags-cloud">
<div class="joe_aside__item-title">
<i class="joe-font joe-icon-tag"></i>
@ -182,7 +182,7 @@
</div>
<div class="joe_aside__item-contain">
<div th:class="'tags-cloud-list '+${theme.config.aside.tag_cloud_width =='responsive' ? 'responsive':'static'}" th:style="${theme.config.aside.tag_cloud_type == '3d' ? 'display:none':''}">
<div th:class="'tags-cloud-list '+${tag_cloud_data.tag_cloud_width =='responsive' ? 'responsive':'static'}" th:style="${tag_cloud_data.tag_cloud_type == '3d' ? 'display:none':''}">
<th:block th:with="tags = ${tagFinder.listAll()}">
<a th:each="tag : ${tags}"
@ -190,7 +190,7 @@
</th:block>
</div>
<th:block th:if="${theme.config.aside.tag_cloud_type == '3d'}">
<th:block th:if="${tag_cloud_data.tag_cloud_type == '3d'}">
<div id="tags-3d">
<div class="empty">加载中…</div>
</div>
@ -202,9 +202,18 @@
<!--</@tagTag>-->
</section>
</th:block>
<th:block th:fragment="enable_ads_aside">
<th:block th:if="${theme.config.ads.enable_aside_ads} and ${#strings.trim(theme.config.ads.aside_ads_img) !=''}">
<th:block th:replace="~{modules/ads/ads_aside :: ads_aside(ads_url=${theme.config.ads.aside_ads_url}, ads_img=${theme.config.ads.aside_ads_img})}" />
<th:block th:fragment="enable_ads_aside(ads_data)">
<th:block th:switch="${ads_data.aside_ads_type}">
<th:block th:case="'img'">
<th:block th:if="${#strings.trim(ads_data.aside_ads_img) !=''}">
<th:block th:replace="~{modules/ads/ads_aside :: ads_aside_img(ads_url=${ads_data.aside_ads_url}, ads_img=${ads_data.aside_ads_img})}" />
</th:block>
</th:block>
<th:block th:case="'code'">
<th:block th:replace="~{modules/ads/ads_aside :: ads_aside_code(ads_code = ${ads_data.aside_ads_code})}" />
</th:block>
</th:block>
</th:block>
</html>

View File

@ -97,7 +97,7 @@
</style>
<script type="module" th:inline="javascript">
import { init } from 'https://unpkg.com/@waline/client@v2/dist/waline.mjs';
import { init } from /*[[${theme.config.basic.waline.waline_js_comment}]]*/'';
init({
el: /*[[${'#'+moment.metadata.name}]]*/'',

View File

@ -20,7 +20,8 @@
<img width="35" height="35" class="avatar lazyload" th:data-src="${theme.config.blogger.avatar}" th:src="${theme.config.blogger.lazyload_avatar}" th:alt="${moment.owner.displayName}">
<div class="meta">
<div class="author">
<a class="link" th:href="@{authors}+'/'+${moment.owner.name}" th:title="${moment.owner.displayName}">[[${moment.owner.displayName}]]</a>
<a class="link" th:href="${site.url}" th:title="${theme.config.blogger.nickname ?: site.title}">[[${theme.config.blogger.nickname ?: site.title}]]</a>
<!-- 修改链接指向博客地址 title 和 显示为博主名/博客名 -->
</div>
<div class="item">
<span class="text">[[${theme.config.blogger.motto?:'一句话介绍自己吧!'}]]</span>
@ -98,7 +99,7 @@
</style>
<script type="module" th:inline="javascript">
import { init } from 'https://unpkg.com/@waline/client@v2/dist/waline.mjs';
import { init } from /*[[${theme.config.basic.waline.waline_js_comment}]]*/'';
init({
el: /*[[${'#'+moment.metadata.name}]]*/'',

View File

@ -25,10 +25,10 @@
<div class="item">
<span class="text">[[${#dates.format(singlePage.spec.publishTime,'yyyy-MM-dd')}]]</span>
<span class="line">/</span>
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline_serverURL) ==''}">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline.waline_serverURL) ==''}">
<span class="text">[[${singlePage.stats.comment}]] 评论</span>
</th:block>
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline_serverURL) !=''}">
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline.waline_serverURL) !=''}">
<span class="text waline-comment-count" th:data-path="@{${singlePage.status.permalink}}">0</span>&nbsp;评论
</th:block>
<span class="line">/</span>
@ -52,7 +52,7 @@
<article th:class="'joe_detail__article animated fadeIn '+${#annotations.getOrDefault(singlePage, 'img_align', 'center')+'-img'}"
th:classappend="|${#annotations.getOrDefault(singlePage, 'enable_read_limit', 'false') == 'true' ?'limited': ''} ${(#annotations.getOrDefault(singlePage, 'enable_copy', 'true') == 'false' or theme.config.post.enable_copy != true) ? 'uncopy' : ''} ${theme.config.post.enable_indent ? 'indent':''} ${(theme.config.code_block.enable_code_line_number == true and theme.config.code_block.enable_code_newline !=true) ? 'line-numbers':''} ${theme.config.code_block.enable_single_code_select == true ? 'single_code_select': ''}|">
<div class="joe_leaving tpl">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline_serverURL) ==''}">
<th:block th:if="${theme.config.basic.comment_option == 'default'} or ${#strings.trim(theme.config.basic.waline.waline_serverURL) ==''}">
<ul class="joe_leaving-list">
<li th:each="result : ${commentFinder.list(null,1,20)}" class="item">
@ -69,7 +69,7 @@
</ul>
</th:block>
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline_serverURL) !=''}">
<th:block th:if="${theme.config.basic.comment_option == 'waline'} and ${#strings.trim(theme.config.basic.waline.waline_serverURL) !=''}">
<ul class="joe_leaving-list" id="waline-leaving">
</ul>
<style>
@ -78,36 +78,34 @@
height: 24px;
max-width: 100%;}
</style>
<script type="module" th:inline="javascript">
import { RecentComments } from 'https://cdn.jsdelivr.net/npm/@waline/client/dist/waline.mjs';
const url = /*[[${theme.config.basic.waline_serverURL+'/api/comment?type=count'}]]*/'';
let countNum = 0;
fetch(url).then(async (response) => {
const data = await response.json();
countNum = data.data;
});
<script type="module" th:inline="javascript">
import { RecentComments } from /*[[${theme.config.basic.waline.waline_js_leaving}]]*/'';
const serverURL = /*[[${theme.config.basic.waline.waline_serverURL}]]*/'';
const path = window.location.pathname;
RecentComments({
serverURL: /*[[${theme.config.basic.waline_serverURL}]]*/'',
count: countNum,
}).then(({ comments }) => {
const url = serverURL + '/api/comment?path=' + path + '&pageSize=100';
document.getElementById('waline-leaving').innerHTML = comments.data.map(
(comment) =>{
const timestamp = new Date(comment.time);
fetch(url)
.then(async (response) => {
const data = await response.json();
console.log(data.data.data)
const comments = data.data.data;
document.getElementById('waline-leaving').innerHTML = comments.map(
(comment) =>{
const timestamp = new Date(comment.time);
// 获取年、月、日、时、分、秒
const year = timestamp.getFullYear();
const month = timestamp.getMonth() + 1; // 月份是从0开始的所以要加1
const day = timestamp.getDate();
const hours = timestamp.getHours();
const minutes = timestamp.getMinutes();
const seconds = timestamp.getSeconds();
// 获取年、月、日、时、分、秒
const year = timestamp.getFullYear();
const month = timestamp.getMonth() + 1; // 月份是从0开始的所以要加1
const day = timestamp.getDate();
const hours = timestamp.getHours();
const minutes = timestamp.getMinutes();
const seconds = timestamp.getSeconds();
// 构建日期时间字符串
const commentTime = `${year}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day} ${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
// 构建日期时间字符串
const commentTime = `${year}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day} ${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
return `<li class="item">
return `<li class="item">
<div class="user">
<img class="avatar lazyload" src="${ThemeConfig.lazyload_avatar}" alt="用户头像"
data-src="${comment.avatar}" />
@ -119,14 +117,16 @@
</div>
</li>`;
}).join('');
const leaving =document.createElement('script')
leaving.src = /*[[@{/assets/js/min/leaving.min.js}]]*/''
leaving.type= 'module'
document.body.appendChild(leaving)
}).join('');
const leaving =document.createElement('script')
leaving.src = /*[[@{/assets/js/min/leaving.min.js}]]*/''
leaving.type= 'module'
document.body.appendChild(leaving)
});
</script>
});
</script>
</th:block>

View File

@ -78,7 +78,7 @@
</style>
<script type="module" th:inline="javascript">
import { init } from 'https://unpkg.com/@waline/client@v2/dist/waline.mjs';
import { init } from /*[[${theme.config.basic.waline.waline_js_comment}]]*/'';
init({
el: '#waline',

View File

@ -88,8 +88,9 @@
</div>
</th:block>
</div>
<th:block th:if="${theme.config.ads.enable_post_ads_top} and ${#strings.trim(theme.config.ads.post_ads_top_img) !=''}">
<th:block th:replace="~{modules/ads/ads_post :: ads_post(ads_url=${theme.config.ads.post_ads_top_url}, ads_img=${theme.config.ads.post_ads_top_img})}" />
<th:block th:if="${theme.config.ads.enable_ads_top != 'none'} and ${not #lists.isEmpty(theme.config.ads.ads_top)}"
th:each="ads_data : ${theme.config.ads.ads_top}">
<th:block th:replace="~{modules/ads/ads_post :: ads_post(kind = ${theme.config.ads.enable_ads_top}, data = ${ads_data})}" />
</th:block>
<article th:class="'joe_detail__article animated fadeIn '+${#annotations.getOrDefault(post, 'img_align', 'center')+'-img'}"
th:classappend="|${#annotations.getOrDefault(post, 'enable_read_limit', 'false') == 'true' ?'limited': ''} ${(#annotations.getOrDefault(post, 'enable_copy', 'true') == 'false' or theme.config.post.enable_copy != true) ? 'uncopy' : ''} ${theme.config.post.enable_indent ? 'indent':''} ${(theme.config.code_block.enable_code_line_number == true and theme.config.code_block.enable_code_newline !=true) ? 'line-numbers':''} ${theme.config.code_block.enable_single_code_select == true ? 'single_code_select': ''}|">
@ -113,9 +114,10 @@
</div>
<th:block th:replace="~{modules/post_operate :: post_operate}" />
<th:block th:replace="~{modules//macro/post_copyright :: post_copyright}" />
<th:block th:if="${theme.config.ads.enable_post_ads_bottom} and ${#strings.trim(theme.config.ads.post_ads_bottom_img) !=''}">
<th:block th:replace="~{modules/ads/ads_post :: ads_post(ads_url=${theme.config.ads.post_ads_bottom_url}, ads_img=${theme.config.ads.post_ads_bottom_img})}" />
</th:block>
<th:block th:if="${theme.config.ads.enable_ads_bottom != 'none'} and ${not #lists.isEmpty(theme.config.ads.ads_bottom)}"
th:each="ads_data : ${theme.config.ads.ads_bottom}">
<th:block th:replace="~{modules/ads/ads_post :: ads_post(kind = ${theme.config.ads.enable_ads_bottom}, data = ${ads_data})}" />
</th:block>
</div>
<th:block th:replace="~{modules/post_operate_aside :: post_operate_aside}" />

View File

@ -3,18 +3,18 @@ kind: Theme
metadata:
name: theme-Joe3
spec:
displayName: Theme Joe3
displayName: Theme Joe3 ZBlog
author:
name: Jiewenhuang
website: "https://halo.run"
description: Halo2.0主题 Joe3
description: Halo2.0主题 Joe3 ZBlog专版
logo: "https://wmimg.com/i/70/2023/08/64d3c41d5bde2.webp"
website: "https://www.jiewen.run"
repo: "https://github.com/jiewenhuang/halo-theme-joe3.0"
settingName: "theme-Joe-setting"
configMapName: "theme-Joe-configMap"
version: "1.1.6"
require: ">=2.8.0"
version: "1.1.7"
require: ">=2.11.0"
customTemplates:
page:
- name: 留言板