docs: refresh frontend integration notes

This commit is contained in:
wren
2026-05-06 09:42:29 +08:00
parent c54f84382b
commit b36e102aa0
9 changed files with 218 additions and 3970 deletions
+172 -23
View File
@@ -1,6 +1,6 @@
# 入口模块管理 API 完整技术文档
> **供前端对接使用** | 更新时间:2025-11-28 | 版本:v2.0
> **供前端对接使用** | 更新时间:2025-01-29 | 版本:v2.1
## 📋 目录
@@ -390,7 +390,9 @@ LIMIT 20 OFFSET 0;
**错误响应(500**
```json
{
"detail": "查询入口模块列表失败: connection to server failed"
"code": 500,
"msg": "查询入口模块列表失败: connection to server failed",
"data": []
}
```
@@ -470,7 +472,9 @@ WHERE id = 1; -- $1 参数化查询
**错误响应(404**
```json
{
"detail": "入口模块不存在: id=999"
"code": 404,
"msg": "入口模块不存在: id=999",
"data": []
}
```
@@ -606,7 +610,9 @@ RETURNING id, name, description, path, areas, created_at, updated_at;
**错误响应(400- 名称重复**
```json
{
"detail": "模块名称已存在: name=合同管理"
"code": 400,
"msg": "模块名称已存在: name=合同管理",
"data": []
}
```
@@ -756,21 +762,27 @@ RETURNING id, name, description, path, areas, created_at, updated_at;
**错误响应(404- 模块不存在**
```json
{
"detail": "入口模块不存在: id=999"
"code": 404,
"msg": "入口模块不存在: id=999",
"data": []
}
```
**错误响应(400- 名称已存在**
```json
{
"detail": "模块名称已存在: name=案卷智能评查"
"code": 400,
"msg": "模块名称已存在: name=案卷智能评查",
"data": []
}
```
**错误响应(400- 没有更新字段**
```json
{
"detail": "没有要更新的字段"
"code": 400,
"msg": "没有要更新的字段",
"data": []
}
```
@@ -849,7 +861,9 @@ DELETE FROM entry_modules WHERE id = 1;
**错误响应(404**
```json
{
"detail": "入口模块不存在: id=999"
"code": 404,
"msg": "入口模块不存在: id=999",
"data": []
}
```
@@ -862,6 +876,73 @@ DELETE FROM entry_modules WHERE id = 1;
### 6. 上传入口模块图标
> ⚠️ **重要更新 (v2.1)**:图片上传功能已修复JWT拦截问题,静态资源现在可以无需Token访问。
#### 🔥 前端常见问题及解决方案
**问题1:上传时报错 "Field required - body.file"**
```json
{
"code": 3000,
"msg": "参数校验错误",
"data": [
{
"type": "missing",
"loc": ["body", "file"],
"msg": "Field required"
}
]
}
```
**原因**:字段名错误或没有使用FormData上传
**正确做法**
```javascript
// ✅ 正确
const formData = new FormData();
formData.append('file', imageFile); // 字段名必须是 "file"
await fetch(`/api/v3/entry-modules/${moduleId}/image`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`
// ✅ 不要设置 Content-Type,让浏览器自动添加boundary
},
body: formData
});
// ❌ 错误示例
formData.append('image', imageFile); // 字段名错误
formData.append('picture', imageFile); // 字段名错误
body: JSON.stringify({file: base64}); // 不能用JSON
headers: {'Content-Type': 'multipart/form-data'} // 不要手动设置
```
**问题2:图片显示401 Unauthorized**
这是因为旧版本JWT中间件拦截了MinIO静态资源。
**已修复** ✅:
- MinIO路径(`/docauditai/`)已加入JWT白名单
- 图片现在可以**无需Token**直接访问
- 测试:`curl http://your-server/docauditai/documents/mz/static/img/entry_module_1.png`
**问题3:错误的图片访问路径**
```javascript
// ❌ 错误 - 硬编码路径
const imageUrl = `/docauditai/entryModule/${module.code}`;
// ✅ 正确 - 使用数据库path字段
const imageUrl = `http://172.16.0.81:9000/docauditai/${module.path}`;
// ✅ 或者使用上传接口返回的url字段(推荐)
const result = await uploadImage(moduleId, file);
const imageUrl = result.data.url;
```
#### 接口定义
```http
@@ -1067,28 +1148,52 @@ WHERE id = 1;
**错误响应(400- 不支持的格式**
```json
{
"detail": "不支持的图片格式: .pdf,支持的格式: .jpg, .jpeg, .png, .gif, .webp, .svg"
"code": 400,
"msg": "不支持的图片格式: .pdf,支持的格式: .jpg, .jpeg, .png, .gif, .webp, .svg",
"data": []
}
```
**错误响应(400- 文件为空**
```json
{
"detail": "文件内容为空"
"code": 400,
"msg": "文件内容为空",
"data": []
}
```
**错误响应(404- 模块不存在**
```json
{
"detail": "入口模块不存在: id=999"
"code": 404,
"msg": "入口模块不存在: id=999",
"data": []
}
```
**错误响应(422)- 缺少file字段** ⚠️ **常见错误**
```json
{
"code": 3000,
"msg": "参数校验错误",
"data": [
{
"type": "missing",
"loc": ["body", "file"],
"msg": "Field required",
"input": null
}
]
}
```
**错误响应(500- MinIO上传失败**
```json
{
"detail": "上传入口模块图片失败: S3 error: Access Denied"
"code": 500,
"msg": "上传入口模块图片失败: S3 error: Access Denied",
"data": []
}
```
@@ -1465,22 +1570,30 @@ api.interceptors.response.use(
(error) => {
if (error.response) {
const { status, data } = error.response;
// ⭐ v2.1更新:错误响应统一格式 {code, msg, data}
const errorMsg = data.msg || data.detail || '请求失败';
switch (status) {
case 401:
// Token过期,跳转登录
console.error('未授权:', errorMsg);
window.location.href = '/login';
break;
case 403:
// 无权限
console.error('权限不足');
console.error('权限不足:', errorMsg);
break;
case 404:
// 资源不存在
console.error(data.detail || '资源不存在');
console.error('资源不存在:', errorMsg);
break;
case 422:
// 参数校验错误
console.error('参数错误:', errorMsg, data.data);
break;
case 500:
// 服务器错误
console.error(data.detail || '服务器错误');
console.error('服务器错误:', errorMsg);
break;
}
}
@@ -1554,20 +1667,20 @@ export const entryModuleApi = {
/**
* 上传图标
* ⚠️ 注意:字段名必须是 "file",不要手动设置Content-Type
*/
uploadImage: (id: number, file: File) => {
const formData = new FormData();
formData.append('file', file);
formData.append('file', file); // ✅ 字段名必须是 "file"
return api.post<{
code: number;
msg: string;
data: ImageUploadResponse;
}>(`/entry-modules/${id}/image`, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
}>(`/entry-modules/${id}/image`, formData
// ✅ 不要设置Content-Typeaxios会自动设置
// 如果手动设置会缺少boundary参数导致上传失败
);
}
};
```
@@ -1776,7 +1889,43 @@ WHERE module = 'entry_module';
---
**文档版本**v2.0
**最后更新**2025-11-28
## 📝 版本更新记录
### v2.1 (2025-01-29)
**重要更新**
1. ✅ 修复JWT拦截MinIO静态资源问题
- MinIO路径(`/docauditai/`)已加入JWT白名单
- 图片现在可以无需Token访问
2. ✅ 统一错误响应格式
- 旧格式:`{"detail": "错误信息"}`
- 新格式:`{"code": xxx, "msg": "错误信息", "data": []}`
3. ✅ 新增图片上传常见问题解决方案
- 详细说明了"Field required - body.file"错误的解决方法
- 提供了正确的FormData使用示例
- 强调字段名必须是 "file"
4. ✅ 创建测试工具
- 新增HTML测试工具:`scripts/test_entry_module_image_upload.html`
- 可视化测试界面,帮助调试图片上传功能
**前端重要修改**
- ⚠️ 删除手动设置 `Content-Type: multipart/form-data`
- ⚠️ 使用 `data.msg` 替代 `data.detail` 获取错误信息
- ⚠️ 图片访问不要硬编码路径,使用数据库path字段
### v2.0 (2025-11-28)
- 完整的API文档
- 数据库设计详解
- 前端对接指南
- TypeScript类型定义
---
**当前版本**v2.1
**最后更新**2025-01-29
**维护者**Backend Team
**反馈渠道**[提交Issue](http://git.7bm.co:1024/leke/docauditai/-/issues)