<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>星沐Blog</title><description>星沐的个人博客</description><link>https://niezhenhaoblog.cc.cd/</link><language>zh_CN</language><item><title>累了毁灭吧！</title><link>https://niezhenhaoblog.cc.cd/posts/my-leilhmb/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-leilhmb/</guid><description>20岁之前的故事</description><pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;前言：20岁之后的故事还不知道，但20岁前面的事情也让我痛和难忘！对了，人生的一次在哔哩哔哩，有一个纪录片，感兴趣可以去看看哦！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一.本人经历&lt;/h2&gt;
&lt;p&gt;注意：（）内心OS&lt;/p&gt;
&lt;p&gt;我生于 2005 年 / 12 月 26 日，我呢，地地道道的农村人，看到这，你可能会疑惑，我为啥会有博客，这个后面解释噢。&lt;/p&gt;
&lt;p&gt;在我 10 岁的时候，那会我读小学四年级，发生了一件事，放学路上我和我的同学，在下坡路段，需要去对面，在路中间的时候，上面一位开摩托车的家长撞到了我和我的同学，当然，肯定是没有避开的，后来回到家，父亲还在油菜地里收油菜，我的父亲看到我脸上的伤痕，询问原因，去了派出所，看了监控，确实是摩托车的责任。我的门牙缺了，左边的眼睛肿了，哎😭😭，第一段的故事到这了。&lt;/p&gt;
&lt;p&gt;在我 11 岁的时候，学校，因为学生的眼睛近视的问题，安排了外面的体检，就因为我后面填了他们的表，可恶的医生打电话联系了我父亲，艹，后面永久性的戴了眼镜，‘’眼镜‘’这两个称呼伴随我初中、高中、以及后面😡😡，所以我后面所有，有问题的表格基本上不会在填家长的手机号了，这个事也为后面的事情埋下了伏笔。&lt;/p&gt;
&lt;p&gt;在 14 岁的时候，那年发生了新冠疫情，持续到了高中😭😭😭，在后来初中升高中的时候，我们可爱的班长为我们举办了一场晚会，真的很厉害🤧🤧&lt;/p&gt;
&lt;p&gt;在 16 岁的时候，初中毕业，升高中的时候，学校组织了一场学校参考会，就因为我前面发生的手机号，所以乱填的，导致我去了我不想去的，我不知道家长他们从哪认识的人，去大足那边的学校，这个垃圾学校，毕业证上的名字还不是学校的名字，MD😡。我这人本来就内向，后面也不是很好，接下来就是学校里面选择专业的事情，我记得当时，带我们的那个导员没说清楚不是没说清楚而是根本没说，选错了专业（电子商务），哎，世上没有后悔药。&lt;/p&gt;
&lt;p&gt;接下来呢，聊聊笔记本的事，在我高中的第二年，学校组织去外面实习内心 OS:(没把我们当人啊)我记得 11 月份，月底时候去的，干到下一年的 1 月份，我记得离职的晚上，我去还衣服，身上就一件，短衣短裤，贼冷❄️❄️。后面我用这几个月的钱，买了我人生的第一台笔记本电脑（老伙计）。后面靠着老伙计还是干了很多的事情。&lt;/p&gt;
&lt;p&gt;在上高中的时候，家里，因为听说我们这里会拆迁，结果也是出人意料，我们家没有拆迁到，哎🤣&lt;/p&gt;
&lt;p&gt;在后来，因为实习（第二次😡）去了福建，真的，人生第一次去外面，但结果跟我想的不一样好吧，在我离职的几天，跟认识的一位朋友去了海边，人生的第一次看海（可恶的小日本排核辐水😡），对了因为火车票太贵了，所以选择了坐飞机，人生第一次嘛✈️。&lt;/p&gt;
&lt;p&gt;在这回答前面的一个问题，我为什么会有博客，原本在 24 年那会做好的，因为一些原因，所以放弃了。这次也是之前一位老师的博客文章（无意间翻到的），提醒了我，我真的很感谢老师。你或许应该可能知道 Gitub，这是一个开源的网站，内容很好。这个网站也是我后来想自己做一个博客的原由，做好的内容可以帮助更多的人。, 帮我排版一下，博客文章&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;p&gt;对比的话听多了，是会刻进骨子里的。&lt;/p&gt;
&lt;p&gt;久而久之，我真的默认了：&lt;strong&gt;我本来就不行。&lt;/strong&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;p&gt;别人看起来是安静、佛系、不争不抢，只有自己知道：&lt;/p&gt;
&lt;p&gt;是自卑撑不起底气，是敏感扛不住对比，是从小到大的期待落差，一点点压得自己不敢张扬。&lt;/p&gt;
&lt;p&gt;我也慢慢明白，我这一生最大的软肋，不是不够聪明、不够优秀，而是&lt;strong&gt;习惯性觉得自己不行&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;生气会掉眼泪，委屈会藏心里，难过从不对外说。所有的情绪都自己消化，所有的否定都照单全收。别人以为我抗压差、太脆弱，其实我只是从小被对比惯了，早就习惯了自我怀疑。&lt;/p&gt;
&lt;p&gt;可长大之后我才慢慢懂一件事：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;内向从来不是缺陷，安静也不是平庸。&lt;/strong&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;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;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;你好，朋友如果看到这里了，真的很高兴您！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dl4.weshineapp.com/gif/20180324/25771f2c72c414015bdac7d9356b976b.gif?f=micro_6LCi6LCi&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;祝您每一天都高高兴兴的，记得按时吃饭，不然跟我一样，肚子痛😭，拜拜了，下一张文章见拜拜了!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dl4.weshineapp.com/gif/20171113/d40e87d6bad9510524b5cbc61c84a120.gif?f=micro_5ouc5ouc&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>游戏平台</title><link>https://niezhenhaoblog.cc.cd/posts/my-yxpt/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-yxpt/</guid><description>游戏平台</description><pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本篇网站内容为pc端游-游戏平台分享&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;pc端游/游戏平台分享&lt;/h1&gt;
&lt;h2&gt;一.Steam平台&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://store.steampowered.com/&quot;&gt;steam&lt;/a&gt;，网络不好的时候可以参考，本网站的加速器文章&lt;a href=&quot;/posts/my-software-sharing/&quot;&gt;加速器文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pc游戏公认的平台，大部分还是付费游戏为主，注册困难（哈哈哈哈哈哈哈哈哈哈哈），还有朋友注册或者下载错的steam平台，哎😭&lt;/p&gt;
&lt;h2&gt;二.Epic&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.epicgames.com/site/home/?lang=zh-CN&amp;amp;sessionInvalidated=true&quot;&gt;epic&lt;/a&gt;
每周赠送免费游戏，大大的良心啊😭😭😭😭😭&lt;/p&gt;
&lt;h2&gt;三.本篇文章只提供网站链接不提供注册方法，如果需要可以在留言区域告知！！！！&lt;/h2&gt;
</content:encoded></item><item><title>网盘浏览器扩展插件</title><link>https://niezhenhaoblog.cc.cd/posts/my-browser-extension-plugin/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-browser-extension-plugin/</guid><description>浏览器网盘扩展插件安装使用教程，配合Motrix实现高速下载</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;浏览器网盘扩展插件分享和安装使用方法&lt;/h1&gt;
&lt;h2&gt;（一）浏览器扩展&lt;/h2&gt;
&lt;h4&gt;1.打开浏览器→右上角三个点→扩展→管理扩展&lt;/h4&gt;
&lt;h4&gt;2.加载解压缩的扩展：获取Microsoft Edge扩展，如果里面没有你需要的插件可以 导入外面的插件，导入外部插件，比如你在外面下载的插件，也可以直接把插件的包直接拖入到扩展这个界面!右上角会提示安装！&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;注：某些插件如果运行不了记得开开发者模式噢！！！🫥&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/kzym.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h2&gt;（二）网盘插件&lt;/h2&gt;
&lt;h3&gt;1.在获取Microsoft Edge扩展商店搜索→篡改猴测试版→安装&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/kzh.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;2.获取插件&lt;/h3&gt;
&lt;h5&gt;1.根据我提供的这个：&lt;a href=&quot;https://github.com/hmjz100/LinkSwift/&quot;&gt;LinkSwift下载页面&lt;/a&gt;前往下载&lt;/h5&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/kzlsw.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;3.在插件界面点击安装&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/cjaz.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h2&gt;（三）插件+Motrix下载&lt;/h2&gt;
&lt;h3&gt;一.插件开启&lt;/h3&gt;
&lt;h4&gt;1. &lt;strong&gt;右上角方块拼图图标&lt;/strong&gt;（红色上框）Edge 浏览器的&lt;strong&gt;扩展程序弹出面板入口&lt;/strong&gt;，点击之后展开全部已安装扩展列表。&lt;/h4&gt;
&lt;h4&gt;2. 下面这个红色框，把插件的图标固定在上方&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/kztp.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h4&gt;3.前面的插件安装完成后来到网盘界面，能看到下载助手，说明在网盘可以用了&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/wp1.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;二.接下来下载Motrix-1.8.19，配合下载助手使用&lt;/h3&gt;
&lt;h4&gt;1.前往下载界面，&lt;a href=&quot;https://motrix.app/download/&quot;&gt;下载Motrix&lt;/a&gt;，推荐下载第三个方框的.zip，解压即用，不用安装！！！&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/mtro.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h4&gt;2.下载解压并得到这个界面&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/mtojmq.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h4&gt;3.在左下角方框位置，更改默认下载路径，注：最好用字母/英文，防止路径报错，完成后点击下方的保存并应用&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/mtrojs.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h2&gt;朋友看到这，你就差一步就能用了，在坚持一下噢！！！&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://dl4.weshineapp.com/gif/20210317/4982f69711dac4c20aa2ad8c5d79af24.gif?f=micro_&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;（四）插件使用&lt;/h2&gt;
&lt;h3&gt;1.将你需要下载的文件保存&lt;/h3&gt;
&lt;h4&gt;(1).勾选上你需要下载的文件&lt;/h4&gt;
&lt;h4&gt;(2).点击上方的Aria2下载&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/wpcjky1.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h4&gt;（3）.在Aria2下载界面，点击推送链接到Aria2下载器，来到Motrix，可以看到下载了&lt;/h4&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/llqkz/aria.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;2.如果上面看不懂可以观看下面的视频解析噢😭😭😭😭&lt;/h3&gt;
&lt;p&gt;&amp;lt;video controls width=&quot;100%&quot; preload=&quot;metadata&quot;&amp;gt;
&amp;lt;source src=&quot;/assets/mp4/wp1.mp4&quot; type=&quot;video/mp4&quot;&amp;gt;
你的浏览器不支持播放视频
&amp;lt;/video&amp;gt;&lt;/p&gt;
&lt;h2&gt;（五）问题和注意事项&lt;/h2&gt;
&lt;h3&gt;1.Aria2 服务设置，看一下服务端口：16800，和Motrix，是否一样&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;下方视频解析&lt;/strong&gt;
&amp;lt;video controls width=&quot;100%&quot; preload=&quot;metadata&quot;&amp;gt;
&amp;lt;source src=&quot;/assets/mp4/wp2.mp4&quot; type=&quot;video/mp4&quot;&amp;gt;
你的浏览器不支持播放视频
&amp;lt;/video&amp;gt;&lt;/p&gt;
&lt;h3&gt;2.如果遇到插件不能用，可直接更换插件，总有一个是能用的&lt;/h3&gt;
&lt;h1&gt;谢谢广大网友的观看噢！本篇博客文章到这就结束了，希望本篇可以帮到您！&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;下次见，拜拜&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dl4.weshineapp.com/gif/20200110/794921bfe58ab9d879f3094a518ad6f5.gif?f=micro_5ouc5ouc&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>blender软件便携式</title><link>https://niezhenhaoblog.cc.cd/posts/my-blender-launcher/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-blender-launcher/</guid><description>blender软件分享</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;blender软件便携式+插件和使用®&lt;/h2&gt;
&lt;h4&gt;注：便携式，不用安装，如果你采用安装包也行，除了前面步骤，后面都一样的&lt;/h4&gt;
&lt;h2&gt;阅读建议：&lt;/h2&gt;
&lt;h3&gt;1.下面所有的蓝色字体为链接都可以直接点击跳转!!!&lt;/h3&gt;
&lt;h3&gt;2.  每张图片点击都可以放大的噢~⛷️&lt;/h3&gt;
&lt;h3&gt;3.下载的所有路径和所有文件夹都采用英文或者字母的方式，一律不准采用汉字！防止报错！&lt;/h3&gt;
&lt;h2&gt;（一）blender软件便携包😉&lt;/h2&gt;
&lt;h3&gt;1.前往 &lt;a href=&quot;https://www.blender.org/download/&quot;&gt;Blender官方下载页&lt;/a&gt;  下载blender便携式包&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/bl1.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;2.下载完成后，看一下便携式包版本号对不对！blender-5.2.1&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/azb.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;3.对便携式包解压！尽量创建文件夹时候这个路径不要带中文，用字母不会报错！！！！！&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/bljy.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h3&gt;4视频解析&lt;/h3&gt;
&lt;h2&gt;&amp;lt;video controls width=&quot;100%&quot; preload=&quot;metadata&quot;&amp;gt;
&amp;lt;source src=&quot;/assets/mp4/bl1.mp4&quot; type=&quot;video/mp4&quot;&amp;gt;
你的浏览器不支持播放视频
&amp;lt;/video&amp;gt;&lt;/h2&gt;
&lt;h2&gt;（二）blender插件😘&lt;/h2&gt;
&lt;h3&gt;一.插件安装分为两种安装方式&lt;/h3&gt;
&lt;h4&gt;1.在线安装方式&lt;/h4&gt;
&lt;h5&gt;1.在线安装方式,点击左上角编辑→最下面偏好设置&lt;/h5&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/blg/blk.png&quot; style=&quot;zoom:75%;&quot; &amp;gt;&lt;/p&gt;
&lt;h5&gt;2.在偏好设置可以看到有获取扩展和插件&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;注：获取扩展可以看到有，已安装：已经安装的。可用项：没有安装的、如果搜索的时候没有这个插件说明是真的没有这个插件&lt;/strong&gt;
&lt;strong&gt;插件：已经安装的，前面的勾✅是已经启用了，没有☑️则是没有启用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/blg/blop.png&quot; style=&quot;zoom:75%;&quot; &amp;gt;
&amp;lt;img src=&quot;/assets/blg/blcj.png&quot; style=&quot;zoom:75%;&quot; &amp;gt;&lt;/p&gt;
&lt;h4&gt;1.本地安装方式&lt;/h4&gt;
&lt;h3&gt;1.点击插件→右上角v→从磁盘安装...&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注意：尽量创建的文件夹名字都用字母，路径也是用字母&lt;/strong&gt;
&amp;lt;img src=&quot;/assets/blg/blcp.png&quot; style=&quot;zoom:75%;&quot; &amp;gt;&lt;/p&gt;
&lt;h3&gt;2点击你保存插件的文件夹，注意：下载的插件压缩包不用解压，直接选择就行&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/blg/blbd.png&quot; style=&quot;zoom:75%;&quot; &amp;gt;&lt;/p&gt;
&lt;h3&gt;二.插件使用&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1.在blender模型界面，注：shift，切换成英文，点击字母N,右侧便会弹出插件的面板！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/blg/blnc.png&quot; style=&quot;zoom:75%;&quot; &amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dl4.weshineapp.com/gif/20170817/61b628c088bfe47b4e84b7e55c92fb4c.gif?f=micro_5aW95aW95a2m5Lmg&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;（三）blender使用设置✌️&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注：下面看不懂可以看图片&lt;/strong&gt;
&amp;lt;img src=&quot;/assets/blg/blsjwb.jpg&quot; style=&quot;zoom:100%;&quot; &amp;gt;
操作快捷键外+设置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：所有的路径都采用字母不用汉字会报错&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;（一）设置&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;设置项&lt;/th&gt;
&lt;th&gt;原文描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;偏好设置→系统&lt;/td&gt;
&lt;td&gt;撤销次数一定要改，过来人痛心。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;渲染设置&lt;/td&gt;
&lt;td&gt;更换渲染引擎，下面的渲染→最大采样弄小一点，渲染能快一点，大型模型和时间帧长的不要选太高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;输出路径&lt;/td&gt;
&lt;td&gt;记得更换输出文件夹&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;（二）快捷键&lt;/h2&gt;
&lt;h3&gt;1.1 物体相关操作&lt;/h3&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;快捷键&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;A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全选物体，[场景集合也可以点噢，按 shift 点第 1 个，鼠标滚轮滑到最后一个点击]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;框选物体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+I&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;反选物体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除物体（可以直接单手操作好嘛，左手键盘，右手鼠标，不至于一直放开右手去按原称→Delete，— 简化 Del）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;相机范围 ——N-&amp;gt;View-&amp;gt;Clip Start（如果旋转视角的时候，模型乱乱的，就设置这个参数，一般为最小，0.001）N→视图→视图锁定→摄像机到视图方位 摄像机视角‑0，没有数字小键盘也可以直接点↓如图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;W&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;选择物体 —— 鼠标左键 / W (切换 W 有不同的选择模式) 对象选择 框选 点选 套索选&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;1.2 移动物体&lt;/h3&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;快捷键&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;G&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;快捷键 ——G，然后跟着鼠标移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G+X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 X 轴移动 ——X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G+Y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 Y 轴移动 ——Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G+Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 Z 轴移动 ——Z&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标左键&lt;/td&gt;
&lt;td&gt;使用当前位置 —— 鼠标左键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标右键&lt;/td&gt;
&lt;td&gt;取消编辑 —— 鼠标右键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G+X&lt;/code&gt;吸附&lt;/td&gt;
&lt;td&gt;G+X 吸附&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G+Y / G+Z / G+X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;固定方向移动 G+Y，G+Z，G+X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;1.3 旋转物体&lt;/h3&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;快捷键&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;R&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;快捷键 ——R，然后跟着鼠标旋转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;R+X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 X 轴旋转 ——X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;R+Y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 Y 轴旋转 ——Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;R+Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 Z 轴旋转 ——Z&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标左键&lt;/td&gt;
&lt;td&gt;使用当前位置 —— 鼠标左键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标右键&lt;/td&gt;
&lt;td&gt;取消编辑 —— 鼠标右键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标中键&lt;/td&gt;
&lt;td&gt;鼠标中键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;R+X+90&lt;/code&gt; / &lt;code&gt;R+Y+90,180,360&lt;/code&gt; / &lt;code&gt;R+Z+90&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;R+X+90 度，根据具体的数字去旋转， R+Y+90，180，360 R+Z+90&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;1.2.3 缩放物体&lt;/h3&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;快捷键&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;S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;快捷键 ——S，然后跟着鼠标缩放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;S+X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 X 轴缩放 ——X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;S+Y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 Y 轴缩放 ——Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;S+Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺着 Z 轴缩放 ——Z&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标左键&lt;/td&gt;
&lt;td&gt;使用当前位置 —— 鼠标左键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鼠标右键&lt;/td&gt;
&lt;td&gt;取消编辑 —— 鼠标右键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编辑模式 + 面 + S&lt;/td&gt;
&lt;td&gt;在编辑模式下→选择面→S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;S+X / S+Y / S+Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;固定缩放 S+X，S+Y，S+Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;1.2.4 坐标轴小技巧&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：移动 / 旋转 / 缩放的时候，按住鼠标中键可以随时切换轴进行操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.2.5 视图&lt;/h3&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;小键盘按键&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;7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7→Z&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1→‑Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3→X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9→‑X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：1. 可以直接点击右上角如图：2. 数字小键盘&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;附加组合快捷键&lt;/h3&gt;
&lt;p&gt;表格&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;快捷键&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;Shift+X/Y/Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可以去掉这个轴，只在另外两个轴构成的平面上移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;重置游标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;shift+s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;新建物体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;复制，→G+，Z.Y.X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;（四）blender参考和学习😎&lt;/h2&gt;
&lt;h2&gt;&amp;lt;div style=&quot;position:relative;width:100%;height:0;padding-bottom:56.25%;&quot;&amp;gt;
&amp;lt;iframe style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;&quot;
src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;amp;bvid=BV14u41147YH&amp;amp;p=1&amp;amp;autoplay=0&amp;amp;danmaku=1&quot;
title=&quot;Bilibili Kurt Blender零基础入门教程&quot;
frameborder=&quot;0&quot;
scrolling=&quot;no&quot;
allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;position:relative;width:100%;height:0;padding-bottom:56.25%;&quot;&amp;gt;
&amp;lt;iframe style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;&quot;
src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;amp;bvid=BV1Uu411g7rP&amp;amp;p=2&amp;amp;autoplay=0&amp;amp;danmaku=1&quot;
title=&quot;Bilibili Blender教程&quot;
frameborder=&quot;0&quot;
scrolling=&quot;no&quot;
allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>图片筛选</title><link>https://niezhenhaoblog.cc.cd/posts/my-blog-tpcfsx/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-blog-tpcfsx/</guid><description>多图片筛选的工具</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;图像相似度去重工具&lt;/h1&gt;
&lt;p&gt;本人之前苦于图片太多又可能重复，所有我用Ai开发了一个图片筛选的工具&lt;/p&gt;
&lt;p&gt;基于 &lt;strong&gt;pHash 感知哈希&lt;/strong&gt; 的本地离线图像去重桌面程序。纯本地运行, 不联网、不上传, 支持打包为 &lt;strong&gt;单文件 Windows EXE&lt;/strong&gt;, 双击即用, 无需安装 Python 或任何依赖。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool&quot;&gt;niezhenhao/ImageDeduplicationTool: 2组图片对比筛选&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;核心特性&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E6%A0%B8%E5%BF%83%E7%89%B9%E6%80%A7&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;感知哈希匹配&lt;/strong&gt;: 基于 DCT 的 pHash (64bit), 多线程并行计算; 大图自动降采样预处理, 批量快速扫描。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三种工作模式&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;双文件夹对比 (A vs B) — 仅在 A、B 之间比较; 可开关「忽略各自内部自重复」。&lt;/li&gt;
&lt;li&gt;单文件夹去重 — 同一目录内查找重复。&lt;/li&gt;
&lt;li&gt;参照图 vs 文件夹 — 用一张图匹配整个目录。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视觉内容判定&lt;/strong&gt;: 不依赖 MD5 / 文件名 / 文件大小。可识别:
&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;strong&gt;不&lt;/strong&gt;判为重复。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化结果&lt;/strong&gt;: 分组缩略图预览, 每项显示来源(左/右)、相似度%、分辨率、文件大小、压缩标记; 点击缩略图弹出原图大图预览; 相似度阈值滑块 (0-100) 实时调节。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人工复核 (程序绝不自动删除)&lt;/strong&gt;: 全部由用户勾选; 两种处理方式:
&lt;ol&gt;
&lt;li&gt;物理删除勾选项 — &lt;strong&gt;二次确认弹窗&lt;/strong&gt;; 可选「仅左文件夹 / 仅右文件夹 / 全部」。&lt;/li&gt;
&lt;li&gt;保留原文件, 将勾选项导出为 ZIP 备份归档。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容错与安全&lt;/strong&gt;: 自动跳过损坏/不可读图像与空目录; 完整支持中文及特殊符号路径; 异常不崩溃; 持久化日志 (扫描数、分组、左右来源、勾选记录、删除事件、ZIP 事件); 随时一键中止扫描。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;目录结构&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tpQC/
├── image_dedup_app.py     # 主程序源码 (GUI + pHash 引擎 + 扫描/分组/删除/导出)
├── image_dedup.spec       # PyInstaller 打包配置 (单文件 EXE)
├── requirements.txt       # 运行/构建依赖
└── README.md              # 本文档
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;开发运行 (源码运行)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E5%BC%80%E5%8F%91%E8%BF%90%E8%A1%8C-%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;1. 环境要求&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#1-%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10/11&lt;/li&gt;
&lt;li&gt;Python 3.8 ~ 3.13 (需自带 Tkinter; 官方 python.org 安装包默认包含, 安装时请勾选 &quot;tcl/tk and IDLE&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 安装依赖&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#2-%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd c:\Users\Administrator\Desktop\tpQC
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;仅运行 GUI 只需 &lt;code&gt;Pillow&lt;/code&gt; 与 &lt;code&gt;numpy&lt;/code&gt;; &lt;code&gt;pyinstaller&lt;/code&gt; 仅打包时需要。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3. 启动程序&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#3-%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python image_dedup_app.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;构建 Windows EXE (一键打包)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E6%9E%84%E5%BB%BA-windows-exe-%E4%B8%80%E9%94%AE%E6%89%93%E5%8C%85&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;方式 A: 使用 spec 配置文件 (推荐)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E6%96%B9%E5%BC%8F-a-%E4%BD%BF%E7%94%A8-spec-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-%E6%8E%A8%E8%8D%90&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd c:\Users\Administrator\Desktop\tpQC
python -m pip install -r requirements.txt      # 含 pyinstaller
pyinstaller image_dedup.spec --clean --noconfirm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;产物: &lt;code&gt;dist\图像去重工具.exe&lt;/code&gt; (单文件, 约 40-60 MB, 已包含 Python 运行时与全部依赖)。&lt;/p&gt;
&lt;h3&gt;方式 B: 直接用命令行打包 (等效)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E6%96%B9%E5%BC%8F-b-%E7%9B%B4%E6%8E%A5%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%89%93%E5%8C%85-%E7%AD%89%E6%95%88&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pyinstaller --onefile --windowed --name &quot;图像去重工具&quot; ^
  --hidden-import PIL --hidden-import PIL._tkinter_finder --hidden-import numpy ^
  --exclude-module matplotlib --exclude-module scipy --exclude-module pandas ^
  image_dedup_app.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自定义图标 (可选)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9B%BE%E6%A0%87-%E5%8F%AF%E9%80%89&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;app.ico&lt;/code&gt; 放入项目根目录, 打开 &lt;code&gt;image_dedup.spec&lt;/code&gt;, 取消最后一行 &lt;code&gt;icon=&apos;app.ico&apos;&lt;/code&gt; 的注释, 重新执行 &lt;code&gt;pyinstaller image_dedup.spec --clean --noconfirm&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;分发&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E5%88%86%E5%8F%91&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;dist\图像去重工具.exe&lt;/code&gt; 拷贝给最终用户即可。双击运行, 零配置、零安装。 日志文件 &lt;code&gt;dedup_app.log&lt;/code&gt; 自动生成在 EXE 所在目录。&lt;/p&gt;
&lt;h2&gt;使用说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;顶部选择工作模式 (双文件夹 / 单文件夹 / 参照图)。&lt;/li&gt;
&lt;li&gt;点「浏览…」选择对应文件夹或参照图; 拖动「相似度阈值」滑块 (值越大越严格, 建议 80~95)。&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;li&gt;&lt;strong&gt;物理删除&lt;/strong&gt;: 选「仅左/仅右/全部」, 二次确认后执行 (不可恢复)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导出 ZIP&lt;/strong&gt;: 保留原文件, 将勾选项打包备份 (按来源分目录存放)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;所有操作均写入 &lt;code&gt;dedup_app.log&lt;/code&gt;; 点底部「打开日志所在目录」可查看。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;技术说明&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E6%8A%80%E6%9C%AF%E8%AF%B4%E6%98%8E&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pHash&lt;/strong&gt;: 图像转灰度 → 降采样至 32×32 → 二维 DCT-II → 取左上 8×8 低频系数 → 以中位数为阈值生成 64bit 指纹。两图汉明距离 &lt;code&gt;d&lt;/code&gt; 越小越相似; 相似度 = &lt;code&gt;(1 - d/64) × 100%&lt;/code&gt;。阈值滑块按 &lt;code&gt;d ≤ ⌊(1-阈值/100)×64⌋&lt;/code&gt; 判定为重复。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分组&lt;/strong&gt;: 并查集 (Union-Find) 对所有满足阈值的图像对连通合并; 组代表取文件最大者 (更可能是原图), 其余成员相似度相对代表计算。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能&lt;/strong&gt;: ThreadPoolExecutor 多线程计算哈希 (线程数 = CPU 核数, 上限 8); JPEG 利用 &lt;code&gt;draft&lt;/code&gt; 快速解码小尺寸; 大图降采样显著降低单图耗时。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/niezhenhao/ImageDeduplicationTool#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EXE 启动慢 (3~6 秒)&lt;/strong&gt;: 单文件 EXE 需先解压到临时目录, 属正常现象。如需更快启动, 可改用 &lt;code&gt;--onedir&lt;/code&gt; 打包 (生成文件夹, 内含 exe)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;杀毒软件误报&lt;/strong&gt;: 单文件 EXE 常被误报, 可加白名单或改用 onedir 打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tkinter 缺失&lt;/strong&gt;: 报 &lt;code&gt;No module named tkinter&lt;/code&gt; 时, 请用 python.org 完整安装包重装 Python 并勾选 tcl/tk 组件。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>加速器和浏览器插件</title><link>https://niezhenhaoblog.cc.cd/posts/my-software-sharing/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-software-sharing/</guid><description>加速器和插件</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;软件加速器和浏览器插件分享&lt;/h1&gt;
&lt;h4&gt;前言：本篇文章为加速器或者浏览器插件分享&lt;/h4&gt;
&lt;h4&gt;&lt;strong&gt;本篇文章只用于学习噢！,出了事情，博主本人不负一切责任！&lt;/strong&gt;&lt;/h4&gt;
&lt;h3&gt;想看哪个右边可以直接跳转噢！！&lt;/h3&gt;
&lt;h4&gt;对了蓝色字体是链接可以直接跳转噢！&lt;/h4&gt;
&lt;h4&gt;还有大家安装的时候尽量路径选择字母以防报错！&lt;/h4&gt;
&lt;h2&gt;（一）软件加速器&lt;/h2&gt;
&lt;h4&gt;先说第一个加速器我这边只推荐两个加速器，剩下的大部分都收费了&lt;/h4&gt;
&lt;h2&gt;1.Steam++，又名Watt Toolkit&lt;/h2&gt;
&lt;p&gt;开源跨平台的多功能 Steam 工具箱。支持的 Windows 、macOS  和 Android,&lt;strong&gt;目前ios还在开发中！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://steampp.net/&quot;&gt;WattToolkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/wat.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h2&gt;2.Steamcommunity_302&lt;/h2&gt;
&lt;p&gt;羽翼城大佬的加速器工具，目前个人加速器挺好用的，目前最新版本：Ver.15.0.4&lt;/p&gt;
&lt;p&gt;大家下载的时候，&lt;strong&gt;注意版本不要弄错了！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dogfight360.com/blog/18682/&quot;&gt;Steamcommunity 302&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/302.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;(二)浏览器插件加速🍔&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这一部分针对浏览器而设立的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;浏览器扩展插件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Astar VPN - 适合所有人的免费且快速的 VPN&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://microsoftedge.microsoft.com/addons/detail/astar-vpn-%E9%80%82%E5%90%88%E6%89%80%E6%9C%89%E4%BA%BA%E7%9A%84%E5%85%8D%E8%B4%B9%E4%B8%94%E5%BF%AB%E9%80%9F%E7%9A%84-/phnnpafoelnadmgjkinijkbaogoekoff?hl=zh-CN&quot;&gt;AstarVPN Edge插件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/kz.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/assets/kz2.png&quot; style=&quot;zoom:75%;&quot; /&amp;gt;&lt;/p&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;p&gt;1.开启加速器不要开网页版vpn插件，会去抢网络分配&lt;/p&gt;
&lt;p&gt;2.如果遇到网页打不开，电脑设置→网络和lnternet→代理→手动代理设置→关了&lt;img src=&quot;/assets/dl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;好了朋友感谢您的观看噢，咱们下次见，拜拜！&amp;lt;img src=&quot;https://dl4.weshineapp.com/gif/20200110/794921bfe58ab9d879f3094a518ad6f5.gif?f=micro_5ouc5ouc&quot; alt=&quot;img&quot; style=&quot;zoom:80%;&quot; /&amp;gt;&lt;/h5&gt;
</content:encoded></item><item><title>博客大改造：一言、音乐播放器、评论加速，全都安排上了</title><link>https://niezhenhaoblog.cc.cd/posts/blog-makeover/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/blog-makeover/</guid><description>记录博客从搭好到现在的全部美化过程：Banner居中一言、侧边栏音乐播放器、评论预热加速、QQ邮箱按钮、重要提醒与TOC位置调整。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;博客搭好没几天，这两天一直在折腾各种小功能和美化。感觉进度不错，就一起写出来留个记录。&lt;/p&gt;
&lt;h2&gt;🎨 首页美化&lt;/h2&gt;
&lt;h3&gt;Banner 图片 + 居中一言&lt;/h3&gt;
&lt;p&gt;原来的 Banner 只有一张图，看起来比较单调。我在图片正中间加了一个 &lt;strong&gt;Hitokoto 一言&lt;/strong&gt; 组件，毛玻璃样式，每 5 分钟自动刷新一次。&lt;/p&gt;
&lt;p&gt;实现方式：用绝对定位 &lt;code&gt;top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2&lt;/code&gt; 让它完美居中，Banner 上再叠一层半透明渐变遮罩，既不抢 Banner 图片的风头，又能看清文字。&lt;/p&gt;
&lt;h3&gt;重要提醒 vs TOC 目录&lt;/h3&gt;
&lt;p&gt;右边栏原来固定显示&quot;重要提醒&quot;，但文章页的 TOC 目录也在那个位置，两个卡片重叠了。&lt;/p&gt;
&lt;p&gt;解决方案很简单：&lt;strong&gt;互斥显示&lt;/strong&gt;。用 &lt;code&gt;Astro.url.pathname&lt;/code&gt; 判断当前页面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首页（&lt;code&gt;/&lt;/code&gt;）→ 显示重要提醒&lt;/li&gt;
&lt;li&gt;文章页（&lt;code&gt;/posts/...&lt;/code&gt;）→ 显示 TOC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样就再也不会打架了。&lt;/p&gt;
&lt;h3&gt;头像下方的联系方式&lt;/h3&gt;
&lt;p&gt;原来只有一个 GitHub 图标按钮，现在加了 QQ 邮箱，用 &lt;code&gt;mailto:&lt;/code&gt; 链接，访客点一下就能调起邮件客户端。&lt;/p&gt;
&lt;h2&gt;🎵 侧边栏音乐播放器&lt;/h2&gt;
&lt;p&gt;这是今天最耗时的功能了。做了两轮迭代：&lt;/p&gt;
&lt;h3&gt;第一轮：放在头像下面&lt;/h3&gt;
&lt;p&gt;用的是 &lt;strong&gt;APlayer + MetingJS&lt;/strong&gt; 组合——基于公开的 meting-api 解析网易云音乐歌单。纯前端零后端，访客手动控制播放。&lt;/p&gt;
&lt;p&gt;但放在头像下面后，跟 Categories 和 Tags 贴得太紧，整体不协调。&lt;/p&gt;
&lt;h3&gt;第二轮：移到标签下面（当前）&lt;/h3&gt;
&lt;p&gt;把播放器移到 sticky 区域，跟着 Categories、Tags 一起滚动，始终可见。同时把迷你模式（mini）去掉了，换成了完整模式，保留所有控制按钮：上一首、播放/暂停、下一首、进度条、音量、展开歌单、循环模式。&lt;/p&gt;
&lt;p&gt;歌单用的是我自己的网易云歌单（ID &lt;code&gt;8481596988&lt;/code&gt;），访客点一下 ▶ 就能听。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术选型&lt;/strong&gt;：为什么选 Aplayer + MetingJS？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公开 meting-api（&lt;code&gt;api.injahow.cn/meting&lt;/code&gt;）已经处理好了跨域问题&lt;/li&gt;
&lt;li&gt;一行 &lt;code&gt;&amp;lt;meting-js&amp;gt;&lt;/code&gt; 自定义标签搞定歌单加载&lt;/li&gt;
&lt;li&gt;不自动播放，符合浏览器自动播放策略&lt;/li&gt;
&lt;li&gt;体积小（APlayer 100KB 左右），CDN 加载不影响首屏&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;💬 评论区刷新慢的问题&lt;/h2&gt;
&lt;p&gt;Waline 评论跑在 Vercel 上，Serverless 冷启动第一次请求要 6 秒左右。&lt;/p&gt;
&lt;h3&gt;客户端预热方案&lt;/h3&gt;
&lt;p&gt;在 Layout 里加了个 &lt;code&gt;requestIdleCallback&lt;/code&gt;，页面加载空闲时静默请求一次 Waline API，把 Vercel 实例&quot;唤醒&quot;。真正用户切到文章页看评论时，API 已经热了，TTFB 从 6 秒降到 0.6 秒左右。&lt;/p&gt;
&lt;h3&gt;两次刷新才出来的问题&lt;/h3&gt;
&lt;p&gt;原来用了延迟加载（IntersectionObserver 滚到评论区才初始化），后来发现是 Swup 切页后没有重新 init 导致的。改成&lt;strong&gt;立即初始化&lt;/strong&gt; + Swup &lt;code&gt;page:view&lt;/code&gt; hook 重新 init，评论直接出现在文章底部。&lt;/p&gt;
&lt;h2&gt;📝 总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;改动&lt;/th&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Banner 居中一言&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;重要提醒/TOC 互斥&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QQ 邮箱按钮&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;侧边栏音乐播放器&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Waline 预热加速&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;首页文章卡片封面图&lt;/td&gt;
&lt;td&gt;✅（本次）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;博客还在持续折腾中，Cloudflare CDN 加速 Waline 也在计划里，有时间再搞。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;附：封面图功能&lt;/h2&gt;
&lt;p&gt;顺手给首页文章卡片加了右侧缩略图。原来 Fuwari 主题就已经支持 &lt;code&gt;image&lt;/code&gt; frontmatter 字段和右侧 28% 宽度的封面布局，只是之前没给文章配图。现在模板里默认带 &lt;code&gt;image: /assets/cover-xxx.jpg&lt;/code&gt;，以后每发新文都有封面了。&lt;/p&gt;
</content:encoded></item><item><title>博客折腾第二弹：周刊、时间线、封面自动生成、音乐不停、移动端全适配</title><link>https://niezhenhaoblog.cc.cd/posts/blog-makeover-2/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/blog-makeover-2/</guid><description>继续折腾博客：周刊RSS自动聚合、PostCard自动SVG封面、音乐播放器极简重写+切页不停、发布时间线按天展开、专题页卡片重设计、Banner webp压缩省88%、汉堡菜单完整优化。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;这是 &lt;a href=&quot;/posts/blog-makeover/&quot;&gt;博客大改造：一言、音乐播放器、评论加速，全都安排上了&lt;/a&gt; 的续篇。上一篇写完后，又改了一堆东西，一起记下来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;📰 周刊：手动收藏 + RSS 自动聚合&lt;/h2&gt;
&lt;p&gt;导航栏加了「周刊」，页面结构分两块：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;📌 我的收藏&lt;/strong&gt;：纯手动，&lt;code&gt;src/content/weekly/&lt;/code&gt; 下放 markdown 就行，frontmatter 只需要 &lt;code&gt;title + url + published&lt;/code&gt;，不用写正文（这是外链收藏，不是原创）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🔄 每日精选&lt;/strong&gt;：自动聚合 4 个 RSS 源——阮一峰、奇舞周刊、V2EX、少数派&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关键技术决策&lt;/strong&gt;：客户端 JS 做聚合，用 &lt;code&gt;rss2json.com&lt;/code&gt; 免费 API 把 RSS 转 JSON（支持 CORS），四个源并发 fetch → 合并去重 → 按时间倒序 → localStorage 缓存 1 小时。每次访问都是最新内容，零后端零服务器。&lt;/p&gt;
&lt;h2&gt;🎵 音乐播放器：三轮迭代，最终极简&lt;/h2&gt;
&lt;h3&gt;第一轮：APlayer + MetingJS CDN&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;&amp;lt;meting-js&amp;gt;&lt;/code&gt; 自定义标签，方便但有问题：MetingJS 在页面加载时扫描替换，Swup 切页后自定义元素可能重复初始化或状态丢失，导致封面一直转圈、播放按钮显示成 loading circle。&lt;/p&gt;
&lt;h3&gt;第二轮：手动 fetch + new APlayer&lt;/h3&gt;
&lt;p&gt;改成手动 fetch 拉歌单 → &lt;code&gt;new APlayer()&lt;/code&gt; 手动创建实例。能播了，但加了 &lt;code&gt;swup.hooks.on(&apos;content:replace&apos;, init)&lt;/code&gt; 每次切页重建，结果&lt;strong&gt;自己在主动杀自己的音频&lt;/strong&gt;——切页就断。&lt;/p&gt;
&lt;h3&gt;第三轮（当前）：极简原生 audio + 自写 UI&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;砍掉 Aplayer CDN、砍掉 MetingJS CDN&lt;/strong&gt;，只保留一个 fetch 请求拉歌单。&lt;/p&gt;
&lt;p&gt;核心发现：&lt;strong&gt;SideBar 根本不在 Swup 替换范围内&lt;/strong&gt;！Swup 只动 &lt;code&gt;#swup-container&lt;/code&gt;（main 内容区），SideBar 和它平级，切页时 SideBar 的 DOM 不变，所以&lt;strong&gt;根本不需要重新 init&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;改完后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音乐切页完全不停（Swup 不动 SideBar）&lt;/li&gt;
&lt;li&gt;localStorage 持久化当前歌曲 + 播放进度&lt;/li&gt;
&lt;li&gt;刷新页面自动恢复（不自动播放，遵守浏览器策略）&lt;/li&gt;
&lt;li&gt;零外部 CDN 依赖，只有一个 fetch 拉歌单&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码量从 200+ 行减到 120 行，还更稳。&lt;/p&gt;
&lt;h2&gt;🖼️ 文章封面自动生成&lt;/h2&gt;
&lt;p&gt;原来的 PostCard 要求每篇文章 frontmatter 里必须有 &lt;code&gt;image&lt;/code&gt; 字段。忘记配的文章，右侧封面会显示 &quot;The image is generating...&quot;。&lt;/p&gt;
&lt;p&gt;原因：封面图路径都是 &lt;code&gt;/assets/xxx.jpg&lt;/code&gt;（public 目录）或 data URI，&lt;strong&gt;ImageWrapper 的 Astro 压缩优化根本用不上&lt;/strong&gt;，反而因为路径拼接逻辑干扰了正确显示。&lt;/p&gt;
&lt;h3&gt;解决方案&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PostCard 改用原生 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;/strong&gt;：跳过 ImageWrapper 复杂的 &lt;code&gt;path.join(&quot;../../&quot;, basePath, src)&lt;/code&gt; 逻辑，直接 &lt;code&gt;&amp;lt;img src={coverSrc} loading=&quot;lazy&quot; /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;generateAutoCover() 函数&lt;/strong&gt;：文章没有 &lt;code&gt;image&lt;/code&gt; 字段时，用字符串模板拼一个 SVG data URI：紫蓝渐变背景 + 三个半透明白色光斑 + 白色粗体标题（自动截断到 18 字）+ 文字阴影&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;function generateAutoCover(title: string): string {
  const svg = `&amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;800&quot; height=&quot;450&quot;&amp;gt;
    &amp;lt;linearGradient id=&quot;g&quot; ... /&amp;gt;
    &amp;lt;rect width=&quot;800&quot; height=&quot;450&quot; fill=&quot;url(#g)&quot;/&amp;gt;
    &amp;lt;circle cx=&quot;680&quot; cy=&quot;80&quot; r=&quot;120&quot; fill=&quot;#ffffff&quot; opacity=&quot;0.08&quot;/&amp;gt;
    &amp;lt;text ...&amp;gt;${safeTitle}&amp;lt;/text&amp;gt;
  &amp;lt;/svg&amp;gt;`;
  return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;零外部请求、零服务器依赖、不会挂、和博客紫色主题色统一。&lt;/p&gt;
&lt;h2&gt;📅 发布时间线：按月热力图 → 按天展开&lt;/h2&gt;
&lt;p&gt;原来的日历是 GitHub 风格月度热力图，点击月份跳转到 &lt;code&gt;/archive/&lt;/code&gt;。用户反馈&quot;点击不能跳转，要把每一天分开&quot;。&lt;/p&gt;
&lt;p&gt;改成&lt;strong&gt;按天展开的时间线&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顶部保留月份热度胶囊条（只做展示，不跳转）&lt;/li&gt;
&lt;li&gt;每天一个独立条目：日期圆点（紫蓝渐变 + 当天号数）+ 日期标签 + 文章数 chip + 当天文章列表&lt;/li&gt;
&lt;li&gt;同日连发显示 🎉 标签&lt;/li&gt;
&lt;li&gt;竖线串联，最后一天自动隐藏底部竖线&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;刷新首页就能一眼看到哪天发了什么。&lt;/p&gt;
&lt;h2&gt;🎨 专题页重设计&lt;/h2&gt;
&lt;p&gt;原来的专题页是纯文字列表，border + title，所有分类一个样式。&lt;/p&gt;
&lt;p&gt;改成&lt;strong&gt;渐变封面卡片式布局&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个分类独立配色（紫/粉/橙/绿/蓝青/洋紫轮换）&lt;/li&gt;
&lt;li&gt;卡片头部：渐变背景 + 装饰圆 + 分类名 + 文章数 chip&lt;/li&gt;
&lt;li&gt;卡片主体：最多 6 篇文章，超过显示「查看全部 N 篇」&lt;/li&gt;
&lt;li&gt;移动端单列 / &lt;code&gt;md:&lt;/code&gt; 两列网格&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📱 全站移动端适配&lt;/h2&gt;
&lt;p&gt;原来移动端很多组件用了固定 &lt;code&gt;px-9&lt;/code&gt;、&lt;code&gt;text-3xl&lt;/code&gt; 不响应，改了三个文件：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;改动&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WeeklyFeed.astro&lt;/td&gt;
&lt;td&gt;&lt;code&gt;px-9&lt;/code&gt; → &lt;code&gt;px-4 md:px-9&lt;/code&gt;，JS 生成列表项 &lt;code&gt;flex-col md:flex-row&lt;/code&gt;，日期 &lt;code&gt;hidden md:inline&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;weekly.astro&lt;/td&gt;
&lt;td&gt;同上 padding + 字号响应式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostCard.astro&lt;/td&gt;
&lt;td&gt;标题 &lt;code&gt;text-3xl&lt;/code&gt; → &lt;code&gt;text-xl md:text-3xl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;移动端 SideBar 从左侧列堆到 main 下面，播放器跟着在底部，不影响主内容区。&lt;/p&gt;
&lt;h2&gt;🎬 Banner 首屏加载优化&lt;/h2&gt;
&lt;p&gt;原来的 Banner 是 2.10 MB 的 jpg，用 sharp 转成 quality:82 的 webp：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;banner.jpg  →  2.10 MB  ❌ 已删除
banner.webp →  0.25 MB  ✅ 压缩率 88%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首屏加载直接省 1.85MB，FCP（首次内容绘制）大幅提前。&lt;/p&gt;
&lt;h2&gt;📊 运行时长：改建站日&lt;/h2&gt;
&lt;p&gt;原来从第一篇文章日期算运行时长，只显示&quot;2天&quot;。改成从 &lt;code&gt;siteConfig.since&lt;/code&gt;（&lt;code&gt;2026-09-01&lt;/code&gt;）算建站累计日。&lt;/p&gt;
&lt;p&gt;改了 3 处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;src/config.ts&lt;/code&gt; 加 &lt;code&gt;since: &quot;2026-09-01&quot;&lt;/code&gt; 字段&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/types/config.ts&lt;/code&gt; SiteConfig 类型加 &lt;code&gt;since: string&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/components/HomeDashboard.astro&lt;/code&gt; 用 &lt;code&gt;new Date(siteConfig.since)&lt;/code&gt; 替代 &lt;code&gt;firstPost.data.published&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以后想改建站日，只改 &lt;code&gt;config.ts&lt;/code&gt; 里的一个字段就行。&lt;/p&gt;
&lt;h2&gt;🍔 汉堡菜单完整优化&lt;/h2&gt;
&lt;p&gt;原来的 NavMenuPanel 桌面端能用，移动端体验差——点了可能不出来，没有关闭按钮，点击遮罩不关闭。&lt;/p&gt;
&lt;p&gt;重写后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;响应式宽度&lt;/strong&gt;：手机几乎全屏 &lt;code&gt;w-[calc(100vw-1rem)]&lt;/code&gt;，桌面端小浮窗 &lt;code&gt;md:min-w-[12rem]&lt;/code&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;ESC 关闭&lt;/strong&gt;：键盘快捷键支持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更大的点击区&lt;/strong&gt;：&lt;code&gt;py-2.5 pl-4 pr-3&lt;/code&gt;，手指好戳&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📝 总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;改动&lt;/th&gt;
&lt;th&gt;状态&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;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🆕 全新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;音乐播放器（最终版）&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔄 从 Aplayer 改极简原生 audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自动 SVG 封面&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🆕 无 image 时自动生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;封面图显示修复&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🐛 ImageWrapper 路径拼接问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;发布时间线（按天）&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔄 从月度热力图改按天展开&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;专题页卡片重设计&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔄 纯文字改渐变封面卡片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移动端全适配&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🆕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banner webp 压缩&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🆕 2.1MB → 0.25MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运行时长改建站日&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🐛 2天 → 固定建站累计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;汉堡菜单优化&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔄 加关闭按钮/遮罩/ESC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;博客从搭好到现在两个星期，改了快 20 个 commit。下一批计划：Cloudflare CDN 加速 Waline（当前 Vercel 冷启动问题）、友链页面完善。继续折腾 🚀&lt;/p&gt;
</content:encoded></item><item><title>博客折腾第三弹：樱花飘落、音乐切页真不停、手机单栏布局</title><link>https://niezhenhaoblog.cc.cd/posts/blog-makeover-3/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/blog-makeover-3/</guid><description>樱花飘落 Canvas 动效、音乐播放器 global-audio 移到 body 层级解决 Swup 切页重渲染问题、MainGridLayout 手机单栏堆叠、Astro TypeError 排坑。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;这是 &lt;a href=&quot;/posts/blog-makeover/&quot;&gt;博客大改造&lt;/a&gt; 和 &lt;a href=&quot;/posts/blog-makeover-2/&quot;&gt;第二弹&lt;/a&gt; 的续篇。第二弹写完后，樱花飘落、移动端适配、音乐切页三个坑还没完全填完，继续折腾。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;🌸 樱花飘落：从组件内到 body 层级的三次迭代&lt;/h2&gt;
&lt;p&gt;最初想在 &lt;code&gt;MusicPlayer.astro&lt;/code&gt; 旁边加个 &lt;code&gt;SakuraPetals.astro&lt;/code&gt; 组件，canvas 放在组件里。但 Astro 组件在 &lt;code&gt;swup-container&lt;/code&gt; 内部，切页时 Swup 替换 DOM，inline script 不会重新执行，樱花就没了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案 A：组件内 + Swup hook 重跑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把樱花代码写成 IIFE，加 &lt;code&gt;swup.hooks.on(&apos;content:replace&apos;, init)&lt;/code&gt; 每次切页重建 canvas。能跑，但 Astro 编译器在处理 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 块时会把 &lt;code&gt;document.getElementById&lt;/code&gt; 这种全局调用包一层，导致 &lt;code&gt;TypeError: document.getElementById(...) is not a function&lt;/code&gt;——Astro bundler 的副作用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案 B（当前）：body 层级 + is:inline&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把樱花的 &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; 放在 &lt;code&gt;Layout.astro&lt;/code&gt; 的 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 开头（Swup 永远碰不到 body 根节点之外的 DOM），脚本用 &lt;code&gt;&amp;lt;script is:inline&amp;gt;&lt;/code&gt; 完全绕过 Astro bundler：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- Layout.astro body 开头 --&amp;gt;
&amp;lt;canvas id=&quot;sakura-canvas&quot; class=&quot;pointer-events-none fixed inset-0 z-40 w-full h-full block&quot;&amp;gt;&amp;lt;/canvas&amp;gt;

&amp;lt;!-- body 末尾独立脚本 --&amp;gt;
&amp;lt;script is:inline&amp;gt;
(function() {
    var canvas = document.getElementById(&apos;sakura-canvas&apos;);
    if (!canvas) return;
    // Swup 切页只控制显隐，不重建 canvas
    // window.swup.hooks.on(&apos;content:replace&apos;, ...)
})();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键决策&lt;/strong&gt;：所有页面都渲染 canvas（让 Swup 不删除它），只用 JS &lt;code&gt;display&lt;/code&gt; 控制首页显隐。之前用 &lt;code&gt;{isHomePage &amp;amp;&amp;amp; &amp;lt;canvas&amp;gt;}&lt;/code&gt; 条件渲染，导致周刊页面 HTML 里没有 canvas，切过去后樱花脚本找不到元素就 return 了。&lt;/p&gt;
&lt;p&gt;花瓣 Canvas 实现：贝塞尔曲线画花瓣形状 + 径向渐变（中心浅粉→边缘半透明）+ 正弦波水平漂移模拟自然飘动。桌面端 80 朵，手机端 35 朵且更小。&lt;/p&gt;
&lt;h2&gt;🎵 音乐切页真不停了：global-audio 方案&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;之前为什么停&lt;/strong&gt;：SideBar 里的 &lt;code&gt;&amp;lt;audio id=&quot;audio&quot;&amp;gt;&lt;/code&gt; 在 &lt;code&gt;MainGridLayout.astro&lt;/code&gt; 布局内，Swup 配置了 &lt;code&gt;containers: [&quot;main&quot;, &quot;#toc&quot;]&lt;/code&gt;，但实际运行时 SideBar 也被整体替换了——因为不同页面 &lt;code&gt;headings&lt;/code&gt; 不同（文章页有目录、首页没有），Astro 输出的 HTML 里 SideBar 内容有差异，Swup 发现后就整体替换。每次替换 = &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; 被销毁重建 = 从 src 重新加载 = 暂停。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：把 &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; 元素移到 &lt;code&gt;Layout.astro&lt;/code&gt; 的 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 层级：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- Layout.astro body 开头，Swup 永远不碰 --&amp;gt;
&amp;lt;audio id=&quot;global-audio&quot; preload=&quot;metadata&quot;&amp;gt;&amp;lt;/audio&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MusicPlayer 组件里只留 UI（按钮、歌名、歌单列表），不再渲染 &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;。JS 逻辑改成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var audio = document.getElementById(&apos;global-audio&apos;);
var S = window.__mpState = window.__mpState || { songs: [], current: -1, loaded: false };

if (!window.__mpInited) {
    // 第一次加载：fetch 歌单 + 绑定 audio 事件 + 恢复状态
    window.__mpInited = true;
    audio.addEventListener(&apos;play&apos;, updatePlayIcon);
    // ... fetch
} else {
    // Swup 切页后重建 SideBar：不碰 audio/songs，只恢复 UI 显示
    renderList();
    updatePlayIcon();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;核心：&lt;code&gt;global-audio&lt;/code&gt; 永远不被 Swup 替换（它在 body 根层级，Layout 静态部分），播放状态自然保持。UI 重建时只恢复显示不碰 audio 对象本身。&lt;/p&gt;
&lt;h2&gt;📱 手机单栏布局：grid 默认值修正&lt;/h2&gt;
&lt;p&gt;之前 &lt;code&gt;MainGridLayout.astro&lt;/code&gt; 的 grid 是 &lt;code&gt;grid-cols-[17.5rem_auto]&lt;/code&gt;——从 0px 开始就是两栏！手机上 SideBar 被压成 280px 宽，主内容区也被挤得很小，完全不可用。&lt;/p&gt;
&lt;p&gt;改成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;main-grid&quot; class=&quot;grid grid-cols-1 grid-rows-[auto_auto_auto]
                               lg:grid-cols-[17.5rem_auto] lg:grid-rows-[auto]&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;手机（&amp;lt;1024px）：&lt;code&gt;grid-cols-1&lt;/code&gt; 单栏竖排，SideBar → Main → Footer 自然堆叠&lt;/li&gt;
&lt;li&gt;桌面（lg+）：&lt;code&gt;grid-cols-[17.5rem_auto]&lt;/code&gt; 左 SideBar 右主内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配合樱花 canvas 去掉 &lt;code&gt;hidden lg:block&lt;/code&gt; 限制（改成 &lt;code&gt;block&lt;/code&gt;），手机上花瓣更小更少（35 朵，5-12px），性能友好。&lt;/p&gt;
&lt;h2&gt;🐛 Astro TypeError 排坑&lt;/h2&gt;
&lt;p&gt;樱花代码写完后线上报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TypeError: document.getElementById(...) is not a function
Layout.astro_astro_type_script_index_1_lang.CLMsTfqK.js:9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Astro 把所有非 &lt;code&gt;is:inline&lt;/code&gt; 的 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 都当作模块处理，用 Vite bundle。bundle 过程中 &lt;code&gt;document.getElementById&lt;/code&gt; 这种全局函数调用可能被异常处理（比如 IIFE 包装导致作用域丢失）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：樱花脚本独立成 &lt;code&gt;&amp;lt;script is:inline&amp;gt;&lt;/code&gt; 块，放在 body 末尾。&lt;code&gt;is:inline&lt;/code&gt; 告诉 Astro：&lt;strong&gt;完全原样输出，不 bundle、不处理&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;🧠 踩坑总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;坑&lt;/th&gt;
&lt;th&gt;现象&lt;/th&gt;
&lt;th&gt;根因&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;/td&gt;
&lt;td&gt;非首页没有 canvas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{isHomePage &amp;amp;&amp;amp; &amp;lt;canvas&amp;gt;}&lt;/code&gt; 条件渲染&lt;/td&gt;
&lt;td&gt;所有页面都渲染，JS 控制显隐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeError&lt;/td&gt;
&lt;td&gt;&lt;code&gt;document.getElementById is not a function&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Astro bundler 处理模块脚本时副作用&lt;/td&gt;
&lt;td&gt;&lt;code&gt;is:inline&lt;/code&gt; 独立脚本块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;音乐切页暂停&lt;/td&gt;
&lt;td&gt;播放中断&lt;/td&gt;
&lt;td&gt;SideBar 被 Swup 整体替换，audio 销毁重建&lt;/td&gt;
&lt;td&gt;audio 移到 body 层级 global-audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手机布局挤&lt;/td&gt;
&lt;td&gt;两栏挤成小窄条&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grid-cols-[17.5rem_auto]&lt;/code&gt; 无断点&lt;/td&gt;
&lt;td&gt;默认单栏，&lt;code&gt;lg:&lt;/code&gt; 才两栏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EdgeOne CDN 旧 HTML&lt;/td&gt;
&lt;td&gt;新代码不上线&lt;/td&gt;
&lt;td&gt;HTML 无 hash 文件名，CDN 长缓存&lt;/td&gt;
&lt;td&gt;empty commit 触发重建 + 等 CDN TTL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>NieBlog 项目维护指南</title><link>https://niezhenhaoblog.cc.cd/posts/project-guide-fb/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/project-guide-fb/</guid><description>本文档面向博客的日常维护者，说明项目结构、文件规范，以及「发布文章」「上传图片」「部署更新」的完整操作流程。</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;NieBlog 项目维护指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本文档面向博客的日常维护者，说明项目结构、文件规范，以及「发布文章」「上传图片」「部署更新」的完整操作流程。
技术栈：Astro（静态站点）+ Fuwari 模板 + Tailwind CSS + EdgeOne Pages 部署 + Waline 评论。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、目录结构总览&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;NieBlog/
├── public/                     # 静态资源（原样复制到网站，无需编译）
│   ├── assets/                 # ★ 站点图片（文章封面、壁纸、Banner 等）
│   ├── gallery/                # ★ 图库照片（没有可自建此目录）
│   ├── favicon/                # 网站图标
│   └── .well-known/            # 域名验证文件（勿动）
│
├── src/                        # 网页源代码
│   ├── content/
│   │   ├── posts/              # ★ 文章目录（Markdown 文件，一篇一个 .md）
│   │   ├── spec/               # 「关于」等特殊页面（about.md）
│   │   └── weekly/             # 周刊数据（自动聚合，一般不动）
│   ├── pages/                  # 路由页面（文件名即网址）
│   │   ├── [...page].astro     # 首页（含统计仪表盘+时间线）
│   │   ├── archive.astro       # 归档页
│   │   ├── about.astro         # 关于页
│   │   ├── friends.astro       # 友链页
│   │   ├── gallery.astro       # 图库页
│   │   ├── guestbook.astro     # 留言板
│   │   ├── hubs.astro          # 专题页
│   │   ├── weekly.astro        # 周刊页
│   │   └── posts/[...slug].astro  # 文章详情页模板（自动带评论区）
│   ├── components/             # 页面组件
│   │   ├── widget/             # 侧边栏组件（音乐播放器、重要提醒、公告等）
│   │   ├── control/            # 控件（分页、返回顶部等）
│   │   ├── misc/               # 通用小组件（图片包装等）
│   │   └── *.astro             # Navbar 导航栏、Footer 页脚、PostCard 文章卡片等
│   ├── layouts/                # 页面骨架（Layout.astro 全局 / MainGridLayout 主布局）
│   ├── config.ts               # ★ 站点配置（标题、建站日期、导航栏、横幅等）
│   ├── styles/                 # 全局样式
│   ├── constants/              # 常量（颜色、尺寸）
│   ├── utils/                  # 工具函数（文章排序、URL 处理）
│   ├── i18n/                   # 多语言文案
│   └── types/                  # 类型定义
│
├── dist/                       # 构建产物（自动生成，勿手动改）
├── astro.config.mjs            # Astro 构建配置
├── package.json                # 依赖与脚本命令
└── PROJECT_GUIDE.md            # 本文档
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;带 ★ 的是日常维护最常打交道的三个位置：&lt;code&gt;public/assets/&lt;/code&gt;（图片）、&lt;code&gt;src/content/posts/&lt;/code&gt;（文章）、&lt;code&gt;src/config.ts&lt;/code&gt;（站点配置）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、图片文件规范&lt;/h2&gt;
&lt;h3&gt;1. 存放路径&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;路径&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;/td&gt;
&lt;td&gt;&lt;code&gt;public/assets/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在文章 frontmatter 里引用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网站壁纸&lt;/td&gt;
&lt;td&gt;&lt;code&gt;public/assets/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文件名 &lt;code&gt;wallpaper-1.jpg&lt;/code&gt;、&lt;code&gt;wallpaper-2.jpg&lt;/code&gt;（导航栏调色板里引用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网站横幅&lt;/td&gt;
&lt;td&gt;&lt;code&gt;public/assets/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;由 &lt;code&gt;src/config.ts&lt;/code&gt; 的 &lt;code&gt;banner.src&lt;/code&gt; 指定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图库照片&lt;/td&gt;
&lt;td&gt;&lt;code&gt;public/gallery/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;目录不存在就新建一个&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2. 命名规范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只用小写英文 + 数字 + 连字符&lt;/strong&gt;，禁止中文、空格、大写字母
&lt;ul&gt;
&lt;li&gt;推荐：&lt;code&gt;cover-my-blog-road.jpg&lt;/code&gt;、&lt;code&gt;gallery-2026-09-01.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不推荐：&lt;code&gt;我的封面.JPG&lt;/code&gt;、&lt;code&gt;Screen Shot 2026.png&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;文章封面建议统一前缀：&lt;code&gt;cover-&amp;lt;文章文件名&amp;gt;.jpg&lt;/code&gt;，方便对应查找&lt;/li&gt;
&lt;li&gt;图片格式：优先 &lt;code&gt;.jpg&lt;/code&gt; / &lt;code&gt;.webp&lt;/code&gt;（截图可用 &lt;code&gt;.png&lt;/code&gt;）；单张建议 &lt;strong&gt;小于 500KB&lt;/strong&gt;，宽度 1200px 左右即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 如何在文章中使用图片&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;---
title: 文章标题
published: 2026-09-01
image: /assets/cover-my-blog-road.jpg   # 必须以 /assets/ 开头（对应 public/assets/）
---
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;注意是 &lt;code&gt;/assets/...&lt;/code&gt; 而不是 &lt;code&gt;public/assets/...&lt;/code&gt;（&lt;code&gt;public&lt;/code&gt; 目录在网址里不出现）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不填 &lt;code&gt;image&lt;/code&gt; 字段时，首页卡片会自动生成一张紫蓝渐变的 SVG 封面&lt;/strong&gt;，标题会写上去，不用害怕没图&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;三、文章文件规范&lt;/h2&gt;
&lt;h3&gt;1. 存放位置与文件名&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;所有文章放在 &lt;code&gt;src/content/posts/&lt;/code&gt;，&lt;strong&gt;一个 &lt;code&gt;.md&lt;/code&gt; 文件 = 一篇文章&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件名就是文章网址&lt;/strong&gt;，所以必须用英文：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hello-my-friend.md&lt;/code&gt; → 网址 &lt;code&gt;https://niezhenhaoblog.cc.cd/posts/hello-my-friend/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件名一旦发布就不要再改，否则网址会变&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 文件格式（frontmatter + Markdown 正文）&lt;/h3&gt;
&lt;p&gt;每个 &lt;code&gt;.md&lt;/code&gt; 文件开头必须有一段 &lt;code&gt;---&lt;/code&gt; 包裹的配置（frontmatter），然后是正文：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 这里是文章标题
published: 2026-09-01
description: 一两句话的摘要，显示在首页卡片和搜索里
tags: [标签1, 标签2]
category: 分类名
image: /assets/cover-xxx.jpg        # 可选，不填自动生成渐变封面
draft: false                        # true = 草稿，网站上不显示
---

正文从这里开始，正常写 Markdown 即可：

## 二级标题

普通文字，**加粗**，*斜体*，[链接](https://example.com)

![图片说明](/assets/xxx.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;字段说明：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;必填&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;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ 必填&lt;/td&gt;
&lt;td&gt;文章标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ 必填&lt;/td&gt;
&lt;td&gt;发布日期，格式 &lt;code&gt;2026-09-01&lt;/code&gt;（首页时间线按它排序）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;摘要，建议写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;标签数组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;分类（专题页 hub 会自动归组）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;封面图路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; 为草稿，不显示在网站&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;updated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;更新日期&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ frontmatter 格式错误会导致构建失败（比如 &lt;code&gt;published&lt;/code&gt; 少写、&lt;code&gt;---&lt;/code&gt; 没配对）。写完不确定就先跑一次本地构建（见第五节）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;四、操作指南&lt;/h2&gt;
&lt;h3&gt;A. 发布一篇新文章（最常用）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;新建文件&lt;/strong&gt;：在 &lt;code&gt;src/content/posts/&lt;/code&gt; 下新建一个英文文件名的 &lt;code&gt;.md&lt;/code&gt;，例如 &lt;code&gt;my-new-post.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;填写 frontmatter + 写正文&lt;/strong&gt;（参考上面第三节格式）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提交并推送&lt;/strong&gt;：在项目根目录打开终端（PowerShell），依次执行：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;npm run build
git add .
git add src/content/posts/my-new-post.md
git commit -m &quot;post: 新文章 标题&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果很久没推送，提示冲突：先执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;git pull --rebase origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;等待自动部署&lt;/strong&gt;：推送后 EdgeOne 会自动拉取代码并构建，大约 &lt;strong&gt;5 分钟&lt;/strong&gt;生效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;刷新网站&lt;/strong&gt;：打开 https://niezhenhaoblog.cc.cd/ 确认文章出现；没变化就按 &lt;code&gt;Ctrl + F5&lt;/code&gt; 强制刷新&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;一条命令也行（新文章+图片一起发）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .; git commit -m &quot;post: 新文章 标题&quot;; git push
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;B. 给文章配封面图&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;把图片放进 &lt;code&gt;public/assets/&lt;/code&gt;，命名为 &lt;code&gt;cover-&amp;lt;文章名&amp;gt;.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在文章 frontmatter 加一行：&lt;code&gt;image: /assets/cover-&amp;lt;文章名&amp;gt;.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;图片和文章可以一起 &lt;code&gt;git add .&lt;/code&gt; 推送&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;C. 图库页添加照片&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;把照片放进 &lt;code&gt;public/gallery/&lt;/code&gt;（目录没有就新建）&lt;/li&gt;
&lt;li&gt;打开 &lt;code&gt;src/pages/gallery.astro&lt;/code&gt;，在顶部数组里照格式加一行：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const photos = [
    { src: &quot;/gallery/2026-09-01.jpg&quot;, title: &quot;照片说明&quot;, date: &quot;2026-09-01&quot; },
];
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;推送后等自动部署&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;D. 修改网页内容 / 样式后的部署&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;直接修改对应的源码文件（改前建议备份或记住改了什么）&lt;/li&gt;
&lt;li&gt;（可选）&lt;strong&gt;本地预览&lt;/strong&gt;确认效果：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;npm run dev        # 启动本地开发服务器，浏览器打开提示的 http://localhost:4321
# 按 Ctrl + C 停止
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;提交推送：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git add .; git commit -m &quot;style: 改了什么简短说明&quot;; git push
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;等 EdgeOne 自动构建（约 5 分钟），&lt;code&gt;Ctrl + F5&lt;/code&gt; 刷新网站验证&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;E. 常用命令速查&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&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;npm run dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;本地实时预览（改代码即时生效，最推荐调试用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;本地完整构建（验证能不能部署成功，产物在 &lt;code&gt;dist/&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;预览 &lt;code&gt;dist/&lt;/code&gt; 构建产物&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;暂存所有改动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git commit -m &quot;说明&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;创建提交&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;推送到远程 → &lt;strong&gt;触发 EdgeOne 自动部署&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;F. 出问题了怎么办&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;现象&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;/td&gt;
&lt;td&gt;1. 等 5-8 分钟；2. &lt;code&gt;Ctrl + F5&lt;/code&gt; 强刷；3. 登录 EdgeOne 控制台看构建状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;构建失败（EdgeOne 显示失败）&lt;/td&gt;
&lt;td&gt;本地跑 &lt;code&gt;npm run build&lt;/code&gt; 复现真实报错（90% 是 frontmatter 写错或路径引用错）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新文章没出现&lt;/td&gt;
&lt;td&gt;检查文件是否在 &lt;code&gt;src/content/posts/&lt;/code&gt;、frontmatter 是否有 &lt;code&gt;title&lt;/code&gt; 和 &lt;code&gt;published&lt;/code&gt;、是否写了 &lt;code&gt;draft: true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图片不显示&lt;/td&gt;
&lt;td&gt;检查 frontmatter 里是否写成了 &lt;code&gt;/assets/...&lt;/code&gt;（不能带 &lt;code&gt;public&lt;/code&gt;）、文件名大小写是否完全一致&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;评论加载慢/不出&lt;/td&gt;
&lt;td&gt;刷新一次（冷启动），还不行看Waline 服务状态&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;五、注意事项&lt;/h2&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;code&gt;dist/&lt;/code&gt;（构建产物）、&lt;code&gt;pnpm-lock.yaml&lt;/code&gt;（依赖锁）、&lt;code&gt;.astro/&lt;/code&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;code&gt;src/config.ts&lt;/code&gt;，改完同样走「提交 → 推送 → 自动部署」流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建站天数&lt;/strong&gt;：页脚和首页仪表盘的「运行 X 天」由 &lt;code&gt;config.ts&lt;/code&gt; 的 &lt;code&gt;since&lt;/code&gt; 字段计算，页面每次打开都会实时算，不会滞后&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>我的博客之路（实操篇）</title><link>https://niezhenhaoblog.cc.cd/posts/my-blog-sx/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-blog-sx/</guid><description>从零开始搭建静态博客的完整实操记录：建仓、上传、部署、域名、评论，一步一个坑地爬</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;前言：构建、权限、命名、区域、备案、解析，这一路全踩了一遍。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本篇文章主要介绍如何部署，搭建，主要以静态博客为主，动态博客这篇文章不是嗷，有机会后面也会出的！&lt;/p&gt;
&lt;h1&gt;一，准备工作&lt;/h1&gt;
&lt;h5&gt;cnb.cool帐号，部署平台Github、cnb，Git工具用于文件上传、博客模板（Hexo新人首选界面干净可以自由发挥、Astro，也可以用其它的模板），域名（免费或付费或永久），本地环境：Node.js、Git、Hexo 完整博客项目，开通腾讯云 EdgeOne Pages.&lt;/h5&gt;
&lt;h2&gt;1、创建仓库&lt;/h2&gt;
&lt;p&gt;1、在cnb.cool，https://cnb.cool，准备账号&lt;/p&gt;
&lt;p&gt;2、在下面cnb，这里，去右上角，头像左边加号，注意：先创建个人组织，在创建仓库，；完成实名认证（流水线构建需要）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/cnb-new-repo-entry.png&quot; alt=&quot;cnb 新建仓库入口&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3、创建组织，组织名称最好字母不少于3个、组织别名：随便写、组织描述：无&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/cnb-create-org.png&quot; alt=&quot;创建组织&quot; /&gt;&lt;/p&gt;
&lt;p&gt;4、创建仓库，仓库归属选择已经创建好的组织，仓库名称按照这个模板提供的去写，URL根据仓库名称配置好可以不用管，公开性：在这里我踩过一个坑，设置的公开，然后后面在配置EdgeOne，API Token的时候报错了，记住公开性设置为私有，保存源码、密钥。然后点创建。好了到这里完成第一步了恭喜啊朋友！！！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/4.png&quot; alt=&quot;创建仓库，公开性选私有&quot; /&gt;&lt;/p&gt;
&lt;p&gt;5、点右上角头像， →个人设置 → &lt;strong&gt;访问令牌&lt;/strong&gt;，新建令牌，勾选【代码仓库‑读写】，复制保存 Token（只显示 1 次）&lt;/p&gt;
&lt;h2&gt;2、把博客模板传上去&lt;/h2&gt;
&lt;p&gt;本地装好 Git 后，把模板项目初始化并推送到刚建的仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
git add .
git commit -m &quot;init blog&quot;
git remote add origin https://cnb:你的Token@cnb.cool/你的组织/你的仓库.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户名固定填 &lt;code&gt;cnb&lt;/code&gt;，密码就是你刚建的访问令牌（直接把 &lt;code&gt;cnb:Token@&lt;/code&gt; 写进仓库地址最省事，以后推送不用再输）&lt;/li&gt;
&lt;li&gt;分支必须是 &lt;code&gt;main&lt;/code&gt;，后面所有构建都认它&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推完刷新仓库页面，能看到文件树就成功了。至此仓库就位，接下来让它变成&quot;每推一次代码就自动更新一次&quot;的流水线模式。&lt;/p&gt;
&lt;h1&gt;二、文件上传&lt;/h1&gt;
&lt;h2&gt;1、日常发文就是三连&lt;/h2&gt;
&lt;p&gt;以后写文章、改配置，全是同一套动作：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &quot;新增文章：xxx&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;push 完就什么都不用管了，构建和部署是全自动的。&lt;/p&gt;
&lt;p&gt;不想在本地装环境？cnb 自带 &lt;strong&gt;云开发 WebIDE&lt;/strong&gt;：仓库页面点进去，就是一个长在浏览器里的 VSCode，左侧文件树找到 &lt;code&gt;src/content/posts/&lt;/code&gt; 新建 &lt;code&gt;.md&lt;/code&gt; 文件直接写，写完在左侧 Git 图标里点提交推送，效果和本地一模一样。手机浏览器也能打开它应急改东西。&lt;/p&gt;
&lt;h2&gt;2、EdgeOne Pages 托管&lt;/h2&gt;
&lt;p&gt;1、打开腾讯云控制台，搜 &lt;strong&gt;EdgeOne Pages&lt;/strong&gt;，开通（免费）&lt;/p&gt;
&lt;p&gt;2、创建项目，选择 &lt;strong&gt;从 Git 仓库导入&lt;/strong&gt;，授权并绑定你的 cnb 仓库&lt;/p&gt;
&lt;p&gt;3、构建配置照抄：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;构建命令：&lt;code&gt;pnpm install --frozen-lockfile &amp;amp;&amp;amp; pnpm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输出目录：&lt;code&gt;dist&lt;/code&gt;（⚠️ Astro 的产物是 dist，不是 public，填错了网站就是空白）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4、首次部署完成后会拿到一个临时预览域名，但正式访问要用自定义域名（往下看）。&lt;/p&gt;
&lt;p&gt;到这里，&quot;推代码 → 自动构建 → 自动上线&quot;的流水线就通了，可以随手 push 一篇文章试试。&lt;/p&gt;
&lt;h1&gt;三、域名与备案&lt;/h1&gt;
&lt;h2&gt;1、域名哪来&lt;/h2&gt;
&lt;p&gt;付费的随便买（.com/.cn 几十块一年）；&lt;/p&gt;
&lt;h5&gt;白嫖党可以找免费二级域名（如 us.ci、cc.cd 的发放站），缺点是解析功能简陋、且&lt;strong&gt;永远过不了 ICP 备案&lt;/strong&gt;。我这里提供一个免费的域名：my.dnshe.com&lt;/h5&gt;
&lt;h2&gt;2、备案这关怎么过&lt;/h2&gt;
&lt;p&gt;EdgeOne 给域名做接入时默认会校验 ICP 备案，免费域名直接被拦。解法在创建/设置项目时找一个关键选项：&lt;strong&gt;加速区域选「全球可用区（不含中国大陆）」&lt;/strong&gt;——这个区域不要求备案，免费域名也能绑，国内访问走海外节点，速度够用。&lt;/p&gt;
&lt;h2&gt;3、DNS 解析（坑最多的一节）&lt;/h2&gt;
&lt;p&gt;去域名发放站的解析面板，加一条 CNAME：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;类型&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;@&lt;/code&gt;（或你的子域前缀）&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;EdgeOne 域名管理页要求的接入地址&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;三个我亲手踩过的坑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;加错平台&lt;/strong&gt;：解析必须加在&quot;域名的 DNS 归属方&quot;（给你发域名的那个站的面板），加到腾讯云/阿里云的解析控制台等于白加，全球都查不到&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主机名写错&lt;/strong&gt;：多数面板里主机名填前缀（如 &lt;code&gt;waline&lt;/code&gt;），不要填完整域名，除非面板明确要求&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负缓存&lt;/strong&gt;：解析改对了但就是访问不通，很可能是各地 DNS 还缓存着旧的&quot;查无此域名&quot;结果，等 10 分钟到 1 小时自动好，或者电脑上 &lt;code&gt;ipconfig /flushdns&lt;/code&gt; 手动清&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解析生效、EdgeOne 那边状态变绿后，HTTPS 证书会自动签发，直接就能访问了。&lt;/p&gt;
&lt;h1&gt;四、评论与统计&lt;/h1&gt;
&lt;p&gt;静态博客没有后端，评论和访客统计全靠外部服务补齐：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;评论&lt;/strong&gt;：Waline（部署在 Vercel + Neon 免费数据库，拿到服务地址后嵌入文章页模板，全站文章自动带评论区）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统计&lt;/strong&gt;：不蒜子，一行 script 引入就出阅读量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两个提醒：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚠️ Vercel 默认送的 &lt;code&gt;*.vercel.app&lt;/code&gt; 域名在国内被 DNS 污染，评论接口会加载不出来；给 Waline 绑一个你自己的子域名（如 &lt;code&gt;waline.你的域名&lt;/code&gt;）即可解决&lt;/li&gt;
&lt;li&gt;Waline 的第一个注册账号自动成为管理员，部署完第一时间去注册，别被人抢了&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;五、踩坑清单（浓缩版）&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;EdgeOne 项目名不允许大写&lt;/strong&gt;：只收小写字母/数字/连字符，&lt;code&gt;NieBlog&lt;/code&gt; 直接创建失败，用 &lt;code&gt;nieblog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仓库公开性&lt;/strong&gt;：要存 Token/密钥就设私有，公开仓库配 Token 会报错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decap CMS 这类网页后台不支持 cnb.cool&lt;/strong&gt;：它们只认 GitHub/GitLab 等有标准 OAuth 的平台，教程说能用 git-gateway 的都是没实测过的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免费域名绑不上含大陆的加速区域&lt;/strong&gt;：选全球（不含中国大陆）区域就绕开备案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS 改完不生效先别慌&lt;/strong&gt;：九成是负缓存，等一等或手动清缓存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建产物目录&lt;/strong&gt;：Astro 是 &lt;code&gt;dist&lt;/code&gt;，Hexo 是 &lt;code&gt;public&lt;/code&gt;，别照抄别的教程&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;六、收尾验收清单&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[ ] push 一篇文章，2 分钟后公网域名能打开&lt;/li&gt;
&lt;li&gt;[ ] 手机流量（不连 Wi-Fi）访问正常&lt;/li&gt;
&lt;li&gt;[ ] 文章底部评论区能加载、能发评论&lt;/li&gt;
&lt;li&gt;[ ] RSS（&lt;code&gt;/rss.xml&lt;/code&gt;）能订阅&lt;/li&gt;
&lt;li&gt;[ ] 暗色模式切过去样式不乱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全打勾，博客就算真正上线了。之后的日子只剩一件事：写文章，push，等它自己上线。&lt;/p&gt;
</content:encoded></item><item><title>新手小白的博客开发之路</title><link>https://niezhenhaoblog.cc.cd/posts/newbie-blog-road/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/newbie-blog-road/</guid><description>从零开始搭建静态博客的完整记录：cnb 流水线 + EdgeOne Pages + Waline 评论，域名、备案、DNS 全踩一遍，最终全链路上线。</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;前言：构建、权限、命名、区域、备案、解析——所有内容完完全全跑完了。这篇把我从一个什么都不会的新手，到博客正式上线的全过程整理成教程，每个坑都标出来，照着走可以少走很多弯路。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;最终成果长什么样&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;博客地址：&lt;code&gt;https://niezhenhaoblog.cc.cd&lt;/code&gt;，手机浏览器直接打开&lt;/li&gt;
&lt;li&gt;文章用 Markdown 写，&lt;code&gt;git push&lt;/code&gt; 之后全自动构建部署，大约 2 分钟全网生效&lt;/li&gt;
&lt;li&gt;带评论系统（Waline）、阅读量统计（不蒜子），&lt;strong&gt;全程零服务器、零费用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整套架构一句话说清：&lt;strong&gt;静态博客没有后端&lt;/strong&gt;，文章在本地写好推到 Git 仓库，云流水线自动构建成纯静态文件，托管到腾讯云 EdgeOne Pages 上；评论和访问统计这类&quot;动态能力&quot;靠第三方嵌入脚本补齐。&lt;/p&gt;
&lt;h2&gt;一、准备工作&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;注册 cnb.cool&lt;/strong&gt;，创建组织，新建一个代码仓库（主分支 &lt;code&gt;main&lt;/code&gt;），这就是博客的家&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开通腾讯云 EdgeOne Pages&lt;/strong&gt;，它负责把静态文件变成一个真实可访问的网站&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地准备好博客模板&lt;/strong&gt;：我用的 Astro 框架的 Fuwari 模板，开箱即用、颜值高、原生支持 Markdown 写文章&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;pnpm create astro@latest --template saicaca/fuwari
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 坑 1：构建输出目录是 &lt;code&gt;./dist&lt;/code&gt;，后面流水线部署时要用到，先记住它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;二、流水线：让 push 自动变成上线&lt;/h2&gt;
&lt;p&gt;在仓库根目录放一个 &lt;code&gt;.cnb.yml&lt;/code&gt;，内容大致是三步：装依赖 → 构建 → 部署。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main:
  push:
    - name: blog-build-deploy
      docker:
        image: node:22-alpine
        volumes:
          - /root/.pnpm-store:cow
      stages:
        - name: 安装依赖
          script: |
            npm config set registry https://registry.npmmirror.com
            npm install -g pnpm
            pnpm install --frozen-lockfile
        - name: Astro构建静态博客
          script: |
            pnpm run build
        - name: 部署EdgeOne Pages
          image: tencentcom/deploy-eopages:latest
          script: |
            edgeone pages deploy ./dist -n 你的项目名 -t ${EO_SECRET}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;EO_SECRET&lt;/code&gt; 是 EdgeOne 的 API 密钥，通过 &lt;strong&gt;密钥仓库&lt;/strong&gt; 导入，不能明文写在流水线文件里。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 坑 2：cnb 的令牌是有&quot;作用范围&quot;的。我最早的令牌只授权了博客仓库，结果推密钥仓库时一直 403。要么建仓库时把权限给够，要么干脆把主仓库设为私有、密钥文件直接放主仓库里用相对路径导入（我最后选了后者，少一环少一个坑）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 坑 3：&lt;strong&gt;EdgeOne Pages 项目名不允许大写字母&lt;/strong&gt;（只允许小写字母、数字、连字符）。我配置里写了 &lt;code&gt;NieBlog&lt;/code&gt;，流水线在这个步骤反复失败，还一度以为是密钥的问题，排查了半天。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;三、域名与&quot;备案&quot;这道坎&lt;/h2&gt;
&lt;p&gt;网站要有域名才能访问。我在 EdgeOne Pages 控制台里绑自定义域名时，弹出提示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;检测到当前域名未在工信部备案，将无法被顺利添加&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里的关键是&lt;strong&gt;加速区域&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;加速区域&lt;/th&gt;
&lt;th&gt;要不要备案&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;/td&gt;
&lt;td&gt;❌ 不需要&lt;/td&gt;
&lt;td&gt;走海外节点，国内可访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;含中国大陆的区域&lt;/td&gt;
&lt;td&gt;✅ 必须&lt;/td&gt;
&lt;td&gt;速度最快，但备案要买合规域名 + 等待审核&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我用的是免费域名，根本没法备案，所以选择了&quot;全球可用区（不含中国大陆）&quot;，免备案直接绑。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 坑 4：EdgeOne 平台自带的默认域名在国内访问会被 401 拦截（平台合规策略，改不掉），系统生成的预览链接只有 3 小时有效期。&lt;strong&gt;想长期访问，绑自定义域名是唯一正路。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;四、DNS 解析：最折磨人的一环&lt;/h2&gt;
&lt;p&gt;域名在面板里加了解析记录，为什么全世界都查不到？我踩了三个坑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;记录加错了平台&lt;/strong&gt;：解析记录必须加在域名权威 DNS 对应的服务商面板里。我的免费域名权威服务器是 dnshe.org，加到腾讯云 DNSPod 或其他平台等于白加&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主机名填错&lt;/strong&gt;：想解析根域名，主机名要填 &lt;code&gt;@&lt;/code&gt;；填成了别的名字，就成了一个奇怪的子域名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负缓存&lt;/strong&gt;：记录修正后，公共 DNS 可能还缓存着&quot;查无此域名&quot;的旧结果，等一会儿才生效&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我的域名最终形态：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;主机名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;记录值&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;@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;&lt;code&gt;niezhenhaoblog.cc.cd.pages.dnsoe5.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;博客主站 → EdgeOne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;waline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xxx.vercel-dns-017.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;评论系统 → Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_dnsauth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;EdgeOne 要求的验证值&lt;/td&gt;
&lt;td&gt;SSL 证书签发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edgeonereclaim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;EdgeOne 要求的验证值&lt;/td&gt;
&lt;td&gt;域名认领&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;排查 DNS 的神命令（指定公共 DNS 直接问）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nslookup 域名 223.5.5.5
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;五、评论系统：Waline + Vercel&lt;/h2&gt;
&lt;p&gt;静态博客没有后端，评论靠 Waline：前端嵌入脚本，后端部署在 Vercel（免费），数据存 Neon 数据库（免费）。&lt;/p&gt;
&lt;p&gt;部署步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注册 Vercel，从 &lt;a href=&quot;https://waline.js.org/guide/get-started/&quot;&gt;waline.js.org&lt;/a&gt; 点一键部署&lt;/li&gt;
&lt;li&gt;Vercel 项目里 &lt;strong&gt;Storage → Create Database → Neon&lt;/strong&gt; 建库&lt;/li&gt;
&lt;li&gt;在 Neon 的 SQL Editor 里执行 Waline 官方的初始化脚本，然后 &lt;strong&gt;Redeploy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;把 Waline 的地址填进博客配置：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export const walineConfig = {
	enable: true,
	serverURL: &quot;https://waline.你的域名&quot;,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 坑 5：&lt;strong&gt;&lt;code&gt;*.vercel.app&lt;/code&gt; 域名在国内被 DNS 污染&lt;/strong&gt;，直接用会&quot;无法加载评论&quot;。解决办法是在 Vercel 项目 Settings → Domains 里绑一个自己的子域名（比如 &lt;code&gt;waline.你的域名&lt;/code&gt;），再回域名面板加一条 CNAME。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 坑 6：Waline 第一个注册的账号自动成为管理员。服务一旦公开，&lt;strong&gt;尽快去注册&lt;/strong&gt;，不然被人抢注就尴尬了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;六、评论区的颜值：CSS 主题化&lt;/h2&gt;
&lt;p&gt;Waline 默认样式和博客风格不搭，可以用它暴露的 CSS 变量做主题化，引用博客自己的设计变量，&lt;strong&gt;暗色模式自动跟随，不用写两套&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#waline {
	--waline-theme-color: var(--primary);
	--waline-bgcolor: var(--card-bg);
	--waline-border-color: var(--line-color);
}
#waline .wl-panel {
	background-color: var(--page-bg);
	border-radius: 0.75rem;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再给输入面板加个聚焦描边、给按钮加个按压动效，评论区就和整个博客长在一起了。&lt;/p&gt;
&lt;h2&gt;七、上线验收清单&lt;/h2&gt;
&lt;p&gt;全部改完后逐项打勾：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;code&gt;git push&lt;/code&gt; 后流水线跑通，构建部署全自动&lt;/li&gt;
&lt;li&gt;[x] &lt;code&gt;https://域名&lt;/code&gt; 返回 200，标题正确&lt;/li&gt;
&lt;li&gt;[x] 文章页正常渲染，评论区出现&lt;/li&gt;
&lt;li&gt;[x] Waline API 返回 &lt;code&gt;errno: 0&lt;/code&gt;（数据库连接正常）&lt;/li&gt;
&lt;li&gt;[x] HTTPS 证书自动签发，HTTP 自动跳转&lt;/li&gt;
&lt;li&gt;[x] 手机流量（不连 Wi-Fi）打开测试一遍&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;回头看，整个过程没有任何服务器，费用为零，但踩的坑一点不少：构建随机爆炸、令牌权限 403、项目名不许大写、免费域名不能备案、解析记录加错地方、vercel.app 被污染……每一个都卡过我。&lt;/p&gt;
&lt;p&gt;但也正是这些坑让我把整条链路彻底搞明白了。现在我的写作流程简单到只有三步：&lt;strong&gt;写 Markdown → git push → 两分钟后全网可访问&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果你也想搭一个自己的博客，照着这篇走一遍，祝你好运，欢迎在评论区找我玩。&lt;/p&gt;
</content:encoded></item><item><title>你好，这个素未谋面的朋友</title><link>https://niezhenhaoblog.cc.cd/posts/hello-my-friend/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/hello-my-friend/</guid><description>博客开张第一篇，写给素未谋面的你。</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当你看到这个的时候说明俺的博客搭建好了，我不知道说什么，但是祝你有一个好的心情┗|｀O′|┛ 嗷~~！&lt;/p&gt;
&lt;p&gt;接下来呢，讲点你不知道的~，我呢出生于农村-2005/12/26是我的生日，自小时候我不是很会说话，自卑.不爱说话，内向，这个标签，也是钉在了我这身上了真就现在长大了也是，难道内向的人活该没有出路呗。&lt;/p&gt;
&lt;p&gt;跑题了—我们这一代经历过乡土中国，可是乡土中国背后的故事没有去说没人去讲，我见证过，也经历过.&lt;/p&gt;
</content:encoded></item><item><title>我的博客之路</title><link>https://niezhenhaoblog.cc.cd/posts/my-blog-road/</link><guid isPermaLink="true">https://niezhenhaoblog.cc.cd/posts/my-blog-road/</guid><description>从零开始搭建这个博客的全过程：技术选型、部署流水线，以及一路踩过的所有坑。</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇《你好，这个素未谋面的朋友》发出去的时候，这个博客其实才刚搭好骨架。这一篇就来复盘一下：这个博客到底是怎么从无到有的，中间踩了多少坑，又是怎么一个个爬出来的。&lt;/p&gt;
&lt;h2&gt;我想做一个什么样的博客&lt;/h2&gt;
&lt;p&gt;想法很简单：&lt;strong&gt;不要服务器，不要花钱，手机上能直接打开&lt;/strong&gt;。&lt;/p&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;strong&gt;框架&lt;/strong&gt;：Astro（选了 Fuwari 这个模板，颜值在线，开箱即用）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;托管&lt;/strong&gt;：腾讯云 EdgeOne Pages（免费额度，自带 CDN）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流水线&lt;/strong&gt;：cnb.cool 的云构建（push 代码自动触发安装依赖 → 构建 → 部署）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态补齐&lt;/strong&gt;：Waline 评论（后期部署）+ 不蒜子访问统计&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整套流程串起来就是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;写 Markdown → git push → cnb 流水线自动构建 → 部署 EdgeOne Pages → 公网直接访问
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有后端、没有服务器、没有运维。写完文章推上去，剩下的全自动。&lt;/p&gt;
&lt;h2&gt;坑一：模板构建随机爆炸&lt;/h2&gt;
&lt;p&gt;Fuwari 模板拉下来，本地一构建就报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The `link` class does not exist. If you are sure that `link` exists, then the issue may be related to the import ordering of your CSS.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更诡异的是它是&lt;strong&gt;随机出现&lt;/strong&gt;的——有时构建能过，有时又换一个地方报同样的错（这次是 &lt;code&gt;btn-regular-dark&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;查了 issue 才知道是模板的已知问题：样式文件里用 &lt;code&gt;@apply&lt;/code&gt; 去引用另一个 CSS 文件里定义的自定义类，Tailwind 的解析在多文件并行处理时偶发失败。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;：把这些 &lt;code&gt;@apply 自定义类&lt;/code&gt; 全部展开成底层的工具类写法。比如原来写 &lt;code&gt;@apply btn-regular-dark&lt;/code&gt;，就改成它背后那一串 &lt;code&gt;flex items-center justify-center bg-[oklch(...)] ...&lt;/code&gt;。改完之后构建再没炸过。&lt;/p&gt;
&lt;h2&gt;坑二：令牌权限的连环 403&lt;/h2&gt;
&lt;p&gt;为了自动化，我申请了 cnb 的访问令牌。结果发现它的权限范围很窄：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想 API 创建仓库 → &lt;code&gt;403&lt;/code&gt;（没有建仓权限）&lt;/li&gt;
&lt;li&gt;想读仓库信息 → &lt;code&gt;403&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;想读流水线构建日志 → &lt;code&gt;403&lt;/code&gt;（scope 不匹配）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而流水线又需要一个&lt;strong&gt;密钥仓库&lt;/strong&gt;来存放 EdgeOne 的 API 密钥。我推不动、建不了，最后只能自己在网页上建好密钥仓库、手动把密钥文件粘进去。&lt;/p&gt;
&lt;p&gt;后来又发现一个更绝的设计：&lt;strong&gt;密钥仓库连令牌都不允许读&lt;/strong&gt;（&lt;code&gt;Secret repos do not support token access&lt;/code&gt;）。安全是安全了，但也意味着想自动往里写文件是不可能的，老老实实网页操作。&lt;/p&gt;
&lt;p&gt;最终我换了更省事的方案：&lt;strong&gt;把博客仓库转成私有，密钥文件直接放在仓库根目录&lt;/strong&gt;，流水线里用相对路径 &lt;code&gt;./tencent.yml&lt;/code&gt; 导入。少一个仓库、少一环依赖，出错的概率也小了。&lt;/p&gt;
&lt;h2&gt;坑三：项目名不允许大写&lt;/h2&gt;
&lt;p&gt;流水线配置里我给 EdgeOne Pages 项目起名叫 &lt;code&gt;NieBlog&lt;/code&gt;，结果部署一直失败。最后直接在本地用官方 CLI 部署，才看到真实的报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error creating pages project: Name can only contain lower case letters, numbers and hyphen
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原来 EdgeOne Pages 的项目名&lt;strong&gt;只允许小写字母、数字和连字符&lt;/strong&gt;，大写都不行。改成 &lt;code&gt;nieblog&lt;/code&gt; 一次通过，项目还自动创建好了。这也告诉我们：&lt;strong&gt;云端流水线报错看不了日志的时候，把同样的命令在本地跑一遍，报错信息就全出来了&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;坑四：默认域名国内打不开&lt;/h2&gt;
&lt;p&gt;部署成功后以为万事大吉，结果项目自带的默认域名在大陆网络访问直接 401。查官方文档才知道：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;平台的默认域名/部署域名，大陆访问会被拦截（内容合规策略）&lt;/li&gt;
&lt;li&gt;系统生成的预览链接&lt;strong&gt;只有 3 小时有效期&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;绑自定义域名时又被拦：&lt;strong&gt;域名必须有 ICP 备案&lt;/strong&gt;。而我手里的免费域名（.ci / .cc.cd 这种）根本没法走备案流程。&lt;/p&gt;
&lt;p&gt;好在有解：EdgeOne 的加速区域选「&lt;strong&gt;全球可用区（不含中国大陆）&lt;/strong&gt;」时，绑自定义域名&lt;strong&gt;不需要备案&lt;/strong&gt;。选好区域，域名就顺利添加进去了。&lt;/p&gt;
&lt;h2&gt;坑六：解析记录加了却&quot;全世界都看不到&quot;&lt;/h2&gt;
&lt;p&gt;域名添加了，解析也按提示加了，结果网站还是 500。用公共 DNS（阿里 223.5.5.5、谷歌 8.8.8.8）一查——&lt;strong&gt;全球都查不到这条记录&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;直接问域名的权威 DNS 服务器才发现问题：这个免费域名的权威 DNS 在服务商自己手里，&lt;strong&gt;解析记录必须加在它的面板里才有效&lt;/strong&gt;。如果加到腾讯云 DNSPod 或者别的平台，你的域名根本不归人家管，加了等于没加。&lt;/p&gt;
&lt;p&gt;排查 DNS 问题的套路也记一下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Resolve-DnsName 域名 -Server 223.5.5.5&lt;/code&gt; → 查公共 DNS 有没有记录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Resolve-DnsName 主域 -Type NS&lt;/code&gt; → 找到域名真正的权威 DNS 在谁手里&lt;/li&gt;
&lt;li&gt;直接问权威服务器 → 记录到底存没存上&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;一个&quot;不要服务器&quot;的博客，从想法到能访问，实际上跨过了构建、权限、命名、区域、备案、解析六道坎。每一道坎单拿出来都不难，但叠在一起，就足够让一个新手在深夜对着 403 和 500 发呆了。&lt;/p&gt;
&lt;p&gt;好在这条流水线现在是真正跑通了：以后写文章，只是一个 Markdown 文件加一次 &lt;code&gt;git push&lt;/code&gt; 的事。&lt;/p&gt;
&lt;p&gt;剩下的小目标：把 Waline 评论部署上，让这个素未谋面的你，也能在文章下面留言。&lt;/p&gt;
</content:encoded></item></channel></rss>