博客核心功能实现原理记录
一、 音乐播放系统:APlayer 与自动化歌单
左下角的吸底播放器主要基于 hexo-tag-aplayer 插件实现,并通过主题配置将其注入页面。
- 注入机制:在页面底部注入 APlayer 容器。关键参数包括:
data-fixed="true":使播放器固定在左下角悬浮。no-destroy:配合 PJAX 局部刷新技术,确保在切换页面时音频播放不中断,容器不被销毁。
- 数据解析:播放器本身不存储音乐,而是依赖 Meting API。它作为一个中间件,根据提供的网易云歌单 ID,实时向音乐平台请求音频直链、封面图和歌词。
- 自动化更新:为了同步展示个人的“每周听歌排行”,00利用 GitHub Actions 设置了 Cron 定时任务。脚本会每天抓取最新数据,选择播放最多的10首歌放入歌单,从而确保时效性,同步听歌喜好和心情。
二、 右下角终端对话框:指令解析与 AI 交互
右下角的终端窗口是一个通过原生 JavaScript 编写的交互组件。
- 命令处理系统:内置了一个指令解析器,通过匹配用户输入的字符串来执行不同函数。例如
help调用指令列表,clear执行清屏。当输入以/开头的指令(如/ai)时,系统会切换至 AI 模式。 - AI 流式对话:
- 后端支撑:调用部署在 Cloudflare Workers 上的 API 接口,后端负责与 AI 大模型(本站使用minimax)进行通信。
- 流式响应:利用
Web Streams API获取响应体。前端通过reader.read()逐步解析 SSE(Server-Sent Events)格式的数据流,实现 AI 内容的“逐字打印”效果。
- 上下文保持:会话 ID 存储于浏览器的
localStorage中,这使得用户在刷新页面或跳转链接后,仍能保持之前的对话语境。
三、 访客墙:基于 Waline 的数据可视化
访客墙功能位于独立页面,其数据核心来源于 Waline 评论系统。
- 数据聚合与去重:
- 通过访问 Waline 开放的 API 接口获取特定路径下的评论数据。
- 由于同一访客可能多次留言,脚本会根据
nick(昵称)进行去重处理,确保每个访客在墙上仅显示一个头像。 - 对于未设置自定义头像的访客,系统接入了 DiceBear API,通过昵称作为种子生成唯一的风格化头像。
- 多重初始化策略:由于访客墙对 DOM 渲染依赖较高,为了兼容 PJAX 局部刷新,系统采用了组合式初始化触发机制,同时监听
DOMContentLoaded和pjax:complete事件。
