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-form-item>
<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">
<el-button type="primary">上传视频 (OSS直传)</el-button>
</upload>
@@ -156,6 +159,15 @@ const formData = reactive<any>({
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' }]
}
})
@@ -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());