whistle.mockbubu 2.1.0 → 2.1.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whistle.mockbubu",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "mock response data",
5
5
  "scripts": {
6
6
  "lint": "eslint . --ext .js",
package/public/js/app.js CHANGED
@@ -753,37 +753,55 @@ const __default__ = {
753
753
 
754
754
  // 单个删除 - 直接执行(智能删除,后端自动判断)
755
755
  const handleDelete = (row, index) => {
756
- (0,_service__WEBPACK_IMPORTED_MODULE_22__.deleteApi)(row.name).then(data => {
757
- if (data.code !== 200) {
758
- element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().error('删除失败: ' + (data.msg || '未知错误'));
759
- } else {
760
- element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().success('删除成功');
756
+ // 判断是已保存文件还是缓存数据
757
+ if (row.id) {
758
+ // 已保存文件:需要调用后端接口删除物理文件
759
+ (0,_service__WEBPACK_IMPORTED_MODULE_22__.deleteApi)(row.name).then(data => {
760
+ if (data.code !== 200) {
761
+ element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().error('删除失败: ' + (data.msg || '未知错误'));
762
+ } else {
763
+ element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().success('删除成功');
761
764
 
762
- // 判断是已保存文件还是缓存数据
763
- if (row.id) {
764
- // 已保存文件:从 savedList 删除
765
+ // 从 savedList 删除(用 URL 匹配)
765
766
  const savedIndex = savedList.value.findIndex(item => item.url === row.url);
766
767
  if (savedIndex !== -1) {
767
768
  savedList.value.splice(savedIndex, 1);
768
769
  }
769
- } else {
770
- // 缓存数据:从 cachedList cacheManager 删除
771
- const cachedIndex = cachedList.value.findIndex(item => item.url === row.url);
772
- if (cachedIndex !== -1) {
773
- cachedList.value.splice(cachedIndex, 1);
770
+ // requestList 删除(用 URL 匹配)
771
+ const requestIndex = requestList.value.findIndex(item => item.url === row.url);
772
+ if (requestIndex !== -1) {
773
+ requestList.value.splice(requestIndex, 1);
774
774
  }
775
- _utils_cache_manager__WEBPACK_IMPORTED_MODULE_25__["default"].remove(row.url);
776
- }
777
775
 
778
- // 从 requestList 删除(使用传入的 index,更高效)
779
- requestList.value.splice(index, 1);
776
+ // 更新选中行
777
+ changeCurrentRow();
778
+ }
779
+ }).catch(err => {
780
+ element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().error('删除失败: ' + (err.message || '未知错误'));
781
+ });
782
+ } else {
783
+ // 未保存的缓存数据:只删除前端缓存,不调用后端接口
784
+ try {
785
+ // 从 cachedList 删除(用 URL 匹配)
786
+ const cachedIndex = cachedList.value.findIndex(item => item.url === row.url);
787
+ if (cachedIndex !== -1) {
788
+ cachedList.value.splice(cachedIndex, 1);
789
+ }
790
+ // 从 cacheManager 删除
791
+ _utils_cache_manager__WEBPACK_IMPORTED_MODULE_25__["default"].remove(row.url);
792
+ // 从 requestList 删除(用 URL 匹配)
793
+ const requestIndex = requestList.value.findIndex(item => item.url === row.url);
794
+ if (requestIndex !== -1) {
795
+ requestList.value.splice(requestIndex, 1);
796
+ }
797
+ element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().success('删除成功');
780
798
 
781
799
  // 更新选中行
782
800
  changeCurrentRow();
801
+ } catch (err) {
802
+ element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().error('删除失败: ' + (err.message || '未知错误'));
783
803
  }
784
- }).catch(err => {
785
- element_ui_lib_message__WEBPACK_IMPORTED_MODULE_4___default().error('删除失败: ' + (err.message || '未知错误'));
786
- });
804
+ }
787
805
  };
788
806
 
789
807
  /**
@@ -1595,8 +1613,6 @@ const __default__ = {
1595
1613
 
1596
1614
  // 解析 payload 为 JSON 对象供 jsoneditor 使用
1597
1615
  const parsedPayloadData = (0,vue__WEBPACK_IMPORTED_MODULE_6__.computed)(() => {
1598
- console.log('%c [ parsedPayloadData 计算属性触发 ]-126', 'font-size:13px; background:yellow; color:black;', 'computed 被调用');
1599
- console.log('%c [ props.currentRow ]-131', 'font-size:13px; background:pink; color:#bf2c9f;', props.currentRow);
1600
1616
  if (!props.currentRow?.payload) {
1601
1617
  return null;
1602
1618
  }
@@ -1947,6 +1963,7 @@ const __default__ = {
1947
1963
  const currentFile = (0,vue__WEBPACK_IMPORTED_MODULE_9__.ref)({
1948
1964
  content: {}
1949
1965
  });
1966
+ const hasJsonError = (0,vue__WEBPACK_IMPORTED_MODULE_9__.ref)(false); // JSON 格式错误标志
1950
1967
  const versionModal = (0,vue__WEBPACK_IMPORTED_MODULE_9__.reactive)({
1951
1968
  visible: false,
1952
1969
  status: 'create',
@@ -2484,6 +2501,12 @@ const __default__ = {
2484
2501
  element_ui_lib_message__WEBPACK_IMPORTED_MODULE_2___default().warning('原始响应数据为只读,不可修改');
2485
2502
  return;
2486
2503
  }
2504
+
2505
+ // 如果 JSON 格式错误,禁止保存
2506
+ if (hasJsonError.value) {
2507
+ element_ui_lib_message__WEBPACK_IMPORTED_MODULE_2___default().error('JSON 格式错误,请修正后再保存');
2508
+ return;
2509
+ }
2487
2510
  if (currentFile.value.type === 'history') {
2488
2511
  updateHistory();
2489
2512
  } else {
@@ -2717,6 +2740,7 @@ const __default__ = {
2717
2740
  versionNameInput,
2718
2741
  responseList,
2719
2742
  currentFile,
2743
+ hasJsonError,
2720
2744
  versionModal,
2721
2745
  fullScreenModal,
2722
2746
  name,
@@ -4474,6 +4498,7 @@ var render = function render() {
4474
4498
  }, [_c("i", {
4475
4499
  staticClass: "el-icon-lock"
4476
4500
  }), _c("span", [_vm._v("只读模式")])]) : _vm._e()], 1), _c(_setup.JsonEditor, {
4501
+ key: `editor-${_setup.currentFile.filename}-${_setup.isSourceReadonly}`,
4477
4502
  ref: "editRef",
4478
4503
  attrs: {
4479
4504
  "show-btns": false,
@@ -4486,6 +4511,12 @@ var render = function render() {
4486
4511
  on: {
4487
4512
  input: function ($event) {
4488
4513
  return _setup.handleFileChange();
4514
+ },
4515
+ "has-error": function ($event) {
4516
+ _setup.hasJsonError = true;
4517
+ },
4518
+ "json-change": function ($event) {
4519
+ _setup.hasJsonError = false;
4489
4520
  }
4490
4521
  },
4491
4522
  nativeOn: {
@@ -4508,12 +4539,15 @@ var render = function render() {
4508
4539
  }
4509
4540
  }), !_setup.isSourceReadonly && _setup.currentFile.effect && (_setup.currentFile.type === "history" || _vm.api.mock) ? _c("div", {
4510
4541
  staticClass: "response-panel__save"
4511
- }, [_c("span", {
4542
+ }, [_setup.hasJsonError ? _c("span", {
4543
+ staticClass: "response-panel__error-text"
4544
+ }, [_vm._v("JSON 格式错误,无法保存")]) : _c("span", {
4512
4545
  staticClass: "response-panel__effect-icon"
4513
4546
  }), _c("el-button", {
4514
4547
  attrs: {
4515
4548
  size: "small",
4516
- type: "primary"
4549
+ type: "primary",
4550
+ disabled: _setup.hasJsonError
4517
4551
  },
4518
4552
  on: {
4519
4553
  click: _setup.handleUpdate
@@ -6062,7 +6096,7 @@ __webpack_require__.r(__webpack_exports__);
6062
6096
 
6063
6097
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
6064
6098
  // Module
6065
- ___CSS_LOADER_EXPORT___.push([module.id, ".mock-container[data-v-d97322d2] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n.mock-container__content[data-v-d97322d2] {\n display: flex;\n flex: 1;\n border: 1px solid #ccc;\n border-left: none;\n overflow: hidden;\n}\n", ""]);
6099
+ ___CSS_LOADER_EXPORT___.push([module.id, ".mock-container[data-v-d97322d2] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n.mock-container__content[data-v-d97322d2] {\n padding-bottom: 16px;\n background-image: linear-gradient(0deg, #3f9eff 0, #3f9eff 16px, transparent 100%);\n display: flex;\n flex: 1;\n border: 1px solid #ccc;\n border-left: none;\n overflow: hidden;\n}\n", ""]);
6066
6100
  // Exports
6067
6101
  /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___);
6068
6102
 
@@ -6158,7 +6192,7 @@ __webpack_require__.r(__webpack_exports__);
6158
6192
 
6159
6193
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
6160
6194
  // Module
6161
- ___CSS_LOADER_EXPORT___.push([module.id, ".response-panel[data-v-c23cd6a6] {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.response-panel__header[data-v-c23cd6a6] {\n display: flex;\n flex-wrap: wrap;\n}\n.response-panel__tab[data-v-c23cd6a6] {\n position: relative;\n cursor: pointer;\n height: 24px;\n padding: 0px 10px;\n font-size: 12px;\n line-height: 24px;\n color: #333333;\n font-weight: 500;\n border-right: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n.response-panel__tab--selected[data-v-c23cd6a6] {\n background-color: #e0e3e6;\n}\n.response-panel__source-tab[data-v-c23cd6a6] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: #e6a23c;\n font-weight: 600;\n}\n.response-panel__source-tab i[data-v-c23cd6a6] {\n font-size: 14px;\n}\n.response-panel__tab-text[data-v-c23cd6a6] {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: middle;\n}\n.response-panel__edit-btn[data-v-c23cd6a6] {\n margin-left: 8px;\n color: #909399;\n}\n.response-panel__edit-btn[data-v-c23cd6a6]:hover {\n color: #409eff;\n}\n.response-panel__delete-btn[data-v-c23cd6a6] {\n margin-left: 8px;\n color: #909399;\n}\n.response-panel__delete-btn[data-v-c23cd6a6]:hover {\n color: #f46c6b;\n}\n.response-panel__add-btn[data-v-c23cd6a6] {\n cursor: pointer;\n line-height: 24px;\n padding: 0px 10px;\n color: #333333;\n font-weight: 500;\n}\n.response-panel__content[data-v-c23cd6a6] {\n position: relative;\n flex: 1;\n overflow: hidden;\n}\n.response-panel__toolbar[data-v-c23cd6a6] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background-color: #f5f7fa;\n border-bottom: 1px solid #e4e7ed;\n}\n.response-panel__toolbar .el-button[data-v-c23cd6a6] {\n margin: 0;\n}\n.response-panel__readonly-badge[data-v-c23cd6a6] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n padding: 4px 12px;\n background-color: #f0f2f5;\n border-radius: 4px;\n font-size: 12px;\n color: #909399;\n font-weight: 500;\n}\n.response-panel__readonly-badge i[data-v-c23cd6a6] {\n font-size: 12px;\n}\n.response-panel__alert[data-v-c23cd6a6] {\n position: absolute;\n top: 8px;\n right: 10px;\n font-size: 12px;\n font-weight: 600;\n color: #e6a23c;\n}\n.response-panel__save[data-v-c23cd6a6] {\n position: absolute;\n top: 100px;\n right: 20px;\n}\n.response-panel__effect-icon[data-v-c23cd6a6] {\n position: absolute;\n top: -5px;\n right: -5px;\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 6px;\n background-color: #f46c6b;\n}\n.response-panel__dialog[data-v-c23cd6a6] {\n display: flex;\n align-items: center;\n}\n.response-panel__dialog-label[data-v-c23cd6a6] {\n white-space: nowrap;\n}\n", ""]);
6195
+ ___CSS_LOADER_EXPORT___.push([module.id, ".response-panel[data-v-c23cd6a6] {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.response-panel__header[data-v-c23cd6a6] {\n display: flex;\n flex-wrap: wrap;\n}\n.response-panel__tab[data-v-c23cd6a6] {\n position: relative;\n cursor: pointer;\n height: 24px;\n padding: 0px 10px;\n font-size: 12px;\n line-height: 24px;\n color: #333333;\n font-weight: 500;\n border-right: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n}\n.response-panel__tab--selected[data-v-c23cd6a6] {\n background-color: #e0e3e6;\n}\n.response-panel__source-tab[data-v-c23cd6a6] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: #e6a23c;\n font-weight: 600;\n}\n.response-panel__source-tab i[data-v-c23cd6a6] {\n font-size: 14px;\n}\n.response-panel__tab-text[data-v-c23cd6a6] {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: middle;\n}\n.response-panel__edit-btn[data-v-c23cd6a6] {\n margin-left: 8px;\n color: #909399;\n}\n.response-panel__edit-btn[data-v-c23cd6a6]:hover {\n color: #409eff;\n}\n.response-panel__delete-btn[data-v-c23cd6a6] {\n margin-left: 8px;\n color: #909399;\n}\n.response-panel__delete-btn[data-v-c23cd6a6]:hover {\n color: #f46c6b;\n}\n.response-panel__add-btn[data-v-c23cd6a6] {\n cursor: pointer;\n line-height: 24px;\n padding: 0px 10px;\n color: #333333;\n font-weight: 500;\n}\n.response-panel__content[data-v-c23cd6a6] {\n position: relative;\n flex: 1;\n overflow: hidden;\n}\n.response-panel__toolbar[data-v-c23cd6a6] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background-color: #f5f7fa;\n border-bottom: 1px solid #e4e7ed;\n}\n.response-panel__toolbar .el-button[data-v-c23cd6a6] {\n margin: 0;\n}\n.response-panel__readonly-badge[data-v-c23cd6a6] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n padding: 4px 12px;\n background-color: #f0f2f5;\n border-radius: 4px;\n font-size: 12px;\n color: #909399;\n font-weight: 500;\n}\n.response-panel__readonly-badge i[data-v-c23cd6a6] {\n font-size: 12px;\n}\n.response-panel__alert[data-v-c23cd6a6] {\n position: absolute;\n top: 8px;\n right: 10px;\n font-size: 12px;\n font-weight: 600;\n color: #e6a23c;\n}\n.response-panel__save[data-v-c23cd6a6] {\n position: absolute;\n top: 100px;\n right: 20px;\n}\n.response-panel__effect-icon[data-v-c23cd6a6] {\n position: absolute;\n top: -5px;\n right: -5px;\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 6px;\n background-color: #f46c6b;\n}\n.response-panel__error-text[data-v-c23cd6a6] {\n position: absolute;\n top: -30px;\n right: 0;\n color: #f56c6c;\n font-size: 12px;\n white-space: nowrap;\n}\n.response-panel__dialog[data-v-c23cd6a6] {\n display: flex;\n align-items: center;\n}\n.response-panel__dialog-label[data-v-c23cd6a6] {\n white-space: nowrap;\n}\n", ""]);
6162
6196
  // Exports
6163
6197
  /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___);
6164
6198