whistle.mock-plugins 1.0.6-beta.21 → 1.0.6-beta.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/cgi-bin/test-interface.js +4 -9
- package/app/public/js/index.js +1 -1
- package/package.json +1 -1
- package/ui/src/components/interface-management/InterfaceTestModal.js +10 -1
- package/ui/src/components/interface-management/README.md +60 -19
- package/ui/src/components/interface-management/ResponseContentEditor.js +25 -4
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
2
|
import { Modal, Button, Form, Input, Alert, Space } from 'antd';
|
|
3
3
|
import { ExclamationCircleOutlined } from '@ant-design/icons';
|
|
4
4
|
import { proxyTypes } from './constants';
|
|
@@ -14,6 +14,15 @@ const InterfaceTestModal = ({
|
|
|
14
14
|
const [testResult, setTestResult] = useState(null);
|
|
15
15
|
const [testLoading, setTestLoading] = useState(false);
|
|
16
16
|
|
|
17
|
+
// 清理函数:模态框关闭时重置状态
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (!visible) {
|
|
20
|
+
setTestResult(null);
|
|
21
|
+
setTestLoading(false);
|
|
22
|
+
testForm.resetFields();
|
|
23
|
+
}
|
|
24
|
+
}, [visible, testForm]);
|
|
25
|
+
|
|
17
26
|
const handleTestSubmit = async () => {
|
|
18
27
|
try {
|
|
19
28
|
const values = await testForm.validateFields();
|
|
@@ -18,11 +18,19 @@ src/components/interface-management/
|
|
|
18
18
|
|
|
19
19
|
## 组件优化说明
|
|
20
20
|
|
|
21
|
-
### 1. 响应管理UI
|
|
21
|
+
### 1. 响应管理UI优化历程
|
|
22
|
+
|
|
23
|
+
#### 第一阶段:组件合并
|
|
22
24
|
- **合并组件**:将原来的 `ResponseManager` 和 `ResponseEditor` 合并为一个 `ResponseContentEditor` 组件
|
|
23
25
|
- **简化界面**:移除响应描述字段和内容统计信息,只保留响应名称设置
|
|
24
26
|
- **一体化操作**:响应的添加、删除、切换和内容编辑都在同一个Card组件中完成
|
|
25
|
-
|
|
27
|
+
|
|
28
|
+
#### 第二阶段:交互优化
|
|
29
|
+
- **智能下拉框**:将响应选择和名称编辑合并为一个既可选择又可编辑的交互组件
|
|
30
|
+
- **双模式切换**:
|
|
31
|
+
- **选择模式**:下拉选择器用于切换不同响应,右侧编辑按钮可进入编辑模式
|
|
32
|
+
- **编辑模式**:输入框直接编辑响应名称,确认或取消按钮完成操作
|
|
33
|
+
- **更简洁的布局**:从三列布局(选择/名称/操作)优化为两列布局(选择编辑/删除)
|
|
26
34
|
|
|
27
35
|
### 2. 各组件职责
|
|
28
36
|
|
|
@@ -42,10 +50,9 @@ src/components/interface-management/
|
|
|
42
50
|
- `generateResponseId()`: 生成唯一响应ID
|
|
43
51
|
|
|
44
52
|
#### ResponseContentEditor.js
|
|
45
|
-
|
|
53
|
+
**优化后的响应内容编辑器组件**,负责:
|
|
46
54
|
- 响应的增删改查操作
|
|
47
|
-
-
|
|
48
|
-
- 响应名称编辑(简化,只保留名称字段)
|
|
55
|
+
- 智能响应选择和名称编辑(双模式交互)
|
|
49
56
|
- 响应内容编辑和格式化
|
|
50
57
|
- 预览功能集成
|
|
51
58
|
|
|
@@ -55,6 +62,11 @@ Props:
|
|
|
55
62
|
- `activeResponseId`: 当前激活的响应ID
|
|
56
63
|
- `onPreview`: 预览回调
|
|
57
64
|
|
|
65
|
+
特色功能:
|
|
66
|
+
- **双模式交互界面**:选择模式下可快速切换响应,编辑模式下可直接修改名称
|
|
67
|
+
- **一键切换**:点击编辑按钮立即进入编辑模式,支持回车确认和失焦保存
|
|
68
|
+
- **优雅的状态管理**:使用useState管理编辑状态,实现流畅的模式切换
|
|
69
|
+
|
|
58
70
|
#### InterfaceTestModal.js
|
|
59
71
|
接口测试模态框组件,负责:
|
|
60
72
|
- 接口测试表单
|
|
@@ -102,7 +114,7 @@ import {
|
|
|
102
114
|
generateResponseId
|
|
103
115
|
} from '../components/interface-management';
|
|
104
116
|
|
|
105
|
-
//
|
|
117
|
+
// 使用优化后的响应编辑器
|
|
106
118
|
<ResponseContentEditor
|
|
107
119
|
form={form}
|
|
108
120
|
responses={responses}
|
|
@@ -113,31 +125,60 @@ import {
|
|
|
113
125
|
|
|
114
126
|
## 优化效果
|
|
115
127
|
|
|
116
|
-
### UI
|
|
117
|
-
1.
|
|
118
|
-
2.
|
|
119
|
-
3.
|
|
128
|
+
### UI简化与交互优化
|
|
129
|
+
1. **智能交互**:一个组件同时支持选择和编辑功能,减少界面元素
|
|
130
|
+
2. **操作直观**:下拉选择 + 编辑按钮的组合,用户操作更自然
|
|
131
|
+
3. **状态清晰**:选择模式和编辑模式有明确的视觉区分
|
|
132
|
+
4. **快速操作**:支持回车确认、失焦保存等快捷操作
|
|
133
|
+
|
|
134
|
+
### 布局优化
|
|
135
|
+
- **从3列布局简化为2列**:选择编辑区域(span=20)+ 删除操作(span=4)
|
|
136
|
+
- **更好的空间利用**:合并后的组件占据更大空间,操作更便捷
|
|
137
|
+
- **视觉统一**:保持与整体设计风格的一致性
|
|
120
138
|
|
|
121
139
|
### 代码优化
|
|
122
|
-
1.
|
|
123
|
-
2.
|
|
124
|
-
3.
|
|
140
|
+
1. **状态管理增强**:新增编辑状态和名称编辑状态管理
|
|
141
|
+
2. **交互逻辑清晰**:分离选择、编辑开始、编辑完成、编辑取消等逻辑
|
|
142
|
+
3. **事件处理完善**:支持多种编辑完成方式(回车、点击确认、失焦)
|
|
125
143
|
|
|
126
144
|
### 功能保持
|
|
127
|
-
1.
|
|
145
|
+
1. **完整功能**:所有原有功能都得到保留和增强
|
|
128
146
|
2. **兼容性**:保持与现有数据结构的完全兼容
|
|
129
147
|
3. **稳定性**:优化过程中不破坏任何现有功能
|
|
130
148
|
|
|
149
|
+
## 新的UI布局
|
|
150
|
+
|
|
151
|
+
优化后的响应模块布局:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
┌─ 响应内容编辑 ─ [添加响应] [预览] [格式化JSON] ─┐
|
|
155
|
+
│ │
|
|
156
|
+
│ ┌─ 选择响应 / 编辑名称 ────────────┐ ┌─ 操作 ─┐ │
|
|
157
|
+
│ │ 选择模式:[下拉选择器] [编辑按钮] │ │ [删除] │ │
|
|
158
|
+
│ │ 编辑模式:[输入框] [确认] [取消] │ │ │ │
|
|
159
|
+
│ └─────────────────────────────┘ └──────┘ │
|
|
160
|
+
│ │
|
|
161
|
+
│ 响应内容: │
|
|
162
|
+
│ ┌──────────────────────────────────────────┐ │
|
|
163
|
+
│ │ │ │
|
|
164
|
+
│ │ JSON内容编辑区域 │ │
|
|
165
|
+
│ │ │ │
|
|
166
|
+
│ └──────────────────────────────────────────┘ │
|
|
167
|
+
└──────────────────────────────────────────────┘
|
|
168
|
+
```
|
|
169
|
+
|
|
131
170
|
## 优势
|
|
132
171
|
|
|
133
|
-
1.
|
|
134
|
-
2.
|
|
135
|
-
3.
|
|
136
|
-
4.
|
|
172
|
+
1. **用户体验**:更智能的交互设计,一个组件完成多种操作
|
|
173
|
+
2. **界面简洁**:减少界面元素,视觉更清爽
|
|
174
|
+
3. **操作效率**:快速切换选择和编辑模式,提升工作效率
|
|
175
|
+
4. **代码质量**:清晰的状态管理和事件处理逻辑
|
|
176
|
+
5. **扩展性**:良好的组件设计,便于后续功能扩展
|
|
137
177
|
|
|
138
178
|
## 兼容性
|
|
139
179
|
|
|
140
180
|
- 完全兼容原有功能和数据格式
|
|
141
181
|
- 保持所有API接口不变
|
|
142
182
|
- 用户界面和交互逻辑保持一致
|
|
143
|
-
- 构建和打包正常工作
|
|
183
|
+
- 构建和打包正常工作
|
|
184
|
+
- 向前兼容,新功能不影响现有数据
|
|
@@ -211,28 +211,49 @@ const ResponseContentEditor = ({
|
|
|
211
211
|
</div>
|
|
212
212
|
}
|
|
213
213
|
extra={
|
|
214
|
-
<Space>
|
|
214
|
+
<Space size="small">
|
|
215
215
|
<Button
|
|
216
|
-
type="
|
|
216
|
+
type="default"
|
|
217
217
|
icon={<PlusCircleOutlined />}
|
|
218
218
|
onClick={handleAddResponse}
|
|
219
219
|
size="small"
|
|
220
|
+
style={{
|
|
221
|
+
display: 'flex',
|
|
222
|
+
alignItems: 'center',
|
|
223
|
+
gap: '4px',
|
|
224
|
+
borderColor: '#1890ff',
|
|
225
|
+
color: '#1890ff'
|
|
226
|
+
}}
|
|
220
227
|
>
|
|
221
228
|
添加响应
|
|
222
229
|
</Button>
|
|
223
230
|
<Button
|
|
224
|
-
type="
|
|
231
|
+
type="default"
|
|
225
232
|
icon={<EyeOutlined />}
|
|
226
233
|
onClick={handlePreview}
|
|
227
234
|
size="small"
|
|
235
|
+
style={{
|
|
236
|
+
display: 'flex',
|
|
237
|
+
alignItems: 'center',
|
|
238
|
+
gap: '4px',
|
|
239
|
+
borderColor: '#52c41a',
|
|
240
|
+
color: '#52c41a'
|
|
241
|
+
}}
|
|
228
242
|
>
|
|
229
243
|
预览
|
|
230
244
|
</Button>
|
|
231
245
|
<Button
|
|
232
|
-
type="
|
|
246
|
+
type="default"
|
|
233
247
|
icon={<FormatPainterOutlined />}
|
|
234
248
|
onClick={formatJsonContent}
|
|
235
249
|
size="small"
|
|
250
|
+
style={{
|
|
251
|
+
display: 'flex',
|
|
252
|
+
alignItems: 'center',
|
|
253
|
+
gap: '4px',
|
|
254
|
+
borderColor: '#fa8c16',
|
|
255
|
+
color: '#fa8c16'
|
|
256
|
+
}}
|
|
236
257
|
>
|
|
237
258
|
格式化JSON
|
|
238
259
|
</Button>
|