<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>钟神秀</title><description>一个孤独的地方，散落着一个人的人生碎片</description><link>https://www.zsxcoder.top/</link><language>zh-CN</language><atom:link href="https://www.zsxcoder.top/rss.xml" rel="self" type="application/rss+xml"/><image><url>https://www.zsxcoder.top/favicon.png</url><title>钟神秀</title><link>https://www.zsxcoder.top/</link></image><item><title>测试 Timeline.astro 组件</title><link>https://sink.zsx815.top/test-timeline</link><guid isPermaLink="true">https://sink.zsx815.top/test-timeline</guid><description>这是一篇用来测试 Timeline.astro 组件效果的文章</description><pubDate>Fri, 23 Jan 2026 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Timeline from &amp;#39;../../components/mdx/TimeLine.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Timeline.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Timeline.astro 组件，该组件实现了时间线展示功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;Timeline&gt;
  &lt;dt&gt;2025 年 12 月&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;完成 Astro 博客搭建&lt;/h3&gt;
    &lt;p&gt;使用 Astro 框架搭建了个人博客，支持 MDX 组件和响应式设计。&lt;/p&gt;
    &lt;img src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot; alt=&quot;Astro 博客&quot; style=&quot;width: 100%; max-width: 500px; border-radius: 8px; margin-top: 0.5rem;&quot; data-zoom-alt=&quot;Astro 博客&quot; /&gt;
  &lt;/dd&gt;
  
  &lt;dt&gt;2025 年 11 月&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;学习 React 19&lt;/h3&gt;
    &lt;p&gt;深入学习了 React 19 的新特性，包括并发渲染和自动批处理。&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;学习了 React 19 的核心概念&lt;/li&gt;
      &lt;li&gt;实践了多个 React 19 项目&lt;/li&gt;
      &lt;li&gt;撰写了 React 19 学习笔记&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/dd&gt;
  
  &lt;dt&gt;2025 年 10 月&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;参与开源项目&lt;/h3&gt;
    &lt;p&gt;为多个开源项目贡献代码，包括 Astro 和 React 生态系统。&lt;/p&gt;
    &lt;p&gt;主要贡献了以下内容：&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;修复了 Astro 组件的 bug&lt;/li&gt;
      &lt;li&gt;为 React 库添加了新功能&lt;/li&gt;
      &lt;li&gt;改进了文档和示例&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/dd&gt;
&lt;/Timeline&gt;

&lt;h2&gt;多个时间线&lt;/h2&gt;
&lt;Timeline&gt;
  &lt;dt&gt;2026 年 1 月&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;创建 Timeline 组件&lt;/h3&gt;
    &lt;p&gt;成功创建了 Timeline.astro 组件，支持时间线展示和深色模式。&lt;/p&gt;
  &lt;/dd&gt;
&lt;/Timeline&gt;

&lt;Timeline&gt;
  &lt;dt&gt;2026 年 2 月（计划）&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;学习 TypeScript 5.5&lt;/h3&gt;
    &lt;p&gt;计划学习 TypeScript 5.5 的新特性，提升代码质量和开发效率。&lt;/p&gt;
  &lt;/dd&gt;
  
  &lt;dt&gt;2026 年 3 月（计划）&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;开发新的博客主题&lt;/h3&gt;
    &lt;p&gt;计划为博客开发一个新的主题，支持更多自定义选项和动画效果。&lt;/p&gt;
  &lt;/dd&gt;
&lt;/Timeline&gt;

&lt;h2&gt;复杂内容支持&lt;/h2&gt;
&lt;Timeline&gt;
  &lt;dt&gt;2025 年 9 月&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;复杂内容测试&lt;/h3&gt;
    &lt;p&gt;Timeline 组件支持复杂的内容结构，包括：&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;标题和段落&lt;/li&gt;
      &lt;li&gt;有序和无序列表&lt;/li&gt;
      &lt;li&gt;图片和链接&lt;/li&gt;
      &lt;li&gt;代码块&lt;/li&gt;
    &lt;/ul&gt;
    
&lt;pre&gt;&lt;code&gt;&amp;lt;h4&amp;gt;代码示例&amp;lt;/h4&amp;gt;
```javascript
// 这是一段 JavaScript 代码
function hello() {
  console.log(&amp;quot;Hello, Timeline!&amp;quot;);
}

hello();
```

&amp;lt;h4&amp;gt;图片示例&amp;lt;/h4&amp;gt;
&amp;lt;img src=&amp;quot;https://60s.kemeow.top/v2/bing?encoding=image&amp;quot; alt=&amp;quot;复杂内容图片&amp;quot; style=&amp;quot;width: 100%; max-width: 500px; border-radius: 8px; margin-top: 0.5rem;&amp;quot; data-zoom-alt=&amp;quot;复杂内容图片&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/dd&gt;
&lt;/Timeline&gt;

&lt;h2&gt;深色模式适配&lt;/h2&gt;
&lt;Timeline&gt;
  &lt;dt&gt;主题适配&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;深色模式支持&lt;/h3&gt;
    &lt;p&gt;Timeline 组件已经完全适配了博客的深色模式，在不同主题下都能提供良好的视觉体验。&lt;/p&gt;
    &lt;p&gt;主要适配内容包括：&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;背景色和边框色的调整&lt;/li&gt;
      &lt;li&gt;文字颜色的适配&lt;/li&gt;
      &lt;li&gt;阴影效果的调整&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/dd&gt;
&lt;/Timeline&gt;

&lt;h2&gt;响应式设计&lt;/h2&gt;
&lt;Timeline&gt;
  &lt;dt&gt;响应式测试&lt;/dt&gt;
  &lt;dd&gt;
    &lt;h3&gt;响应式布局&lt;/h3&gt;
    &lt;p&gt;Timeline 组件采用了响应式设计，在不同屏幕尺寸下都能正常显示。&lt;/p&gt;
    &lt;p&gt;主要特点：&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;在桌面端展示完整的时间线效果&lt;/li&gt;
      &lt;li&gt;在移动端自动调整布局，确保良好的阅读体验&lt;/li&gt;
      &lt;li&gt;图片自动适应容器宽度&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/dd&gt;
&lt;/Timeline&gt;

&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Timeline.astro 组件已经成功实现了时间线展示功能，支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本的时间线展示&lt;/li&gt;
&lt;li&gt;多个时间线并列使用&lt;/li&gt;
&lt;li&gt;复杂内容结构&lt;/li&gt;
&lt;li&gt;深色模式适配&lt;/li&gt;
&lt;li&gt;响应式设计&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该组件完全适配了博客的布局和样式，使用了与博客一致的 CSS 变量和设计规范，确保了整体风格的统一性。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Quote.astro 组件</title><link>https://sink.zsx815.top/test-quote</link><guid isPermaLink="true">https://sink.zsx815.top/test-quote</guid><description>这是一篇用来测试 Quote.astro 组件效果的文章</description><pubDate>Fri, 23 Jan 2026 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Quote from &amp;#39;../../components/mdx/Quote.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Quote.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Quote.astro 组件，该组件实现了引用展示功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;Quote&gt;
这是一个基本的引用示例，没有指定来源。
&lt;/Quote&gt;

&lt;h2&gt;自定义图标&lt;/h2&gt;
&lt;Quote icon=&quot;ri:file-text-line&quot;&gt;
令图标有所指，引用亦有中心。
&lt;/Quote&gt;

&lt;h2&gt;图标插槽示例&lt;/h2&gt;
&lt;Quote&gt;
  &lt;slot name=&quot;#icon&quot;&gt;
    ヾ(•ω•`)o
  &lt;/slot&gt;
  &lt;slot name=&quot;default&quot;&gt;
    图标插槽也可以是 Emoji 或颜文字，或者英文装饰。
  &lt;/slot&gt;
&lt;/Quote&gt;

&lt;h2&gt;图标插槽 - Emoji&lt;/h2&gt;
&lt;Quote&gt;
  &lt;slot name=&quot;#icon&quot;&gt;
    😊
  &lt;/slot&gt;
  &lt;slot name=&quot;default&quot;&gt;
    使用 Emoji 作为图标，让引用更加生动有趣。
  &lt;/slot&gt;
&lt;/Quote&gt;

&lt;h2&gt;图标插槽 - 英文装饰&lt;/h2&gt;
&lt;Quote&gt;
  &lt;slot name=&quot;#icon&quot;&gt;
    ❝
  &lt;/slot&gt;
  &lt;slot name=&quot;default&quot;&gt;
    使用英文装饰作为图标，让引用更加国际化。
  &lt;/slot&gt;
&lt;/Quote&gt;

&lt;h2&gt;带有来源&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;阿尔伯特·爱因斯坦&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;想象力比知识更重要，因为知识是有限的，而想象力概括着世界上的一切，推动着进步，并且是知识进化的源泉。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;长引用&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;史蒂夫·乔布斯&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;你的时间有限，所以不要为别人而活。不要被教条所限，不要活在别人的观念里。不要让别人的意见左右自己内心的声音。最重要的是，勇敢的去追随自己的心灵和直觉，只有自己的心灵和直觉才知道你自己的真实想法，其他一切都是次要。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;哲学引用&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;苏格拉底&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;我知道我一无所知。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;文学引用&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;鲁迅&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;真正的勇士，敢于直面惨淡的人生，敢于正视淋漓的鲜血。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;科学引用&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;牛顿&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果说我看得比别人更远些，那是因为我站在巨人的肩膀上。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;自定义类名&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;自定义样式&amp;quot;
  className=&amp;quot;custom&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个使用了自定义样式的引用示例。自定义样式可以让引用看起来更加独特，你可以根据自己的喜好调整样式。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;多段落引用&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;尼采&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;每一个不曾起舞的日子，都是对生命的辜负。&lt;/p&gt;
&lt;p&gt;那些杀不死我的，终将使我更强大。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;响应式设计&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;响应式设计&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个引用组件在不同屏幕尺寸下都能正常显示，具有良好的响应式设计。在移动设备上，引用的样式会自动调整，确保良好的阅读体验。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;深色模式适配&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote
  source=&amp;quot;深色模式&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个引用组件支持深色模式，会根据系统主题自动调整样式。在深色模式下，引用的背景色和边框色会相应变化，确保良好的可读性。
&lt;/Quote&gt;&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Quote.astro 组件已经成功实现了引用展示功能。&lt;/p&gt;
&lt;h3&gt;组件特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本功能&lt;/strong&gt;：显示引用内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;来源支持&lt;/strong&gt;：可以添加引用来源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义类名&lt;/strong&gt;：支持通过 CSS 类名自定义样式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深色模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;装饰性引号&lt;/strong&gt;：添加了装饰性引号，提升视觉效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优雅的排版&lt;/strong&gt;：使用合适的字体和行高，提高可读性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;组件优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提升视觉效果&lt;/strong&gt;：引用展示更加美观，吸引读者注意&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一设计风格&lt;/strong&gt;：组件样式与博客的整体风格保持一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于使用&lt;/strong&gt;：API 简单直观，使用方便&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活的布局&lt;/strong&gt;：支持多种引用格式和长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;良好的可读性&lt;/strong&gt;：合适的字体和行高，提高阅读体验&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过使用 Quote.astro 组件，你可以在博客文章中更好地展示引用，提升文章的视觉效果和用户体验。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Poetry.astro 组件</title><link>https://sink.zsx815.top/test-poetry</link><guid isPermaLink="true">https://sink.zsx815.top/test-poetry</guid><description>这是一篇用来测试 Poetry.astro 组件效果的文章</description><pubDate>Fri, 23 Jan 2026 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Poetry from &amp;#39;../../components/mdx/Poetry.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Poetry.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Poetry.astro 组件，该组件实现了诗歌展示功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;Poetry&gt;
床前明月光
疑是地上霜
举头望明月
低头思故乡
&lt;/Poetry&gt;

&lt;h2&gt;带有标题和作者&lt;/h2&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;静夜思&amp;quot;
  author=&amp;quot;李白&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;床前明月光
疑是地上霜
举头望明月
低头思故乡
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;现代诗歌&lt;/h2&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;断章&amp;quot;
  author=&amp;quot;卞之琳&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;你站在桥上看风景
看风景的人在楼上看你
明月装饰了你的窗子
你装饰了别人的梦
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;长诗歌&lt;/h2&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;再别康桥&amp;quot;
  author=&amp;quot;徐志摩&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;轻轻的我走了，
正如我轻轻的来；
我轻轻的招手，
作别西天的云彩。&lt;/p&gt;
&lt;p&gt;那河畔的金柳，
是夕阳中的新娘；
波光里的艳影，
在我的心头荡漾。&lt;/p&gt;
&lt;p&gt;软泥上的青荇，
油油的在水底招摇；
在康河的柔波里，
我甘心做一条水草！&lt;/p&gt;
&lt;p&gt;那榆荫下的一潭，
不是清泉，是天上虹；
揉碎在浮藻间，
沉淀着彩虹似的梦。&lt;/p&gt;
&lt;p&gt;寻梦？撑一支长篙，
向青草更青处漫溯；
满载一船星辉，
在星辉斑斓里放歌。&lt;/p&gt;
&lt;p&gt;但我不能放歌，
悄悄是别离的笙箫；
夏虫也为我沉默，
沉默是今晚的康桥！&lt;/p&gt;
&lt;p&gt;悄悄的我走了，
正如我悄悄的来；
我挥一挥衣袖，
不带走一片云彩。
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;自定义类名&lt;/h2&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;自定义样式诗歌&amp;quot;
  author=&amp;quot;测试作者&amp;quot;
  className=&amp;quot;custom&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一首使用了自定义样式的诗歌
自定义样式可以让诗歌看起来更加独特
你可以根据自己的喜好调整样式
让诗歌在页面中更加突出
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;散文诗句&lt;/h2&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;春&amp;quot;
  author=&amp;quot;朱自清&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;盼望着，盼望着，东风来了，春天的脚步近了。&lt;/p&gt;
&lt;p&gt;一切都像刚睡醒的样子，欣欣然张开了眼。山朗润起来了，水涨起来了，太阳的脸红起来了。&lt;/p&gt;
&lt;p&gt;小草偷偷地从土里钻出来，嫩嫩的，绿绿的。园子里，田野里，瞧去，一大片一大片满是的。坐着，躺着，打两个滚，踢几脚球，赛几趟跑，捉几回迷藏。风轻悄悄的，草软绵绵的。
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;外国诗歌&lt;/h2&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;Stopping by Woods on a Snowy Evening&amp;quot;
  author=&amp;quot;Robert Frost&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whose woods these are I think I know.
His house is in the village though;
He will not see me stopping here
To watch his woods fill up with snow.&lt;/p&gt;
&lt;p&gt;My little horse must think it queer
To stop without a farmhouse near
Between the woods and frozen lake
The darkest evening of the year.&lt;/p&gt;
&lt;p&gt;He gives his harness bells a shake
To ask if there is some mistake.
The only other sound&amp;#39;s the sweep
Of easy wind and downy flake.&lt;/p&gt;
&lt;p&gt;The woods are lovely, dark and deep,
But I have promises to keep,
And miles to go before I sleep,
And miles to go before I sleep.
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Poetry.astro 组件已经成功实现了诗歌展示功能。&lt;/p&gt;
&lt;h3&gt;组件特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本功能&lt;/strong&gt;：显示诗歌内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标题支持&lt;/strong&gt;：可以添加诗歌标题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作者支持&lt;/strong&gt;：可以添加诗歌作者&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义类名&lt;/strong&gt;：支持通过 CSS 类名自定义样式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深色模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;装饰性引号&lt;/strong&gt;：添加了装饰性引号，提升视觉效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优雅的排版&lt;/strong&gt;：使用合适的字体和行高，提高可读性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;组件优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提升视觉效果&lt;/strong&gt;：诗歌展示更加美观，吸引读者注意&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一设计风格&lt;/strong&gt;：组件样式与博客的整体风格保持一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于使用&lt;/strong&gt;：API 简单直观，使用方便&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活的布局&lt;/strong&gt;：支持多种诗歌格式和长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;良好的可读性&lt;/strong&gt;：合适的字体和行高，提高阅读体验&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过使用 Poetry.astro 组件，你可以在博客文章中更好地展示诗歌，提升文章的视觉效果和用户体验。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Pic.astro 组件</title><link>https://sink.zsx815.top/test-pic</link><guid isPermaLink="true">https://sink.zsx815.top/test-pic</guid><description>这是一篇用来测试 Pic.astro 组件效果的文章</description><pubDate>Fri, 23 Jan 2026 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Pic from &amp;#39;../../components/mdx/Pic.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Pic.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Pic.astro 组件，该组件实现了带有标题和描述的图片展示功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有标题&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张测试图片的标题&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有自定义宽度&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张宽度为 50% 的图片&quot;
  width=&quot;50%&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有 CSS 类名&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张全宽图片&quot;
  className=&quot;w-full&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;半宽图片&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张半宽图片&quot;
  className=&quot;w-half&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;三分之一宽度图片&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张三分之一宽度图片&quot;
  className=&quot;w-third&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;四分之一宽度图片&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张四分之一宽度图片&quot;
  className=&quot;w-quarter&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;多种宽度组合&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;图片 1&quot;
  className=&quot;w-third&quot;
/&gt;&lt;/p&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;图片 2&quot;
  className=&quot;w-third&quot;
/&gt;&lt;/p&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;图片 3&quot;
  className=&quot;w-third&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;响应式设计&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这张图片在移动端会自动变为全宽&quot;
  className=&quot;w-half&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;深色模式适配&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这张图片在深色模式下会有不同的边框和背景色&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;图片说明文字&lt;/h2&gt;
&lt;p&gt;&lt;Pic
  src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  alt=&quot;测试图片&quot;
  caption=&quot;这是一张带有详细说明文字的图片。说明文字可以包含多行内容，用于详细描述图片的内容、来源或者相关信息。&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Pic.astro 组件已经成功实现了带有标题和描述的图片展示功能。&lt;/p&gt;
&lt;h3&gt;组件特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本功能&lt;/strong&gt;：显示图片和替代文本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标题支持&lt;/strong&gt;：可以添加图片标题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义宽度&lt;/strong&gt;：支持通过 width 属性或 CSS 类名设置图片宽度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多种宽度类&lt;/strong&gt;：内置 w-full、w-half、w-third、w-quarter 等类名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在移动设备上自动调整为全宽&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深色模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;悬停效果&lt;/strong&gt;：鼠标悬停时显示动画效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无障碍支持&lt;/strong&gt;：添加了适当的 alt 属性，提高可访问性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;组件优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提升视觉效果&lt;/strong&gt;：带有标题的图片比普通图片更专业&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提供更多信息&lt;/strong&gt;：可以同时显示图片和详细描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一设计风格&lt;/strong&gt;：组件样式与博客的整体风格保持一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于使用&lt;/strong&gt;：API 简单直观，使用方便&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活的布局&lt;/strong&gt;：支持多种宽度设置，适应不同的布局需求&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过使用 Pic.astro 组件，你可以在博客文章中更好地展示图片，提升文章的视觉效果和用户体验。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 LinkCard.astro 组件</title><link>https://sink.zsx815.top/test-link-card</link><guid isPermaLink="true">https://sink.zsx815.top/test-link-card</guid><description>这是一篇用来测试 LinkCard.astro 组件效果的文章</description><pubDate>Fri, 23 Jan 2026 19:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import LinkCard from &amp;#39;../../components/mdx/LinkCard.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 LinkCard.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 LinkCard.astro 组件，该组件实现了带有背景图片、标题和描述的链接卡片功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  title=&quot;Astro 官方网站&quot;
  description=&quot;构建现代、快速的网站&quot;
  link=&quot;https://astro.build&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有背景图片&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;Astro 官方网站&quot;
  description=&quot;构建现代、快速的网站&quot;
  link=&quot;https://astro.build&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;自动获取域名&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  title=&quot;GitHub 官方网站&quot;
  link=&quot;https://github.com&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有自定义描述&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  title=&quot;Google 搜索引擎&quot;
  description=&quot;全球最大的搜索引擎&quot;
  link=&quot;https://google.com&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;长标题和描述&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;这是一个非常长的标题，用于测试 LinkCard 组件的标题显示效果&quot;
  description=&quot;这是一个非常长的描述，用于测试 LinkCard 组件的描述显示效果。描述内容可以包含多个句子，用于详细介绍链接的内容和用途。&quot;
  link=&quot;https://example.com&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;响应式设计&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  title=&quot;响应式设计示例&quot;
  description=&quot;这个组件在不同屏幕尺寸下都能正常显示&quot;
  link=&quot;https://example.com/responsive-design&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;深色模式适配&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;深色模式适配&quot;
  description=&quot;这个组件支持深色模式，会根据系统主题自动调整样式&quot;
  link=&quot;https://example.com/dark-mode&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;网格布局&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;网格布局示例 1&quot;
  description=&quot;这个组件可以在网格布局中展示&quot;
  link=&quot;https://example.com/grid-1&quot;
/&gt;&lt;/p&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;网格布局示例 2&quot;
  description=&quot;这个组件可以在网格布局中展示&quot;
  link=&quot;https://example.com/grid-2&quot;
/&gt;&lt;/p&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;网格布局示例 3&quot;
  description=&quot;这个组件可以在网格布局中展示&quot;
  link=&quot;https://example.com/grid-3&quot;
/&gt;&lt;/p&gt;
&lt;p&gt;&lt;LinkCard
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;网格布局示例 4&quot;
  description=&quot;这个组件可以在网格布局中展示&quot;
  link=&quot;https://example.com/grid-4&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;LinkCard.astro 组件已经成功实现了带有背景图片、标题和描述的链接卡片功能。&lt;/p&gt;
&lt;h3&gt;组件特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本功能&lt;/strong&gt;：显示链接、标题和描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;背景图片&lt;/strong&gt;：支持添加背景图片&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动域名获取&lt;/strong&gt;：如果没有提供描述，会自动从链接中提取域名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：适配不同屏幕尺寸&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深色模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;悬停效果&lt;/strong&gt;：鼠标悬停时显示动画效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网格布局&lt;/strong&gt;：支持在网格布局中展示多个卡片&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无障碍支持&lt;/strong&gt;：添加了适当的 title 属性，提高可访问性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;组件优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提升视觉效果&lt;/strong&gt;：带有背景图片的链接卡片比普通链接更吸引眼球&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提供更多信息&lt;/strong&gt;：可以同时显示标题、描述和链接，让读者更好地了解链接内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一设计风格&lt;/strong&gt;：组件样式与博客的整体风格保持一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于使用&lt;/strong&gt;：API 简单直观，使用方便&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持网格布局&lt;/strong&gt;：可以在一行中展示多个链接卡片，节省页面空间&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过使用 LinkCard.astro 组件，你可以在博客文章中更好地展示外部链接，提升文章的视觉效果和用户体验。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 LinkBanner.astro 组件</title><link>https://sink.zsx815.top/test-link-banner</link><guid isPermaLink="true">https://sink.zsx815.top/test-link-banner</guid><description>这是一篇用来测试 LinkBanner.astro 组件效果的文章</description><pubDate>Fri, 23 Jan 2026 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import LinkBanner from &amp;#39;../../components/mdx/LinkBanner.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 LinkBanner.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 LinkBanner.astro 组件，该组件实现了带有背景图片、标题和描述的链接横幅功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  title=&quot;Astro 官方网站&quot;
  description=&quot;构建现代、快速的网站&quot;
  link=&quot;https://astro.build&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有背景图片&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;Astro 官方网站&quot;
  description=&quot;构建现代、快速的网站&quot;
  link=&quot;https://astro.build&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;自动获取域名&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  title=&quot;GitHub 官方网站&quot;
  link=&quot;https://github.com&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;带有自定义描述&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  title=&quot;Google 搜索引擎&quot;
  description=&quot;全球最大的搜索引擎&quot;
  link=&quot;https://google.com&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;长标题和描述&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;这是一个非常长的标题，用于测试 LinkBanner 组件的标题显示效果&quot;
  description=&quot;这是一个非常长的描述，用于测试 LinkBanner 组件的描述显示效果。描述内容可以包含多个句子，用于详细介绍链接的内容和用途。&quot;
  link=&quot;https://example.com&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;响应式设计&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  title=&quot;响应式设计示例&quot;
  description=&quot;这个组件在不同屏幕尺寸下都能正常显示&quot;
  link=&quot;https://example.com/responsive-design&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;深色模式适配&lt;/h2&gt;
&lt;p&gt;&lt;LinkBanner
  banner=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot;
  title=&quot;深色模式适配&quot;
  description=&quot;这个组件支持深色模式，会根据系统主题自动调整样式&quot;
  link=&quot;https://example.com/dark-mode&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;LinkBanner.astro 组件已经成功实现了带有背景图片、标题和描述的链接横幅功能。&lt;/p&gt;
&lt;h3&gt;组件特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本功能&lt;/strong&gt;：显示链接、标题和描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;背景图片&lt;/strong&gt;：支持添加背景图片，带有渐变遮罩效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动域名获取&lt;/strong&gt;：如果没有提供描述，会自动从链接中提取域名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：适配不同屏幕尺寸&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深色模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;悬停效果&lt;/strong&gt;：鼠标悬停时显示动画效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无障碍支持&lt;/strong&gt;：添加了适当的 title 属性，提高可访问性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;组件优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提升视觉效果&lt;/strong&gt;：带有背景图片的链接横幅比普通链接更吸引眼球&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提供更多信息&lt;/strong&gt;：可以同时显示标题、描述和链接，让读者更好地了解链接内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一设计风格&lt;/strong&gt;：组件样式与博客的整体风格保持一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于使用&lt;/strong&gt;：API 简单直观，使用方便&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：在不同设备上都能正常显示
中好地展示外部链接，提升文章的视觉效果和用户体验。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Folding.astro 组件</title><link>https://sink.zsx815.top/test-folding</link><guid isPermaLink="true">https://sink.zsx815.top/test-folding</guid><description>这是一篇用来测试 Folding.astro 组件效果的文章</description><pubDate>Thu, 22 Jan 2026 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Folding from &amp;#39;../../components/mdx/Folding.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Folding.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Folding.astro 组件，该组件实现了可折叠内容的功能。&lt;/p&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;Folding title=&quot;基本折叠面板&quot;&gt;
这是一个基本的折叠面板，点击标题可以展开或折叠内容。
&lt;/Folding&gt;

&lt;h2&gt;默认打开&lt;/h2&gt;
&lt;Folding title=&quot;默认打开的折叠面板&quot; defaultOpen={true}&gt;
这是一个默认打开的折叠面板，你可以直接看到里面的内容。
&lt;/Folding&gt;

&lt;h2&gt;不同类型&lt;/h2&gt;
&lt;h3&gt;成功类型&lt;/h3&gt;
&lt;Folding title=&quot;成功类型的折叠面板&quot; type=&quot;success&quot;&gt;
这是一个成功类型的折叠面板，左侧有一个绿色的边框。
&lt;/Folding&gt;

&lt;h3&gt;警告类型&lt;/h3&gt;
&lt;Folding title=&quot;警告类型的折叠面板&quot; type=&quot;warning&quot;&gt;
这是一个警告类型的折叠面板，左侧有一个黄色的边框。
&lt;/Folding&gt;

&lt;h3&gt;错误类型&lt;/h3&gt;
&lt;Folding title=&quot;错误类型的折叠面板&quot; type=&quot;error&quot;&gt;
这是一个错误类型的折叠面板，左侧有一个红色的边框。
&lt;/Folding&gt;

&lt;h3&gt;信息类型&lt;/h3&gt;
&lt;Folding title=&quot;信息类型的折叠面板&quot; type=&quot;info&quot;&gt;
这是一个信息类型的折叠面板，左侧有一个蓝色的边框。
&lt;/Folding&gt;

&lt;h2&gt;包含 Markdown 内容&lt;/h2&gt;
&lt;Folding title=&quot;包含 Markdown 内容的折叠面板&quot;&gt;
### 这是一个标题

&lt;p&gt;这是一段&lt;strong&gt;粗体&lt;/strong&gt;文本，这是一段&lt;em&gt;斜体&lt;/em&gt;文本。&lt;/p&gt;
&lt;h4&gt;列表&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;项目 1&lt;/li&gt;
&lt;li&gt;项目 2&lt;/li&gt;
&lt;li&gt;项目 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;有序列表&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;第一项&lt;/li&gt;
&lt;li&gt;第二项&lt;/li&gt;
&lt;li&gt;第三项&lt;/li&gt;
&lt;/ol&gt;
&lt;h6&gt;引用&lt;/h6&gt;
&lt;blockquote&gt;
&lt;p&gt;这是一段引用内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;链接&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build&quot;&gt;Astro 官方网站&lt;/a&gt;
&lt;/Folding&gt;&lt;/p&gt;
&lt;h2&gt;包含代码块&lt;/h2&gt;
&lt;Folding title=&quot;包含代码块的折叠面板&quot;&gt;
```javascript
// 这是一段 JavaScript 代码
function hello() {
  console.log(&apos;Hello, World!&apos;);
}

&lt;p&gt;hello();&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
```python
# 这是一段 Python 代码
def hello():
    print(&amp;quot;Hello, World!&amp;quot;)

hello()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- 这是一段 HTML 代码 --&amp;gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
  &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/Folding&gt;

&lt;h2&gt;嵌套使用&lt;/h2&gt;
&lt;Folding title=&quot;外层折叠面板&quot;&gt;
这是外层折叠面板的内容。

&lt;Folding title=&quot;内层折叠面板&quot;&gt;
这是内层折叠面板的内容，Folding 组件支持嵌套使用。

&lt;Folding title=&quot;最内层折叠面板&quot;&gt;
这是最内层折叠面板的内容。
&lt;/Folding&gt;
&lt;/Folding&gt;
&lt;/Folding&gt;

&lt;h2&gt;长内容测试&lt;/h2&gt;
&lt;Folding title=&quot;长内容折叠面板&quot;&gt;
这是一段很长的内容，用来测试折叠面板在处理长内容时的表现。

&lt;p&gt;当内容很长时，折叠面板会自动调整高度，确保内容可以完整显示，同时保持良好的性能。&lt;/p&gt;
&lt;h3&gt;标题 1&lt;/h3&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;
&lt;h3&gt;标题 2&lt;/h3&gt;
&lt;p&gt;Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?&lt;/p&gt;
&lt;h3&gt;标题 3&lt;/h3&gt;
&lt;p&gt;At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.
&lt;/Folding&gt;&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Folding.astro 组件已经成功实现了可折叠内容的功能，支持多种配置选项和内容类型。&lt;/p&gt;
&lt;h3&gt;组件特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本折叠功能&lt;/strong&gt;：点击标题可以展开或折叠内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认状态&lt;/strong&gt;：支持设置默认打开或关闭状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多种类型&lt;/strong&gt;：支持 success、warning、error、info 四种类型，每种类型有不同的边框颜色&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown 支持&lt;/strong&gt;：支持在折叠内容中使用 Markdown 语法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码块支持&lt;/strong&gt;：支持在折叠内容中使用代码块，并带有语法高亮&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌套使用&lt;/strong&gt;：支持嵌套使用，可以创建多层折叠结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长内容处理&lt;/strong&gt;：能够良好地处理长内容，保持良好的性能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;明暗模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：适配不同屏幕尺寸&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;组件优势&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提高内容组织性&lt;/strong&gt;：可以将相关内容组织在一起，减少页面复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升阅读体验&lt;/strong&gt;：用户可以根据需要展开或折叠内容，只查看感兴趣的部分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节省页面空间&lt;/strong&gt;：长内容可以折叠起来，减少页面滚动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增强交互性&lt;/strong&gt;：通过点击操作增强用户与页面的交互&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于使用&lt;/strong&gt;：API 简单直观，使用方便&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过使用 Folding.astro 组件，你可以在博客文章中更好地组织和展示内容，提升文章的可读性和交互性，为读者带来更好的阅读体验。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Chat.astro 组件</title><link>https://sink.zsx815.top/test-chat</link><guid isPermaLink="true">https://sink.zsx815.top/test-chat</guid><description>这是一篇用来测试 Chat.astro 组件效果的文章</description><pubDate>Thu, 22 Jan 2026 17:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Chat from &amp;#39;../../components/mdx/Chat.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Chat.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Chat.astro 组件，该组件实现了 QQ 聊天的样式效果，左边是对方，右边是我。&lt;/p&gt;
&lt;h2&gt;测试 QQ 聊天样式&lt;/h2&gt;
&lt;p&gt;&amp;lt;Chat
  messages={[
    {
      id: &amp;#39;1&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;你好啊，在吗？&amp;#39;,
      author: &amp;#39;小明&amp;#39;,
      date: &amp;#39;2026-01-22 14:30&amp;#39;,
    },
    {
      id: &amp;#39;2&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;在呢，有什么事吗？&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 14:31&amp;#39;,
    },
    {
      id: &amp;#39;3&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;今天天气不错，想不想一起去打球？&amp;#39;,
      author: &amp;#39;小明&amp;#39;,
      date: &amp;#39;2026-01-22 14:32&amp;#39;,
    },
    {
      id: &amp;#39;4&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;好啊，什么时候？&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 14:33&amp;#39;,
    },
    {
      id: &amp;#39;5&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;下午 3 点怎么样？\n在学校操场见&amp;#39;,
      author: &amp;#39;小明&amp;#39;,
      date: &amp;#39;2026-01-22 14:34&amp;#39;,
    },
    {
      id: &amp;#39;6&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;没问题，我准时到！&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 14:35&amp;#39;,
    },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试连续消息&lt;/h2&gt;
&lt;p&gt;&amp;lt;Chat
  messages={[
    {
      id: &amp;#39;1&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;你在忙吗？\n我有个问题想请教你\n关于 Astro 的&amp;#39;,
      author: &amp;#39;小红&amp;#39;,
      date: &amp;#39;2026-01-22 15:00&amp;#39;,
    },
    {
      id: &amp;#39;2&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;不忙，你说&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 15:01&amp;#39;,
    },
    {
      id: &amp;#39;3&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;我想知道怎么在 Astro 中使用组件\n特别是 MDX 组件\n你能给我讲讲吗？&amp;#39;,
      author: &amp;#39;小红&amp;#39;,
      date: &amp;#39;2026-01-22 15:02&amp;#39;,
    },
    {
      id: &amp;#39;4&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;当然可以！\n首先，你需要在 src/components/mdx 目录下创建组件\n然后在 MDX 文件中导入使用\n或者在页面中注册，这样所有 MDX 文件都可以使用&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 15:03&amp;#39;,
    },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试长消息&lt;/h2&gt;
&lt;p&gt;&amp;lt;Chat
  messages={[
    {
      id: &amp;#39;1&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;今天我学习了很多关于 Astro 的知识，感觉 Astro 真的很强大！它可以让我们使用多种框架来构建网站，而且性能非常好。我特别喜欢它的静态生成功能，可以生成非常快的网站。你觉得 Astro 怎么样？&amp;#39;,
      author: &amp;#39;小李&amp;#39;,
      date: &amp;#39;2026-01-22 16:00&amp;#39;,
    },
    {
      id: &amp;#39;2&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;我也觉得 Astro 很强大！它的混合渲染模式非常灵活，可以根据需要选择静态生成或服务端渲染。而且它的组件系统很强大，可以使用 React、Vue 等多种框架的组件。我已经用 Astro 构建了好几个网站，体验非常好！&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 16:01&amp;#39;,
    },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试 Markdown 支持&lt;/h2&gt;
&lt;p&gt;&amp;lt;Chat
  messages={[
    {
      id: &amp;#39;1&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;这是一条包含 **Markdown** 的消息\n\n- 列表项 1\n- 列表项 2\n- 列表项 3\n\n&amp;gt; 这是一段引用\n\n&lt;code&gt;行内代码&lt;/code&gt;\n\n&lt;code&gt;javascript\n// 这是一段代码块\nconsole.log(\&amp;quot;Hello, World!\&amp;quot;);\n&lt;/code&gt;&amp;#39;,
      author: &amp;#39;小王&amp;#39;,
      date: &amp;#39;2026-01-22 17:00&amp;#39;,
    },
    {
      id: &amp;#39;2&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;这是一条 &lt;strong&gt;回复&lt;/strong&gt;，也支持 Markdown\n\n## 标题\n\n&lt;a href=&quot;https://astro.build&quot;&gt;链接&lt;/a&gt;\n\n&lt;img src=&quot;https://60s.kemeow.top/v2/bing?encoding=image&quot; alt=&quot;图片&quot;&gt;&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      date: &amp;#39;2026-01-22 17:01&amp;#39;,
    },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试特殊消息类型&lt;/h2&gt;
&lt;p&gt;&amp;lt;Chat
  messages={[
    {
      id: &amp;#39;1&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;这条消息不会被撤回&amp;#39;,
      author: &amp;#39;小张&amp;#39;,
      date: &amp;#39;2026-01-22 18:00&amp;#39;,
    },
    {
      id: &amp;#39;2&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;对方撤回了一条消息&amp;#39;,
      author: &amp;#39;小张&amp;#39;,
      type: &amp;#39;recall&amp;#39;,
      date: &amp;#39;2026-01-22 18:01&amp;#39;,
    },
    {
      id: &amp;#39;3&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;这条消息被删除了&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      type: &amp;#39;delete&amp;#39;,
      date: &amp;#39;2026-01-22 18:02&amp;#39;,
    },
    {
      id: &amp;#39;4&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;我们继续聊天吧&amp;#39;,
      author: &amp;#39;小张&amp;#39;,
      date: &amp;#39;2026-01-22 18:03&amp;#39;,
    },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试带头像的消息&lt;/h2&gt;
&lt;p&gt;&amp;lt;Chat
  messages={[
    {
      id: &amp;#39;1&amp;#39;,
      side: &amp;#39;left&amp;#39;,
      content: &amp;#39;你好，我是带有头像的用户！&amp;#39;,
      author: &amp;#39;头像用户&amp;#39;,
      avatar: &amp;#39;&lt;a href=&quot;https://github.com/mcyzsx.png&quot;&gt;https://github.com/mcyzsx.png&lt;/a&gt;&amp;#39;,
      date: &amp;#39;2026-01-22 19:00&amp;#39;,
    },
    {
      id: &amp;#39;2&amp;#39;,
      side: &amp;#39;right&amp;#39;,
      content: &amp;#39;你好啊，我也带有头像！&amp;#39;,
      author: &amp;#39;我&amp;#39;,
      avatar: &amp;#39;&lt;a href=&quot;https://github.com/zsxcoder.png&quot;&gt;https://github.com/zsxcoder.png&lt;/a&gt;&amp;#39;,
      date: &amp;#39;2026-01-22 19:01&amp;#39;,
    },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试效果说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本聊天功能&lt;/strong&gt;：支持左边对方消息和右边自己消息的显示，符合 QQ 聊天习惯&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消息气泡样式&lt;/strong&gt;：带有圆角和小三角指示，区分发送方向&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续消息&lt;/strong&gt;：同一发送者的连续消息会正确显示，间距合理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长消息&lt;/strong&gt;：自动换行，不会溢出，保持良好的阅读体验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown 支持&lt;/strong&gt;：支持 Markdown 语法，包括标题、列表、引用、代码块等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码高亮&lt;/strong&gt;：使用 highlight.js 实现代码高亮，支持多种语言&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特殊消息类型&lt;/strong&gt;：支持撤回消息和删除消息的显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;头像支持&lt;/strong&gt;：支持自定义头像，也可以使用默认头像&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日期显示&lt;/strong&gt;：支持显示消息日期和时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;明暗模式适配&lt;/strong&gt;：适配博客的明暗主题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：适配不同屏幕尺寸，在手机和电脑上都有良好的显示效果&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Chat.astro 组件已经成功实现了 QQ 聊天的样式效果，左边是对方，右边是我，带有消息气泡和小三角指示，符合 QQ 聊天的视觉习惯。组件支持多种聊天场景，包括私聊、连续消息、长消息、Markdown 消息等，能够满足各种聊天需求。&lt;/p&gt;
&lt;p&gt;组件采用了基于 messages 数组的 API，使用更加灵活和强大，可以轻松实现复杂的聊天场景。同时，组件支持 Markdown 语法和代码高亮，为博客文章增添了更多的互动性和趣味性。&lt;/p&gt;
&lt;p&gt;组件的样式与博客的整体风格保持一致，支持明暗主题适配，能够很好地融入博客的设计体系。它的响应式设计确保了在不同设备上都有良好的显示效果。&lt;/p&gt;
&lt;p&gt;通过使用 Chat.astro 组件，你可以在博客文章中轻松创建各种聊天场景，增强文章的可读性和互动性，为读者带来更好的阅读体验。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Blur.astro 组件</title><link>https://sink.zsx815.top/test-blur</link><guid isPermaLink="true">https://sink.zsx815.top/test-blur</guid><description>这是一篇用来测试 Blur.astro 组件效果的文章</description><pubDate>Thu, 22 Jan 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Blur from &amp;#39;../../components/mdx/Blur.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Blur.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Blur.astro 组件，该组件复刻了 Vue 博客中的 Blur 组件功能。&lt;/p&gt;
&lt;h2&gt;测试基本用法&lt;/h2&gt;
&lt;Blur text=&quot;这是一段模糊文本，鼠标悬停时会显示清晰内容&quot; /&gt;

&lt;h2&gt;测试使用插槽&lt;/h2&gt;
&lt;Blur&gt;
  这是通过插槽传递的模糊文本，鼠标悬停时会显示清晰内容
&lt;/Blur&gt;

&lt;h2&gt;测试在段落中使用&lt;/h2&gt;
&lt;p&gt;这是一个普通的段落，其中包含 &lt;Blur&gt;一段模糊文本&lt;/Blur&gt;，鼠标悬停时会显示清晰内容。&lt;/p&gt;
&lt;h2&gt;测试在列表中使用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;列表项 1&lt;/li&gt;
&lt;li&gt;列表项 2，包含 &lt;Blur&gt;模糊文本&lt;/Blur&gt;&lt;/li&gt;
&lt;li&gt;列表项 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;测试在标题中使用&lt;/h2&gt;
&lt;h3&gt;&lt;Blur&gt;模糊的标题&lt;/Blur&gt;&lt;/h3&gt;
&lt;p&gt;这是一个二级标题，其中包含模糊文本。&lt;/p&gt;
&lt;h2&gt;测试嵌套使用&lt;/h2&gt;
&lt;Blur&gt;
  外层模糊文本，包含 &lt;Blur&gt;内层模糊文本&lt;/Blur&gt;
&lt;/Blur&gt;

&lt;h2&gt;测试效果说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本用法&lt;/strong&gt;：鼠标悬停时，模糊文本会逐渐清晰显示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过渡效果&lt;/strong&gt;：模糊到清晰的过渡时间为 0.2 秒，使用 ease 缓动函数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;光标样式&lt;/strong&gt;：鼠标悬停时显示指针光标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活使用&lt;/strong&gt;：可以通过 text 属性或插槽传递文本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌套使用&lt;/strong&gt;：支持嵌套使用，内层和外层可以独立触发模糊效果&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Blur.astro 组件已经成功实现了预期功能，完全适配了博客的布局和样式。组件支持多种使用方式，可以灵活地嵌入到各种文本内容中。&lt;/p&gt;
&lt;p&gt;你可以通过修改组件的样式来调整模糊程度、过渡时间和其他视觉效果。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 BlogHeader.astro 组件</title><link>https://sink.zsx815.top/test-blog-header</link><guid isPermaLink="true">https://sink.zsx815.top/test-blog-header</guid><description>这是一篇用来测试 BlogHeader.astro 组件效果的文章</description><pubDate>Thu, 22 Jan 2026 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import BlogHeader from &amp;#39;../../components/mdx/BlogHeader.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 BlogHeader.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 BlogHeader.astro 组件，该组件复刻了 Vue 博客中的 BlogHeader 组件功能。&lt;/p&gt;
&lt;h2&gt;测试默认用法&lt;/h2&gt;
&lt;BlogHeader /&gt;

&lt;h2&gt;测试自定义属性&lt;/h2&gt;
&lt;p&gt;&amp;lt;BlogHeader 
  title=&amp;quot;自定义标题&amp;quot; 
  subtitle=&amp;quot;这是一个自定义副标题&amp;quot;
  emojiTail={[&amp;#39;🎉&amp;#39;, &amp;#39;🎨&amp;#39;, &amp;#39;🚀&amp;#39;, &amp;#39;💡&amp;#39;]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;测试隐藏标题&lt;/h2&gt;
&lt;BlogHeader showTitle={false} /&gt;

&lt;h2&gt;测试自定义图标&lt;/h2&gt;
&lt;p&gt;&lt;BlogHeader 
  logo=&quot;https://github.com/mcyzsx.png&quot; 
  title=&quot;GitHub 头像&quot;
  subtitle=&quot;使用 GitHub 头像作为 logo&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;测试效果说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认样式&lt;/strong&gt;：显示博客 logo、标题和副标题，带有动画效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义属性&lt;/strong&gt;：支持自定义标题、副标题和 emoji 尾缀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏标题&lt;/strong&gt;：可以选择隐藏标题，只显示 logo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义图标&lt;/strong&gt;：支持使用自定义图片作为 logo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动画效果&lt;/strong&gt;：鼠标悬停时触发文字和 emoji 的动画效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：适配不同屏幕尺寸&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;BlogHeader.astro 组件已经成功实现了预期功能，完全适配了博客的布局和样式。组件支持多种配置选项，可以根据需要灵活调整。&lt;/p&gt;
&lt;p&gt;你可以通过修改组件的属性来定制不同的博客头部效果，例如更换 logo、修改标题和副标题、调整 emoji 尾缀等。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 Badge.astro 组件</title><link>https://sink.zsx815.top/test-badge</link><guid isPermaLink="true">https://sink.zsx815.top/test-badge</guid><description>这是一篇用来测试 Badge.astro 组件效果的文章</description><pubDate>Thu, 22 Jan 2026 14:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Badge from &amp;#39;../../components/mdx/Badge.astro&amp;#39;;&lt;/p&gt;
&lt;h1&gt;测试 Badge.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 Badge.astro 组件，该组件复刻了 Vue 博客中的 Badge 组件功能。&lt;/p&gt;
&lt;h2&gt;测试基本用法&lt;/h2&gt;
&lt;Badge text=&quot;基本徽章&quot; /&gt;

&lt;Badge text=&quot;圆形徽章&quot; round={true} /&gt;

&lt;h2&gt;测试链接功能&lt;/h2&gt;
&lt;Badge text=&quot;内部链接&quot; link=&quot;/blog/go-safe&quot; /&gt;

&lt;Badge text=&quot;外部链接&quot; link=&quot;https://github.com&quot; /&gt;

&lt;h2&gt;测试带图标的徽章&lt;/h2&gt;
&lt;h3&gt;GitHub 用户徽章&lt;/h3&gt;
&lt;Badge link=&quot;https://github.com/L33Z22L11&quot; /&gt;

&lt;Badge link=&quot;https://github.com/vercel&quot; text=&quot;Vercel&quot; /&gt;

&lt;h3&gt;网站徽章&lt;/h3&gt;
&lt;Badge link=&quot;https://astro.build&quot; text=&quot;Astro&quot; /&gt;

&lt;Badge link=&quot;https://vuejs.org&quot; text=&quot;Vue.js&quot; /&gt;

&lt;Badge link=&quot;https://react.dev&quot; text=&quot;React&quot; /&gt;

&lt;h3&gt;自定义图片&lt;/h3&gt;
&lt;Badge img=&quot;https://github.com/mcyzsx.png&quot; text=&quot;自定义图片&quot; /&gt;

&lt;h2&gt;测试圆形和方形样式&lt;/h2&gt;
&lt;h3&gt;有图默认圆形&lt;/h3&gt;
&lt;Badge link=&quot;https://github.com&quot; text=&quot;GitHub&quot; /&gt;

&lt;h3&gt;有图强制方形&lt;/h3&gt;
&lt;Badge link=&quot;https://github.com&quot; text=&quot;GitHub 方形&quot; square={true} /&gt;

&lt;h3&gt;无图默认方形&lt;/h3&gt;
&lt;Badge text=&quot;无图方形&quot; /&gt;

&lt;h3&gt;无图强制圆形&lt;/h3&gt;
&lt;Badge text=&quot;无图圆形&quot; round={true} /&gt;

&lt;h2&gt;测试效果说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基本徽章：显示文本，无链接&lt;/li&gt;
&lt;li&gt;链接徽章：显示文本和链接，悬停显示域名&lt;/li&gt;
&lt;li&gt;GitHub 用户徽章：自动获取 GitHub 头像&lt;/li&gt;
&lt;li&gt;网站徽章：自动获取网站 favicon&lt;/li&gt;
&lt;li&gt;自定义图片：显示自定义图片&lt;/li&gt;
&lt;li&gt;圆形样式：根据图片自动调整，也可手动指定&lt;/li&gt;
&lt;li&gt;响应式设计：适配不同屏幕尺寸&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;Badge.astro 组件已经成功实现了预期功能，完全适配了博客的布局和样式。组件支持多种使用方式，可以根据需要灵活配置，提升了博客内容的表现力和视觉效果。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>测试 ProseA.astro 组件</title><link>https://sink.zsx815.top/test-prose-a</link><guid isPermaLink="true">https://sink.zsx815.top/test-prose-a</guid><description>这是一篇用来测试 ProseA.astro 组件效果的文章</description><pubDate>Thu, 22 Jan 2026 12:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;测试 ProseA.astro 组件&lt;/h1&gt;
&lt;p&gt;这篇文章用来测试我新创建的 ProseA.astro 组件，该组件复刻了 Vue 博客中的 ProseA 组件功能。&lt;/p&gt;
&lt;h2&gt;测试内部链接&lt;/h2&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://www.zsxcoder.top/blog/go-safe&quot;&gt;内部链接测试：给博客加一个外链安全中转页&lt;/ProseA&gt;&lt;/p&gt;
&lt;h2&gt;测试外部链接&lt;/h2&gt;
&lt;h3&gt;GitHub 链接&lt;/h3&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://github.com/L33Z22L11/blog-v3&quot;&gt;GitHub 项目链接&lt;/ProseA&gt;&lt;/p&gt;
&lt;h3&gt;Astro 官网&lt;/h3&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://astro.build/&quot;&gt;Astro 官网&lt;/ProseA&gt;&lt;/p&gt;
&lt;h3&gt;Vue 官网&lt;/h3&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://vuejs.org/&quot;&gt;Vue 官网&lt;/ProseA&gt;&lt;/p&gt;
&lt;h3&gt;React 官网&lt;/h3&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://react.dev/&quot;&gt;React 官网&lt;/ProseA&gt;&lt;/p&gt;
&lt;h3&gt;Bilibili 视频&lt;/h3&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://www.bilibili.com/video/BV1keTtzEEtr/&quot;&gt;Bilibili 视频链接&lt;/ProseA&gt;&lt;/p&gt;
&lt;h2&gt;测试自定义图标&lt;/h2&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://example.com&quot; icon=&quot;lucide:external-link&quot;&gt;自定义图标链接&lt;/ProseA&gt;&lt;/p&gt;
&lt;h2&gt;测试长链接&lt;/h2&gt;
&lt;p&gt;&lt;ProseA href=&quot;https://example.com/very/long/path/with/many/parameters?param1=value1&amp;param2=value2&amp;param3=value3&quot;&gt;长链接测试&lt;/ProseA&gt;&lt;/p&gt;
&lt;h2&gt;测试效果说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;内部链接：显示完整链接路径，鼠标悬停时显示完整 URL&lt;/li&gt;
&lt;li&gt;外部链接：显示域名，鼠标悬停时显示域名，自动添加 &lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; 和 &lt;code&gt;rel=&amp;quot;noopener noreferrer&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;特定域名：自动匹配对应图标&lt;/li&gt;
&lt;li&gt;自定义图标：支持手动指定图标&lt;/li&gt;
&lt;li&gt;悬停效果：带有渐变下划线和背景色变化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;ProseA.astro 组件已经成功实现了预期功能，完全适配了博客的布局和样式。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>2025年终总结</title><link>https://sink.zsx815.top/2025-summary</link><guid isPermaLink="true">https://sink.zsx815.top/2025-summary</guid><description>记录我一年到头的所作和所为(极简版)</description><pubDate>Wed, 31 Dec 2025 16:00:28 GMT</pubDate><content:encoded>&lt;p&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;&lt;/p&gt;
&lt;Info&gt;
一年马上要结束了，终于到我写年末总结了！我的年末总结大体还是总结我今年做了什么和明年的展望吧。
&lt;/Info&gt;

&lt;p&gt;import Poetry from &amp;#39;../../components/mdx/Poetry.astro&amp;#39;;&lt;/p&gt;
&lt;p&gt;&amp;lt;Poetry
  title=&amp;quot;归去来兮辞&amp;quot;
  author=&amp;quot;陶渊明&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;往者不可谏，
来者犹可追。
&lt;/Poetry&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;import Quote from &amp;#39;../../components/mdx/Quote.astro&amp;#39;;&lt;/p&gt;
&lt;Quote icon=&quot;ヾ(•ω•`)o&quot;&gt;
今年算是没什么起色，依旧彷徨不定的一年吧。
&lt;/Quote&gt;

&lt;h3&gt;2025.1&lt;/h3&gt;
&lt;p&gt;年初考试，被早早结束甚至连复习作业都没有的电机与电气控制成功背刺，差两分过关。然后就是寒假学车，速成5天去考试，这次一次过，成功拿证！然后算是恶补准备开学补考，然后算是去实践了一段时间。之后就是年底过年，没什么好说的，近些年年味是越来越少，最多也就是去舅舅或者外婆家吃饭了，然后就和普通放假没区别。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;import Badge from &amp;#39;../../components/mdx/Badge.astro&amp;#39;;&lt;/p&gt;
&lt;h3&gt;2025.2&lt;/h3&gt;
&lt;p&gt;到了2月份，陪妈妈出去玩了几天，我不是个喜欢外出的人，而且社恐，不过陪妈妈出去玩还是乐意的。然后在11号下午逛Github时看到了 &lt;Badge link=&quot;https://www.zhilu.site&quot; text=&quot;纸鹿&quot; /&gt; 大佬的&lt;a href=&quot;https://github.com/L33Z22L11/blog-v3&quot;&gt;博客项目&lt;/a&gt;，很好看，于是使用！然后开始我正式学习修改博客的旅程。接下来几天就算是练手和尝试不同的博客，然后开始随便写写。后来时不时分享来自电报的项目在我的&lt;a href=&quot;https://t.me/kemiaofx_me&quot;&gt;频道&lt;/a&gt;上时不时分享我找到的资源。&lt;/p&gt;
&lt;p&gt;很快就开学了，开学正常准备补考，期间还看到4级裸考过关了。然后就是补考过关，然后在26号开始想写写日记，在obs和思源上，基本上一直在坚持，距今基本写了10个月，虽然文笔不怎么样，但一直在坚持。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.3&lt;/h3&gt;
&lt;p&gt;3月份开始我就在不断地尝试各种博客和逛友链，上课等等循环，仔细想想，好久不玩游戏了。期间说实话没什么好写的，同质化严重。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.4&lt;/h3&gt;
&lt;p&gt;4月份又写了些文章，然后忙于学业，同时对博客也一直不是很满意，尝试了很多，同时晚上活动添加一：看LOL比赛。其实也不算看，我有个不算习惯的习惯，干什么事耳朵总想听些东西。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.5&lt;/h3&gt;
&lt;p&gt;年后第一次回家就在劳动节，5天回去转了转，然后就回来实训，准备期末等等，期间发现了不少好的博客主题，不在一一列举。然后在&lt;a href=&quot;https://github.com/kemiaofxjun&quot;&gt;账号&lt;/a&gt;等继续测试，选中了好看的&lt;a href=&quot;https://github.com/everfu/hexo-theme-solitude&quot;&gt;solitude主题&lt;/a&gt;&lt;a href=&quot;https://www.zsxcoder.top/%E5%90%8E%E9%9D%A2%E8%BF%98%E4%BC%9A%E9%87%8D%E6%96%B0%E6%90%9E%E4%B8%80%E4%B8%8B%E3%80%82&quot;&gt;^1&lt;/a&gt;，以及后台&lt;a href=&quot;https://github.com/Qexo/Qexo&quot;&gt;Qexo&lt;/a&gt;&lt;a href=&quot;https://www.zsxcoder.top/%E5%90%8E%E9%9D%A2%E8%BF%98%E4%BC%9A%E9%87%8D%E6%96%B0%E6%90%9E%E4%B8%80%E4%B8%8B%E3%80%82&quot;&gt;^1&lt;/a&gt;。然后在 &lt;Badge link=&quot;https://shengdaoyun.cn&quot; text=&quot;圣道云&quot; /&gt;开始了typecho和WordPress博客的搭建。由于我的需求不大，最后选择了typecho。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.6&lt;/h3&gt;
&lt;p&gt;6月份开始，电脑出了点问题，反复进BIOS，初步推断是硬盘的问题，但是当时期末有PLC的课，实在不好去修，于是先将就着，然后那段时间就不改项目和写日记了。顺便裸考了一次六级卖，有一说一，感觉和四级差不多难度🤔。然后考完了期末，放假。&lt;/p&gt;
&lt;p&gt;回了家去给电脑清个灰，加了点内存，然后那个问题就不在出现了。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.7&lt;/h3&gt;
&lt;p&gt;暑假第一个月其实就是在实践和休息里面度过，陪老妈转了几天，然后我就肾结石了。&lt;/p&gt;
&lt;p&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;/p&gt;
&lt;Warning&gt;
少喝饮料多运动！
&lt;/Warning&gt;
睡醒痛的我死去活来，感人人要没了，后来去医院检查，差点动手术，后面吃药自然排出了。

&lt;p&gt;月底的时候搞了台服务器，然后玩了几天Halo，动态的博客还是不大适应，一般般吧，后面就放弃了，然后部署了&lt;a href=&quot;https://github.com/lin-snow/Ech0&quot;&gt;Ech0&lt;/a&gt;、&lt;a href=&quot;https://github.com/kingwrcy/moments&quot;&gt;Moments&lt;/a&gt;等服务，挺有意思的。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.8&lt;/h3&gt;
&lt;p&gt;8月份其实没什么，着重来说就是新开了个号，然后就是继续玩各种项目和实践。20号一看，六级裸考过关了。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.9&lt;/h3&gt;
&lt;p&gt;开学后继续改博客，然后上课，看比赛然后就是搞了些许项目。后面电脑的问题又出来了，但是被我倒腾了一段时间就好了。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.10&lt;/h3&gt;
&lt;p&gt;国庆在家瘫了7天，然后继续改博客，写博客，回来后就是上课，解决了宽禁带半导体的2万多字的论文和排版，恶心坏我了。在月底的鸭科夫时又出现了那个问题，初步确定是系统盘的问题，拿去售后换了个盘，修了下一些成年旧事。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.11&lt;/h3&gt;
&lt;p&gt;这个月搞好后重新搞环境等等，上课什么的，没什么好说的。月底开始实训，是关于水净化系统的编程，前三天画图，后面那B系统已经绝版，全世界估计就那一间实验室还在用的老古董，能不能用全看天，哪天能用全看天，没什么好说的，因此就是没什么急迫感。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2025.12&lt;/h3&gt;
&lt;p&gt;这个月就是继续完成实训，上课，再战六级，同样裸考，随便玩玩，反正过了。然后月底再次重搞blog-v3，每次打开项目还是有新的想法还是不错的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;今年还是那咸鱼样，摆烂惯了，总体来说比去年这时候肯定是进步的，还是希望明年更好吧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;展望&lt;/h2&gt;
&lt;p&gt;不算什么展望吧，希望明年会的更多，解决更多的问题，过得越来越好吧。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>给博客加一个外链安全中转页（/go）</title><link>https://sink.zsx815.top/go-safe</link><guid isPermaLink="true">https://sink.zsx815.top/go-safe</guid><description>记录在 Nuxt 博客里新增 /go 外链安全中转页面，并改造 Markdown 链接和友链统一通过中转跳转的过程。</description><pubDate>Wed, 10 Dec 2025 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;::alert
这篇文章来自&lt;strong&gt;AI&lt;/strong&gt;整理！
::&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;想做一个类似 &lt;a href=&quot;https://github.com/willow-god/hexo-safego&quot;&gt;&lt;code&gt;hexo-safego&lt;/code&gt;&lt;/a&gt; 的外链安全检测 / 中转效果，于是在自己的 Nuxt 博客里加了一个 &lt;code&gt;/go&lt;/code&gt; 页面，用来统一接住外链，给用户一个“即将离开本站”的提醒和手动确认。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这篇文章记录一下整个实现过程：从需求拆解，到 &lt;code&gt;go.vue&lt;/code&gt; 的实现，再到 Markdown 外链、友链卡片接入中转页，以及中途踩到的几个小坑。&lt;/p&gt;
&lt;h2&gt;背景 &amp;amp; 需求&lt;/h2&gt;
&lt;p&gt;需求最初很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;站内所有 &lt;strong&gt;外链&lt;/strong&gt;（包括 Markdown 正文里的链接、友链页里的链接），点击时不要直接打开目标网站；&lt;/li&gt;
&lt;li&gt;先跳到一个中转页 &lt;code&gt;/go?url=...&lt;/code&gt;：&lt;ul&gt;
&lt;li&gt;提示“即将离开本站”；&lt;/li&gt;
&lt;li&gt;显示目标链接和域名；&lt;/li&gt;
&lt;li&gt;提供「继续访问」和「返回上一页」两个按钮；&lt;/li&gt;
&lt;li&gt;支持几秒钟的倒计时，自动跳转；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;内部链接（例如 &lt;code&gt;/posts/...&lt;/code&gt;、&lt;code&gt;/about&lt;/code&gt;）保持原样，不走 &lt;code&gt;/go&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后确定的范围是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdown 渲染组件 &lt;code&gt;ProseA.vue&lt;/code&gt;（文章正文中的链接）；&lt;/li&gt;
&lt;li&gt;友链页使用的 &lt;code&gt;FriendLinkCard.vue&lt;/code&gt;（&lt;code&gt;link.vue&lt;/code&gt; 页面中的友链卡片）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;实现 &lt;code&gt;/go&lt;/code&gt; 页面&lt;/h2&gt;
&lt;p&gt;首先在 &lt;code&gt;app/pages/go.vue&lt;/code&gt; 新增一个页面，对应路由 &lt;code&gt;/go&lt;/code&gt;。这个页面做几件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从 query 参数里拿到原始链接 &lt;code&gt;url&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;做一层解码和合法性判断；&lt;/li&gt;
&lt;li&gt;展示信息 + 倒计时；&lt;/li&gt;
&lt;li&gt;处理手动「继续访问」和「返回上一页」。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;解析 URL 与合法性判断&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;
const route = useRoute()
const router = useRouter()

// 原始 query 参数
const rawUrl = computed(() =&amp;gt; (route.query.url as string) || &amp;#39;&amp;#39;)

// 解码后的 URL：优先 decode，失败就回退到原始字符串，保证按钮始终有值可用
const decodedUrl = computed(() =&amp;gt; {
  if (!rawUrl.value)
    return &amp;#39;&amp;#39;
  try {
    return decodeURIComponent(rawUrl.value)
  }
  catch {
    // 如果解码失败，回退使用原始字符串，保证按钮依然可用
    return rawUrl.value
  }
})

// 检查是否是一个合法的 http/https 外链
const isValidExternal = computed(() =&amp;gt; {
  if (!decodedUrl.value)
    return false
  try {
    const u = new URL(decodedUrl.value)
    return u.protocol === &amp;#39;http:&amp;#39; || u.protocol === &amp;#39;https:&amp;#39;
  }
  catch {
    return false
  }
})

// 提取域名用于展示
const domain = computed(() =&amp;gt; {
  if (!isValidExternal.value)
    return &amp;#39;&amp;#39;
  try {
    return new URL(decodedUrl.value).hostname
  }
  catch {
    return &amp;#39;&amp;#39;
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里有一个小细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;一开始如果 decodeURIComponent 失败，直接返回空字符串会导致后面一系列逻辑都认为“无效链接”，按钮会被禁用，看起来像“点不了”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;后来改为失败回退到 rawUrl ，只要 query 里有东西，最终就有一个可用字符串。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;倒计时和自动跳转&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;const countdownSeconds = 5
const countdown = ref(countdownSeconds)
let countdownTimer: number | null = null

onMounted(() =&amp;gt; {
  if (!isValidExternal.value)
    return

  countdown.value = countdownSeconds

  countdownTimer = window.setInterval(() =&amp;gt; {
    if (countdown.value &amp;lt;= 1) {
      clearCountdown()
      proceed()
    }
    else {
      countdown.value -= 1
    }
  }, 1000)
})

onUnmounted(() =&amp;gt; {
  clearCountdown()
})

function clearCountdown() {
  if (countdownTimer != null) {
    clearInterval(countdownTimer)
    countdownTimer = null
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设计思路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只要判断为合法外链，就从设定的秒数开始倒计时；&lt;/li&gt;
&lt;li&gt;每秒减 1，减到 1 时自动调用 proceed() ；&lt;/li&gt;
&lt;li&gt;页面销毁（路由离开）时清理定时器，避免内存泄漏或误触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;手动跳转和返回逻辑&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;function proceed() {
  const target = decodedUrl.value || rawUrl.value
  if (!target)
    return

  clearCountdown()
  window.location.href = target
}

function goBack() {
  clearCountdown()

  // 1. 如果是通过 window.open 打开的新标签页，优先尝试关闭自己
  if (window.opener &amp;amp;&amp;amp; window.opener !== window) {
    window.close()
    return
  }

  // 2. 有历史记录就正常返回
  if (history.length &amp;gt; 1) {
    history.back()
    return
  }

  // 3. 没有历史时，尝试根据同源 referrer 返回
  if (document.referrer) {
    try {
      const ref = new URL(document.referrer)
      if (ref.origin === window.location.origin) {
        router.push(ref.pathname + ref.search + ref.hash)
        return
      }
    }
    catch {
      // ignore
    }
  }

  // 4. 兜底：回首页
  router.push(&amp;#39;/&amp;#39;)
}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里对「返回上一页」做了比较细的兼容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;友链卡片那种新标签页场景&lt;/strong&gt;：通过 window.open(&amp;#39;/go?url=...&amp;#39;, &amp;#39;_blank&amp;#39;) 打开的 /go 页面，其实没有历史记录，这时 history.back() 是无效的，于是我们优先检测 window.opener ，直接 window.close() ，让原来的标签页停留在友链页不动；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同标签页场景&lt;/strong&gt;：有历史记录就走 history.back() ，行为和用户点浏览器后退按钮一致；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有历史、没有同源 referrer 的极端场景&lt;/strong&gt;：最后才兜底跳首页。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;模板和样式&lt;/h3&gt;
&lt;p&gt;模板部分主要就是展示提示、链接、按钮和倒计时：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;template&amp;gt;
  &amp;lt;div class=&amp;quot;go-page&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;go-card&amp;quot;&amp;gt;
      &amp;lt;h1 class=&amp;quot;go-title&amp;quot;&amp;gt;即将离开本站&amp;lt;/h1&amp;gt;
      &amp;lt;p class=&amp;quot;go-desc&amp;quot;&amp;gt;
        你将要访问的外部链接：
      &amp;lt;/p&amp;gt;
      &amp;lt;p v-if=&amp;quot;isValidExternal&amp;quot; class=&amp;quot;go-url&amp;quot;&amp;gt;{{ decodedUrl }}&amp;lt;/p&amp;gt;
      &amp;lt;p v-else class=&amp;quot;go-url invalid&amp;quot;&amp;gt;链接无效或缺失&amp;lt;/p&amp;gt;

      &amp;lt;p v-if=&amp;quot;isValidExternal&amp;quot; class=&amp;quot;go-domain&amp;quot;&amp;gt;
        目标站点：&amp;lt;strong&amp;gt;{{ domain }}&amp;lt;/strong&amp;gt;
      &amp;lt;/p&amp;gt;

      &amp;lt;div class=&amp;quot;go-actions&amp;quot;&amp;gt;
        &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;btn secondary&amp;quot; @click=&amp;quot;goBack&amp;quot;&amp;gt;
          返回上一页
        &amp;lt;/button&amp;gt;
        &amp;lt;button
          type=&amp;quot;button&amp;quot;
          class=&amp;quot;btn primary&amp;quot;
          @click=&amp;quot;proceed&amp;quot;
        &amp;gt;
          继续访问&amp;lt;span v-if=&amp;quot;domain&amp;quot;&amp;gt; {{ domain }}&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;p v-if=&amp;quot;isValidExternal&amp;quot; class=&amp;quot;go-countdown&amp;quot;&amp;gt;
        {{ countdown }} 秒后将自动跳转，如不希望跳转，请点击「返回上一页」
      &amp;lt;/p&amp;gt;

      &amp;lt;p class=&amp;quot;go-tip&amp;quot;&amp;gt;
        外部网站内容与本博客无关，请注意辨别信息和账号安全。
      &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;样式部分使用了博客现有的变量（ &lt;code&gt;var(--c-text)&lt;/code&gt;、 &lt;code&gt;var(--ld-bg-card)&lt;/code&gt; 等），整体就是一个居中的卡片，这里不赘述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;接入 Markdown 外链：改造 &lt;code&gt;ProseA.vue&lt;/code&gt;&lt;/strong&gt;
博客的 Markdown 链接渲染组件是 &lt;code&gt;app/components/content/ProseA.vue&lt;/code&gt; ，原来大致是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根据 &lt;code&gt;href&lt;/code&gt; 判断是否外链；&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;UtilLink&lt;/code&gt; 渲染；&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;v-tip&lt;/code&gt; 显示域名或完整地址。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了让 Markdown 外链走 &lt;code&gt;/go&lt;/code&gt; ，改动非常小，只需要在这里统一改造 &lt;code&gt;href&lt;/code&gt; 即可：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;const props = defineProps&amp;lt;{
  href: string
  icon?: string
}&amp;gt;()

const icon = computed(() =&amp;gt; props.icon || getDomainIcon(props.href))
const isExternal = computed(() =&amp;gt; isExtLink(props.href))

// 外链统一改成指向 /go?url=encodeURIComponent(href)
const resolvedHref = computed(() =&amp;gt; (
  isExternal.value ? `/go?url=${encodeURIComponent(props.href)}` : props.href
))

const tip = computed(() =&amp;gt; ({
  content: isExternal.value ? getDomain(props.href) : decodeURIComponent(props.href),
  inlinePositioning: true,
}))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模板：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Vue&quot;&gt;&amp;lt;template&amp;gt;
  &amp;lt;UtilLink v-tip=&amp;quot;tip&amp;quot; class=&amp;quot;z-link&amp;quot; :to=&amp;quot;resolvedHref&amp;quot;&amp;gt;
    &amp;lt;Icon v-if=&amp;quot;icon&amp;quot; class=&amp;quot;domain-icon&amp;quot; :name=&amp;quot;icon&amp;quot; /&amp;gt;
    &amp;lt;slot /&amp;gt;
  &amp;lt;/UtilLink&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样一来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdown 里写的 &lt;code&gt;https://xxx&lt;/code&gt; 外链 → 页面中变成指向 &lt;code&gt;/go?url=...&lt;/code&gt; 的链接；&lt;/li&gt;
&lt;li&gt;内部链接（ &lt;code&gt;/about&lt;/code&gt; 、 &lt;code&gt;/posts/...&lt;/code&gt; ）仍然直接跳内部路由，不走 &lt;code&gt;/go&lt;/code&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;接入友链卡片&lt;/strong&gt;：改造 &lt;code&gt;FriendLinkCard.vue&lt;/code&gt;&lt;br&gt;
友链页 &lt;code&gt;link.vue&lt;/code&gt; 使用的是 &lt;code&gt;app/components/partial/FriendLinkCard.vue&lt;/code&gt; 这张卡片。原来的跳转逻辑是直接打开站点：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;function navigateToSite() {
  if (props.siteUrl) {
    window.open(props.siteUrl, &amp;#39;_blank&amp;#39;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改造后统一走 &lt;code&gt;/go&lt;/code&gt; ：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;function navigateToSite() {
  if (!props.siteUrl)
    return

  const target = `/go?url=${encodeURIComponent(props.siteUrl)}`
  window.open(target, &amp;#39;_blank&amp;#39;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;友链页面点“前往网站”时，不再直接打开友链，而是新开一个 &lt;code&gt;/go&lt;/code&gt; 标签页；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/go&lt;/code&gt; 负责显示提示、倒计时和跳转；&lt;/li&gt;
&lt;li&gt;返回时能够区分“新开标签页”这个场景，优先关闭自己，不干扰原来的 &lt;code&gt;link.vue&lt;/code&gt; 页面滚动位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;一些踩坑 &amp;amp; 调整&lt;/h3&gt;
&lt;p&gt;在实现过程中踩了几个小坑，顺手记一下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 链接合法性校验过于严格导致按钮点不了&lt;/strong&gt;&lt;br&gt;一开始「继续访问」按钮的禁用逻辑是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;button
  :disabled=&amp;quot;!isValidExternal&amp;quot;
  @click=&amp;quot;proceed&amp;quot;
&amp;gt;
  继续访问
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而 &lt;code&gt;isValidExternal&lt;/code&gt; 是通过 &lt;code&gt;new URL(decodedUrl)&lt;/code&gt; + 协议判断实现的。这样做的初衷是安全：&lt;/p&gt;
&lt;p&gt;URL 缺失、编码错误、协议不是 http/https → 认为不安全，按钮禁用。
但实际使用时：&lt;/p&gt;
&lt;p&gt;我们对外链统一做了 &lt;code&gt;encodeURIComponent&lt;/code&gt; ；
中间一旦出现编码/解码上的处理差异， &lt;code&gt;isValidExternal&lt;/code&gt; 就可能是 &lt;code&gt;false&lt;/code&gt; ；
结果就是：&lt;strong&gt;页面能显示链接，倒计时能自动跳转，但按钮一直是禁用状态，用户手动点不了&lt;/strong&gt;。
后面改成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isValidExternal&lt;/code&gt; 只用于显示信息（例如显示域名、显示“链接无效或缺失”）；&lt;/li&gt;
&lt;li&gt;按钮本身不再绑定禁用条件，始终可点，真正的兜底放在&lt;code&gt;proceed()&lt;/code&gt;里：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;function proceed() {
  const target = decodedUrl.value || rawUrl.value
  if (!target)
    return

  clearCountdown()
  window.location.href = target
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样既保留了一定的安全感知，又不至于影响正常访问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 返回上一页导致滚动位置混乱&lt;/strong&gt;&lt;br&gt;友链卡片是通过 &lt;code&gt;window.open&lt;/code&gt; 新开 &lt;code&gt;/go&lt;/code&gt; 标签页的，但 &lt;code&gt;/go&lt;/code&gt; 一开始是这么写的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;function goBack() {
  if (history.length &amp;gt; 1)
    history.back()
  else
    router.push(&amp;#39;/&amp;#39;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新标签页基本没有历史，所以会直接 &lt;code&gt;router.push(&amp;#39;/&amp;#39;)&lt;/code&gt; 跳首页。视觉体验就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你明明是从 &lt;code&gt;link.vue&lt;/code&gt; 底部的友链区域点过来的；&lt;/li&gt;
&lt;li&gt;点了「返回上一页」却去了首页，原来的页面滚动位置也被重置，看起来像是“底部组件跑到顶部”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重写后的 &lt;code&gt;goBack&lt;/code&gt; 逻辑就解决了这个体验问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新标签页优先 &lt;code&gt;window.close()&lt;/code&gt; ；&lt;/li&gt;
&lt;li&gt;同标签页用 &lt;code&gt;history.back()&lt;/code&gt; ；&lt;/li&gt;
&lt;li&gt;实在没有历史才兜底根据 &lt;code&gt;document.referrer&lt;/code&gt; / 首页处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;通过这次改造，博客里所有指定范围的外链都统一走了 &lt;code&gt;/go&lt;/code&gt; 中转页，达到了类似 hexo-safego 的效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户在点击外链前会看到明确的提示；&lt;/li&gt;
&lt;li&gt;可以手动选择继续访问或返回；&lt;/li&gt;
&lt;li&gt;也支持倒计时自动跳转；&lt;/li&gt;
&lt;li&gt;Markdown 正文和友链页都接入了这套逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整体实现成本并不高，但能明显提升外链安全感知和交互体验。如果以后需要更严格的策略（例如只允许白名单域名、记录访问日志等），也可以在 &lt;code&gt;/go&lt;/code&gt; 这个集中入口上继续扩展。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>关于github-issues当做动态的想法</title><link>https://sink.zsx815.top/github-issues-moment</link><guid isPermaLink="true">https://sink.zsx815.top/github-issues-moment</guid><description>起源于在不同博客游览间，看到了一篇文章，感觉很有搞头，然后到了博主的GitHub仓库，然后有了些感受。</description><pubDate>Wed, 24 Sep 2025 20:56:28 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;起源于在不同博客游览间，看到了一篇&lt;a href=&quot;https://lawtee.com/article/add-live-talking-page-for-static-blog/&quot;&gt;文章&lt;/a&gt;，感觉很有搞头，然后到了博主的&lt;a href=&quot;https://github.com/h2dcc/moments&quot;&gt;GitHub仓库&lt;/a&gt;，然后有了些感受。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;优点&lt;/h2&gt;
&lt;p&gt;有不少的博客基于github-issues，包括&lt;a href=&quot;https://github.com/wallleap/ethereal&quot;&gt;etheral&lt;/a&gt;、&lt;a href=&quot;https://github.com/Meekdai/Gmeek&quot;&gt;Gmeek&lt;/a&gt;等等，当然，除了当博客，你也可以使用其来搞博客。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt; 很好的一种博客写作方式，理论上GitHub不倒，这个方式可以一直使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;手机上有GitHub的APP，你可以比较简单地在手机上发布动态。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;这种方式可以被用来在各种博客里使用，包括Hugo、astro等等。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;大致的工作流如下:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;// .github/workflows/issue.yml

name: Trigger Empty Commit on Issue UppubDate

on:
  issue_comment:
    types: [created, edited]
  workflow_dispatch:  # 手动触发入口

jobs:
  trigger-empty-commit:
    runs-on: ubuntu-latest
    steps:
      - name: Check trigger type and prepare commit message
        id: check-trigger
        run: |
          # 处理手动触发
          if [[ &amp;quot;${{ github.event_name }}&amp;quot; == &amp;quot;workflow_dispatch&amp;quot; ]]; then
            echo &amp;quot;should_trigger=true&amp;quot; &amp;gt;&amp;gt; $GITHUB_OUTPUT
            echo &amp;quot;commit_msg=&amp;#39;[Manual] Trigger uppubDate from moments/issues/1&amp;#39;&amp;quot; &amp;gt;&amp;gt; $GITHUB_OUTPUT
          # 处理issue评论事件
          elif [ &amp;quot;${{ github.event.issue.number }}&amp;quot; -eq 1 ]; then
            echo &amp;quot;should_trigger=true&amp;quot; &amp;gt;&amp;gt; $GITHUB_OUTPUT
            echo &amp;quot;commit_msg=&amp;#39;Trigger uppubDate from moments/issues/1&amp;#39;&amp;quot; &amp;gt;&amp;gt; $GITHUB_OUTPUT
          else
            echo &amp;quot;should_trigger=false&amp;quot; &amp;gt;&amp;gt; $GITHUB_OUTPUT
            echo &amp;quot;commit_msg=&amp;#39;&amp;#39;&amp;quot; &amp;gt;&amp;gt; $GITHUB_OUTPUT
          fi

      - name: Trigger empty commit in lawtee.github.io
        if: steps.check-trigger.outputs.should_trigger == &amp;#39;true&amp;#39;
        uses: actions/github-script@v6
        env:
          PAT: ${{ secrets.PAT }}
        with:
          script: |
            const { execSync } = require(&amp;#39;child_process&amp;#39;);
            const repo = &amp;#39;h2dcc/lawtee.github.io&amp;#39;;
            const token = process.env.PAT;
      
            // 从步骤输出获取提交信息
            const commitMsg = `${{ steps.check-trigger.outputs.commit_msg }}`;

            try {
              const repoUrl = `https://x-access-token:${token}@github.com/${repo}.git`;
              execSync(`git clone ${repoUrl}`, { stdio: &amp;#39;inherit&amp;#39; });
              process.chdir(&amp;#39;lawtee.github.io&amp;#39;);

              execSync(&amp;#39;git config user.name &amp;quot;github-actions[bot]&amp;quot;&amp;#39;, { stdio: &amp;#39;inherit&amp;#39; });
              execSync(&amp;#39;git config user.email &amp;quot;41898282+github-actions[bot]@users.noreply.github.com&amp;quot;&amp;#39;, { stdio: &amp;#39;inherit&amp;#39; });

              // 安全执行空提交
              execSync(`git commit --allow-empty -m &amp;quot;${commitMsg.replace(/&amp;quot;/g, &amp;#39;\\&amp;quot;&amp;#39;)}&amp;quot;`, { stdio: &amp;#39;inherit&amp;#39; });
              execSync(`git push ${repoUrl} master`, { stdio: &amp;#39;inherit&amp;#39; });
              console.log(&amp;#39;✅ Empty commit pushed successfully!&amp;#39;);
            } catch (error) {
              console.error(&amp;#39;❌ Error:&amp;#39;, error.message);
              process.exit(1);
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你需要的，是搞个公开的仓库(私有仓库不能使用非远程图片)，然后准备上述的工作流，然后&lt;strong&gt;在 Github 账号设置 &lt;code&gt;Personal access tokens&lt;/code&gt; 中添加一个 token , 勾选 &lt;code&gt;repo&lt;/code&gt; 权限，复制到说说仓库 &lt;code&gt;secrets and variables - action&lt;/code&gt; 中，名称为 &lt;code&gt;PAT&lt;/code&gt;&lt;/strong&gt; 。&lt;/p&gt;
&lt;h2&gt;发布说说&lt;/h2&gt;
&lt;p&gt;这一步需要的是开启一个issue，然后在这个issue里面不断发布评论来当做&lt;strong&gt;动态&lt;/strong&gt;，然后就是把这个issue的链接如&lt;a href=&quot;https://github.com/h2dcc/moments/issues/1%E2%80%B8&quot;&gt;https://github.com/h2dcc/moments/issues/1&lt;/a&gt;，改为类似&lt;a href=&quot;https://api.github.com/repos/microsoft/vscode/issues/519/comments%E2%80%B8&quot;&gt;https://api.github.com/repos/microsoft/vscode/issues/519/comments&lt;/a&gt;，如果你要在前端展示，你需要一个密钥，要有&lt;code&gt;repo&lt;/code&gt;权限，你才能正常使用，否则会有较大的限制。关于这个，我觉得要在cloudflare里搞个worker然后再worker的环境变量里添加上面的密钥，大致worker代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// CF Worker 入口
export default {
  async fetch(req, env) {
    return await handle(req, env);
  }
};

async function handle(req, env) {
  const url = new URL(req.url);

  // 只代理 /api/comments
  if (url.pathname !== &amp;#39;/api/comments&amp;#39;) {
    return new Response(&amp;#39;Not Found&amp;#39;, { status: 404 });
  }

  const upstream = &amp;#39;https://api.github.com/repos/microsoft/vscode/issues/519/comments&amp;#39;;

  const res = await fetch(upstream, {
    headers: {
      &amp;#39;Authorization&amp;#39;: &amp;#39;token &amp;#39; + env.GH_TOKEN, // ✅ 正确读取环境变量
      &amp;#39;User-Agent&amp;#39;: &amp;#39;CF-Worker-Giscus-Proxy&amp;#39;
    }
  });

  const headers = new Headers(res.headers);
  headers.set(&amp;#39;Access-Control-Allow-Origin&amp;#39;, &amp;#39;*&amp;#39;);

  return new Response(res.body, {
    status: res.status,
    statusText: res.statusText,
    headers
  });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后再搞个自定义域名，然后在后面加后缀&lt;code&gt;/api/comments&lt;/code&gt;，你就能比较不受限制的观看动态了，&lt;/p&gt;
&lt;h2&gt;前端&lt;/h2&gt;
&lt;p&gt;接下来就是我自己搞的一个html的简单&lt;a href=&quot;https://github.com/zsxjun/github-issues-moments&quot;&gt;前端&lt;/a&gt;，靠着AI完善了一下，可以参考参考: &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;quot;zh-CN&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link rel=&amp;quot;icon&amp;quot; type=&amp;quot;image/png&amp;quot;
    href=&amp;quot;https://img.314926.xyz/images/2025/09/20/zsx-avatar.webp &amp;quot; 
    sizes=&amp;quot;32x32&amp;quot;&amp;gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;钟神秀的瞬间&amp;lt;/title&amp;gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;
    &amp;lt;style&amp;gt;
        :root {
            --bg: #f5f5f5;
            --fg: #333333;
            --card: #ffffff;
            --link: #576b95;
            --border: #e1e1e1;
            --avatar-border: #f0f0f0;
            --time-color: #888888;
            --like-color: #ff2442;
            --comment-bg: #f7f7f7;
            --shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
            --active-page-bg: #576b95;
            --active-page-fg: #ffffff;
            --action-btn-color: #7d7d7d;
            --divider-color: #f0f0f0;
            --header-image-height: 180px;
            --content-max-width: 600px;
        }
        [data-theme=&amp;quot;dark&amp;quot;] {
            --bg: #1a1a1a;
            --fg: #e6e6e6;
            --card: #242424;
            --link: #7d9fd3;
            --border: #3a3a3a;
            --avatar-border: #3a3a3a;
            --time-color: #a0a0a0;
            --like-color: #ff5c7a;
            --comment-bg: #2d2d2d;
            --shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
            --active-page-bg: #7d9fd3;
            --active-page-fg: #ffffff;
            --action-btn-color: #a0a0a0;
            --divider-color: #3a3a3a;
            --header-image-height: 200px;
        }
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        body {
            font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif;
            background: var(--bg);
            color: var(--fg);
            line-height: 1.6;
            transition: background .3s, color .3s;
            padding-bottom: 40px;
        }
        a {
            color: var(--link);
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        nav {
            display: flex;
            align-items: center;
            justify-content: space-between;
            padding: 12px 16px;
            background: var(--card);
            border-bottom: 1px solid var(--border);
            position: sticky;
            top: 0;
            z-index: 100;
            box-shadow: var(--shadow);
        }
        .nav-left {
            display: flex;
            align-items: center;
            gap: 10px;
            font-weight: 600;
            font-size: 18px;
        }
        .icon {
            width: 24px;
            height: 24px;
            fill: currentColor;
        }
        #theme-toggle {
            cursor: pointer;
            background: transparent;
            border: 1px solid var(--border);
            color: var(--fg);
            padding: 6px 12px;
            border-radius: 16px;
            font-size: 14px;
            display: flex;
            align-items: center;
            gap: 6px;
        }
        .header-image {
            width: 100%;
            max-width: var(--content-max-width);
            height: var(--header-image-height);
            background: linear-gradient(135deg, #6e8efb, #a777e3);
            position: relative;
            overflow: hidden;
            margin: 0 auto 15px;
            border-radius: 12px;
            border: 1px solid var(--border);
        }
        .header-image::before {
            content: &amp;quot;&amp;quot;;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: url(&amp;#39;https://img.314926.xyz/images/2025/09/22/20250922193025414.webp &amp;#39;) center/cover;
            opacity: 0.9;
        }
        .header-title {
            position: absolute;
            left: 20px;
            bottom: 20px;
            color: white;
            font-size: 24px;
            font-weight: bold;
            text-shadow: 0 2px 4px rgba(0,0,0,0.3);
            z-index: 2;
        }
        .header-info {
            position: absolute;
            right: 20px;
            bottom: 20px;
            color: white;
            z-index: 2;
            cursor: pointer;
            font-size: 20px;
        }
        @media (max-width: 640px) {
            .header-image {
                border-radius: 0;
                margin-bottom: 10px;
            }
            :root {
                --header-image-height: 160px;
            }
            [data-theme=&amp;quot;dark&amp;quot;] {
                --header-image-height: 180px;
            }
        }
        .info-modal {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(0,0,0,0.7);
            z-index: 1000;
            justify-content: center;
            align-items: center;
        }
        .info-content {
            background: var(--card);
            padding: 20px;
            border-radius: 12px;
            max-width: 80%;
            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
            position: relative;
        }
        .close-modal {
            position: absolute;
            top: 10px;
            right: 15px;
            font-size: 24px;
            cursor: pointer;
        }
        main {
            max-width: var(--content-max-width);
            margin: 0 auto;
            padding: 0 10px;
            width: 100%;
        }
        .moment-article {
            background: var(--card);
            border-radius: 12px;
            padding: 0;
            margin-bottom: 15px;
            box-shadow: var(--shadow);
            border: 1px solid var(--border);
            overflow: hidden;
        }
        .article-header {
            display: flex;
            align-items: center;
            padding: 12px 15px;
        }
        .avatar {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            margin-right: 12px;
            border: 2px solid var(--avatar-border);
            object-fit: cover;
        }
        .user-info {
            flex: 1;
        }
        .user-name {
            font-weight: 500;
            font-size: 16px;
            margin-bottom: 2px;
        }
        .post-time {
            font-size: 12px;
            color: var(--time-color);
        }
        .moment-content {
            padding: 0 15px 15px 15px;
            margin-left: 52px;
            margin-top: -10px;
            font-size: 15px;
            line-height: 1.5;
        }
        .moment-content p {
            margin-bottom: 10px;
        }
        .moment-content pre {
            background: var(--bg);
            padding: 12px;
            border-radius: 6px;
            overflow: auto;
            font-size: 14px;
            margin: 10px 0;
        }
        .moment-content blockquote {
            border-left: 3px solid var(--border);
            padding-left: 12px;
            margin: 10px 0;
            color: var(--fg);
            opacity: .8;
            font-size: 14px;
            background: var(--comment-bg);
            border-radius: 0 6px 6px 0;
            padding: 8px 12px;
        }
        .moment-content code {
            background-color: var(--bg);
            padding: 2px 4px;
            border-radius: 3px;
            font-size: 14px;
        }
        .moment-content img {
            max-width: 100%;
            border-radius: 6px;
            margin: 8px 0;
        }
        .error, .no-content {
            text-align: center;
            margin-top: 40px;
            font-size: 16px;
            color: var(--time-color);
        }
        .pagination {
            display: flex;
            justify-content: center;
            margin: 20px 0;
            gap: 8px;
        }
        .page-btn {
            padding: 6px 12px;
            border: 1px solid var(--border);
            background: var(--card);
            color: var(--fg);
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
            transition: all 0.2s;
        }
        .page-btn:hover {
            background: var(--bg);
        }
        .page-btn.active {
            background: var(--active-page-bg);
            color: var(--active-page-fg);
            border-color: var(--active-page-bg);
        }
        .page-btn.disabled {
            opacity: 0.5;
            cursor: not-allowed;
        }
        .giscus-container {
            max-width: var(--content-max-width);
            margin: 30px auto 0 auto;
            padding: 0 10px;
        }
        .loading {
            display: flex;
            justify-content: center;
            padding: 20px;
        }
        .loading-spinner {
            width: 24px;
            height: 24px;
            border: 3px solid var(--border);
            border-top-color: var(--link);
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }
        @keyframes spin {
            to { transform: rotate(360deg); }
        }
        /* 右下角编辑按钮 */
        .edit-btn {
            position: fixed;
            right: 20px;
            bottom: 20px;
            width: 48px;
            height: 48px;
            border-radius: 50%;
            background: var(--card);
            color: var(--fg);
            border: 1px solid var(--border);
            box-shadow: var(--shadow);
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 20px;
            cursor: pointer;
            transition: all .3s;
            z-index: 999;
        }
        .edit-btn:hover {
            transform: scale(1.1);
            box-shadow: 0 4px 12px rgba(0,0,0,.15);
        }
        /* 手机端缩小一点 */
        @media (max-width: 640px) {
            .edit-btn {
                width: 44px;
                height: 44px;
                font-size: 18px;
                right: 16px;
                bottom: 16px;
            }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;nav&amp;gt;
        &amp;lt;div class=&amp;quot;nav-left&amp;quot;&amp;gt;
            &amp;lt;svg class=&amp;quot;icon&amp;quot; viewBox=&amp;quot;0 0 16 16&amp;quot;&amp;gt;
                &amp;lt;path d=&amp;quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38
                         0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01
                         1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95
                         0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0
                         1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0
                         3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8z&amp;quot;/&amp;gt;
            &amp;lt;/svg&amp;gt;
            &amp;lt;span&amp;gt;钟神秀的瞬间&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;button id=&amp;quot;theme-toggle&amp;quot; aria-label=&amp;quot;切换主题&amp;quot;&amp;gt;
            &amp;lt;span id=&amp;quot;theme-icon&amp;quot;&amp;gt;🌙&amp;lt;/span&amp;gt;
            &amp;lt;span&amp;gt;切换主题&amp;lt;/span&amp;gt;
        &amp;lt;/button&amp;gt;
    &amp;lt;/nav&amp;gt;

    &amp;lt;div class=&amp;quot;header-image&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;header-title&amp;quot;&amp;gt;即刻短文&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;header-info&amp;quot; id=&amp;quot;info-button&amp;quot;&amp;gt;❗&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&amp;quot;info-modal&amp;quot; id=&amp;quot;info-modal&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;info-content&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;close-modal&amp;quot; id=&amp;quot;close-modal&amp;quot;&amp;gt;×&amp;lt;/div&amp;gt;
            &amp;lt;h3&amp;gt;钟神秀的瞬间记录&amp;lt;/h3&amp;gt;
            &amp;lt;p&amp;gt;这里收录了我的生活随笔、技术思考和灵感闪现。每一段文字都是时光的切片，记录当下的真实感受。&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;main id=&amp;quot;main-container&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;loading&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;loading-spinner&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;

    &amp;lt;div id=&amp;quot;pagination-container&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;div class=&amp;quot;giscus-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;a href=&amp;quot;https://github.com/zsxjun/github-issues-moments/issues/1&amp;quot; target=&amp;quot;_blank&amp;quot; class=&amp;quot;edit-btn&amp;quot; title=&amp;quot;添加/编辑说说&amp;quot;&amp;gt;✏️&amp;lt;/a&amp;gt;

    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/marked/marked.min.js &amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
        /* ---------- 主题切换 + Giscus 重载 ---------- */
        const toggle = document.getElementById(&amp;#39;theme-toggle&amp;#39;);
        const themeIcon = document.getElementById(&amp;#39;theme-icon&amp;#39;);
        const html = document.documentElement;

        function loadGiscus(theme) {
            const container = document.querySelector(&amp;#39;.giscus-container&amp;#39;);
            container.innerHTML = &amp;#39;&amp;#39;;
            const script = document.createElement(&amp;#39;script&amp;#39;);
            script.src = &amp;#39;https://giscus.app/client.js &amp;#39;;
            script.async = true;
            script.setAttribute(&amp;#39;crossorigin&amp;#39;, &amp;#39;anonymous&amp;#39;);
            script.setAttribute(&amp;#39;data-repo&amp;#39;, &amp;#39;zsxjun/github-issues-moments&amp;#39;);
            script.setAttribute(&amp;#39;data-repo-id&amp;#39;, &amp;#39;R_kgDOP0jWOA&amp;#39;);
            script.setAttribute(&amp;#39;data-category&amp;#39;, &amp;#39;Announcements&amp;#39;);
            script.setAttribute(&amp;#39;data-category-id&amp;#39;, &amp;#39;DIC_kwDOP0jWOM4Cvv6S&amp;#39;);
            script.setAttribute(&amp;#39;data-mapping&amp;#39;, &amp;#39;pathname&amp;#39;);
            script.setAttribute(&amp;#39;data-strict&amp;#39;, &amp;#39;0&amp;#39;);
            script.setAttribute(&amp;#39;data-reactions-enabled&amp;#39;, &amp;#39;1&amp;#39;);
            script.setAttribute(&amp;#39;data-emit-metadata&amp;#39;, &amp;#39;0&amp;#39;);
            script.setAttribute(&amp;#39;data-input-position&amp;#39;, &amp;#39;top&amp;#39;);
            script.setAttribute(&amp;#39;data-lang&amp;#39;, &amp;#39;zh-CN&amp;#39;);
            script.setAttribute(&amp;#39;data-theme&amp;#39;, theme);
            container.appendChild(script);
        }

        (function initTheme() {
            const saved = localStorage.getItem(&amp;#39;theme&amp;#39;);
            const preferDark = window.matchMedia(&amp;#39;(prefers-color-scheme: dark)&amp;#39;).matches;
            const initialTheme = (saved === &amp;#39;dark&amp;#39; || (!saved &amp;amp;&amp;amp; preferDark)) ? &amp;#39;dark&amp;#39; : &amp;#39;light&amp;#39;;
            html.setAttribute(&amp;#39;data-theme&amp;#39;, initialTheme);
            themeIcon.textContent = initialTheme === &amp;#39;dark&amp;#39; ? &amp;#39;☀️&amp;#39; : &amp;#39;🌙&amp;#39;;
            loadGiscus(initialTheme);
        })();

        toggle.addEventListener(&amp;#39;click&amp;#39;, () =&amp;gt; {
            const current = html.getAttribute(&amp;#39;data-theme&amp;#39;);
            const next = current === &amp;#39;dark&amp;#39; ? &amp;#39;light&amp;#39; : &amp;#39;dark&amp;#39;;
            html.setAttribute(&amp;#39;data-theme&amp;#39;, next);
            localStorage.setItem(&amp;#39;theme&amp;#39;, next);
            themeIcon.textContent = next === &amp;#39;dark&amp;#39; ? &amp;#39;☀️&amp;#39; : &amp;#39;🌙&amp;#39;;
            loadGiscus(next);
        });

        /* ---------- 信息模态框 ---------- */
        const infoButton = document.getElementById(&amp;#39;info-button&amp;#39;);
        const infoModal = document.getElementById(&amp;#39;info-modal&amp;#39;);
        const closeModal = document.getElementById(&amp;#39;close-modal&amp;#39;);
        infoButton.addEventListener(&amp;#39;click&amp;#39;, () =&amp;gt; infoModal.style.display = &amp;#39;flex&amp;#39;);
        closeModal.addEventListener(&amp;#39;click&amp;#39;, () =&amp;gt; infoModal.style.display = &amp;#39;none&amp;#39;);
        infoModal.addEventListener(&amp;#39;click&amp;#39;, e =&amp;gt; {
            if (e.target === infoModal) infoModal.style.display = &amp;#39;none&amp;#39;;
        });

        /* ---------- 数据加载 &amp;amp; 分页 ---------- */
        const container = document.getElementById(&amp;#39;main-container&amp;#39;);
        const paginationContainer = document.getElementById(&amp;#39;pagination-container&amp;#39;);
        const url = &amp;#39;https://example.com/api/comments &amp;#39;; /* 替换为你的 API URL */
        let allComments = [];
        let currentPage = 1;
        const itemsPerPage = 10;

        const headers = new Headers();
        headers.append(&amp;#39;Accept&amp;#39;, &amp;#39;application/vnd.github.v3+json&amp;#39;);
        headers.append(&amp;#39;User-Agent&amp;#39;, &amp;#39;Hugo Static Site Generator&amp;#39;);

        fetch(url, { headers })
            .then(r =&amp;gt; {
                if (!r.ok) throw new Error(&amp;#39;网络错误 &amp;#39; + r.status);
                return r.json();
            })
            .then(list =&amp;gt; {
                if (!Array.isArray(list) || list.length === 0) {
                    container.innerHTML = &amp;#39;&amp;lt;p class=&amp;quot;no-content&amp;quot;&amp;gt;暂无动态&amp;lt;/p&amp;gt;&amp;#39;;
                    return;
                }
                allComments = list.reverse();
                initPagination(allComments.length);
                displayPage(1);
            })
            .catch(err =&amp;gt; {
                container.innerHTML = `&amp;lt;p class=&amp;quot;error&amp;quot;&amp;gt;⚠️ 无法获取动态：${err.message}&amp;lt;/p&amp;gt;`;
            });

        function initPagination(totalItems) {
            const totalPages = Math.ceil(totalItems / itemsPerPage);
            if (totalPages &amp;lt;= 1) {
                paginationContainer.style.display = &amp;#39;none&amp;#39;;
                return;
            }
            let html = `
                &amp;lt;div class=&amp;quot;pagination&amp;quot;&amp;gt;
                    &amp;lt;button class=&amp;quot;page-btn prev-btn&amp;quot; onclick=&amp;quot;changePage(${currentPage - 1})&amp;quot; ${currentPage === 1 ? &amp;#39;disabled&amp;#39; : &amp;#39;&amp;#39;}&amp;gt;上一页&amp;lt;/button&amp;gt;
            `;
            const max = 5, half = Math.floor(max / 2);
            let start, end;
            if (totalPages &amp;lt;= max) { start = 1; end = totalPages; }
            else if (currentPage &amp;lt;= half + 1) { start = 1; end = max; }
            else if (currentPage &amp;gt;= totalPages - half) { start = totalPages - max + 1; end = totalPages; }
            else { start = currentPage - half; end = currentPage + half; }
            for (let i = start; i &amp;lt;= end; i++) {
                html += `&amp;lt;button class=&amp;quot;page-btn ${i === currentPage ? &amp;#39;active&amp;#39; : &amp;#39;&amp;#39;}&amp;quot; onclick=&amp;quot;changePage(${i})&amp;quot;&amp;gt;${i}&amp;lt;/button&amp;gt;`;
            }
            html += `&amp;lt;button class=&amp;quot;page-btn next-btn&amp;quot; onclick=&amp;quot;changePage(${currentPage + 1})&amp;quot; ${currentPage === totalPages ? &amp;#39;disabled&amp;#39; : &amp;#39;&amp;#39;}&amp;gt;下一页&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;`;
            paginationContainer.innerHTML = html;
            paginationContainer.style.display = &amp;#39;block&amp;#39;;
        }

        function displayPage(page) {
            const start = (page - 1) * itemsPerPage, end = Math.min(start + itemsPerPage, allComments.length);
            const html = allComments.slice(start, end).map(c =&amp;gt; `
                &amp;lt;article class=&amp;quot;moment-article&amp;quot;&amp;gt;
                    &amp;lt;header class=&amp;quot;article-header&amp;quot;&amp;gt;
                        &amp;lt;img class=&amp;quot;avatar&amp;quot; src=&amp;quot;${c.user.avatar_url}&amp;quot; alt=&amp;quot;${c.user.login}&amp;quot; onerror=&amp;quot;this.src=&amp;#39;https://avatars.githubusercontent.com/u/0?s=80&amp;amp;v=4 &amp;#39;&amp;quot;&amp;gt;
                        &amp;lt;div class=&amp;quot;user-info&amp;quot;&amp;gt;
                            &amp;lt;div class=&amp;quot;user-name&amp;quot;&amp;gt;钟神秀@zsxjun&amp;lt;/div&amp;gt;
                            &amp;lt;div class=&amp;quot;post-time&amp;quot;&amp;gt;${formatTime(c.created_at)}&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/header&amp;gt;
                    &amp;lt;section class=&amp;quot;moment-content&amp;quot;&amp;gt;${marked.parse(c.body)}&amp;lt;/section&amp;gt;
                &amp;lt;/article&amp;gt;
            `).join(&amp;#39;&amp;#39;);
            container.innerHTML = `&amp;lt;div class=&amp;quot;moments-feed&amp;quot;&amp;gt;${html}&amp;lt;/div&amp;gt;`;
            window.scrollTo({ top: 0, behavior: &amp;#39;smooth&amp;#39; });
        }

        window.changePage = function (page) {
            const total = Math.ceil(allComments.length / itemsPerPage);
            if (page &amp;lt; 1 || page &amp;gt; total || page === currentPage) return;
            currentPage = page;
            displayPage(page);
            initPagination(allComments.length);
        };

        function formatTime(pubDateStr) {
            const pubDate = new pubDate(pubDateStr), now = new pubDate(), diff = (now - pubDate) / 1000;
            if (diff &amp;lt; 60) return &amp;#39;刚刚&amp;#39;;
            if (diff &amp;lt; 3600) return `${Math.floor(diff / 60)}分钟前`;
            if (diff &amp;lt; 86400) return `${Math.floor(diff / 3600)}小时前`;
            if (diff &amp;lt; 2592000) return `${Math.floor(diff / 86400)}天前`;
            return pubDate.toLocaleString(&amp;#39;zh-CN&amp;#39;, { year: &amp;#39;numeric&amp;#39;, month: &amp;#39;2-digit&amp;#39;, day: &amp;#39;2-digit&amp;#39;, hour: &amp;#39;2-digit&amp;#39;, minute: &amp;#39;2-digit&amp;#39;, hour12: false });
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大致就是这样了，以上就是我肤浅的理解，希望能帮到你~&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Hexo备忘</title><link>https://sink.zsx815.top/hexo-beiwang</link><guid isPermaLink="true">https://sink.zsx815.top/hexo-beiwang</guid><description>Hexo 使用过程中的一些备忘事项和技巧</description><pubDate>Sat, 16 Aug 2025 22:11:28 GMT</pubDate><content:encoded>&lt;h1&gt;Hexo 备忘&lt;/h1&gt;
&lt;h2&gt;我的配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hexo 版本&lt;/strong&gt;: hexo-cli: 4.3.2, hexo: 7.3.0(当前最新)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js 版本&lt;/strong&gt;: 22.16.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 版本&lt;/strong&gt;: 2.47.0.sindows.2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PNPM 版本&lt;/strong&gt;: 10.12.4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows 版本&lt;/strong&gt;: 11&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;安装 Node.js&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;在 &lt;a href=&quot;https://nodejs.org/en/download/&quot;&gt;官网&lt;/a&gt; 安装 LTS 版本，电脑一般来说内存足够直接在 C 盘即可，当然，换路径也可以，我反正正常下载换路径，没什么问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;安装完成后，检查是否安装成功。在键盘按下 &lt;kbd&gt; win &lt;/kbd&gt; + &lt;kbd&gt; R &lt;/kbd&gt; 键，输入 &lt;code&gt;CMD&lt;/code&gt;，然后回车，打开 CMD 窗口，执行 &lt;code&gt;node -v&lt;/code&gt; 命令，看到版本信息，则说明安装成功。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;安装 Git&lt;/h2&gt;
&lt;p&gt;在 &lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;官网&lt;/a&gt; 安装最新版本的 &lt;code&gt;64-bit Git for Windows Setup&lt;/code&gt; 安装包。  &lt;/p&gt;
&lt;p&gt;安装完成后，在命令行输入 &lt;code&gt;git --version&lt;/code&gt;，如果显示版本号，则说明安装成功。&lt;/p&gt;
&lt;h3&gt;常用命令&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config -l  //查看所有配置
git config --system --list //查看系统配置
git config --global --list //查看用户（全局）配置
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 Git 用户名和邮箱&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global user.name &amp;quot;你的用户名&amp;quot;
git config --global user.email &amp;quot;你的邮箱&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装 包管理器&lt;/h2&gt;
&lt;p&gt;安装 npm 为一切的基石，一般来说，你安装了 node，也相当于你安装了 npm，通过一下命令来验证：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm -v
node -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改 npm 源&lt;/strong&gt;。npm 下载各种模块，默认是从国外服务器下载，速度较慢，建议配置成淘宝镜像。打开 CMD 窗口，运行如下命令:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm config set registry https://registry.npm.taobao.org
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 pnpm&lt;/h3&gt;
&lt;p&gt;pnpm 是一个快速、节省磁盘空间的包管理器，类似于 npm 和 yarn。安装 pnpm 可以通过以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么选择 pnpm？因为它的安装速度快，依赖管理更高效，且相对于 npm，我使用 npm 容易失败且慢，pnpm 给我的体验更好。&lt;/p&gt;
&lt;h2&gt;安装 Hexo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 Git BASH 输入如下命令安装 Hexo：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm install -g hexo-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;安装完后输入 &lt;code&gt;hexo -v&lt;/code&gt; 验证是否安装成功。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;a id=&quot;github-config&quot;&gt;&lt;/a&gt;Github配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;上述操作是前提，接下来是配置 Github。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注册 github 就不说了，很基础的东西，连我个代码小白都懂就不多说了。&lt;/p&gt;
&lt;h3&gt;创建仓库&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登录 GitHub，点击右上角的 &lt;code&gt;+&lt;/code&gt; 号，选择 &lt;code&gt;New repository&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;填写仓库名称，建议使用 &lt;code&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt; 格式（例如：&lt;code&gt;yourusername.github.io&lt;/code&gt;），这样可以直接作为个人主页。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里我不准备直接使用常规的 &lt;code&gt;hexo deploy&lt;/code&gt; 命令来部署到 GitHub Pages，因为当你的文章一多，生成时间就会繁琐，这里的建议是使用 &lt;code&gt;Github Actions&lt;/code&gt; 来自动部署。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这一部分的教程是源于 &lt;a href=&quot;https://akilar.top/posts/f752c86d/&quot;&gt;店长的文章&lt;/a&gt;，但是有点老旧了，于是我做了点更改（这里的图片来源于 &lt;a href=&quot;https://blog.anheyu.com/posts/asdx.html&quot;&gt;安知鱼&lt;/a&gt;）：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;首先要创建一个放置源码的私有仓库，以下称之为 &lt;code&gt;hexo-source&lt;/code&gt;，&lt;/li&gt;
&lt;li&gt;然后要生成一个 Github 密钥：&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;访问 Github-&amp;gt; 头像（右上角）-&amp;gt; Settings-&amp;gt; Developer Settings-&amp;gt; Personal access tokens-&amp;gt; generate new token, 创建的 Token 名称随意，但必须勾选 repo 项 和 workflows 项。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;点击 &lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;链接&lt;/a&gt; 前往生成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.314926.xyz/images/2025/08/17/jiaoxue1.webp&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://img.314926.xyz/images/2025/08/17/jiaoxue2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;p&gt;!!! token 只会显示这一次，之后将无法查看，所以务必保证你已经记录下了 Token。之后如果忘记了就只能重新生成重新配置了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;在 &lt;code&gt;hexo-source&lt;/code&gt; 仓库中的设置里点击设置 -&amp;gt; action -&amp;gt; General -&amp;gt; 工作流程权限&lt;ul&gt;
&lt;li&gt;勾选 &lt;code&gt;Read and write permissions&lt;/code&gt;，并且勾选 &lt;code&gt;Allow &amp;lt;span style=&amp;quot;background:#FF0000;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;all actions and reusable workflows&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在设置里 -&amp;gt; Secrets and variables -&amp;gt; Actions -&amp;gt; New repository secret 添加&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GITHUBTOKEN&lt;/code&gt;：放置你刚才生成的 Token。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;上述是前置条件，接下来要先部署 hexo，你才好继续下一步。&lt;/h2&gt;
&lt;h2&gt;初始化 Hexo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在本地新建一个文件夹，例如 &lt;code&gt;hexo-solitude&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;这里我是用的是 vscode 打开该文件夹，然后在终端输入以下命令来初始化 Hexo：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hexo init (项目名称)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我一般都不填，直接在文件下下就可以开始，如果你添加了项目名称，那么下一步就是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd (项目名称)
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;安装依赖包：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就是选择你想要的主题，这里我使用的是&lt;a href=&quot;https://solitude.js.org/cn/getting-started/installation&quot;&gt;Solitude&lt;/a&gt;，具体的配置不细讲，我只讲一部分：&lt;/p&gt;
&lt;p&gt;首先就是基本的安装，这里还是选择&lt;code&gt;git clone&lt;/code&gt;没有别的原因，主要还是会改点源码，不想改的直接pnpm下载即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// git安装
git clone -b dev https://github.com/everfu/hexo-theme-solitude.git themes/solitude

// pnpm 安装
pnpm i hexo-theme-solitude
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在&lt;code&gt;_config.yml&lt;/code&gt;里修改成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;theme: solitude
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;下列代码是我的备忘：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# Hexo Configuration
## Docs: https://hexo.io/docs/configuration.html
## Source: https://github.com/hexojs/hexo/

# Site
title: 喵落阁
subtitle: &amp;#39;克喵的博客&amp;#39;
description: &amp;#39;愿你看清一切真相后，依旧热爱你的家人和朋友。&amp;#39;
keywords: 克喵,kemiao,博客
author: 克喵爱吃卤面
language: zh-CN
timezone: &amp;#39;Asia/Shanghai&amp;#39;

# URL
## Set your site url here. For example, if you use GitHub Page, set url as &amp;#39;https://username.github.io/project&amp;#39;
url: # 填网站地址
permalink: posts/:abbrlink.html
permalink_defaults:
pretty_urls:
  trailing_index: true # Set to false to remove trailing &amp;#39;index.html&amp;#39; from permalinks
  trailing_html: true # Set to false to remove trailing &amp;#39;.html&amp;#39; from permalinks

# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render:

# Writing
new_post_name: :title.md # File name of new posts
default_layout: post
titlecase: false # Transform title into titlecase
external_link:
  enable: true # Open external links in new tab
  field: site # Apply to the whole site
  exclude: &amp;#39;&amp;#39;
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: true
syntax_highlighter: highlight.js
highlight:
  line_number: false
  auto_detect: false
  tab_replace: &amp;#39;&amp;#39;
  wrap: true
  hljs: false
prismjs:
  preprocess: true
  line_number: true
  tab_replace: &amp;#39;&amp;#39;

# Home page setting
# path: Root path for your blogs index page. (default = &amp;#39;&amp;#39;)
# per_page: Posts displayed per page. (0 = disable pagination)
# order_by: Posts order. (Order by pubDate descending by default)
index_generator:
  path: &amp;#39;&amp;#39;
  per_page: 10
  order_by: -pubDate

# Category &amp;amp; Tag
default_category: uncategorized
category_map:
tag_map:

# Metadata elements
## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
meta_generator: true

# pubDate / Time format
## Hexo uses Moment.js to parse and display pubDate
## You can customize the pubDate format as defined in
## http://momentjs.com/docs/#/displaying/format/
pubDate_format: YYYY-MM-DD
time_format: HH:mm:ss
## updatedDate_option supports &amp;#39;mtime&amp;#39;, &amp;#39;pubDate&amp;#39;, &amp;#39;empty&amp;#39;
updatedDate_option: &amp;#39;mtime&amp;#39;

# Pagination
## Set per_page to 0 to disable pagination
per_page: 10
pagination_dir: page

# Include / Exclude file(s)
## include:/exclude: options only apply to the &amp;#39;source/&amp;#39; folder
include: []
exclude: []
ignore: []

# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: solitude

# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
  type: git
  repo: git@github.com-xx:kemiaofxjun/kemiaofxjun.github.io.git
  branch: main

# RSS Feed 配置
feed:
  type: atom          # 生成 atom.xml
  path: atom.xml      # 输出文件名
  limit: 20           # 最多显示文章数 (0=全部)
  hub:                # PubSubHubbub 中心 (可选)
  content: true       # 是否包含全文内容 (true=是, false=仅摘要)
  content_limit: 140  # 摘要长度（当 content=false 时生效）
  content_limit_delim: &amp;#39; &amp;#39;  # 截断分隔符
  order_by: -pubDate     # 按日期倒序排列
  autodiscovery: true # 在 HTML 头部添加自动发现标签

# 数学公式渲染配置
markdown:
  preset: &amp;#39;default&amp;#39; # 使用的 MD 语法，默认使用的 GFM
  render:
    html: true # 渲染 html
    xhtmlOut: false
    langPrefix: &amp;#39;language-&amp;#39; # 在代码块的类名中添加前缀（指定语言时）。
    breaks: true
    linkify: true # 如果你写了一个链接而不是 [name](link) 方式，会自动识别为链接并渲染。
    typographer: true # 将替换常见的印刷元素。
    quotes: &amp;#39;“”‘’&amp;#39; # 替换文章张的 &amp;quot;&amp;quot; &amp;#39;&amp;#39; 号
  enable_rules:
  disable_rules:
  plugins: # 使用插件
  anchors:
    level: 2 # 渲染标题的级别（h1,h2,h3）
    collisionSuffix: &amp;#39;&amp;#39;
    permalink: true
    permalinkClass: &amp;#39;headerlink&amp;#39;
    permalinkSide: &amp;#39;left&amp;#39;
    permalinkSymbol: &amp;#39;&amp;#39;
    case: 0
    separator: &amp;#39;-&amp;#39;
  images: # 图片的一些编译
    lazyload: true # 是否需要渲染 lazyload
    prepend_root: false
    post_asset: false
  inline: false

swpp:
  # 是否启用插件
  enable: true
  # 是否在发布前自动执行脚本
  auto_exec: true
  gen_dom: true

# 文章链接转数字或字母：https://github.com/rozbo/hexo-abbrlink
abbrlink:
    alg: crc16   #算法： crc16(default) and crc32
    rep: hex     #进制： dec(default) and hex: dec #输出进制：十进制和十六进制，默认为10进制。丨dec为十进制，hex

# https://github.com/hexojs/hexo-generator-sitemap
sitemap:
  path: sitemap.xml
  rel: false
  tags: true
  categories: true

algolia:
  appId: &amp;quot;&amp;quot;
  apiKey: &amp;quot;&amp;quot;
  adminApiKey: &amp;quot;&amp;quot;
  chunkSize: 5000
  indexName: &amp;quot;index-name&amp;quot;
  fields:
    - content:strip:truncate,0,500
    - excerpt:strip
    - gallery
    - permalink
    - photos
    - slug
    - tags
    - title

# hexo-safego安全跳转插件
# see https://blog.liushen.fun/posts/1dfd1f41/
hexo_safego:
  # 基本功能设置
  general:
    enable: true                # 启用插件
    enable_base64_encode: true  # 使用 Base64 编码
    enable_target_blank: true   # 从新窗口打开跳转页面

  # 安全设置
  security:
    url_param_name: &amp;#39;u&amp;#39;         # URL 参数名
    html_file_name: &amp;#39;go.html&amp;#39;   # 重定向页面的文件名
    ignore_attrs:               # 忽略处理的 HTML 结构
      - &amp;#39;data-fancybox&amp;#39;

  # 容器与页面设置
  scope:
    apply_containers:           # 应用的容器选择器
      - &amp;#39;#article-container&amp;#39;
    apply_pages:                # 应用的页面路径
      - &amp;quot;/posts/&amp;quot;
      - &amp;quot;/devices/&amp;quot;
    exclude_pages:              # 排除的页面路径

  # 域名白名单
  whitelist:
    domain_whitelist:           # 允许的白名单域名，通过字符串匹配实现
      - &amp;quot;kemeow.top&amp;quot;
      - &amp;quot;kemiaosw.top&amp;quot;
      - &amp;quot;050815.xyz&amp;quot;
      - &amp;quot;314926.xyz&amp;quot;
      - &amp;quot;051531.xyz&amp;quot;

  # 页面外观设置
  appearance:
    avatar: https://img.314926.xyz/images/2025/08/13/no-background-kemiaofxjun.webp   # 跳转页面头像路径
    title: &amp;quot;喵洛阁&amp;quot;            # 跳转页面标题
    subtitle: &amp;quot;安全中心&amp;quot;         # 跳转页面副标题
    darkmode: auto              # 是否启用深色模式
    countdowntime: 4            # 跳转页面倒计时秒数，如果设置为负数则为不自动跳转

  # 调试设置
  debug:
    enable: false               # 启用调试模式

# 追番插件
# https://github.com/HCLonely/hexo-bilibili-bangumi
bangumi: # 追番设置
  enable: true
  source: bili
  path: 
  vmid: 3546643173477234
  title: &amp;quot;追番列表&amp;quot;
  quote: &amp;quot;生命不息，追番不止！&amp;quot;
  show: 1
  lazyload: false
  loading:
  showMyComment: true
  pagination: false
  extra_options:
    top_img: false
    lazyload:
      enable: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;博客的其他修改基本就是来自教程和一些博主的网站。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;插件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;基础依赖&lt;/strong&gt; &lt;code&gt;hexo-renderer-pug&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-renderer-pug
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;字数统计&lt;/strong&gt; &lt;code&gt;hexo-wordcount&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-wordcount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置里修改：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# --------------------------- start ---------------------------
# Word count
# 字数统计
# warning: Please install the hexo-wordcount plugin first.
# 警告: 请先安装 hexo-wordcount 插件。
wordcount: false
# --------------------------- end ---------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;数学公式&lt;/strong&gt; 卸载 &lt;code&gt;hexo-render-marked&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm un hexo-renderer-marked
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 &lt;code&gt;hexo-renderer-markdown-it&lt;/code&gt; &lt;code&gt;katex&lt;/code&gt; &lt;code&gt;@renbaoshuo/markdown-it-katex&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-renderer-markdown-it katex @renbaoshuo/markdown-it-katex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置里修改&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# --------------------------- start ---------------------------
# Katex
# Latex formula support
# Latex 公式支持
katex:
  enable: false
  # Whether to load on each page
  # 是否在每个页面加载
  per_page: false
  # Whether to enable copy formula
  # 是否启用复制公式
  copytex: false
# --------------------------- end ---------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加以下内容到 &lt;code&gt;_config.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;markdown:
  preset: &amp;#39;default&amp;#39;
  render:
    html: true
    xhtmlOut: false
    langPrefix: &amp;#39;language-&amp;#39;
    breaks: true
    linkify: true
    typographer: true
    quotes: &amp;#39;“”‘’&amp;#39;
  enable_rules:
  disable_rules:
  plugins:
    - &amp;#39;@renbaoshuo/markdown-it-katex&amp;#39;
  anchors:
    level: 2
    collisionSuffix: &amp;#39;&amp;#39;
    permalink: false
    permalinkClass: &amp;#39;header-anchor&amp;#39;
    permalinkSide: &amp;#39;left&amp;#39;
    permalinkSymbol: &amp;#39;¶&amp;#39;
    case: 0
    separator: &amp;#39;-&amp;#39;
  images:
    lazyload: false
    prepend_root: false
    post_asset: false
  inline: false  # https://markdown-it.github.io/markdown-it/#MarkdownIt.renderInline
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启配置项&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# --------------------------- start ---------------------------
# Katex
# Latex formula support
# Latex 公式支持
katex:
  enable: true
  # Whether to load on each page
  # 是否在每个页面加载
  per_page: true
  # Whether to enable copy formula
  # 是否启用复制公式
  copytex: false
# --------------------------- end ---------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;strong&gt;PWA&lt;/strong&gt; 安装 hexo-swpp 和 swpp-backends 插件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在博客根目录执行&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-swpp 

pnpm i swpp-backends
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# 大约在773行
# --------------------------- start ---------------------------
# PWA
# Progressive Web App
pwa:
  enable: true
  manifest: /manifest.json # manifest.json
  theme_color: &amp;quot;#006a73&amp;quot; # Theme color
  mask_icon: /img/pwa/favicon.png # Mask icon
  apple_touch_icon: /img/pwa/favicon.png # Apple touch icon
  bookmark_icon: /img/pwa/favicon.png # Bookmark icon
  favicon_32_32: /img/pwa/favicon_32.png # 32x32 icon
  favicon_16_16: /img/pwa/favicon_16.png # 16x16 icon
# --------------------------- end ---------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;_config.yml&lt;/code&gt;里添加swpp配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;swpp:
  # 是否启用插件
  enable: true
  # 是否在发布前自动执行脚本
  auto_exec: true
  gen_dom: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;source&lt;/code&gt; 目录中创建 &lt;code&gt;manifest.json&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;name&amp;quot;: &amp;quot;网站名称&amp;quot;,
    &amp;quot;short_name&amp;quot;: &amp;quot;网站名称缩写&amp;quot;,
    &amp;quot;theme_color&amp;quot;: &amp;quot;#006a73&amp;quot;,
    &amp;quot;background_color&amp;quot;: &amp;quot;#006a73&amp;quot;,
    &amp;quot;display&amp;quot;: &amp;quot;fullscreen&amp;quot;,
    &amp;quot;scope&amp;quot;: &amp;quot;/&amp;quot;,
    &amp;quot;start_url&amp;quot;: &amp;quot;/&amp;quot;,
    &amp;quot;id&amp;quot;: &amp;quot;/&amp;quot;,
    &amp;quot;icons&amp;quot;: [
      {
        &amp;quot;src&amp;quot;: &amp;quot;/img/pwa/favicon_16.png&amp;quot;,
        &amp;quot;sizes&amp;quot;: &amp;quot;16x16&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;image/png&amp;quot;,
        &amp;quot;purpose&amp;quot;: &amp;quot;any&amp;quot;
      },
      {
        &amp;quot;src&amp;quot;: &amp;quot;/img/pwa/favicon_16.png&amp;quot;,
        &amp;quot;sizes&amp;quot;: &amp;quot;16x16&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;image/png&amp;quot;,
        &amp;quot;purpose&amp;quot;: &amp;quot;maskable&amp;quot;
      },
      {
        &amp;quot;src&amp;quot;: &amp;quot;/img/pwa/favicon_32.png&amp;quot;,
        &amp;quot;sizes&amp;quot;: &amp;quot;32x32&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;image/png&amp;quot;,
        &amp;quot;purpose&amp;quot;: &amp;quot;any&amp;quot;
      },
      {
        &amp;quot;src&amp;quot;: &amp;quot;/img/pwa/favicon_32.png&amp;quot;,
        &amp;quot;sizes&amp;quot;: &amp;quot;32x32&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;image/png&amp;quot;,
        &amp;quot;purpose&amp;quot;: &amp;quot;maskable&amp;quot;
      },
      {
        &amp;quot;src&amp;quot;: &amp;quot;/img/pwa/favicon.png&amp;quot;,
        &amp;quot;sizes&amp;quot;: &amp;quot;180x180&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;image/png&amp;quot;,
        &amp;quot;purpose&amp;quot;: &amp;quot;any&amp;quot;
      },
      {
        &amp;quot;src&amp;quot;: &amp;quot;/img/pwa/favicon.png&amp;quot;,
        &amp;quot;sizes&amp;quot;: &amp;quot;180x180&amp;quot;,
        &amp;quot;type&amp;quot;: &amp;quot;image/png&amp;quot;,
        &amp;quot;purpose&amp;quot;: &amp;quot;maskable&amp;quot;
      }
    ],
    &amp;quot;splash_pages&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在博客根目录创建一个 &lt;code&gt;sw-rules.js&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;module.exports.config = {
  /** @type {?ServiceWorkerConfig|boolean} */
  serviceWorker: {
    escape: 1,
    cacheName: &amp;#39;SolitudeCache&amp;#39;,
    debug: false,
  },
  register: {
    onsuccess: undefined,
    onerror: () =&amp;gt;
      console.error(
        &amp;#39;Service Worker 注册失败！可能是由于您的浏览器不支持该功能！&amp;#39;
      ),
    builder: (root, framework, pluginConfig) =&amp;gt; {
      const { onerror, onsuccess } = pluginConfig.register;
      return `
            &amp;lt;script&amp;gt;
                (() =&amp;gt; {
                    const sw = navigator.serviceWorker;
                    const error = ${onerror &amp;amp;&amp;amp; onerror.toString()};
                    if (!sw?.register(&amp;#39;${new URL(root).pathname}sw.js&amp;#39;)
                        ${onsuccess ? `?.then(${onsuccess.toString()})` : &amp;quot;&amp;quot;}
                        ?.catch(error)
                    ) error()
                })()
            &amp;lt;/script&amp;gt;`;
    },
  },
  /** @type {?DomConfig|boolean} */
  dom: {
    /** @type {?VoidFunction} */
    onsuccess: () =&amp;gt; {
      caches
        .match(&amp;#39;https://id.v3/&amp;#39;)
        .then((res) =&amp;gt; {
          if (res)
            res.json().then((json) =&amp;gt; {
              utils &amp;amp;&amp;amp;
                utils.snackbarShow(
                  `已刷新缓存，更新为${json.escape + &amp;#39;.&amp;#39; + json.global + &amp;#39;.&amp;#39; + json.local
                  }版本最新内容`,
                  false,
                  2500
                );
            });
          else console.info(&amp;#39;未找到缓存&amp;#39;);
        })
        .catch((error) =&amp;gt; console.error(&amp;#39;缓存匹配出错&amp;#39;, error));
    },
  },
  /** @type {?VersionJsonConfig|boolean} */
  json: {
    /** @type {number} */
    maxHtml: 15,
    /** @type {number} */
    charLimit: 1024,
    /** @type {string[]} */
    merge: [],
    exclude: {
      /** @type {RegExp[]} */
      localhost: [],
      /** @type {RegExp[]} */
      other: [],
    },
  },
  /** @type {?ExternalMonitorConfig|boolean} */
  external: {
    /** @type {number} */
    timeout: 5000,
    /** 拉取文件时地并发限制 */
    concurrencyLimit: 100,
    /** @type {({head: string, tail: string}|function(string):string[])[]} */
    js: [],
    /** @type {RegExp[]} */
    stable: [
      /^https:\/\/npm\.elemecdn\.com\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/,
      /^https:\/\/cdn\.cbd\.int\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/,
      /^https:\/\/cdn\.jsdelivr\.net\/npm\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/,
    ],
    replacer: (srcUrl) =&amp;gt; {
      if (srcUrl.startsWith(&amp;#39;https://cdn.jsdelivr.net/npm/&amp;#39;)) {
        const pathname = new URL(srcUrl).pathname;
        return [
          srcUrl,
          `https://cdn.cbd.int/${pathname}`,
          `https://npm.elemecdn.com/${pathname}`,
          `https://fastly.jsdelivr.net/npm/${pathname}`,
        ];
      } else {
        return srcUrl;
      }
    },
  },
};

module.exports.cacheRules = {
  simple: {
    clean: true,
    search: false,
    match: (url, $eject) =&amp;gt;
      url.host === $eject.domain &amp;amp;&amp;amp; [&amp;#39;/404.html&amp;#39;].includes(url.pathname),
  },
  cdn: {
    clean: true,
    match: (url) =&amp;gt;
      [
        &amp;#39;cdn.cbd.int&amp;#39;,
        &amp;#39;lf26-cdn-tos.bytecdntp.com&amp;#39;,
        &amp;#39;lf6-cdn-tos.bytecdntp.com&amp;#39;,
        &amp;#39;lf3-cdn-tos.bytecdntp.com&amp;#39;,
        &amp;#39;lf9-cdn-tos.bytecdntp.com&amp;#39;,
        &amp;#39;cdn.staticfile.org&amp;#39;,
        &amp;#39;npm.elemecdn.com&amp;#39;,
      ].includes(url.host) &amp;amp;&amp;amp;
      url.pathname.match(/\.(js|css|woff2|woff|ttf|cur)$/),
  },
};

module.exports.getSpareUrls = (srcUrl) =&amp;gt; {
  if (srcUrl.startsWith(&amp;#39;https://npm.elemecdn.com&amp;#39;)) {
    return {
      timeout: 3000,
      list: [
        srcUrl,
        `https://fastly.jsdelivr.net/${new URL(srcUrl).pathname}`,
      ],
    };
  }
};

module.exports.ejectValues = (hexo, rules) =&amp;gt; {
  return {
    domain: {
      prefix: &amp;#39;const&amp;#39;,
      value: new URL(hexo.config.url).host,
    },
  };
};

module.exports.skipRequest = (request) =&amp;gt; request.url.startsWith(&amp;quot;https://i0.hdslb.com&amp;quot;) ||
  request.url.startsWith(&amp;#39;https://meting.qjqq.cn&amp;#39;) ||
  request.url.startsWith(&amp;#39;https://api.i-meto.com&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/hexojs/hexo-deployer-git&quot;&gt;hexo-deploy-git&lt;/a&gt;&lt;/strong&gt; 提交到git的插件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-deploy-git --save
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/hexojs/hexo-generator-feed&quot;&gt;hexo-generator-feed&lt;/a&gt;&lt;/strong&gt; hexo的rss插件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-generator-feed --save
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/ohroy/hexo-abbrlink&quot;&gt;hexo 的短链接&lt;/a&gt;&lt;/strong&gt;: &lt;code&gt;hexo-abbrlink&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-abbrlink --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;_config.yml&lt;/code&gt;里修改：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;permalink: posts/:abbrlink/ 
# or
permalink: posts/:abbrlink.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# abbrlink config
abbrlink:
  alg: crc32      # Algorithm used to calc abbrlink. Support crc16(default) and crc32
  rep: hex        # Representation of abbrlink in URLs. Support dec(default) and hex
  drafts: false   # Whether to generate abbrlink for drafts. (false in default)
  force: false    # Enable force mode. In this mode, the plugin will ignore the cache, and calc the abbrlink for every post even it already had an abbrlink. (false in default)
  writeback: true # Whether to write changes to front-matters back to the actual markdown files. (true in default)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/hexojs/hexo-generator-sitemap&quot;&gt;博客的sitemap&lt;/a&gt;&lt;/strong&gt; : &lt;code&gt;hexo-generator-sitemap&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-generator-sitemap --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;_config.yml&lt;/code&gt;里添加配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;sitemap:
  path: 
    - sitemap.xml
    - sitemap.txt
  template: ./sitemap_template.xml
  template_txt: ./sitemap_template.txt
  rel: false
  tags: true
  categories: true
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mebi.me/hexo-with-algolia&quot;&gt;&lt;strong&gt;使用algolia搜索&lt;/strong&gt;&lt;/a&gt; : &lt;code&gt;hexo-algoliasearch&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;注册algolia：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注册地址：&lt;a href=&quot;https://dashboard.algolia.com/users/sign_up&quot;&gt;dashboard.algolia.com/users/sign_up&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建应用：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注册成功后创建应用：&lt;a href=&quot;https://dashboard.algolia.com/account/plan/create?from=dashboard&quot;&gt;dashboard.algolia.com/account/plan/create?from=dashboard&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;search -&amp;gt; configure -&amp;gt; index添加index_name即可&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在博客执行命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-algoliasearch --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;_config.yml&lt;/code&gt;里添加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;algolia:
  appId: &amp;quot;Z7A3XW4R2I&amp;quot;
  apiKey: &amp;quot;12db1ad54372045549ef465881c17e743&amp;quot;
  adminApiKey: &amp;quot;40321c7c207e7f73b63a19aa24c4761b&amp;quot;
  chunkSize: 5000
  indexName: &amp;quot;my-hexo-blog&amp;quot;
  fields:
    - content:strip:truncate,0,500
    - excerpt:strip
    - gallery
    - permalink
    - photos
    - slug
    - tags
    - title
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;!!!配置完成后记得运行 &lt;code&gt;hexo clean&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在&lt;code&gt;hexo g &lt;/code&gt;后实行下列代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hexo algolia
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;**&lt;a href=&quot;https://blog.liushen.fun/posts/1dfd1f41/&quot;&gt;hexo-safego&lt;/a&gt;**安全跳转插件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用该插件之前，需要先安装 &lt;code&gt;cheerio&lt;/code&gt;，&lt;code&gt;cheerio&lt;/code&gt; 是一个轻量级的库，用于在服务器端快速、灵活地实现 jQuery 核心功能。在 &lt;code&gt;hexo-safego&lt;/code&gt; 插件中，&lt;code&gt;cheerio&lt;/code&gt; 被用来解析和操作生成的静态 HTML 内容，类似于在浏览器中使用 jQuery 处理 DOM 元素。这使得插件能够在生成静态页面时，处理和替换外部链接，增强博客的安全性，而不需要在客户端引入 jQuery。Hexo 一般都有这个插件，可以在 &lt;code&gt;node_modules&lt;/code&gt; 查看，如果没有，请先执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i cheerio --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后即可安装该插件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-safego --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;hexo&lt;/code&gt;根目录的&lt;code&gt;_config.yml&lt;/code&gt;文件中添加以下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# hexo-safego安全跳转插件
# see https://blog.liushen.fun/posts/1dfd1f41/
hexo_safego:
  # 基本功能设置
  general:
    enable: true                # 启用插件
    enable_base64_encode: true  # 使用 Base64 编码
    enable_target_blank: true   # 打开新窗口
  # 安全设置
  security:
    url_param_name: &amp;#39;u&amp;#39;         # URL 参数名
    html_file_name: &amp;#39;go.html&amp;#39;   # 重定向页面的文件名
    ignore_attrs:               # 忽略处理的 HTML 属性
      - &amp;#39;data-fancybox&amp;#39;
  # 容器与页面设置
  scope:
    apply_containers:           # 应用的容器选择器
      - &amp;#39;#article-container&amp;#39;
    apply_pages:                # 应用的页面路径
      - &amp;quot;/posts/&amp;quot;
      - &amp;quot;/devices/&amp;quot;
    exclude_pages:              # 排除的页面路径
  # 域名白名单
  whitelist:
    domain_whitelist:           # 允许的白名单域名
      - &amp;quot;qyliu.top&amp;quot;
      - &amp;quot;liushen.fun&amp;quot;
  # 页面外观设置
  appearance:
    avatar: /info/avatar.ico    # 头像路径
    title: &amp;quot;清羽飞扬&amp;quot;            # 页面标题
    subtitle: &amp;quot;安全中心&amp;quot;         # 页面副标题
    darkmode: true              # 是否启用深色模式
    countdowntime: -1           # 倒计时秒数
  # 调试设置
  debug:
    enable: false               # 启用调试模式
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;strong&gt;hexo的追番页面&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HCLonely/hexo-bilibili-bangumi&quot;&gt;hexo-bilibili-bangumi&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pnpm i hexo-bilibili-bangumi --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;_config.yml&lt;/code&gt;配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;bangumi: # 追番设置
  enable: true           # 是否启用
  source: bili          # 数据源
  path: bangumis/index.html  # 页面路径
  vmid:                 # 用户ID
  title: &amp;#39;追番列表&amp;#39;      # 页面标题
  quote: &amp;#39;生命不息，追番不止！&amp;#39; # 页面引言
  show: 1              # 初始显示页面: 0=想看, 1=在看, 2=看过
  lazyload: true       # 是否启用图片懒加载
  metaColor:           # meta 信息字体颜色
  color:               # 简介字体颜色
  webp: true          # 是否使用 webp 格式图片
  progress: true      # 是否显示进度条

cinema: # 追剧设置
  enable: true           # 是否启用
  source: bili

game: # 游戏设置，仅支持source: bgmv0
  enable: true           # 是否启用
  source: bgmv0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还在更新中。。。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Github action配置&lt;/h2&gt;
&lt;p&gt;承接&lt;a href=&quot;https://www.zsxcoder.top/#github-config&quot;&gt;段落&lt;/a&gt;的继续吧，未来会在&lt;del&gt;出&lt;/del&gt;水一期。&lt;/p&gt;
&lt;p&gt;接下来就是创建一个私有仓库，根据大佬的文章，是为了保护&lt;strong&gt;Token&lt;/strong&gt;，见仁见智。&lt;/p&gt;
&lt;p&gt;这个私有仓库的建立是存储Hexo博客代码，如果你要使用&lt;a href=&quot;https://github.com/Qexo/Qexo&quot;&gt;Qexo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;，这也是必不可少的！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.314926.xyz/images/2025/08/19/hexo-beiwang1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;创建完成后，需要把博客的源码 push 到这里。首先获取远程仓库地址，此处虽然 SSH 和 HTTPS 均可。SSH 在绑定过 ssh key 的设备上无需再输入密码，HTTPS 则需要输入密码，但是 SSH 偶尔会遇到端口占用的情况。请自主选择。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.314926.xyz/images/2025/08/19/hexo-beiwang2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;p&gt;这里之所以是私有仓库，是因为在接下来的配置中会用到 &lt;code&gt;Token&lt;/code&gt;，如果 &lt;code&gt;Token&lt;/code&gt; 被盗用，别人可以肆意操作你的 github 仓库内容，为了避免这一风险，才选择的博客源码闭源。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;配置 Github Action&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在&lt;code&gt;[Blogroot]&lt;/code&gt;新建&lt;code&gt;.github&lt;/code&gt;文件夹,注意开头是有个&lt;code&gt;.&lt;/code&gt;的。然后在&lt;code&gt;.github&lt;/code&gt; 内新建 &lt;code&gt;workflows&lt;/code&gt; 文件夹，再在 &lt;code&gt;workflows&lt;/code&gt; 文件夹内新建 &lt;code&gt;autodeploy.yml&lt;/code&gt;,在&lt;code&gt;[Blogroot]/.github/workflows/autodeploy.yml&lt;/code&gt; 里面输入&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# 当有改动推送到 main 分支时，启动 Action
name: 自动部署

on:
  push:
    branches:
      - main # 自选分支

  release:
    types:
      - published

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 检查分支
        uses: actions/checkout@v4
        with:
          ref: main # 自选分支

      - name: 安装 Node
        uses: actions/setup-node@v4
        with:
          node-version: &amp;quot;22.x&amp;quot; # node版本

      - name: 安装 Hexo
        run: |
          export TZ=&amp;#39;Asia/Shanghai&amp;#39;
          npm install hexo-cli -g
          npm install yamljs --save

      - name: 缓存 Hexo
        uses: actions/cache@v4
        id: cache
        with:
          path: node_modules
          key: ${{ runner.os }}-node-${{ hashFiles(&amp;#39;**/package-lock.json&amp;#39;) }}

      - name: 安装依赖
        if: steps.cache.outputs.cache-hit != &amp;#39;true&amp;#39;
        run: |
          npm install --save
          npm install hexo-algoliasearch --save
          npm install hexo-bilibili-bangumi --save

      - name: 生成静态文件
        run: |
          node ./link.js
          hexo clean
          hexo generate
          hexo bangumi -u
          hexo algolia

      - name: 部署
        run: |
          cd ./public
          git init -b main
          git config --global user.name &amp;#39;${{ secrets.GITHUBUSERNAME }}&amp;#39;
          git config --global user.email &amp;#39;${{ secrets.GITHUBEMAIL }}&amp;#39;
          git add .
          git commit -m &amp;quot;${{ github.event.head_commit.message }} $(pubDate +&amp;quot;%Z %Y-%m-%d %A %H:%M:%S&amp;quot;) updatedDate by GitHub Actions&amp;quot;
          git push --force --quiet &amp;quot;https://${{ secrets.GITHUBUSERNAME }}:${{ secrets.GITHUBTOKEN }}@github.com/${{ secrets.GITHUBUSERNAME }}/${{ secrets.GITHUBUSERNAME }}.github.io.git&amp;quot; main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代码是来自&lt;a href=&quot;https://akilar.top/posts/f752c86d/&quot;&gt;店长&lt;/a&gt;的修改自用，为什么不用&lt;a href=&quot;https://blog.anheyu.com/posts/asdx.html&quot;&gt;安知鱼&lt;/a&gt;的？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;首先把Token直接放在仓库的文件里还是不太好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;像我这种在本地搞的，推不到仓库里，因为这里的token不能直接上传，所以改成环境变量来引入，但是依旧有各种问题，相反使用了店长的代码后，就大差不差，询问AI后就得到目前的代码，也就可以正式上传了。（无拉踩的意思）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;之后需要自己到仓库的 Settings-&amp;gt;Secrets-&amp;gt;actions 下添加环境变量，变量名参考脚本中出现的，依次添加。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://img.314926.xyz/images/2025/08/19/hexo-beiwang3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;重新设置远程仓库和分支&lt;/h3&gt;
&lt;details&gt;
&lt;summary&gt;🍼第一次使用git管理博客源码&lt;/summary&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;删除或者先把&lt;code&gt;[Blogroot]/themes/solitude/.git&lt;/code&gt;移动到非博客文件夹目录下,原因是主题文件夹下的&lt;code&gt;.git&lt;/code&gt;文件夹的存在会导致其被识别成子项目，从而无法被上传到源码仓库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在博客根目录&lt;code&gt;[Blogroot]&lt;/code&gt;路径下运行指令:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git init #初始化
git remote add origin git@github.com:[GithubUsername]/[SourceRepo].git #[SourceRepo]为存放源码的github私有仓库
git checkout -b master # 切换到master分支，
#2020年10月后github新建仓库默认分支改为main，注意更改
# 如果不是，后面的所有设置的分支记得保持一致
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;添加屏蔽项&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
.deploy_git*/
.idea
themes/solitude/.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不是&lt;code&gt;solitude&lt;/code&gt;主题，记得替换最后一行内容为你自己当前使用的主题。
4. 之后再运行 git 提交指令，将博客源码提交到 github 上。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &amp;quot;github action uppubDate&amp;quot;
git push origin master
#2020年10月后github新建仓库默认分支改为main，注意更改
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;此时你的主题文件夹若已经被正常上传，并且你也添加了主题文件夹下的.git 文件夹的屏蔽项。那你可以考虑把第二步移走或删除的&lt;code&gt;.git&lt;/code&gt;放回来，用作以后升级。（不禁怀疑真的有人会去用这个方式来升级吗）&lt;/details&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;🍾曾经做过git管理源码的操作&lt;/summary&gt;

&lt;ol&gt;
&lt;li&gt;添加屏蔽项&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因为能够使用指令进行安装的内容不包括在需要提交的源码内，所有我们需要将这些内容添加到屏蔽项，表示不上传到 github 上。这样可以显著减少需要提交的文件量和加快提交速度。
打开&lt;code&gt;[Blogroot]/.gitignore&lt;/code&gt;,输入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
.deploy_git*/
.idea
themes/solitude/.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不是&lt;code&gt;solitude&lt;/code&gt;主题，记得替换最后一行内容为你自己当前使用的主题。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;提交源码到私有仓库&lt;code&gt;[SourceRepo]&lt;/code&gt;
在博客根目录&lt;code&gt;[Blogroot]&lt;/code&gt;下启动终端，使用 git 指令重设仓库地址。这样在新建仓库，我们仍旧可以保留珍贵的 commit history，便于版本回滚。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote rm origin # 删除原有仓库链接
git remote add origin git@github.com:[GithubUsername]/[SourceRepo].git #[SourceRepo]为新的存放源码的github私有仓库
git checkout -b master # 切换到master分支，
#2020年10月后github新建仓库默认分支改为main，注意更改
# 如果不是，后面的所有设置的分支记得保持一致
git add .
git commit -m &amp;quot;github action uppubDate&amp;quot;
git push origin master
#2020年10月后github新建仓库默认分支改为main，注意更改
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;可能遇到的 bug
因为 solitude 主题文件夹下的.git 文件夹的存在，那么主题文件夹会被识别子项目。从而无法被上传到源码仓库。若是遇到添加屏蔽项，但是还是无法正常上传主题文件夹的情况。请先将本地源码中的 themes 文件夹移动到别的目录下。然后 commit 一次。接着将 themes 文件夹移动回来，再 commit 一次。&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;/p&gt;
&lt;p&gt;要是还不行，那就删了 solitude 主题文件夹下的.git 文件夹，然后再重复上述的 commit 操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/details&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;挖坑&lt;/h1&gt;
&lt;p&gt;大致写到这，未来或许会有&lt;del&gt;下一章&lt;/del&gt;挖坑？但是目前通用的就到这，然后后续会写Qexo的简单使用方法、solitude的一些配置更改和我踩坑经历吧。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Markdown 强调语法</title><link>https://sink.zsx815.top/markdown-qiangdiaoyufa</link><guid isPermaLink="true">https://sink.zsx815.top/markdown-qiangdiaoyufa</guid><description>Markdown 强调语法，如何使用星号和下划线进行文本强调。</description><pubDate>Thu, 17 Jul 2025 18:11:28 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href=&quot;https://markdown.com.cn/basic-syntax/emphasis.html&quot;&gt;https://markdown.com.cn/basic-syntax/emphasis.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Markdown 强调语法&lt;/h2&gt;
&lt;p&gt;通过将文本设置为粗体或斜体来强调其重要性。&lt;/p&gt;
&lt;h3&gt;粗体（Bold）&lt;/h3&gt;
&lt;p&gt;要加粗文本，请在单词或短语的前后各添加两个星号（asterisks）或下划线（underscores）。如需加粗一个单词或短语的中间部分用以表示强调的话，请在要加粗部分的两侧各添加两个星号（asterisks）。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;Markdown语法&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;HTML&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;预览效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;I just love **bold text**.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;I just love &amp;lt;strong&amp;gt;bold text&amp;lt;/strong&amp;gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;I just love &lt;strong&gt;bold text&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;I just love __bold text__.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;I just love &amp;lt;strong&amp;gt;bold text&amp;lt;/strong&amp;gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;I just love &lt;strong&gt;bold text&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;Love**is**bold&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;Love&amp;lt;strong&amp;gt;is&amp;lt;/strong&amp;gt;bold&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;Love &lt;strong&gt;is&lt;/strong&gt; bold&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;粗体（Bold）用法最佳实践&lt;/h3&gt;
&lt;p&gt;Markdown 应用程序在如何处理单词或短语中间的下划线上并不一致。为兼容考虑，在单词或短语中间部分加粗的话，请使用星号（asterisks）。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;✅  Do this&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;❌  Don&amp;#39;t do this&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;Love**is**bold&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;Love__is__bold&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;斜体（Italic）&lt;/h3&gt;
&lt;p&gt;要用斜体显示文本，请在单词或短语前后添加一个星号（asterisk）或下划线（underscore）。要斜体突出单词的中间部分，请在字母前后各添加一个星号，中间不要带空格。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;Markdown语法&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;HTML&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;预览效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is ***really important***.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is &amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;really important&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;This text is &lt;em&gt;&lt;strong&gt;really important&lt;/strong&gt;&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is ___really important___.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is &amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;really important&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;This text is &lt;em&gt;&lt;strong&gt;really important&lt;/strong&gt;&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is __*really important*__.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is &amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;really important&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;This text is &lt;strong&gt;&lt;em&gt;really important&lt;/em&gt;&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is **_really important_**.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This text is &amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;really important&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;This text is &lt;strong&gt;&lt;em&gt;really important&lt;/em&gt;&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This is really***very***important text.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This is really&amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;very&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;important text.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;This is really &lt;em&gt;&lt;strong&gt;very&lt;/strong&gt;&lt;/em&gt; important text.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;粗体（Bold）和斜体（Italic）用法的最佳实践&lt;/h3&gt;
&lt;p&gt;Markdown 应用程序在处理单词或短语中间添加的下划线上并不一致。为了实现兼容性，请使用星号将单词或短语的中间部分加粗并以斜体显示，以示重要。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;✅  Do this&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;❌  Don&amp;#39;t do this&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This is really***very***important text.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This is really___very___important text.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Markdown 换行语法</title><link>https://sink.zsx815.top/markdowm-huanhang</link><guid isPermaLink="true">https://sink.zsx815.top/markdowm-huanhang</guid><description>Markdown 换行语法，如何创建换行以及最佳实践</description><pubDate>Sat, 28 Jun 2025 22:11:28 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href=&quot;https://markdown.com.cn/basic-syntax/line-breaks.html&quot;&gt;https://markdown.com.cn/basic-syntax/line-breaks.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Markdown 换行语法&lt;/h2&gt;
&lt;p&gt;在一行的末尾添加两个或多个空格，然后按回车键,即可创建一个换行(&lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;)。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;Markdown语法&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;HTML&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;预览效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This is the first line.  &lt;/code&gt;&lt;br /&gt;&lt;code&gt;And this is the second line.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;This is the first line.&amp;lt;br&amp;gt;&lt;/code&gt;&lt;br /&gt; &lt;code&gt;And this is the second line.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;This is the first line.&lt;br /&gt; And this is the second line.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;换行（Line Break）用法的最佳实践&lt;/h2&gt;
&lt;p&gt;几乎每个 Markdown 应用程序都支持两个或多个空格进行换行，称为 &lt;code&gt;结尾空格（trailing whitespace)&lt;/code&gt; 的方式，但这是有争议的，因为很难在编辑器中直接看到空格，并且很多人在每个句子后面都会有意或无意地添加两个空格。由于这个原因，你可能要使用除结尾空格以外的其它方式来换行。幸运的是，几乎每个 Markdown 应用程序都支持另一种换行方式：HTML 的 &lt;code&gt;&amp;lt;br /&amp;gt;&lt;/code&gt; 标签。&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;为了兼容性，请在行尾添加“结尾空格”或 HTML 的 &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; 标签来实现换行。&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;还有两种其他方式我并不推荐使用。CommonMark 和其它几种轻量级标记语言支持在行尾添加反斜杠 (&lt;code&gt;\&lt;/code&gt;) 的方式实现换行，但是并非所有 Markdown 应用程序都支持此种方式，因此从兼容性的角度来看，不推荐使用。并且至少有两种轻量级标记语言支持无须在行尾添加任何内容，只须键入回车键（&lt;code&gt;return&lt;/code&gt;）即可实现换行。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;✅  Do this&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;❌  Don&amp;#39;t do this&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;First line with two spaces after.  &lt;/code&gt;&lt;br /&gt; &lt;code&gt;And the next line.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;First line with a backslash after.\&lt;/code&gt; &lt;br /&gt; &lt;code&gt;And the next line.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;First line with the HTML tag after.&amp;lt;br&amp;gt;&lt;/code&gt;&lt;br /&gt; &lt;code&gt;And the next line.&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;First line with nothing after.&lt;/code&gt;&lt;br /&gt; &lt;code&gt;And the next line.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>资源分享：涂鹿Toolooz</title><link>https://sink.zsx815.top/zyfx-toolooz</link><guid isPermaLink="true">https://sink.zsx815.top/zyfx-toolooz</guid><description>涂鹿Toolooz：曲线文字绘制设计工具，轻松创建沿任意路径排布的精美文字</description><pubDate>Mon, 19 May 2025 23:11:28 GMT</pubDate><content:encoded>&lt;h2&gt;涂鹿Toolooz：曲线文字绘制设计工具，轻松创建沿任意路径排布的精美文字&lt;/h2&gt;
&lt;p&gt;　　涂鹿Toolooz，在线曲线文字绘制工具，可使文字沿任意路径排列，打造独特视觉效果。为您的徽标、标题、艺术作品赋予生命力与创意。&lt;/p&gt;
&lt;p&gt;　　支持自定义画布尺寸、文本内容、字体、间距、颜色、描边等，还支持多个绘图工具和选择文本是否重复，可导出为 PNG、WebP 和 SVG 格式，免费使用，无需注册。&lt;/p&gt;
&lt;h2&gt;网站介绍&lt;/h2&gt;
&lt;h3&gt;截图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505191632987.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;特色&lt;/h3&gt;
&lt;h4&gt;自由绘制路径&lt;/h4&gt;
&lt;p&gt;　　使用鼠标或触控笔自由绘制路径，或选择预设形状如圆形、方形、椭圆等，轻松创建文字轨迹。&lt;/p&gt;
&lt;h4&gt;文本样式丰富&lt;/h4&gt;
&lt;p&gt;　　自定义字体、大小、颜色、间距等属性，支持文本背景带，打造丰富多样的文字效果。&lt;/p&gt;
&lt;h4&gt;交互式编辑&lt;/h4&gt;
&lt;p&gt;　　直观的选择、移动、缩放和旋转功能，让您精确控制每个文字路径的位置和外观。&lt;/p&gt;
&lt;h4&gt;灵活配置&lt;/h4&gt;
&lt;p&gt;　　自定义画布尺寸、背景色、缩放级别等，适应各种设计场景和需求。&lt;/p&gt;
&lt;h4&gt;多格式导出&lt;/h4&gt;
&lt;p&gt;　　将设计导出为PNG、SVG或WEBP格式，可自定义分辨率和尺寸，轻松应用于各种场景。&lt;/p&gt;
&lt;h4&gt;模板库&lt;/h4&gt;
&lt;p&gt;　　内置多种精美模板，一键应用，快速开始您的创意设计项目&lt;/p&gt;
&lt;h2&gt;应用场景&lt;/h2&gt;
&lt;p&gt;　　涂鹿曲线文字绘制设计工具适用于多种创意设计&lt;/p&gt;
&lt;p&gt;　　创建独特的环形或自定义形状品牌徽标，增强品牌视觉识别度。#社交媒体 #创意设计&lt;/p&gt;
&lt;p&gt;　　为社交媒体平台设计吸引眼球的曲线文字图片，提高内容吸引力。创意海报设计&lt;/p&gt;
&lt;p&gt;　　创建个性化海报和宣传材料，为活动和产品增添创意元素。&lt;/p&gt;
&lt;h2&gt;网站链接&lt;/h2&gt;
&lt;p&gt;　　&lt;a href=&quot;https://toolooz.com/&quot;&gt;https://toolooz.com&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;原文链接&lt;/h2&gt;
&lt;p&gt;　　&lt;a href=&quot;https://www.appmiao.com/836/&quot;&gt;https://www.appmiao.com/836/&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>来将 Telegram 当音乐播放器吧！</title><link>https://sink.zsx815.top/telegram-music</link><guid isPermaLink="true">https://sink.zsx815.top/telegram-music</guid><description>来将 Telegram 当音乐播放器吧！（寻找音乐、即时歌词、无损音乐不失真压缩）</description><pubDate>Thu, 15 May 2025 19:11:28 GMT</pubDate><content:encoded>&lt;h2&gt;来将 Telegram 当音乐播放器吧！（寻找音乐、即时歌词、无损音乐不失真压缩）&lt;/h2&gt;
&lt;h3&gt;步骤一：到 &lt;a href=&quot;https://t.me/music_v1bot&quot;&gt;@music_v1bot&lt;/a&gt; 下载歌曲，并找到歌词&lt;/h3&gt;
&lt;p&gt;　　&lt;em&gt;输入指令： /search （你想要的歌名）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151340118.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;步骤二：&lt;a href=&quot;https://telegra.ph/Mtmanager-02-10-2&quot;&gt;下载 MT 管理器（点我）&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;u&gt;开启：下载好的歌词文件&lt;/u&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151343982.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;步骤三：最右上角、搜索&amp;gt;勾选正则化，替换（全部替换）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;输入：[(\d{2}:\d{2}).\d+]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;替换：$1&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;注意：&amp;quot;$1&amp;quot;后面要加一个空格(英文)。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151346330.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;代码作者：Aric&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　并将选取好的歌词，粘贴到音乐文件就完成了。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://t.me/TESTLIVEUP&quot;&gt;（我是范例-点我查看）&lt;/a&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align:center; font-weight:bold; text-decoration:underline;&quot;&gt;须知&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;使用：“.FLAC“格式的音乐文件，有时候不能正常显示歌词时间轴，是正常的，所以你可能要转换特定的格式，如.mp3，或是.ogg 或.m4a 的歌曲。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　→ 如果你对音乐品质有极致追求，也有电脑 🖥️，我个人极度推荐使用 dBpowerAMP 这类型工具，将无损音乐格式转换成 m4a （水果的算法：QAAC 编码的音乐），目前可以&lt;a href=&quot;https://telegra.ph/QAAC-%E5%8E%8B%E7%BC%A9%E9%9F%B3%E4%B9%90%E6%8A%80%E6%9C%AF%E8%AF%A6%E8%A7%A3-08-22&quot;&gt;算是当今世界上最好的压缩算法，在通讯界享有盛名&lt;/a&gt;，且压缩后可以到接近百分之百还原。（甚至连对音乐/声学研究的职业工作者都讚叹不已）笔者强烈推荐，只叹手机没有类似的软件。专门转成 QAAC 编码的。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://t.me/haoruanfenxianggroup/369211&quot;&gt;🖥️ 电脑版 dBpowerAMP 下载/教学请点我&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151358822.jpg&quot; alt=&quot;&quot;&gt;​&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;拓展&lt;/h3&gt;
&lt;p&gt;　　以上是原文内容，如果你改了音乐格式失去了原本的封面，歌手等等东西，一般来说是不妨碍什么的，如果你一定要改的话，可以使用&lt;a href=&quot;https://t.me/kemiaosw_me/394&quot;&gt;音乐标签&lt;/a&gt;。具体使用很简单，我不多赘述，给个视频你就大致明白了：​&lt;code&gt; &lt;/code&gt;​&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
  &lt;iframe src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;amp;aid=615163818&amp;amp;bvid=BV1Jh4y1g7PV&amp;amp;cid=1175422578&amp;amp;p=1&quot; 
          scrolling=&quot;no&quot; 
          border=&quot;0&quot; 
          frameborder=&quot;no&quot; 
          framespacing=&quot;0&quot; 
          allowfullscreen=&quot;true&quot;
          style=&quot;width: 100%; max-width: 800px; height: 450px;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;　　同时，如果你想更换音乐格式，有很多种方法，以下给一个&lt;a href=&quot;https://convertio.co/zh/flac-m4a/&quot;&gt;网站&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;原文链接&lt;/h3&gt;
&lt;p&gt;　　&lt;a href=&quot;https://telegra.ph/Telegram-Real-Time-sync-lyrics-05-14&quot;&gt;https://telegra.ph/Telegram-Real-Time-sync-lyrics-05-14&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;　　‍&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>DROP：便捷大文件分享与托管网站，免费享10GB空间免费部署</title><link>https://sink.zsx815.top/drop</link><guid isPermaLink="true">https://sink.zsx815.top/drop</guid><description>DROP 是一个便捷的文件分享与托管平台，云存储工具，提供免费10GB的存储空间，支持大文件的快速上传与分享。</description><pubDate>Fri, 09 May 2025 21:24:28 GMT</pubDate><content:encoded>&lt;h3&gt;网站简介&lt;/h3&gt;
&lt;p&gt;DROP 是一个便捷的文件分享与托管平台，云存储工具，提供免费10GB的存储空间，支持大文件的快速上传与分享。&lt;/p&gt;
&lt;p&gt;支持上传图片、视频、压缩文件和PDF，选择适合文件的文档后，点击拷贝链接即可直接获得分享链接。采用AI驱动技术，确保文件传输的高效性和安全性，同时提供简洁直观的用户界面，方便用户管理和分享文件。DROP 适用于个人用户和创作者，可轻松展示和分发作品&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;截图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505092144042.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;功能特色&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;免费10GB存储&lt;/strong&gt;：新用户可免费享受10GB的存储空间，满足日常文件分享需求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;大文件支持&lt;/strong&gt;：支持大文件的快速上传与分享，适合分享高清视频、大型文档等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI驱动&lt;/strong&gt;：采用AI技术优化文件传输和管理，提升用户体验。 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;隐私保护&lt;/strong&gt;：提供文件访问控制，保护用户隐私和数据安全。  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;简洁界面&lt;/strong&gt;：直观的用户界面，易于上手，方便文件管理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;多平台支持&lt;/strong&gt;：支持多种设备和操作系统，方便随时随地访问文件。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;网站地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://drop.space/&quot;&gt;https://drop.space/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;原文链接&lt;/strong&gt;: &lt;a href=&quot;https://www.appmiu.com/31115.html&quot;&gt;https://www.appmiu.com/31115.html&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>tgtalk免费部署</title><link>https://sink.zsx815.top/tgtalk-deploy</link><guid isPermaLink="true">https://sink.zsx815.top/tgtalk-deploy</guid><description>一个基于 Cloudflare Workers 的 tg 频道消息说说。</description><pubDate>Sun, 04 May 2025 21:01:28 GMT</pubDate><content:encoded>&lt;h2&gt;部署 API&lt;/h2&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://gist.github.com/FloatSheep/55db67d9e8148149ebbcb0f9f6b0d901&quot;&gt;Gist&lt;/a&gt; 并获取其中所有代码&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;需要注意，本 API Worker 脚本基于 ChenYFan 修改，包含了本项目需要使用的功能，请勿随意更改脚本内容
TGTalker-Frontend V2 的 API 不兼容 V1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;Cloudflare 仪表盘&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选择创建应用程序 -&amp;gt; 创建 Worker -&amp;gt; 修改名称（部署）-&amp;gt; 编辑代码&lt;/p&gt;
&lt;p&gt;在其中粘贴你复制的所有代码，并且修改 ChannelName 为你的频道名称，部署并访问 Worker 查看是否能正确返回内容&lt;/p&gt;
&lt;p&gt;接着你可以为你的 Worker 绑定一个域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505042340004.png&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505042340138.png&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505042340963.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;保存，然后将你绑定的域名填入配置中的 api 项即可。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Umami博客访问统计Vercel+Cloudflare Wokers部署</title><link>https://sink.zsx815.top/umami-free-deploy</link><guid isPermaLink="true">https://sink.zsx815.top/umami-free-deploy</guid><description>Umami博客访问统计Vercel+Cloudflare Wokers部署教程，附带效果图展示。</description><pubDate>Mon, 07 Apr 2025 17:11:28 GMT</pubDate><content:encoded>&lt;h2&gt;第一部分：Vercel+Umami&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;第一步
 1.1 &lt;kbd&gt;Fork&lt;/kbd&gt;​&lt;a href=&quot;https://github.com/umami-software/umami&quot;&gt;umami&lt;/a&gt;到自己的Github仓库&lt;/p&gt;
&lt;p&gt; &lt;img src=&quot;https://s2.loli.net/2025/04/06/c4xDVNrsBpTM8YZ.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt; 1.2 创建项目&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/GX9OdivuxF5pJzH.webp&quot; alt=&quot;&quot;&gt;
index.mdx
2. 第二步&lt;/p&gt;
&lt;p&gt;　2.1 创建&lt;a href=&quot;https://vercel.com/login&quot;&gt;Verce&lt;/a&gt;l账号，这里我就省略了，因为GitHub可以直接进行授权即可。&lt;/p&gt;
&lt;p&gt;   2.2 在你授权以后，首先创建&lt;kbd&gt;Postgres&lt;/kbd&gt;数据库，直接一路下一步，创建好就行，可以给下面的连接复制出来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/K69FpfmjZxcu3Ad.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/7OieEKGht4kgSux.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　点击&lt;kbd&gt;Copy Snippet&lt;/kbd&gt;​,就可以，记住在粘贴的时候是我画线里面的部分，双引号都不需要 ，因为要设置环境变量。&lt;/p&gt;
&lt;p&gt;　　 2.3 在创建好数据库以后，回到主页面的&lt;kbd&gt;Overview&lt;/kbd&gt;​，然后右上角有一个&lt;kbd&gt;Add New&lt;/kbd&gt;​选择添加&lt;kbd&gt;Project&lt;/kbd&gt;​，选择你&lt;kbd&gt;Fork&lt;/kbd&gt;​的&lt;kbd&gt;umami&lt;/kbd&gt;​，添加即可。
    2.4 设置环境变量，&lt;code&gt;DATABASE_URL&lt;/code&gt;​和&lt;code&gt;HASH_SALT&lt;/code&gt;​和&lt;code&gt;TRACKER_SCRIPT_NAME&lt;/code&gt;​，其中&lt;code&gt;DATABASE_URL&lt;/code&gt;​的值就是上面划线的部分，其他的两个环境变量都是对应的值是String自己可以随意定义。
　　 2.5 设置好以后点击&lt;kbd&gt;Deploy&lt;/kbd&gt;​，等待大约两分钟左右，自动部署完成，部署完成以后可以通过下图种面板上面给的链接可以直接访问。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/ahX2wHLrfYAD7ZW.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　 2.6 打开以后会跳出登录地址，默认的登录密码是&lt;kbd&gt;adminumami&lt;/kbd&gt;​，登录进去以后，设置给自己密码修改了，然后就是设置里面添加网站，给你要统计的网站添加进去，到此，别人访问你的网站你可以通过面板看到统计数据了。&lt;/p&gt;
&lt;h2&gt;第二部分：Umami+Cloudflare worker&lt;/h2&gt;
&lt;p&gt;这一部分主要是让你的博客上面能展示的访问数据，效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/fR71aFG4oMD29Pz.webp&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注册&lt;kbd&gt;CloudFlare&lt;/kbd&gt;​账号，然后进去以后，选择&lt;kbd&gt;Workers&lt;/kbd&gt;​和&lt;kbd&gt;Pages&lt;/kbd&gt;​，点击&lt;kbd&gt;创建&lt;/kbd&gt;​，再点击&lt;kbd&gt;部署&lt;/kbd&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/CYojqdGHkiuFepQ.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/6B2rXxk4Uu71GQC.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　部署以后，进去点击编辑代码，将里面的代码进行替换：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;addEventListener(&amp;#39;fetch&amp;#39;, event =&amp;gt; {
  event.respondWith(handleRequest(event));
});

const API_BASE_URL = &amp;#39;https://umami.yourdomain.com&amp;#39;;  // 替换你的刚才部署的umami的域名
const TOKEN = &amp;#39;your_token&amp;#39;; // 获取的token
const WEBSITE_ID = &amp;#39;your_website_id&amp;#39;; // 在umami添加网站的 webstie id
const CACHE_KEY = &amp;#39;umami_cache&amp;#39;;
const CACHE_TIME = 600; // Cache time in seconds

async function fetchUmamiData(startAt, endAt) {
  const url = `${API_BASE_URL}/api/websites/${WEBSITE_ID}/stats?startAt=${startAt}&amp;amp;endAt=${endAt}`;
  const response = await fetch(url, {
    headers: {
      &amp;#39;Authorization&amp;#39;: `Bearer ${TOKEN}`,
      &amp;#39;Content-Type&amp;#39;: &amp;#39;application/json&amp;#39;
    }
  });

  if (!response.ok) {
    console.error(`Error fetching data: ${response.statusText}`);
    return null;
  }

  return response.json();
}

async function handleRequest(event) {
  const cache = await caches.open(CACHE_KEY);
  const cachedResponse = await cache.match(event.request);

  if (cachedResponse) {
    return cachedResponse;
  }

  const now = pubDate.now();
  const todayStart = new pubDate(now).setHours(0, 0, 0, 0);
  const yesterdayStart = new pubDate(now - 86400000).setHours(0, 0, 0, 0);
  const lastMonthStart = new pubDate(now).setMonth(new pubDate(now).getMonth() - 1);
  const lastYearStart = new pubDate(now).setFullYear(new pubDate(now).getFullYear() - 1);

  const [todayData, yesterdayData, lastMonthData, lastYearData] = await Promise.all([
    fetchUmamiData(todayStart, now),
    fetchUmamiData(yesterdayStart, todayStart),
    fetchUmamiData(lastMonthStart, now),
    fetchUmamiData(lastYearStart, now)
  ]);

  const responseData = {
    today_uv: todayData?.visitors?.value ?? null,
    today_pv: todayData?.pageviews?.value ?? null,
    yesterday_uv: yesterdayData?.visitors?.value ?? null,
    yesterday_pv: yesterdayData?.pageviews?.value ?? null,
    last_month_pv: lastMonthData?.pageviews?.value ?? null,
    last_year_pv: lastYearData?.pageviews?.value ?? null
  };

  const jsonResponse = new Response(JSON.stringify(responseData), {
    headers: {
      &amp;#39;Content-Type&amp;#39;: &amp;#39;application/json&amp;#39;,
      &amp;#39;Access-Control-Allow-Origin&amp;#39;: &amp;#39;*&amp;#39;,
      &amp;#39;Access-Control-Allow-Methods&amp;#39;: &amp;#39;GET, POST, PUT, DELETE, OPTIONS&amp;#39;,
      &amp;#39;Access-Control-Allow-Headers&amp;#39;: &amp;#39;Content-Type, Authorization&amp;#39;
    }
  });

  event.waitUntil(cache.put(event.request, jsonResponse.clone()));

  return jsonResponse;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　但是里面有几个比较重要的参数需要修改&lt;code&gt;API_BASE_URL&lt;/code&gt;​、&lt;code&gt;TOKEN&lt;/code&gt;​、&lt;code&gt;WEBSITE_ID&lt;/code&gt;​其中&lt;code&gt;API_BASE_URL&lt;/code&gt;​和&lt;code&gt;WEBSITE_ID&lt;/code&gt;​已经是有的，&lt;code&gt;WEBSITE_ID&lt;/code&gt;​在&lt;kbd&gt;umami&lt;/kbd&gt;​中的设置，选择你已经添加好的网站，点击&lt;kbd&gt;编辑&lt;/kbd&gt;​，会出现网站的&lt;code&gt;WEBSITE_ID&lt;/code&gt;​：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/eFHEYB45nQOUAML.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　 2.2 获取&lt;kbd&gt;token&lt;/kbd&gt;​，在想&lt;kbd&gt;api&lt;/kbd&gt;​测试网站，&lt;a href=&quot;https://hoppscotch.io/&quot;&gt;hoppscotch&lt;/a&gt;，跳转到这个页面以后，如下图所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/06/vXrQmtpu4HdIasN.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　  2.2.1 请求方式选择&lt;kbd&gt;post&lt;/kbd&gt;​，链接填写方式是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://你的umami域名或者是链接/api/auth/login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　  2.2.2 请求体选择&lt;kbd&gt;Body&lt;/kbd&gt;​参数格式选择&lt;kbd&gt;application/json&lt;/kbd&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
 &amp;quot;username&amp;quot;:&amp;quot;用户名&amp;quot;,
 &amp;quot;password&amp;quot;:&amp;quot;密码&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　  2.2.3 返回结果中&lt;kbd&gt;token&lt;/kbd&gt;​里面的内容就是需要的&lt;kbd&gt;token&lt;/kbd&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &amp;quot;token&amp;quot;: &amp;quot;你的token&amp;quot;, # 你需要记录下来的内容
  &amp;quot;user&amp;quot;: {
    &amp;quot;id&amp;quot;: &amp;quot;41e2b680-648e-4b09-bcd7-3e2b10c06264&amp;quot;,
    &amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;,
    &amp;quot;role&amp;quot;: &amp;quot;admin&amp;quot;,
    &amp;quot;createdAt&amp;quot;: &amp;quot;2024-11-12T09:18:12.766Z&amp;quot;,
    &amp;quot;isAdmin&amp;quot;: true
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　到这里，你部署&lt;code&gt;api&lt;/code&gt;​所需要的所有参数内容都已经有了，给替换进去即可。&lt;/p&gt;
&lt;p&gt;　　 2.3 测试在你部署好以后，会有一个链接，当然你如果是用&lt;kbd&gt;cloudflare&lt;/kbd&gt;​代理你的域名，可以直接进行关联。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/07/IPCS2rhLbiaX3G8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　然后点击或则是复制粘贴到浏览器，请求以后会出来下面的结果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.loli.net/2025/04/07/M9wsiYKBoGyLI8T.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　如果没有结果，建议你先去你部署的umami面板里面看看有没有数据，有数据的情况下，这里请求都会有数据的，清理浏览器缓存开代理在测试。&lt;/p&gt;
&lt;h2&gt;第三部分：添加博客统计&lt;/h2&gt;
&lt;p&gt;　　将数据添加到&lt;kbd&gt;about&lt;/kbd&gt;​页面&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tj: # 统计
  provider: custom # custom
  url: 你的数据接口地址
  img: https://7.isyangs.cn/1/65eb2e9109826-1.png # 背景
  desc: # 卡片左下角描述
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　配置完成~&lt;/p&gt;
&lt;p&gt;　　感谢&lt;a href=&quot;https://blog.starsharbor.com/&quot;&gt;starsharbor&lt;/a&gt;大佬博客的指导，&lt;a href=&quot;https://blog.starsharbor.com/posts/solitude-about_umami/&quot;&gt;原文&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;作者原文&lt;/h2&gt;
&lt;p&gt;作者: Couture
链接: &lt;a href=&quot;https://www.coutures.top/posts/27233.html&quot;&gt;https://www.coutures.top/posts/27233.html&lt;/a&gt;
来源: Couture
著作权归作者所有。 商业转载请联系作者获得授权，非商业转载请注明出处。&lt;/p&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Git 同步上游仓库的更新</title><link>https://sink.zsx815.top/git-tongbu</link><guid isPermaLink="true">https://sink.zsx815.top/git-tongbu</guid><description>使用一个 Github Template 创建了我自己的仓库，需要同步一下补丁更新，总不能自己手抄一遍吧，搜了一下解决方案。记录一下。</description><pubDate>Fri, 04 Apr 2025 22:16:21 GMT</pubDate><content:encoded>&lt;h2&gt;Git 同步上游仓库的更新&lt;/h2&gt;
&lt;p&gt;　　使用一个 Github Template 创建了我自己的仓库，需要同步一下补丁更新，总不能自己手抄一遍吧，搜了一下解决方案。&lt;/p&gt;
&lt;p&gt;　　记录一下。&lt;/p&gt;
&lt;h3&gt;添加上游仓库&lt;/h3&gt;
&lt;p&gt;　　给上游仓库取个名字，如果将命名为 &lt;code&gt;upstream&lt;/code&gt;​ ，可以在本地仓库中运行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git remote add upstream https://github.com/$&amp;lt;upstream-repo&amp;gt;.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;获取上游仓库的更改&lt;/h3&gt;
&lt;p&gt;　　运行以下命令以获取上游仓库中的所有分支和提交：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git fetch upstream
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;合并上游更改&lt;/h3&gt;
&lt;p&gt;　　现在，将上游 main 分支的更改合并到您的本地 main 分支：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git merge upstream/main --allow-unrelated-histories
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　如果只需要合并特定的 commit ：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git cherry-pick &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　也可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;gcp &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　commit-hash 可以直接从 github 网页上复制。&lt;/p&gt;
&lt;p&gt;　　这时 commit 的作者是源仓库的作者， Vercel 提示我 Build 失败，需要升级到 Pro，可以再修改一个文件，自己添加一条 commit 。&lt;/p&gt;
&lt;p&gt;　　当然这很不优雅，可以使用下面的命令获取更改到文件，但是不会提交 commit ，&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git cherry-pick &amp;lt;commit-hash&amp;gt; --no-commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　然后手动提交一下&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git commit -m &amp;quot;commit information&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解决冲突&lt;/h3&gt;
&lt;p&gt;　　如何自己已经修改过源代码，在合并过程中可能发生冲突，需要手动解决。&lt;br&gt;Git 也会进行提示，手动编辑冲突文件并保存，然后再提交更改。&lt;/p&gt;
&lt;h3&gt;批量提交&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git cherry-pick &amp;lt;起始提交&amp;gt;^..&amp;lt;结束提交&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　如果有冲突会按照顺序处理，然后执行， continue 直到结束&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git cherry-pick --continue
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;​&lt;code&gt;&amp;lt;起始提交&amp;gt;&lt;/code&gt;​：范围的开始点（不包含此提交，除非用 &amp;lt;起始提交&amp;gt;~ 或 &amp;lt;起始提交&amp;gt;^）。&lt;/li&gt;
&lt;li&gt;​&lt;code&gt;&amp;lt;结束提交&amp;gt;&lt;/code&gt;​：范围的结束点（包含此提交）。&lt;/li&gt;
&lt;li&gt;​&lt;code&gt;^&lt;/code&gt;​ 是 Git 的语法，用于指定“之前的提交”。&lt;/li&gt;
&lt;li&gt;​&lt;code&gt;..&lt;/code&gt;​ 表示范围。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;推送&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;　　当然默认来说，并不会推送到新加入的 &lt;code&gt;upstream&lt;/code&gt;​ ，直接 &lt;code&gt;git push&lt;/code&gt;​ 即可&lt;/p&gt;
&lt;p&gt;　　如果不再需要同步，可以删除上游的仓库&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git remote remove upstream
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Markdown 段落语法</title><link>https://sink.zsx815.top/markdown-duanluo</link><guid isPermaLink="true">https://sink.zsx815.top/markdown-duanluo</guid><description>Markdown 段落语法，如何创建段落以及最佳实践</description><pubDate>Thu, 13 Feb 2025 18:11:28 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原文位置: &lt;a href=&quot;https://markdown.com.cn/basic-syntax/paragraphs.html&quot;&gt;https://markdown.com.cn/basic-syntax/paragraphs.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Markdown 段落&lt;/h2&gt;
&lt;p&gt;要创建段落，请使用空白行将一行或多行文本进行分隔。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Markdown语法&lt;/th&gt;
&lt;th&gt;HTML&lt;/th&gt;
&lt;th&gt;预览效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;I really like using Markdown.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p&amp;gt;I really like using Markdown.&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;I really like using Markdown.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;I think I&amp;#39;ll use it to format all of my documents from now on.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p&amp;gt;I think I&amp;#39;ll use it to format all of my documents from now on.&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;I think I&amp;#39;ll use it to format all of my documents from now on.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;段落（Paragraph）用法的最佳实践&lt;/h2&gt;
&lt;p&gt;不要用空格（spaces）或制表符（ tabs）缩进段落。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅  Do this&lt;/th&gt;
&lt;th&gt;❌  Don&amp;#39;t do this&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Don&amp;#39;t put tabs or spaces in front of your paragraphs.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;    This can result in unexpected formatting problems.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Keep lines left-aligned like this.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;  Don&amp;#39;t add tabs or spaces in front of paragraphs.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Markdown-标题语法 | 技术分享</title><link>https://sink.zsx815.top/markdown-biaotiyufa</link><guid isPermaLink="true">https://sink.zsx815.top/markdown-biaotiyufa</guid><description>记录 Markdown 语法的标题语法,方便学习和查找。</description><pubDate>Wed, 12 Feb 2025 18:56:28 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原文位置: &lt;a href=&quot;https://markdown.com.cn/basic-syntax/headings.html&quot;&gt;https://markdown.com.cn/basic-syntax/headings.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Markdown 标题语法&lt;/h1&gt;
&lt;p&gt;要创建标题，请在单词或短语前面添加井号 (#) 。&lt;code&gt;#&lt;/code&gt; 的数量代表了标题的级别。例如，添加三个 &lt;code&gt;#&lt;/code&gt; 表示创建一个三级标题 (&lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt;) (例如：&lt;code&gt;### My Header&lt;/code&gt;)。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Markdown语法&lt;/th&gt;
&lt;th&gt;HTML&lt;/th&gt;
&lt;th&gt;预览效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;# Heading level 1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h1&amp;gt;Heading level 1&amp;lt;/h1&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h1&gt;Heading level 1&lt;/h1&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;## Heading level 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h2&amp;gt;Heading level 1&amp;lt;/h2&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h2&gt;Heading level 2&lt;/h2&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;### Heading level 3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h3&amp;gt;Heading level 1&amp;lt;/h3&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;Heading level 3&lt;/h3&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;#### Heading level 4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h4&amp;gt;Heading level 1&amp;lt;/h4&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h4&gt;Heading level 4&lt;/h4&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;##### Heading level 5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h5&amp;gt;Heading level 1&amp;lt;/h5&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h5&gt;Heading level 5&lt;/h5&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;###### Heading level 6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h6&amp;gt;Heading level 1&amp;lt;/h6&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h6&gt;Heading level 6&lt;/h6&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;可选语法&lt;/h2&gt;
&lt;p&gt;还可以在文本下方添加任意数量的 == 号来标识一级标题，或者 -- 号来标识二级标题。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Markdown语法&lt;/th&gt;
&lt;th&gt;HTML&lt;/th&gt;
&lt;th&gt;&lt;div style=&quot;width:100px;&quot;&gt;预览效果&lt;/div&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Heading level 1&lt;/code&gt;&lt;br /&gt;&lt;code&gt;===============&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h1&amp;gt;Heading level 1&amp;lt;/h1&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h1&gt;Heading level 1&lt;/h1&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Heading level 2&lt;/code&gt;&lt;br /&gt;&lt;code&gt;---------------&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;h2&amp;gt;Heading level 2&amp;lt;/h2&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;h2&gt;Heading level 2&lt;/h2&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;最佳实践&lt;/h2&gt;
&lt;p&gt;不同的 &lt;strong&gt;Markdown&lt;/strong&gt; 应用程序处理 &lt;code&gt;#&lt;/code&gt; 和标题之间的空格方式并不一致。为了兼容考虑，请用一个空格在 &lt;code&gt;#&lt;/code&gt; 和标题之间进行分隔。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅  Do this&lt;/th&gt;
&lt;th&gt;❌  Don&amp;#39;t do this&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;# Here&amp;#39;s a Heading&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#Here&amp;#39;s a Heading&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item><item><title>Markdown-速查表</title><link>https://sink.zsx815.top/markdown-suchabiao</link><guid isPermaLink="true">https://sink.zsx815.top/markdown-suchabiao</guid><description>记录 Markdown 的用法，便于查找。</description><pubDate>Tue, 11 Feb 2025 18:11:28 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原文位置: &lt;a href=&quot;https://markdown.com.cn/cheat-sheet.html#%E6%80%BB%E8%A7%88&quot;&gt;https://markdown.com.cn/cheat-sheet.html#%E6%80%BB%E8%A7%88&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;总览&lt;/h1&gt;
&lt;p&gt;Markdown 速查表提供了所有 &lt;strong&gt;Markdown&lt;/strong&gt;
语法元素的基本解释。如果你想了解某些语法元素的更多信息，请参阅更详细的
&lt;strong&gt;基本语法&lt;/strong&gt; 和 &lt;strong&gt;扩展语法&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;基本语法&lt;/h2&gt;
&lt;p&gt;这些是 &lt;strong&gt;John Gruber&lt;/strong&gt; 的原始设计文档中列出的元素。所有 &lt;strong&gt;Markdown&lt;/strong&gt;
应用程序都支持这些元素。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;元素&lt;/th&gt;
&lt;th&gt;Markdown 语法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;标题（Heading）&lt;/td&gt;
&lt;td&gt;\ # H1 一级标题&lt;br /&gt; \ ## H2 二级标题&lt;br /&gt; \ ### H3 三级标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;粗体（Bold）&lt;/td&gt;
&lt;td&gt;**bold text**&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;斜体（Italic）&lt;/td&gt;
&lt;td&gt;*italicized text*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;引用块（Blockquote）&lt;/td&gt;
&lt;td&gt;&amp;gt; blockquote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;有序列表（Ordered List）&lt;/td&gt;
&lt;td&gt;1. First item&lt;br /&gt; 2. Second item&lt;br /&gt; 3. Third item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;无序列表（Unordered List）&lt;/td&gt;
&lt;td&gt;- First item&lt;br /&gt; - Second item&lt;br /&gt; - Third item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码（Code）&lt;/td&gt;
&lt;td&gt;`code`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分隔线（Horizontal Rule）&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;链接（Link）&lt;/td&gt;
&lt;td&gt;[title](&lt;a href=&quot;https://www.example.com&quot;&gt;https://www.example.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图片（Image）&lt;/td&gt;
&lt;td&gt;![alt text](image.jpg)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;扩展语法&lt;/h2&gt;
&lt;p&gt;这些元素通过添加额外的功能扩展了基本语法。但是，并非所有 &lt;strong&gt;Markdown&lt;/strong&gt;
应用程序都支持这些元素。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;元素&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;Markdown 语法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;表格（Table）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;| Syntax | Description |&lt;/code&gt;&lt;br /&gt;&lt;code&gt;| -----------  |  -----------  |&lt;/code&gt;&lt;br /&gt;&lt;code&gt;| Header  |  Title  |&lt;/code&gt;&lt;br /&gt;&lt;code&gt;| Paragraph | Text |&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;代码块（Fenced Code Block）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;```&lt;/code&gt;&lt;br /&gt;&lt;code&gt;{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;quot;firstName&amp;quot;: &amp;quot;John&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;quot;lastName&amp;quot;: &amp;quot;Smith&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;quot;age&amp;quot;: 25&lt;/code&gt;&lt;br&gt; &lt;code&gt;}&lt;/code&gt;&lt;br&gt; &lt;code&gt;```&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;脚注（Footnote）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;Here’s a sentence with a footnote.&lt;code&gt;[^1]&lt;/code&gt;&lt;br /&gt;&lt;code&gt;[^1]&lt;/code&gt;: This is the footnote.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;标题编号（Heading ID）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;\ ### My Great Heading{#custom-id}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;定义列表（Definition List）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;term&lt;br /&gt;: definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;任务列表（Task List）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;- [x] Write the press release&lt;/code&gt;&lt;br /&gt;&lt;code&gt;- [ ] UppubDate the website&lt;/code&gt;&lt;br /&gt;&lt;code&gt;- [ ] Contact the media&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded><dc:creator>钟神秀</dc:creator></item></channel></rss>