分享一款经典报纸复古风Typecho主题
一款经典报纸复古风 Typecho 主题,基于 LanternTown 二次开发。内置文章点赞、阅读量统计、目录树、模态框搜索、跟随系统主题色,支持归档 / 友链 / 标签云三大独立页面模板,在性能与安全方面进行了全面加固。
一、深度优化改造背景
1.1 原始主题的局限
LanternTown 是一款设计精美的经典报纸复古风 Typecho 主题,但其原始版本(v1.0.0)在功能完整性、性能优化和安全加固方面存在较多不足:
- 功能缺失:无文章点赞、无阅读量防刷、无独立页面模板(归档/友链/标签云)、无公安备案号、无自定义导航菜单、无模态框搜索
- 性能瓶颈:阅读量/点赞使用 SELECT + UPDATE 两次查询,高并发下存在竞态条件;推荐文章逐项查询 Archive Widget,数据库开销大;无文章内容缓存,长文章每次访问都重复处理
- 安全隐患:无安全响应头(CSP/HSTS 等)、无点赞接口速率限制、IP 获取不校验可信代理(可伪造 IP 绕过防刷)、部分输出未统一转义
- 代码质量:部分变量命名不一致、异常处理不完善、无国际化统一、注释与实际代码不符
1.2 二次开发的目标
基于上述问题,本主题以「生产级可用」为目标进行系统性二次开发,核心原则:
- 功能补全:补齐博客主题必备的交互功能和页面模板
- 性能优先:数据库查询优化、多级缓存、懒加载,确保高并发下稳定运行
- 安全加固:全方位安全防护,从响应头到接口限流,从输出转义到 CSRF 防护
- 代码质量:严格类型声明、统一国际化、完善异常处理、六轮代码审查持续迭代
- 兼容性:兼容 PHP 7.4+ / Typecho 1.2.0+ / MySQL 5.7+,适配主流浏览器
1.3 优化改造成果数据对比
| 对比项 | 原始 LanternTown v1.0.0 | 当前 LanternPress v2.1.6 | 增长 |
|---|---|---|---|
| 文件总数 | 30 | 39 | +9 个 |
| 后台配置项 | 13 | 20 | +7 个 |
| 独立页面模板 | 0 | 3 | +3 个 |
| 文章交互功能 | 3 项(基础) | 5 项(增强) | +2 项 |
| 安全响应头 | 0 | 5 项 | +5 项 |
| 修复问题总数 | - | 20+ 项 | - |
新增文件清单(9 个):
archive-template.php— 归档页独立模板flinks-template.php— 友链页独立模板tagcloud-template.php— 标签云页独立模板README.md— 主题说明文档CHANGELOG.md— 版本更新日志LICENSE— 开源许可证.gitignore/.gitattributes— Git 配置.github/workflows/mirror-to-gitee.yml— GitHub 自动同步 Gitee
新增配置项(7 个):自定义导航菜单、公安备案号、自定义页脚文案、自定义 CSS、自定义 JS、统计代码、头像镜像地址。
二、功能特性
2.1 视觉设计与主题
- 经典报纸复古风格:米黄纸张纹理背景,复古排版,营造沉浸式阅读氛围
- 5 种主题色:复古黄 / 纯白色 / 灰白色 / 暗夜黑 / 跟随系统,一键切换
- 跟随系统深色模式:自动根据浏览器/系统深色偏好切换明暗主题,matchMedia 监听器自动清理
- 首页图片灰白模式:支持灰白/彩色两种显示模式,可全局切换,复古质感更强
- 全站响应式布局:适配桌面、平板、手机等多种设备,移动端导航菜单样式统一
2.2 文章阅读体验
- 段首自动缩进:正文段首自动缩进 2 个字符,符合中文排版习惯
- 阅读进度条与时长估算:文章页顶部显示阅读进度,按 400 字/分钟估算阅读时长,同时显示全文字数
- 图片灯箱:Fancybox 实现,点击放大查看,支持画廊模式,已在链接内的图片不重复包裹
- 代码高亮:Prism.js 实现,支持行号显示、一键复制、语言标签
- 图片懒加载:原生
loading="lazy"+ IntersectionObserver 单例双重保障,避免重复创建 observer 导致内存泄漏
2.3 文章交互功能
- 文章点赞:AJAX 无刷新,Cookie 防重复(1 年内不可重复),IP 速率限制(10 秒 5 次)防刷
- 阅读量统计:Cookie 防刷(24 小时内同一文章只计一次),SQL 原子递增避免竞态
- 文章目录树:可按文章单独开关,自动提取标题层级,移动端浮动按钮唤出
- 其他增强:上下篇导航、文章分享、微信/支付宝打赏、作者简介、CC BY-NC-SA 4.0 版权声明
2.4 首页与导航
- 推荐文章轮播:Swiper 实现,支持自定义推荐文章 ID,自动轮播 + 手动切换
- 最新文章列表:缩略图、摘要、阅读量、点赞数,卡片式布局,无缩略图时显示复古渐变背景
- 两种翻页模式:页码翻页 / 瀑布流加载更多(AJAX 无刷新,15 秒超时保护)
- 自定义导航菜单:支持
名称|URL格式,每行一个,留空自动显示所有独立页面 - 模态框搜索:点击「搜索」居中弹出,输入框与按钮主题色统一,支持 ESC 关闭
- 返回顶部:平滑滚动按钮,滚动时自动显示/隐藏
2.5 评论系统
- AJAX 无刷新提交:事件委托模式,避免内存泄漏
- 嵌套评论:支持多级嵌套回复
- 头像镜像代理:支持 Gravatar 及自定义镜像地址,解决国内访问慢的问题
- 安全防护:评论内容统一 HTML 转义,内置 CSRF 防护
2.6 独立页面模板
- 归档页:按年份/月份归档所有文章,带文章数量统计,数据文件缓存
- 友链页:支持
名称||地址||简介格式自动渲染 - 标签云:按使用频次显示不同大小的标签,点击跳转对应文章列表
2.7 性能优化
- SQL 原子递增:阅读量/点赞使用
INSERT ... ON DUPLICATE KEY UPDATE,避免高并发竞态 - 文章内容缓存:处理结果数据库缓存,配置哈希校验,配置变更自动失效
- 请求内字段缓存:避免同一请求内重复查询
- 归档页文件缓存:1 小时 TTL,文章发布时自动清除
- 资源优化:preload / preconnect、SVG 图标静态缓存、AJAX 片段请求、fetch 超时控制
2.8 安全加固
- 安全响应头:CSP / X-Frame-Options / X-Content-Type-Options / Referrer-Policy,全方位防护
- HSTS:HTTPS 站点自动启用 Strict-Transport-Security,强制 HTTPS 访问
- XSS 防护:全站 HTML 输出统一转义,JS 变量使用
json_encode+ JSON_HEX 系列标志 - URL 安全校验:协议白名单(http/https/mailto),防止 javascript: / data: 协议注入
- 防刷机制:点赞 IP 速率限制(10 秒内最多 5 次)、阅读量/点赞 Cookie 设置 httponly、可信代理白名单
- CSRF 防护:评论表单内置 Typecho Security token,防止跨站请求伪造
2.9 其他特性
- 自定义 CSS/JS:后台直接填写,无需修改主题文件,支持覆盖主题样式和添加交互脚本
- 统计代码注入:支持百度统计、Google Analytics 等,直接粘贴统计代码即可
- 双备案显示:ICP 备案号 + 公安备案号(自动链接至 beian.mps.gov.cn),合规展示
- 自定义页脚文案:可自定义页脚第一行内容,留空显示默认版权信息
- 全站国际化:
_t()/_e()支持,便于多语言翻译 - SEO 优化:JSON-LD 结构化数据(文章/网站),自定义关键词/描述,OG 标签
- Typecho 1.2.1+ 兼容:兼容 Typecho 1.2.1 / 1.3.0 原版
- PHP 8.0+ 兼容:兼容 PHP 8.2,无非捕获异常等 PHP 8.0+ 专有语法
三、环境要求
| 项目 | 最低版本 | 推荐版本 |
|---|---|---|
| Typecho | 1.2.1 | 1.3.0 |
| PHP | 8.0 | 8.2 |
| MySQL | 5.7 | 8.0 |
| 浏览器 | - | Chrome / Edge / Firefox / Safari 最新版 |
本主题已在 PHP 8.2 + Typecho 1.3.0 + MySQL 8 环境下充分测试。
四、安装方法
方法一:直接上传(推荐)
- 下载主题压缩包
- 解压后将
LanternPress文件夹上传到 Typecho 主题目录usr/themes/ - 登录 Typecho 后台 → 外观 → 启用「LanternPress」主题
- 点击「设置外观」进行主题配置
方法二:Git 克隆
cd /path/to/usr/themes/
# GitHub(主仓库)
git clone https://github.com/muzihome/LanternPress.git
# Gitee(国内备用,访问更快)
git clone https://gitee.com/muzinext/LanternPress.git目录权限
确保缓存目录可写:
chmod 755 usr/themes/LanternPress/cache五、主题配置
登录后台 → 外观 → 设置外观,可配置以下 20 个选项:
5.1 基础设置
| 配置项 | 说明 | ||||
|---|---|---|---|---|---|
| 站点 LOGO 地址 | 填写图片 URL,在网站标题处显示 LOGO | ||||
| favicon 地址 | 网站图标地址 | ||||
| 自定义导航菜单 | 每行一个,格式:`名称\ | URL`,留空自动显示所有独立页面 | |||
| 首页推荐阅读 | 推荐文章 ID,用 `\ | \ | 分隔,如:3\ | \ | 4` |
| 首页文章图片 | 每行一张图片 URL,按文章 ID 稳定分配 | ||||
| 首页图片是否默认灰白显示 | 灰白 / 彩色 |
5.2 显示设置
| 配置项 | 说明 |
|---|---|
| 翻页模式 | 页码翻页模式 / 加载更多(瀑布流 AJAX) |
| 主题色 | 复古黄 / 纯白色 / 灰白色 / 暗夜黑 / 跟随系统 |
| 版权声明 | 在文章结尾显示版权声明 |
| 作者简介 | 在文章结尾显示作者简介 |
| 一句话自我介绍 | 展示在文章页作者介绍处 |
| 打赏收款二维码 | 二维码图片地址,一行一个,最多两个 |
| 社交媒体链接 | 格式:名称:url:链接 或 名称:qr:二维码地址 |
| 自定义页脚文案 | 留空显示默认版权信息,填写后替换页脚第一行 |
5.3 备案设置
| 配置项 | 说明 |
|---|---|
| 备案号 | ICP 备案号,如:桂ICP备XXXXXXXX号 |
| 公安备案号 | 公安备案号,自动链接至 beian.mps.gov.cn |
5.4 高级设置
| 配置项 | 说明 |
|---|---|
| 自定义 CSS | 原样输出到 <style> 中,可覆盖主题样式 |
| 自定义 JS | 原样输出到页脚 <script> 中 |
| 统计代码 | 原样输出到页脚,支持直接粘贴统计站点代码 |
| 头像镜像地址 | Gravatar 代理地址,如 https://cravatar.cn/avatar/ |
5.5 文章自定义字段
在文章编辑页面的「自定义字段」中可设置:
| 字段名 | 类型 | 说明 |
|---|---|---|
| articleDesc | 文本 | 文章摘要,展示到首页;不填写则默认取文章前 130 字 |
| bannerUrl | 文本 | 文章主图 URL,用于首页缩略图和文章页顶部 |
| directoryStatus | 下拉 | 是否开启文章目录树:off(关闭,默认)/ on(开启) |
5.6 独立页面模板
创建独立页面时,在「自定义模板」中选择:
- 归档页(archive-template.php):按年份/月份归档所有已发布文章,显示每月文章数量,数据自动缓存
- 友链页(flinks-template.php):在页面内容中按 Markdown 列表格式填写友链
- 标签云页(tagcloud-template.php):自动展示所有文章标签,标签大小按使用频次调整
六、常见问题
Q:点赞功能点击无反应?
A:检查以下几点:确认主题已启用且 functions.php 已正确加载;检查浏览器控制台是否有 JS 报错;确认 cache 目录可写(速率限制需要写入缓存);同一文章 1 年内只能点赞一次,清除 Cookie 后可重新点赞;点赞接口有 IP 速率限制(10 秒内最多 5 次),频繁点击会被限流。
Q:归档页不更新?
A:归档页使用文件缓存,文章发布/修改/删除时会自动清除缓存。如手动修改了数据库,可删除 usr/themes/LanternPress/cache/archive-cache.php 文件手动清除。
Q:Gravatar 头像加载慢?
A:在主题配置中填写「头像镜像地址」,推荐使用 https://cravatar.cn/avatar/、https://gravatar.loli.net/avatar/、https://cdn.v2ex.com/gravatar/。
Q:瀑布流「加载更多」不工作?
A:确认翻页模式设置为「加载更多」;检查浏览器控制台是否有 JS 报错;确认服务器支持 AJAX 请求(返回 from=ajax 参数时只输出文章列表片段);网络异常时请求 15 秒超时,按钮会显示「请求超时,请重试」。
Q:文章内容修改后页面没有更新?
A:文章内容处理结果使用数据库缓存,配置哈希校验。文章发布/修改时会自动清除缓存;主题配置变更(如关闭 fancybox)时缓存会自动失效重建,首次访问时重新生成。
Q:如何配置可信代理白名单?
A:在 Typecho config.inc.php 中添加:
define('LT_TRUSTED_PROXY_IPS', ['127.0.0.1', '代理服务器IP']);定义后,仅信任来自这些代理 IP 的 X-Forwarded-For / X-Real-IP 头,防止客户端伪造 IP 绕过点赞速率限制。
Q:如何升级主题?
A:备份当前主题目录 → 覆盖新版本文件 → 登录后台 → 外观 → 禁用后重新启用主题 → 检查配置项是否完整 → 清除 OPcache。
七、开源许可
本主题基于 LanternTown 主题 二次开发,遵循原始项目许可证。
二次开发部分由木子小鱼维护,欢迎提交 Issue 和 Pull Request。
