简介
纸鱼博客系统是一款基于 PHP 8.1+ / Slim 4 / PHP-DI / PDO 的轻量博客 CMS,功能、界面与数据层与 Node 版对齐。开箱即用:上传即装、内置官方应用商店、主题与插件生态、亮暗主题、Markdown 写作。
核心能力:文章/分类/标签/搜索/归档/页面/RSS/sitemap、评论楼中楼、密码门、点赞收藏、相关推荐、侧边栏组件、媒体库(GD 压缩)、定时发布、备份(双模式)、开放 API。
官方域名:waikanl.cn。请仅从官方应用商店(store.waikanl.cn)安装主题与插件,第三方包安装后拥有站点权限。
安装
上传到站点根目录即可(入口 index.php 位于根目录,无需单独运行目录)。首次访问 install.php 进入安装向导,完成环境检查、填写数据库和管理员账号后自动建库建表。
运行环境:PHP 8.1+、MySQL 5.7.6+、Nginx 或 Apache。单一数据库即可,无需 Redis 等额外服务。
index.php # 入口(站点根)
install.php # 安装向导(安装后请删除)
config.php # 安装生成
app/ # 应用代码
public/ # 静态资源(css/js/uploads/vendor)
themes/ # 主题
plugins/ # 插件
migrations/ # 数据库迁移
Nginx 只需一条伪静态:try_files / /index.php?;。静态资源走 /public/ 直链,Web 服务器任何配置下都能加载,无需额外静态规则。Apache 使用内置 .htaccess。
宝塔面板:新建站点 → 上传程序包解压到站点根目录 → 设置伪静态为上述规则 → 访问域名进入安装向导。数据库可在宝塔创建,或在安装向导中填写已有的库。
配置
安装向导生成 config.php,包含数据库连接信息。站点设置在后台「站点设置」页完成:站点信息(名称、副标题、备案号)、SMTP 邮件(支持测试发送)、开放 API 开关、应用商店地址、Markdown 安全开关等。
定时发布双通道:宝塔计划任务调用 cron.php(推荐),前台请求低频兜底(无需配置即可生效,但精度较低)。
会话默认 7 天;忘记密码支持邮箱验证与 SMTP 双通道。
应用商店
主程序内置官方应用商店(store.waikanl.cn),开箱即用,地址硬编码无需配置。后台「商店」页可直接浏览、安装、更新主题与插件;目录拉取失败时自动回退内置商店,商店永不自挂。
站点设置中也可配置社区或私有商店地址,应用源使用同一套 runtime-store/v1 JSON 协议。商店目录缓存 1 小时,安装/更新前校验包的 SHA-256 完整性。
付费应用:在站点设置填写授权码(官网购买后提供,仅保存在服务器),商店下载付费应用时自动携带授权码与站点地址。
{
"apps": [
{
"type": "theme",
"slug": "default-pro",
"version": "1.0.0",
"sha256": "...",
"download_url": "https://...",
"requiresPafish": "0.1.0"
}
]
}主题开发
主题使用 theme.json 声明元信息与设置项,后台按字段生成设置页。前台样式 style.css 放在主题目录内,由系统内联注入(与 theme.css 变量一起),主题切换即换全套样式。
主题目录结构:
my-theme/
├─ theme.json # 元信息与设置项声明
├─ theme.css # 语义 CSS 变量(颜色/字体)
├─ style.css # 前台布局样式
├─ header.php # 头部模板
├─ footer.php # 底部模板
├─ post.php # 文章模板
├─ page.php # 页面模板
└─ assets/ # 静态资源
theme.json 示例:
{
"name": "My Theme",
"version": "1.0.0",
"author": "你的名字",
"config": [
{ "key": "accent", "label": "主色调", "type": "color", "default": "#0d9488" }
]
}
语义 CSS 变量在 theme.css 中定义,模板通过 asset_url() 输出资源路径。第三方主题未提供 style.css 时回退默认主题布局,保证始终有样式。
插件开发
插件通过 plugin.json 声明,返回一个数组注册事件钩子。插件 API v2 支持过滤器((),可统一注销)、首次/定时/批量发布事件、文章保存扩展字段、SEO Meta、Markdown 预处理、上传预处理,以及评论/登录/注册前置策略。
插件目录结构:
my-plugin/
├─ plugin.json # 元信息
├─ index.php # 主文件,返回钩子数组
└─ assets/ # 静态资源(可选)
plugin.json 示例:
{
"name": "My Plugin",
"version": "1.0.0",
"apiVersion": 2
}
主文件返回钩子数组,通过 ` 读写数据、记录日志、注册过滤器与 UI 插槽。卸载回调可在持久化数据清理前完成资源回收。详细 API 见主程序docs/plugins.md`。
开放 API
系统内置开放 API v1,使用 X-API-Key 鉴权。在后台「站点设置 → 开放 API」开启并生成密钥后,可通过 API 发布文章、管理分类标签、查询内容等,便于外部工具(采集器、笔记同步、小程序)对接。
请求头携带 X-API-Key: 你的密钥,响应为 JSON。API 路径自动适配伪静态/非伪静态两种部署。
GET /api/posts # 文章列表
POST /api/posts # 发布文章
GET /api/posts/{id} # 文章详情
GET /api/categories # 分类列表升级
后台「系统更新」页检查主程序新版本并一键升级。升级前自动整站备份(排除 runtime/backups/public/uploads 与 config.php),失败自动回滚。支持包内 upgrade.php 迁移脚本,配合 Migrator 服务执行增量数据库迁移。
数据库迁移:schema_migrations 表记录已应用版本,存量库自动识别基线,增量迁移幂等可重跑。新装与老装走同一条演进路径。
升级如有异常,可从备份恢复:后台「备份」页支持整站备份与数据库备份双模式。
常见问题
样式加载不出来? 静态资源走 /public/ 直链,Nginx 只需 try_files 伪静态即可,无需额外静态规则。若仍异常,确认 public/ 目录随程序包上传完整。
后台登录提示网络错误? 前端 API 走 pafishApi() 统一入口,自动适配伪静态/非伪静态。确认站点伪静态规则已生效,且未在子目录部署时遗漏前缀。
定时发布不生效? 推荐宝塔计划任务调用 cron.php;未配置时前台请求低频兜底也能生效,但精度较低。
缤纷云存储如何使用? 在后台启用缤纷云存储插件,填写 endpoint / accessKey / secretKey / bucket 即可,媒体上传自动存入云端。publicUrl 留空时自动用 endpoint 拼接。
如何添加社区或私有应用源? 在站点设置的应用商店地址处填写,应用源需遵循 runtime-store/v1 JSON 协议。