优化PUT请求传参机制,实现最小化传参以减少网络传输和提高性能,在请求拦截器中自动计算差异只传递修改过的字段,同时新增通用的表单差异比较工具函数,

This commit is contained in:
WUSIJIAN
2026-01-13 18:06:53 +08:00
parent cdbda577cc
commit f8af956f06
6 changed files with 289 additions and 24 deletions

View File

@@ -445,6 +445,7 @@ import type { FormInstance, FormRules } from 'element-plus';
import { Plus, Delete } from '@element-plus/icons-vue';
import { getAsset, createAsset, updateAsset, uploadAssetImage } from '/@/api/assets/asset';
import { getCategoryTree, getCategory } from '/@/api/assets/category';
import { createFormDiff } from '/@/utils/diffUtils';
import Editor from '/@/components/editor/index.vue';
import type { UploadFile, UploadUserFile, UploadRequestOptions } from 'element-plus';
@@ -555,6 +556,8 @@ const dialogVisible = ref(false);
const dialogImageUrl = ref('');
// 图片拼接
const fileAddressPrefix = ref('');
// 使用通用工具函数保存原始数据,用于最小化传参
const assetFormDiff = createFormDiff<Record<string, any>>();
const formatImageUrl = (url?: string) => {
if (!url) return '';
@@ -1021,6 +1024,9 @@ const openDialog = (row?: any, edit?: boolean) => {
categoryAttrs.value = [];
});
}
// 保存原始数据用于最小化传参
assetFormDiff.saveOriginal(JSON.parse(JSON.stringify(ruleForm)));
})
.finally(() => {
formLoading.value = false;
@@ -1187,7 +1193,21 @@ const onSubmit = async () => {
if (valid) {
submitLoading.value = true;
try {
const requestBody = await buildRequestBody();
const fullRequestBody = await buildRequestBody();
let requestBody: any;
if (isEdit.value) {
// 编辑模式:通过 _originalData 让拦截器自动处理最小化传参
const originalData = assetFormDiff.getOriginal();
requestBody = {
...fullRequestBody,
_originalData: originalData,
};
} else {
// 新增模式:传递所有字段
requestBody = fullRequestBody;
}
const request = isEdit.value ? updateAsset(requestBody) : createAsset(requestBody);
await request;