Code Monkey home page Code Monkey logo

halo-theme-joe2.0's Introduction

 


halo-theme-joe2.0

Joe 主题 Halo 移植版

Halo Release Release License

Joe2.0Typecho Themes Joe 主题的 Halo 版,由于 社区 之前有兄弟移植过,这次就叫 Joe2.0 吧,此次在原版主题上做了不少修改和适配,由原版的 php 模板调整为 freemarker, 移除了平台无关的特性,同时增加了一些平台特定的配置,保持灵活性的同时最大限度的移植了原版功能,希望大家喜欢 ❤️
🌸 同时也要在此感谢原作者 Joe,欢迎大家加入 Joe2.0 交流群:850501175


📗 使用文档


效果图 👇

效果图


🌈 安装 & 更新

安装前请确保 Halo版本 和主题的兼容性,V1.0.10 及以上版本仅支持 Halo 1.5+,以下版本兼容到 Halo 1.4.11,请知悉。

  1. 复制主题仓库地址 https://github.com/qinhua/halo-theme-joe2.0.git

  2. 进入博客后台管理 外观-主题-安装-远程下载,贴入仓库地址进行安装(建议直接使用最新版本 )。 如果在线安装失败(大概率失败 😆 ),那就选择 本地上传,到主题 Release 页面下载指定版本主题压缩包,并上传上去(务必在 Release 页面下载压缩包,否则可能出现资源加载出错的问题);

  3. 等待提示安装完成即可;

  4. 更新主题时,建议直接通过 外观-主题-Joe2.0-更多-从主题包更新 把下载好的 zip 包上传上去,然后 先切换到其他主题,再切回本主题,并进入主题设置执行一次保存,最后强刷前端页面即可(这里切主题主要是为了避免有时候主题状态未激活和缓存的问题)。

如果 github 访问不了,可以访问 gitee 仓库:https://gitee.com/duider/halo-theme-joe2.0

⚠️ 必读

  1. 安装主题后请务必到 后台管理 - 博客设置 - 高级选项 中开启 API服务 并配置 Access keyjoe2.0(切记要和主题设置中的 AccessKey 一致),不然部分用到 Content API 的页面会请求失败并报错。(请参考以下报错)
“API has been disabled by blogger currently” —— 后台管理中未开启API服务
“API access key is mismatch” —— 主题中的 AccessKey 和后台管理中的不一致

配置AccessKey

  1. 如果后台管理中之前已经配置了其它的 Access Key(内容不是 joe2.0),那么需要你到本主题设置中的 基本设置-AccessKey<必填> 同步一下这个 Access key,保证两部一致即可(切记一致才行,且不要填写中文或特殊字符)。

  2. 有时,主题升级后配置项变化较大,直接访问博客可能会报错,导致页面渲染不出来。此时,只需要进入当前主题的设置界面执行一下保存操作来更新旧的配置,然后再访问页面即可;

  3. 有时,明明已经提示主题更新成功了,但访问博客时页面还是加载的旧版本的文件,可能是由于 主题激活状态不正常主题缓存的问题 导致的。此时,只需要先启用其他主题再启用本主题即可,建议每次更新主题之后都做一下这个操作(目前后台管理系统还不太完善)。还有就是如果你配置了 CDN 服务,记得清理相应节点的缓存,让它回源取最新资源。

  4. 强烈建议 每次更新主题后,务必先清空一下浏览器缓存,保证加载的资源都是最新版本的,并到主题设置中执行一次保存,保证配置项是最新的,不然可能有各种报错(你可以通过 Ctrl + F5 强制刷新或者 Ctrl + Shift + DEL 清空浏览器所有缓存)。

  5. 最后,建议大家在 后台管理-系统-博客设置-高级选项-其他设置 中开启 全局绝对路径


🔧 主题配置

此次修改对外暴露了大量的设置项,主要是为了最大程度方便用户对博客进行配置,详细设置项请参见主题根目录下的 settings.yaml 文件。

主题配置


⭐️ 主题功能

此次在功能上做了大量移植,在尽量不破坏原主题风格的情况下,加入了 halo 主题常见的配置项,也融入了一些自己的改进 🤔。 具体功能请在 后台 -> 外观 -> 主题 -> 设置 中进行配置,配置项已按不同场景分类,便于快速查找。

  • 浅色/暗黑模式
  • 三级导航
  • 轮播图 <可配置数据源>
  • 精品分类 <可配置数据源>
  • 自定义主题色
  • 自定义字体
  • 自定义背景图
  • 自定义社交渠道
  • 归档页定制<按年/月统计>
  • 日志页面定制
  • 文章分享
  • Toc 目录 <可通过文章设置单独控制>
  • 代码高亮 + 行号 + 复制 + 折叠
  • 文章和日志页 点赞 + 评论
  • 文章页 a 标签新页面打开
  • 文章页复制加版权文字
  • 文章内容评论后可见
  • 播放器插件/B 站视频
  • PDF 插件
  • 留言页面
  • 网易歌单
  • 博主可选头像框
  • 博主等级展示
  • 全局预载图自定义
  • 缺省图片配置
  • 每日一句
  • 百度收录查询 + 主动推送
  • 页面加载条
  • 离屏提醒
  • 网站公告
  • 二维码模块
  • 3D 标签云
  • 看板娘
  • 图库页面定制
  • 自定义邮件模板
  • 空白页模板
  • 社交账号配置
  • 二维码打赏
  • 广告配置 <侧边栏 + 文章页>
  • 页面元数据控制
  • 自定义 JS/CSS
  • 自定义 favicon <支持视频、动图>
  • 站点运行时间
  • 绿色模式 <备案模式>
  • 灰色模式 <RIP 模式>

✨ 改进点

  • meta 标签优化
  • ftl 模板格式化
  • 导航栏优化
  • 页脚调整
  • 评论组件定制
  • SEO 优化
  • 样式优化
    • 使用 Less
    • 根据主题模式调整了部分配色
    • 优化 z-index 属性
    • 滚动优化
  • 代码优化
  • 代码风格
    • Eslint + Stylelint
  • JS 和 CSS 兼容性处理
    • JS 使用 Babel 转换
    • CSS 引入 autoprefixer
  • 页面性能优化
    • 按需引入
    • 图片懒加载
    • DNS 预解析
    • Gzip
  • 加载状态优化
    • 加载条
    • 预载图
    • 错误图
    • 空白状态
  • 404 页面
  • 去除无用配置
  • 项目目录调整
    • 简化目录
  • 部分缺陷修复
  • 解析主题配置项

📃 TODO

目前仍有部分功能不完善,暂时没时间做或受限,后面继续迭代。

  • 欢迎页面
  • 统计页面
  • 集成统计插件
  • 视频背景
  • 相册页优化
  • 升级评论组件(头像保存等)
  • 自定义模板引擎
  • 字号调整
  • Pjax
  • 博客备份

📈 项目状态

项目状态


📚 开发指南

1、推荐使用 VSCode 开发,首先安装 EasyLess 插件来转换并压缩 less 文件,保存时会自动生成 *.min.css 文件,配置如下:

"less.compile": {
    "out": "./min/",
    "outExt": ".min.css",
    "compress": true,
    "sourceMap": false,
    "autoprefixer": "> 2%, last 2 versions, not ie 6-9"
  }

2、安装 JS & CSS Minifier 插件来转换并压缩 js 文件,保存时会自动生成 *.min.js 文件,配置如下:

  "es6-css-minify.js": {
    "mangle": false,
    "compress": {
      "unused": true
    },
    "output": {
      "quote_style": 0
    },
    "warnings": true
  },
  // 保存时自动生成,no 为手动,可点击编辑器底部 Minify 按钮生成
  "es6-css-minify.minifyOnSave": "yes",
  "es6-css-minify.jsMinPath": "/source/js/min"

3、转换并压缩 ES6+ 代码(前 2 步里的 js 没有经过 babel 编译,只可用于开发环境):

  • 安装 nodejs
  • 主题目录下执行 npm i 安装依赖;
  • 执行 npm run build 即可在相应目录生成可用于生产环境的 js 和 css 文件。

🔍 代码规范

项目默认配置了 huskylint-staged,在 commit 阶段通过 eslintstylelint 对代码进行自动格式化,然后打包,保证最终提交代码的规范性。


🤔 常见问题

主要是一些开发及使用过程中暴露出来的问题,在这里统一列出来方便大家查阅。

1、如何获取当前主题的配置信息?

可以通过 window.ThemeConfig 直接获取。

2、如何自定义导航条菜单图标?

主题自身已经引入了部分 iconfont 图标,你可以直接用(全在这里),如果想在这个基础上增加图标,可联系我加入该项目的图标组,加入后即可获取最新的字体链接进行替换(template/module/link.ftl 中第 25 行)。iconfont 使用方式如下:
> (目前主题菜单只支持字体图标,若要用图片请自行修改代码)

<i class="joe-font joe-icon-xxx"></i>

菜单图标配置

如果你要用自己的图标,请往下看:

  • 首先通过 iconfont 获取自己的图标链接,也可以用 fontawesome 的字体,注意要使用 font-class 类型,最后得到这种地址://at.alicdn.com/t/font_2788564_1f1rnuqwnzj.css

  • 通过 管理后台-外观-主题-Joe2.0-设置-自定义,将图标地址贴入 字体图标链接 中并保存;

  • 通过 管理后台-外观-菜单,为相关菜单添加图标,也就是字体图标的类名,类似如下这种(字体名称 + 图标名称,具体以你生成时的字体名为准),记得保存;

    iconfont icon-home
    
  • 最后,重新进入你的博客即可看到效果。

3、如何配置多级菜单?

Halo 后台目前支持配置 3 级及以上的菜单,当前主题已支持最多 3 级菜单。你需要到 管理后台-外观-菜单 中先建好要用的菜单,然后使用鼠标拖拽相应菜单,调整到你想要的顺序和结构(上下拖动是排序,左右拖动是改变层级,多尝试几次,不太灵敏)。

多级菜单

4、如果一个菜单有子菜单,如何禁止父菜单跳转?

  • 通过 管理后台-外观-菜单,设置相关菜单的地址为 #,保存即可,子菜单同理;

  • 最后,重新进入你的博客即可看到效果。

tips: 为了适配和展示效果,不建议添加过多菜单。目前最多可展示 3 级。

5、子菜单如何设置新页面打开?

通过 管理后台-外观-菜单,设置菜单的打开方式为 新页面,保存即可。

6、如何隐藏单个菜单?

有时你可能想临时隐藏某个菜单,但是不想删除(目前后台管理中并没提供隐藏功能)。

此时你可以通过 管理后台-外观-菜单,在相关菜单的标题前面添加 #hide 标志,然后保存即可(给父菜单添加后,子菜单也会隐藏)。

隐藏单个菜单

7、如何配置邮件服务?

Halo 已经提供好了邮件服务,我们只需要配置相关参数即可。请参见 《Halo 博客配置邮件通知服务》

8、如何添加留言页/空白页?

主题中的留言页面是自定义页面,所以需要你进入 后台管理-页面 ,点击 新建页面 添加留言页,记得填写 页面标题、别名,并选择自定义模板 leaving 进行发布。最后进入 外观-菜单 添加刚才自定义的留言页,保存后刷新前台页面即可,其它自定义页面同理。

目前支持的 自定义模板 有 3 种:

  • empty:完全空白不带任何资源的空页面,适合独立开发一个新页面的场景。
  • only_header_footer:仅包含导航条和页脚的空页面,适合在当前博客基础上进行开发的场景。
  • leaving:当前主题内已定制的 留言页 模板,可直接使用。

添加留言页

9、如何配置自定义轮播图数据?

目前主题中的轮播图支持 7 种数据来源,默认的手动模式需要我们自己配置数据,为了减少表单数量提高灵活性,使用了约定格式的方式来配置,具体规则如下:

  • 多个轮播图之间用 ===== 隔开
  • 属性之间用 -|||- 隔开
  • 为了美观,允许换行
  • 不需要跳转写 # 即可

🐧 请严格按照此格式或默认示例进行配置,否则可能导致网站崩溃,以下为示例,可复制到表单中编辑(首页精品分类 同理):

轮播1标题
-|||-
轮播1副标题
-|||-
轮播1图片链接
-|||-
轮播1跳转链接
=====
轮播2标题
-|||-
轮播2副标题
-|||-
轮播2图片链接
-|||-
#

10、修改主题中的 CSS 或 JS 后页面为什么还是引入的旧文件?

目前主题静态资源默认从源站加载,也可以配置 CDN

  • 请先确认 是否是浏览器缓存 导致的,清除下缓存试试;
  • 检查 修改的文件是否是实际加载的文件,生产环境的 js 文件对应 source/js/min 目录,css 文件对应 source/css/min 目录
  • 检查是否在主题设置中配置了 自定义CDN域名,如果配置了,可能是由于 CDN 节点缓存导致的,可以选择自行刷新目录缓存,让它回源取最新资源,或者关闭 CDN 直接从源站获取静态资源。
<link
  rel="preload stylesheet"
  as="style"
  href="${BASE_RES_URL}/source/css/min/index.min.css?v=${theme.version!}"
/>

其中 ${BASE_RES_URL} 为静态资源域名,默认为 ${theme_base!},即主题目录,如果配置了 CDN,那就是 CDN 域名 + theme_base

11、如何通过元数据为页面进行单独的功能配置?

这里以文章详情页为例进行说明。

  • 很多时候,我们希望能够单独控制文章详情页的功能,如分享、打赏、复制、点赞、评论、目录等。主题目前已经为文章详情页暴露了常用的元数据配置,具体大家可以查看 theme.yaml 文件中的 postMetaField 字段。(自定义页面对应字段 sheetMetaField

  • 如果想通过元数据来单独控制页面功能,可以到 后台管理-文章-所有文章 中找到要修改的文章,然后点击设置,再点击底部保存按钮旁的 高级,即可在弹框中对元数据进行配置,字段格式和主题配置是一致的,布尔值填 truefalse,都是字符串形式。

文章详情页元数据配置

🍢 具体元数据请参考下面的表格。

a、文章页元数据(postMetaField)
字段名 值类型 默认值 描述
enable_aside Boolean true 是否启用侧边栏
enable_page_meta Boolean true 是否展示页面元信息(即顶部的字数、阅读量等数据)
enable_passage_tips Boolean true 是否展示温馨提示
enable_collect_check Boolean true 是否启用百度收录检查
enable_read_limit Boolean false 是否开启评论后可见
use_raw_content Boolean false 是否渲染原始内容
enable_comment Boolean true 是否启用评论功能
enable_toc Boolean true 是否启用 Toc 目录
toc_depth Number 0 Toc 目录默认展开层级 0~6,对应标题层级 h1 ~ h6
img_align String "center" 图片对齐方式(left-左对齐;center-居中;right-右对齐)
img_max_width String "100%" 图片最大宽度
enable_copy Boolean true 是否允许复制内容
enable_donate Boolean true 是否启用打赏(必须配置好相应二维码)
enable_share Boolean true 是否启用分享
enable_like Boolean true 是否启用点赞
code_theme String “one-dark” 指定代码主题(默认和全局设置一致)
enable_fold_long_code Boolean true 是否开启长代码块自动折叠
enable_katex Boolean false 是否启用公式支持
b、自定义页元数据(sheetMetaField)
字段名 值类型 默认值 描述
enable_aside Boolean true 是否启用侧边栏
enable_page_meta Boolean true 是否展示页面元信息(即顶部的字数、阅读量等数据)
enable_collect_check Boolean true 是否启用百度收录检查
use_raw_content Boolean false 是否渲染原始内容
enable_comment Boolean true 是否启用评论功能
img_align String "center" 图片对齐方式(left-左对齐;center-居中;right-右对齐)
img_max_width String "100%" 图片最大宽度
enable_katex Boolean false 是否启用公式支持

12、如何支持数学公式和 Mermaid 图形?

主题已经提供了对 数学公式Mermaid图形 的支持,数学公式使用 Katex 进行渲染,默认为关闭状态,需要手动打开。

  • 必须先在 后台管理-外观-主题设置-文章页 中启用 数学公式支持
$\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$
$$\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.$$

对于要展示 时序图、UML类图、甘特图 等的场景,需要使用代码块包裹内容,并指定语言类型为 mermaid,Halo 会自动将它转换为 svg 给前台展示。(下面的示例是一个 UML类图,更多用法大家可以去 Mermaid 仓库 查看)。

```mermaid
classDiagram

Class01 <|-- AveryLongClass : Cool
<<interface>> Class01
Class09 --> C2 : Where am i?
Class09 --* C3
Class09 --|> Class07
Class07 : equals()
Class07 : Object[] elementData
Class01 : size()
Class01 : int chimp
Class01 : int gorilla
class Class10 {
  <<service>>
  int id
  size()
}
```

13、代码块如何设置自定义标题?

目前,代码块的标题来自我们设置的语言类型,如果未设置或者未匹配到语言,则显示 PlainText
然而,你可能想要自定义代码块的标题,这时只要在 markdown 中像下面这样使用代码块即可(语言类型和标题之间用 “|” 隔开):

```js|这是我的第一行代码
console.log("hello world!!!");
```

14、文章中如何插入网易云播放器?

主题已集成 APlayer,只需要在编辑文章时使用 joe-music 标签插入视频地址即可,它接受如下属性:

  • id:网易云歌单 ID 或 歌曲 ID(可从歌曲网址中获取)
歌单
<joe-mlist id="6800335663"></joe-mlist>
单曲
<joe-music id="1303046498"></joe-music>

15、文章中如何插入视频?

主题已集成 dplayer,只需要在编辑文章时使用 joe-dplayer 标签插入视频地址即可(建议 MP4 格式,其它格式未必支持,切记前后要空一行),它接受如下属性:

  • src:视频地址(必传)
  • width:阅读器宽度,默认为 100%
  • height:阅读器高度,默认 500px
<joe-dplayer src="https://xxx.mp4"></joe-dplyer>

如果你想嵌入 B站视频,可以使用 joe-bilibili 标签(切记前后要空一行),它接受如下属性(相关参数可以从视频地址中获取)。

  • bvid:视频的 id(必传)
  • page:视频的 page,即分页
  • width:阅读器宽度,默认为 100%
  • height:阅读器高度,默认 500px
<joe-bilibili bvid="BV12h411k7vr"></joe-bilibili>

16、文章中如何预览 PDF 文件?

主题已集成 PDF.js,可以渲染 pdf 文件,只需要在编辑文章时使用 joe-pdf 标签插入即可(切记前后要空一行),它接受如下属性:

  • src:PDF 文件地址(必传),不要过长,且不能包含 &、? 等特殊字符,若出现跨域问题需要自行解决
  • width:阅读器宽度,默认为 100%
  • height:阅读器高度,默认 500px
<joe-pdf src="https://xxx.pdf" width="100%" height="500px"></joe-pdf>

17、如何渲染原始内容?

主题默认对常用的 HTML 标签进行了样式美化,但有时候你可能不想应用这些样式。比如你想富文本内容中的样式能够原样展示,那么就需要用到这个标签来承载你的内容,该标签内的内容将 不会被外部样式和脚本污染,反之亦然。

<joe-raw-content>
  <div id="_raw">你的原始文本或html内容</div>
</joe-raw-content>

如果你在后台新建文章时,想直接用其它地方复制过来的富文本内容,那么需要你配置当前文章的元数据,把其中的 use-raw-content 的值改成 true。这样前台就会自动使用 joe-raw-content 这个标签去展示,但目前主题不支持解析富文本中的目录,请知悉。

18、如何设置文章仅评论后可见?

主题目前支持文章页的 评论后可见功能,只要在后台管理中发布文章时设置-元数据 enable_read_limittrue 即可。设置之后文章页默认只展示一屏高度的内容,剩余内容需要评论后才可见(如果文章内容小于一屏高度,则此功能会被忽略)。

评论后可见

19、如何区分不同的自定义页面?

有时候我们可能想在某一个自定义页面内部加入一些资源,单纯靠页面类型 sheet 无法进行区分。此时可以先进入 后台管理系统,并打开浏览器控制台,切换到 network-Fetch/XHR 这一栏,然后进入 页面-所有页面-自定义页面,此时控制面板中会出现相应的请求,查看数据获取页面对于的 id,这样我们就可以在模板中使用这个 id 区分不同的自定义页面了(可在 sheet.ftl 文件中通过 sheet.id 获取)。

自定义页面id

20、为什么评论头像不显示或加载出错?

目前主题内的头像使用了 gravatar 的头像服务,但是国内基本会被 GFW,所以会导致头像加载不出来。 此时,我们只需要去 后台管理-系统-博客设置-评论设置 中找到 Gravatar镜像源 更换可用的头像源即可,注意末尾要有 /

另外说明一点,基于普适性考虑,当前评论组件咱不支持保存头像,统一使用了随机的 gravatar 头,可以随时切换源。

21、如何配置自定义 CDN?

为了提升站点的访问速度,我们很快会想到接入 CDN 服务,本主题支持为静态资源配置自己的 CDN 域名,具体见下面步骤:

  • 首先,进入 后台管理-外观-主题设置-其它 一栏,找到 CDN 域名类型,并选择 自定义

  • 然后,在 自定义 CDN 域名 一栏填填入 配置好的可用的 CDN 域名(CDN 域名需要你先去开通 CDN 服务,如腾讯云、阿里云、七牛云等,然后按他们的文档配置),一般会把域名配置成 cdn.你的域名 这种形式,切记填写的时候要带上协议(如:https://cdn.bbchin.com);

  • 最后,去前台刷新页面,通过控制台观察静态资源是否通过自定义 CDN 加载(注意:请一定注意配置好 CDN 的缓存策略,不然后面主题文件更新后可能不会及时生效,必要时要手动清除)。

22、如何查看博客后台日志?

  • 有时博客访问不了,想查看后台日志,可以进入 后台管理-系统-小工具-实时日志 查看,生成环境可能需要先开启彩蛋(连续点击 Halo Dashboard 10 次触发),更多请参见 Halo 隐藏功能

  • 也可以登录服务器,直接执行命令 journalctl -n 20 -u halo,其中 20 是显示的日志行数。

23、登录页如何显示找回密码按钮?

有时候登录后台管理系统忘了密码,想找回密码,但是界面默认没有找回密码的按钮,需要用快捷键触打开。

  • Windows/Linux: Shift + Alt + h
  • maxOS: Shift + Command + h

24、如何修改/定制评论组件?

当前主题使用了定制的评论组件 halo-comment-joe2.0,有兴趣可以在此基础上继续定制,最后替换 source/lib/halo-comment 下的同名文件。

25、为何主题保存时提示服务器内部错误或失败?

这个问题的原因通常有下面这些:

  • 网络或接口响应慢导致超时失败;
  • 由于误操作(比如重复提交)导致主题配置重复,后台保存时不知道保存到哪里(这种情况需要你手动删除重复的配置)

26、为何上传主题包会失败?

这个有很多原因,常见的原因有如下这些:

  • 网络状况不好,导致上传超时(建议在网络稳定的情况下再试一次);
  • 附件大小超过了 Nginx 中上传文件的最大限制(即 client_max_body_size,你可以设置的大一点);
  • 后台解压时出错(这种情况建议手动用 FTP 工具上传主题文件夹到服务器 ~/.halo/template/themes/ 目录下,然后刷新主题页面)

27、FreeMarker 相关技巧

主要是本人在开发主题过程中收集的一些 Freemarker 知识,希望能帮到需要的人。请参见 FreeMarker 常用技巧


😈 小建议

1、开启防盗链

  • 很简单,直接在 nginx 里配一下就可以,不过记得添加白名单(如 logoavatar),配置如下:
# 资源防盗链(指定目录or指定文件类型)
# location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
location /upload/ {
  access_log off;
  # 域名白名单,去掉则阻止所有非本站请求
  valid_referers none blocked server_names *.bbchin.com 127.0.0.1 localhost ~\.google\. ~\.baidu\. ~\.qq\.;
  if ($invalid_referer) {
    rewrite ^/ https://cdn.jsdelivr.net/gh/qinhua/cdn_assets/img/robber.jpg;
  }
  proxy_pass http://127.0.0.1:8090;
}
  • 如果用到了 OSS 对象存储和 CDN,请务必在相关控制台中配置防盗链和策略,毕竟流量就是钱啊。

2、图片自动转 webp 格式

很多时候,站点会展示很多图片,比如文章封面、相册等,大量图片的加载会严重影响页面性能。在懒加载的基础上,我们最好能使用 webp 这种图片格式,因为它体积小很多(只是要考虑兼容性),但好在我们可以使用 webp_server_go 这个工具对全站图片自动进行 webp 化,提高加载速度。

这个工具会在我们请求图片时,在后台对图片进行转码压缩,并返回转换后的 webp 图片给前台,对于不兼容的浏览器,它会原样返回,保证正常展示。

具体使用请参考 如何无痛切换网站图片格式到 webp,当然,如果你使用其他云服务,他们本身已经提供了相关功能,可以直接在相关控制面板中开启,这里不再赘述。

3、配置合适的缓存策略

合理利用浏览器的缓存同样可以优化页面性能,提高加载速度,我们可以通过 Nginx 对相关资源的响应头进行配置,大致如下:

location / {
    gzip_static on; # 静态压缩
    add_header Cache-Control public,max-age=60,s-maxage=60; # 配置缓存
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8090;
}

📈 页面性能

在页面没有大量图片和特效的场景下,各项性能指标都还不错。数据来自 Chrome 浏览器中的 Lighthouse 工具,仅供参考用。

页面性能报告


🏭 贡献

如果你想帮助完善 Joe2.0 主题,请:

  • star
  • issue
  • bugs
  • pr

🙆‍♂️ 感谢

在此感谢以下项目提供的支持:


halo-theme-joe2.0's People

Contributors

mxlt02 avatar qinhua avatar ruibaby avatar yinweicheng001 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

halo-theme-joe2.0's Issues

评论无法添加空格

描述缺陷

在评论里按空格,不会输入空格,而是向下滚动

如何复现

复现步骤如下:

  1. 打开一篇文章
  2. 点击评论框
  3. 按空格
  4. 发生错误

期望结果
输入一个空格

实际结果结果
页面向下滚动,无法输入空格

报错

FreeMarker template error (DEBUG mode; use RETHROW in production!): Template inclusion failed (for parameter value "link.ftl"): There was an error loading the template on an earlier attempt; see cause exception. ---- FTL stack trace ("~" means nesting-related): - Failed at: #include "link.ftl" [in template "themes/joe2.0/common/header.ftl" in macro "head" at line 5, column 5] - Reached through: @headInfo.head title="首页" type="index" [in template "themes/joe2.0/index.ftl" at line 4, column 1] ---- Java stack trace (for programmers): ---- freemarker.core._MiscTemplateException: [... Exception message was already printed; see it above ...] at freemarker.core.Include.accept(Include.java:164) at freemarker.core.Environment.visit(Environment.java:383) at freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:889) at freemarker.core.Environment.invokeMacro(Environment.java:825) at freemarker.core.UnifiedCall.accept(UnifiedCall.java:84) at freemarker.core.Environment.visit(Environment.java:347) at freemarker.core.Environment.visit(Environment.java:353) at freemarker.core.Environment.process(Environment.java:326) at freemarker.template.Template.process(Template.java:383) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:391) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:304) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:255) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:179) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1396) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1141) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:497) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626) at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:228) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.security.filter.ContentFilter.doAuthenticate(ContentFilter.java:59) at run.halo.app.security.filter.AbstractAuthenticationFilter.doFilterInternal(AbstractAuthenticationFilter.java:229) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.filter.CorsFilter.doFilter(CorsFilter.java:53) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at run.halo.app.filter.LogFilter.doFilterInternal(LogFilter.java:40) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:602) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:516) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036) at java.base/java.lang.Thread.run(Unknown Source) Caused by: java.io.IOException: There was an error loading the template on an earlier attempt; see cause exception. at freemarker.cache.TemplateCache.newIOException(TemplateCache.java:485) at freemarker.cache.TemplateCache.throwLoadFailedException(TemplateCache.java:501) at freemarker.cache.TemplateCache.getTemplateInternal(TemplateCache.java:361) at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:292) at freemarker.template.Configuration.getTemplate(Configuration.java:2836) at freemarker.core.Environment.getTemplateForInclusion(Environment.java:2913) at freemarker.core.Include.accept(Include.java:162) ... 92 more Caused by: freemarker.core.ParseException: Syntax error in template "themes/joe2.0/common/link.ftl" in line 77, column 3: Encountered "", but at this place only this can be closed: "#macro or #function". This usually because of wrong nesting of FreeMarker directives, like a missed or malformed end-tag somewhere. (Note that FreeMarker end-tags must have # or @ after the / character.) Was expecting one of these patterns: <_INCLUDE> "${" "#{" "[=" at freemarker.core.FMParser.generateParseException(FMParser.java:6120) at freemarker.core.FMParser.jj_consume_token(FMParser.java:5979) at freemarker.core.FMParser.Macro(FMParser.java:2849) at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:3656) at freemarker.core.FMParser.MixedContentElements(FMParser.java:4019) at freemarker.core.FMParser.Root(FMParser.java:4665) at freemarker.template.Template.(Template.java:252) at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:548) at freemarker.cache.TemplateCache.getTemplateInternal(TemplateCache.java:439) ... 96 more

文章详情中内容会溢出

描述缺陷

在文章详情中插入代码段,如果代码段很长,就会溢出内容区域

如何复现

复现步骤如下:
新建一个博客,插入代码段,不指定代码类型,内容要足够的长,如:

http://localhost:9096/authorize?client_id=test_client_1&response_type=code&scope=all&state=xyz&redirect_uri=http://localhost:9093/cb

期望结果
给个默认的txt渲染或者别的类型的渲染

截图

image

PC 端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.13]
  • 操作系统:[e.g. MAC]
  • 浏览器:[e.g. chrome]

建议主题版本显示

大佬,晚上好!
建议在主题的这里加上版本号,这样更新后能直接看到当前主题的最新版本。

image

使用halo提供的hexo文章导入工具所导入的文章不能被ajax加载显示

描述缺陷

使用halo提供的hexo文章导入工具所导入的文章不能被ajax加载显示,而通过后台发布的文章没有问题
如果关闭ajax使用后台渲染文章则没有问题

截图

这是开启ajax的效果
image-20211130002634117
这是关闭ajax的效果
image-20211130003553834

PC 端 (请提供以下信息):

  • Halo 版本:1.4.13
  • 操作系统:win10
  • 浏览器:chrome

请问如何关闭看板娘

你的建议是否涉及到一些现有的问题? 请描述清楚

请问如何关闭看板娘?

描述你想实现的效果

后调配置关闭看板娘;移除相关代码配置

代码块主题库支持的语言比较少

问题

主题中依赖的代码块样式https://github.com/PrismJS/prism-themes 支持的语言比较少。
也就是Java,JavaScript,C,CSS,xml等等。

希望实现的效果

我添加Kotlin,Gradle,Groovy,DOS的脚本等 语言的代码,代码块样式就完全不支持了。显示的默认灰色

建议方案

建议可否替换为 https://highlightjs.org/库

这个库支持的代码可以说几乎全部都有了。

这个是这个库的样式的Demo:https://highlightjs.org/static/demo/

Content API 设置建议

image
建议将此处的Access key更换为用户后台的配置。不然那些使用了此Access key制作小程序的用户全都无法使用这个主题了。
image
可以考虑使用[开发者选项/系统变量]来自定义Access key,或者直接在主题配置里面写死也可以的。
感谢作者制作处这么牛的主题!

访问首页后台有报错,具体报错如下

描述缺陷
Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
请简洁而清晰的描述一下这个缺陷。

如何复现
本地开发欢迎测试,直接安装完主题后,进博客首页报api has been disabled by blogger curently.
复现步骤如下:

  1. 打开 "xxx"
  2. 点击 "xxx"
  3. 滚动到 "xxx"
  4. 发生错误

期望结果

简洁而清晰的描述一下你最终期望的结果。

截图
image

如有需要,可以附上一些截图。

PC 端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.2]
  • 操作系统:[e.g. iOS]
  • 浏览器:[e.g. chrome, safari]
  • 版本:[e.g. 22]

移动端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.2]
  • 设备型号:[e.g. iPhone6]
  • 操作系统:[e.g. iOS8.1]
  • 浏览器:[e.g. stock browser, safari]
  • 版本:[e.g. 22]

额外信息

可以添加一些额外的对我们处理这个问题有帮助的信息。

LOGO配置问题

我这边看到导航条那里有个配置,是否展示博客LOGO,但是没有看到设置LOGO图片的地方。
image

博客置顶问题

大佬!
想知道推荐文章这个是随机的吗?是这样,我之前有设置一篇文章的置顶,但是发现在推荐页面没有看到置顶的文章。

是不是推荐文章也要考虑到置顶的情况还是新增模块来增加置顶的文章。

安装之后访问提示:请求字段缺失,类型为 String,名称为 keyword

描述缺陷

安装这个主题之后,仅设置了 Content API,然后直接访问首页,出现:请求字段缺失,类型为 String,名称为 keyword。

看了请求,是加载文章数据出现的问题。

我看了上一个 bug,发现关闭 ajax 异步加载文章列表,是可以正常访问的,但是此问题非 hexo 导入的文章引起的,我这里没有使用过导入文章的功能。

如何复现

复现步骤如下:

直接访问首页,就弹出错误信息。

截图
错误提示信息:
image
image

请求信息:
image
image

错误日志:
image

如有需要,可以附上一些截图。

PC 端 (请提供以下信息):

  • Halo 版本:1.4.10
  • 操作系统:Windows
  • 数据库:MySQL 5.7.28
  • 浏览器:Chrome/96.0.4664.45

额外信息

我的站点:https://huasio.com

首页标题优化建议

首页标题可以只显示网站标题,而不显示页面标题。

<title><#if title == "首页">${blog_title!}<#if title != "首页">${title!} - ${blog_title!}</title>

最新版本更新后,造成的代码显示区域高度错误问题

更新最新主题风格后,发现所有的代码块的高度都显示不正确了。

主题配置中没有开启代码折叠,结果显示的代码块中,全部的换行都丢失了
效果图
image

以为是自身问题,访问大佬你的网页上也是显示的错误。

image

文章缩略图存在问题

描述缺陷

文章缩略图设置为关闭时,搜索的结果显示有缩略图

如何复现

复现步骤如下:

  1. 主题设置为关闭文章缩略图,首页文章不显示文章缩略图(正常)
  2. 在搜索栏中搜索,显示的文章却依然有缩略图

期望结果

简洁而清晰的描述一下你最终期望的结果。

截图
image
image

单行代码复制问题

大佬,你好!
是这样,目前我使用大佬的主题发现在单行代码操作,单击是直接复制整行,是否能够正常的选中内容去复制?

主题cdn引入404

描述缺陷

使用该主题控制台报cdn引入的资源文件404
是不是cdn地址更换了?

如何复现

复现步骤如下:

  1. 打开 "xxx"
  2. 点击 "xxx"
  3. 滚动到 "xxx"
  4. 发生错误

期望结果

尽快修复或望可告知解决方法

截图

image

PC 端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.11]
  • 操作系统:[e.g. iOS]
  • 浏览器:[e.g. chrome, safari]
  • 版本:[e.g. 22]

移动端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.11]
  • 设备型号:[e.g. iPhone6]
  • 操作系统:[e.g. iOS8.1]
  • 浏览器:[e.g. stock browser, safari]
  • 版本:[e.g. 22]

额外信息

可以添加一些额外的对我们处理这个问题有帮助的信息。

首页有API被禁用

描述缺陷
打开首页会有错误弹窗
后台日志:
2021-12-02 20:02:46.818 ERROR 15528 --- [qtp1064724658-44] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]

如何复现

复现步骤如下:

  1. 打开 "首页"
  2. 发生错误

期望结果

是不是第三方API禁用了。

PC 端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.13]
  • 操作系统:[e.g. Windows]
  • 浏览器:[e.g. chrome]
  • 版本:[e.g. 22]

移动端 (请提供以下信息):

  • Halo 版本:[e.g. 1.4.13]
  • 设备型号:[e.g. iPhone12]
  • 操作系统:[e.g. iOS8.1]
  • 浏览器:[e.g. stock browser, safari]
  • 版本:[e.g. 22]

代码块格式化问题

代码块中的代码格式出现问题。

复现步骤:
1、随便创建一篇博客,使用多行代码块。
2、书写多行对应代码。
3、预览或发布博客。
4、看到代码块行号正常,但是代码块中的代码格式出现问题。

  • 操作系统:win 10
  • 浏览器:谷歌浏览器
  • 版本:97.0.4692.20(正式版本) (64 位)

代码块复制问题

大佬,你好!
我这边在使用你的主题的时候,在使用中发现复制代码块时,复制过来的是一行,建议复制也能将代码块的格式复制过来。
举例:
代码块有4行代码,我复制4行到VS CODE编辑器后,发现是一整行。
image

电脑端图片访问正常,手机浏览器图片无法访问。

描述缺陷

电脑端使用 chrome 浏览器访问站点,图片正常显示。
手机浏览器访问站点,图片无法显示。

PC 端 (请提供以下信息):

  • Halo 版本:1.4.10
  • 操作系统:Windows
  • 浏览器:Chrome 版本 96.0.4664.45(正式版本) (64 位)

移动端 (请提供以下信息):

  • Halo 版本:1.4.10
  • 设备型号:安卓
  • 操作系统:鸿蒙 2.0
  • 浏览器:夸克
  • 版本:最新版

额外信息

如果无法复现,建议访问的站点。

我的站点:https://huasio.com

不兼容halo自带的页脚信息

原来是配置了页脚信息里显示备案,显示成蓝色超链接,建议在主题设置备案那里说一下,或者把这个弄上面去

<footer class="joe_footer">
    <div class="joe_container">
      <div class="item">
        <p>
          2021 ©<a href="https://lyonho.xyz" target="_blank" rel="noopener noreferrer">Lau</a>
          
        </p>
        <p class="site_powered">@Powered by<a class="a-powered" href="https://halo.run/" target="_blank" rel="noopener noreferrer">Halo</a>&nbsp;|&nbsp;@Theme by<a class="a-theme" href="https://github.com/qinhua/halo-theme-joe2.0" target="_blank" rel="noopener noreferrer">M酷</a></p>
      </div><div class="item">
          <a class="rss" href="https://lyonho.xyz/rss.xml" target="_blank" rel="noopener noreferrer"><i class="joe-font joe-icon-rss-fill"></i>&nbsp;RSS</a>
          <a href="https://lyonho.xyz/sitemap.xml" target="_blank" rel="noopener noreferrer">站点地图</a>
        </div>
        
    </div><a href="https://beian.miit.gov.cn/" target="_blank">ICP备456456号-1</a>
    

    
  </footer>

友链中的logo建议

我看见友情链接中,logo地址是直接获取的halo后台实际地址。
image
建议更新为博客地址后面拼接/avatar/logo,例如:https://www.demo.cn/avatar,这样便可实时更新logo地址,而不至于每次logo更新都去通知友站更新logo。

文章时间问题

大佬,你好!
我这边在更新一篇之前已经发布的文章时,在更新后,看到文章页面的 温馨提示中的更新时间是发布时间。

按我的理解,温馨提示中的时间应该是文章的更新时间吧!

期望:
image

代码堆叠在一起

当打开代码行号时,代码会没有换行,都堆叠在一起。关闭之后就好了。
像这样:
image
image

代码块样式bug

描述缺陷

bug:所有文章页代码块样式没生效
版本:halo v1.4.13 主题 v1.0.4

image
image

请简洁而清晰的描述一下这个缺陷。

如何复现

https://4xx.me/archives/94.html

复现步骤如下:

  1. 打开 "xxx"
  2. 点击 "xxx"
  3. 滚动到 "xxx"
  4. 发生错误

期望结果

简洁而清晰的描述一下你最终期望的结果。

截图

如有需要,可以附上一些截图。

PC 端 (请提供以下信息):

  • 操作系统:[e.g. iOS]
  • 浏览器:[e.g. chrome, safari]
  • 版本:[e.g. 22]

移动端 (请提供以下信息):

  • 设备型号:[e.g. iPhone6]
  • 操作系统:[e.g. iOS8.1]
  • 浏览器:[e.g. stock browser, safari]
  • 版本:[e.g. 22]

额外信息

可以添加一些额外的对我们处理这个问题有帮助的信息。

首页报错“API has been disabled by blogger currently”

描述缺陷

首页提示“API has been disabled by blogger currently”

如何复现

复现步骤如下:

  1. 刷新首页
  2. 或 点击 “查看更多”

期望结果

如何解决?

截图

PC 端 (请提供以下信息):

  • 操作系统:[e.g. Windows11]
  • 浏览器:[e.g. chrome 96.0.4664.45(正式版本) (64 位)]

额外信息

2021-11-21 18:07:08.780  WARN 8 --- [qtp1018094504-19] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:07:08.780 ERROR 8 --- [qtp1018094504-19] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:07:35.544  WARN 8 --- [qtp1018094504-18] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:07:35.544 ERROR 8 --- [qtp1018094504-18] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:07:39.038  WARN 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:07:39.039 ERROR 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:11:52.532  WARN 8 --- [qtp1018094504-15] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:11:52.533 ERROR 8 --- [qtp1018094504-15] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:13:03.414  WARN 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:13:03.414 ERROR 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:13:24.023  WARN 8 --- [qtp1018094504-15] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:13:24.024 ERROR 8 --- [qtp1018094504-15] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:13:53.772  WARN 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:13:53.772 ERROR 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:14:36.618  WARN 8 --- [qtp1018094504-15] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:14:36.618 ERROR 8 --- [qtp1018094504-15] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:14:50.361  WARN 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:14:50.362 ERROR 8 --- [qtp1018094504-12] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:15:06.097  WARN 8 --- [qtp1018094504-19] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:15:06.097 ERROR 8 --- [qtp1018094504-19] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]
2021-11-21 18:15:54.666  WARN 8 --- [qtp1018094504-14] .s.h.DefaultAuthenticationFailureHandler : Handle unsuccessful authentication, ip: [172.17.0.1]
2021-11-21 18:15:54.666 ERROR 8 --- [qtp1018094504-14] .s.h.DefaultAuthenticationFailureHandler : Authentication failure: [API has been disabled by blogger currently], status: [403 FORBIDDEN], data: [null]

用halo提供的导入hexo的md文件不被主页ajax加载显示

描述缺陷

用halo提供的导入hexo的md文件不被主页ajax加载显示,如果关掉前台ajax使用后台渲染就可以正常显示,使用ajax异步加载只能显示通过halo发布的文章,导入的md文章不显示

截图

这是开启ajax的效果
image-20211130002634117
这是关闭的效果
image-20211130002930807
PC 端 (请提供以下信息):

  • Halo 版本:1.4.13
  • 操作系统:win10
  • 浏览器:chrome

README.md中的防盗链配置描述错误

valid_referers单词写错,少个v

 # 防盗链 白名单
    valid_referers none blocked server_names 4xx.me *.4xx.me 127.0.0.1 ~\.google\. ~\.baidu\. ~\.qq\. ~\.bing\. ~\.soso\. ~\.so\. ~\.sm\. ~\.youdao\. ~\.sogou\.;
    
   ...

参考你的配置,我写了篇博客,有详细的配置,可以排除指定资源链接

https://4xx.me/archives/101.html

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.