PageSourceSearch

https://blog.uuanqin.top/

html uuanqin.top collected 2026-10-03 23:18:43 UTC 119,919 bytes, 1,606 lines download raw bytes

1<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><!-- hexo injector head_begin start -->
2    
2<script>
3      window.HexoLivePhotoConfig = {"enable":true,"autoplay":true,"hover_to_play":true,"click_to_play":true,"lazy_load":true,"threshold":0.8,"badge":true,"badge_text":"Live","badge_position":"top-left","loading_animation":true,"preload":"auto","keep_observing":false,"hover_delay":300,"weixin_disable_autoplay":true,"loop":false,"inject_to":"default"};
4    </script>
4
5  <style>:root {
6  --live-brand-color: #ff2e4d;
7  --live-bg-gray: #f0f0f0;
8  --live-error-bg: #f8f8f8;
9  --live-radius-lg: 12px;
10  --live-radius-sm: 8px;
11  --live-transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
12}
13
14
15/* Live Photo 容器 */
16.live-photo-container {
17  position: relative;
18  border-radius: var(--live-radius-lg);
19  cursor: pointer;
20  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
21  transition: transform var(--live-transition), box-shadow var(--live-transition);
22  max-width: 100%;
23  overflow: hidden;
24  display: flex;
25  line-height: 0;
26  margin: 20px auto;
27  width: fit-content;
28  /*background: var(--live-bg-gray);*/ /* 保持透明背景,避免夜间模式下显示异常 */
29  justify-content: center;
30  align-items: center;
31}
32
33.live-photo-container:not(.live-photo-image-grid):not(.live-photo-image-grid-grid) {
34  display: table; /* 既能实现 fit-content 效果,又能支持 margin: auto 居中 */
35  margin: 20px auto;
36}
37
38.live-photo-container a {
39  position: absolute;
40  top: 0;
41  left: 0;
42  width: 100%;
43  height: 100%;
44  z-index: 2;
45  pointer-events: none;
46}
47
48.live-photo-container .caption,
49.live-photo-container span.caption {
50  display: none !important;
51}
52
53.live-photo-container:hover {
54  transform: translateY(-2px);
55  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
56}
57
58/* 静态图片 */
59.live-photo-static {
60  position: absolute !important;
61  top: 0;
62  left: 0;
63  z-index: 2;
64  border-radius: inherit;
65  transition: opacity var(--live-transition);
66  pointer-events: none;
67  margin: 0 !important;
68  background-color: var(--live-bg-gray);
69  color: transparent;
70  text-indent: -10000px;
71}
72
73/* 如果图片报错了,确保它绝对不会由于任何 hover 效果又跳出来 */
74.live-photo-container.is-loading .live-photo-static[style*="visibility: hidden"] {
75  opacity: 0 !important;
76}
77
78/* 视频元素 */
79.live-photo-video {
80  position: relative;
81  display: block;
82  border-radius: var(--live-radius-sm);
83  z-index: 1;
84  /*opacity: 1 !important;*/
85}
86
87/* Live 标识 */
88.live-badge {
89  position: absolute;
90  background: rgba(0, 0, 0, 0.55);
91  color: #ffffff;
92
93  /* 优化间距:减小左右,增加上下呼吸感 */
94  padding: 5px 10px;
95  border-radius: 6px; /* 稍微加大圆角,显得更现代 */
96
97  /* 字体优化:使用系统级无衬线字体,增加字间距 */
98  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
99  font-size: 11px; /* 稍微调小一点点,更精致 */
100  font-weight: 600; /* 半粗体增加专业感 */
101  letter-spacing: 0.05em; /* 关键:增加字间距,提升高级感 */
102  text-transform: uppercase; /* 强制大写 */
103
104  display: flex;
105  align-items: center;
106  justify-content: center;
107  gap: 6px;
108
109  -webkit-backdrop-filter: blur(12px) saturate(180%);
110  backdrop-filter: blur(12px) saturate(180%);
111  z-index: 10;
112  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
113  min-width: unset;
114  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
115  pointer-events: none;
116}
117
118.live-badge::before {
119  content: '';
120  display: inline-block;
121  width: 6px; /* 稍微缩小,显得更精致 */
122  height: 6px;
123  border-radius: 50%;
124  background-color: var(--live-brand-color);
125  /* 增加一点点外发光 */
126  box-shadow: 0 0 4px rgba(255, 46, 77, 0.6);
127  transition: background-color 0.3s ease;
128  flex-shrink: 0; /* 防止被挤压 */
129}
130
131/* 位置变体 */
132.live-badge.bottom-left {
133  bottom: 12px;
134  left: 12px;
135}
136
137.live-badge.bottom-right {
138  bottom: 12px;
139  right: 12px;
140}
141
142.live-badge.top-left {
143  top: 12px;
144  left: 12px;
145}
146
147.live-badge.top-right {
148  top: 12px;
149  right: 12px;
150}
151
152/* 加载指示器 */
153.live-loading {
154  position: absolute;
155  top: 50%;
156  left: 50%;
157  transform: translate(-50%, -50%);
158  width: 40px;
159  height: 40px;
160  border: 3px solid rgba(255, 255, 255, 0.3);
161  border-radius: 50%;
162  border-top-color: var(--live-brand-color);
163  animation: livephoto-spin 1s ease-in-out infinite;
164  display: none;
165  z-index: 1;
166}
167
168@keyframes livephoto-spin {
169  to {
170    transform: translate(-50%, -50%) rotate(360deg);
171  }
172}
173
174/* 标题样式 */
175.live-caption {
176  text-align: center;
177  margin-top: 8px;
178  font-size: 14px;
179  color: #666;
180}
181
182/* 响应式设计 */
183@media (max-width: 768px) {
184  .live-photo-container {
185    border-radius: 8px;
186    margin: 16px 0;
187  }
188
189  .live-badge {
190    font-size: 11px;
191    padding: 3px 6px;
192  }
193
194  .live-badge.bottom-left,
195  .live-badge.bottom-right {
196    bottom: 8px;
197  }
198
199  .live-badge.bottom-left,
200  .live-badge.top-left {
201    left: 8px;
202  }
203
204  .live-badge.bottom-right,
205  .live-badge.top-right {
206    right: 8px;
207  }
208
209  .live-badge.top-left,
210  .live-badge.top-right {
211    top: 8px;
212  }
213
214}
215
216/* 多图布局容器 */
217.live-photo-image-grid {
218  display: flex;
219  flex-wrap: wrap;
220  justify-content: space-between;
221  margin: 20px 0;
222  gap: 15px; /* 使用gap属性设置间距 */
223}
224
225.live-photo-image-column {
226  flex: 0 0 calc(50% - 8px); /* 每列占50%宽度减去一半的间距 */
227  min-width: 0; /* 防止内容溢出 */
228}
229
230/* Grid布局 */
231.live-photo-image-grid-grid {
232  display: grid;
233  grid-template-columns: repeat(2, 1fr); /* 始终保持两列 */
234  gap: 15px;
235  margin: 20px 0;
236}
237
238.live-photo-grid-item {
239  position: relative;
240  min-width: 0; /* 防止内容溢出 */
241}
242
243/* 浮动布局 */
244.live-photo-image-float-container {
245  width: 100%;
246  margin: 20px 0;
247  display: flex;
248  flex-wrap: wrap;
249  gap: 15px;
250}
251
252.live-photo-float-image {
253  flex: 0 0 calc(50% - 8px); /* 每列占50%宽度减去一半的间距 */
254}
255
256/* Live Photo 容器适配多图布局 */
257.live-photo-image-grid .live-photo-container,
258.live-photo-image-grid-grid .live-photo-container,
259.live-photo-image-float-container .live-photo-container {
260  margin: 0; /* 移除单独设置的外边距 */
261  border-radius: 8px; /* 稍微减小圆角以适应小屏幕 */
262}
263
264/* 确保图片和视频在多图布局中正确显示 */
265.live-photo-image-grid .live-photo-static,
266.live-photo-image-grid-grid .live-photo-static,
267.live-photo-image-float-container .live-photo-static,
268.live-photo-image-grid .live-photo-video,
269.live-photo-image-grid-grid .live-photo-video,
270.live-photo-image-float-container .live-photo-video {
271  border-radius: 8px; /* 与容器保持一致 */
272}
273
274/* 调整Live标识在小屏幕上的大小 */
275.live-photo-image-grid .live-badge,
276.live-photo-image-grid-grid .live-badge,
277.live-photo-image-float-container .live-badge {
278  font-size: 10px;
279  padding: 2px 6px;
280}
281
282.live-photo-image-grid .live-badge.bottom-left,
283.live-photo-image-grid-grid .live-badge.bottom-left,
284.live-photo-image-float-container .live-badge.bottom-left,
285.live-photo-image-grid .live-badge.bottom-right,
286.live-photo-image-grid-grid .live-badge.bottom-right,
287.live-photo-image-float-container .live-badge.bottom-right {
288  bottom: 8px;
289}
290
291.live-photo-image-grid .live-badge.bottom-left,
292.live-photo-image-grid-grid .live-badge.bottom-left,
293.live-photo-image-float-container .live-badge.bottom-left,
294.live-photo-image-grid .live-badge.top-left,
295.live-photo-image-grid-grid .live-badge.top-left,
296.live-photo-image-float-container .live-badge.top-left {
297  left: 8px;
298}
299
300.live-photo-image-grid .live-badge.bottom-right,
301.live-photo-image-grid-grid .live-badge.bottom-right,
302.live-photo-image-float-container .live-badge.bottom-right,
303.live-photo-image-grid .live-badge.top-right,
304.live-photo-image-grid-grid .live-badge.top-right,
305.live-photo-image-float-container .live-badge.top-right {
306  right: 8px;
307}
308
309.live-photo-image-grid .live-badge.top-left,
310.live-photo-image-grid-grid .live-badge.top-left,
311.live-photo-image-float-container .live-badge.top-left,
312.live-photo-image-grid .live-badge.top-right,
313.live-photo-image-grid-grid .live-badge.top-right,
314.live-photo-image-float-container .live-badge.top-right {
315  top: 8px;
316}
317
318/* 非常小的设备调整 */
319@media (max-width: 360px) {
320  .live-photo-image-grid {
321    gap: 10px;
322  }
323
324  .live-photo-image-column {
325    flex: 0 0 calc(50% - 5px); /* 调整间距 */
326  }
327
328  .live-photo-image-grid-grid {
329    gap: 10px;
330  }
331
332  .live-photo-float-image {
333    flex: 0 0 calc(50% - 5px); /* 调整间距 */
334  }
335
336  /* 进一步调整Live标识 */
337  .live-photo-image-grid .live-badge,
338  .live-photo-image-grid-grid .live-badge,
339  .live-photo-image-float-container .live-badge {
340    font-size: 9px;
341    padding: 2px 4px;
342  }
343}
344
345/* 确保单图布局不受影响 */
346.live-photo-container:not(.live-photo-image-grid):not(.live-photo-image-grid-grid):not(.live-photo-image-float-container) {
347  margin: 20px auto;
348}
349
350/* 标题样式调整 */
351.live-caption {
352  font-size: 13px; /* 稍微减小字体大小 */
353  margin-top: 5px;
354  line-height: 1.4;
355}
356
357/* 确保加载指示器在多图布局中正确显示 */
358.live-photo-image-grid .live-loading,
359.live-photo-image-grid-grid .live-loading,
360.live-photo-image-float-container .live-loading {
361  width: 30px;
362  height: 30px;
363}
364
365/* 加载状态下的视觉反馈 */
366.live-photo-container.is-loading .live-badge {
367  background: rgba(0, 0, 0, 0.75);
368}
369
370.live-photo-container.is-loading .live-badge::before {
371  background-color: #ffcc00;
372  box-shadow: 0 0 6px rgba(255, 204, 0, 0.8);
373  animation: live-photo-blink 0.5s infinite alternate cubic-bezier(0.4, 0, 0.6, 1);
374}
375
376@keyframes live-photo-blink {
377  from {
378    opacity: 1;
379    transform: scale(1);
380  }
381  to {
382    opacity: 0.5;
383    transform: scale(0.85);
384  }
385}
386
387/* 响应式调整 */
388@media (max-width: 768px) {
389  .live-badge {
390    font-size: 10px;
391    padding: 4px 8px;
392    letter-spacing: 0.02em;
393  }
394}
395
396/* 声音控制按钮容器 */
397.live-sound-toggle {
398  position: absolute;
399  bottom: 12px;
400  right: 12px;
401  width: 30px;
402  height: 30px;
403  background: rgba(0, 0, 0, 0.55);
404  -webkit-backdrop-filter: blur(12px) saturate(180%);
405  backdrop-filter: blur(12px) saturate(180%);
406  border-radius: 50%;
407  display: flex;
408  align-items: center;
409  justify-content: center;
410  z-index: 11;
411  cursor: pointer;
412  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
413  opacity: 0;
414  transform: scale(0.8);
415  /* 注意:这里保留了容器显示的动画,但去掉了内部元素的延迟 */
416  transition: opacity 0.3s ease, transform 0.3s ease;
417  color: white; /* 关键:这会让 SVG 的 currentColor 生效为白色 */
418}
419
420.live-photo-container:hover .live-sound-toggle,
421.live-photo-container.is-playing .live-sound-toggle {
422  opacity: 1;
423  transform: scale(1);
424}
425
426.live-photo-container.is-playing .live-badge::before {
427  background-color: #34c759; /* 变成 iOS 风格的绿色,代表 Active */
428  box-shadow: 0 0 8px rgba(52, 199, 89, 0.6);
429  animation: none; /* 停止加载时的黄色呼吸灯 */
430}
431
432.live-photo-container.is-playing .live-badge {
433  opacity: 0.6; /* 稍微半透明,让用户看清视频角落 */
434  transform: scale(0.95); /* 稍微缩小一点点,显得更精致 */
435  background: rgba(0, 0, 0, 0.4); /* 背景变淡 */
436}
437
438.live-photo-container.is-playing:hover .live-badge {
439  opacity: 1;
440  transform: scale(1);
441}
442
443/* 添加一个小细节:点击时的按压反馈,让用户觉得更顺手 */
444.live-sound-toggle:active {
445  transform: scale(0.9);
446}
447
448/* SVG 显示/隐藏逻辑:采用 display none 实现 0 毫秒瞬间切换,缓解声音卡顿焦虑 */
449.sound-on-icon {
450  display: none;
451}
452
453.sound-off-icon {
454  display: block;
455}
456
457.live-sound-toggle.is-unmuted .sound-on-icon {
458  display: block;
459}
460
461.live-sound-toggle.is-unmuted .sound-off-icon {
462  display: none;
463}
464
465/* 错误占位符基础样式 */
466.live-error-placeholder {
467  display: none; /* 默认隐藏 */
468  width: 100%;
469  height: 200px; /* 默认一个高度,或者根据容器高度 */
470  background: #f5f5f5;
471  align-items: center;
472  justify-content: center;
473  flex-direction: column;
474}
475
476.live-error-placeholder svg {
477  fill: #ccc; /* 灰色图标 */
478  width: 60px !important;
479  height: 60px !important;
480  display: block;
481  margin: 0 auto;
482}
483
484/* 当触发全错状态时 */
485.live-photo-container.is-total-error {
486  width: 60%;
487  max-width: 100%;
488  height: auto;
489  display: block;
490  background: var(--live-error-bg);
491}
492
493.live-photo-container.is-total-error > * {
494  display: none !important;
495}
496
497.live-photo-container.is-total-error .live-error-placeholder {
498  display: flex !important;
499  width: 100%;
500  height: 200px; /* 报错时给个固定高度,避免容器塌陷 */
501  background: var(--live-error-bg);
502  flex-direction: column;
503  align-items: center;
504  justify-content: center;
505}
506
507/* 关键:全错时,强制隐藏所有其他元素,彻底根除“裂开图标” */
508.is-total-error .live-photo-static,
509.is-total-error .live-photo-video,
510.is-total-error .live-badge,
511.is-total-error .live-sound-toggle,
512.is-total-error .live-loading {
513  display: none !important;
514}
515
516.is-total-error a,
517.is-total-error img,
518.is-total-error .caption {
519  display: none !important;
520  opacity: 0 !important;
521  height: 0 !important;
522}
523
524/* 1. 隐藏视频及其交互组件 */
525.is-video-error .live-photo-video,
526.is-video-error .live-badge,
527.is-video-error .live-sound-toggle,
528.is-video-error .live-loading {
529  display: none !important;
530}
531
532/* 2. 关键:解除 Fancybox 链接和图片的绝对定位 */
533/* 因为 HTML 结构是 container -> a -> img */
534.live-photo-container.is-video-error a,
535.live-photo-container.is-video-error .live-photo-static {
536  position: relative !important;
537  display: block !important;
538  top: auto !important;
539  left: auto !important;
540  opacity: 1 !important;
541  pointer-events: auto !important; /* 允许点击放大 */
542  width: 100% !important;
543  height: auto !important;
544}
545
546/* 3. 容器适配:如果是 table 布局,强制在错误时表现为 block 以便撑开 */
547.live-photo-container.is-video-error {
548  display: block !important;
549  height: auto !important;
550  cursor: default;
551  background: transparent;
552}</style><!-- hexo injector head_begin end --><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>半方池水半方田 - Qin's blog</title><meta name="author" content="wuanqin"><meta name="copyright" content="wuanqin"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#fdfdfd"><meta name="description" content="只能懂一点点">
553<meta property="og:type" content="website">
554<meta property="og:title" content="半方池水半方田">
555<meta property="og:url" content="https://blog.uuanqin.top/index.html">
556<meta property="og:site_name" content="半方池水半方田">
557<meta property="og:description" content="只能懂一点点">
558<meta property="og:locale" content="zh_CN">
559<meta property="og:image" content="https://blog.uuanqin.top/image/avatar.webp">
560<meta property="article:author" content="wuanqin">
561<meta property="article:tag" content="技术 生活 个人">
562<meta name="twitter:card" content="summary">
563<meta name="twitter:image" content="https://blog.uuanqin.top/image/avatar.webp">
563<script type="application/ld+json">{
564  "@context": "https://schema.org",
565  "@type": "WebSite",
566  "name": "半方池水半方田",
567  "alternateName": [
568    "Qin's blog",
569    "blog.uuanqin.top"
570  ],
571  "url": "https://blog.uuanqin.top/"
572}</script>
572<link rel="shortcut icon" href="/image/qlogo_100x100.webp"><link rel="canonical" href="https://blog.uuanqin.top/index.html"><link rel="preconnect" href="//unpkg.com"/><link rel="preconnect" href="//hm.baidu.com"/><link rel="preconnect" href="//www.clarity.ms"/><meta name="baidu-site-verification" content="codeva-IupgPifNxU"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/font-awesome/6.6.0/css/all.min.css"><link rel="stylesheet" href="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/node-snackbar/0.1.16/snackbar.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/fancyapps-ui/5.0.17/fancybox/fancybox.min.css" media="print" onload="this.media='all'">
572<script>
573    (() => {
574      
575    const saveToLocal = {
576      set: (key, value, ttl) => {
577        if (!ttl) return
578        const expiry = Date.now() + ttl * 86400000
579        localStorage.setItem(key, JSON.stringify({ value, expiry }))
580      },
581      get: key => {
582        const itemStr = localStorage.getItem(key)
583        if (!itemStr) return undefined
584        const { value, expiry } = JSON.parse(itemStr)
585        if (Date.now() > expiry) {
586          localStorage.removeItem(key)
587          return undefined
588        }
589        return value
590      }
591    }
592
593    window.btf = {
594      saveToLocal,
595      getScript: (url, attr = {}) => new Promise((resolve, reject) => {
596        const script = document.createElement('script')
597        script.src = url
598        script.async = true
599        Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val))
600        script.onload = script.onreadystatechange = () => {
601          if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve()
602        }
603        script.onerror = reject
604        document.head.appendChild(script)
605      }),
606      getCSS: (url, id) => new Promise((resolve, reject) => {
607        const link = document.createElement('link')
608        link.rel = 'stylesheet'
609        link.href = url
610        if (id) link.id = id
611        link.onload = link.onreadystatechange = () => {
612          if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve()
613        }
614        link.onerror = reject
615        document.head.appendChild(link)
616      }),
617      addGlobalFn: (key, fn, name = false, parent = window) => {
618        if (!false && key.startsWith('pjax')) return
619        const globalFn = parent.globalFn || {}
620        globalFn[key] = globalFn[key] || {}
621        globalFn[key][name || Object.keys(globalFn[key]).length] = fn
622        parent.globalFn = globalFn
623      }
624    }
625  
626      
627      const activateDarkMode = () => {
628        document.documentElement.setAttribute('data-theme', 'dark')
629        if (document.querySelector('meta[name="theme-color"]') !== null) {
630          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
631        }
632      }
633      const activateLightMode = () => {
634        document.documentElement.setAttribute('data-theme', 'light')
635        if (document.querySelector('meta[name="theme-color"]') !== null) {
636          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#fdfdfd')
637        }
638      }
639
640      btf.activateDarkMode = activateDarkMode
641      btf.activateLightMode = activateLightMode
642
643      const theme = saveToLocal.get('theme')
644    
645          const hour = new Date().getHours()
646          const isNight = hour <= 8 || hour >= 23
647          if (theme === undefined) isNight ? activateDarkMode() : activateLightMode()
648          else theme === 'light' ? activateLightMode() : activateDarkMode()
649        
650      
651      const asideStatus = saveToLocal.get('aside-status')
652      if (asideStatus !== undefined) {
653        document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide')
654      }
655    
656      
657    const detectApple = () => {
658      if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) {
659        document.documentElement.classList.add('apple')
660      }
661    }
662    detectApple()
663  
664    })()
665  </script>
665<script>var _hmt = _hmt || [];
666(function() {
667  var hm = document.createElement("script");
668  hm.src = "https://hm.baidu.com/hm.js?877eb1cd1993b0865452ed4011fcd2d8";
669  var s = document.getElementsByTagName("script")[0];
670  s.parentNode.insertBefore(hm, s);
671})();
672btf.addGlobalFn('pjaxComplete', () => {
673  _hmt.push(['_trackPageview',window.location.pathname])
674}, 'baidu_analytics')
675</script>
675<script>(function(c,l,a,r,i,t,y){
676    c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
677    t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
678    y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
679})(window, document, "clarity", "script", "gwn59ub66c");
680</script>
680<script>const GLOBAL_CONFIG = {
681  root: '/',
682  algolia: {"appId":"2JINTHATAF","apiKey":"086110423d680367cda9c0216b336eb8","indexName":"blog.uuanqin.top","hitsPerPage":6,"languages":{"hits_empty":"未找到符合您查询的内容:${query}","hits_stats":"找到 ${hits} 条结果,耗时 ${time} 毫秒"}},
683  localSearch: undefined,
684  translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"简"},
685  highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":350,"highlightFullpage":true,"highlightMacStyle":true},
686  copy: {
687    success: '复制成功',
688    error: '复制失败',
689    noSupport: '浏览器不支持'
690  },
691  relativeDate: {
692    homepage: true,
693    post: false
694  },
695  runtime: '',
696  dateSuffix: {
697    just: '刚刚',
698    min: '分钟前',
699    hour: '小时前',
700    day: '天前',
701    month: '个月前'
702  },
703  copyright: undefined,
704  lightbox: 'fancybox',
705  Snackbar: {"chs_to_cht":"已切换为繁体中文","cht_to_chs":"已切换为简体中文","day_to_night":"已切换为深色模式","night_to_day":"已切换为浅色模式","bgLight":"#177ecd","bgDark":"#1f1f1f","position":"top-center"},
706  infinitegrid: {
707    js: 'https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/egjs-infinitegrid/4.12.0/infinitegrid.min.js',
708    buttonText: '加载更多'
709  },
710  isPhotoFigcaption: false,
711  islazyloadPlugin: true,
712  isAnchor: false,
713  percent: {
714    toc: true,
715    rightside: true,
716  },
717  autoDarkmode: false
718}</script>
718<script id="config-diff">var GLOBAL_CONFIG_SITE = {
719  title: '半方池水半方田',
720  isHighlightShrink: false,
721  isToc: false,
722  pageType: 'home'
723}</script>
723<link rel="preconnect" href="https://auth.uuanqin.top/" crossorigin><link rel="stylesheet" href="/css/public/iconfont.css?0424"><link rel="stylesheet" href="/css/iconfont_custom.css">
723<script src="/js/random.js?0409"></script>
723<link rel="stylesheet" href="/css/seamless_card.css"><link rel="stylesheet" href="/css/footer.css?0814"><link rel="stylesheet" href="/css/darktheme_modify.css?0424"><link rel="stylesheet" href="/css/markdown-it-obsidian-callouts.css"><link rel="stylesheet" href="/css/bi-links.css?0906"><link rel="stylesheet" href="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/KaTeX/0.16.9/katex.min.css"><meta name="google-site-verification" content="ppz3zz_ljO3DX-zHwknKzh4A9v_qNLtrhhpSDoCdps8" />
723<script src="/pages_unrendered/ai-chat/ai-chat.js?0916"></script>
723<link rel="stylesheet" href="/css/relation_graph_aside.css"><!-- hexo injector head_end start --><link rel="stylesheet" href="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/Swiper/4.1.6/css/swiper.min.css"><link rel="stylesheet" href="/css/public/swiperstyle.css"><!-- hexo injector head_end end --><meta name="generator" content="Hexo 7.3.0"><link rel="alternate" href="/atom.xml" title="半方池水半方田" type="application/atom+xml">
724</head><body>
724<script>(function() {
725  const waveDuration = 2500;
726  let waveStartTime = sessionStorage.getItem('oceanWaveStartTime');
727  if (!waveStartTime) {
728    waveStartTime = Date.now();
729    sessionStorage.setItem('oceanWaveStartTime', waveStartTime);
730  }
731  const elapsed = (Date.now() - parseInt(waveStartTime)) % waveDuration;
732  document.documentElement.style.setProperty('--wave-offset', '-' + elapsed + 'ms');
733})();
734</script>
734<div id="loading-box"><div class="loading-left-bg"></div><div class="loading-right-bg"></div><div id="loading-hint" onclick="endPreloader()" style="display: none;"><span>点击屏幕任意处直接进入</span><span>桩桩猫在验证你的身份时,被报文段的洪流淹没了</span></div><div class="ocean-wrapper"><div class="ocean"><div class="wave"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 198" width="1600" height="198"><defs><linearGradient id="wave-gradient-1" x1="50%" x2="50%" y1="-10.959%" y2="100%"><stop stop-color="var(--wave-top)" stop-opacity=".25" offset="0%"></stop><stop stop-color="var(--ocean-color)" offset="100%"></stop></linearGradient></defs><path fill="url(#wave-gradient-1)" fill-rule="evenodd" d="M.005 121C311 121 409.898-.25 811 0c400 0 500 121 789 121v77H0s.005-48 .005-77z" transform="matrix(-1 0 0 1 1600 0)"></path></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 198" width="1600" height="198"><path fill="url(#wave-gradient-1)" fill-rule="evenodd" d="M.005 121C311 121 409.898-.25 811 0c400 0 500 121 789 121v77H0s.005-48 .005-77z" transform="matrix(-1 0 0 1 1600 0)"></path></svg></div><div class="wave"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 198" width="1600" height="198"><defs><linearGradient id="wave-gradient-2" x1="50%" x2="50%" y1="-10.959%" y2="100%"><stop stop-color="var(--wave-top)" stop-opacity=".25" offset="0%"></stop><stop stop-color="var(--ocean-color)" offset="100%"></stop></linearGradient></defs><path fill="url(#wave-gradient-2)" fill-rule="evenodd" d="M.005 121C311 121 409.898-.25 811 0c400 0 500 121 789 121v77H0s.005-48 .005-77z" transform="matrix(-1 0 0 1 1600 0)"></path></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 198" width="1600" height="198"><path fill="url(#wave-gradient-2)" fill-rule="evenodd" d="M.005 121C311 121 409.898-.25 811 0c400 0 500 121 789 121v77H0s.005-48 .005-77z" transform="matrix(-1 0 0 1 1600 0)"></path></svg></div></div></div></div>
734<script>(()=>{
735  const $loadingBox = document.getElementById('loading-box')
736  const $loadingHint = document.getElementById('loading-hint')
737  const $body = document.body
738  let hintTimer = null
739  let forceTimer = null
740  const preloader = {
741    endLoading: () => {
742      if (!$loadingBox || $loadingBox.classList.contains('loaded')) return
743
744      if ($loadingHint && $loadingHint.style.display !== 'none') {
745        $loadingHint.classList.add('exit-active')
746      }
747
748      // 清理所有计时器
749      if (hintTimer) clearTimeout(hintTimer)
750      if (forceTimer) clearTimeout(forceTimer)
751
752      $body.style.overflow = ''
753      $loadingBox.classList.add('loaded')
754    },
755    initLoading: () => {
756      $loadingBox.classList.remove('loaded')
757      if (!$loadingHint) return
758
759      $body.style.overflow = 'hidden'
760      $loadingBox.classList.remove('loaded')
761      $loadingBox.classList.remove('allow-skip') // 重置状态
762      if ($loadingHint) {
763        $loadingHint.style.display = 'none'
764        $loadingHint.classList.remove('exit-active') // 重置类名
765      }
766
767      // 手动跳过按钮
768      hintTimer = setTimeout(() => {
769        const currentHint = document.getElementById('loading-hint')
770        const currentBox = document.getElementById('loading-box')
771        if (currentBox && !currentBox.classList.contains('loaded')) {
772          if (currentHint) currentHint.style.display = 'flex'
773          currentBox.classList.add('allow-skip') // 允许点击样式
774
775          // 绑定全屏点击事件
776          currentBox.onclick = () => {
777            preloader.endLoading()
778            currentBox.onclick = null // 点击后解绑
779          }
780        }
781      }, 7000)
782
783      forceTimer = setTimeout(() => {
784        if (!$loadingBox.classList.contains('loaded')) {
785          console.warn('Preloader: 加载超时,强制关闭')
786          preloader.endLoading()
787        }
788      }, 6000)
789    }
790  }
791
792  preloader.initLoading()
793
794  // 注释掉自动移除逻辑
795  // 我们不希望它在 window.onload 时自动消失,我们要手动控制
796  /*
797  if (document.readyState === 'complete') {
798    preloader.endLoading()
799  } else {
800    window.addEventListener('load', preloader.endLoading)
801    document.addEventListener('DOMContentLoaded', preloader.endLoading)
802    // Add timeout protection: force end after 7 seconds
803    setTimeout(preloader.endLoading, 7000)
804  }
805  */
806
807  // 暴露到全局,让外部 JS (Keycloak) 可以调用
808  window.endPreloader = preloader.endLoading
809
810  if (false) {
811    btf.addGlobalFn('pjaxSend', preloader.initLoading, 'preloader_init')
812    btf.addGlobalFn('pjaxComplete', preloader.endLoading, 'preloader_end')
813  }
814})()</script>
814<div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img text-center"><img src="/image/avatar.webp" onerror="this.onerror=null;this.src='/image/loading.gif'" alt="avatar"/></div><div class="site-data text-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">239</div></a><a href="/pages/tags/"><div class="headline">标签</div><div class="length-num">502</div></a><a href="/pages/categories/"><div class="headline">分类</div><div class="length-num">29</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw iconfont icon-nongtian"></i><span> 主页</span></a></div><div class="menus_item"><span class="site-page group"><i class="fa-fw iconfont icon-guanli"></i><span> 归档</span><i class="fas fa-chevron-down"></i></span><ul class="menus_item_child"><li><a class="site-page child" href="/pages/relation-graph/"><i class="fa-fw iconfont icon-guanxitu"></i><span> 关系图</span></a></li><li><a class="site-page child" href="/archives/"><i class="fa-fw iconfont icon-timeAxis"></i><span> 时间轴</span></a></li><li><a class="site-page child" href="/pages/categories/"><i class="fa-fw iconfont icon-2"></i><span> 分类</span></a></li><li><a class="site-page child" href="/pages/tags/"><i class="fa-fw iconfont icon-24gf-tags"></i><span> 标签</span></a></li></ul></div><div class="menus_item"><span class="site-page group"><i class="fa-fw iconfont icon-daimaguanli"></i><span> 项目</span><i class="fas fa-chevron-down"></i></span><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/obsidian2cosma"><i class="fa-fw iconfont icon-xinghao"></i><span> PythonCLI obsidian2cosma</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/waline-link-interceptor"><i class="fa-fw iconfont icon-a-lanjiezudangzhangaiwuzuzhi"></i><span> waline-link-interceptor</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/hexo-filter-titlebased-link"><i class="fa-fw iconfont icon-line-bracketszhongkuohao"></i><span> hexo-filter-titlebased-link</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/markdown-it-obsidian-imgsize"><i class="fa-fw iconfont icon-daxiao"></i><span> markdown-it-obsidian-imgsize</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/busuanzi2waline"><i class="fa-fw iconfont icon-suantou"></i><span> PythonCLI busuanzi2waline</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://greasyfork.org/zh-CN/scripts/466046-%E7%9F%A5%E7%BD%91-%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE-bibtex-%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6"><i class="fa-fw iconfont icon-yinyong"></i><span> UserScripts bibtex-TJU</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/hexo-filter-custom-link"><i class="fa-fw iconfont icon-neibujiekou"></i><span> hexo-filter-custom-link</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/Reactor-Idle-Save-Editor"><i class="fa-fw iconfont icon-hefushe"></i><span> Reactor Idle Save Editor</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:randomPost();" rel="external nofollow noreferrer"><i class="fa-fw iconfont icon-suijibofang"></i><span> 随机</span></a></div><div class="menus_item"><a class="site-page" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.travellings.cn/go-by-clouds.html"><i class="fa-fw iconfont icon-huochepiao"></i><span> 开往</span></a></div><div class="menus_item"><a class="site-page" href="/pages/friends/"><i class="fa-fw iconfont icon-pengyoufill"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/pages/friend_circle/"><i class="fa-fw iconfont icon-pengyouquan"></i><span> 朋友圈</span></a></div><div class="menus_item"><span class="site-page group"><i class="fa-fw iconfont icon-guanfangwangzhan"></i><span> 关于</span><i class="fas fa-chevron-down"></i></span><ul class="menus_item_child"><li><a class="site-page child" href="/pages/about/"><i class="fa-fw iconfont icon-mao"></i><span> 关于本站</span></a></li><li><a class="site-page child" href="/sitemap.xml"><i class="fa-fw iconfont icon-ditu"></i><span> 站点地图</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://pl.uuanqin.top/ui"><i class="fa-fw iconfont icon-w"></i><span> 评论后台</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://uuanqin.instatus.com/"><i class="fa-fw iconfont icon-jiankong"></i><span> 站点状态</span></a></li><li><a class="site-page child" href="/pages/building/"><i class="fa-fw fa-solid fa-road-barrier"></i><span> 测试页</span></a></li></ul></div></div></div></div><div class="page" id="body-wrap"><header class="not-top-img fixed" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/image/logo-bc.webp" alt="Logo"><span class="site-name">
814半方池水半方田</span></a></span><div id="menus"><div id="search-button"><span class="site-page social-icon search"><i class="fas fa-search fa-fw"></i><span> 搜索</span></span></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw iconfont icon-nongtian"></i><span> 主页</span></a></div><div class="menus_item"><span class="site-page group"><i class="fa-fw iconfont icon-guanli"></i><span> 归档</span><i class="fas fa-chevron-down"></i></span><ul class="menus_item_child"><li><a class="site-page child" href="/pages/relation-graph/"><i class="fa-fw iconfont icon-guanxitu"></i><span> 关系图</span></a></li><li><a class="site-page child" href="/archives/"><i class="fa-fw iconfont icon-timeAxis"></i><span> 时间轴</span></a></li><li><a class="site-page child" href="/pages/categories/"><i class="fa-fw iconfont icon-2"></i><span> 分类</span></a></li><li><a class="site-page child" href="/pages/tags/"><i class="fa-fw iconfont icon-24gf-tags"></i><span> 标签</span></a></li></ul></div><div class="menus_item"><span class="site-page group"><i class="fa-fw iconfont icon-daimaguanli"></i><span> 项目</span><i class="fas fa-chevron-down"></i></span><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/obsidian2cosma"><i class="fa-fw iconfont icon-xinghao"></i><span> PythonCLI obsidian2cosma</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/waline-link-interceptor"><i class="fa-fw iconfont icon-a-lanjiezudangzhangaiwuzuzhi"></i><span> waline-link-interceptor</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/hexo-filter-titlebased-link"><i class="fa-fw iconfont icon-line-bracketszhongkuohao"></i><span> hexo-filter-titlebased-link</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/markdown-it-obsidian-imgsize"><i class="fa-fw iconfont icon-daxiao"></i><span> markdown-it-obsidian-imgsize</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/busuanzi2waline"><i class="fa-fw iconfont icon-suantou"></i><span> PythonCLI busuanzi2waline</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://greasyfork.org/zh-CN/scripts/466046-%E7%9F%A5%E7%BD%91-%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE-bibtex-%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6"><i class="fa-fw iconfont icon-yinyong"></i><span> UserScripts bibtex-TJU</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/hexo-filter-custom-link"><i class="fa-fw iconfont icon-neibujiekou"></i><span> hexo-filter-custom-link</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/uuanqin/Reactor-Idle-Save-Editor"><i class="fa-fw iconfont icon-hefushe"></i><span> Reactor Idle Save Editor</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:randomPost();" rel="external nofollow noreferrer"><i class="fa-fw iconfont icon-suijibofang"></i><span> 随机</span></a></div><div class="menus_item"><a class="site-page" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.travellings.cn/go-by-clouds.html"><i class="fa-fw iconfont icon-huochepiao"></i><span> 开往</span></a></div><div class="menus_item"><a class="site-page" href="/pages/friends/"><i class="fa-fw iconfont icon-pengyoufill"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/pages/friend_circle/"><i class="fa-fw iconfont icon-pengyouquan"></i><span> 朋友圈</span></a></div><div class="menus_item"><span class="site-page group"><i class="fa-fw iconfont icon-guanfangwangzhan"></i><span> 关于</span><i class="fas fa-chevron-down"></i></span><ul class="menus_item_child"><li><a class="site-page child" href="/pages/about/"><i class="fa-fw iconfont icon-mao"></i><span> 关于本站</span></a></li><li><a class="site-page child" href="/sitemap.xml"><i class="fa-fw iconfont icon-ditu"></i><span> 站点地图</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://pl.uuanqin.top/ui"><i class="fa-fw iconfont icon-w"></i><span> 评论后台</span></a></li><li><a class="site-page child" target="_blank" rel="noopener external nofollow noreferrer" href="https://uuanqin.instatus.com/"><i class="fa-fw iconfont icon-jiankong"></i><span> 站点状态</span></a></li><li><a class="site-page child" href="/pages/building/"><i class="fa-fw fa-solid fa-road-barrier"></i><span> 测试页</span></a></li></ul></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><h1 class="title-seo">半方池水半方田</h1></header><main class="layout" id="content-inner"><div class="recent-posts nc masonry" id="recent-posts"><div class="recent-post-items"><div class="recent-post-item"><div class="post_cover"><a href="/p/83e94555/" title="小球称重问题及其引申的思考"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202606060505478.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="小球称重问题及其引申的思考"></a></div><div class="recent-post-info"><a class="article-title" href="/p/83e94555/" title="小球称重问题及其引申的思考">小球称重问题及其引申的思考</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-06-06T18:43:40.000Z" title="发表于 2026-06-06 18:43:40">2026-06-06</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-06-06T23:19:45.000Z" title="更新于 2026-06-06 23:19:45">2026-06-06</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E6%95%B0%E5%AD%A6/">数学</a></span></div><div class="content">这个编码法是怎么想出来的</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/1a18533a/" title="蓝色的结构色"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202606041739326.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="蓝色的结构色"></a></div><div class="recent-post-info"><a class="article-title" href="/p/1a18533a/" title="蓝色的结构色">蓝色的结构色</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-06-04T01:58:41.000Z" title="发表于 2026-06-04 01:58:41">2026-06-04</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-06-08T00:45:18.000Z" title="更新于 2026-06-08 00:45:18">2026-06-08</time></span></div><div class="content">既常见又特殊</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/e65d5d53/" title="病毒是不是生物?"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/2026051
81470316130.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="病毒是不是生物?"></a></div><div class="recent-post-info"><a class="article-title" href="/p/e65d5d53/" title="病毒是不是生物?">病毒是不是生物?</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-05-17T01:34:08.000Z" title="发表于 2026-05-17 01:34:08">2026-05-17</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-17T04:40:29.000Z" title="更新于 2026-05-17 04:40:29">2026-05-17</time></span></div><div class="content">一篇小小的探究</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/6be57bc5/" title="把博客发布交给 GitHub Actions"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202605102024375.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="把博客发布交给 GitHub Actions"></a></div><div class="recent-post-info"><a class="article-title" href="/p/6be57bc5/" title="把博客发布交给 GitHub Actions">把博客发布交给 GitHub Actions</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-05-10T19:40:14.000Z" title="发表于 2026-05-10 19
814:40:14">2026-05-10</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-11T01:53:26.000Z" title="更新于 2026-05-11 01:53:26">2026-05-11</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">3 年后才想起来要改造?</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/bddedde3/" title="省外居民身份证的补换领(苏州)"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604280026432.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="省外居民身份证的补换领(苏州)"></a></div><div class="recent-post-info"><a class="article-title" href="/p/bddedde3/" title="省外居民身份证的补换领(苏州)">省外居民身份证的补换领(苏州)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-27T23:24:53.000Z" title="发表于 2026-04-27 23:24:53">2026-04-27</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-14T02:38:58.000Z" title="更新于 2026-05-14 02:38:58">2026-05-14</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E7%99%BE%E5%91%B3%E4%BA%BA%E7%94%9F/">百味人生</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E7%99%BE%E5%91%B3%E4%BA%BA%E7%94%9F/%E7%A4%BE%E4%BC%9A%E7%94%9F%E6%B4%BB/">社会生活</a></span></div><div class="content">非常方便快速的办证流程,希望邮寄也要很快速。</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/9c61131/" title="hexo-filter-titlebased-link:构建你的数字花园"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604241536499.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="hexo-filter-titlebased-link:构建你的数字花园"></a></div><div class="recent-post-info"><a class="article-title" href="/p/9c61131/" title="hexo-filter-titlebased-link:构建你的数字花园">hexo-filter-titlebased-link:构建你的数字花园</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-24T21:14:24.000Z" title="发表于 2026-04-24 21:14:24">2026-04-24</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-09T06:45:35.000Z" title="更新于 2026-05-09 06:45:35">2026-05-09</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">为 Hexo 数字花园的实现提供了可能</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/11ce9d57/" title="Vercel 应用实践学习"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604211550776.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="Vercel 应用实践学习"></a></div><div class="recent-post-info"><a class="article-title" href="/p/11ce9d57/" title="Vercel 应用实践学习">Vercel 应用实践学习</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-21T16:06:40.000Z" title="发表于 2026-04-21 16:06:40">2026-04-21</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-24T08:43:07.000Z" title="更新于 2026-04-24 08:43:07">2026-04-24</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%B7%A5%E7%A8%8B/">工程</a></span></div><div class="content">Vercel 应用实践记录集</div></div></div><div class="recent-post-item"><div class="post_cover">
814<a href="/p/9d81ea9f/" title="通过与 Keycloak 配合实现博客文章的受限访问功能"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604201838815.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="通过与 Keycloak 配合实现博客文章的受限访问功能"></a></div><div class="recent-post-info"><a class="article-title" href="/p/9d81ea9f/" title="通过与 Keycloak 配合实现博客文章的受限访问功能">通过与 Keycloak 配合实现博客文章的受限访问功能</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-20T19:38:56.000Z" title="发表于 2026-04-20 19:38:56">2026-04-20</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-23T17:21:44.000Z" title="更新于 2026-04-23 17:21:44">2026-04-23</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">自由输出内容园地的最后一块砖?</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/6472cf77/" title="非公开的文章 Soft Mode"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604201508619.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="非公开的文章 Soft Mode"></a></div><div class="recent-post-info"><a class="article-title" href="/p/6472cf77/" title="非公开的文章 Soft Mode">非公开的文章 Soft Mode</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-17T22:06:48.000Z" title="发表于 2026-04-17 22:06:48">2026-04-17</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-23T17:21:44.000Z" title="更新于 2026-04-23 17:21:44">2026-04-23</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E9%98%BF-%E6%B5%8B%E8%AF%95%E6%96%87%E7%AB%A0/">阿-测试文章</a></span></div><div class="content">Soft 效果的文章加密测试。</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/cb840d58/" title="非公开的文章 Strict Mode"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604201510420.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="非公开的文章 Strict Mode"></a></div><div class="recent-post-info"><a class="article-title" href="/p/cb840d58/" title="非公开的文章 Strict Mode">非公开的文章 Strict Mode</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-17T22:06:48.000Z" title="发表于 2026-04-17 22:06:48">2026-04-17</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-23T17:21:44.000Z" title="更新于 2026-04-23 17:21:44">2026-04-23</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E9%98%BF-%E6%B5%8B%E8%AF%95%E6%96%87%E7%AB%A0/">阿-测试文章</a></span></div><div class="content">Strict 效果的文章加密测试。</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/da4ac563/" title="试试用代码块在 Hexo 中插入实况照片"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604142323499.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="试试用代码块在 Hexo 中插入实况照片"></a></div><div class="recent-post-info"><a class="article-title" href="/p/da4ac563/" title="试试用代码块在 Hexo 中插入实况照片">试试用代码块在 Hexo 中插入实况照片</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-15T04:01:27.000Z" title="发表于 2026-04-15 04:01:27">2026-04-15</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-05T17:36:40.000Z" title="更新于 2026-05-05 17:36:40">2026-05-05</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">例行的插件推广文,不过这篇文章参杂了很多开发杂记</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/6338f82f/" title="动态图片测试"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/ezgif-5901921d3f722129260414(1)dfsfdf.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="动态图片测试"></a></div><div class="recent-post-info"><a class="article-title" href="/p/6338f82f/" title="动态图片测试">动态图片测试</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-14T21:36:40.000Z" title="发表于 2026-04-14 21:36:40">2026-04-14</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-18T15:03:55.000Z" title="更新于 2026-04-18 15:03:55">2026-04-18</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E9%98%BF-%E6%B5%8B%E8%AF%95%E6%96%87%E7%AB%A0/">阿-测试文章</a></span></div><div class="content">用于测试插件 hexo-filter-live-photo</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/85371005/" title="Hexo-Butterfly 主题 Preloader 加载页定制"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604122346780.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="Hexo-Butterfly 主题 Preloader 加载页定制"></a></div><div class="recent-post-info"><a class="article-title" href="/p/85371005/" title="Hexo-Butterfly 主题 Preloader 加载页定制">Hexo-Butterfly 主题 Preloader 加载页定制</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-13T02:00:01.000Z" title="发表于 2026-04-13 02:00:01">2026-04-13</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-09T06:45:35.000Z" title="更新于 2026-05-09 06:45:35">2026-05-09</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">改造原版主题代码,提升扩展性</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/131c2726/" title="Keycloak 的部署以及 Hexo-Butterfly 网页应用的接入"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604090356813.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="Keycloak 的部署以及 Hexo-Butterfly 网页应用的接入"></a></div><div class="recent-post-info"><a class="article-title" href="/p/131c2726/" title="Keycloak 的部署以及 Hexo-Butterfly 网页应用的接入">Keycloak 的部署以及 Hexo-Butterfly 网页应用的接入</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-09T04:05:44.000Z" title="发表于 2026-04-09 04:05:44">2026-04-09</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-11T22:16:05.000Z" title="更新于 2026-05-11 22:16:05">2026-05-11</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">AI Coding的一次实践,为授权文章功能做基础</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/717b7000/" title="随机访问文章的实现(Sitemap+本地缓存优化)"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202604072317388.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="随机访问文章的实现(Sitemap+本地缓存优化)"></a></div><div class="recent-post-info"><a class="article-title" href="/p/717b7000/" title="随机访问文章的实现(Sitemap+本地缓存优化)">随机访问文章的实现(Sitemap+本地缓存优化)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-04-07T23:07:00.000Z" title="发表于 2026-04-07 23:07:00">2026-04-07</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-10T18:33:38.000Z" title="更新于 2026-05-10 18:33:38">2026-05-10</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Hexo/">Hexo</a></span></div><div class="content">AI 增强博客网站的案例</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/7146cec9/" title="Authentik 的部署记录"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202603230025669.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="Authentik 的部署记录"></a></div><div class="recent-post-info"><a class="article-title" href="/p/7146cec9/" title="Authentik 的部署记录">Authentik 的部署记录</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-03-20T19:49:53.000Z" title="发表于 2026-03-20 19:49:53">2026-03-20</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-08T19:46:39.000Z" title="更新于 2026-04-08 19:46:39">2026-04-08</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%B7%A5%E7%A8%8B/">工程</a></span></div><div class="content">最后还是有坑</div></div></div><div class="recent-post-item"><div class="post_cover"><a href="/p/c7d4d021/" title="Waline 自建 Auth 认证"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202603162244501.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="Waline 自建 Auth 认证"></a></div><div class="recent-post-info"><a class="article-title" href="/p/c7d4d021/" title="Waline 自建 Auth 认证">Waline 自建 Auth 认证</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-03-19T17:25:03.000Z" title="发表于 2026-03-19 17:25:03">2026-03-19</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-04-08T19:46:39.000Z" title="更新于 2026-04-08 19:46:39">2026-04-08</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/">博客站点维护</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/Waline/">Waline</a></span></div><div class="content">Waline 自定义第三方认证,是接入博客统一认证登录系统的开始</div></div></div><div class="recent-post-item"><div class="post_cover">
814<a href="/p/2fa44e03/" title="记一次行李托运理赔流程(南航)"><img class="post-bg" src="https://cdn.gallery.uuanqin.top/img/202603142155896.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="记一次行李托运理赔流程(南航)"></a></div><div class="recent-post-info"><a class="article-title" href="/p/2fa44e03/" title="记一次行李托运理赔流程(南航)">记一次行李托运理赔流程(南航)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time class="post-meta-date-created" datetime="2026-03-14T22:10:50.000Z" title="发表于 2026-03-14 22:10:50">2026-03-14</time><span class="article-meta-separator">|</span><i class="fas fa-history"></i><span class="article-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-05-11T02:31:07.000Z" title="更新于 2026-05-11 02:31:07">2026-05-11</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E7%99%BE%E5%91%B3%E4%BA%BA%E7%94%9F/">百味人生</a><i class="fas fa-angle-right article-meta-link"></i><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/pages/categories/%E7%99%BE%E5%91%B3%E4%BA%BA%E7%94%9F/%E7%A4%BE%E4%BC%9A%E7%94%9F%E6%B4%BB/">社会生活</a></span></div><div class="content">权益是要靠自己去争取的</div></div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><span class="space">&hellip;</span><a class="page-number" href="/page/14/#content-inner">14</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info text-center"><div class="avatar-img"><img src="/image/avatar.webp" onerror="this.onerror=null;this.src='/image/loading.gif'" alt="avatar"/></div><div class="author-info-name">wuanqin</div><div class="author-info-description">只能懂一点点</div><div class="site-data"><a href="/archives/"><div class="headline">文章</div><div class="length-num">239</div></a><a href="/pages/tags/"><div class="headline">标签</div><div class="length-num">502</div></a><a href="/pages/categories/"><div class="headline">分类</div><div class="length-num">29</div></a></div><div class="card-info-social-icons"><a class="social-icon" href="https://github.com/uuanqin" rel="external nofollow noreferrer" target="_blank" title="Github"><i class="fa-brands fa-github"></i></a><a class="social-icon" href="/cdn-cgi/l/email-protection#522727333c233b3c122727333c233b3c7c263d22" target="_blank" title="Email"><i class="fa-solid fa-at"></i></a><a class="social-icon" href="/atom.xml" target="_blank" title="RSS"><i class="fa-solid fa-rss"></i></a><a class="social-icon" href="https://app.follow.is/share/users/uuanqin" rel="external nofollow noreferrer" target="_blank" title="Follow"><i class="fa-solid fa-square-rss"></i></a><a class="social-icon" href="https://steamcommunity.com/id/uuanqin/" rel="external nofollow noreferrer" target="_blank" title="Steam"><i class="fa-brands fa-steam"></i></a></div></div><!-- 暂时不设置主题开关(全部硬编码)--><div class="card-login text-center"><div class="kc-user-btn-container" id="kcUserContainer"><!-- 🔥 改为新ID:card-login-btn--><a id="kc-default-btn" href="javascript:;" rel="external nofollow noreferrer"><i class="fa-solid fa-address-card"></i><span id="kcBtnText">统一认证登录</span></a><div class="kc-hover-menu"><a id="kc-profile-btn">查看信息</a><a class="kc-logout-btn" id="kc-logout-btn">退出登录</a></div></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content"><div>
815    💼博主上班了,博客维护周期拉长。崭新版本的博客提上日程,在不久的将来就会和大家见面!<br>
816    🌏国内外访问本站的速度更快了!<br>
817    🛡️账单保卫战:本站已接入边缘防御。<br>
818</div></div></div><div class="card-widget seamless-card card-knowledge-graph"><div class="item-headline"><i></i><span></span></div><div class="item-content"><div id="aside-graph-container" style="width: 100%; height: 300px; position: relative;">
819  <div id="aside-graph-loading" style="position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); color:#999; font-size:12px;">
820    加载中...
821  </div>
822</div>
823</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/p/1a18533a/" title="蓝色的结构色"><img src="https://cdn.gallery.uuanqin.top/img/202606041739326.webp" onerror="this.onerror=null;this.src='/image/404img.webp'" alt="蓝色的结构色"/></a><div class="content"><a class="title" href="/p/1a18533a/" title="蓝色的结构色">蓝色的结构色</a><time datetime="2026-06-08T00:45:18.000Z" title="更新于 2026-06-08 00:45:18">2026-06-08</time></div></div></div></div><div class="card-widget" id="card-newest-comments"><div class="item-headline"><i class="fas fa-comment-dots"></i><span>最新评论</span></div><div class="aside-list"><span>加载中...</span></div></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">239</div></div><div class="webinfo-item"><div class="item-name">本站总字数 :</div><div class="item-count">574.3k</div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2026-08-23T16:23:30.094Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div class="footer-other"><div class="footer-copyright"></div><div class="footer_custom_text"><div>
824    <div class='my-footer-svg-div'>
825        <svg class='my-footer-wave-svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 100'
826             preserveAspectRatio='none'>
827            <path class='my-footer-wave-path'
828                  d='M851.8,100c125,0,288.3-45,348.2-64V0H0v44c3.7-1,7.3-1.9,11-2.9C80.7,22,151.7,10.8,223.5,6.3C276.7,2.9,330,4,383,9.8 c52.2,5.7,103.3,16.2,153.4,32.8C623.9,71.3,726.8,100,851.8,100z'></path>
829        </svg>
830    </div>
831    <div class='my-footer-content-div'>
832        <div class='my-footer-content'>
833            <div class='my-footer-content-column'>
834                <div class='my-footer-logo'>
835                    <a class='my-footer-logo-link' href='#'>
836                        <span class='hidden-link-text'>LOGO</span>
837                        <img src='/image/footer/qlogo_white_no_words.png' style='height:40%; width:40%'>
838                    </a>
839                </div>
840                <div class='my-footer-menu'>
841                    <h2 class='my-footer-menu-name'>开始</h2>
842                    <ul id='menu-get-started' class='my-footer-menu-list'>
843                        <li class='menu-item menu-item-type-post_type menu-item-object-product'>
844                            <a href='/pages/about/'>关于本站</a>
845                        </li>
846                    </ul>
847                </div>
848            </div>
849            <div class='my-footer-content-column'>
850                <div class='my-footer-menu'>
851                    <h2 class='my-footer-menu-name'>快速链接</h2>
852                    <ul id='menu-company' class='my-footer-menu-list'>
853                        <li class='menu-item menu-item-type-post_type menu-item-object-product'>
854                            <a target="_blank" rel="noopener external nofollow noreferrer" href='https://hexo.io/zh-cn/'>Hexo</a>&nbsp;⨯&nbsp;<a
855                                target="_blank" rel="noopener" href='https://github.com/jerryc127/hexo-theme-butterfly'>Butterfly</a>
856                        </li>
857                        <li class='menu-item menu-item-type-taxonomy menu-item-object-category'>
858                            <a href='/archives/'>时间轴</a>&nbsp;|&nbsp;<a
859                                href='/pages/relation-graph/'>关系图</a>&nbsp;|&nbsp;<a
860                                href='/pages/categories/'>分类</a>
861                        </li>
862                        <li class='menu-item menu-item-type-post_type menu-item-object-product'>
863                            <a href='/p/91b7dad/'>同款页脚</a>
864                        </li>
865                        <li class='menu-item menu-item-type-post_type menu-item-object-product'>
866                            <a href='https://www.foreverblog.cn/' rel='noopener external nofollow noreferrer'
867                               target='_blank'> <img class='img-foreverblog'
868                                                     src='/image/footer/forever_logo_en_default_white.png' alt=''
869                                                     style='width:auto;height:21px;margin-top:6px'> </a>
870                        </li>
871                    </ul>
872                </div>
873
874            </div>
875
876            <div class='my-footer-content-column'>
877                <div class='my-footer-menu'>
878                    <h2 class='my-footer-menu-name'>法律声明</h2>
879                    <ul id='menu-legal' class='my-footer-menu-list'>
880                        <li class='menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-170434'>
881                            <a href='/pages/privacy/'>隐私政策</a>
882                        </li>
883                    </ul>
884                </div>
885                <div class='my-footer-call-to-action'>
886                    <h2 class='my-footer-call-to-action-title'>联系本站</h2>
887                    <ul id='menu-contact' class='my-footer-menu-list'>
888                        <li class='menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-170434'>
889                            <a href='/pages_unrendered/wechatOA/index.html'>微信公众号</a>
890                        </li>
891
892                        <li class='menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-170434'>
893                            <a class='my-footer-call-to-action-link' href="/cdn-cgi/l/email-protection#a0d5d5c1ced1c9cee0d5d5c1ced1c9ce8ed4cfd0" target='_self'>
894                                uuan<span style='display:none'>@</span>qi<!-- >@ -->n@<span
895                                    style='display:none'>@</span>uu<!-- >@. -->an<span style='display:none'>@</span>qin.top
896                            </a>
897                        </li>
898
899                    </ul>
900                </div>
901
902            </div>
903            <div class='my-footer-content-column'>
904                <ul id='menu-copyright' class='my-footer-menu-list'>
905                    <li class='menu-item menu-item-type-post_type menu-item-object-product'>
906                        <a href='https://notbyai.fyi/' target='_blank' rel='external nofollow noopener noreferrer'><img
907                                class='img-not-ai' src='/image/footer/Written-By-Human-Not-By-AI-Badge-white.svg'
908                                alt='Written by Human, Not by AI'></a>
909                    </li>
910                    <li class='menu-item menu-item-type-post_type menu-item-object-product'>
911                        <a href='/pages/copyright/'><img src='/image/footer/by-nc-sa.svg'
912                                                      alt='署名-非商业性使用-相同方式共享 4.0 国际'></a>
913                    </li>
914
915                    <li class='menu-item menu-item-type-post_type menu-item-object-product'>
916                        ©2022-
vendor: 108 bytes, line 916
916<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
916<script>document.write(new Date().getFullYear())</script>
916 By wuanqin
917                    </li>
918                </ul>
919            </div>
920
921            <div class='my-footer-social-links'>
922                <svg class='my-footer-social-amoeba-svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 236 54'>
923                    <path class='my-footer-social-amoeba-path'
924                          d='M223.06,43.32c-.77-7.2,1.87-28.47-20-32.53C187.78,8,180.41,18,178.32,20.7s-5.63,10.1-4.07,16.7-.13,15.23-4.06,15.91-8.75-2.9-6.89-7S167.41,36,167.15,33a18.93,18.93,0,0,0-2.64-8.53c-3.44-5.5-8-11.19-19.12-11.19a21.64,21.64,0,0,0-18.31,9.18c-2.08,2.7-5.66,9.6-4.07,16.69s.64,14.32-6.11,13.9S108.35,46.5,112,36.54s-1.89-21.24-4-23.94S96.34,0,85.23,0,57.46,8.84,56.49,24.56s6.92,20.79,7,24.59c.07,2.75-6.43,4.16-12.92,2.38s-4-10.75-3.46-12.38c1.85-6.6-2-14-4.08-16.69a21.62,21.62,0,0,0-18.3-9.18C13.62,13.28,9.06,19,5.62,24.47A18.81,18.81,0,0,0,3,33a21.85,21.85,0,0,0,1.58,9.08,16.58,16.58,0,0,1,1.06,5A6.75,6.75,0,0,1,0,54H236C235.47,54,223.83,50.52,223.06,43.32Z'></path>
925                </svg>
926                <a class='my-footer-social-link github' href='https://github.com/uuanqin' target='_blank'
927                   rel='external nofollow noopener noreferrer'>
928                    <span class='hidden-link-text'>Github</span>
929                    <svg class='my-footer-social-icon-svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'>
930                        <path class='my-footer-social-icon-path'
931                              d='M 16 4 C 9.371094 4 4 9.371094 4 16 C 4 21.300781 7.4375 25.800781 12.207031 27.386719 C 12.808594 27.496094 13.027344 27.128906 13.027344 26.808594 C 13.027344 26.523438 13.015625 25.769531 13.011719 24.769531 C 9.671875 25.492188 8.96875 23.160156 8.96875 23.160156 C 8.421875 21.773438 7.636719 21.402344 7.636719 21.402344 C 6.546875 20.660156 7.71875 20.675781 7.71875 20.675781 C 8.921875 20.761719 9.554688 21.910156 9.554688 21.910156 C 10.625 23.746094 12.363281 23.214844 13.046875 22.910156 C 13.15625 22.132813 13.46875 21.605469 13.808594 21.304688 C 11.144531 21.003906 8.34375 19.972656 8.34375 15.375 C 8.34375 14.0625 8.8125 12.992188 9.578125 12.152344 C 9.457031 11.851563 9.042969 10.628906 9.695313 8.976563 C 9.695313 8.976563 10.703125 8.65625 12.996094 10.207031 C 13.953125 9.941406 14.980469 9.808594 16 9.804688 C 17.019531 9.808594 18.046875 9.941406 19.003906 10.207031 C 21.296875 8.65625 22.300781 8.976563 22.300781 8.976563 C 22.957031 10.628906 22.546875 11.851563 22.421875 12.152344 C 23.191406 12.992188 23.652344 14.0625 23.652344 15.375 C 23.652344 19.984375 20.847656 20.996094 18.175781 21.296875 C 18.605469 21.664063 18.988281 22.398438 18.988281 23.515625 C 18.988281 25.121094 18.976563 26.414063 18.976563 26.808594 C 18.976563 27.128906 19.191406 27.503906 19.800781 27.386719 C 24.566406 25.796875 28 21.300781 28 16 C 28 9.371094 22.628906 4 16 4 Z '></path>
932                    </svg>
933                </a>
934                <a class='my-footer-social-link email' href="/cdn-cgi/l/email-protection#403535212e31292e003535212e31292e6e342f30" target='_blank' rel='external nofollow noopener noreferrer'>
935                    <span class='hidden-link-text'>Email</span>
936                    <svg class='my-footer-social-icon-svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'>
937                        <!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
938                        <path class='my-footer-social-icon-path'
939                              d='M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z' />
940                    </svg>
941                </a>
942                <a class='my-footer-social-link follow' href='https://app.follow.is/share/users/uuanqin' target='_blank'
943                   rel='external nofollow noopener noreferrer'>
944                    <span class='hidden-link-text'>Folo</span>
945                    <svg class='my-footer-social-icon-svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'>
946                        <!--!Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
947                        <path class='my-footer-social-icon-path'
948                              d='M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM96 136c0-13.3 10.7-24 24-24c137 0 248 111 248 248c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-200-200-200c-13.3 0-24-10.7-24-24zm0 96c0-13.3 10.7-24 24-24c83.9 0 152 68.1 152 152c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104c-13.3 0-24-10.7-24-24zm0 120a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z' />
949                    </svg>
950                </a>
951                <a class='my-footer-social-link rss' href='/atom.xml' target='_blank'
952                   rel='external nofollow noopener noreferrer'>
953                    <span class='hidden-link-text'>RSS</span>
954                    <svg class='my-footer-social-icon-svg' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'>
955                        <!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
956                        <path class='my-footer-social-icon-path'
957                              d='M0 64C0 46.3 14.3 32 32 32c229.8 0 416 186.2 416 416c0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96C14.3 96 0 81.7 0 64zM0 416a64 64 0 1 1 128 0A64 64 0 1 1 0 416zM32 160c159.1 0 288 128.9 288 288c0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224c-17.7 0-32-14.3-32-32s14.3-32 32-32z' />
958                    </svg>
959                </a>
960
961            </div>
962        </div>
963    </div>
964    <div class='my-footer-copyright'>
965        <div class='my-footer-copyright-wrapper'>
966            <p class='my-footer-copyright-text'>
967                <a target="_blank" href='https://beian.miit.gov.cn/' rel="noopener external nofollow noreferrer noopener"><img class='icp-icon'
968                                                                                                      src='/image/footer/icp.ico'><span>津ICP备2022002156号-1</span></a>
969                &nbsp;|&nbsp;<a target="_blank" href='http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=12011202000621'
970                                rel="noopener external nofollow noreferrer noopener"><img class='icp-icon'
971                                                                                 src='/image/footer/beian_logo.png'><span>津公网安备 12011202000621号</span></a>
972                &nbsp;|&nbsp;&nbsp;
973                <span>违法与不良信息举报邮箱&nbsp;
974                  j<span style='display:none'>@</span><!-- >@ -->b@<span style='display:none'>@</span>uu<!-- >@. -->an<span style='display:none'>@</span>q.in
975                </span>
976            </p>
977        </div>
978    </div>
979</div></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="translateLink" type="button" title="简繁转换">简</button><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="ai-button" type="button" title="博客智能体"><i class="fas fa-cube"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div>
vendor: 108 bytes, line 979
979<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
979<script src="/js/utils.js"></script>
979<script src="/js/main.js"></script>
979<script src="/js/tw_cn.js"></script>
979<script src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/fancyapps-ui/5.0.17/fancybox/fancybox.umd.js"></script>
979<script src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/instant.page/5.2.0/instantpage.min.js" type="module"></script>
979<script src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/vanilla-lazyload/19.1.3/lazyload.iife.min.js"></script>
979<script src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/node-snackbar/0.1.16/snackbar.min.js"></script>
979<div class="js-pjax">
979<script>(() => {
980  const parseViewBox = viewBox => {
981    if (!viewBox) return null
982    const parts = viewBox.trim().split(/[\s,]+/).map(n => Number(n))
983    return (parts.length === 4 && !parts.some(n => Number.isNaN(n))) ? parts : null
984  }
985
986  const getSvgViewBox = svg => {
987    const attr = parseViewBox(svg.getAttribute('viewBox'))
988    if (attr) return attr
989
990    // Fallback: use bbox to build a viewBox
991    try {
992      const bbox = svg.getBBox()
993      if (bbox && bbox.width && bbox.height) return [bbox.x, bbox.y, bbox.width, bbox.height]
994    } catch (e) {
995      // getBBox may fail on some edge cases; ignore
996    }
997
998    const w = Number(svg.getAttribute('width')) || 0
999    const h = Number(svg.getAttribute('height')) || 0
1000    return (w > 0 && h > 0) ? [0, 0, w, h] : [0, 0, 100, 100]
1001  }
1002
1003  const setSvgViewBox = (svg, vb) => {
1004    svg.setAttribute('viewBox', `${vb[0]} ${vb[1]} ${vb[2]} ${vb[3]}`)
1005  }
1006
1007  const clamp = (v, min, max) => Math.max(min, Math.min(max, v))
1008
1009  const openSvgInNewTab = ({ source, initViewBox }) => {
1010    const getClonedSvg = () => {
1011      if (typeof source === 'string') {
1012        const template = document.createElement('template')
1013        template.innerHTML = source.trim()
1014        return template.content.querySelector('svg')?.cloneNode(true)
1015      }
1016      return source?.cloneNode?.(true)
1017    }
1018    const clone = getClonedSvg()
1019    if (!clone) return
1020    if (initViewBox) clone.setAttribute('viewBox', initViewBox.join(' '))
1021    if (!clone.getAttribute('xmlns')) clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg')
1022
1023    const isDark = document.documentElement.getAttribute('data-theme') === 'dark'
1024    const bg = getComputedStyle(document.body).backgroundColor || (isDark ? '#1e1e1e' : '#ffffff')
1025    clone.style.background = bg
1026
1027    const svgSource = new XMLSerializer().serializeToString(clone)
1028    const blob = new Blob([svgSource], { type: 'image/svg+xml;charset=utf-8' })
1029    const url = URL.createObjectURL(blob)
1030    window.open(url, '_blank', 'noopener')
1031    setTimeout(() => URL.revokeObjectURL(url), 30000)
1032  }
1033
1034  const zoomAtPoint = (vb, factor, px, py) => {
1035    const w = vb[2] * factor
1036    const h = vb[3] * factor
1037    const nx = px - (px - vb[0]) * factor
1038    const ny = py - (py - vb[1]) * factor
1039    return [nx, ny, w, h]
1040  }
1041
1042  const initMermaidGestures = (wrap, svg) => {
1043    const initVb = getSvgViewBox(svg)
1044    wrap.__mermaidInitViewBox = initVb
1045    wrap.__mermaidCurViewBox = initVb.slice()
1046    setSvgViewBox(svg, initVb)
1047
1048    if (wrap.__mermaidGestureBound) return
1049    wrap.__mermaidGestureBound = true
1050
1051    const clientToViewBox = (clientX, clientY) => {
1052      const rect = svg.getBoundingClientRect()
1053      const vb = wrap.__mermaidCurViewBox
1054      const x = vb[0] + (clientX - rect.left) * (vb[2] / rect.width)
1055      const y = vb[1] + (clientY - rect.top) * (vb[3] / rect.height)
1056      return { x, y }
1057    }
1058
1059    const setCurVb = vb => {
1060      const init = wrap.__mermaidInitViewBox
1061      vb[2] = clamp(vb[2], init[2] * 0.1, init[2] * 10)
1062      vb[3] = clamp(vb[3], init[3] * 0.1, init[3] * 10)
1063      wrap.__mermaidCurViewBox = vb
1064      setSvgViewBox(svg, vb)
1065    }
1066
1067    svg.addEventListener('wheel', e => {
1068      if (!e.ctrlKey && !e.metaKey) return
1069      e.preventDefault()
1070      const { x, y } = clientToViewBox(e.clientX, e.clientY)
1071      setCurVb(zoomAtPoint(wrap.__mermaidCurViewBox.slice(), e.deltaY > 0 ? 1.1 : 0.9, x, y))
1072    }, { passive: false })
1073
1074    svg.addEventListener('dblclick', () => {
1075      wrap.__mermaidCurViewBox = wrap.__mermaidInitViewBox.slice()
1076      setSvgViewBox(svg, wrap.__mermaidCurViewBox)
1077    })
1078  }
1079
1080  const runMermaid = ele => {
1081    // 移除了 injectStyles 调用
1082    const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'default'
1083
1084    ele.forEach((item, index) => {
1085      const mermaidSrc = item.querySelector('.mermaid-src')
1086      const previewZone = item.querySelector('.mermaid-preview-container')
1087      const sourceZone = item.querySelector('.mermaid-source-container')
1088      const tabBtns = item.querySelectorAll('.mermaid-tab-btn')
1089      const openBtn = item.querySelector('.mermaid-open-btn')
1090
1091      previewZone.innerHTML = ''
1092
1093      const config = mermaidSrc.dataset.config ? JSON.parse(mermaidSrc.dataset.config) : {}
1094      if (!config.theme) config.theme = theme
1095      const mermaidDefinition = `%%{init: ${JSON.stringify(config)}}%%\n` + mermaidSrc.textContent
1096
1097      mermaid.render(`mermaid-${index}`, mermaidDefinition).then(({ svg }) => {
1098        previewZone.innerHTML = svg
1099        const svgEle = previewZone.querySelector('svg')
1100        item.__mermaidOriginalSvg = svg
1101        initMermaidGestures(item, svgEle)
1102
1103        openBtn.onclick = () => openSvgInNewTab({ source: svgEle, initViewBox: item.__mermaidInitViewBox })
1104
1105        tabBtns.forEach(btn => {
1106          btn.onclick = () => {
1107            tabBtns.forEach(b => b.classList.remove('active'))
1108            btn.classList.add('active')
1109            if (btn.dataset.type === 'preview') {
1110              previewZone.style.display = 'flex'
1111              sourceZone.style.display = 'none'
1112            } else {
1113              previewZone.style.display = 'none'
1114              sourceZone.style.display = 'block'
1115            }
1116          }
1117        })
1118      })
1119    })
1120  }
1121
1122  const codeToMermaid = () => {
1123    const codeMermaidEle = document.querySelectorAll('pre > code.mermaid')
1124    codeMermaidEle.forEach(ele => {
1125      const rawCode = ele.textContent
1126      const wrapper = document.createElement('div')
1127      wrapper.className = 'mermaid-wrap'
1128      wrapper.innerHTML = `
1129        <div class="mermaid-header">
1130          <div class="mermaid-tabs">
1131            <button class="mermaid-tab-btn active" data-type="preview">预览</button>
1132            <button class="mermaid-tab-btn" data-type="source">源码</button>
1133          </div>
1134          <button class="mermaid-open-btn" title="查看原图"><i class="fa fa-search fa-fw"></i></button>
1135        </div>
1136        <div class="mermaid-preview-container"></div>
1137        <div class="mermaid-source-container"><pre><code>${rawCode.replace(/</g, '&lt;')}</code></pre></div>
1138        <pre class="mermaid-src" hidden>${rawCode}</pre>
1139      `
1140      ele.parentNode.replaceWith(wrapper)
1141    })
1142  }
1143
1144  const loadMermaid = () => {
1145    if (true) codeToMermaid()
1146    const $mermaid = document.querySelectorAll('.mermaid-wrap')
1147    if ($mermaid.length === 0) return
1148
1149    const runMermaidFn = () => runMermaid($mermaid)
1150    btf.addGlobalFn('themeChange', runMermaidFn, 'mermaid')
1151    window.loadMermaid ? runMermaidFn() : btf.getScript('https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/mermaid/11.9.0/mermaid.min.js').then(runMermaidFn)
1152  }
1153
1154  btf.addGlobalFn('encrypt', loadMermaid, 'mermaid')
1155  window.pjax ? loadMermaid() : document.addEventListener('DOMContentLoaded', loadMermaid)
1156})()</script>
1156</div>
1156<script>window.newestComments = {
1157  changeContent: content => {
1158    if (content === '') return content
1159
1160    content = content.replace(/<img.*?src="(.*?)"?[^\>]+>/ig, '[图片]') // replace image link
1161    content = content.replace(/<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[链接]') // replace url
1162    content = content.replace(/<pre><code>.*?<\/pre>/gi, '[代码]') // replace code
1163    content = content.replace(/<code>.*?<\/code>/gi, '[代码]') // replace code
1164    content = content.replace(/<[^>]+>/g, "") // remove html tag
1165
1166    if (content.length > 150) {
1167      content = content.substring(0, 150) + '...'
1168    }
1169    return content
1170  },
1171
1172  generateHtml: (array, ele) => {
1173    let result = ''
1174
1175    if (array.length) {
1176      for (let i = 0; i < array.length; i++) {
1177        result += '<div class="aside-list-item">'
1178
1179        if (true && array[i].avatar) {
1180          const imgAttr = 'data-lazy-src'
1181          const lazyloadNative = ''
1182          result += `<a href="${array[i].url}" class="thumbnail"><img ${imgAttr}="${array[i].avatar}" alt="${array[i].nick}" ${lazyloadNative}></a>`
1183        }
1184
1185        result += `<div class="content">
1186        <a class="comment" href="${array[i].url}" title="${array[i].content}">${array[i].content}</a>
1187        <div class="name"><span>${array[i].nick} / </span><time datetime="${array[i].date}">${btf.diffDate(array[i].date, true)}</time></div>
1188        </div></div>`
1189      }
1190    } else {
1191      result += '暂无评论'
1192    }
1193
1194    ele.innerHTML = result
1195    window.lazyLoadInstance && window.lazyLoadInstance.update()
1196    window.pjax && window.pjax.refresh(ele)
1197  },
1198
1199  newestCommentInit: (name, getComment) => {
1200    const $dom = document.querySelector('#card-newest-comments .aside-list')
1201    if ($dom) {
1202      const data = btf.saveToLocal.get(name)
1203      if (data) {
1204        newestComments.generateHtml(JSON.parse(data), $dom)
1205      } else {
1206        getComment($dom)
1207      }
1208    }
1209  },
1210
1211  run: (name, getComment) => {
1212    newestComments.newestCommentInit(name, getComment)
1213    btf.addGlobalFn('pjaxComplete', () => newestComments.newestCommentInit(name, getComment), name)
1214  }
1215}</script>
1215<script>window.addEventListener('load', () => {
1216  const keyName = 'waline-newest-comments'
1217  const { changeContent, generateHtml, run } = window.newestComments
1218
1219  const getComment = async (ele) => {
1220    try {
1221      const res = await fetch('https://pl.uuanqin.top/api/comment?type=recent&count=4')
1222      const result = await res.json()
1223      const walineArray = result.data.map(e => {
1224        return {
1225          'content': changeContent(e.comment),
1226          'avatar': e.avatar,
1227          'nick': e.nick,
1228          'url': e.url + '#' + e.objectId,
1229          'date': e.time || e.insertedAt
1230        }
1231      })
1232      btf.saveToLocal.set(keyName, JSON.stringify(walineArray), 10/(60*24))
1233      generateHtml(walineArray, ele)
1234    } catch (err) {
1235      console.error(err)
1236      ele.textContent= "无法获取评论,请确认相关配置是否正确"
1237    }
1238  }
1239
1240  run(keyName, getComment)
1241})</script>
1241<script src="/js/gray_page.js"></script>
1241<script src="/js/bi-links.js?0424"></script>
1241<script src="/js/genuine_website_verification4.js"></script>
1241<script src="/js/ai-summary-effect.js"></script>
1241<script src="/js/public/crypto-js.min.js"></script>
1241<script src="/js/public/keycloak-25.0.6.min.js"></script>
1241<script src="/js/keycloak-auth.js"></script>
1241<script src="/js/keycloak-pageLock.js"></script>
1241<script src="/js/public/force-graph.min.js"></script>
1241<script src="/js/public/d3.v7.min.js"></script>
1241<script src="/js/relation_graph_aside.js"></script>
1241<div id="algolia-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><i class="fas fa-spinner fa-pulse" id="loading-status" hidden="hidden"></i><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div id="algolia-search-input"><div class="ais-SearchBox"><form class="ais-SearchBox-form" action="" role="search" novalidate=""><input class="ais-SearchBox-input" type="search" placeholder="搜索文章" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" maxlength="512" aria-label="Search"/><button class="ais-SearchBox-submit" type="submit" title="Submit the search query" style="display:none;"><svg class="ais-SearchBox-submitIcon" width="10" height="10" viewBox="0 0 40 40" aria-hidden="true"><path d="M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z"></path></svg></button></form></div><hr/><div id="algolia-search-results"><div id="algolia-hits"><div id="algolia-hits-empty" style="display:none;"></div><div class="ais-Hits" style="display:none;"><ol class="ais-Hits-list"></ol></div></div><div class="ais-Pagination" id="algolia-pagination" style="display:none;"><ul class="ais-Pagination-list"></ul></div><div id="algolia-info"><span class="ais-Stats-text"></span><a class="algolia-poweredBy" href="https://www.algolia.com/?utm_source=algoliasearch.js&amp;utm_medium=website&amp;utm_content=localhost&amp;utm_campaign=poweredby" target="_blank" aria-label="Search by Algolia" rel="noopener noreferrer"><svg class="ais-PoweredBy-logo" height="1.2em" viewBox="0 0 572 64" style="width: auto;"><path fill="#36395A" d="M16 48.3c-3.4 0-6.3-.6-8.7-1.7A12.4 12.4 0 0 1 1.9 42C.6 40 0 38 0 35.4h6.5a6.7 6.7 0 0 0 3.9 6c1.4.7 3.3 1.1 5.6 1.1 2.2 0 4-.3 5.4-1a7 7 0 0 0 3-2.4 6 6 0 0 0 1-3.4c0-1.5-.6-2.8-1.9-3.7-1.3-1-3.3-1.6-5.9-1.8l-4-.4c-3.7-.3-6.6-1.4-8.8-3.4a10 10 0 0 1-3.3-7.9c0-2.4.6-4.6 1.8-6.4a12 12 0 0 1 5-4.3c2.2-1 4.7-1.6 7.5-1.6s5.5.5 7.6 1.6a12 12 0 0 1 5 4.4c1.2 1.8 1.8 4 1.8 6.7h-6.5a6.4 6.4 0 0 0-3.5-5.9c-1-.6-2.6-1-4.4-1s-3.2.3-4.4 1c-1.1.6-2 1.4-2.6 2.4-.5 1-.8 2-.8 3.1a5 5 0 0 0 1.5 3.6c1 1 2.6 1.7 4.7 1.9l4 .3c2.8.2 5.2.8 7.2 1.8 2.1 1 3.7 2.2 4.9 3.8a9.7 9.7 0 0 1 1.7 5.8c0 2.5-.7 4.7-2 6.6a13 13 0 0 1-5.6 4.4c-2.4 1-5.2 1.6-8.4 1.6Zm35.6 0c-2.6 0-4.8-.4-6.7-1.3a13 13 0 0 1-4.7-3.5 17.1 17.1 0 0 1-3.6-10.4v-1c0-2 .3-3.8 1-5.6a13 13 0 0 1 7.3-8.3 15 15 0 0 1 6.3-1.4A13.2 13.2 0 0 1 64 24.3c1 2.2 1.6 4.6 1.6 7.2V34H39.4v-4.3h21.8l-1.8 2.2c0-2-.3-3.7-.9-5.1a7.3 7.3 0 0 0-2.7-3.4c-1.2-.7-2.7-1.1-4.6-1.1s-3.4.4-4.7 1.3a8 8 0 0 0-2.9 3.6c-.6 1.5-.9 3.3-.9 5.4 0 2 .3 3.7 1 5.3a7.9 7.9 0 0 0 2.8 3.7c1.3.8 3 1.3 5 1.3s3.8-.5 5.1-1.3c1.3-1 2.1-2 2.4-3.2h6a11.8 11.8 0 0 1-7 8.7 16 16 0 0 1-6.4 1.2ZM80 48c-2.2 0-4-.3-5.7-1a8.4 8.4 0 0 1-3.7-3.3 9.7 9.7 0 0 1-1.3-5.2c0-2 .5-3.8 1.5-5.2a9 9 0 0 1 4.3-3.1c1.8-.7 4-1 6.7-1H89v4.1h-7.5c-2 0-3.4.5-4.4 1.4-1 1-1.6 2.1-1.6 3.6s.5 2.7 1.6 3.6c1 1 2.5 1.4 4.4 1.4 1.1 0 2.2-.2 3.2-.7 1-.4 1.9-1 2.6-2 .6-1 1-2.4 1-4.2l1.7 2.1c-.2 2-.7 3.8-1.5 5.2a9 9 0 0 1-3.4 3.3 12 12 0 0 1-5.3 1Zm9.5-.7v-8.8h-1v-10c0-1.8-.5-3.2-1.4-4.1-1-1-2.4-1.4-4.2-1.4a142.9 142.9 0 0 0-10.2.4v-5.6a74.8 74.8 0 0 1 8.6-.4c3 0 5.5.4 7.5 1.2s3.4 2 4.4 3.6c1 1.7 1.4 4 1.4 6.7v18.4h-5Zm12.9 0V17.8h5v12.3h-.2c0-4.2 1-7.4 2.8-9.5a11 11 0 0 1 8.3-3.1h1v5.6h-2a9 9 0 0 0-6.3 2.2c-1.5 1.5-2.2 3.6-2.2 6.4v15.6h-6.4Zm34.4 1a15 15 0 0 1-6.6-1.3c-1.9-.9-3.4-2-4.7-3.5a15.5 15.5 0 0 1-2.7-5c-.6-1.7-1-3.6-1-5.4v-1c0-2 .4-3.8 1-5.6a15 15 0 0 1 2.8-4.9c1.3-1.5 2.8-2.6 4.6-3.5a16.4 16.4 0 0 1 13.3.2c2 1 3.5 2.3 4.8 4a12 12 0 0 1 2 6H144c-.2-1.6-1-3-2.2-4.1a7.5 7.5 0 0 0-5.2-1.7 8 8 0 0 0-4.7 1.3 8 8 0 0 0-2.8 3.6 13.8 13.8 0 0 0 0 10.3c.6 1.5 1.5 2.7 2.8 3.6s2.8 1.3 4.8 1.3c1.5 0 2.7-.2 3.8-.8a7 7 0 0 0 2.6-2c.7-1 1-2 1.2-3.2h6.2a11 11 0 0 1-2 6.2 
124115.1 15.1 0 0 1-11.8 5.5Zm19.7-1v-40h6.4V31h-1.3c0-3 .4-5.5 1.1-7.6a9.7 9.7 0 0 1 3.5-4.8A9.9 9.9 0 0 1 172 17h.3c3.5 0 6 1.1 7.9 3.5 1.7 2.3 2.6 5.7 2.6 10v16.8h-6.4V29.6c0-2.1-.6-3.8-1.8-5a6.4 6.4 0 0 0-4.8-1.8c-2 0-3.7.7-5 2a7.8 7.8 0 0 0-1.9 5.5v17h-6.4Zm63.8 1a12.2 12.2 0 0 1-10.9-6.2 19 19 0 0 1-1.8-7.3h1.4v12.5h-5.1v-40h6.4v19.8l-2 3.5c.2-3.1.8-5.7 1.9-7.7a11 11 0 0 1 4.4-4.5c1.8-1 3.9-1.5 6.1-1.5a13.4 13.4 0 0 1 12.8 9.1c.7 1.9 1 3.8 1 6v1c0 2.2-.3 4.1-1 6a13.6 13.6 0 0 1-13.2 9.4Zm-1.2-5.5a8.4 8.4 0 0 0 7.9-5c.7-1.5 1.1-3.3 1.1-5.3s-.4-3.8-1.1-5.3a8.7 8.7 0 0 0-3.2-3.6 9.6 9.6 0 0 0-9.2-.2 8.5 8.5 0 0 0-3.3 3.2c-.8 1.4-1.3 3-1.3 5v2.3a9 9 0 0 0 1.3 4.8 9 9 0 0 0 3.4 3c1.4.7 2.8 1 4.4 1Zm27.3 3.9-10-28.9h6.5l9.5 28.9h-6Zm-7.5 12.2v-5.7h4.9c1 0 2-.1 2.9-.4a4 4 0 0 0 2-1.4c.4-.7.9-1.6 1.2-2.7l8.6-30.9h6.2l-9.3 32.4a14 14 0 0 1-2.5 5 8.9 8.9 0 0 1-4 2.8c-1.5.6-3.4.9-5.6.9h-4.4Zm9-12.2v-5.2h6.4v5.2H248Z"></path><path fill="#003DFF" d="M534.4 9.1H528a.8.8 0 0 1-.7-.7V1.8c0-.4.2-.7.6-.8l6.5-1c.4 0 .8.2.9.6v7.8c0 .4-.4.7-.8.7zM428 35.2V.8c0-.5-.3-.8-.7-.8h-.2l-6.4 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.5 0 .8-.4.8-.8V43c0-.4-.3-.7-.6-.8-4.5-.5-4.5-6-4.5-7zm106.5-21.8H528c-.4 0-.7.4-.7.8v34c0 .4.3.8.7.8h6.5c.4 0 .8-.4.8-.8v-34c0-.5-.4-.8-.8-.8zm-17.7 21.8V.8c0-.5-.3-.8-.8-.8l-6.5 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.4 0 .8-.4.8-.8V43c0-.4-.3-.7-.7-.8-4.4-.5-4.4-6-4.4-7zm-22.2-20.6a16.5 16.5 0 0 1 8.6 9.3c.8 2.2 1.3 4.8 1.3 7.5a19.4 19.4 0 0 1-4.6 12.6 14.8 14.8 0 0 1-5.2 3.6c-2 .9-5.2 1.4-6.8 1.4a21 21 0 0 1-6.7-1.4 15.4 15.4 0 0 1-8.6-9.3 21.3 21.3 0 0 1 0-14.4 15.2 15.2 0 0 1 8.6-9.3c2-.8 4.3-1.2 6.7-1.2s4.6.4 6.7 1.2zm-6.7 27.6c2.7 0 4.7-1 6.2-3s2.2-4.3 2.2-7.8-.7-6.3-2.2-8.3-3.5-3-6.2-3-4.7 1-6.1 3c-1.5 2-2.2 4.8-2.2 8.3s.7 5.8 2.2 7.8 3.5 3 6.2 3zm-88.8-28.8c-6.2 0-11.7 3.3-14.8 8.2a18.6 18.6 0 0 0 4.8 25.2c1.8 1.2 4 1.8 6.2 1.7s.1 0 .1 0h.9c4.2-.7 8-4 9.1-8.1v7.4c0 .4.3.7.8.7h6.4a.7.7 0 0 0 .7-.7V14.2c0-.5-.3-.8-.7-.8h-13.5zm6.3 26.5a9.8 9.8 0 0 1-5.7 2h-.5a10 10 0 0 1-9.2-14c1.4-3.7 5-6.3 9-6.3h6.4v18.3zm152.3-26.5h13.5c.5 0 .8.3.8.7v33.7c0 .4-.3.7-.8.7h-6.4a.7.7 0 0 1-.8-.7v-7.4c-1.2 4-4.8 7.4-9 8h-.1a4.2 4.2 0 0 1-.5.1h-.9a10.3 10.3 0 0 1-7-2.6c-4-3.3-6.5-8.4-6.5-14.2 0-3.7 1-7.2 3-10 3-5 8.5-8.3 14.7-8.3zm.6 28.4c2.2-.1 4.2-.6 5.7-2V21.7h-6.3a9.8 9.8 0 0 0-9 6.4 10.2 10.2 0 0 0 9.1 13.9h.5zM452.8 13.4c-6.2 0-11.7 3.3-14.8 8.2a18.5 18.5 0 0 0 3.6 24.3 10.4 10.4 0 0 0 13 .6c2.2-1.5 3.8-3.7 4.5-6.1v7.8c0 2.8-.8 5-2.2 6.3-1.5 1.5-4 2.2-7.5 2.2l-6-.3c-.3 0-.7.2-.8.5l-1.6 5.5c-.1.4.1.8.5 1h.1c2.8.4 5.5.6 7 .6 6.3 0 11-1.4 14-4.1 2.7-2.5 4.2-6.3 4.5-11.4V14.2c0-.5-.4-.8-.8-.8h-13.5zm6.3 8.2v18.3a9.6 9.6 0 0 1-5.6 2h-1a10.3 10.3 0 0 1-8.8-14c1.4-3.7 5-6.3 9-6.3h6.4zM291 31.5A32 32 0 0 1 322.8 0h30.8c.6 0 1.2.5 1.2 1.2v61.5c0 1.1-1.3 1.7-2.2 1l-19.2-17a18 18 0 0 1-11 3.4 18.1 18.1 0 1 1 18.2-14.8c-.1.4-.5.7-.9.6-.1 0-.3 0-.4-.2l-3.8-3.4c-.4-.3-.6-.8-.7-1.4a12 12 0 1 0-2.4 8.3c.4-.4 1-.5 1.6-.2l14.7 13.1v-46H323a26 26 0 1 0 10 49.7c.8-.4 1.6-.2 2.3.3l3 2.7c.3.2.3.7 0 1l-.2.2a32 32 0 0 1-47.2-28.6z"></path></svg></a></div></div></div></div><div id="search-mask"></div>
1241<script src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/algoliasearch/4.25.2/algoliasearch-lite.umd.js"></script>
1241<script src="/js/search/algolia.js"></script>
1241</div></div><!-- hexo injector body_end start -->
1241<script>// LivePhoto类,管理单个Live Photo的行为
1242class HexoLivePhoto {
1243  constructor(container, config) {
1244    this.container = container;
1245    this.staticImage = container.querySelector(".live-photo-static");
1246    this.video = container.querySelector(".live-photo-video");
1247    this.config = config;
1248    this.hasAutoPlayed = false;
1249    this.isPlaying = false;
1250    this.hoverTimeout = null;
1251    this.badgeTimer = null; // 显式声明计时器
1252    this.isWeixin = /micromessenger/i.test(navigator.userAgent);
1253    this.imgFailed = false;
1254    this.videoFailed = false;
1255    this.soundToggle = container.querySelector(".live-sound-toggle");
1256    // 在微信环境中调整配置
1257    if (this.isWeixin && this.config.weixin_disable_autoplay) {
1258      this.config.autoplay = false;
1259
1260      // 修改微信环境下的badge
1261      this.modifyWeixinBadge();
1262    }
1263
1264    // 绑定事件
1265    this.bindEvents();
1266  }
1267
1268  // 修改微信环境下的badge
1269  modifyWeixinBadge() {
1270    let badge = this.container.querySelector(".live-badge");
1271
1272    // 如果没有badge,创建一个
1273    if (!badge && this.config.badge) {
1274      badge = document.createElement("div");
1275      badge.className = `live-badge ${
1276        this.config.badge_position || "bottom-left"
1277      }`;
1278      this.container.appendChild(badge);
1279    }
1280
1281    // 修改badge内容和样式
1282    if (badge) {
1283      if (!this.config.badge_text) {
1284        badge.innerHTML = "Click to Play";
1285      } else {
1286        badge.innerHTML = this.config.badge_text + " | Click to Play";
1287      }
1288    }
1289  }
1290
1291  // 绑定事件
1292  bindEvents() {
1293    // 桌面端:鼠标悬停播放
1294    if (this.config.hover_to_play) {
1295      this.container.addEventListener("mouseenter", () =>
1296        this.handleHoverStart()
1297      );
1298      this.container.addEventListener("mouseleave", () =>
1299        this.handleHoverEnd()
1300      );
1301    }
1302
1303    // 点击事件 - 在微信环境中这是主要的交互方式
1304    if (this.config.click_to_play) {
1305      this.container.addEventListener("click", () => {
1306        this.play();
1307      });
1308    }
1309
1310    // 监听视频结束事件
1311    this.video.addEventListener("ended", () => this.stop());
1312
1313    // 监听视频加载事件
1314    // this.video.addEventListener("loadstart", () => this.showLoading());
1315    // this.video.addEventListener("canplay", () => this.hideLoading());
1316    this.video.addEventListener("error", () => {
1317      this.container.classList.remove('is-loading');
1318      this.stop();
1319    });
1320
1321    // 当视频因为加载而暂停时触发
1322    this.video.addEventListener("waiting", () => {
1323      this.container.classList.add('is-loading');
1324    });
1325
1326    // 当视频真正开始播放(画面在动)时触发
1327    this.video.addEventListener("playing", () => {
1328      if (this.badgeTimer) clearTimeout(this.badgeTimer);
1329      this.container.classList.remove('is-loading');
1330      // 只有在图片没坏的情况下,才去做这种淡出效果
1331      if (!this.imgFailed) {
1332        this.staticImage.style.opacity = 0;
1333      }
1334      this.video.classList.add("playing");
1335      this.container.classList.add('is-playing');
1336    });
1337
1338    // 声音点击事件
1339    if (this.soundToggle) {
1340      this.soundToggle.addEventListener("click", (e) => {
1341        e.preventDefault();   // 【新增】
1342        e.stopPropagation();
1343        this.toggleSound();
1344      });
1345    }
1346
1347    // 图片加载失败:隐藏图片,防止出现浏览器默认的“裂开”图标
1348    this.staticImage.onerror = () => {
1349      this.imgFailed = true;
1350      this.staticImage.style.opacity = '0';
1351      this.staticImage.style.visibility = 'hidden';
1352      this.checkTotalFailure();
1353    };
1354
1355    // 视频加载失败
1356    this.video.onerror = () => {
1357      this.videoFailed = true;
1358      this.checkTotalFailure();
1359    };
1360  }
1361
1362  checkTotalFailure() {
1363    // 判断图片是否失效:包括加载失败、src为空、或者是那个1x1的透明占位符
1364    const isImgInvalid = this.imgFailed ||
1365      !this.staticImage.src ||
1366      this.staticImage.src.includes('data:image/gif');
1367
1368    if (this.videoFailed) {
1369      if (isImgInvalid) {
1370        // 情况 A:全错(视频坏了 + 图片也坏了)
1371        this.container.classList.add('is-total-error');
1372        this.container.classList.remove('is-video-error'); // 必须移除,防止干扰 CSS
1373      } else {
1374        // 情况 B:仅视频错(视频坏了 + 图片是好的)
1375        this.container.classList.add('is-video-error');
1376        this.container.classList.remove('is-total-error');
1377      }
1378    } else {
1379      // 如果视频没坏,确保这两个错误类都不存在
1380      this.container.classList.remove('is-total-error', 'is-video-error');
1381    }
1382  }
1383
1384  // 处理悬停开始
1385  handleHoverStart() {
1386    // 清除之前的超时
1387    if (this.hoverTimeout) clearTimeout(this.hoverTimeout);
1388
1389    // 设置延迟播放
1390    this.hoverTimeout = setTimeout(() => {
1391      this.play();
1392    }, this.config.hover_delay || 300);
1393  }
1394
1395  // 处理悬停结束
1396  handleHoverEnd() {
1397    // 清除悬停超时
1398    if (this.hoverTimeout) {
1399      clearTimeout(this.hoverTimeout);
1400      this.hoverTimeout = null;
1401    }
1402
1403    // 如果视频是循环播放的(loop),鼠标移开必须立刻停止,否则声音和画面会在后台无限消耗
1404    if (this.video.loop) {
1405      // 鼠标离开时,我们不停止视频,而是“静音”它
1406      // 这样画面会继续循环播放,但声音会消失,解决了你担心的扰民问题
1407      this.video.muted = true;
1408      if (this.soundToggle) {
1409        this.soundToggle.classList.remove("is-unmuted");
1410      }
1411    }
1412  }
1413
1414  // 显示加载指示器
1415  showLoading() {
1416    let loadingEl = this.container.querySelector(".live-loading");
1417    if (!loadingEl && this.config.loading_animation) {
1418      loadingEl = document.createElement("div");
1419      loadingEl.className = "live-loading";
1420      this.container.appendChild(loadingEl);
1421    }
1422    if (loadingEl) {
1423      loadingEl.style.display = "block";
1424    }
1425  }
1426
1427  // 隐藏加载指示器
1428  hideLoading() {
1429    const loadingEl = this.container.querySelector(".live-loading");
1430    if (loadingEl) {
1431      loadingEl.style.display = "none";
1432    }
1433  }
1434
1435  // 播放视频
1436  play() {
1437    if (this.isPlaying) return;
1438    this.isPlaying = true;
1439
1440    const playPromise = this.video.play();
1441
1442    if (playPromise !== undefined) {
1443      playPromise.catch(error => {
1444        // 处理由于浏览器策略导致的播放失败(如需要手动点击)
1445        console.warn("Live-Photo Play Interrupted:", error);
1446        this.stop();
1447      });
1448    }
1449  }
1450
1451  // 停止播放
1452  stop() {
1453    if (this.badgeTimer) clearTimeout(this.badgeTimer);
1454    this.container.classList.remove('is-loading');
1455    this.container.classList.remove('is-playing');
1456    this.video.classList.remove("playing");
1457    this.staticImage.style.opacity = 1;
1458    this.isPlaying = false;
1459    // 强制回到视频开头,方便下次播放
1460    this.video.pause();
1461    // 只有非 loop 视频才重置时间,loop 视频让它在后台静音跑
1462    if (!this.video.loop) {
1463      this.video.currentTime = 0;
1464    }
1465    // 静音只启动一次
1466    this.video.muted = true;
1467    this.soundToggle.classList.remove("is-unmuted");
1468  }
1469
1470  // 自动播放(当进入视口时)
1471  autoPlay() {
1472    if (!this.hasAutoPlayed && this.config.autoplay) {
1473      this.hasAutoPlayed = true;
1474      this.play();
1475    }
1476  }
1477
1478
1479  // 添加声音切换方法
1480  toggleSound() {
1481    if (!this.video) return;
1482
1483    // 切换静音状态
1484    this.video.muted = !this.video.muted;
1485
1486    // 更新 UI 状态
1487    if (this.video.muted) {
1488      this.soundToggle.classList.remove("is-unmuted");
1489    } else {
1490      this.soundToggle.classList.add("is-unmuted");
1491      // 如果切换到有声且当前没在播,尝试播放(处理移动端静音自动播放后的手动开启)
1492      if (this.video.paused) {
1493        this.play();
1494      }
1495    }
1496  }
1497}
1498
1499// 页面主控制器
1500class HexoLivePhotoPage {
1501  constructor(config) {
1502    this.config = config;
1503    this.livePhotos = new Map();
1504    this.observer = null;
1505    this.isWeixin = /micromessenger/i.test(navigator.userAgent);
1506    this.init();
1507  }
1508
1509  // 初始化
1510  init() {
1511    this.detectLivePhotos();
1512
1513    // 检测是否为微信环境
1514    // const isWeixin = navigator.userAgent
1515    //   .toLowerCase()
1516    //   .includes("micromessenger");
1517
1518    // 如果在微信环境中且禁用自动播放,则不设置Intersection Observer
1519    if (this.isWeixin && this.config.weixin_disable_autoplay) {
1520      return;
1521    }
1522
1523    // 如果启用懒加载,设置Intersection Observer
1524    if (this.config.lazy_load) {
1525      this.setupIntersectionObserver();
1526    } else if (this.config.autoplay) {
1527      // 如果不使用懒加载,直接自动播放所有
1528      this.livePhotos.forEach((livePhoto) => livePhoto.autoPlay());
1529    }
1530  }
1531
1532  // 检测页面中的所有Live Photo容器
1533  detectLivePhotos() {
1534    const containers = document.querySelectorAll(".live-photo-container");
1535
1536    containers.forEach((container) => {
1537      // 检查是否已经初始化过
1538      if (!container.dataset.initialized) {
1539        const livePhoto = new HexoLivePhoto(container, this.config);
1540        this.livePhotos.set(container, livePhoto);
1541        container.dataset.initialized = "true";
1542      }
1543    });
1544  }
1545
1546  // 设置Intersection Observer
1547  setupIntersectionObserver() {
1548    if (this.observer) {
1549      this.observer.disconnect();
1550    }
1551
1552    this.observer = new IntersectionObserver(
1553      (entries) => {
1554        entries.forEach((entry) => {
1555          const container = entry.target;
1556          const livePhoto = this.livePhotos.get(container);
1557          if (!livePhoto) return;
1558
1559          if (entry.isIntersecting) {
1560            // 进入屏幕:自动播放
1561            livePhoto.autoPlay();
1562            if (!this.config.keep_observing) {
1563              this.observer.unobserve(container);
1564            }
1565          } else if (livePhoto.isPlaying) {
1566            // 移出屏幕时,必须强制停止播放
1567            livePhoto.stop();
1568          }
1569        });
1570      },
1571      {
1572        threshold: this.config.threshold || 0.1,
1573        rootMargin: "0px 0px 10% 0px",
1574      }
1575    );
1576
1577    this.livePhotos.forEach((_, el) => this.observer.observe(el));
1578  }
1579}
1580
1581// 当DOM加载完成后初始化
1582document.addEventListener("DOMContentLoaded", function () {
1583  if (window.HexoLivePhotoConfig && window.HexoLivePhotoConfig.enable) {
1584    window.hexoLivePhotoPage = new HexoLivePhotoPage(window.HexoLivePhotoConfig);
1585  }
1586});
1587</script>
1587 
1587<script data-pjax>if(document.getElementById('recent-posts') && (location.pathname ==='/'|| '/' ==='all')){
1588    var parent = document.getElementById('recent-posts');
1589    var child = '<div class="recent-post-item" style="width:100%;height: auto"><div id="catalog_magnet"><div class="magnet_item"><a class="magnet_link" href="/pages/categories/博客站点维护/"><div class="magnet_link_context" style=""><span style="font-weight:500;flex:1">🎨 博客维护与美化 (54)</span><span style="padding:0px 4px;border-radius: 8px;"><i class="fas fa-arrow-circle-right"></i></span></div></a></div><div class="magnet_item"><a class="magnet_link" href="/pages/categories/高质量代码及设计模式/"><div class="magnet_link_context" style=""><span style="font-weight:500;flex:1">🔷 代码质量 (26)</span><span style="padding:0px 4px;border-radius: 8px;"><i class="fas fa-arrow-circle-right"></i></span></div></a></div><div class="magnet_item"><a class="magnet_link" href="/pages/categories/百味人生/"><div class="magnet_link_context" style=""><span style="font-weight:500;flex:1">🏄‍♂️ 热爱生活 (22)</span><span style="padding:0px 4px;border-radius: 8px;"><i class="fas fa-arrow-circle-right"></i></span></div></a></div><div class="magnet_item"><a class="magnet_link" href="/pages/categories/嵌入式/"><div class="magnet_link_context" style=""><span style="font-weight:500;flex:1">🧩 嵌入式开发 (16)</span><span style="padding:0px 4px;border-radius: 8px;"><i class="fas fa-arrow-circle-right"></i></span></div></a></div><div class="magnet_item"><a class="magnet_link" href="/pages/categories/技术学习/"><div class="magnet_link_context" style=""><span style="font-weight:500;flex:1">🧑‍💻 桩桩猫学技术 (14)</span><span style="padding:0px 4px;border-radius: 8px;"><i class="fas fa-arrow-circle-right"></i></span></div></a></div><div class="magnet_item"><a class="magnet_link" href="/pages/categories/算法与数据结构/"><div class="magnet_link_context" style=""><span style="font-weight:500;flex:1">🧮 算法日记 (27)</span><span style="padding:0px 4px;border-radius: 8px;"><i class="fas fa-arrow-circle-right"></i></span></div></a></div><a class="magnet_link_more"  href="/pages/categories/" style="flex:1;text-align: center;margin-bottom: 10px;">查看更多...</a></div></div>';
1590    console.log('已挂载magnet')
1591    parent.insertAdjacentHTML("afterbegin",child)}
1592     </script>
1592<style>#catalog_magnet{flex-wrap: wrap;display: flex;width:100%;justify-content:space-between;padding: 10px 10px 0 10px;align-content: flex-start;}.magnet_item{flex-basis: calc(33.333333333333336% - 5px);background: #f2f2f2;margin-bottom: 10px;border-radius: 8px;transition: all 0.2s ease-in-out;}.magnet_item:hover{background: #669900}.magnet_link_more{color:#555}.magnet_link{color:black}.magnet_link:hover{color:white}@media screen and (max-width: 600px) {.magnet_item {flex-basis: 100%;}}.magnet_link_context{display:flex;padding: 10px;font-size:16px;transition: all 0.2s ease-in-out;}.magnet_link_context:hover{padding: 10px 20px;}</style>
1593    <style></style> 
1593<script data-pjax>if(document.getElementById('recent-posts') && location.pathname =='/'){
1594    
1595    var parent = document.getElementById('recent-posts');
1596    var child = '<div class="recent-post-item" style="height: auto;width: 100%"><div class="blog-slider swiper-container-fade swiper-container-horizontal" id="swiper_container"><div class="blog-slider__wrp swiper-wrapper" style="transition-duration: 0ms"><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms"><div class="blog-slider__img"><img src="https://cdn.gallery.uuanqin.top/img/202604241536499.webp" alt="https://cdn.gallery.uuanqin.top/img/202604241536499.webp"/></div><div class="blog-slider__content"><span class="blog-slider__code">2026-04-24</span><a class="blog-slider__title" href="p/9c61131/">hexo-filter-titlebased-link:构建你的数字花园</a><div class="blog-slider__text">你一定想看</div><a class="blog-slider__button" href="p/9c61131/">详情</a></div></div>
1596<div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms"><div class="blog-slider__img"><img src="https://cdn.gallery.uuanqin.top/img/hexoobsidian-Grammar.webp" alt="https://cdn.gallery.uuanqin.top/img/hexoobsidian-Grammar.webp"/></div><div class="blog-slider__content"><span class="blog-slider__code">2023-08-01</span><a class="blog-slider__title" href="p/d4bc55f2/">Hexo 博客适配 Obsidian 新语法</a><div class="blog-slider__text">你可能在寻找这篇文章</div><a class="blog-slider__button" href="p/d4bc55f2/">详情</a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms"><div class="blog-slider__img"><img src="https://cdn.gallery.uuanqin.top/img/202408042352584.webp" alt="https://cdn.gallery.uuanqin.top/img/202408042352584.webp"/></div><div class="blog-slider__content"><span class="blog-slider__code">2024-08-04</span><a class="blog-sl
1596ider__title" href="p/e1ee5eca/">Hexo 博客与 Waline 评论区实现外链跳转中间页</a><div class="blog-slider__text">文章推荐</div><a class="blog-slider__button" href="p/e1ee5eca/">详情</a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms"><div class="blog-slider__img"><img src="https://cdn.gallery.uuanqin.top/img/202412100327066.webp" alt="https://cdn.gallery.uuanqin.top/img/202412100327066.webp"/></div><div class="blog-slider__content"><span class="blog-slider__code">2024-12-10</span><a class="blog-slider__title" href="p/55893d1/">实现网站国内外分流(境外接入 Cloudflare)</a><div class="blog-slider__text">博主精选</div><a class="blog-slider__button" href="p/55893d1/">详情</a></div></div></div><div class="blog-slider__pagination swiper-pagination-clickable swiper-pagination-bullets"></div></div></div>';
1597    console.log('已挂载swiper')
1598    parent.insertAdjacentHTML("afterbegin",child)}
1599     </script>
1599
1600<!--
1600<script data-pjax src="https://cdn.jsdelivr.net/gh/Zfour/Butterfly-swiper/swiper/swiper.min.js"></script>
1600-->
1601<!--
1601<script data-pjax src="https://cdn.jsdelivr.net/gh/Zfour/[email protected]/swiper/swiperindex.js"></script>
1601-->
1602<!--
1602<script data-pjax src="https://cdn.gallery.uuanqin.top/js/swiperindex.js"></script>
1602-->
1603<script data-pjax src="https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/Swiper/4.1.6/js/swiper.min.js"></script>
vendor: 1 bytes, line 1603
1603
1604<script data-pjax src="/js/swiperindex.js"></script>
1604
1605<style></style><!-- hexo injector body_end end -->
1605<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"d14c036e528e4ea583562e4da1f6dc2d","r":1,"spa":2}' crossorigin="anonymous"></script>
1605
1606</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.