# 作品上传和更新接口完整文档 ## 📖 概述 本文档详细说明了工作流和课程的上传、更新接口,包括详情图集功能的完整使用方法。 ## 🎯 功能特性 - ✅ **工作流上传**:支持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 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 imageUrls = objectMapper.readValue( workflow.getDetailGallery(), new TypeReference>() {} ); // 处理图片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开发团队