友链重构小记
前言
腾讯云新人优惠买的2c2g服务器快过期了,博客也搭了将近一年了,这两天给迁移到了新的服务器上。
然后HoL群里刚好聊起了友链,左看右看横看竖看总觉得自己一年前写的友链实在不够优雅。
来都来了,那就给他重构一下,但没想到一重构就从下午重构到晚上十一点了。
是收获还是有的,首先是友链漂亮了不少,其次是对hexo这个框架的理解提升了不少。
过程
起初便打定主意要用卡片式的,因为确实好看,而且很多群友都在用。
然后准备问问DeepSeek要怎么实现,很幸运,第一句话就问出来了。
但是有些细节问题需要继续追问,比如说cactus主题没有_custom
,也没找到_data
,
还有诸如CSS一直没有生效,导航栏被渲染了两遍,以及index.md中的内容无法显示的问题。
那为什么红温了呢,因为:
服务器繁忙,请稍后再试。
想着网页版不用也罢,拿着api问半天想起来没有上下文,难受的我去硅基流动,结果也是一个劲褒姒。
然后把各大平台的AI都抡冒烟了,还是不如DS好使。
之后想要在百度上找篇教程看看怎么个写法,但是一水的NEXT主题的教程。
可我用的也不是NEXT啊,这时想起了我一年前自己拿史一样的代码糊友链的原因,
嗯,因为找不到教程。
最后还是用的硅基流动,总归还是有时候能用的。
总结一下搭建的流程,这大概是一个通用的教程。
步骤梳理
第一步是先新建一个页面。
一想到我之前直接在source里面mkdir就感觉自己像个原始人一样。
然后在source/links/index.md
的Front Matter中指定模板。
1 2 3 4 5
| --- title: links date: 2025-02-11 16:15:39 layout: links ---
|
这个时候有人就要问了,这个主题没有links模板啊。
对啊,所以下一步是自己创建一个links模板。
在themes/cactus/layout/
中新建一个links.ejs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <main class="content"> <article class="page"> <h1 class="page-title"><%= page.title %></h1> <div class="links-container"> <% site.data.links.forEach(function(link) { %> <a href="<%= link.url %>" class="link-card" target="_blank" rel="noopener"> <div class="card-avatar"> <img src="<%= link.avatar %>" alt="<%= link.name %>"> </div> <div class="card-content"> <h3 class="card-title"><%= link.name %></h3> <% if (link.description) { %> <p class="card-desc"><%= link.description %></p> <% } %> </div> </a> <% }) %> </div> </article> </main> <%- partial('_partial/footer') %>
|
新建完模板记得在source里面新建一个css文件夹,切记是hexo根目录下的source,而不是themes根目录下的source。
然后在其中创建一个叫做custom.css的css文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| /* 友情链接页面样式 */ .links-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 20px; padding: 20px 0; }
.link-item { padding: 15px; border-radius: 8px; background: rgba(255, 255, 255, 0.1); transition: transform 0.2s; }
.link-item:hover { transform: translateY(-3px); }
.link-avatar { width: 50px; height: 50px; border-radius: 50%; float: left; margin-right: 15px; }
.link-info { overflow: hidden; }
.link-name { font-weight: bold; display: block; color: #333; }
.link-desc { color: #666; font-size: 0.9em; }
/* ===== 卡片容器 ===== */ .links-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 25px; padding: 30px 0; }
/* ===== 单个卡片 ===== */ .link-card { display: flex; padding: 20px; border-radius: 12px; background: #fff; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; text-decoration: none !important; color: inherit; }
/* 暗色模式适配 */ .theme-dark .link-card { background: rgba(255, 255, 255, 0.05); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); }
/* 悬停效果 */ .link-card:hover { transform: translateY(-5px); box-shadow: 0 8px 15px rgba(0, 0, 0, 0.2); }
/* ===== 头像部分 ===== */ .card-avatar { flex-shrink: 0; width: 80px; height: 80px; margin-right: 20px; }
.card-avatar img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; border: 2px solid #eee; }
/* ===== 文字内容 ===== */ .card-content { flex: 1; }
.card-title { margin: 0 0 8px 0; font-size: 1.2em; color: #333; }
.theme-dark .card-title { color: #fff; }
.card-desc { margin: 0; font-size: 0.95em; color: #666; line-height: 1.5; }
.theme-dark .card-desc { color: rgba(255, 255, 255, 0.7); }
.link-card { position: relative; overflow: hidden; }
/* 悬浮流光效果 */ .link-card::after { content: ""; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient( 45deg, transparent 25%, rgba(255, 255, 255, 0.1) 50%, transparent 75% ); transform: rotate(30deg); opacity: 0; transition: opacity 0.5s; }
.link-card:hover::after { opacity: 1; }
@media (max-width: 768px) { .links-container { grid-template-columns: 1fr; gap: 15px; }
.link-card { padding: 15px; flex-direction: column; align-items: center; text-align: center; }
.card-avatar { margin-right: 0; margin-bottom: 15px; } }
|
而后在themes/cactus/_config.yml
中添加如下内容以确保前面的步骤生效。
1 2 3 4 5 6
| # 确保布局文件路径正确 layout: links: layout/links.ejs
# 确保启用自定义 CSS custom_css: /css/custom.css
|
然后在source/
中新建一个_data
文件夹用来存储友链的数据。
在其中新建一个links.yml
,
内容格式如下:
1 2 3 4
| - name: 网站名称 url: 网站地址 avatar: 网站头像 description: 网站介绍
|
做完这几步照例应该是成功了,但是很遗憾我的css没有生效。
看了public/css/
里面是有custom.css
生成的,
虽然不是很理解,但是在themes/cactus/layout/_partial/head.ejs
的最前面加上下列内容强制加载自定义CSS就没问题了
1 2
| <!-- 强制加载自定义 CSS --> <link rel="stylesheet" href="/css/custom.css">
|
还有就是在导航栏添加Links,只需要在themes/cactus/_config.yml
的nav下添加 Links: /links/
即可
1 2 3 4 5
| nav: home: / about: /about/ articles: /archives/ Links: /links/
|
最后记得清除缓存然后重新部署
1
| hexo clean && hexo g && hexo s
|