hl-api-changelog/hl-material-service.md
2026-03-17 09:27:35 +08:00

969 行
37 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# 素材服务 API 文档
**服务**: `hl-material-service`
**接口总数**: 28
## 目录
- **小程序-素材** (1 个接口)
- **素材分类权限管理** (2 个接口)
- **素材标签管理** (6 个接口)
- **素材管理** (19 个接口)
---
## 小程序-素材
### `GET` /mp/material/miniprogram
**获取小程序分类下的全部素材**
返回miniprogram分类下的所有素材,用于小程序端展示公共素材资源如引导页图片、默认头像等
**响应** `统一响应结果«List«素材信息»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材信息[]` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdBy` | `string` | | 创建人ID |
|   `createdByName` | `string` | | 创建人姓名 |
|   `description` | `string` | | 素材描述 |
|   `fileId` | `string` | | 文件ID |
|   `fileName` | `string` | | 文件名 |
|   `fileSize` | `long` | | 文件大小(字节) |
|   `fileType` | `string` | | 文件类型 |
|   `imageHeight` | `int` | | 图片高度 |
|   `imageWidth` | `int` | | 图片宽度 |
|   `materialId` | `string` | | 素材ID |
|   `materialName` | `string` | | 素材名称 |
|   `ossUrl` | `string` | | OSS地址 |
|   `refCount` | `int` | | 引用次数 |
|   `subCategoryId` | `string` | | 子分类ID |
|   `subCategoryName` | `string` | | 子分类名称 |
|   `tags` | `素材标签信息[]` | | 标签列表 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdByName` | `string` | | 创建人姓名 |
|     `managed` | `boolean` | | 是否系统管理标签 |
|     `tagColor` | `string` | | 标签颜色 |
|     `tagId` | `string` | | 标签ID |
|     `tagName` | `string` | | 标签名称 |
|     `useCount` | `int` | | 使用次数 |
|   `thumbnailUrl` | `string` | | 缩略图地址 |
| `message` | `string` | | 响应消息 |
---
## 素材分类权限管理
### `GET` /admin/material/category/permissions/{roleCode}
**获取角色的分类权限**
仅超级管理员可操作。返回指定角色可访问的素材分类编码列表
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `roleCode` | `string` | | 角色编码 |
**响应** `统一响应结果«List«string»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `string[]` | | 响应数据 |
| `message` | `string` | | 响应消息 |
---
### `PUT` /admin/material/category/permissions/{roleCode}
**更新角色的分类权限**
仅超级管理员可操作。全量替换指定角色的素材分类访问权限,传入允许访问的分类编码列表
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `roleCode` | `string` | | 角色编码 |
**请求体** `分类权限更新请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryCodes` | `string[]` | 是 | 分类编码列表 |
**响应** `统一响应结果«Void»`
---
## 素材标签管理
### `POST` /admin/material/tag
**创建管理标签**
创建系统级素材标签,标签名称不可重复。创建后可用于素材分类和筛选。
**权限**:需管理员登录。
**请求体** `创建标签请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `tagColor` | `string` | | 标签颜色 |
| `tagName` | `string` | 是 | 标签名称 |
**响应** `统一响应结果«素材标签信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材标签信息` | | 响应数据 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdByName` | `string` | | 创建人姓名 |
|   `managed` | `boolean` | | 是否系统管理标签 |
|   `tagColor` | `string` | | 标签颜色 |
|   `tagId` | `string` | | 标签ID |
|   `tagName` | `string` | | 标签名称 |
|   `useCount` | `int` | | 使用次数 |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/tag/adhoc
**解析自定义标签(按名称查找或创建)**
按标签名称查找已有标签,不存在则自动创建为用户自定义标签。用于素材上传时输入自由标签文本的场景。
**权限**:需管理员登录。
**请求体** `创建标签请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `tagColor` | `string` | | 标签颜色 |
| `tagName` | `string` | 是 | 标签名称 |
**响应** `统一响应结果«素材标签信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材标签信息` | | 响应数据 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdByName` | `string` | | 创建人姓名 |
|   `managed` | `boolean` | | 是否系统管理标签 |
|   `tagColor` | `string` | | 标签颜色 |
|   `tagId` | `string` | | 标签ID |
|   `tagName` | `string` | | 标签名称 |
|   `useCount` | `int` | | 使用次数 |
| `message` | `string` | | 响应消息 |
---
### `PUT` /admin/material/tag/{tagId}
**编辑标签**
更新标签名称。标签名称不可与其他已有标签重复。
**权限**:需管理员登录。
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `tagId` | `integer` | | 标签ID |
**请求体** `更新标签请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `tagColor` | `string` | | 标签颜色 |
| `tagName` | `string` | | 标签名称 |
**响应** `统一响应结果«素材标签信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材标签信息` | | 响应数据 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdByName` | `string` | | 创建人姓名 |
|   `managed` | `boolean` | | 是否系统管理标签 |
|   `tagColor` | `string` | | 标签颜色 |
|   `tagId` | `string` | | 标签ID |
|   `tagName` | `string` | | 标签名称 |
|   `useCount` | `int` | | 使用次数 |
| `message` | `string` | | 响应消息 |
---
### `DELETE` /admin/material/tag/{tagId}
**删除标签**
删除标签并自动解除与所有素材的关联关系。
**权限**:需管理员登录。
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `tagId` | `integer` | | 标签ID |
**响应** `统一响应结果«Void»`
---
### `GET` /admin/material/tags
**获取管理标签(标签管理用)**
返回管理员创建的系统标签列表不含用户自定义标签,用于标签管理页的CRUD操作。
**响应** `统一响应结果«List«素材标签信息»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材标签信息[]` | | 响应数据 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdByName` | `string` | | 创建人姓名 |
|   `managed` | `boolean` | | 是否系统管理标签 |
|   `tagColor` | `string` | | 标签颜色 |
|   `tagId` | `string` | | 标签ID |
|   `tagName` | `string` | | 标签名称 |
|   `useCount` | `int` | | 使用次数 |
| `message` | `string` | | 响应消息 |
---
### `GET` /admin/material/tags/all
**获取全部标签(选择器用,含自定义标签)**
返回所有标签(含系统标签和用户自定义标签),用于素材上传/编辑时的标签选择器。
**响应** `统一响应结果«List«素材标签信息»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材标签信息[]` | | 响应数据 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdByName` | `string` | | 创建人姓名 |
|   `managed` | `boolean` | | 是否系统管理标签 |
|   `tagColor` | `string` | | 标签颜色 |
|   `tagId` | `string` | | 标签ID |
|   `tagName` | `string` | | 标签名称 |
|   `useCount` | `int` | | 使用次数 |
| `message` | `string` | | 响应消息 |
---
## 素材管理
### `DELETE` /admin/material/batch
**批量删除素材**
批量删除素材,返回删除结果(成功数/失败数/失败原因)。有引用关系的素材会跳过并记录失败原因
**请求体** `批量删除素材请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `materialIds` | `string[]` | 是 | 素材ID列表 |
**响应** `统一响应结果«批量删除结果»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `批量删除结果` | | 响应数据 |
|   `failedItems` | `删除失败项[]` | | 失败项列表 |
|     `materialId` | `string` | | 素材ID |
|     `reason` | `string` | | 失败原因 |
|   `successCount` | `int` | | 成功删除数量 |
| `message` | `string` | | 响应消息 |
---
### `PUT` /admin/material/batch/tags
**批量更新标签**
对多个素材同时添加和/或移除标签,支持增量操作addTagIds新增,removeTagIds移除
**请求体** `批量标签操作请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `addTagIds` | `string[]` | | 要添加的标签ID列表 |
| `materialIds` | `string[]` | 是 | 素材ID列表 |
| `removeTagIds` | `string[]` | | 要移除的标签ID列表 |
**响应** `统一响应结果«Void»`
---
### `GET` /admin/material/categories
**获取有权限的分类列表(含素材数量)**
返回当前角色有权限查看的素材分类树,每个分类包含素材数量统计。超级管理员可见全部分类
**响应** `统一响应结果«List«素材分类信息»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材分类信息[]` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `children` | `素材分类信息[]` | | 子分类列表 |
|     `categoryCode` | `string` | | 分类编码 |
|     `categoryName` | `string` | | 分类名称 |
|     `children` | `素材分类信息[]` | | 子分类列表 |
|     `materialCount` | `int` | | 素材数量 |
|     `parentId` | `string` | | 父子分类ID |
|     `subCategoryId` | `string` | | 子分类ID |
|   `materialCount` | `int` | | 素材数量 |
|   `parentId` | `string` | | 父子分类ID |
|   `subCategoryId` | `string` | | 子分类ID |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/category/sub
**创建子分类**
在一级分类下创建子分类,分类编码自动生成。子分类用于更细粒度的素材归档
**请求体** `Create subcategory request`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryName` | `string` | 是 | 子分类名称 |
| `parentCode` | `string` | 是 | 根分类编码(scenic/hotel等) |
| `parentId` | `long` | | 父子分类ID(为空则创建在根分类下) |
| `sortOrder` | `int` | | 排序值 |
**响应** `统一响应结果«素材分类信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材分类信息` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `children` | `素材分类信息[]` | | 子分类列表 |
|     `categoryCode` | `string` | | 分类编码 |
|     `categoryName` | `string` | | 分类名称 |
|     `children` | `素材分类信息[]` | | 子分类列表 |
|     `materialCount` | `int` | | 素材数量 |
|     `parentId` | `string` | | 父子分类ID |
|     `subCategoryId` | `string` | | 子分类ID |
|   `materialCount` | `int` | | 素材数量 |
|   `parentId` | `string` | | 父子分类ID |
|   `subCategoryId` | `string` | | 子分类ID |
| `message` | `string` | | 响应消息 |
---
### `PUT` /admin/material/category/sub/{categoryId}
**更新子分类**
更新子分类的名称或排序值。仅有该分类权限的管理员可操作。
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryId` | `integer` | | 子分类ID |
**请求体** `Update subcategory request`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryName` | `string` | | Subcategory name |
| `sortOrder` | `int` | | Sort order |
**响应** `统一响应结果«素材分类信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材分类信息` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `children` | `素材分类信息[]` | | 子分类列表 |
|     `categoryCode` | `string` | | 分类编码 |
|     `categoryName` | `string` | | 分类名称 |
|     `children` | `素材分类信息[]` | | 子分类列表 |
|     `materialCount` | `int` | | 素材数量 |
|     `parentId` | `string` | | 父子分类ID |
|     `subCategoryId` | `string` | | 子分类ID |
|   `materialCount` | `int` | | 素材数量 |
|   `parentId` | `string` | | 父子分类ID |
|   `subCategoryId` | `string` | | 子分类ID |
| `message` | `string` | | 响应消息 |
---
### `DELETE` /admin/material/category/sub/{categoryId}
**删除子分类**
删除子分类前需确保分类下无素材,否则删除失败
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryId` | `integer` | | 子分类ID |
**响应** `统一响应结果«Void»`
---
### `GET` /admin/material/list
**素材列表**
分页查询素材,支持按分类、标签、文件类型、关键词筛选。返回结果受角色分类权限限制
**关联字典**
- file_type文件类型列表筛选+显示)
**查询参数**
| 参数 | 类型 | 必填 | 说明 | 示例 |
| --- | --- | --- | --- | --- |
| `categoryCode` | `string` | | 分类编码 | scenic |
| `createdBy` | `integer(int64)` | | 创建人ID | 1001 |
| `endDate` | `string` | | 结束日期 | 2026-12-31 |
| `fileType` | `string` | | 文件类型 | image |
| `keyword` | `string` | | 搜索关键词 | 风景 |
| `orderBy` | `string` | | 排序字段 | createdAt |
| `orderDir` | `string` | | 排序方向: asc/desc | desc |
| `page` | `integer(int32)` | | 页码 | 1 |
| `pageSize` | `integer(int32)` | | 每页条数 | 20 |
| `startDate` | `string` | | 开始日期 | 2026-01-01 |
| `subCategoryId` | `integer(int64)` | | 子分类ID | 2030000000000001 |
| `tagIds` | `string` | | 标签ID列表(逗号分隔) | 1,2,3 |
**响应** `统一响应结果«分页结果«素材信息»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `分页结果«素材信息»` | | 响应数据 |
|   `page` | `int` | | 当前页码 |
|   `pageSize` | `int` | | 每页条数 |
|   `records` | `素材信息[]` | | 数据列表 |
|     `categoryCode` | `string` | | 分类编码 |
|     `categoryName` | `string` | | 分类名称 |
|     `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdBy` | `string` | | 创建人ID |
|     `createdByName` | `string` | | 创建人姓名 |
|     `description` | `string` | | 素材描述 |
|     `fileId` | `string` | | 文件ID |
|     `fileName` | `string` | | 文件名 |
|     `fileSize` | `long` | | 文件大小(字节) |
|     `fileType` | `string` | | 文件类型 |
|     `imageHeight` | `int` | | 图片高度 |
|     `imageWidth` | `int` | | 图片宽度 |
|     `materialId` | `string` | | 素材ID |
|     `materialName` | `string` | | 素材名称 |
|     `ossUrl` | `string` | | OSS地址 |
|     `refCount` | `int` | | 引用次数 |
|     `subCategoryId` | `string` | | 子分类ID |
|     `subCategoryName` | `string` | | 子分类名称 |
|     `tags` | `素材标签信息[]` | | 标签列表 |
|     `thumbnailUrl` | `string` | | 缩略图地址 |
|   `total` | `int` | | 总记录数 |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/upload/chunk
**分片上传-上传分片**
大文件上传第二步逐个上传分片数据,分片索引从0开始。支持断点续传,已上传的分片无需重传。
**查询参数**
| 参数 | 类型 | 必填 | 说明 | 示例 |
| --- | --- | --- | --- | --- |
| `chunkIndex` | `integer(int32)` | | 分片索引从0开始 | |
| `uploadId` | `string` | | 上传ID | |
**响应** `统一响应结果«分片上传结果»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `分片上传结果` | | 响应数据 |
|   `etag` | `string` | | 分片ETag |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/upload/chunk/cancel
**分片上传-取消**
取消分片上传任务,清理已上传的分片数据和OSS临时文件。仅上传发起者可取消。
**请求体** `分片上传取消请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `uploadId` | `string` | 是 | 上传ID |
**响应** `统一响应结果«Void»`
---
### `POST` /admin/material/upload/chunk/complete
**分片上传-完成合并**
大文件上传第三步所有分片上传完成后调用,OSS端合并分片为完整文件并创建素材记录。
**请求体** `分片上传完成请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `uploadId` | `string` | 是 | 上传ID |
**响应** `统一响应结果«素材信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材信息` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdBy` | `string` | | 创建人ID |
|   `createdByName` | `string` | | 创建人姓名 |
|   `description` | `string` | | 素材描述 |
|   `fileId` | `string` | | 文件ID |
|   `fileName` | `string` | | 文件名 |
|   `fileSize` | `long` | | 文件大小(字节) |
|   `fileType` | `string` | | 文件类型 |
|   `imageHeight` | `int` | | 图片高度 |
|   `imageWidth` | `int` | | 图片宽度 |
|   `materialId` | `string` | | 素材ID |
|   `materialName` | `string` | | 素材名称 |
|   `ossUrl` | `string` | | OSS地址 |
|   `refCount` | `int` | | 引用次数 |
|   `subCategoryId` | `string` | | 子分类ID |
|   `subCategoryName` | `string` | | 子分类名称 |
|   `tags` | `素材标签信息[]` | | 标签列表 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdByName` | `string` | | 创建人姓名 |
|     `managed` | `boolean` | | 是否系统管理标签 |
|     `tagColor` | `string` | | 标签颜色 |
|     `tagId` | `string` | | 标签ID |
|     `tagName` | `string` | | 标签名称 |
|     `useCount` | `int` | | 使用次数 |
|   `thumbnailUrl` | `string` | | 缩略图地址 |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/upload/chunk/init
**分片上传-初始化**
大文件上传第一步初始化分片上传任务,返回uploadId和每个分片的预签名URL。前端按分片并发上传后调用完成合并接口。
**权限**:需管理员登录,受角色分类权限限制。
**请求体** `分片上传初始化请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `contentType` | `string` | 是 | 文件MIME类型 |
| `fileSize` | `long` | 是 | 文件大小(字节) |
| `filename` | `string` | 是 | 文件名 |
| `materialId` | `string` | | 关联素材ID可选,用于更新已有素材 |
**响应** `统一响应结果«分片上传初始化结果»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `分片上传初始化结果` | | 响应数据 |
|   `chunkSize` | `int` | | 推荐分片大小(字节) |
|   `uploadId` | `string` | | 上传ID |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/upload/confirm
**确认上传完成**
上传素材第二步前端直传OSS完成后调用此接口创建素材记录,支持MD5去重
**关联字典**
- material_tag素材标签上传时可选标签
**请求体** `素材上传确认请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `description` | `string` | | 素材描述 |
| `materialId` | `string` | 是 | 素材ID |
| `tagIds` | `string[]` | | 标签ID列表 |
**响应** `统一响应结果«素材信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材信息` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdBy` | `string` | | 创建人ID |
|   `createdByName` | `string` | | 创建人姓名 |
|   `description` | `string` | | 素材描述 |
|   `fileId` | `string` | | 文件ID |
|   `fileName` | `string` | | 文件名 |
|   `fileSize` | `long` | | 文件大小(字节) |
|   `fileType` | `string` | | 文件类型 |
|   `imageHeight` | `int` | | 图片高度 |
|   `imageWidth` | `int` | | 图片宽度 |
|   `materialId` | `string` | | 素材ID |
|   `materialName` | `string` | | 素材名称 |
|   `ossUrl` | `string` | | OSS地址 |
|   `refCount` | `int` | | 引用次数 |
|   `subCategoryId` | `string` | | 子分类ID |
|   `subCategoryName` | `string` | | 子分类名称 |
|   `tags` | `素材标签信息[]` | | 标签列表 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdByName` | `string` | | 创建人姓名 |
|     `managed` | `boolean` | | 是否系统管理标签 |
|     `tagColor` | `string` | | 标签颜色 |
|     `tagId` | `string` | | 标签ID |
|     `tagName` | `string` | | 标签名称 |
|     `useCount` | `int` | | 使用次数 |
|   `thumbnailUrl` | `string` | | 缩略图地址 |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/upload/folder
**文件夹上传初始化(创建分类+批量获取凭证)**
支持整个文件夹上传:自动根据文件夹名创建子分类,为每个文件批量获取上传凭证,前端逐一上传后批量确认
**请求体** `文件夹上传初始化请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryCode` | `string` | 是 | 分类编码 |
| `files` | `文件夹上传文件项[]` | 是 | 文件列表 |
|   `contentType` | `string` | 是 | 文件MIME类型 |
|   `fileSize` | `long` | 是 | 文件大小(字节) |
|   `filename` | `string` | 是 | 文件名 |
|   `folderPath` | `string` | 是 | 文件所在文件夹路径与folderPaths中的路径对应 |
|   `materialName` | `string` | | 素材名称 |
|   `md5` | `string` | 是 | 文件MD5 |
| `folderPaths` | `string[]` | 是 | 文件夹路径列表(如 ["999", "999/888"] |
**响应** `统一响应结果«文件夹上传初始化结果»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `文件夹上传初始化结果` | | 响应数据 |
|   `fileTokens` | `文件上传凭证项[]` | | 各文件的上传凭证列表 |
|     `bucket` | `string` | | OSS Bucket名称 |
|     `error` | `string` | | 错误信息(该文件获取凭证失败时) |
|     `filename` | `string` | | 文件名 |
|     `folderPath` | `string` | | 文件夹路径 |
|     `instantUpload` | `boolean` | | 是否秒传(文件已存在) |
|     `materialId` | `string` | | 素材ID |
|     `ossKey` | `string` | | OSS对象Key |
|     `region` | `string` | | OSS Region |
|     `stsToken` | `STS临时凭证信息` | | STS临时凭证 |
|     `uploadHeaders` | `object` | | 上传请求头 |
|     `uploadMethod` | `string` | | 上传方式: PUT/POST |
|     `uploadUrl` | `string` | | 上传URL |
|   `folderCategoryMap` | `object` | | 文件夹路径 → 子分类ID 映射 |
| `message` | `string` | | 响应消息 |
---
### `POST` /admin/material/upload/token
**获取上传凭证**
上传素材第一步获取OSS预签名URL和凭证。前端使用凭证直传OSS后调用确认上传。支持基于角色的分类权限校验
**请求体** `素材上传令牌请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryCode` | `string` | 是 | 分类编码 |
| `contentType` | `string` | 是 | 文件MIME类型 |
| `fileSize` | `long` | 是 | 文件大小(字节) |
| `filename` | `string` | 是 | 文件名 |
| `materialName` | `string` | | 素材名称 |
| `md5` | `string` | 是 | 文件MD5 |
| `subCategoryId` | `long` | | 子分类ID文件夹上传时使用 |
**响应** `统一响应结果«素材上传令牌信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材上传令牌信息` | | 响应数据 |
|   `bucket` | `string` | | OSS Bucket名称 |
|   `contentType` | `string` | | 上传时必须使用的Content-Type与预签名URL签名一致 |
|   `expireAt` | `string` | | 过期时间 |
|   `fileId` | `string` | | 文件ID |
|   `instantUpload` | `boolean` | | 是否秒传 |
|   `material` | `素材信息` | | 秒传时返回的素材信息 |
|     `categoryCode` | `string` | | 分类编码 |
|     `categoryName` | `string` | | 分类名称 |
|     `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdBy` | `string` | | 创建人ID |
|     `createdByName` | `string` | | 创建人姓名 |
|     `description` | `string` | | 素材描述 |
|     `fileId` | `string` | | 文件ID |
|     `fileName` | `string` | | 文件名 |
|     `fileSize` | `long` | | 文件大小(字节) |
|     `fileType` | `string` | | 文件类型 |
|     `imageHeight` | `int` | | 图片高度 |
|     `imageWidth` | `int` | | 图片宽度 |
|     `materialId` | `string` | | 素材ID |
|     `materialName` | `string` | | 素材名称 |
|     `ossUrl` | `string` | | OSS地址 |
|     `refCount` | `int` | | 引用次数 |
|     `subCategoryId` | `string` | | 子分类ID |
|     `subCategoryName` | `string` | | 子分类名称 |
|     `tags` | `素材标签信息[]` | | 标签列表 |
|     `thumbnailUrl` | `string` | | 缩略图地址 |
|   `materialId` | `string` | | 素材ID |
|   `ossKey` | `string` | | OSS对象Key |
|   `region` | `string` | | OSS Region |
|   `stsToken` | `STS临时凭证信息` | | STS临时凭证 |
|     `accessKeyId` | `string` | | AccessKey ID |
|     `accessKeySecret` | `string` | | AccessKey Secret |
|     `expiration` | `string` | | 过期时间 |
|     `securityToken` | `string` | | 安全令牌 |
|   `uploadMode` | `string` | | 上传模式: PRESIGNED_URL/STS_MULTIPART |
|   `uploadUrl` | `string` | | 上传URL |
| `message` | `string` | | 响应消息 |
---
### `GET` /admin/material/{materialId}
**素材详情**
返回素材完整信息,包含文件名、URL、分类、标签、文件大小、上传者等。受角色分类权限限制。
**关联字典**
- file_type文件类型显示
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `materialId` | `integer` | | 素材ID |
**响应** `统一响应结果«素材信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材信息` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdBy` | `string` | | 创建人ID |
|   `createdByName` | `string` | | 创建人姓名 |
|   `description` | `string` | | 素材描述 |
|   `fileId` | `string` | | 文件ID |
|   `fileName` | `string` | | 文件名 |
|   `fileSize` | `long` | | 文件大小(字节) |
|   `fileType` | `string` | | 文件类型 |
|   `imageHeight` | `int` | | 图片高度 |
|   `imageWidth` | `int` | | 图片宽度 |
|   `materialId` | `string` | | 素材ID |
|   `materialName` | `string` | | 素材名称 |
|   `ossUrl` | `string` | | OSS地址 |
|   `refCount` | `int` | | 引用次数 |
|   `subCategoryId` | `string` | | 子分类ID |
|   `subCategoryName` | `string` | | 子分类名称 |
|   `tags` | `素材标签信息[]` | | 标签列表 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdByName` | `string` | | 创建人姓名 |
|     `managed` | `boolean` | | 是否系统管理标签 |
|     `tagColor` | `string` | | 标签颜色 |
|     `tagId` | `string` | | 标签ID |
|     `tagName` | `string` | | 标签名称 |
|     `useCount` | `int` | | 使用次数 |
|   `thumbnailUrl` | `string` | | 缩略图地址 |
| `message` | `string` | | 响应消息 |
---
### `PUT` /admin/material/{materialId}
**更新素材信息**
**关联字典**
- material_tag素材标签编辑时选择标签
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `materialId` | `integer` | | 素材ID |
**请求体** `更新素材请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `categoryCode` | `string` | | 分类编码 |
| `description` | `string` | | 素材描述 |
| `materialName` | `string` | | 素材名称 |
| `subCategoryId` | `long` | | 子分类ID0表示清除子分类 |
**响应** `统一响应结果«素材信息»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材信息` | | 响应数据 |
|   `categoryCode` | `string` | | 分类编码 |
|   `categoryName` | `string` | | 分类名称 |
|   `categoryPath` | `string` | | 完整分类路径(如:攻略管理 / 999 / 888 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdBy` | `string` | | 创建人ID |
|   `createdByName` | `string` | | 创建人姓名 |
|   `description` | `string` | | 素材描述 |
|   `fileId` | `string` | | 文件ID |
|   `fileName` | `string` | | 文件名 |
|   `fileSize` | `long` | | 文件大小(字节) |
|   `fileType` | `string` | | 文件类型 |
|   `imageHeight` | `int` | | 图片高度 |
|   `imageWidth` | `int` | | 图片宽度 |
|   `materialId` | `string` | | 素材ID |
|   `materialName` | `string` | | 素材名称 |
|   `ossUrl` | `string` | | OSS地址 |
|   `refCount` | `int` | | 引用次数 |
|   `subCategoryId` | `string` | | 子分类ID |
|   `subCategoryName` | `string` | | 子分类名称 |
|   `tags` | `素材标签信息[]` | | 标签列表 |
|     `createdAt` | `string` | | 创建时间 |
|     `createdByName` | `string` | | 创建人姓名 |
|     `managed` | `boolean` | | 是否系统管理标签 |
|     `tagColor` | `string` | | 标签颜色 |
|     `tagId` | `string` | | 标签ID |
|     `tagName` | `string` | | 标签名称 |
|     `useCount` | `int` | | 使用次数 |
|   `thumbnailUrl` | `string` | | 缩略图地址 |
| `message` | `string` | | 响应消息 |
---
### `DELETE` /admin/material/{materialId}
**删除素材**
删除素材记录。如果素材存在引用关系(被景区、酒店等使用),则不允许删除
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `materialId` | `integer` | | 素材ID |
**响应** `统一响应结果«Void»`
---
### `GET` /admin/material/{materialId}/refs
**查看素材引用记录**
查看素材被哪些业务实体引用(如景区封面、酒店轮播图等),用于判断素材是否可安全删除
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `materialId` | `integer` | | 素材ID |
**响应** `统一响应结果«List«素材引用信息»»`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `code` | `int` | | 状态码 |
| `data` | `素材引用信息[]` | | 响应数据 |
|   `bizId` | `string` | | 业务ID |
|   `bizName` | `string` | | 业务名称 |
|   `bizType` | `string` | | 业务类型 |
|   `bizTypeName` | `string` | | 业务类型名称 |
|   `createdAt` | `string` | | 创建时间 |
|   `createdByName` | `string` | | 创建人姓名 |
|   `id` | `string` | | 引用ID |
|   `materialId` | `string` | | 素材ID |
|   `usageType` | `string` | | 用途类型 |
|   `usageTypeName` | `string` | | 用途类型名称 |
| `message` | `string` | | 响应消息 |
---
### `PUT` /admin/material/{materialId}/tags
**更新素材标签**
全量替换单个素材的标签,传入新的标签ID列表
**路径参数**
| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `materialId` | `integer` | | 素材ID |
**请求体** `更新素材标签请求`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `tagIds` | `string[]` | 是 | 标签ID列表 |
**响应** `统一响应结果«Void»`
---