diff --git a/admin/src/views/asset/resource/index.vue b/admin/src/views/asset/resource/index.vue index ad14974c..5af785ab 100644 --- a/admin/src/views/asset/resource/index.vue +++ b/admin/src/views/asset/resource/index.vue @@ -92,7 +92,10 @@ - +
+ +
支持批量上传多张图片,一次最多 9 张,每张图片将生成一条独立资源(多张时标题自动追加序号)
+
上传视频 (OSS直传) @@ -156,6 +159,15 @@ const formData = reactive({ user_ids: [] }) +const validateFileUrl = (_rule: any, value: any, callback: any) => { + if (Array.isArray(value)) { + if (!value.length) return callback(new Error('请上传资源文件')) + } else if (!value) { + return callback(new Error('请输入或上传文件获取链接')) + } + callback() +} + const computedRules = computed(() => { if (isEdit.value) { return { @@ -164,7 +176,7 @@ const computedRules = computed(() => { } return { title: [{ required: true, message: '请输入标题', trigger: 'blur' }], - file_url: [{ required: true, message: '请输入或上传文件获取链接', trigger: 'blur' }] + file_url: [{ required: true, validator: validateFileUrl, trigger: 'change' }] } }) diff --git a/server/app/adminapi/controller/asset/AssetResourceController.php b/server/app/adminapi/controller/asset/AssetResourceController.php index 11087f49..a8f52c7d 100644 --- a/server/app/adminapi/controller/asset/AssetResourceController.php +++ b/server/app/adminapi/controller/asset/AssetResourceController.php @@ -55,34 +55,59 @@ class AssetResourceController extends BaseAdminController public function add() { $params = $this->request->post(); - if (empty($params['type']) || empty($params['title']) || empty($params['file_url'])) { + $type = $params['type'] ?? 0; + $title = trim((string)($params['title'] ?? '')); + + // 兼容单图(字符串)与多图批量上传(数组) + $fileUrl = $params['file_url'] ?? ''; + if (is_array($fileUrl)) { + $fileUrls = array_values(array_filter($fileUrl, fn($v) => trim((string)$v) !== '')); + } else { + $fileUrls = trim((string)$fileUrl) !== '' ? [$fileUrl] : []; + } + + if (empty($type) || $title === '' || empty($fileUrls)) { return $this->fail('请填写完整的资源信息'); } - + + // 仅图片支持批量;视频/语音只取首个 + if ($type != 1) { + $fileUrls = [$fileUrls[0]]; + } + + $multi = count($fileUrls) > 1; + Db::startTrans(); try { - $resource = AssetResource::create([ - 'type' => $params['type'], - 'title' => $params['title'], - 'file_url' => $params['file_url'], - 'cover_url' => $params['cover_url'] ?? '', - ]); - - // 绑定用户 - if (!empty($params['user_ids']) && is_array($params['user_ids'])) { - $userResources = []; - foreach ($params['user_ids'] as $userId) { - $userResources[] = [ - 'user_id' => $userId, - 'resource_id' => $resource->id, - 'create_time' => time(), - ]; + $createdIds = []; + $index = 0; + foreach ($fileUrls as $url) { + $index++; + $resource = AssetResource::create([ + 'type' => $type, + 'title' => $multi ? $title . '_' . $index : $title, + 'file_url' => $url, + 'cover_url' => $params['cover_url'] ?? '', + ]); + + // 绑定用户 + if (!empty($params['user_ids']) && is_array($params['user_ids'])) { + $userResources = []; + foreach ($params['user_ids'] as $userId) { + $userResources[] = [ + 'user_id' => $userId, + 'resource_id' => $resource->id, + 'create_time' => time(), + ]; + } + (new AssetUserResource())->saveAll($userResources); } - (new AssetUserResource())->saveAll($userResources); + + $createdIds[] = $resource->id; } - + Db::commit(); - return $this->success('添加并分配成功', ['id' => $resource->id]); + return $this->success('添加并分配成功', ['ids' => $createdIds]); } catch (\Exception $e) { Db::rollback(); return $this->fail('操作失败: ' . $e->getMessage());