whistle.mockbubu 1.0.0-dev.4 → 2.0.0

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.
@@ -0,0 +1,412 @@
1
+ # P0 Bug 修复记录
2
+
3
+ 本文档记录了所有 P0 级别 bug 的修复内容。
4
+
5
+ ## 修复日期
6
+ 2025-10-15
7
+
8
+ ## 修复列表
9
+
10
+ ### ✅ P0-1: 修复 updateVersionName 函数 bug
11
+
12
+ **文件**: `lib/utils.js:196-201`
13
+
14
+ **问题**:
15
+ - `getVersionContent` 调用时缺少必需参数,会导致函数执行失败
16
+ - `addNewVersion` 调用时参数名错误(`file` 应该是 `content`)
17
+
18
+ **修复前**:
19
+ ```javascript
20
+ const updateVersionName = ({ storage, filename, versionName, newVersion }) => {
21
+ const file = getVersionContent(versionName) // ❌ 缺少参数
22
+ addNewVersion({ storage, filename, versionName: newVersion, file }) // ❌ 错误的参数名
23
+ deleteVersion({ storage, filename, versionName })
24
+ }
25
+ ```
26
+
27
+ **修复后**:
28
+ ```javascript
29
+ const updateVersionName = ({ storage, filename, versionName, newVersion }) => {
30
+ const content = getVersionContent({ storage, filename, versionName }) // ✅ 传递完整参数
31
+ addNewVersion({ storage, filename, versionName: newVersion, content }) // ✅ 正确的参数名
32
+ deleteVersion({ storage, filename, versionName })
33
+ }
34
+ ```
35
+
36
+ ---
37
+
38
+ ### ✅ P0-2: 删除调试用 console.log
39
+
40
+ **文件**: `lib/utils.js`
41
+
42
+ **问题**: 存在调试用的 console.log 语句,应该清理
43
+
44
+ **修复内容**:
45
+ 1. 删除 line 73 的 `console.log(content)` (writeFile 函数)
46
+ 2. 删除 line 113 的 `console.log(resCache)` (readFile 函数)
47
+ 3. 增强错误日志,只在开发环境输出:
48
+
49
+ ```javascript
50
+ const withTryCatch = (fn) => {
51
+ return async (...args) => {
52
+ try {
53
+ return await fn(...args)
54
+ } catch (e) {
55
+ // 仅在开发环境输出错误日志
56
+ if (process.env.NODE_ENV === 'development') {
57
+ console.error('[mockbubu] 全局捕获异常:', e)
58
+ }
59
+ throw e
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ 4. 批量删除接口的错误处理改进 (`lib/uiServer/router/index.js:182-199`):
66
+
67
+ ```javascript
68
+ // 批量删除
69
+ const errors = []
70
+ filteredList.forEach((item) => {
71
+ try {
72
+ removeFile(localStorage, item.name)
73
+ } catch (error) {
74
+ errors.push({ name: item.name, error: error.message })
75
+ // 仅在开发环境输出错误日志
76
+ if (process.env.NODE_ENV === 'development') {
77
+ console.error(`[mockbubu] 删除文件 ${item.name} 失败:`, error.message)
78
+ }
79
+ }
80
+ })
81
+
82
+ // 如果有错误,在响应中返回
83
+ if (errors.length > 0) {
84
+ ctx.body = createSuccessResponse({ errors }, `删除完成,${errors.length} 个文件删除失败`)
85
+ return
86
+ }
87
+ ```
88
+
89
+ ---
90
+
91
+ ### ✅ P0-3: CORS 安全性增强
92
+
93
+ **文件**: `lib/uiServer/index.js:18-36`
94
+
95
+ **问题**: CORS 配置过于宽松(`origin: '*'`),存在安全风险
96
+
97
+ **修复前**:
98
+ ```javascript
99
+ app.use(cors({
100
+ origin: '*', // ❌ 允许任何域名访问
101
+ maxAge: 10,
102
+ credentials: true,
103
+ allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
104
+ }))
105
+ ```
106
+
107
+ **修复后**:
108
+ ```javascript
109
+ app.use(
110
+ cors({
111
+ origin: (ctx) => {
112
+ const origin = ctx.get('Origin')
113
+ // 只允许 localhost 和 127.0.0.1 的请求
114
+ if (!origin || /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i.test(origin)) {
115
+ return origin || '*'
116
+ }
117
+ // Whistle UI 的域名
118
+ if (/^https?:\/\/local\.whistlejs\.com(:\d+)?$/i.test(origin)) {
119
+ return origin
120
+ }
121
+ return false // ✅ 其他域名一律拒绝
122
+ },
123
+ maxAge: 10,
124
+ credentials: true,
125
+ allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
126
+ }),
127
+ )
128
+ ```
129
+
130
+ **安全说明**:
131
+ - 只允许 localhost、127.0.0.1、local.whistlejs.com 访问
132
+ - 阻止其他域名的跨域请求
133
+ - 保护用户的 mock 数据不被恶意网站访问
134
+
135
+ ---
136
+
137
+ ### ✅ P0-4: 输入参数验证
138
+
139
+ **新增文件**: `lib/uiServer/validator.js`
140
+
141
+ **问题**: 所有 API 接口缺少输入验证,存在安全风险和稳定性问题
142
+
143
+ **解决方案**: 创建完整的验证模块,包含以下验证器:
144
+
145
+ #### 1. validateFilename - 文件名验证
146
+ ```javascript
147
+ const validateFilename = (name) => {
148
+ if (!name || typeof name !== 'string') {
149
+ return '文件名不能为空'
150
+ }
151
+ if (name.length > 2048) {
152
+ return '文件名长度不能超过 2048 字符'
153
+ }
154
+ return null
155
+ }
156
+ ```
157
+
158
+ #### 2. validateVersionName - 版本名验证
159
+ ```javascript
160
+ const validateVersionName = (versionName) => {
161
+ if (!versionName || typeof versionName !== 'string') {
162
+ return '版本名不能为空'
163
+ }
164
+ if (versionName.length > 100) {
165
+ return '版本名长度不能超过 100 字符'
166
+ }
167
+ // 允许: 中文、字母、数字、下划线、连字符、空格
168
+ // 不允许: / \ : * ? " < > | 等文件系统保留字符
169
+ if (/[\/\\:*?"<>|]/.test(versionName)) {
170
+ return '版本名不能包含特殊字符 / \\ : * ? " < > |'
171
+ }
172
+ return null
173
+ }
174
+ ```
175
+
176
+ **重要改进**: 支持中文版本名!
177
+
178
+ #### 3. validateMockData - Mock 数据验证
179
+ ```javascript
180
+ const validateMockData = (data) => {
181
+ // 允许 undefined (使用默认值),但不允许 null
182
+ if (data === null) {
183
+ return 'Mock 数据不能为 null'
184
+ }
185
+ // 如果 data 是 undefined,跳过大小检查(会使用默认值)
186
+ if (data === undefined) {
187
+ return null
188
+ }
189
+ // 限制大小为 5MB
190
+ const dataStr = typeof data === 'string' ? data : JSON.stringify(data)
191
+ if (dataStr.length > 5 * 1024 * 1024) {
192
+ return 'Mock 数据大小不能超过 5MB'
193
+ }
194
+ return null
195
+ }
196
+ ```
197
+
198
+ **重要改进**: 允许 `content` 为 undefined,创建版本时可以不传递内容!
199
+
200
+ #### 4. validateBoolean - 布尔值验证
201
+ ```javascript
202
+ const validateBoolean = (value, fieldName) => {
203
+ if (typeof value !== 'boolean') {
204
+ return `${fieldName} 必须是布尔值`
205
+ }
206
+ return null
207
+ }
208
+ ```
209
+
210
+ #### 5. validateRuleValue - 规则类型验证
211
+ ```javascript
212
+ const validateRuleValue = (ruleValue) => {
213
+ const validValues = ['pathname', 'href', 'pattern']
214
+ if (!ruleValue || !validValues.includes(ruleValue)) {
215
+ return `ruleValue 必须是 ${validValues.join(', ')} 之一`
216
+ }
217
+ return null
218
+ }
219
+ ```
220
+
221
+ #### 6. validate - 验证中间件
222
+ ```javascript
223
+ const validate = (schema) => {
224
+ return async (ctx, next) => {
225
+ const body = ctx.request.body || {}
226
+ const errors = []
227
+
228
+ Object.keys(schema).forEach((key) => {
229
+ const validator = schema[key]
230
+ const value = body[key]
231
+ const error = validator(value)
232
+ if (error) {
233
+ errors.push({ field: key, message: error })
234
+ }
235
+ })
236
+
237
+ if (errors.length > 0) {
238
+ ctx.status = 400
239
+ ctx.body = {
240
+ code: 400,
241
+ msg: '参数验证失败',
242
+ data: errors,
243
+ }
244
+ return
245
+ }
246
+
247
+ await next()
248
+ }
249
+ }
250
+ ```
251
+
252
+ ---
253
+
254
+ ### 应用验证到所有 API 端点
255
+
256
+ #### lib/uiServer/router/index.js
257
+
258
+ 1. **获取列表数据** - 无需验证(使用 POST 是为了发送过滤参数)
259
+ 2. **更新文件详情** (line 59-79):
260
+ ```javascript
261
+ router.post('/cgi-bin/mockbubu/update-api-data', validate({
262
+ name: validateFilename,
263
+ data: validateMockData,
264
+ }), (ctx) => { ... })
265
+ ```
266
+
267
+ 3. **获取文件详情** (line 82-100):
268
+ ```javascript
269
+ router.post('/cgi-bin/mockbubu/get-api-data', validate({
270
+ name: validateFilename,
271
+ }), (ctx) => { ... })
272
+ ```
273
+
274
+ 4. **新增 mock 接口** (line 103-123):
275
+ ```javascript
276
+ router.post('/cgi-bin/mockbubu/create-api-data', validate({
277
+ name: validateFilename,
278
+ content: validateMockData,
279
+ ruleValue: validateRuleValue,
280
+ }), (ctx) => { ... })
281
+ ```
282
+
283
+ 5. **修改接口 mock 开关** (line 126-139):
284
+ ```javascript
285
+ router.post('/cgi-bin/mockbubu/update-api-mock', validate({
286
+ name: validateFilename,
287
+ mock: (val) => validateBoolean(val, 'mock'),
288
+ }), (ctx) => { ... })
289
+ ```
290
+
291
+ 6. **修改接口 lock 开关** (line 142-155):
292
+ ```javascript
293
+ router.post('/cgi-bin/mockbubu/update-api-lock', validate({
294
+ name: validateFilename,
295
+ locked: (val) => validateBoolean(val, 'locked'),
296
+ }), (ctx) => { ... })
297
+ ```
298
+
299
+ 7. **删除接口数据** (line 158-170):
300
+ ```javascript
301
+ router.post('/cgi-bin/mockbubu/delete-api', validate({
302
+ name: validateFilename,
303
+ }), (ctx) => { ... })
304
+ ```
305
+
306
+ 8. **批量删除接口** - 无需验证(参数是可选的过滤条件)
307
+
308
+ #### lib/uiServer/router/version-router.js
309
+
310
+ 1. **新增版本** (line 22-45):
311
+ ```javascript
312
+ router.post('/cgi-bin/mockbubu/add-new-version', validate({
313
+ name: validateFilename,
314
+ versionName: validateVersionName,
315
+ content: validateMockData,
316
+ }), (ctx) => { ... })
317
+ ```
318
+
319
+ 2. **删除版本** (line 48-73):
320
+ ```javascript
321
+ router.post('/cgi-bin/mockbubu/delete-version', validate({
322
+ name: validateFilename,
323
+ versionName: validateVersionName,
324
+ }), (ctx) => { ... })
325
+ ```
326
+
327
+ 3. **更新版本内容** (line 76-96):
328
+ ```javascript
329
+ router.post('/cgi-bin/mockbubu/update-version-content', validate({
330
+ name: validateFilename,
331
+ versionName: validateVersionName,
332
+ content: validateMockData,
333
+ }), (ctx) => { ... })
334
+ ```
335
+
336
+ 4. **更新版本名称** (line 99-119):
337
+ ```javascript
338
+ router.post('/cgi-bin/mockbubu/update-version-name', validate({
339
+ name: validateFilename,
340
+ versionName: validateVersionName,
341
+ newVersion: validateVersionName,
342
+ }), (ctx) => { ... })
343
+ ```
344
+
345
+ 5. **获取版本列表** (line 122-135):
346
+ ```javascript
347
+ router.post('/cgi-bin/mockbubu/get-versions', validate({
348
+ name: validateFilename,
349
+ }), (ctx) => { ... })
350
+ ```
351
+
352
+ 6. **设置 mock 的版本** (line 138-156):
353
+ ```javascript
354
+ router.post('/cgi-bin/mockbubu/set-mock-version', validate({
355
+ name: validateFilename,
356
+ versionName: (val) => {
357
+ // versionName 可以为空字符串(表示清除版本)
358
+ if (val === '') return null
359
+ return validateVersionName(val)
360
+ },
361
+ }), (ctx) => { ... })
362
+ ```
363
+
364
+ ---
365
+
366
+ ## 验证效果
367
+
368
+ ### 错误响应格式
369
+ 当参数验证失败时,返回统一的错误格式:
370
+
371
+ ```json
372
+ {
373
+ "code": 400,
374
+ "msg": "参数验证失败",
375
+ "data": [
376
+ {
377
+ "field": "versionName",
378
+ "message": "版本名不能包含特殊字符 / \\ : * ? \" < > |"
379
+ },
380
+ {
381
+ "field": "content",
382
+ "message": "Mock 数据不能为 null"
383
+ }
384
+ ]
385
+ }
386
+ ```
387
+
388
+ ### 安全保护
389
+ - ✅ 防止注入攻击(文件名/版本名长度限制)
390
+ - ✅ 防止文件系统攻击(禁止特殊字符)
391
+ - ✅ 防止内存耗尽(Mock 数据大小限制 5MB)
392
+ - ✅ 防止类型错误(严格的类型检查)
393
+
394
+ ---
395
+
396
+ ## 总结
397
+
398
+ 所有 P0 级别的 bug 已修复:
399
+
400
+ 1. ✅ **P0-1**: updateVersionName 函数参数错误 - 已修复
401
+ 2. ✅ **P0-2**: 删除调试用 console.log - 已清理
402
+ 3. ✅ **P0-3**: CORS 安全性增强 - 已限制为本地域名
403
+ 4. ✅ **P0-4**: 输入参数验证 - 已为所有 API 添加验证
404
+
405
+ **测试建议**:
406
+ 1. 测试创建中文版本名(如 "测试版本1")
407
+ 2. 测试创建版本时不传 content 参数
408
+ 3. 测试各种非法输入(超长字符串、特殊字符等)
409
+ 4. 测试跨域访问是否被正确阻止
410
+
411
+ **下一步**:
412
+ 可以开始处理 P1 级别的优化任务。
@@ -0,0 +1,292 @@
1
+ # P1 优化任务文档
2
+
3
+ 本文档记录所有 P1 级别的优化任务。
4
+
5
+ ## 优化日期
6
+ 2025-10-15
7
+
8
+ ## P1 优化列表
9
+
10
+ ### 🎯 P1-1: 批量操作功能缺失
11
+
12
+ **优先级**: P1
13
+ **类型**: 功能增强
14
+ **影响**: 用户体验
15
+
16
+ **问题描述**:
17
+ - 当有大量 mock 数据时,用户需要逐个删除/修改,效率低
18
+ - 缺少批量选择、批量删除、批量开关 mock 的功能
19
+
20
+ **期望功能**:
21
+ 1. 添加全选/反选复选框
22
+ 2. 支持批量删除选中的 mock
23
+ 3. 支持批量开启/关闭选中的 mock
24
+ 4. 显示已选数量
25
+
26
+ **优化方案**:
27
+ - 在表格中添加复选框列
28
+ - 在操作区域添加批量操作按钮组
29
+ - 实现批量 API 调用
30
+ - 添加操作确认对话框
31
+
32
+ **文件涉及**:
33
+ - `app/src/components/MockContainer.vue` - 添加选择逻辑
34
+ - `app/src/components/header/ActionPanel.vue` - 添加批量操作按钮
35
+ - `lib/uiServer/router/index.js` - 添加批量操作接口(如 `/batch-update-mock`)
36
+
37
+ **测试点**:
38
+ - 全选/反选功能
39
+ - 批量删除锁定和未锁定的混合数据
40
+ - 批量操作的错误处理
41
+
42
+ ---
43
+
44
+ ### 🎯 P1-2: 搜索功能不够强大
45
+
46
+ **优先级**: P1
47
+ **类型**: 功能增强
48
+ **影响**: 用户体验
49
+
50
+ **问题描述**:
51
+ - 当前只能按文件名搜索
52
+ - 无法按 URL、请求方法、状态码等字段搜索
53
+ - 无法组合多个条件搜索
54
+
55
+ **期望功能**:
56
+ 1. 支持多字段搜索(URL、方法、状态码)
57
+ 2. 支持高级筛选器
58
+ 3. 支持保存常用搜索条件
59
+ 4. 支持搜索历史
60
+
61
+ **优化方案**:
62
+ - 增强 `ActionPanel` 组件的搜索功能
63
+ - 添加高级搜索弹窗
64
+ - 后端 `handleFilterList` 函数增加更多过滤条件
65
+
66
+ **文件涉及**:
67
+ - `app/src/components/header/ActionPanel.vue` - 搜索 UI
68
+ - `lib/uiServer/util.js` - `handleFilterList` 函数增强
69
+ - `app/src/hooks/useHeader.js` - 搜索逻辑
70
+
71
+ **测试点**:
72
+ - 单条件搜索
73
+ - 组合条件搜索
74
+ - 搜索性能(大量数据)
75
+
76
+ ---
77
+
78
+ ### 🎯 P1-3: 版本管理 UI 需要优化
79
+
80
+ **优先级**: P1
81
+ **类型**: UI/UX 优化
82
+ **影响**: 用户体验
83
+
84
+ **问题描述**:
85
+ - 版本 tab 横向排列,数量多时不易查看
86
+ - 缺少版本的创建时间、修改时间信息
87
+ - 无法对版本进行备注说明
88
+ - 缺少版本对比功能
89
+
90
+ **期望功能**:
91
+ 1. 优化版本 tab 布局(考虑下拉选择或侧边栏)
92
+ 2. 显示版本元信息(创建时间、修改时间)
93
+ 3. 支持版本备注
94
+ 4. 支持版本对比(diff)
95
+
96
+ **优化方案 Phase 1** (本次实现):
97
+ - 添加版本创建时间显示
98
+ - 限制版本数量(最多保留 10 个)
99
+ - 添加版本描述字段
100
+
101
+ **优化方案 Phase 2** (未来):
102
+ - 版本对比(JSON diff)
103
+ - 版本恢复历史
104
+
105
+ **文件涉及**:
106
+ - `app/src/components/content/ResponsePanel.vue` - 版本 UI
107
+ - `lib/utils.js` - 版本管理函数增加时间戳
108
+ - `lib/uiServer/router/version-router.js` - API 增加描述字段
109
+
110
+ **测试点**:
111
+ - 版本元信息显示
112
+ - 版本数量限制
113
+ - 版本描述保存和显示
114
+
115
+ ---
116
+
117
+ ### 🎯 P1-4: Mock 数据编辑体验优化
118
+
119
+ **优先级**: P1
120
+ **类型**: UX 优化
121
+ **影响**: 用户体验
122
+
123
+ **问题描述**:
124
+ - JSON 编辑器缺少代码格式化
125
+ - 缺少语法错误提示
126
+ - 缺少快捷键说明
127
+ - 保存按钮位置不明显
128
+
129
+ **期望功能**:
130
+ 1. 添加格式化按钮(美化 JSON)
131
+ 2. 添加语法错误实时提示
132
+ 3. 显示快捷键提示
133
+ 4. 优化保存按钮样式和位置
134
+
135
+ **优化方案**:
136
+ - 在编辑器上方添加工具栏(格式化、验证、快捷键提示)
137
+ - 增强 JsonEditor 组件
138
+ - 优化保存按钮的视觉反馈
139
+
140
+ **文件涉及**:
141
+ - `app/src/components/common/JsonEditor.vue` - 编辑器组件
142
+ - `app/src/components/content/ResponsePanel.vue` - 添加工具栏
143
+
144
+ **测试点**:
145
+ - JSON 格式化功能
146
+ - 语法错误提示
147
+ - 快捷键功能
148
+ - 保存状态反馈
149
+
150
+ ---
151
+
152
+ ### 🎯 P1-5: 缺少数据导入导出功能
153
+
154
+ **优先级**: P1
155
+ **类型**: 功能增强
156
+ **影响**: 用户体验
157
+
158
+ **问题描述**:
159
+ - 无法导出所有 mock 数据进行备份
160
+ - 无法从其他环境导入 mock 数据
161
+ - 无法分享 mock 配置给团队成员
162
+
163
+ **期望功能**:
164
+ 1. 导出所有 mock 数据为 JSON 文件
165
+ 2. 导入 JSON 文件恢复 mock 数据
166
+ 3. 导出/导入单个 mock 配置
167
+ 4. 支持导出为 Postman Collection 格式
168
+
169
+ **优化方案 Phase 1** (本次实现):
170
+ - 添加全局导出按钮
171
+ - 添加全局导入按钮
172
+ - 实现 JSON 格式的导出/导入
173
+
174
+ **优化方案 Phase 2** (未来):
175
+ - Postman Collection 格式支持
176
+ - 增量导入(合并而非覆盖)
177
+
178
+ **文件涉及**:
179
+ - `app/src/components/header/ActionPanel.vue` - 添加导入/导出按钮
180
+ - `lib/uiServer/router/index.js` - 添加导出/导入接口
181
+ - `app/src/utils/export.js` - 新增导出工具函数
182
+
183
+ **测试点**:
184
+ - 导出所有 mock 数据
185
+ - 导入 JSON 文件
186
+ - 数据格式兼容性
187
+ - 错误处理
188
+
189
+ ---
190
+
191
+ ### 🎯 P1-6: 缺少操作日志/历史记录
192
+
193
+ **优先级**: P1
194
+ **类型**: 功能增强
195
+ **影响**: 可追溯性
196
+
197
+ **问题描述**:
198
+ - 无法查看谁修改了 mock 数据
199
+ - 无法回溯历史操作
200
+ - 调试时难以定位问题
201
+
202
+ **期望功能**:
203
+ 1. 记录所有操作(创建、修改、删除)
204
+ 2. 显示操作时间和类型
205
+ 3. 支持按时间筛选日志
206
+ 4. 支持撤销最近的操作
207
+
208
+ **优化方案**:
209
+ - 添加操作日志记录中间件
210
+ - 创建日志查看面板
211
+ - 使用 Whistle Storage API 持久化日志
212
+
213
+ **文件涉及**:
214
+ - `lib/uiServer/middleware/logger.js` - 新增日志中间件
215
+ - `app/src/components/LogPanel.vue` - 新增日志面板组件
216
+ - `lib/utils.js` - 添加日志工具函数
217
+
218
+ **测试点**:
219
+ - 操作日志记录
220
+ - 日志查看和筛选
221
+ - 日志性能(大量操作)
222
+
223
+ ---
224
+
225
+ ### 🎯 P1-7: Request/Response 详情展示不够完整
226
+
227
+ **优先级**: P1
228
+ **类型**: 功能增强
229
+ **影响**: 调试体验
230
+
231
+ **问题描述**:
232
+ - 只显示 Response,Request 信息不完整
233
+ - 缺少 Headers、Query 参数的展示
234
+ - 无法查看原始请求/响应
235
+
236
+ **期望功能**:
237
+ 1. 显示完整的 Request 信息(Headers、Body、Query)
238
+ 2. 显示完整的 Response 信息(Headers、Body、Status)
239
+ 3. 支持切换查看原始数据和格式化数据
240
+ 4. 支持复制请求/响应内容
241
+
242
+ **优化方案**:
243
+ - 增强 RequestDetail 组件
244
+ - 添加 Tab 切换(Headers、Body、Query)
245
+ - 添加复制按钮
246
+
247
+ **文件涉及**:
248
+ - `app/src/components/content/RequestDetail.vue` - 增强展示
249
+ - `lib/server.js` - 确保存储完整的请求信息
250
+
251
+ **测试点**:
252
+ - 完整信息展示
253
+ - Tab 切换
254
+ - 复制功能
255
+
256
+ ---
257
+
258
+ ## 优先级排序
259
+
260
+ 根据用户影响和实现难度,建议实现顺序:
261
+
262
+ 1. **P1-4: Mock 数据编辑体验优化** - 最高频使用,影响最大
263
+ 2. **P1-3: 版本管理 UI 优化 (Phase 1)** - 当前功能已有,只需优化
264
+ 3. **P1-1: 批量操作功能** - 大量数据时的刚需
265
+ 4. **P1-7: Request/Response 详情展示** - 调试必备
266
+ 5. **P1-5: 数据导入导出 (Phase 1)** - 备份和分享需求
267
+ 6. **P1-2: 搜索功能增强** - 数据多时提升效率
268
+ 7. **P1-6: 操作日志** - 长期价值,但不紧急
269
+
270
+ ## 实施计划
271
+
272
+ ### 第一阶段(本次迭代)✅
273
+ - ✅ P1-4: Mock 数据编辑体验优化
274
+ - ✅ P1-3: 版本管理 UI 优化 (Phase 1)
275
+ - ✅ 版本数量限制(最多10个)
276
+ - ✅ 版本描述字段
277
+ - ✅ 版本创建时间和修改时间
278
+ - ✅ 版本信息tooltip显示
279
+
280
+ ### 第二阶段(下次迭代)
281
+ - P1-1: 批量操作功能
282
+ - P1-7: Request/Response 详情展示
283
+
284
+ ### 第三阶段(未来)
285
+ - P1-5: 数据导入导出
286
+ - P1-2: 搜索功能增强
287
+
288
+ ## 备注
289
+
290
+ - 所有优化都需要保持向后兼容
291
+ - 优化过程中注意性能影响
292
+ - 每个优化完成后需要更新用户文档