Files
zhuiguang-ai/.trae/specs/modules/02-api.md
T

249 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API模块
## 前台API(无需认证)
### GET /api/health
健康检查端点(Docker HEALTHCHECK 使用)。
- 返回: `{ status: "ok", timestamp, checks: { database: { status: "ok", latencyMs } } }`
- 用于 Docker 容器健康检查 + 负载均衡探测
### GET /api/homepage
获取首页数据(含嵌套分类结构,一级分类+二级子分类)。
- 返回: `{ categories: CategoryWithChildren[], skillCategories: SkillCategoryWithChildren[] }`
### GET /api/categories
获取工具分类树形结构(含子分类),按sortOrder排序。
### GET /api/skill-categories
获取技能分类树形结构(含子分类),按sortOrder排序。
### GET /api/tools
获取已发布工具列表。
- Query: `categoryId`, `pricingModel`, `search`, `page`(默认1), `pageSize`(默认20)
- 返回: `{ tools: Tool[], total, page, pageSize }`
### GET /api/tools/[slug]
获取工具详情(by slug),浏览计数+1。
### GET /api/skills
获取已发布技能列表。
- Query: `category`, `search`, `page`, `pageSize`
- 返回: `{ skills: Skill[], total, page, pageSize }`
### GET /api/skills/[slug]
获取技能详情(by slug),浏览计数+1。
### GET /api/skills/[slug]/review
获取技能的五维评测数据(仅返回PUBLISHED状态)。
- 返回: `{ capability, devExp, costLicense, community, performance, overall, reviews, longArticle?, videoScript?, socialCards?, reviewedAt }`
### GET/POST /api/auth/[...nextauth]
NextAuth认证端点(登录/回调/CSRF等)。
### POST /api/auth/register
用户注册(邮箱+密码)。
### GET /api/categories/[slug]
获取分类详情。
### GET /api/daily-reports
获取AI日报列表。
### GET /api/recommendations
获取推荐内容。
### 评测榜单API(公开)
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/skill-reviews | GET | 获取评测列表(分页,仅PUBLISHED) |
| /api/skill-reviews/rankings | GET | 获取评测榜单:topByRating(评测分TOP10) + topByStarsChange(Stars涨幅周榜TOP10) |
---
## 用户相关API(需NextAuth用户认证)
### /api/user/profile
- GET: 获取当前用户资料
- PUT: 更新用户资料
### /api/user/favorites
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/user/favorites/status | GET | 获取收藏状态 |
| /api/user/favorites | GET | 获取当前用户收藏列表(工具+技能) |
| /api/user/favorites | POST | 添加收藏(body: { targetType, targetId }) |
| /api/user/favorites | DELETE | 取消收藏(body: { targetType, targetId }) |
### /api/user/history
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/user/history | GET | 获取浏览历史 |
| /api/user/history | POST | 记录浏览历史 |
### /api/user/collections
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/user/collections | GET | 获取收藏夹列表 |
| /api/user/collections | POST | 创建收藏夹 |
| /api/user/collections/[id] | GET | 获取单个收藏夹详情 |
| /api/user/collections/[id] | PUT | 更新收藏夹 |
| /api/user/collections/[id] | DELETE | 删除收藏夹 |
| /api/user/collections/[id]/items | GET | 获取收藏夹项目 |
| /api/user/collections/[id]/items | POST | 添加收藏夹项目 |
| /api/user/collections/[id]/items/[itemId] | PUT | 更新收藏夹项目 |
| /api/user/collections/[id]/items/[itemId] | DELETE | 删除收藏夹项目 |
---
## 后台API(需NextAuth认证)
### 分类管理
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/categories | GET | 获取所有分类(含工具数/子分类数) |
| /api/admin/categories | POST | 创建分类 |
| /api/admin/categories/[id] | PUT | 更新分类 |
| /api/admin/categories/[id] | DELETE | 删除分类(有工具/子分类时拒绝) |
| /api/admin/skill-categories | GET | 获取技能分类列表 |
| /api/admin/skill-categories | POST | 创建技能分类 |
| /api/admin/skill-categories/[id] | PUT | 更新技能分类 |
| /api/admin/skill-categories/[id] | DELETE | 删除技能分类 |
### 工具管理
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/tools | GET | 获取所有工具(分页) |
| /api/admin/tools | POST | 创建工具(requireAdmin + 输入校验 + categoryId有效性校验 + slug自动去重) |
| /api/admin/tools/[id] | PUT | 更新工具 |
| /api/admin/tools/[id] | DELETE | 删除工具 |
### 技能管理
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/skills | GET | 获取所有技能(分页) |
| /api/admin/skills/[id] | PUT | 更新技能 |
| /api/admin/skills/[id] | DELETE | 删除技能 |
### 待审核工具
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/pending | GET | 获取待审核工具列表(分页) |
| /api/admin/pending | DELETE | 清空所有待审核工具 |
| /api/admin/pending/[id] | PUT | 编辑待审核工具(websiteUrl变更时自动抓Logo) |
| /api/admin/pending/[id] | DELETE | 删除单个待审核工具 |
| /api/admin/pending/[id]/publish | POST | 发布为正式工具 |
| /api/admin/pending/batch | POST | 批量导入(去重+自动抓Logo) |
| /api/admin/pending/batch-publish | POST | 批量发布(ids数组,最多500条,categoryId动态回退) |
| /api/admin/pending/batch-reject | POST | 批量拒绝(ids数组) |
| /api/admin/pending/fetch-logos | POST | 批量抓取Logo(body: {scope, refetch?}) |
### 待审核技能
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/pending-skills | GET | 获取待审核技能列表(分页) |
| /api/admin/pending-skills | DELETE | 清空所有待审核技能 |
| /api/admin/pending-skills/[id] | PUT | 编辑待审核技能 |
| /api/admin/pending-skills/[id] | DELETE | 删除单个待审核技能 |
| /api/admin/pending-skills/[id]/publish | POST | 发布为正式技能 |
| /api/admin/pending-skills/batch | POST | 批量导入(去重) |
| /api/admin/pending-skills/batch-publish | POST | 批量发布(ids数组,最多500条,categoryId动态回退) |
| /api/admin/pending-skills/batch-reject | POST | 批量拒绝(ids数组) |
| /api/admin/pending-skills/publish-all | POST | 一键发布所有待审核技能(categoryId动态回退) |
### AI发现与检测(提示词+JSON粘贴模式,不调用外部AI API)
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/discover-tools | POST | 导入工具JSON数组(body: {tools: [...], categoryId}),自动去重导入待审核列表 |
| /api/admin/discover-skills | POST | 导入技能JSON数组(body: {skills: [...], categoryId}),自动去重导入待审核列表 |
| /api/admin/discover-skills/run | POST | 一键运行技能探索 |
| /api/admin/discover-news | POST | 导入新闻JSON数组(body: {items: [...]}),自动生成今日AI日报 |
| /api/admin/discover-news | GET | 获取今日AI日报 |
| /api/admin/check-tools | POST | 检测工具网站可访问性+抓取缺失Logo(body: {type: "published"/"pending"}),返回logoFetched/logoMethod/logoUrl |
| /api/admin/update-stars | POST | 更新GitHub Star数(body: {type: "published"/"pending"}) |
### 评测管理
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/reviews | GET | 获取评测列表 |
| /api/admin/reviews/[id] | GET | 获取单个评测详情 |
| /api/admin/reviews/[id] | PUT | 更新评测状态 |
| /api/admin/reviews/[id]/generate | POST | AI生成评测内容(长文+视频脚本+社交卡片) |
### 系统配置
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/system-config | GET | 获取所有配置 |
| /api/admin/system-config | PUT | 批量更新配置(upsert) |
### 角色权限管理
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/roles | GET | 获取所有角色列表 |
| /api/admin/roles | POST | 创建角色 |
| /api/admin/roles/[id] | PUT | 更新角色 |
| /api/admin/roles/[id] | DELETE | 删除角色 |
| /api/admin/permissions | GET | 获取全部权限点列表 |
| /api/admin/user-permissions | GET | 获取当前用户权限(roleId/userId/当前用户) |
### Bot管理API
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/bots/stats | GET | Bot表现统计(每日指标+汇总,支持?days和?botUserId) |
| /api/admin/bots/experiments | GET | A/B实验看板数据(变体/实验/每日指标聚合) |
| /api/admin/bots/experiments/run | POST | 手动触发A/B实验(body: {mode, lookback, noSwitch}) |
| /api/admin/bots/experiments/variants | PATCH | 更新变体(权重/启用/重置样本) |
| /api/admin/bots/experiments/variants | DELETE | 删除变体 |
| /api/admin/bots/adversarial-learning | GET | 对抗学习看板(支持?weeks和?botUserId) |
| /api/admin/bots/adversarial-learning/run | POST | 手动触发对抗学习(body: {weekKey, force, lookback, bot}) |
### 日报管理
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/daily-reports | GET | 获取日报列表 |
| /api/admin/daily-reports/[id] | GET | 获取单个日报详情 |
| /api/admin/daily-reports/[id] | PUT | 更新日报 |
| /api/admin/daily-reports/[id] | DELETE | 删除日报 |
| /api/admin/daily-reports/generate | POST | AI一键生成日报内容 |
### 任务调度API(需NextAuth认证)
| 路由 | 方法 | 功能 |
|------|------|------|
| /api/admin/tasks/configs | GET | 获取全部6个任务配置(合并TaskConfig+默认值) |
| /api/admin/tasks/configs | PUT | 更新/创建任务配置(body: { taskKey, enabled?, cronExpr?, config? }) |
| /api/admin/tasks/logs | GET | 获取任务执行日志(分页,query: taskKey?, page, pageSize) |
| /api/admin/tasks/run | POST | 手动触发任务执行(body: { taskKey }),通过child_process.exec运行对应脚本 |
---
## SystemConfig 配置键
| Key | 类型 | 说明 |
|-----|------|------|
| discoveryPromptConfig | JSON | AI发现提示词配置(含toolPrompt/skillPrompt/newsPrompt/tagPool等) |
| logoFetchConfig | JSON | Logo抓取策略配置 |
| discoverSkillsScript | string | 技能探索脚本源码 |
---
## 开发规则引用
> API 开发必须遵守 [开发规则第十七章 - API设计规范](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/.trae/rules/project_rules.md):
> - 路由骨架:`export const dynamic = "force-dynamic"` + `Promise.all` 并行 + `Cache-Control` 头
> - 错误处理:使用 [api-error.ts](file:///c:/SGP_KF/ZhuiGuangAI/zhuiguang-ai/src/lib/api-error.ts) 的 `badRequest`/`notFound`/`serverError`
> - 响应格式:列表 `{ data, total, page, pageSize }`,统一使用 `total`
> - 状态码:200/201/400/401/403/404/409/500
> - 认证分层:middleware + `requireAdmin()` + `getServerSession()`
> - 分页上限:`Math.min(pageSize, 100)`