Files
panda b9137204a0 fix: FilePreview fileType case + Tailwind v4 gradient transparent bug
- FilePreview.vue: add normalizedFileType computed to handle backend
  returning uppercase HTML/MD/PPTX (fixes preview/download buttons)
- FilePreview.vue: bg-gradient-to-r from-orange-500 -> bg-orange-500
  (Tailwind v4 gradient + CSS variable = transparent)
- ReportCard.vue: bg-gradient-to-r -> bg-orange-600 for selected state
- Add .opencode/, node_modules/, dist/ to .gitignore
- Initial git setup for publish project
2026-05-24 20:09:42 +08:00

7.8 KiB
Raw Permalink Blame History

日报分发平台 API 文档

本文档面向人工阅读和 AI Agent 调用。接口均 REST 风格,JSON 格式(除文件下载外)。


基础信息

本地开发: http://localhost:37821 Docker 部署: http://<服务器IP>:41733(前端代理到后端)

Docker 部署时,前端(41733)会自动将 /api/*/uploads/* 请求转发到后端,无需单独访问后端端口。

认证: 当前接口均无需认证(开放接口)


1. 项目管理

1.1 获取所有项目

请求

GET /api/projects

Python

import requests
resp = requests.get("http://192.168.31.240:41733/api/projects")
print(resp.json())

curl

curl http://192.168.31.240:41733/api/projects

响应 200 OK

[
  {
    "id": 1,
    "name": "MiniMax 日报",
    "description": "MiniMax 日报分发",
    "coverImage": null,
    "createdAt": "2026-05-24T11:23:28.734",
    "reportCount": 1,
    "todayNewReports": 1
  }
]
字段 类型 说明
id Long 项目 ID
name String 项目名称
description String 项目描述
coverImage String? 封面图片 URL,无则为 null
createdAt String 创建时间(ISO 8601
reportCount Integer 该项目报告总数
todayNewReports Integer 今日新增报告数

1.2 创建项目

请求

POST /api/projects
Content-Type: application/json

Body

{
  "name": "项目名称",
  "description": "项目描述"
}

Python

import requests
resp = requests.post(
    "http://192.168.31.240:41733/api/projects",
    json={"name": "新项目", "description": "描述"}
)
print(resp.json())

curl

curl -X POST http://192.168.31.240:41733/api/projects \
  -H "Content-Type: application/json" \
  -d '{"name":"新项目","description":"描述"}'

响应 201 Created

{
  "id": 2,
  "name": "新项目",
  "description": "描述",
  "coverImage": null,
  "createdAt": "2026-05-24T11:33:34.658",
  "reportCount": 0,
  "todayNewReports": 0
}

1.3 更新项目(含封面上传)

请求

PUT /api/projects/{projectId}
Content-Type: multipart/form-data

表单字段

参数 类型 必填 说明
name String 项目新名称
description String 项目描述
coverImage File 封面图片,支持 jpg/png/webp/gif

Python

import requests
resp = requests.put(
    "http://192.168.31.240:41733/api/projects/1",
    data={"name": "新名称"},
    files={"coverImage": open("cover.png", "rb")}
)
print(resp.json())

curl

curl -X PUT http://192.168.31.240:41733/api/projects/1 \
  -F "name=新名称" \
  -F "coverImage=@cover.png"

响应 200 OK — 返回更新后的项目对象,字段同 1.1


1.4 删除项目

请求

DELETE /api/projects/{projectId}

Python

import requests
requests.delete("http://192.168.31.240:41733/api/projects/1")

curl

curl -X DELETE http://192.168.31.240:41733/api/projects/1

响应 204 No Content(成功无返回体)


2. 报告管理

2.1 获取项目下的报告列表

请求

GET /api/reports?projectId={projectId}

Python

import requests
resp = requests.get("http://192.168.31.240:41733/api/reports?projectId=1")
print(resp.json())

curl

curl "http://192.168.31.240:41733/api/reports?projectId=1"

响应 200 OK

[
  {
    "id": 1,
    "projectId": 1,
    "fileName": "MiniMax_Daily_2026-05-23.html",
    "fileType": "HTML",
    "filePath": "/app/uploads/1/1779622289908_MiniMax_Daily_2026-05-23.html",
    "uploadTime": "2026-05-24T11:31:29.919",
    "fileContent": null
  }
]
字段 类型 说明
id Long 报告 ID
projectId Long 所属项目 ID
fileName String 文件名(含扩展名)
fileType String 文件类型:HTML / MD / PPTX
filePath String 服务器存储路径
uploadTime String 上传时间(ISO 8601
fileContent String? 文件内容(列表中为 null,详情接口有值)

2.2 上传报告文件

请求

POST /api/reports
Content-Type: multipart/form-data

表单字段

参数 类型 必填 说明
file File 报告文件本体
projectId Long 上传到哪个项目 ID
fileType String 文件类型,取值:HTML / MD / PPTX

文件类型对应关系

fileType 对应扩展名 说明
HTML .html 网页格式,推荐
MD .md Markdown 格式
PPTX .pptx PowerPoint 格式

Python

import requests
resp = requests.post(
    "http://192.168.31.240:41733/api/reports",
    data={"projectId": 1, "fileType": "HTML"},
    files={"file": ("日报.html", open("日报.html", "rb"), "text/html")}
)
print(resp.json())

curl

curl -X POST http://192.168.31.240:41733/api/reports \
  -F "file=@日报.html" \
  -F "projectId=1" \
  -F "fileType=HTML"

注意:requests.post(url, data={...}, files={...}) 中,projectIdfileType 放在 data 中,文件放在 files 中。错误示例:放在同一个 dict 中。

响应 201 Created

{
  "id": 1,
  "projectId": 1,
  "fileName": "MiniMax_Daily_2026-05-23.html",
  "fileType": "HTML",
  "filePath": "/app/uploads/1/1779622289908_MiniMax_Daily_2026-05-23.html",
  "uploadTime": "2026-05-24T11:31:29.919",
  "fileContent": null
}

2.3 获取报告详情(含文件内容)

请求

GET /api/reports/{reportId}

Python

import requests
resp = requests.get("http://192.168.31.240:41733/api/reports/1")
data = resp.json()
print(data['fileContent'])  # HTML/MD 文件的原文内容

curl

curl http://192.168.31.240:41733/api/reports/1

响应 200 OK

{
  "id": 1,
  "projectId": 1,
  "fileName": "MiniMax_Daily_2026-05-23.html",
  "fileType": "HTML",
  "filePath": "/app/uploads/1/1779622289908_MiniMax_Daily_2026-05-23.html",
  "uploadTime": "2026-05-24T11:31:29.919",
  "fileContent": "<!DOCTYPE html><html>...</html>"
}

2.4 下载报告原始文件

请求

GET /api/reports/{reportId}/download

Python

import requests
resp = requests.get("http://192.168.31.240:41733/api/reports/1/download")
with open("report.html", "wb") as f:
    f.write(resp.content)

curl

curl -o report.html http://192.168.31.240:41733/api/reports/1/download

响应 200 OKBody 为文件的原始字节流(application/octet-stream


2.5 删除报告

请求

DELETE /api/reports/{reportId}

Python

import requests
requests.delete("http://192.168.31.240:41733/api/reports/1")

curl

curl -X DELETE http://192.168.31.240:41733/api/reports/1

响应 204 No Content


3. 健康检查

请求

GET /actuator/health

Python

import requests
resp = requests.get("http://192.168.31.240:41733/actuator/health")
print(resp.json())  # {"status": "UP"}

4. 错误码

HTTP 状态 说明
200 成功
201 创建成功
204 删除成功(无返回体)
400 参数错误(如 fileType 不支持)
404 项目或报告不存在
500 服务器错误

常见 500 错误原因:

  • MissingServletRequestParameterException: 缺少必填参数(如上传时缺少 projectIdfileType
  • MultipartException: 请求不是 multipart 格式(上传接口必须用 multipart/form-data
  • NoResourceFoundException: 接口路径不存在(确认 URL 是否正确)