update资源分发小程序

This commit is contained in:
2026-06-09 10:31:18 +08:00
parent 8a1a9ea0ca
commit af9bd05bb4
2 changed files with 60 additions and 23 deletions
+14 -2
View File
@@ -92,7 +92,10 @@
<el-input v-model="formData.title" placeholder="请输入资源标题" /> <el-input v-model="formData.title" placeholder="请输入资源标题" />
</el-form-item> </el-form-item>
<el-form-item label="资源文件" prop="file_url" v-if="!isEdit"> <el-form-item label="资源文件" prop="file_url" v-if="!isEdit">
<material-picker v-if="formData.type === 1" v-model="formData.file_url" :limit="1" type="image" /> <div v-if="formData.type === 1" class="w-full">
<material-picker v-model="formData.file_url" :limit="9" type="image" />
<div style="font-size: 12px; color: #909399; margin-top: 4px;">支持批量上传多张图片一次最多 9 每张图片将生成一条独立资源多张时标题自动追加序号</div>
</div>
<upload v-else-if="formData.type === 2" type="video" direct :multiple="false" :limit="1" :show-progress="true" @success="handleUploadSuccess"> <upload v-else-if="formData.type === 2" type="video" direct :multiple="false" :limit="1" :show-progress="true" @success="handleUploadSuccess">
<el-button type="primary">上传视频 (OSS直传)</el-button> <el-button type="primary">上传视频 (OSS直传)</el-button>
</upload> </upload>
@@ -156,6 +159,15 @@ const formData = reactive<any>({
user_ids: [] 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(() => { const computedRules = computed(() => {
if (isEdit.value) { if (isEdit.value) {
return { return {
@@ -164,7 +176,7 @@ const computedRules = computed(() => {
} }
return { return {
title: [{ required: true, message: '请输入标题', trigger: 'blur' }], title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
file_url: [{ required: true, message: '请输入或上传文件获取链接', trigger: 'blur' }] file_url: [{ required: true, validator: validateFileUrl, trigger: 'change' }]
} }
}) })
@@ -55,34 +55,59 @@ class AssetResourceController extends BaseAdminController
public function add() public function add()
{ {
$params = $this->request->post(); $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('请填写完整的资源信息'); return $this->fail('请填写完整的资源信息');
} }
// 仅图片支持批量;视频/语音只取首个
if ($type != 1) {
$fileUrls = [$fileUrls[0]];
}
$multi = count($fileUrls) > 1;
Db::startTrans(); Db::startTrans();
try { try {
$resource = AssetResource::create([ $createdIds = [];
'type' => $params['type'], $index = 0;
'title' => $params['title'], foreach ($fileUrls as $url) {
'file_url' => $params['file_url'], $index++;
'cover_url' => $params['cover_url'] ?? '', $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'])) { if (!empty($params['user_ids']) && is_array($params['user_ids'])) {
$userResources = []; $userResources = [];
foreach ($params['user_ids'] as $userId) { foreach ($params['user_ids'] as $userId) {
$userResources[] = [ $userResources[] = [
'user_id' => $userId, 'user_id' => $userId,
'resource_id' => $resource->id, 'resource_id' => $resource->id,
'create_time' => time(), 'create_time' => time(),
]; ];
}
(new AssetUserResource())->saveAll($userResources);
} }
(new AssetUserResource())->saveAll($userResources);
$createdIds[] = $resource->id;
} }
Db::commit(); Db::commit();
return $this->success('添加并分配成功', ['id' => $resource->id]); return $this->success('添加并分配成功', ['ids' => $createdIds]);
} catch (\Exception $e) { } catch (\Exception $e) {
Db::rollback(); Db::rollback();
return $this->fail('操作失败: ' . $e->getMessage()); return $this->fail('操作失败: ' . $e->getMessage());