码桶
发现社区成员的开源项目
版本历史
3 次提交提交详情
603115c提交编号
603115c73e7b6d2718cdef3e007a4e326964095c提交作者开心<codebucket@localhost>
提交时间2026-07-29 13:06:38 +0800
更新说明更新 README.md
文件变更 1 个文件
文件新增删除
README.md+239-398文件差异 逐行查看本次提交的修改
README.md+239-398
@@ -1,398 +1,239 @@1
-# Pyq 主题 — 详细功能总结与技术文档2
-3
-> **主题名称:** Pyq4
-> **作者:** 清酒5
-> **版本:** 1.0.0 (2026-06-28)6
-> **适配程序:** Typecho 1.3.07
-> **运行环境:** PHP 8.2 + MySQL 5.78
-> **站点地址:** https://p.qu.pw/9
-> **主题目录:** `/www/wwwroot/p.qu.pw/usr/themes/pyq/`10
-11
-12
-## 一、主题概述13
-14
-Pyq 是一款仿朋友圈风格的 Typecho 主题,以说说(短文)为核心,支持图文、音乐、视频、链接等多种内容形式。移动端优先设计,支持深色模式、PJAX 无刷新导航、LRC 歌词滚动等高级功能。15
-16
-参考主题:wutoutu(同目录下),在此基础上进行了大量功能增强和 UI 优化。17
-18
-19
-## 二、文件结构20
-21
-```22
-pyq/23
-├── index.php # 首页模板(说说列表 + 分页 + AJAX加载更多)24
-├── post.php # 文章详情页(单篇说说 + 评论区)25
-├── page.php # 通用页面模板26
-├── page-about.php # 关于页面(社交账号弹窗)27
-├── page-links.php # 友链页面28
-├── page-archive.php # 归档页面(按月分组)29
-├── header.php # 公共头部(导航栏 + 封面 + 公告 + 音乐播放器)30
-├── footer.php # 公共底部(弹窗公告 + 返回顶部 + JS加载)31
-├── comments.php # 评论模板32
-├── functions.php # 主题函数(自定义字段 + 工具函数)33
-├── setting.php # 后台设置页(Tab式界面)34
-├── ajax.php # AJAX接口(加载更多 + 评论提交 + 点赞)35
-├── music-proxy.php # 音乐代理(本地Meting库 + 流式传输)36
-├── img-proxy.php # 图片代理(防盗链处理)37
-├── assets/38
-│ ├── css/39
-│ │ ├── style.css # 前台主样式(1193行)40
-│ │ ├── houtai.css # 后台设置页样式(354行)41
-│ │ └── admin-fix.css # 后台全局修复CSS(130行)42
-│ ├── js/43
-│ │ ├── app.js # 前台主逻辑(1250行)44
-│ │ └── houtai.js # 后台设置页逻辑(54行)45
-│ └── img/ # 主题图片资源46
-├── lib/47
-│ └── Meting.php # Metowolf Meting 音乐API库48
-└── static/49
- └── prism/ # Prism.js 代码高亮(22个文件,16种语言)50
-```51
-52
-**总代码量:** 5266 行53
-54
-55
-## 三、功能特性56
-57
-### 3.1 内容类型58
-59
-| 类型 | 自定义字段 | 说明 |60
-|------|-----------|------|61
-| 图文 | `images`(多行文本) | 多图URL,每行一张,支持懒加载 |62
-| 视频 | `video_url`(单行文本) | 视频链接,支持 mp4/embed |63
-| 音乐 | `music_url` + `music_name` + `music_artist` + `music_cover` + `music_lrc` | 音乐卡片,支持封面+歌词 |64
-| 链接 | `link_url` + `link_title` + `link_desc` + `link_thumb` | 外部链接卡片预览 |65
-| 位置 | `location`(单行文本) | 显示位置信息 |66
-| 置顶 | `is_top`(单选:是/否) | 置顶文章 |67
-68
-### 3.2 音乐系统69
-70
-#### 顶部播放器71
-- 导航栏集成迷你播放器(播放/暂停 + 歌名滚动)72
-- 支持两种音源:73
- - `bgm_url`:直接 MP3 链接(优先)74
- - `netease_id`:网易云歌曲ID,通过本地 Meting 库代理获取75
-- 音乐代理 `music-proxy.php`:流式传输 + Range 分块请求支持76
-77
-#### 音乐卡片(说说内嵌)78
-- 80px 高度卡片,封面背景 + 歌曲名 + 歌手 + 播放按钮79
-- 底部进度条(3px,hover 6px),支持拖动 seek80
-- LRC 歌词滚动:81
- - 支持标准 LRC 格式(`[00:12.34]歌词`)82
- - 支持网易云 JSON 格式(`{"t":0,"c":[{"tx":"歌词"}]}`)83
- - 歌词区在卡片下方展开,背景使用封面模糊图84
- - 当前行高亮(白色 15px + 发光阴影)85
- - `requestAnimationFrame` 同步滚动,使用 `scrollTo` 避免页面抖动86
- - 展开/收起按钮,可手动控制87
-88
-### 3.3 评论系统89
-90
-- AJAX 无刷新提交评论91
-- 必填昵称 + 邮箱(邮箱格式校验)92
-- 评论 @回复 功能(点击回复按钮自动填充)93
-- 评论邮件通知:94
- - 直接调用 CommentNotifier 插件的 `refinishComment` 方法95
- - 绕过异步模式(`yibu=1`),确保邮件即时发送96
- - 修复 `ownerId` 为 0 的问题,从 `typecho_contents` 查询文章作者97
-- 评论树形渲染(`pyq_render_comments_tree`)98
-99
-### 3.4 交互功能100
-101
-- **点赞:** AJAX 点赞/取消,实时更新按钮状态和点赞列表102
-- **分享:** 8 按钮弹窗(2×4 网格)— 微信/微博/QQ/复制链接/带标题复制/更多103
-- **返回顶部:** 滚动 300px 后显示,平滑滚动104
-- **图片灯箱:** FancyBox 集成,点击图片放大查看105
-- **懒加载:** IntersectionObserver 图片懒加载106
-- **加载更多:** 滚动到底部自动加载下一页(AJAX)107
-108
-### 3.5 PJAX 无刷新导航109
-110
-- 全站 PJAX 实现,音乐播放不中断111
-- `XMLHttpRequest` + `DOMParser` 解析新页面112
-- `history.pushState` / `popstate` 浏览器前进后退支持113
-- 换页后自动重新初始化:FancyBox、Prism.js、懒加载、搜索、加载更多114
-- 内容区域目标:`#pyq-feed`115
-116
-### 3.6 深色模式117
-118
-- 跟随系统 `prefers-color-scheme` 自动切换119
-- CSS 变量体系(`--bg`, `--card`, `--text`, `--text2`, `--text3`, `--border` 等)120
-- 所有组件完整适配深色/浅色121
-122
-### 3.7 代码高亮123
-124
-- Prism.js 集成(16 种语言)125
-- 暗色主题 + 行号 + 一键复制按钮126
-- `pyq_parse_code()` 函数处理代码块127
-128
-129
-## 四、后台设置130
-131
-### 4.1 设置界面132
-133
-Tab 式布局(5 个标签页):134
-135
-| 标签 | 内容 |136
-|------|------|137
-| 基础设置 | 头像URL、封面图URL、封面高度、用户名、个性签名、ICP备案、说说分类slug、静态资源URL |138
-| 音乐设置 | 背景音乐URL、网易云歌曲ID |139
-| 社交菜单 | GitHub/微博/微信/QQ 链接 + 菜单项配置 |140
-| 功能设置 | 公告文字、公告背景色(色盘选择)、Gravatar源选择、弹窗公告 |141
-| 高级设置 | 自定义CSS/JS 代码注入 |142
-143
-### 4.2 设置备份144
-145
-- 一键备份当前所有设置146
-- 列出历史备份,支持一键恢复/删除147
-- 备份存储在 `typecho_options` 表中148
-149
-### 4.3 自定义字段150
-151
-文章编辑页自定义字段支持:152
-- textarea 高度优化(36px 起,可拖拽调整)153
-- 文字描述改为 placeholder(`$e->input->setAttribute`)154
-- Radio 按钮置顶选择(is_top)155
-- 所有字段支持 JS 拖拽调整宽度(text input)156
-157
-158
-## 五、页面模板159
-160
-### 5.1 关于页面 (`page-about.php`)161
-162
-- 社交账号展示(QQ/微信/GitHub/微博)163
-- 点击弹窗显示账号信息(QQ 弹窗、微信弹窗)164
-- 复制账号到剪贴板165
-- 弹窗函数在 `app.js` 中定义(PJAX 兼容)166
-167
-### 5.2 友链页面 (`page-links.php`)168
-169
-- 配合links插件使用170
-- 友链列表展示171
-- 卡片式布局172
-173
-### 5.3 归档页面 (`page-archive.php`)174
-175
-- 按年月分组的文章列表176
-- 链接格式:`/archives/slug.html`177
-178
-179
-## 六、技术实现细节180
-181
-### 6.1 IIFE 架构182
-183
-`app.js` 使用 IIFE(立即执行函数表达式)封装,所有功能通过 `pyq.xxx` 暴露到全局:184
-185
-```javascript186
-;(function(){187
- // 内部变量188
- var pyq = window.pyq = {};189
- // 所有功能定义...190
- pyq.playCardMusic = function(btn){ ... };191
- pyq.parseLrc = function(text){ ... };192
- // ...193
-})();194
-```195
-196
-**关键教训:** IIFE 闭合 `})();` 必须在所有 `pyq.xxx` 定义之后,否则后续代码引用 `pyq` 会 ReferenceError。197
-198
-### 6.2 音乐卡片 HTML 结构199
-200
-```html201
-<div class="pyq-music-wrap" data-bg="封面URL">202
- <div class="pyq-music-card" data-src="音频URL" data-name="歌名" data-lrc="base64歌词">203
- <div class="pyq-music-card-bg" style="background-image:url(...)"></div>204
- <div class="pyq-music-card-left"><img src="封面"></div>205
- <div class="pyq-music-card-right">206
- <div class="pyq-music-card-info">207
- <div class="pyq-music-card-title">歌名</div>208
- <div class="pyq-music-card-artist">歌手</div>209
- </div>210
- <div class="pyq-music-card-play" onclick="pyq.playCardMusic(this)">▶</div>211
- </div>212
- <div class="pyq-music-progress" onmousedown="pyq.seekMusic(event,this)">213
- <div class="pyq-music-progress-bar"></div>214
- <div class="pyq-music-progress-dot"></div>215
- </div>216
- </div>217
- <div class="pyq-lrc-bar" onclick="pyq.toggleLrc(this)">歌词 ▼</div>218
- <div class="pyq-music-lrc">219
- <div class="pyq-lrc-bg" style="background-image:url(...)"></div>220
- <div class="pyq-lrc-overlay"></div>221
- <div class="pyq-lrc-lines"></div>222
- </div>223
-</div>224
-```225
-226
-### 6.3 LRC 歌词解析227
-228
-支持两种格式:229
-230
-**标准 LRC:**231
-```232
-[00:12.34]歌词第一行233
-[00:15.67]歌词第二行234
-```235
-236
-**网易云 JSON:**237
-```json238
-[{"t":0,"c":[{"tx":"作词: "},{"tx":"某某"}]},{"t":4000,"c":[{"tx":"歌词"}]}]239
-```240
-241
-解析流程:242
-1. 检测首字符是否为 `{` 或 `[`243
-2. JSON 格式:解析数组,提取 `t`(毫秒)和 `c[].tx`(文本)244
-3. LRC 格式:正则 `/[(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?](.*)/g` 匹配245
-4. 按时间排序246
-247
-### 6.4 歌词同步机制248
-249
-- `requestAnimationFrame` 高频循环(60fps)250
-- 遍历已排序的歌词数组,找到当前时间对应的行251
-- 高亮当前行(`.active` class)252
-- `scrollTo` 滚动容器到当前行位置(不用 `scrollIntoView`,避免页面抖动)253
-- 暂停时停止循环,恢复时重新启动254
-255
-### 6.5 进度条拖动256
-257
-- `mousedown/touchstart` 记录起始位置258
-- `mousemove/touchmove` 实时计算百分比,更新 `audio.currentTime`259
-- `mouseup/touchend` 清理事件监听260
-- `getBoundingClientRect` 计算相对位置261
-- 拖动中添加 `.dragging` class(白点常显 + 进度条变高)262
-263
-### 6.6 邮件通知修复264
-265
-三层问题修复:266
-267
-1. **插件未初始化:** `ajax.php` 需调用 `Plugin::init()` 初始化插件系统268
-2. **ownerId 为 0:** `typecho_comments.ownerId` 全为 0,需从 `typecho_contents` 查 `authorId` 补全269
-3. **异步模式失效:** CommentNotifier 的 `yibu=1` 模式在 AJAX handler 中不触发,直接调用 `Plugin::refinishComment($feedback)` 绕过270
-271
-### 6.7 后台 CSS 注入272
-273
-通过 `admin/header.php` 直接注入 `admin-fix.css`,修复:274
-- select 下拉框样式(移动端 font-size 16px 防缩放)275
-- textarea 可拖拽(覆盖 Typecho 的 `resize: none`)276
-- 编辑器容器居中(覆盖 `.row { width: 100vw }`)277
-- 移动端自定义字段、提交按钮全宽适配278
-279
-280
-## 七、CSS 变量281
-282
-```css283
-:root {284
- --bg: #f0f0f0; /* 页面背景 */285
- --card: #fff; /* 卡片背景 */286
- --card2: #f5f5f5; /* 次级卡片 */287
- --text: #333; /* 主文字 */288
- --text2: #666; /* 次级文字 */289
- --text3: #999; /* 辅助文字 */290
- --border: #eee; /* 边框 */291
- --accent: #07c160; /* 强调色(微信绿) */292
- --max-w: 680px; /* 最大宽度 */293
- --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;294
-}295
-296
-.darkmode {297
- --bg: #1a1a1a;298
- --card: #242424;299
- --card2: #2a2a2a;300
- --text: #e5e5e5;301
- --text2: #aaa;302
- --text3: #777;303
- --border: #333;304
-}305
-```306
-307
-308
-## 八、数据库交互309
-310
-### 8.1 表结构311
-312
-- `typecho_contents`:文章内容313
-- `typecho_fields`:自定义字段(`name` + `str_value` + `cid`)314
-- `typecho_comments`:评论315
-- `typecho_users`:用户316
-- `typecho_options`:设置项317
-318
-### 8.2 关键查询319
-320
-```sql321
-SELECT name, str_value FROM typecho_fields WHERE cid = ?322
-323
-SELECT c.*, u.screenName FROM typecho_comments c324
-LEFT JOIN typecho_users u ON c.authorId = u.uid325
-WHERE c.cid = ? ORDER BY c.created ASC326
-327
-SELECT authorId FROM typecho_contents WHERE cid = ?328
-```329
-330
-331
-## 九、插件依赖332
-333
-| 插件 | 状态 | 用途 |334
-|------|------|------|335
-| CommentNotifier | ✅ 已激活 | 评论邮件通知 |336
-| Links | ✅ 已激活 | 友链管理 |337
-| ArticlePoster | ⚠️ 状态未知 | 文章海报生成 |338
-339
-340
-## 十、备份清单341
-342
-| 备份名 | 时间 | 说明 |343
-|--------|------|------|344
-| pyq_backup_20260627_210104 | 06-27 21:01 | 最初完整备份 |345
-| pyq_backup_20260628_123511 | 06-28 12:35 | Tab式设置界面完成后 |346
-| pyq_backup_20260628_141400 | 06-28 14:14 | LRC功能尝试前 |347
-| pyq_backup_20260628_153600 | 06-28 15:36 | LRC回滚后 |348
-| pyq_backup_20260628_163947 | 06-28 16:39 | 代码清理后 |349
-| pyq_backup_20260628_173800 | 06-28 17:38 | 移动端优化后 |350
-| pyq_backup_20260628_181600 | 06-28 18:16 | LRC首轮修复后 |351
-| pyq_backup_20260628_184200 | 06-28 18:42 | LRC二轮修复后 |352
-| pyq_backup_20260628_185100 | 06-28 18:51 | 进度条前 |353
-| pyq_backup_20260628_190200 | 06-28 19:02 | 最新 |354
-355
-356
-## 十一、踩坑记录(关键教训)357
-358
-1. **Typecho `.row` 默认 `width: 100vw`** — 导致编辑器容器溢出,需覆盖为 `width: 100%`359
-2. **Typecho `setAttribute()` 设在 `<li>` 上** — 需用 `$e->input->setAttribute()` 设在 `<input>` 上360
-3. **IIFE 闭合位置错误** — `})();` 必须在所有 `pyq.xxx` 定义之后361
-4. **`display:none` 的父容器** — 子元素的 `display:flex` 无效,必须同时检查父容器362
-5. **PJAX 内联 script 不执行** — `innerHTML` 注入的 `<script>` 不会执行,函数必须放外部 JS363
-6. **`height:0;overflow:hidden` 的容器** — 内部元素永远不可交互,按钮必须放外面364
-7. **CSS 变量不能用于伪元素 `background-image`** — 跨浏览器不兼容,用真实 DOM 更可靠365
-8. **`scrollIntoView` 带动页面滚动** — 容器高度动画时使用 `scrollTo` 代替366
-9. **单引号里 `\n` 是字面量** — 不是换行,需用双引号367
-10. **Typecho 插件钩子系统** — 命名空间必须是 `TypechoPlugin\PluginName\ClassName`,手动 SQL 激活不会运行构造函数368
-369
-370
-## 十二、性能优化371
-372
-- 图片懒加载(IntersectionObserver)373
-- PJAX 无刷新(减少整页重载)374
-- CSS `will-change` 用于动画元素375
-- `requestAnimationFrame` 用于高频更新(歌词同步、进度条)376
-- 音乐代理流式传输(不缓存完整文件)377
-- Prism.js 按需加载(仅代码块页面)378
-379
-380
-_文档生成时间:2026-06-28 19:02_381
-_主题总代码量:5266 行_382
-_备份总数:10 个_1
+# 🎉 开心朋友圈 (KXpyq) — Typecho 主题介绍2
+3
+> **版本**:v1.0.04
+> **作者**:[清酒](https://qu.pw)5
+> **博客**:[KX.MS](https://kx.ms/archives/pyq.html)6
+> **类型**:朋友圈风格单用户博客主题7
+> **适配**:Typecho 1.2+ / PHP 7.4+8
+9
+---10
+11
+## 📱 简介 [KX.MS](https://kx.ms/archives/pyq.html)12
+13
+**开心朋友圈**(KXpyq)是一款高仿真微信朋友圈风格的 Typecho 主题。设计初衷是为个人博主提供一个亲切、轻量、移动优先的"碎碎念"发布平台——像发朋友圈一样写博客。14
+15
+它不是传统博客,而是你的**数字朋友圈**:说说、图片、音乐、视频、位置签到、互动评论……这些在微信里习以为常的表达方式,现在你可以在自己的网站上拥有了。16
+17
+---18
+19
+## 🏗 整体架构20
+21
+```22
+kxpyq/23
+├── index.php # 首页——朋友圈信息流24
+├── post.php # 文章页——单条说说详情25
+├── header.php # 公共头部:SEO/导航/封面/公告26
+├── footer.php # 公共底部:音乐浮控/返回顶部/JS加载27
+├── functions.php # 核心逻辑:卡片渲染/音乐代理/代码高亮等28
+├── setting.php # 后台设置界面(5个Tab页)29
+├── ajax.php # AJAX接口:加载更多/点赞/评论/搜索30
+├── page-about.php # 关于页面(数据统计+社交链接)31
+├── page-archive.php # 归档时光轴(年月分组+统计)32
+├── page-links.php # 友情链接页(依赖Links插件)33
+├── comments.php # 评论区模板34
+├── img-proxy.php # 图片缩放代理(缓存+EXIF修正)35
+├── music-proxy.php # 网易云音乐代理36
+├── lib/Meting.php # 本地Meting音乐库37
+├── assets/38
+│ ├── css/39
+│ │ ├── style.css # 源CSS(开发版)40
+│ │ ├── style.min.css # 压缩CSS(生产版,~33KB)41
+│ │ ├── houtai.css # 后台设置页样式42
+│ │ └── admin-fix.css # 后台预览修正43
+│ ├── js/44
+│ │ ├── app.v2.js # 源JS(开发版,~61KB)45
+│ │ ├── app.min.js # 压缩JS(生产版,~60KB)46
+│ │ └── houtai.js # 后台设置页脚本47
+│ ├── lib/48
+│ │ ├── prism/ # Prism.js代码高亮(19种语言,按需加载)49
+│ │ └── fancybox/ # Fancybox图片灯箱(懒加载)50
+│ └── cache/ # 图片代理缓存目录51
+```52
+53
+**核心设计理念**:统一渲染、移动优先、性能极致、渐进增强。54
+55
+所有卡片通过 `pyq_format_post_data()` + `pyq_render_card()` 两个函数统一输出,PHP 服务端渲染与 AJAX 客户端渲染共享同一套代码,杜绝不一致。56
+57
+---58
+59
+## ✨ 全部功能一览60
+61
+### 🎨 朋友圈风格62
+63
+- 封面大图 + 头像 + 昵称 + 个性签名64
+- 卡片式信息流,圆角阴影,体验接近微信65
+- 移动端优先,完美适配手机/平板/桌面66
+- 置顶说说支持67
+68
+### 📝 说说内容类型69
+70
+| 类型 | 说明 |71
+|------|------|72
+| 纯文字 | 超过250字自动折叠「展开全文」 |73
+| 图片 | 1/2/3/4/9宫格自适应布局,单图原比例不裁切 |74
+| 视频 | 支持直链视频,内嵌播放器 |75
+| 音乐卡片 | 网易云/本地音频,专辑封面 + 播放控制 + 进度条 + LRC歌词滚动 |76
+| 链接卡片 | 缩略图 + 标题 + 描述,外链展示 |77
+| 位置签到 | 链接到高德地图搜索 |78
+| 话题标签 | `#tag#` 格式,点击搜同类 |79
+80
+### 🎵 音乐系统81
+82
+- **全局BGM**:后台配置背景音乐,PJAX 换页不中断83
+- **音乐卡片**:每条说说可内嵌音乐播放器,支持:84
+ - 网易云自动获取歌曲名/歌手/封面(Metting API)85
+ - 播放/暂停 + 进度条拖拽 + 音量86
+ - LRC 歌词展开滚动(支持标准 LRC 和网易云 JSON 两种格式)87
+- **浮动音乐控制**:右下角音符按钮 + 播放/暂停 + 定位子按钮88
+- **网易云代理**:music-proxy.php 本地代理,解决外链失效89
+90
+### 💻 代码高亮91
+92
+- Prism.js 集成,支持 **19 种语言**:93
+ Bash, C, C++, CSS, Go, HTML, Java, JavaScript, JSON, Kotlin, Markup, PHP, Python, Ruby, Rust, SQL, Swift, TypeScript, 纯文本94
+- 多行代码块 `\`\`\`language` + 行内代码 `` `code` ``95
+- 复制按钮 + 行号显示96
+- **按需加载**:首页不加载,文章页按内容中实际语言动态引入97
+98
+### 🖼 图片系统99
+100
+- **图片代理**:`img-proxy.php` 自动缩放 + 缓存,节省带宽101
+- **EXIF 方向修正**:竖拍照片自动旋转102
+- **Fancybox 灯箱**:图片点击放大浏览,支持手势滑动(`fancybox.umd.js` ~165KB)103
+- **懒加载**:Intersection Observer + blur-in 动画104
+- **失败重试**:图片加载失败自动重试 3 次105
+106
+### 💬 互动功能107
+108
+- **点赞**:基于 Cookie + IP 去重,支持访客名显示,点赞列表一目了然109
+- **表情反应**:长按赞按钮弹出 👍❤️😂😮😢 五种 emoji 反应110
+- **评论系统**:111
+ - 嵌套回复,支持 @ 提及112
+ - 超过 5 条自动折叠,点击「展开全部 N 条」113
+ - IP 归属地显示(ip-api.com)114
+ - 博主标记(橙色「博主」badge)115
+ - 评论邮件通知(依赖 CommentNotifier 插件)116
+ - 首次评论标记「首评」117
+- **分享**:二维码分享 + 浏览器原生分享 API + 海报分享(Canvas 生成卡片图)118
+- **搜索**:全屏弹窗搜索,实时结果119
+- **PJAX 无刷新换页**:切页时音乐不中断120
+121
+### 🎛 外观定制122
+123
+- **深色/浅色模式**:124
+ - 手动一键切换125
+ - 定时自动切换(19:00 ~ 07:00)126
+ - 跟随系统偏好127
+ - 状态持久化到 localStorage128
+- **字体大小调节**:左下角 Aa 按钮,14px / 16px / 18px 三档129
+- **主题色**:后台自定义 HEX 色值130
+- **最大宽度**:后台调节(默认 680px,适合朋友圈风格)131
+- **卡片圆角**:后台调节(默认 12px)132
+- **自定义 CSS/JS**:后台直接注入133
+134
+### 📡 SEO & 社交分享135
+136
+- Open Graph 标签(og:title/description/image/url/type/site_name)137
+- Twitter Card 标签138
+- 自动 meta description139
+- RSS / Atom Feed 链接140
+- 文章底部版权声明(支持 `{title} {url} {author} {date}` 变量)141
+142
+### 📱 PWA 支持143
+144
+- `manifest.json`:可安装到手机桌面,带图标和主题色145
+- Service Worker:离线缓存,弱网可用146
+- 深色/浅色 theme-color 自适应147
+148
+### 🚀 性能优化149
+150
+| 项目 | 优化前 | 优化后 | 方式 |151
+|------|--------|--------|------|152
+| CSS | 44KB 同步 | 33KB minified | 压缩 + 版本号 |153
+| JS | 61KB 同步 | 60KB + defer | 压缩 + 异步加载 |154
+| Prism | 108KB 全量 | 0~20KB 按需 | 按页面检测语言加载 |155
+| Fancybox | 165KB 全量 | 0KB(首次点击加载) | 懒加载 |156
+| **首屏总计** | **~378KB** | **~93KB** | **节省 75%** |157
+158
+- DNS 预解析 + Preconnect159
+- 非关键 CSS 异步预加载160
+- 图片懒加载 + 代理缩放161
+- 非首屏资源全部延迟162
+163
+### ⚙️ 后台设置164
+165
+5 个 Tab 页,分类清晰:166
+167
+| Tab | 内容 |168
+|-----|------|169
+| 基础设置 | 头像、封面、用户名、签名、ICP备案、说说分类、CDN |170
+| 音乐设置 | 背景音乐 URL、网易云歌曲ID |171
+| 社交菜单 | GitHub/微博/微信/QQ + 自定义菜单 |172
+| 功能设置 | Gravatar源(5选)、公告、文章版权 |173
+| 高级设置 | 主题色/最大宽度/卡片圆角 + 自定义CSS/JS + 注入代码 |174
+175
+内置**设置备份/还原**功能,换主题不怕配置丢失。176
+177
+### 📄 页面类型178
+179
+| 页面 | 说明 |180
+|------|------|181
+| 首页 | 朋友圈信息流,无限滚动加载 |182
+| 文章页 | 单条说说详情 + 相关推荐 |183
+| 关于页面 | 数据统计(文章/评论/分类/天数)+ 社交链接(GitHub/微博/微信/QQ/Telegram)+ 评论区 |184
+| 归档页面 | 时光轴:年份分组 + 月份分割 + 统计卡片 |185
+| 友情链接 | Links 插件集成,按分组展示 |186
+| 自定义页面 | 通用模板 |187
+188
+### 🔒 安全189
+190
+- 输入/输出全面 XSS 防护(`htmlspecialchars` + `json_encode`)191
+- CSRF Token 验证192
+- 图片代理 URL 白名单校验(仅允许 http/https)193
+194
+---195
+196
+## 🔌 必须搭配的插件197
+198
+| 插件 | 用途 | 必要性 |199
+|------|------|--------|200
+| **Links** | 友情链接管理 | 必须——友情链接页面依赖 |201
+| **CommentNotifier** | 评论邮件通知 | 必须——评论后自动发邮件通知博主 & 访客 |202
+| **ArticlePoster** | 文章海报分享 | 必须——海报分享功能依赖 |203
+204
+> 以上三个插件请务必在 Typecho 后台启用,否则对应功能无法使用。[插件下载](https://kx.ms/archives/pyq.html)205
+206
+---207
+208
+## 🌐 兼容性209
+210
+- **浏览器**:Chrome 80+ / Edge 80+ / Firefox 80+ / Safari 14+211
+- **PHP**:7.4+(图片代理需要 GD 库)212
+- **Typecho**:1.2+213
+214
+---215
+216
+## 📦 安装217
+218
+1. 将 `kxpyq` 文件夹上传到 Typecho 的 `/usr/themes/` 目录219
+2. 后台 → 外观 → 启用「开心朋友圈」220
+3. 进入「设置外观」进行个性化配置221
+4. 安装并启用必备插件:Links / CommentNotifier / ArticlePoster222
+5. 在「撰写」中新建文章,选择「说说」分类(默认 slug: `shuoshuo`),填写自定义字段即可223
+224
+---225
+226
+## 📸 截图227
+228
+`/usr/themes/kxpyq/screenshot.png`229
+230
+---231
+232
+## 📝 许可233
+234
+本主题为开源免费主题,可自由使用、修改。235
+236
+---237
+238
+> 🍺 从朋友圈来,到朋友圈去。愿你的碎碎念,有处安放。239
+> —— 清酒 @ [qu.pw](https://qu.pw)