# 作品上传和更新接口完整文档

## 📖 概述

本文档详细说明了工作流和课程的上传、更新接口，包括详情图集功能的完整使用方法。

## 🎯 功能特性

- ✅ **工作流上传**：支持JSON模式和文件模式
- ✅ **课程更新**：支持完整的课程信息更新
- ✅ **详情图集**：支持多张详情展示图片
- ✅ **OSS文件上传**：支持直接上传到阿里云OSS
- ✅ **向后兼容**：不破坏现有功能

---

## 🔧 OSS文件上传接口

### 1. 获取OSS上传签名

**接口信息**
- **请求方法**: `POST`
- **请求路径**: `/user/oss/post-signature/json`
- **接口描述**: 获取OSS POST签名，用于前端直接上传文件

**请求参数**
```json
{
  "fileName": "example.jpg",
  "userId": "17543607206742139"
}
```

**响应示例**
```json
{
  "code": 200,
  "message": "POST签名生成成功",
  "data": {
    "url": "https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com",
    "dir": "user_imgs/17543607206742139/",
    "policy": "eyJleHBpcmF0aW9uIjoi...",
    "signature": "gM7d8D4zd+K...",
    "x_oss_credential": "LTAI5t...",
    "x_oss_date": "20241201T120000Z",
    "version": "OSS4-HMAC-SHA256"
  }
}
```

**支持文件类型**
- **图片格式**: jpg, jpeg, png, gif, bmp, webp
- **压缩包格式**: zip, rar, 7z, tar, gz, bz2, xz
- **文档格式**: pdf, txt, md, json, xml, csv

---

## 🚀 工作流上传接口

### 1. 工作流上传/创建

**接口信息**
- **请求方法**: `POST`
- **请求路径**: `/user/workflow/submit`
- **接口描述**: 支持JSON模式和文件模式的工作流上传

**请求参数 (Workflow)**

| 字段名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| **基本信息** |
| name | String | 否 | 工作流名称 | "智能图像生成工作流" |
| description | String | 否 | 工作流描述 | "基于AI的智能图像生成工作流" |
| coverUrl | String | 否 | 封面图片URL | "https://oss.../cover.jpg" |
| detailGallery | String | 否 | 详情图集(JSON数组字符串) | "[\"url1\",\"url2\"]" |
| category | String | 否 | 工作流分类 | "人工智能" |
| **数据内容 (二选一必填)** |
| data | String | 否* | 工作流JSON数据 | "{\"nodes\":[...],\"edges\":[...]}" |
| dataFileUrl | String | 否* | 工作流文件URL | "https://oss.../workflow.zip" |
| **视频信息 (必填)** |
| vodVideoId | String | 是 | 阿里云VOD视频ID | "a0776b0179bf71f0bea45017f1e90102" |
| videoId | String | 否 | 兼容字段(与vodVideoId同步) | "a0776b0179bf71f0bea45017f1e90102" |
| **权限和定价** |
| fullAccessRole | Integer | 否 | 查看权限角色(0-3) | 1 |
| copyAccessRole | Integer | 否 | 复制权限角色(0-3) | 1 |
| price | BigDecimal | 否 | 价格 | 29.99 |
| isFree | Integer | 否 | 是否免费(0/1) | 0 |
| isPublic | Integer | 否 | 是否公开(0/1) | 1 |

**完整请求示例**

**JSON模式上传：**
```json
{
  "name": "智能图像生成工作流",
  "description": "基于AI的智能图像生成工作流，支持多种图像风格转换",
  "coverUrl": "https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/cover.jpg",
  "detailGallery": "[\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/detail1.jpg\",\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/detail2.jpg\",\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/detail3.jpg\"]",
  "vodVideoId": "a0776b0179bf71f0bea45017f1e90102",
  "data": "{\"nodes\":[{\"id\":\"1\",\"type\":\"text\",\"data\":{\"text\":\"beautiful landscape\"}},{\"id\":\"2\",\"type\":\"image\",\"data\":{\"width\":512,\"height\":512}}],\"edges\":[{\"source\":\"1\",\"target\":\"2\"}]}",
  "category": "人工智能",
  "fullAccessRole": 1,
  "copyAccessRole": 1,
  "price": 29.99,
  "isFree": 0,
  "isPublic": 1
}
```

**文件模式上传：**
```json
{
  "name": "ComfyUI工作流包",
  "description": "包含完整依赖的ComfyUI工作流",
  "coverUrl": "https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/cover.jpg",
  "detailGallery": "[\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/detail1.jpg\",\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/detail2.jpg\"]",
  "vodVideoId": "a0776b0179bf71f0bea45017f1e90102",
  "dataFileUrl": "https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/workflows/comfyui_workflow.zip",
  "category": "ComfyUI",
  "fullAccessRole": 2,
  "copyAccessRole": 2,
  "price": 59.99,
  "isFree": 0,
  "isPublic": 1
}
```

**成功响应**
```json
{
  "code": 200,
  "message": "提交成功",
  "data": 12345
}
```

### 2. 工作流更新

**接口信息**
- **请求方法**: `PUT`
- **请求路径**: `/user/content/workflows/{id}`
- **接口描述**: 更新工作流信息，包括数据包和演示视频

**路径参数**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 工作流数据库ID |

**请求参数 (WorkflowUpdateRequest)**
```json
{
  "name": "更新的工作流名称",
  "description": "更新的工作流描述",
  "coverUrl": "https://oss.../new-cover.jpg",
  "detailGallery": "[\"https://oss.../detail1.jpg\",\"https://oss.../detail2.jpg\"]",
  "category": "新分类",
  "isPublic": 1,
  "fullAccessRole": 1,
  "copyAccessRole": 2,
  "price": 99.99,
  "isFree": 0,
  "data": "{\"nodes\":[...],\"edges\":[...]}",
  "dataFileUrl": "https://oss.../updated-workflow.zip",
  "vodVideoId": "new-video-id",
  "videoId": "new-video-id"
}
```

---

## 📚 课程更新接口

### 1. 课程完整更新

**接口信息**
- **请求方法**: `PUT`
- **请求路径**: `/user/course/{id}`
- **接口描述**: 更新课程信息，包括章节和视频的完整更新

**路径参数**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 课程ID |

**请求参数 (CourseUpdateDto)**

| 字段名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| **基本信息** |
| title | String | 否 | 课程标题 | "AI图像处理入门课程" |
| description | String | 否 | 课程描述 | "学习AI图像处理的基础知识" |
| coverUrl | String | 否 | 封面图URL | "https://oss.../cover.jpg" |
| detailGallery | String | 否 | 详情图集(JSON数组字符串) | "[\"url1\",\"url2\"]" |
| category | String | 否 | 课程分类 | "人工智能" |
| **权限与定价** |
| price | BigDecimal | 否 | 价格 | 99.99 |
| level | Integer | 否 | 访问级别(0-3) | 1 |
| isFree | Boolean | 否 | 是否免费 | false |
| **操作选项** |
| submitForAudit | Boolean | 否 | 是否提交审核 | false |
| deleteMissing | Boolean | 否 | 是否删除未提交的章节 | true |
| **章节信息** |
| chapters | List | 否 | 章节列表 | [...] |

**完整请求示例**
```json
{
  "title": "AI图像处理完整教程",
  "description": "从零开始学习AI图像处理技术，包含理论与实践",
  "coverUrl": "https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/course-cover.jpg",
  "detailGallery": "[\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/course-detail1.jpg\",\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/course-detail2.jpg\",\"https://oss-1818ai-user-img.oss-cn-hangzhou.aliyuncs.com/course-detail3.jpg\"]",
  "price": 299.99,
  "level": 1,
  "category": "人工智能",
  "isFree": false,
  "submitForAudit": false,
  "deleteMissing": true,
  "chapters": [
    {
      "id": 123,
      "title": "第一章：基础理论",
      "description": "AI图像处理的基础理论知识",
      "orderNum": 1,
      "videos": [
        {
          "id": 456,
          "title": "1.1 什么是AI图像处理",
          "orderNum": 1,
          "durationSec": 1800,
          "vodVideoId": "vod-abc123"
        }
      ]
    }
  ]
}
```

### 2. 课程简单更新

**接口信息**
- **请求方法**: `PUT`
- **请求路径**: `/user/content/courses`
- **接口描述**: 更新课程基本信息

**请求参数 (CourseUpdateRequest)**
```json
{
  "id": 1,
  "title": "更新的课程标题",
  "description": "更新的课程描述",
  "coverUrl": "https://oss.../new-cover.jpg",
  "detailGallery": "[\"https://oss.../detail1.jpg\",\"https://oss.../detail2.jpg\"]",
  "category": "新分类",
  "isFree": 0,
  "level": 2
}
```

---

## 🖼️ 详情图集使用指南

### 1. 详情图集字段说明

**字段名**: `detailGallery`
**数据类型**: `String` (JSON数组字符串格式)
**存储格式**: `["url1", "url2", "url3", ...]`
**用途**: 存储多张详情展示图片的URL

### 2. 前端处理示例

**上传详情图集流程**:
```javascript
// 1. 选择多张图片
const files = document.getElementById('detail-images').files;

// 2. 逐个上传到OSS
const uploadPromises = Array.from(files).map(async (file) => {
  // 获取上传签名
  const signResponse = await fetch('/user/oss/post-signature/json', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      fileName: file.name,
      userId: getCurrentUserId()
    })
  });
  const signData = await signResponse.json();
  
  // 上传文件到OSS
  const formData = new FormData();
  formData.append('key', signData.data.dir + file.name);
  formData.append('policy', signData.data.policy);
  formData.append('x-oss-credential', signData.data.x_oss_credential);
  formData.append('x-oss-date', signData.data.x_oss_date);
  formData.append('x-oss-signature-version', signData.data.version);
  formData.append('x-oss-signature', signData.data.signature);
  formData.append('success_action_status', '200');
  formData.append('file', file);
  
  await fetch(signData.data.url, {
    method: 'POST',
    body: formData
  });
  
  return signData.data.url + '/' + signData.data.dir + file.name;
});

// 3. 收集所有图片URL
const imageUrls = await Promise.all(uploadPromises);

// 4. 转换为JSON字符串
const detailGallery = JSON.stringify(imageUrls);

// 5. 提交工作流或课程
const submitData = {
  name: "工作流名称",
  detailGallery: detailGallery,
  // ... 其他字段
};
```

**解析详情图集**:
```javascript
const parseDetailGallery = (detailGallery) => {
  if (!detailGallery) return [];
  try {
    return JSON.parse(detailGallery);
  } catch (e) {
    console.error('解析详情图集失败:', e);
    return [];
  }
};

// 使用示例
const images = parseDetailGallery(workflow.detailGallery);
images.forEach(url => {
  console.log('详情图片:', url);
});
```

### 3. 后端处理示例

```java
// 设置详情图集
List<String> imageUrls = Arrays.asList(
  "https://oss.../detail1.jpg",
  "https://oss.../detail2.jpg",
  "https://oss.../detail3.jpg"
);
String detailGallery = objectMapper.writeValueAsString(imageUrls);
workflow.setDetailGallery(detailGallery);

// 解析详情图集
if (workflow.getDetailGallery() != null) {
  List<String> imageUrls = objectMapper.readValue(
    workflow.getDetailGallery(), 
    new TypeReference<List<String>>() {}
  );
  // 处理图片URL列表
}
```

---

## 📋 角色权限说明

| 角色值 | 角色名称 | 说明 |
|--------|----------|------|
| 0 | 游客 | 未登录用户 |
| 1 | 普通用户 | 已注册登录用户 |
| 2 | VIP用户 | 付费会员用户 |
| 3 | SVIP用户 | 高级会员用户 |

---

## ⚠️ 重要注意事项

### 1. 数据验证
- **工作流上传**: `data` 或 `dataFileUrl` 必须提供其一
- **工作流上传**: `vodVideoId` 字段必填
- **详情图集**: 可选字段，支持空值

### 2. 文件限制
- **图片大小**: 建议不超过10MB
- **图片格式**: 支持jpg, jpeg, png, gif, bmp, webp
- **详情图集**: 建议2-5张图片

### 3. 审核机制
- **更新后重置**: 所有内容更新后将重置为待审核状态
- **审核通过**: 只有审核通过的内容才能正常展示
- **权限验证**: 只有内容所有者可以更新

### 4. 向后兼容
- ✅ 现有接口继续正常工作
- ✅ 现有数据不受影响
- ✅ 新字段为可选，不破坏现有功能
- ✅ API响应格式保持一致

---

## 🔍 调试和测试

### 1. 测试数据
数据库中已包含完整的测试数据：
- **工作流**: 4个工作流，包含详情图集示例
- **课程**: 16个课程，包含详情图集示例
- **用户**: 测试用户ID `17543607206742139`

### 2. 接口测试示例

**测试工作流上传**:
```bash
curl -X POST "http://localhost:8081/user/workflow/submit" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-jwt-token" \
  -d '{
    "name": "测试工作流",
    "detailGallery": "[\"https://example.com/1.jpg\"]",
    "vodVideoId": "a0776b0179bf71f0bea45017f1e90102",
    "data": "{\"nodes\":[],\"edges\":[]}",
    "isFree": 1
  }'
```

**测试课程更新**:
```bash
curl -X PUT "http://localhost:8081/user/course/1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-jwt-token" \
  -d '{
    "title": "更新的课程",
    "detailGallery": "[\"https://example.com/1.jpg\",\"https://example.com/2.jpg\"]",
    "price": 99.99
  }'
```

---

## 📈 功能扩展

### 1. 已实现功能
- ✅ 工作流上传和更新
- ✅ 课程更新
- ✅ 详情图集支持
- ✅ OSS文件上传
- ✅ 权限验证
- ✅ 审核流程

### 2. 后续扩展方向
- 🔄 批量图片处理
- 🔄 图片压缩优化
- 🔄 图片水印添加
- 🔄 图片CDN加速

---

## 🆘 常见问题

**Q: 详情图集可以上传多少张图片？**
A: 理论上无限制，建议2-5张图片以获得最佳用户体验。

**Q: 支持哪些图片格式？**
A: 支持 jpg, jpeg, png, gif, bmp, webp 格式。

**Q: 更新后为什么需要重新审核？**
A: 为确保内容质量，任何内容变更都需要重新审核。

**Q: 如何删除详情图集？**
A: 设置 `detailGallery` 为空字符串或null即可。

**Q: 接口是否支持批量操作？**
A: 目前支持单个内容的上传和更新，批量操作可通过多次调用实现。

---

**文档版本**: v1.0  
**最后更新**: 2024-12-01  
**维护团队**: 1818AI开发团队
