Files
1818web-hoduan/docs/content-upload-update-api.md
2025-11-14 17:41:15 +08:00

14 KiB
Raw Permalink Blame History

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

📖 概述

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

🎯 功能特性

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

🔧 OSS文件上传接口

1. 获取OSS上传签名

接口信息

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

请求参数

{
  "fileName": "example.jpg",
  "userId": "17543607206742139"
}

响应示例

{
  "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模式上传

{
  "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
}

文件模式上传:

{
  "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
}

成功响应

{
  "code": 200,
  "message": "提交成功",
  "data": 12345
}

2. 工作流更新

接口信息

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

路径参数

参数名 类型 必填 说明
id Long 工作流数据库ID

请求参数 (WorkflowUpdateRequest)

{
  "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 章节列表 [...]

完整请求示例

{
  "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)

{
  "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. 前端处理示例

上传详情图集流程:

// 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,
  // ... 其他字段
};

解析详情图集:

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. 后端处理示例

// 设置详情图集
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. 数据验证

  • 工作流上传: datadataFileUrl 必须提供其一
  • 工作流上传: vodVideoId 字段必填
  • 详情图集: 可选字段,支持空值

2. 文件限制

  • 图片大小: 建议不超过10MB
  • 图片格式: 支持jpg, jpeg, png, gif, bmp, webp
  • 详情图集: 建议2-5张图片

3. 审核机制

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

4. 向后兼容

  • 现有接口继续正常工作
  • 现有数据不受影响
  • 新字段为可选,不破坏现有功能
  • API响应格式保持一致

🔍 调试和测试

1. 测试数据

数据库中已包含完整的测试数据:

  • 工作流: 4个工作流包含详情图集示例
  • 课程: 16个课程包含详情图集示例
  • 用户: 测试用户ID 17543607206742139

2. 接口测试示例

测试工作流上传:

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
  }'

测试课程更新:

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开发团队