# FastAdmin / ThinkPHP CMS 文章发布 API

## 适用项目

gdcjgk.net（广东春季高考信息网），基于 ThinkPHP 5 + FastAdmin + CMS 插件。

## 发布接口选择

### 方案 A：CMS 自带 API（有 apikey 时）

```
POST https://gdcjgk.net/addons/cms/api/index
Content-Type: application/x-www-form-urlencoded

apikey=<API_KEY>&channel=<栏目名>&title=<标题>&content=<正文>&user=<作者昵称>
```

⚠️ **apikey 常见问题**：`config.php` 中有 `apikey` 字段定义，但默认值为空。值为空时 FastAdmin 后台「CMS 插件设置」中**不显示该字段**。需要通过数据库直接插入：

```sql
UPDATE fa_config SET value = JSON_SET(value, '$.apikey', 'your_key_here')
WHERE name = 'cms';
```

### 方案 B：独立接口（推荐，不依赖 apikey）

当 CMS 后台不显示 apikey 配置时，用独立 PHP 文件绕过：

```
POST https://gdcjgk.net/api_publish.php
Content-Type: application/json

{"token":"hermes2026","channel_id":227,"title":"标题","content":"<p>正文</p>"}
```

文件位置：网站根目录（与 `index.php` 同级），引导路径：
```php
define('APP_PATH', __DIR__ . '/application/');
require __DIR__ . '/thinkphp/start.php';
```

完整代码模板见 `templates/api_publish.php`。

## 栏目选择：必须用 ID，不能用名字

**栏目名不唯一**。例如「报考相关」同时存在于：
- 3+证书 > 报考相关 (id=227)
- 依学考 > 报考相关 (id=294)
- 现代学徒制 > 报考相关 (id=303)

用 `channel` 名称匹配会命中第一个，不可靠。**发布时必须用 `channel_id`**。

### 从 SQL 备份提取栏目树

```bash
# 提取所有叶子栏目（可直接发布的）
grep -oP "VALUES \(\d+, '\w+', \d+, \d+, '\K[^']+" backup.sql | sort -u
```

### gdcjgk.net 关键叶子栏目

| 分类 | 栏目 | ID |
|------|------|-----|
| 3+证书 | 报考相关 | 227 |
| 3+证书 | 填报相关 | 226 |
| 3+证书 | 技能证书 | 180 |
| 3+证书 | 报考须知 | 282 |
| 3+证书 | 填报须知 | 280 |
| 依学考 | 报考相关 | 294 |
| 依学考 | 填报相关 | 295 |
| 政策 | 广东政策 | 198 |
| 政策 | 政策解读 | 331 |
| 政策 | 省厅消息 | 301 |
| 政策 | 专业动态 | 189 |
| 升学 | 现代学徒制 | 262 |
| 升学 | 自主招生 | 263 |
| 升学 | 三二分段 | 193 |
| 升学 | 五年一贯制 | 279 |
| 辅导 | 辅导培训 | 176 |

## 数据库结构

- 表前缀：`fa_`
- 文章表：`fa_cms_archives`（模型 `app\admin\model\cms\Archives`，表别名 `cms_archives`）
- 栏目表：`fa_cms_channel`
- 必填字段：`channel_id`, `model_id`, `title`, `content`, `status`, `publishtime`
- 代码仓库：`Keibott/gdcjgk.net-copy`
