whistle.mock-plugins 1.2.2-beta.2 → 1.2.2-beta.22
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/VERSION.md +50 -1
- package/app/cgi-bin/settings.js +37 -0
- package/app/public/js/index.js +1 -1
- package/lib/models.js +9 -0
- package/lib/routes/interfaces.js +6 -3
- package/lib/routes/settings.js +51 -0
- package/lib/ruleManager.js +105 -41
- package/lib/server.js +4 -0
- package/package.json +1 -1
- package/ui/src/components/interface-management/DataManagementDrawer.js +115 -0
- package/ui/src/components/interface-management/ResponseContentEditor.js +146 -36
- package/ui/src/components/interface-management/index.js +1 -0
- package/ui/src/pages/InterfaceManagementV2.js +448 -145
- package/ui/src/pages/MockDataV2.js +1 -1
- package/ui/src/pages/Settings.js +143 -6
- package/ui/src/styles/interface-management.css +3 -12
- package/ui/src/styles/settings.css +29 -0
package/VERSION.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# 🔄 版本更新记录
|
|
2
|
-
## v1.2.2-beta.
|
|
2
|
+
## v1.2.2-beta.22
|
|
3
|
+
### ✨ Feature
|
|
4
|
+
- **入参匹配开关**:系统设置新增「接口入参匹配」和「响应入参匹配」两个显示开关,关闭后对应 UI 区域隐藏,同时后端运行时跳过对应匹配逻辑,直接使用默认响应
|
|
5
|
+
- **开关持久化**:开关状态通过 `app/cgi-bin/settings.js` 持久化到 `settings.json`,前端初始化时从后端同步,保证多端一致
|
|
6
|
+
- **记住功能模块**:接口管理页打开时自动恢复上次选择的功能模块;从功能模块页点击「查看接口」跳转时同步写入 `localStorage`,两处入口均保持记忆
|
|
7
|
+
- **参数匹配列联动**:接口列表「参数匹配」列中,接口级(橙色)和响应级(蓝色)标签分别受对应开关控制,开关关闭时对应标签不显示
|
|
8
|
+
|
|
9
|
+
### 🔧 Technical
|
|
10
|
+
- **新增 `app/cgi-bin/settings.js`**:CGI 处理器,支持 `GET`(读取)和 `PUT`(保存)设置,数据存储于 `settings.json`
|
|
11
|
+
- **`ruleManager.js` 升级**:引入 `getSettings()` 读取 `settings.json`,接口级匹配(同 URL 多接口区分 + 指定响应)和响应级匹配均受开关控制
|
|
12
|
+
- **`server.js`**:注册 `lib/routes/settings.js` 路由(`/api/settings`)
|
|
13
|
+
|
|
14
|
+
## v1.2.2-beta.18
|
|
15
|
+
### ✨ Feature
|
|
16
|
+
- **响应级入参匹配**:每个响应内容支持独立配置入参匹配规则,同一接口内不同入参可自动匹配返回不同响应,无需创建多个接口定义
|
|
17
|
+
- **动态响应选择**:运行时按响应列表顺序依次检查入参规则,第一个匹配成功的响应被返回;无规则的响应作为默认兜底
|
|
18
|
+
- **列表展示优化**:接口列表「当前响应」列在选项中显示 `[默认]` / `[N条规则]` 标签;「参数匹配」列区分展示接口级(橙色)和响应级(蓝色)规则数,Tooltip 展示详情
|
|
19
|
+
- **入参规则 UI 优化**:响应编辑器中入参匹配规则区域去掉折叠,直接展示,操作更直接
|
|
20
|
+
|
|
21
|
+
### 🐛 Fix
|
|
22
|
+
- **问题修复**:响应级入参匹配规则保存后重新编辑不显示——后端 `processInterfaceData` 和前端 `fetchInterfaces` 处理响应数据时均丢弃了 `paramMatchers` 字段,已补全
|
|
23
|
+
- **问题修复**:数据管理抽屉模式不生效——`displayMode` 状态、`useEffect` 监听及 `DataManagementDrawer` 导入丢失,已恢复
|
|
24
|
+
- **问题修复**:接口表单抽屉模式不生效——`interfaceFormDisplayMode` 状态及相关渲染逻辑丢失,已恢复
|
|
25
|
+
|
|
26
|
+
### 🔧 Technical
|
|
27
|
+
- **数据结构扩展**:`Response` 对象新增 `paramMatchers` 字段,后端 `processInterfaceData` 和前端数据处理均保留该字段
|
|
28
|
+
- **匹配逻辑升级**:`ruleManager.handleDataTemplate` 新增响应级入参匹配逻辑,命中后响应头 `X-Whistle-Mock-Response` 准确反映实际返回的响应
|
|
29
|
+
|
|
30
|
+
## v1.2.2-beta.7
|
|
31
|
+
### ✨ Feature
|
|
32
|
+
- **交互增强**:接口表单(添加/编辑接口)支持弹窗/抽屉模式切换
|
|
33
|
+
- **设置新增**:系统设置页面新增"接口表单交互"开关,支持弹窗/抽屉模式切换
|
|
34
|
+
- **实时生效**:切换交互模式后立即生效,无需刷新页面
|
|
35
|
+
- **用户体验**:弹窗模式更适合快速操作,抽屉模式提供更大的操作空间
|
|
36
|
+
|
|
37
|
+
### 🔧 Technical
|
|
38
|
+
- **条件渲染**:根据 interfaceFormDisplayMode 配置动态选择 Modal 或 Drawer
|
|
39
|
+
- **配置管理**:使用 localStorage 存储交互模式配置
|
|
40
|
+
- **事件监听**:通过 storage 事件实现跨页面配置同步
|
|
41
|
+
- **表单复用**:Modal 和 Drawer 共享相同的表单逻辑和验证规则
|
|
42
|
+
|
|
43
|
+
## v1.2.2-beta.4
|
|
44
|
+
### ✨ Feature
|
|
45
|
+
- **交互增强**:数据管理支持抽屉模式,从右侧滑出,宽度 1040px,上下撑满
|
|
46
|
+
- **设置新增**:系统设置页面新增"数据管理交互"开关,支持弹窗/抽屉模式切换
|
|
47
|
+
- **实时生效**:切换交互模式后立即生效,无需刷新页面
|
|
48
|
+
- **全列拖动**:接口列表所有列均支持拖动调整宽度
|
|
49
|
+
- **拖动优化**:拖动时实时更新列宽,提供流畅的视觉反馈
|
|
50
|
+
|
|
51
|
+
## v1.2.2-beta.3
|
|
3
52
|
### ✨ Feature
|
|
4
53
|
- **交互优化**:接口列表"当前响应"列支持拖动调整宽度
|
|
5
54
|
- **自适应优化**:列内下拉框根据列宽自动调整显示
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const DEFAULT_SETTINGS = {
|
|
5
|
+
interfaceParamMatcherEnabled: true,
|
|
6
|
+
responseParamMatcherEnabled: true,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
module.exports = function(req, res) {
|
|
10
|
+
const dataDir = this.dataDir;
|
|
11
|
+
const settingsFile = path.join(dataDir, 'settings.json');
|
|
12
|
+
|
|
13
|
+
const getSettings = () => {
|
|
14
|
+
try {
|
|
15
|
+
if (!fs.existsSync(settingsFile)) return { ...DEFAULT_SETTINGS };
|
|
16
|
+
return { ...DEFAULT_SETTINGS, ...fs.readJsonSync(settingsFile) };
|
|
17
|
+
} catch (e) {
|
|
18
|
+
return { ...DEFAULT_SETTINGS };
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
if (req.method === 'GET') {
|
|
24
|
+
res.json(getSettings());
|
|
25
|
+
} else if (req.method === 'PUT' || req.method === 'POST') {
|
|
26
|
+
const current = getSettings();
|
|
27
|
+
const updated = { ...current, ...req.body };
|
|
28
|
+
fs.writeJsonSync(settingsFile, updated, { spaces: 2 });
|
|
29
|
+
res.json(updated);
|
|
30
|
+
} else {
|
|
31
|
+
res.status(405).json({ error: 'Method Not Allowed' });
|
|
32
|
+
}
|
|
33
|
+
} catch (err) {
|
|
34
|
+
console.error('settings cgi error:', err);
|
|
35
|
+
res.status(500).json({ error: '操作失败' });
|
|
36
|
+
}
|
|
37
|
+
};
|