From af9bd05bb49669d4c9a2f7aeeaba0992fe1dc038 Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Tue, 9 Jun 2026 10:31:18 +0800 Subject: [PATCH] =?UTF-8?q?update=E8=B5=84=E6=BA=90=E5=88=86=E5=8F=91?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/views/asset/resource/index.vue | 16 ++++- .../asset/AssetResourceController.php | 67 +++++++++++++------ 2 files changed, 60 insertions(+), 23 deletions(-) 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());