diff --git a/src/components/InterfaceDetail/index.vue b/src/components/InterfaceDetail/index.vue
index bfa0679..ce5205e 100644
--- a/src/components/InterfaceDetail/index.vue
+++ b/src/components/InterfaceDetail/index.vue
@@ -3905,7 +3905,7 @@
参数名:与服务商文档、curl、Mapping Body / Body 参数树、前置脚本写入字段名保持一致(如 _aop_signature、notifyBizEventDTO)。
参数值:使用占位符或留空,不要填写 curl 中的真实签名/业务样例;转发前由 Like API 替换。
$FromMappingBody(FormUrlEncoded):Query 上承载业务 JSON 的字段(如 *DTO)填此占位符,映射结果来自 Mapping Body 参数树;POST 参数仅在 URL、无 Body 时,DTO 应配置在 Query 而非 Body 表单。
- $FromAccount:按参数名从服务商账户取值;$TimeStamp / $DateTime:时间;$token:令牌;$Url:当前请求地址。
+ $FromAccount:按参数名从服务商账户取值;$TimeStamp / $DateTime:时间;$Token:令牌;$Url:当前请求地址。
留空:签名类参数(如 sign、_aop_signature)由前置脚本写入。
参数描述:可记录备注或 curl 片段,便于对照映射,不参与转发。
diff --git a/src/constants/itfxEnums.ts b/src/constants/itfxEnums.ts
index 06ebc3c..b616203 100644
--- a/src/constants/itfxEnums.ts
+++ b/src/constants/itfxEnums.ts
@@ -100,7 +100,7 @@ export const ParameterPlaceholderText: Record = {
[ParameterPlaceholder.TimeStamp]: '$TimeStamp',
[ParameterPlaceholder.DateTime]: '$DateTime',
[ParameterPlaceholder.Url]: '$Url',
- [ParameterPlaceholder.Token]: '$token',
+ [ParameterPlaceholder.Token]: '$Token',
[ParameterPlaceholder.FromMappingBody]: '$FromMappingBody',
};
diff --git a/src/utils/interfaceParameterModel.ts b/src/utils/interfaceParameterModel.ts
index 89b139d..ccf2971 100644
--- a/src/utils/interfaceParameterModel.ts
+++ b/src/utils/interfaceParameterModel.ts
@@ -399,6 +399,14 @@ function isSameFormKvRow(row: any, baseline: NormalizedParamRow): boolean {
);
}
+function isPersistableFormKvRow(p: any) {
+ // 删除只依赖 id;参数值允许留空(签名类由前置脚本写入)
+ if (Number(p?.optionType) === 2) {
+ return Number(p?.id) > 0;
+ }
+ return !!(p.name && String(p.name).trim() !== '');
+}
+
function buildFormKvParameterList(
changes: any[],
tableData: any[],
@@ -406,24 +414,23 @@ function buildFormKvParameterList(
isEditMode: boolean,
original: OriginalParamSnapshot,
) {
- const isValid = (p: any) =>
- p.name && String(p.name).trim() !== '' && p.value && String(p.value).trim() !== '';
-
const changeById = new Map(changes.map((c) => [Number(c.id), c]));
const removedIds = new Set(
changes.filter((c) => c.optionType === 2).map((c) => Number(c.id)),
);
if (!isEditMode) {
- if (changes.length) return changes;
+ if (changes.length) return changes.filter(isPersistableFormKvRow);
return (tableData || [])
.map((item) => mapFormKvRow(stripFormKvMeta(item), 1, fieldPosition))
- .filter(isValid);
+ .filter(isPersistableFormKvRow);
}
const result: any[] = [];
changes.filter((c) => c.optionType === 2).forEach((c) => result.push(c));
+ const presentServerIds = new Set();
+
(tableData || []).forEach((item) => {
const rest = stripFormKvMeta(item);
const id = normalizeRowId(rest);
@@ -435,6 +442,8 @@ function buildFormKvParameterList(
const tracked = changeById.get(id);
if (tracked && tracked.optionType !== 2) {
result.push(tracked);
+ const trackedServerId = Number(tracked.id);
+ if (trackedServerId > 0) presentServerIds.add(trackedServerId);
return;
}
@@ -443,6 +452,7 @@ function buildFormKvParameterList(
const baseline = serverId ? original.rowById.get(serverId) : undefined;
if (serverId && baseline) {
+ presentServerIds.add(serverId);
if (!isSameFormKvRow(rest, baseline)) {
result.push(mapFormKvRow(rest, 3, fieldPosition, serverId));
}
@@ -454,7 +464,22 @@ function buildFormKvParameterList(
}
});
- return result.filter(isValid);
+ // VXE removeRecords 丢失时,仍按「原始快照有、当前表无」补删,避免库里残留
+ original.ids.forEach((serverId) => {
+ if (removedIds.has(serverId) || presentServerIds.has(serverId)) return;
+ const baseline = original.rowById.get(serverId);
+ if (!baseline?.name) return;
+ result.push({
+ id: serverId,
+ name: baseline.name,
+ value: baseline.alias || '',
+ description: baseline.description || '',
+ optionType: 2,
+ fieldPosition,
+ });
+ });
+
+ return result.filter(isPersistableFormKvRow);
}
function mapFormKvChanges(
@@ -476,9 +501,7 @@ function mapFormKvChanges(
...(actionRows.updateRecords || []).map((r) => mapRow(r, 3)),
];
- return list.filter(
- (p) => p.name && String(p.name).trim() !== '' && p.value && String(p.value).trim() !== '',
- );
+ return list.filter(isPersistableFormKvRow);
}
export interface InterfaceDetailSnapshot {