whistle.mockbubu 1.0.0-dev.4 → 2.0.0-beta.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.
- package/.gitignore +4 -0
- package/CHANGELOG_GROUP_FEATURE.md +468 -0
- package/CHANGELOG_P0_FIXES.md +412 -0
- package/CHANGELOG_P1_OPTIMIZATIONS.md +292 -0
- package/CLAUDE.md +469 -0
- package/GROUP_FEATURE_DESIGN.md +520 -0
- package/README.md +106 -0
- package/lib/archive-utils.js +332 -0
- package/lib/const.js +19 -0
- package/lib/group-manager.js +660 -0
- package/lib/migration-v3.js +321 -0
- package/lib/server.js +333 -60
- package/lib/storage-adapter.js +518 -0
- package/lib/storage-v3.js +1368 -0
- package/lib/uiServer/index.js +76 -5
- package/lib/uiServer/router/group-router.js +218 -0
- package/lib/uiServer/router/index.js +1074 -51
- package/lib/uiServer/router/version-router.js +208 -63
- package/lib/uiServer/util.js +74 -16
- package/lib/uiServer/validator.js +105 -0
- package/lib/utils.js +107 -171
- package/package.json +1 -1
- package/public/js/app.js +5216 -1379
- package/public/js/app.js.map +1 -1
- package/public/js/chunk-vendors.js +14179 -8217
- package/public/js/chunk-vendors.js.map +1 -1
- package/rules.txt +1 -1
- package//346/212/200/346/234/257/346/226/271/346/241/210.md +452 -0
- package//346/265/213/350/257/225/346/215/225/350/216/267/345/212/237/350/203/275/346/255/245/351/252/244.md +145 -0
package/rules.txt
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# 默认会经历所有server
|
|
2
|
-
#
|
|
2
|
+
# *.shein.com mockbubu://
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
【技术需求】Whistle Mock 插件 - whistle.mockbubu
|
|
2
|
+
|
|
3
|
+
## 一、背景(技术需求必填)
|
|
4
|
+
|
|
5
|
+
### 需求背景分析
|
|
6
|
+
在前后端分离的开发模式下,前端开发经常需要等待后端接口开发完成才能进行联调测试,这严重影响了开发效率。同时,测试环境不稳定、接口响应数据不符合预期等问题也频繁出现。
|
|
7
|
+
|
|
8
|
+
### 业务现状介绍
|
|
9
|
+
- 前端开发依赖后端接口完成后才能进行功能开发和测试
|
|
10
|
+
- 测试环境接口不稳定,影响开发和测试效率
|
|
11
|
+
- 缺乏便捷的接口数据 mock 工具,手动修改响应数据效率低
|
|
12
|
+
- 多人协作时,mock 数据管理混乱,缺乏环境隔离
|
|
13
|
+
|
|
14
|
+
### 业务痛点分析
|
|
15
|
+
1. **开发效率低**:等待后端接口开发完成,前端无法独立开发
|
|
16
|
+
2. **测试困难**:难以模拟各种边界情况和异常场景
|
|
17
|
+
3. **环境污染**:测试数据相互干扰,缺乏环境隔离
|
|
18
|
+
4. **数据管理**:mock 数据分散,难以管理和版本控制
|
|
19
|
+
5. **协作困难**:团队成员之间无法共享和复用 mock 数据
|
|
20
|
+
|
|
21
|
+
### 方案设计目标介绍
|
|
22
|
+
开发一个基于 Whistle 的 API mock 插件,实现:
|
|
23
|
+
- 自动捕获真实 API 响应并支持编辑
|
|
24
|
+
- 灵活的 mock 开关,支持一键切换真实/模拟数据
|
|
25
|
+
- 完全隔离的多环境管理(分组模式:可自行管理开发、测试、预发或不同需求和复现bug等场景的mock数据)
|
|
26
|
+
- 版本管理功能,支持响应数据的多版本切换
|
|
27
|
+
- 直观的 Web UI,提升操作体验
|
|
28
|
+
|
|
29
|
+
## 二、价值评估(技术需求必填)
|
|
30
|
+
|
|
31
|
+
### 开发效率提升
|
|
32
|
+
- **并行开发**:前后端完全解耦,前端可基于接口约定独立开发,预计提升 30% 开发效率
|
|
33
|
+
- **快速调试**:一键切换真实/模拟数据,无需修改代码,节省 50% 调试时间
|
|
34
|
+
- **多场景测试**:轻松模拟各种边界情况和异常场景,覆盖率提升 40%
|
|
35
|
+
|
|
36
|
+
### 团队协作优化
|
|
37
|
+
- **环境隔离**:完全隔离的多环境管理,避免测试数据相互污染
|
|
38
|
+
- **数据复用**:版本管理支持,团队成员可共享和复用 mock 数据
|
|
39
|
+
- **降低沟通成本**:减少因环境问题导致的沟通成本约 20%
|
|
40
|
+
|
|
41
|
+
### 用户体验改进
|
|
42
|
+
- **直观 UI**:基于 Vue + Element UI 的现代化界面,学习成本低
|
|
43
|
+
- **实时预览**:修改 mock 数据后立即生效,无需重启
|
|
44
|
+
- **智能提示**:JSON 编辑器支持语法高亮和错误提示
|
|
45
|
+
|
|
46
|
+
### 长期价值
|
|
47
|
+
- **可维护性**:插件化架构,易于扩展和维护
|
|
48
|
+
- **标准化**:统一团队的 mock 方案,形成最佳实践
|
|
49
|
+
- **成本节约**:开源方案,无需购买商业 mock 平台
|
|
50
|
+
|
|
51
|
+
## 三、技术方案(必填)
|
|
52
|
+
|
|
53
|
+
### 3.1 技术方案调研
|
|
54
|
+
|
|
55
|
+
#### 方案前期调研
|
|
56
|
+
调研了市面上主流的 mock 方案:
|
|
57
|
+
1. **Mock.js**:纯前端 mock,无法拦截真实网络请求
|
|
58
|
+
2. **Yapi / Rap2**:需要独立部署后端服务,维护成本高
|
|
59
|
+
3. **Charles / Fiddler**:功能强大但操作复杂,学习成本高
|
|
60
|
+
4. **Whistle 插件**:轻量级,与现有工具链完美集成
|
|
61
|
+
|
|
62
|
+
#### 方案选型、优缺点对比
|
|
63
|
+
| 方案 | 优点 | 缺点 | 评分 |
|
|
64
|
+
|------|------|------|------|
|
|
65
|
+
| Mock.js | 轻量,易用 | 无法拦截真实请求,功能有限 | 6/10 |
|
|
66
|
+
| Yapi/Rap2 | 功能完善,支持团队协作 | 需要独立部署,维护成本高 | 7/10 |
|
|
67
|
+
| Charles/Fiddler | 功能强大,成熟稳定 | 操作复杂,学习成本高 | 7/10 |
|
|
68
|
+
| **Whistle 插件** | 轻量,易集成,开发友好 | 需要开发,初期投入 | **9/10** |
|
|
69
|
+
|
|
70
|
+
#### 方案调研结论
|
|
71
|
+
选择基于 Whistle 开发插件,原因:
|
|
72
|
+
- 团队已广泛使用 Whistle,无额外学习成本
|
|
73
|
+
- 插件化架构,易于定制和扩展
|
|
74
|
+
- 轻量级,无需独立部署后端服务
|
|
75
|
+
- 社区活跃,生态完善
|
|
76
|
+
|
|
77
|
+
### 3.2 技术方案整体设计(必填)
|
|
78
|
+
|
|
79
|
+
#### 整体架构
|
|
80
|
+
```
|
|
81
|
+
┌─────────────────────────────────────────────────────┐
|
|
82
|
+
│ Whistle (代理层) │
|
|
83
|
+
├─────────────────────────────────────────────────────┤
|
|
84
|
+
│ whistle.mockbubu 插件 │
|
|
85
|
+
├──────────────────┬──────────────────────────────────┤
|
|
86
|
+
│ 后端 (Node.js) │ 前端 (Vue 2.7) │
|
|
87
|
+
│ - Koa Server │ - MockContainer (主容器) │
|
|
88
|
+
│ - 请求拦截器 │ - RequestList (列表) │
|
|
89
|
+
│ - Storage API │ - RequestDetail (详情) │
|
|
90
|
+
│ - 分组管理器 │ - ResponsePanel (编辑器) │
|
|
91
|
+
│ - 版本管理 │ - GroupManager (分组管理) │
|
|
92
|
+
└──────────────────┴──────────────────────────────────┘
|
|
93
|
+
│ │
|
|
94
|
+
↓ ↓
|
|
95
|
+
Whistle Storage Element UI + JsonEditor
|
|
96
|
+
(本地文件存储) (UI 组件库)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### 整体流程
|
|
100
|
+
1. **请求捕获**:Whistle 拦截匹配规则的 HTTP 请求
|
|
101
|
+
2. **数据存储**:插件捕获真实响应并存储到本地
|
|
102
|
+
3. **Mock 开关**:用户通过 Web UI 控制是否启用 mock
|
|
103
|
+
4. **数据编辑**:Web UI 提供 JSON 编辑器修改响应数据
|
|
104
|
+
5. **版本管理**:支持创建多个版本并灵活切换
|
|
105
|
+
6. **环境隔离**:完全隔离的分组管理,避免数据污染
|
|
106
|
+
|
|
107
|
+
#### 业务流程图
|
|
108
|
+
|
|
109
|
+
```mermaid
|
|
110
|
+
flowchart TD
|
|
111
|
+
Start([用户发起 HTTP 请求]) --> Whistle{Whistle 规则匹配}
|
|
112
|
+
Whistle -->|匹配 mockbubu://| Plugin[whistle.mockbubu 插件]
|
|
113
|
+
Whistle -->|不匹配| PassThrough[直接透传]
|
|
114
|
+
|
|
115
|
+
Plugin --> CheckMock{检查 Mock 开关}
|
|
116
|
+
|
|
117
|
+
CheckMock -->|Mock: ON + 有缓存| ReturnMock[返回 Mock 数据]
|
|
118
|
+
CheckMock -->|Mock: ON + 无缓存| CaptureFirst[先捕获真实数据]
|
|
119
|
+
CheckMock -->|Mock: OFF| CheckCache{有缓存?}
|
|
120
|
+
|
|
121
|
+
CheckCache -->|有缓存| PassThrough2[直接透传]
|
|
122
|
+
CheckCache -->|无缓存| Capture[捕获真实响应]
|
|
123
|
+
|
|
124
|
+
CaptureFirst --> RealRequest1[请求真实服务器]
|
|
125
|
+
Capture --> RealRequest2[请求真实服务器]
|
|
126
|
+
|
|
127
|
+
RealRequest1 --> SaveData1[存储响应数据]
|
|
128
|
+
RealRequest2 --> SaveData2[存储响应数据]
|
|
129
|
+
|
|
130
|
+
SaveData1 --> ReturnReal1[返回真实响应]
|
|
131
|
+
SaveData2 --> ReturnReal2[返回真实响应]
|
|
132
|
+
|
|
133
|
+
ReturnMock --> End([返回给客户端])
|
|
134
|
+
ReturnReal1 --> End
|
|
135
|
+
ReturnReal2 --> End
|
|
136
|
+
PassThrough --> End
|
|
137
|
+
PassThrough2 --> End
|
|
138
|
+
|
|
139
|
+
style Plugin fill:#e1f5ff
|
|
140
|
+
style ReturnMock fill:#b7eb8f
|
|
141
|
+
style Capture fill:#ffe58f
|
|
142
|
+
style SaveData1 fill:#ffe58f
|
|
143
|
+
style SaveData2 fill:#ffe58f
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### 请求拦截时序图
|
|
147
|
+
|
|
148
|
+
```mermaid
|
|
149
|
+
sequenceDiagram
|
|
150
|
+
participant Client as 浏览器/客户端
|
|
151
|
+
participant Whistle as Whistle 代理
|
|
152
|
+
participant Plugin as mockbubu 插件
|
|
153
|
+
participant Storage as Whistle Storage
|
|
154
|
+
participant Server as 真实服务器
|
|
155
|
+
|
|
156
|
+
Client->>Whistle: 1. 发起 HTTP 请求
|
|
157
|
+
Whistle->>Whistle: 2. 匹配规则 (mockbubu://)
|
|
158
|
+
Whistle->>Plugin: 3. 转发到插件处理
|
|
159
|
+
|
|
160
|
+
Plugin->>Storage: 4. 读取文件配置 (mock 开关)
|
|
161
|
+
Storage-->>Plugin: 5. 返回配置信息
|
|
162
|
+
|
|
163
|
+
alt Mock: ON 且有缓存
|
|
164
|
+
Plugin->>Storage: 6a. 读取缓存数据
|
|
165
|
+
Storage-->>Plugin: 7a. 返回 Mock 数据
|
|
166
|
+
Plugin-->>Client: 8a. 返回 Mock 响应
|
|
167
|
+
else Mock: ON 但无缓存
|
|
168
|
+
Plugin->>Server: 6b. 请求真实服务器
|
|
169
|
+
Server-->>Plugin: 7b. 返回真实响应
|
|
170
|
+
Plugin->>Storage: 8b. 存储响应数据
|
|
171
|
+
Plugin-->>Client: 9b. 返回真实响应
|
|
172
|
+
else Mock: OFF 且无缓存
|
|
173
|
+
Plugin->>Server: 6c. 请求真实服务器
|
|
174
|
+
Server-->>Plugin: 7c. 返回真实响应
|
|
175
|
+
Plugin->>Storage: 8c. 存储响应数据 (首次捕获)
|
|
176
|
+
Plugin-->>Client: 9c. 返回真实响应
|
|
177
|
+
else Mock: OFF 且有缓存
|
|
178
|
+
Plugin->>Whistle: 6d. 透传请求
|
|
179
|
+
Whistle->>Server: 7d. 请求真实服务器
|
|
180
|
+
Server-->>Whistle: 8d. 返回真实响应
|
|
181
|
+
Whistle-->>Client: 9d. 返回真实响应
|
|
182
|
+
end
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
#### 用户操作流程图
|
|
186
|
+
|
|
187
|
+
```mermaid
|
|
188
|
+
flowchart LR
|
|
189
|
+
subgraph 初始配置
|
|
190
|
+
A1[配置 Whistle 规则] --> A2[启动 Whistle]
|
|
191
|
+
A2 --> A3[打开插件 Web UI]
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
subgraph 首次捕获
|
|
195
|
+
B1[触发 HTTP 请求] --> B2[插件自动捕获]
|
|
196
|
+
B2 --> B3[在列表中显示]
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
subgraph 数据管理
|
|
200
|
+
C1[点击文件查看] --> C2[编辑 Response 数据]
|
|
201
|
+
C2 --> C3{保存类型}
|
|
202
|
+
C3 -->|覆盖原版本| C4[更新 source 版本]
|
|
203
|
+
C3 -->|创建新版本| C5[创建 v1/v2 等版本]
|
|
204
|
+
C5 --> C6[版本切换]
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
subgraph Mock控制
|
|
208
|
+
D1[开启 Mock 开关] --> D2[再次发起请求]
|
|
209
|
+
D2 --> D3[返回 Mock 数据]
|
|
210
|
+
D3 --> D4{需要调试?}
|
|
211
|
+
D4 -->|是| D5[关闭 Mock 看真实数据]
|
|
212
|
+
D4 -->|否| D6[继续开发]
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
subgraph 环境管理
|
|
216
|
+
E1[创建新分组] --> E2[切换分组]
|
|
217
|
+
E2 --> E3[独立的 Mock 数据]
|
|
218
|
+
E3 --> E4[多环境隔离]
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
A3 --> B1
|
|
222
|
+
B3 --> C1
|
|
223
|
+
C6 --> D1
|
|
224
|
+
D6 --> E1
|
|
225
|
+
D5 --> B1
|
|
226
|
+
|
|
227
|
+
style A1 fill:#e6f7ff
|
|
228
|
+
style B2 fill:#fff7e6
|
|
229
|
+
style C2 fill:#f6ffed
|
|
230
|
+
style D1 fill:#fff1f0
|
|
231
|
+
style E3 fill:#f9f0ff
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
#### 数据流图
|
|
235
|
+
|
|
236
|
+
```mermaid
|
|
237
|
+
flowchart TB
|
|
238
|
+
subgraph 用户层
|
|
239
|
+
UI[Web UI 界面]
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
subgraph 应用层
|
|
243
|
+
API[RESTful API]
|
|
244
|
+
GM[Group Manager<br/>分组管理器]
|
|
245
|
+
VM[Version Manager<br/>版本管理器]
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
subgraph 服务层
|
|
249
|
+
Interceptor[Request Interceptor<br/>请求拦截器]
|
|
250
|
+
Utils[Utils<br/>工具函数]
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
subgraph 存储层
|
|
254
|
+
Storage[(Whistle Storage<br/>本地文件存储)]
|
|
255
|
+
Files["files/{groupId}/{filename}<br/>物理文件"]
|
|
256
|
+
Props[properties<br/>元数据配置]
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
subgraph 外部
|
|
260
|
+
Browser[浏览器请求]
|
|
261
|
+
RealServer[真实服务器]
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
UI -->|用户操作| API
|
|
265
|
+
API --> GM
|
|
266
|
+
API --> VM
|
|
267
|
+
GM --> Utils
|
|
268
|
+
VM --> Utils
|
|
269
|
+
Utils --> Storage
|
|
270
|
+
Storage --> Files
|
|
271
|
+
Storage --> Props
|
|
272
|
+
|
|
273
|
+
Browser --> Interceptor
|
|
274
|
+
Interceptor --> Utils
|
|
275
|
+
Interceptor --> RealServer
|
|
276
|
+
RealServer -->|真实响应| Interceptor
|
|
277
|
+
Interceptor -->|Mock/真实响应| Browser
|
|
278
|
+
|
|
279
|
+
style UI fill:#e6f7ff
|
|
280
|
+
style API fill:#fff7e6
|
|
281
|
+
style GM fill:#f6ffed
|
|
282
|
+
style VM fill:#f6ffed
|
|
283
|
+
style Interceptor fill:#fff1f0
|
|
284
|
+
style Storage fill:#f9f0ff
|
|
285
|
+
style Files fill:#ffd6e7
|
|
286
|
+
style Props fill:#ffd6e7
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### 3.3 技术方案详细设计
|
|
290
|
+
|
|
291
|
+
#### 关键技术栈
|
|
292
|
+
**后端**:
|
|
293
|
+
- Node.js 18+ + Koa 2.7
|
|
294
|
+
- Whistle Storage API(本地文件存储)
|
|
295
|
+
- Koa-Router(路由)
|
|
296
|
+
- Koa-Bodyparser(请求体解析)
|
|
297
|
+
|
|
298
|
+
**前端**:
|
|
299
|
+
- Vue 2.7 + Composition API
|
|
300
|
+
- Element UI(UI 组件库)
|
|
301
|
+
- jsoneditor(JSON 编辑器)
|
|
302
|
+
- Vue CLI 5(构建工具)
|
|
303
|
+
|
|
304
|
+
#### 关键设计点
|
|
305
|
+
|
|
306
|
+
**1. 完全隔离架构(Phase 1 已完成)**
|
|
307
|
+
- 文件存储路径:`files/{groupId}/{filename}`
|
|
308
|
+
- 每个组独立的物理文件空间
|
|
309
|
+
- 组配置独立管理:`group.{groupId}.file.{filename}`
|
|
310
|
+
- 删除文件时无需检查其他组引用
|
|
311
|
+
|
|
312
|
+
**2. 多版本管理**
|
|
313
|
+
- 默认 `source` 版本(原始捕获的响应)
|
|
314
|
+
- 支持创建自定义版本(如 v1、v2、测试版等)
|
|
315
|
+
- 版本切换无需重启,实时生效
|
|
316
|
+
- 版本元数据:创建时间、更新时间、描述
|
|
317
|
+
|
|
318
|
+
**3. 智能捕获逻辑**
|
|
319
|
+
```
|
|
320
|
+
if (mock && hasCache) {
|
|
321
|
+
// 返回 mock 数据
|
|
322
|
+
} else if (mock && !hasCache) {
|
|
323
|
+
// 先捕获真实数据
|
|
324
|
+
} else {
|
|
325
|
+
// mock:false,透传或捕获
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**4. UI 交互优化**
|
|
330
|
+
- Response Tab 默认选中
|
|
331
|
+
- localStorage 记住用户的 tab 选择
|
|
332
|
+
- 列表高亮状态同步(刷新、切换、删除场景)
|
|
333
|
+
- 表格 key 强制重渲染,解决样式残留
|
|
334
|
+
|
|
335
|
+
#### 异常边界
|
|
336
|
+
1. **文件锁定机制**:防止误删重要 mock 数据
|
|
337
|
+
2. **批量操作确认**:批量删除前二次确认
|
|
338
|
+
3. **JSON 格式校验**:编辑器实时校验 JSON 语法
|
|
339
|
+
4. **压缩响应处理**:自动解压 gzip/deflate/br
|
|
340
|
+
5. **首次捕获检测**:使用 `hasProperty` 准确判断
|
|
341
|
+
|
|
342
|
+
#### 统计上报、效果监控评估
|
|
343
|
+
- 插件使用量:通过 npm 下载量统计
|
|
344
|
+
- 用户反馈:GitHub Issues 收集问题和建议
|
|
345
|
+
- 性能监控:日志记录关键操作耗时
|
|
346
|
+
|
|
347
|
+
#### 日志打点
|
|
348
|
+
- 请求捕获日志:`[mockbubu] ✅ 已捕获 | File: xxx`
|
|
349
|
+
- Mock 返回日志:`[mockbubu] 🔄 返回 Mock 数据 | File: xxx`
|
|
350
|
+
- 错误日志:`[mockbubu] ❌ 错误 | xxx`
|
|
351
|
+
- 调试日志:控制台输出关键状态
|
|
352
|
+
|
|
353
|
+
#### 方案阶段计划
|
|
354
|
+
|
|
355
|
+
**Phase 0(已完成)**:基础功能
|
|
356
|
+
- ✅ 请求捕获和 mock 开关
|
|
357
|
+
- ✅ Web UI 基础页面
|
|
358
|
+
- ✅ JSON 编辑器集成
|
|
359
|
+
|
|
360
|
+
**Phase 1(已完成)**:完全隔离架构
|
|
361
|
+
- ✅ 组独立文件存储
|
|
362
|
+
- ✅ 多版本管理
|
|
363
|
+
- ✅ UI 交互优化
|
|
364
|
+
- ✅ 发布 npm v2.0.0
|
|
365
|
+
|
|
366
|
+
**Phase 2(计划中)**:存储管理
|
|
367
|
+
- 🔄 存储统计信息
|
|
368
|
+
- 🔄 孤儿文件清理
|
|
369
|
+
- 🔄 未使用文件清理
|
|
370
|
+
- 🔄 存储空间优化
|
|
371
|
+
|
|
372
|
+
**Phase 3(规划中)**:高级功能
|
|
373
|
+
- 📋 导入/导出功能
|
|
374
|
+
- 📋 团队协作功能
|
|
375
|
+
- 📋 Mock 数据模板库
|
|
376
|
+
- 📋 智能推荐功能
|
|
377
|
+
|
|
378
|
+
#### 具体开发事项拆分
|
|
379
|
+
1. **后端开发**(5 天)
|
|
380
|
+
- Koa 服务器搭建(0.5 天)
|
|
381
|
+
- 请求拦截逻辑(1 天)
|
|
382
|
+
- Storage API 封装(1 天)
|
|
383
|
+
- 分组管理器(1.5 天)
|
|
384
|
+
- 版本管理器(1 天)
|
|
385
|
+
|
|
386
|
+
2. **前端开发**(5 天)
|
|
387
|
+
- Vue 项目搭建(0.5 天)
|
|
388
|
+
- 主容器和路由(0.5 天)
|
|
389
|
+
- 列表和详情组件(1.5 天)
|
|
390
|
+
- JSON 编辑器集成(1 天)
|
|
391
|
+
- 分组管理界面(1.5 天)
|
|
392
|
+
|
|
393
|
+
3. **联调测试**(2 天)
|
|
394
|
+
- 基础功能测试(1 天)
|
|
395
|
+
- 边界情况测试(1 天)
|
|
396
|
+
|
|
397
|
+
#### 工作量评估
|
|
398
|
+
- 总工作量:**12 人天**
|
|
399
|
+
- 开发人员:1 名全栈工程师
|
|
400
|
+
- 开发周期:**2.5 周**(包含设计、开发、测试)
|
|
401
|
+
|
|
402
|
+
#### 联调排期计划
|
|
403
|
+
无需与后端联调,插件独立运行。测试计划:
|
|
404
|
+
- 单元测试:核心工具函数测试
|
|
405
|
+
- 集成测试:完整流程测试
|
|
406
|
+
- 验收测试:实际项目中使用验证
|
|
407
|
+
|
|
408
|
+
#### 资源依赖
|
|
409
|
+
- ✅ Whistle 2.9.84+(已安装)
|
|
410
|
+
- ✅ Node.js 18+(已安装)
|
|
411
|
+
- ✅ Element UI 2.x(已集成)
|
|
412
|
+
- ✅ jsoneditor 库(已集成)
|
|
413
|
+
|
|
414
|
+
#### 测试验证标准
|
|
415
|
+
1. **功能完整性**:所有需求点均已实现
|
|
416
|
+
2. **稳定性**:无崩溃、无数据丢失
|
|
417
|
+
3. **性能**:响应时间 < 100ms
|
|
418
|
+
4. **兼容性**:支持主流浏览器(Chrome、Edge、Firefox)
|
|
419
|
+
5. **用户体验**:操作流畅,UI 友好
|
|
420
|
+
|
|
421
|
+
#### 发布计划
|
|
422
|
+
- ✅ **v1.x.x**:基础功能发布
|
|
423
|
+
- ✅ **v2.0.0**:完全隔离架构 + UI 优化(2025-10-22 已发布)
|
|
424
|
+
- 🔄 **v2.1.0**:存储管理功能(计划中)
|
|
425
|
+
- 📋 **v3.0.0**:团队协作功能(规划中)
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## 附录
|
|
430
|
+
|
|
431
|
+
### 项目信息
|
|
432
|
+
- **项目名称**:whistle.mockbubu
|
|
433
|
+
- **npm 包**:https://www.npmjs.com/package/whistle.mockbubu
|
|
434
|
+
- **版本**:2.0.0
|
|
435
|
+
- **License**:MIT
|
|
436
|
+
- **作者**:Zac Chen <zacchen@shein.com>
|
|
437
|
+
|
|
438
|
+
### 安装使用
|
|
439
|
+
```bash
|
|
440
|
+
# 全局安装
|
|
441
|
+
npm install whistle.mockbubu -g
|
|
442
|
+
|
|
443
|
+
# 或使用 whistle 命令
|
|
444
|
+
w2 install whistle.mockbubu
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### 核心指标(截至 v2.0.0)
|
|
448
|
+
- 代码行数:~3000 行(前端 + 后端)
|
|
449
|
+
- 文件数量:32 个
|
|
450
|
+
- 打包大小:3.0 MB
|
|
451
|
+
- 解压大小:9.8 MB
|
|
452
|
+
- 测试覆盖率:33 个核心测试用例
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# mockbubu 捕获功能测试步骤
|
|
2
|
+
|
|
3
|
+
## 当前状态
|
|
4
|
+
- ✅ Whistle 运行在端口 8899
|
|
5
|
+
- ✅ mockbubu 插件已加载
|
|
6
|
+
- ✅ 规则配置: `*.shein.com mockbubu://`
|
|
7
|
+
- ⚠️ **需要浏览器配置代理才能测试**
|
|
8
|
+
|
|
9
|
+
## 测试步骤
|
|
10
|
+
|
|
11
|
+
### 方法 1: Chrome 浏览器测试 (推荐)
|
|
12
|
+
|
|
13
|
+
1. **安装 SwitchyOmega 插件** (如果还没安装)
|
|
14
|
+
- Chrome 应用商店搜索 "Proxy SwitchyOmega"
|
|
15
|
+
- 或者访问: https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif
|
|
16
|
+
|
|
17
|
+
2. **配置代理**
|
|
18
|
+
- 打开 SwitchyOmega 设置
|
|
19
|
+
- 新建情景模式,选择 "代理服务器"
|
|
20
|
+
- 配置:
|
|
21
|
+
- 代理协议: HTTP
|
|
22
|
+
- 代理服务器: 127.0.0.1
|
|
23
|
+
- 代理端口: 8899
|
|
24
|
+
- 保存并启用该情景模式
|
|
25
|
+
|
|
26
|
+
3. **访问 SHEIN 网站触发 JSON API**
|
|
27
|
+
- 打开: https://m.shein.com/us/
|
|
28
|
+
- 或者: https://www.shein.com/
|
|
29
|
+
- 网站会自动发送很多 JSON API 请求
|
|
30
|
+
|
|
31
|
+
4. **查看捕获结果**
|
|
32
|
+
- 打开: http://127.0.0.1:8899/whistle.mockbubu/
|
|
33
|
+
- 应该能看到捕获的请求列表
|
|
34
|
+
|
|
35
|
+
### 方法 2: 系统代理测试
|
|
36
|
+
|
|
37
|
+
1. **配置系统代理** (macOS)
|
|
38
|
+
```bash
|
|
39
|
+
# 打开系统偏好设置 > 网络 > 高级 > 代理
|
|
40
|
+
# 勾选 "网页代理(HTTP)"
|
|
41
|
+
# 服务器: 127.0.0.1
|
|
42
|
+
# 端口: 8899
|
|
43
|
+
# 勾选 "安全网页代理(HTTPS)"
|
|
44
|
+
# 服务器: 127.0.0.1
|
|
45
|
+
# 端口: 8899
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
2. **访问网站测试**
|
|
49
|
+
- 用任何浏览器打开: https://m.shein.com/
|
|
50
|
+
- 网站会发送 JSON API 请求
|
|
51
|
+
|
|
52
|
+
3. **查看捕获结果**
|
|
53
|
+
- 打开: http://127.0.0.1:8899/whistle.mockbubu/
|
|
54
|
+
|
|
55
|
+
### 方法 3: curl 测试 (命令行)
|
|
56
|
+
|
|
57
|
+
由于 `m.shein.com/us/api/xxx` 这些测试端点不存在,返回的都是 HTML 页面,所以 curl 测试会失败。
|
|
58
|
+
|
|
59
|
+
**需要真实的 API 端点才能测试!**
|
|
60
|
+
|
|
61
|
+
## 验证方法
|
|
62
|
+
|
|
63
|
+
### 1. 检查文件是否被捕获
|
|
64
|
+
```bash
|
|
65
|
+
# 查看 default 组的文件数量
|
|
66
|
+
find ~/.WhistleAppData/.whistle/.plugins/whistle.mockbubu/groups/default/files -type d -mindepth 1 -maxdepth 1 | wc -l
|
|
67
|
+
|
|
68
|
+
# 查看 index.json
|
|
69
|
+
cat ~/.WhistleAppData/.whistle/.plugins/whistle.mockbubu/groups/default/index.json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2. 查看日志
|
|
73
|
+
```bash
|
|
74
|
+
# 查看 Whistle 主日志
|
|
75
|
+
tail -50 ~/.WhistleAppData/whistle.log
|
|
76
|
+
|
|
77
|
+
# 查找 mockbubu 相关日志
|
|
78
|
+
tail -100 ~/.WhistleAppData/whistle.log | grep mockbubu
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 3. 查看 UI
|
|
82
|
+
打开浏览器访问:
|
|
83
|
+
- Whistle 主界面: http://127.0.0.1:8899/
|
|
84
|
+
- mockbubu 插件界面: http://127.0.0.1:8899/whistle.mockbubu/
|
|
85
|
+
|
|
86
|
+
## 预期结果
|
|
87
|
+
|
|
88
|
+
当配置正确并访问 shein.com 后,你应该看到:
|
|
89
|
+
|
|
90
|
+
1. **文件被创建**
|
|
91
|
+
```bash
|
|
92
|
+
$ ls ~/.WhistleAppData/.whistle/.plugins/whistle.mockbubu/groups/default/files/
|
|
93
|
+
0a3f2e8b/ 1b4c5d9f/ 2e6a7f0c/ # 每个目录对应一个捕获的请求
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
2. **index.json 有数据**
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"version": "3.0.0",
|
|
100
|
+
"files": [
|
|
101
|
+
{
|
|
102
|
+
"id": "0a3f2e8b",
|
|
103
|
+
"url": "https://m.shein.com/us/api/user/info",
|
|
104
|
+
"method": "GET",
|
|
105
|
+
"status": 200
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
3. **UI 显示列表**
|
|
112
|
+
- 打开 http://127.0.0.1:8899/whistle.mockbubu/
|
|
113
|
+
- 能看到捕获的请求列表
|
|
114
|
+
- 点击可以查看请求详情
|
|
115
|
+
|
|
116
|
+
## 常见问题
|
|
117
|
+
|
|
118
|
+
### Q: 浏览器访问了网站,但没有捕获到请求?
|
|
119
|
+
|
|
120
|
+
**A:** 检查以下几点:
|
|
121
|
+
1. 浏览器是否配置了代理到 127.0.0.1:8899?
|
|
122
|
+
2. 代理是否启用?
|
|
123
|
+
3. 访问的是否是 HTTPS 网站?(需要安装 Whistle 证书)
|
|
124
|
+
4. Whistle 规则是否启用?
|
|
125
|
+
|
|
126
|
+
### Q: 如何安装 Whistle 证书?
|
|
127
|
+
|
|
128
|
+
**A:**
|
|
129
|
+
1. 配置代理后,访问: http://local.whistlejs.com/
|
|
130
|
+
2. 点击 HTTPS
|
|
131
|
+
3. 下载根证书并安装到系统
|
|
132
|
+
|
|
133
|
+
### Q: curl 测试为什么不工作?
|
|
134
|
+
|
|
135
|
+
**A:** 因为测试的 API 端点不存在,返回的是 HTML 而不是 JSON。mockbubu 只捕获 JSON 响应(`Content-Type: application/json` 或 `Accept: application/json`请求)。
|
|
136
|
+
|
|
137
|
+
需要访问真实的网站来触发真实的 API 请求才能测试。
|
|
138
|
+
|
|
139
|
+
## 下一步
|
|
140
|
+
|
|
141
|
+
测试通过后,可以继续:
|
|
142
|
+
1. 测试 Mock 功能(开启 mock 开关,验证是否返回缓存数据)
|
|
143
|
+
2. 测试版本管理功能
|
|
144
|
+
3. 测试分组功能
|
|
145
|
+
4. 进行完整的端到端测试
|