一款经典报纸复古风 Typecho 主题,基于 LanternTown 二次开发。内置文章点赞、阅读量统计、目录树、模态框搜索、跟随系统主题色,支持归档 / 友链 / 标签云三大独立页面模板,在性能与安全方面进行了全面加固。

LanternPress v2.1.6 发布:经典报纸复古风 Typecho 主题

一、深度优化改造背景

1.1 原始主题的局限

LanternTown 是一款设计精美的经典报纸复古风 Typecho 主题,但其原始版本(v1.0.0)在功能完整性、性能优化和安全加固方面存在较多不足:

  • 功能缺失:无文章点赞、无阅读量防刷、无独立页面模板(归档/友链/标签云)、无公安备案号、无自定义导航菜单、无模态框搜索
  • 性能瓶颈:阅读量/点赞使用 SELECT + UPDATE 两次查询,高并发下存在竞态条件;推荐文章逐项查询 Archive Widget,数据库开销大;无文章内容缓存,长文章每次访问都重复处理
  • 安全隐患:无安全响应头(CSP/HSTS 等)、无点赞接口速率限制、IP 获取不校验可信代理(可伪造 IP 绕过防刷)、部分输出未统一转义
  • 代码质量:部分变量命名不一致、异常处理不完善、无国际化统一、注释与实际代码不符

1.2 二次开发的目标

基于上述问题,本主题以「生产级可用」为目标进行系统性二次开发,核心原则:

  1. 功能补全:补齐博客主题必备的交互功能和页面模板
  2. 性能优先:数据库查询优化、多级缓存、懒加载,确保高并发下稳定运行
  3. 安全加固:全方位安全防护,从响应头到接口限流,从输出转义到 CSRF 防护
  4. 代码质量:严格类型声明、统一国际化、完善异常处理、六轮代码审查持续迭代
  5. 兼容性:兼容 PHP 7.4+ / Typecho 1.2.0+ / MySQL 5.7+,适配主流浏览器

1.3 优化改造成果数据对比

对比项原始 LanternTown v1.0.0当前 LanternPress v2.1.6增长
文件总数3039+9 个
后台配置项1320+7 个
独立页面模板03+3 个
文章交互功能3 项(基础)5 项(增强)+2 项
安全响应头05 项+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+ 专有语法

三、环境要求

项目最低版本推荐版本
Typecho1.2.11.3.0
PHP8.08.2
MySQL5.78.0
浏览器-Chrome / Edge / Firefox / Safari 最新版
本主题已在 PHP 8.2 + Typecho 1.3.0 + MySQL 8 环境下充分测试。

四、安装方法

方法一:直接上传(推荐)

  1. 下载主题压缩包
  2. 解压后将 LanternPress 文件夹上传到 Typecho 主题目录 usr/themes/
  3. 登录 Typecho 后台 → 外观 → 启用「LanternPress」主题
  4. 点击「设置外观」进行主题配置

方法二: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。

项目地址: https://github.com/muzihome/LanternPress

备用地址: https://gitee.com/muzinext/LanternPress