= {};
+ virtualConfig.apiConfig.params.forEach((item: KeyValuePair) => {
+ if (item.key) paramsObj[item.key] = item.value;
+ });
+ virtualConfig.apiConfig.params = paramsObj;
+ }
+ }
+
+ body.virtualAssetConfig = virtualConfig;
} else if (ruleForm.type === 'service') {
- formData.append('serviceAssetConfig', JSON.stringify(ruleForm.serviceAssetConfig));
+ body.serviceAssetConfig = ruleForm.serviceAssetConfig;
}
- // 属性图片
- Object.keys(attrImageFiles.value).forEach((key) => {
- formData.append(key, attrImageFiles.value[key]);
- });
-
// 元数据(分类属性值)
if (categoryAttrs.value.length > 0) {
- const metadataArray = categoryAttrs.value.map((attr) => {
+ const metadataArray: any[] = [];
+ for (const attr of categoryAttrs.value) {
const key = getAttrKey(attr);
let value = ruleForm.metadata[key];
- // 过滤掉 blob url,避免传给后端
- if (typeof value === 'string' && value.startsWith('blob:')) {
+ // 如果是图片类型且有文件需要上传
+ if (attr.type === 'image' && attrImageFiles.value[key]) {
+ value = await uploadImage(attrImageFiles.value[key]);
+ } else if (typeof value === 'string' && value.startsWith('blob:')) {
value = '';
}
- return {
+ const metaItem: any = {
name: attr.name,
type: attr.type,
value: value,
- options: attr.options || [],
};
- });
- formData.append('metadata', JSON.stringify(metadataArray));
+
+ // 只有单选和多选类型才传递 options,且只传递选中的值对应的选项
+ if ((attr.type === 'select' || attr.type === 'multi_select') && attr.options && value) {
+ const selectedValues = Array.isArray(value) ? value : [value];
+ metaItem.options = attr.options.filter((opt: { label: string; value: string }) =>
+ selectedValues.includes(opt.value)
+ );
+ }
+
+ metadataArray.push(metaItem);
+ }
+ body.metadata = metadataArray;
}
- return formData;
+ return body;
};
// 提交
-const onSubmit = () => {
+const onSubmit = async () => {
const form = formRef.value;
if (!form) return;
- form.validate((valid: boolean) => {
+
+ form.validate(async (valid: boolean) => {
if (valid) {
submitLoading.value = true;
- const formData = buildFormData();
+ try {
+ const requestBody = await buildRequestBody();
+ const request = isEdit.value ? updateAsset(requestBody) : createAsset(requestBody);
- const request = isEdit.value ? updateAsset(formData) : createAsset(formData);
-
- request
- .then(() => {
- ElMessage.success(isEdit.value ? '修改成功' : '添加成功');
- closeDialog();
- emit('getAssetList');
- })
- .finally(() => {
- submitLoading.value = false;
- });
+ await request;
+ ElMessage.success(isEdit.value ? '修改成功' : '添加成功');
+ closeDialog();
+ emit('getAssetList');
+ } catch (error) {
+ console.error('提交失败:', error);
+ } finally {
+ submitLoading.value = false;
+ }
}
});
};
diff --git a/src/views/assets/category/component/editCategory.vue b/src/views/assets/category/component/editCategory.vue
index cd89112..2dc877e 100644
--- a/src/views/assets/category/component/editCategory.vue
+++ b/src/views/assets/category/component/editCategory.vue
@@ -24,6 +24,7 @@
属性名称
属性类型
+ 必填
字典
字典值
操作
@@ -49,6 +50,9 @@
/>
+
+
+
({
parentId: '',
name: '',
sort: 0,
- status: 'enabled',
attrs: [],
});
@@ -252,6 +254,7 @@ const addAttr = () => {
ruleForm.attrs.push({
name: '',
type: 'text',
+ required: true,
options: [],
});
};
@@ -286,7 +289,6 @@ const resetForm = () => {
ruleForm.parentId = '';
ruleForm.name = '';
ruleForm.sort = 0;
- ruleForm.status = 'enabled';
ruleForm.attrs = [];
};
@@ -309,7 +311,6 @@ const openDialog = (row?: CategoryRow | string, edit?: boolean) => {
ruleForm.parentId = data.parentId || '';
ruleForm.name = data.name || '';
ruleForm.sort = data.sort || 0;
- ruleForm.status = data.status || 'enabled';
// 处理 attrs 中的 options 字段
ruleForm.attrs = (data.attrs || []).map((attr: any) => {
let options = attr.options;
@@ -453,7 +454,7 @@ defineExpose({
.table-head,
.table-row {
display: grid;
- grid-template-columns: 1.4fr 1fr 1fr 1.4fr 60px;
+ grid-template-columns: 1.4fr 1fr 80px 1fr 1.4fr 60px;
align-items: center;
column-gap: 12px;
padding: 12px 16px;