PHLI API 接口插件

PHLI API 接口插件为 PHLI(原 Prain 清雨)博客系统提供完整的 RESTful API,覆盖全部后台管理功能,可用于开发移动端 APP、小程序、第三方客户端等。

插件版本1.0.0
适用系统PHLI ≥ 1.3.0
插件IDapi
配套插件api-auth(API 权限管理,可选)

快速开始

安装

  1. api 文件夹放入 ext/ 目录
  2. 在 PHLI 后台 → 扩展管理 中安装「API接口」插件
  3. 安装后系统自动生成 32 位随机 API Key
  4. 在后台 → API设置 中查看和管理 API Key

URL 格式

API 地址取决于是否开启伪静态:

伪静态URL 格式示例
开启/api/{module}/{action}https://blog.com/api/article/list/1
关闭/?api/{module}/{action}https://blog.com/?api/article/list/1

可通过 api/check 接口返回的 rewrite 字段判断伪静态状态。

认证方式

所有 API 请求(api/check 除外)均需携带 API Key,支持两种方式:

方式一:请求头(推荐)

X-API-Key: your_api_key_here

方式二:Bearer Token

Authorization: Bearer your_api_key_here

响应格式

所有接口统一返回 JSON 格式:

成功响应

{
  "error": false,
  "code": 0,
  "message": "操作成功",
  "data": { ... }
}

错误响应

{
  "error": true,
  "code": 401,
  "message": "API Key无效",
  "data": []
}

常见错误码

错误码含义
400请求参数错误或请求方式不正确
401API Key 无效或未提供
403权限不足(api-auth 限制)
404接口不存在或资源不存在
500服务器内部错误

接口总览

模块接口方法说明
系统api/checkGET 无需认证连接检测
api/systemGET获取系统信息
api/system/checkUpdateGET检查系统更新
api/system/updatePOST执行系统更新
api/system/dbUpdatePOST数据库版本更新
文章api/article/list/{page}GET文章列表
api/article/detail/{id}GET文章详情
api/article/createPOST创建文章
api/article/updatePOST更新文章
api/article/deletePOST删除文章
api/article/movePOST移动文章分类/标签
分类api/category/listGET分类列表
api/category/addPOST添加分类
api/category/editPOST编辑分类
api/category/savePOST批量保存分类
api/category/deletePOST删除分类
标签api/tag/listGET标签列表
评论api/comment/list/{articleId}GET文章评论列表
api/comment/listallPOST全部评论列表
api/comment/deletePOST删除评论
链接api/link/listGET友情链接列表
api/link/addPOST添加链接
api/link/editPOST编辑链接
api/link/savePOST批量保存链接
api/link/deletePOST删除链接
导航api/navbar/listGET导航菜单列表
api/navbar/addPOST添加导航
api/navbar/editPOST编辑导航
api/navbar/savePOST批量保存导航
api/navbar/deletePOST删除导航
设置api/setting/getGET获取博客设置
设置api/setting/savePOST保存博客设置
上传api/upload/uploadPOST文件上传
主题api/theme/listGET主题列表
api/theme/installPOST启用主题
api/theme/deletePOST删除主题
api/theme/settingPOST获取主题设置页
api/theme/saveSettingPOST保存主题设置
扩展api/ext/listGET扩展列表
api/ext/installPOST安装扩展
api/ext/uninstallPOST卸载扩展
api/ext/deletePOST删除扩展
api/ext/settingPOST获取扩展设置页
日志api/log/statsGET日志统计
api/log/settingGET日志开关设置
api/log/listPOST日志列表
api/log/clearPOST清空日志
api/log/settingPOST修改日志开关

1. 系统模块

1.1 连接检测 无需认证

用于检测 API 是否可用及获取站点基本信息。

GET/api/check
{
  "error": false,
  "code": 0,
  "message": "操作成功",
  "data": {
    "title": "我的博客",
    "name": "PHLI",
    "intro": "一个简单的博客",
    "avatar": "https://blog.com/db/upload/202601/01_120000_123.jpg",
    "version": "1.3.2",
    "url": "https://blog.com",
    "rewrite": true
  }
}
提示:rewrite 字段用于判断 URL 格式,true 表示伪静态开启,false 表示关闭。

1.2 获取系统信息

GET/api/system

响应 data 字段

字段类型说明
versionstringPHLI 版本号
dbVersionstring数据库版本
articleCountint文章总数
commentCountint评论总数
categoryCountint分类总数
tagCountint标签总数
linkCountint链接总数
navbarCountint导航总数
extCountint扩展总数
themeCountint主题总数
viewsint总浏览量
phpVersionstringPHP 版本

1.3 检查系统更新

GET/api/system/checkUpdate
字段类型说明
currentVersionstring当前版本
latestVersionstring最新版本
hasUpdatebool是否有更新

1.4 执行系统更新

POST/api/system/update

无参数,直接调用即执行更新。

1.5 数据库版本更新

POST/api/system/dbUpdate

无参数,同步数据库结构到最新版本。

2. 文章模块

2.1 文章列表

GET/api/article/list/{page}

查询参数

参数类型必填说明
pageSizeint每页条数,默认使用系统设置
cidstring按分类ID筛选
tagstring按标签筛选
keywordstring按标题关键词搜索

响应 data 字段

字段类型说明
listarray文章列表
list[].idstring文章URL名称(唯一标识)
list[].cidstring所属分类ID
list[].categorystring所属分类名称
list[].titlestring文章标题
list[].introstring文章摘要
list[].imgstring缩略图完整URL
list[].isTopint是否置顶(0/1)
list[].isPrivateint是否私密(0/1)
list[].isCommentint是否允许评论(0/1)
list[].isFkint是否FK格式(0/1)
list[].commentsint评论数
list[].viewsint浏览量
list[].tagarray标签数组
list[].timestring创建时间
list[].updateTimestring更新时间
list[].urlstring文章访问URL
countint文章总数
currentPageint当前页码
countPageint总页数
pageSizeint每页条数

2.2 文章详情

GET/api/article/detail/{id}

路径参数

参数类型必填说明
idstring文章URL名称

响应包含文章列表所有字段,额外增加:

字段类型说明
contentstring解析后的HTML内容(图片URL已补全)
rawContentstring原始内容(图片URL已补全)
重要:content 是经过 FK 解析的 HTML,rawContent 是原始保存的内容。编辑文章时应使用 rawContent

2.3 创建文章

POST/api/article/create

请求参数(application/x-www-form-urlencoded)

参数类型必填说明
titlestring文章标题
contentstring文章内容(HTML)
idstringURL名称,留空自动生成(T+时间戳)
cidstring分类ID
tagstring标签,空格分隔
introstring摘要,留空自动截取
isTopint是否置顶,默认0
isPrivateint是否私密,默认0
isCommentint允许评论,默认0
isFkintFK格式,默认0
{
  "error": false,
  "code": 0,
  "message": "创建成功",
  "data": { "id": "my-first-post" }
}
注意:content 中的图片完整URL会自动转换为相对路径存储。

2.4 更新文章

POST/api/article/update
参数类型必填说明
idstring原文章URL名称
titlestring文章标题
contentstring文章内容
newIdstring新URL名称,留空保持不变
cidstring分类ID
tagstring标签,空格分隔
introstring摘要
isTopint是否置顶
isPrivateint是否私密
isCommentint允许评论
isFkintFK格式
注意:如果 newIdid 不同,系统会自动迁移文章数据和评论数据。

2.5 删除文章

POST/api/article/delete
参数类型必填说明
idstring/array文章URL名称,支持批量(传数组)

批量删除示例:id[0]=first-post&id[1]=second-post

2.6 移动文章

POST/api/article/move
参数类型必填说明
idstring/array文章URL名称,支持批量
cidstring目标分类ID或标签名
typestring移动类型:category(默认)或 tag

3. 分类模块

3.1 分类列表

GET/api/category/list
字段类型说明
idstring分类别称(唯一标识)
namestring分类名称
introstring分类描述
countint文章数量
urlstring分类页URL
重要:PHLI 的分类使用关联数组存储,id(别称)是字符串键名,不是自增数字。

3.2 添加分类

POST/api/category/add
参数类型必填说明
idstring分类别称(如 php、tech),唯一标识
namestring分类名称
introstring分类描述

3.3 编辑分类

POST/api/category/edit
参数类型必填说明
idstring分类别称
namestring分类名称
introstring分类描述

3.4 批量保存分类

POST/api/category/save

用于后台管理页面的全量保存模式,参数为数组格式。

参数类型必填说明
idarray原分类别称数组
newIdarray新分类别称数组
namearray分类名称数组
introarray分类描述数组
delIdarray要删除的分类别称数组

3.5 删除分类

POST/api/category/delete
参数类型必填说明
idstring/array分类别称,支持批量

删除分类后,该分类下的文章 cid 会被置空。

4. 标签模块

4.1 标签列表

GET/api/tag/list
字段类型说明
namestring标签名称
countint文章数量
urlstring标签页URL
标签为只读,由系统根据文章标签自动生成,无增删改接口。

5. 评论模块

5.1 文章评论列表

GET/api/comment/list/{articleId}?page=1&pageSize=10
参数类型必填说明
articleIdstring文章URL名称(路径参数)
pageSizeint每页条数(查询参数)
字段类型说明
idint评论ID
pidint父评论ID
adminbool是否管理员评论
namestring评论者名称
contactstring联系方式
contentstring评论内容
ipstringIP地址
timeint时间戳
timeTextstring人性化时间文本
childarray子评论

5.2 全部评论列表

POST/api/comment/listall

聚合所有文章的评论,按时间倒序排列。

参数类型必填说明
pageint页码,默认1
pageSizeint每页条数,默认20

额外字段:

字段类型说明
articleIdstring所属文章ID
articleTitlestring所属文章标题

5.3 删除评论

POST/api/comment/delete
参数类型必填说明
articleIdstring文章URL名称
commentIdint评论ID

6.1 链接列表

GET/api/link/list
字段类型说明
namestring链接名称
urlstring链接地址
targetint是否新窗口打开(0/1)

6.2 添加链接

POST/api/link/add
参数类型必填说明
namestring链接名称
urlstring链接地址
targetint新窗口打开,默认0

6.3 编辑链接

POST/api/link/edit
参数类型必填说明
indexint链接索引(从列表中获取)
namestring链接名称
urlstring链接地址
targetint新窗口打开

6.4 批量保存链接

POST/api/link/save

参数为数组格式,用于后台全量保存。

参数类型必填说明
namearray名称数组
urlarray地址数组
targetarray新窗口打开的索引数组

6.5 删除链接

POST/api/link/delete
参数类型必填说明
indexint链接索引

7. 导航菜单模块

7.1 导航列表

GET/api/navbar/list
字段类型说明
namestring导航名称
urlstring导航地址
targetint是否新窗口打开(0/1)
childarray子导航

7.2 添加导航

POST/api/navbar/add
参数类型必填说明
namestring导航名称
urlstring导航地址
targetint新窗口打开,默认0

7.3 编辑导航

POST/api/navbar/edit
参数类型必填说明
indexint导航索引
namestring导航名称
urlstring导航地址
targetint新窗口打开

7.4 批量保存导航

POST/api/navbar/save

参数格式同链接批量保存。

7.5 删除导航

POST/api/navbar/delete
参数类型必填说明
indexint导航索引

8. 设置模块

8.1 获取设置

GET/api/setting/get
字段类型说明
titlestring网站标题
namestring网站名称
introstring网站描述
moodstring心情记录
keystringSEO关键字
descstringSEO描述
briefint摘要字数限制
avatarstring头像完整URL
usernamestring管理员昵称
compilebool自动编译
debugint调试模式(0/1/2)
rewritebool伪静态
articlePagingint每页文章数
commentRestrictint每日评论限制
commentPagingint每页评论数
vcodeOpenbool验证码开关
thumbOpenbool缩略图开关
thumbWidthint缩略图宽度
thumbHeightint缩略图高度
thumbTypeint缩略方式(1=裁剪,2=等比)
icpstringICP备案号
prnstring公安备案号
viewsint总浏览量
sensitivestring敏感词(空格分隔)
blackliststringIP黑名单(空格分隔)
jsstring自定义JS代码

8.2 保存设置

POST/api/setting/save

只需传递需要修改的字段,未传递的字段保持原值。

参数类型必填说明
titlestring网站标题
namestring网站名称
introstring网站描述
moodstring心情记录
keystringSEO关键字
descstringSEO描述
briefint摘要字数
avatarstring头像(完整URL会自动转相对路径)
usernamestring管理员昵称
passwordstring新密码(MD5加密存储)
compilebool自动编译
debugint调试模式
rewritebool伪静态
articlePagingint每页文章数
commentRestrictint每日评论限制
commentPagingint每页评论数
vcodeOpenbool验证码开关
thumbOpenbool缩略图开关
thumbWidthint缩略图宽度
thumbHeightint缩略图高度
thumbTypeint缩略方式
icpstringICP备案号
prnstring公安备案号
viewsint浏览量(不传则不修改)
sensitivestring敏感词
blackliststringIP黑名单
jsstring自定义JS
重要:views 字段仅在明确传值时才会更新,不传或传空不会覆盖现有值。password 仅在传入非空值时更新。

9. 文件上传模块

9.1 上传文件

POST/api/upload/upload

请求格式:multipart/form-data

参数类型必填说明
filefile上传的文件

允许的文件类型:jpg, jpeg, png, gif, bmp, webp, mp4, mp3, pdf, doc, docx, xls, xlsx, zip, rar, txt, md

字段类型说明
uploadNamestring原始文件名
newNamestring新文件名
extstring文件扩展名
urlstring文件完整URL
pathstring相对存储路径
sizeint文件大小(字节)
thumbstring缩略图路径(仅图片且开启缩略图时)

请求示例(JavaScript)

const formData = new FormData();
formData.append('file', fileInput.files[0]);

fetch('https://blog.com/api/upload/upload', {
  method: 'POST',
  headers: { 'X-API-Key': 'your_api_key' },
  body: formData
})
注意:上传文件时不要设置 Content-Type 请求头,浏览器会自动设置 multipart/form-data 及 boundary。

10. 主题模块

10.1 主题列表

GET/api/theme/list
字段类型说明
listarray主题列表
list[].idstring主题ID
list[].namestring主题名称
list[].introstring主题介绍
list[].versionstring主题版本
list[].iconstring主题图标完整URL
list[].settingbool是否有设置项
list[].isActivebool是否当前使用
countint主题总数
currentstring当前主题ID

10.2 启用主题

POST/api/theme/install
参数类型必填说明
idstring主题ID

10.3 删除主题

POST/api/theme/delete
参数类型必填说明
idstring主题ID(不能删除当前使用的主题)

10.4 获取主题设置页

POST/api/theme/setting
参数类型必填说明
idstring主题ID
字段类型说明
htmlstring主题设置页HTML内容

10.5 保存主题设置

POST/api/theme/saveSetting
参数类型必填说明
idstring主题ID
dataany设置数据

11. 扩展模块

11.1 扩展列表

GET/api/ext/list
字段类型说明
installListarray已安装扩展列表
installList[].idstring扩展ID
installList[].namestring扩展名称
installList[].introstring扩展介绍
installList[].versionstring扩展版本
installList[].iconstring扩展图标完整URL
installList[].settingbool是否有设置项
installList[].installedbool是否已安装(true)
notInstallListarray未安装扩展列表(字段同上,installed=false)
installCountint已安装数量
countint扩展总数

11.2 安装扩展

POST/api/ext/install
参数类型必填说明
idstring扩展ID

11.3 卸载扩展

POST/api/ext/uninstall
参数类型必填说明
idstring扩展ID(不能卸载 api 扩展)

11.4 删除扩展

POST/api/ext/delete
参数类型必填说明
idstring扩展ID(需先卸载才能删除)

11.5 获取扩展设置页

POST/api/ext/setting
参数类型必填说明
idstring扩展ID
字段类型说明
htmlstring扩展设置页HTML内容

12. 日志模块

12.1 日志统计

GET/api/log/stats
字段类型说明
totalint日志总数
todayint今日请求数
failint失败请求数
authFailint认证失败数
topIpsobjectTOP10 IP 及请求数
topModulesobjectTOP10 模块及请求数

12.2 获取日志开关

GET/api/log/setting
字段类型说明
logEnabledint日志开关(1=开启,0=关闭)

12.3 日志列表

POST/api/log/list
参数类型必填说明
pageint页码,默认1
pageSizeint每页条数,默认20,最大100
statusstring筛选状态:success/fail/auth_fail
modulestring筛选模块名
ipstring筛选IP(模糊匹配)
startDatestring开始日期(YYYY-MM-DD)
endDatestring结束日期(YYYY-MM-DD)
字段类型说明
timestring请求时间
ipstring请求IP
modulestring模块名
actionstring操作名
methodstringHTTP方法
statusstring状态
uastringUser-Agent
extrastring附加信息

12.4 清空日志

POST/api/log/clear

无参数。

12.5 修改日志开关

POST/api/log/setting
参数类型必填说明
logEnabledint1=开启,0=关闭

API 权限管理(api-auth 插件)

概述

api-auth 插件为 API 提供多 Key 权限分配功能。安装后,除原始 API Key(超级管理员)外,可创建多个子 Key,每个 Key 拥有独立的权限配置。

认证优先级

  1. 原始 API Key → 超级管理员,拥有全部权限
  2. api-auth 子 Key → 根据权限配置校验
  3. 无匹配 Key → 401 错误

权限格式

格式说明
*全部权限
module:*指定模块的全部权限
module:read模块读取权限(GET 请求)
module:write模块写入权限(POST 创建/编辑)
module:delete模块删除权限

权限模块列表

模块可用权限
articleread, write, delete
categoryread, write, delete
tagread
commentread, delete
linkread, write, delete
navbarread, write, delete
settingread, write
uploadwrite
themeread, write, delete
extread, write, delete
logread, write
systemread, write

权限示例

{
  "permissions": [
    "article:read",
    "article:write",
    "category:read",
    "tag:read"
  ]
}

此配置允许查看和编辑文章、查看分类和标签,但不能删除文章或修改其他模块。

开发指南

伪静态自适应

开发客户端时,应先调用 api/check 接口获取 rewrite 字段,据此构建后续请求的 URL:

// 检测伪静态并构建基础URL
const checkRes = await fetch(blogUrl + '/?api/check');
const checkData = await checkRes.json();
const rewrite = checkData.data.rewrite;
const baseUrl = rewrite
  ? blogUrl + '/api/'
  : blogUrl + '/?api/';

// 后续请求
fetch(baseUrl + 'article/list/1', {
  headers: { 'X-API-Key': apiKey }
});

图片路径处理

内容编辑注意事项

错误处理建议

async function apiRequest(url, options = {}) {
  const res = await fetch(url, {
    ...options,
    headers: {
      'X-API-Key': apiKey,
      'Content-Type': 'application/x-www-form-urlencoded',
      ...options.headers
    }
  });

  const data = await res.json();

  if (data.error) {
    switch (data.code) {
      case 401: // API Key 无效,跳转配置页
        break;
      case 403: // 权限不足
        break;
      case 404: // 接口不存在
        break;
      default:  // 其他错误
        break;
    }
    throw new Error(data.message);
  }

  return data;
}

CORS 支持

API 已内置 CORS 支持,响应头包含:

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-API-Key, Authorization, Content-Type
Access-Control-Allow-Methods: GET, POST, OPTIONS

OPTIONS 预检请求会自动返回 200,无需额外处理。

常见问题

Q:API Key 在哪里获取?

A:在 PHLI 后台 → 扩展管理 → API接口 → 设置 中查看,支持重新生成。

Q:如何判断伪静态是否开启?

A:调用 GET /api/check 接口,返回的 rewrite 字段为 true 表示开启。

Q:文章的 id 是什么?

A:文章 ID 是 URL 名称(如 my-first-post),不是数字自增ID。创建时可自定义,留空则自动生成 T + 时间戳格式。

Q:分类的 id 是什么?

A:分类 ID 是分类别称(如 phptech),是字符串类型,不是数字。

Q:上传文件时为什么返回 400?

A:请确保使用 multipart/form-data 格式提交,且不要手动设置 Content-Type 请求头。文件字段名必须为 file

Q:保存设置后浏览量变成 0 了?

A:views 字段仅在明确传值时更新。保存设置时,如果不需修改浏览量,请不要传递 views 参数。

Q:如何实现多用户权限?

A:安装 api-auth 扩展插件,在后台创建多个 API Key 并分配不同权限。