[Claude Workbench] Initial commit - preserving existing code

This commit is contained in:
Claude Workbench
2025-11-14 17:41:15 +08:00
commit 0f7bc05697
587 changed files with 103215 additions and 0 deletions

View File

@@ -0,0 +1,479 @@
# 作品上传和更新接口完整文档
## 📖 概述
本文档详细说明了工作流和课程的上传、更新接口,包括详情图集功能的完整使用方法。
## 🎯 功能特性
-**工作流上传**支持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开发团队