whistle.mock-plugins 1.1.3-dev.5 → 1.1.3-dev.7

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.
@@ -125,8 +125,6 @@
125
125
 
126
126
  /**![holder](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMwMCAyNzYuNWE1NiA1NiAwIDEwNTYtOTcgNTYgNTYgMCAwMC01NiA5N3ptMCAyODRhNTYgNTYgMCAxMDU2LTk3IDU2IDU2IDAgMDAtNTYgOTd6TTY0MCAyMjhhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMDAtMTEyIDB6bTAgMjg0YTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDAwLTExMiAwek0zMDAgODQ0LjVhNTYgNTYgMCAxMDU2LTk3IDU2IDU2IDAgMDAtNTYgOTd6TTY0MCA3OTZhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMDAtMTEyIDB6IiAvPjwvc3ZnPg==) */
127
127
 
128
- /**![import](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODgwIDkxMkgxNDRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyVjE0NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmgzNjBjNC40IDAgOCAzLjYgOCA4djU2YzAgNC40LTMuNiA4LTggOEgxODR2NjU2aDY1NlY1MjBjMC00LjQgMy42LTggOC04aDU2YzQuNCAwIDggMy42IDggOHYzNjBjMCAxNy43LTE0LjMgMzItMzIgMzJ6TTY1My4zIDQyNC42bDUyLjIgNTIuMmE4LjAxIDguMDEgMCAwMS00LjcgMTMuNmwtMTc5LjQgMjFjLTUuMS42LTkuNS0zLjctOC45LTguOWwyMS0xNzkuNGMuOC02LjYgOC45LTkuNCAxMy42LTQuN2w1Mi40IDUyLjQgMjU2LjItMjU2LjJjMy4xLTMuMSA4LjItMy4xIDExLjMgMGw0Mi40IDQyLjRjMy4xIDMuMSAzLjEgOC4yIDAgMTEuM0w2NTMuMyA0MjQuNnoiIC8+PC9zdmc+) */
129
-
130
128
  /**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnoiIC8+PHBhdGggZD0iTTQ2NCAzMzZhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem03MiAxMTJoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOGg0OGM0LjQgMCA4LTMuNiA4LThWNDU2YzAtNC40LTMuNi04LTgtOHoiIC8+PC9zdmc+) */
131
129
 
132
130
  /**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whistle.mock-plugins",
3
- "version": "1.1.3-dev.5",
3
+ "version": "1.1.3-dev.7",
4
4
  "description": "Whistle 插件,用于快速创建 API 模拟数据",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -10,12 +10,12 @@ import AppLayout from '../components/AppLayout';
10
10
  import {
11
11
  Table, Button, Modal, Form, Input, Select, message, Switch,
12
12
  Popconfirm, Alert, Space, Card, Badge, Tooltip, Row, Col,
13
- Popover, Checkbox, Tag, Input as AntInput, Radio, Drawer
13
+ Popover, Checkbox, Tag, Input as AntInput, Radio, Drawer, Dropdown, Menu
14
14
  } from 'antd';
15
15
  import {
16
16
  PlusOutlined, EditOutlined, DeleteOutlined,
17
17
  FileTextOutlined, PlusCircleOutlined, SettingOutlined,
18
- SearchOutlined, FilterOutlined, ReloadOutlined
18
+ SearchOutlined, FilterOutlined, ReloadOutlined, DownOutlined
19
19
  } from '@ant-design/icons';
20
20
  import '../styles/interface-management.css';
21
21
  import axios from 'axios';
@@ -976,15 +976,15 @@ const InterfaceManagement = () => {
976
976
  重构后版本 V2
977
977
  </div>
978
978
 
979
- <Card className="interface-header-card">
980
- <div className="interface-management-header">
981
- <div className="feature-selector-container">
979
+ <Card className="interface-control-panel">
980
+ <div className="control-panel-header">
981
+ <div className="control-left">
982
982
  <div className="feature-selector">
983
983
  <span>功能模块:</span>
984
984
  <Select
985
985
  value={selectedFeatureId}
986
986
  onChange={handleSelectFeature}
987
- style={{ width: 240 }}
987
+ style={{ width: 200 }}
988
988
  placeholder="选择功能模块"
989
989
  loading={featuresLoading}
990
990
  dropdownMatchSelectWidth={false}
@@ -1005,13 +1005,36 @@ const InterfaceManagement = () => {
1005
1005
  onSearch={handleSearch}
1006
1006
  value={searchValue}
1007
1007
  onChange={(e) => setSearchValue(e.target.value)}
1008
- style={{ width: 250, marginLeft: 16 }}
1008
+ style={{ width: 220, marginLeft: 12 }}
1009
1009
  enterButton={<SearchOutlined />}
1010
1010
  allowClear
1011
1011
  />
1012
+
1013
+ <Dropdown
1014
+ overlay={
1015
+ <Menu
1016
+ selectedKeys={selectedGroup ? [selectedGroup] : []}
1017
+ onClick={({ key }) => setSelectedGroup(key === selectedGroup ? null : key)}
1018
+ >
1019
+ <Menu.Item key={null}>全部分组</Menu.Item>
1020
+ {groups.map(group => (
1021
+ <Menu.Item key={group}>
1022
+ {group} ({interfaces.filter(item => item.group === group).length})
1023
+ </Menu.Item>
1024
+ ))}
1025
+ </Menu>
1026
+ }
1027
+ trigger={['click']}
1028
+ disabled={groups.length === 0}
1029
+ >
1030
+ <Button style={{ marginLeft: 12 }} icon={<FilterOutlined />}>
1031
+ {selectedGroup ? `分组: ${selectedGroup}` : '分组筛选'}
1032
+ <DownOutlined />
1033
+ </Button>
1034
+ </Dropdown>
1012
1035
  </div>
1013
1036
 
1014
- <div className="interface-actions">
1037
+ <div className="control-right">
1015
1038
  <Space>
1016
1039
  <Tooltip title="刷新数据">
1017
1040
  <Button
@@ -1020,138 +1043,103 @@ const InterfaceManagement = () => {
1020
1043
  loading={interfacesLoading}
1021
1044
  />
1022
1045
  </Tooltip>
1046
+
1047
+ <Popover
1048
+ title="自定义显示列"
1049
+ trigger="click"
1050
+ open={columnConfigVisible}
1051
+ onOpenChange={handleColumnConfigToggle}
1052
+ content={
1053
+ <div style={{ width: 280 }}>
1054
+ <div style={{ marginBottom: 12 }}>
1055
+ <Space>
1056
+ <Button size="small" onClick={handleSelectAllColumns}>
1057
+ 全选
1058
+ </Button>
1059
+ <Button size="small" onClick={handleResetColumns}>
1060
+ 重置
1061
+ </Button>
1062
+ </Space>
1063
+ </div>
1064
+ <Checkbox.Group
1065
+ value={tableConfig.visibleColumns || COLUMN_CONFIG.map(col => col.key)}
1066
+ onChange={handleColumnConfigChange}
1067
+ style={{ width: '100%' }}
1068
+ >
1069
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
1070
+ {COLUMN_CONFIG.map(col => (
1071
+ <Checkbox
1072
+ key={col.key}
1073
+ value={col.key}
1074
+ disabled={col.required}
1075
+ style={{
1076
+ width: '100%',
1077
+ color: col.required ? '#999' : undefined
1078
+ }}
1079
+ >
1080
+ {col.title}
1081
+ {col.required && (
1082
+ <span style={{ color: '#999', fontSize: '12px', marginLeft: 4 }}>
1083
+ (必须)
1084
+ </span>
1085
+ )}
1086
+ </Checkbox>
1087
+ ))}
1088
+ </div>
1089
+ </Checkbox.Group>
1090
+ </div>
1091
+ }
1092
+ >
1093
+ <Button icon={<SettingOutlined />} size="small">
1094
+ 列设置
1095
+ </Button>
1096
+ </Popover>
1023
1097
 
1024
1098
  <Button
1025
1099
  type="primary"
1026
1100
  icon={<PlusOutlined />}
1027
1101
  onClick={handleAddInterface}
1028
1102
  disabled={!selectedFeatureId || selectedFeature?.active === false}
1029
- className="add-interface-button"
1030
1103
  >
1031
1104
  添加接口
1032
1105
  </Button>
1033
1106
  </Space>
1034
1107
  </div>
1035
1108
  </div>
1036
- </Card>
1037
-
1038
- {!features.length && (
1039
- <Alert
1040
- message="未找到功能模块"
1041
- description="请先在模拟数据页面创建功能模块,然后再添加接口"
1042
- type="warning"
1043
- showIcon
1044
- style={{ marginBottom: 16 }}
1045
- />
1046
- )}
1047
-
1048
- {selectedFeature?.active === false && (
1049
- <Alert
1050
- message="功能模块已禁用"
1051
- description="当前功能模块已被禁用,所有关联接口不会生效。您可以在模拟数据页面启用此功能模块。"
1052
- type="warning"
1053
- showIcon
1054
- style={{ marginBottom: 16 }}
1055
- />
1056
- )}
1057
-
1058
- {/* 分组筛选和操作区域 */}
1059
- <Card className="filter-card" bordered={false}>
1060
- <div className="filter-header">
1061
- <div className="filter-title">
1062
- <FilterOutlined /> 分组筛选
1063
- </div>
1064
- {selectedGroup && (
1065
- <Button
1066
- type="link"
1067
- onClick={() => setSelectedGroup(null)}
1068
- size="small"
1069
- >
1070
- 清除筛选
1071
- </Button>
1072
- )}
1073
- </div>
1074
1109
 
1075
- <div className="group-tags-container">
1076
- {groups.length === 0 ? (
1077
- <div className="empty-groups">暂无分组</div>
1078
- ) : (
1079
- <div className="group-tags">
1080
- {groups.map(group => (
1081
- <Tag
1082
- key={group}
1083
- color={selectedGroup === group ? "blue" : "default"}
1084
- onClick={() => setSelectedGroup(group === selectedGroup ? null : group)}
1085
- className={`group-tag ${selectedGroup === group ? 'active' : ''}`}
1086
- >
1087
- {group} ({interfaces.filter(item => item.group === group).length})
1088
- </Tag>
1089
- ))}
1090
- </div>
1091
- )}
1092
- </div>
1093
-
1094
- {selectedGroup && (
1095
- <div className="group-actions">
1096
- <Popconfirm
1097
- title={`确定要启用分组 "${selectedGroup}" 中的所有接口吗?`}
1098
- onConfirm={() => handleBatchToggleActive(true)}
1099
- okText="确定"
1100
- cancelText="取消"
1101
- >
1102
- <Button
1103
- type="primary"
1104
- size="small"
1105
- loading={groupActionLoading}
1106
- >
1107
- 批量启用
1108
- </Button>
1109
- </Popconfirm>
1110
-
1111
- <Popconfirm
1112
- title={`确定要禁用分组 "${selectedGroup}" 中的所有接口吗?`}
1113
- onConfirm={() => handleBatchToggleActive(false)}
1114
- okText="确定"
1115
- cancelText="取消"
1116
- >
1117
- <Button
1118
- danger
1119
- size="small"
1120
- loading={groupActionLoading}
1121
- >
1122
- 批量禁用
1123
- </Button>
1124
- </Popconfirm>
1125
- </div>
1126
- )}
1127
- </Card>
1128
-
1129
- {/* 接口列表状态栏 */}
1130
- <Card className="list-header-card" bordered={false}>
1131
- <div className="list-header">
1132
- <div className="list-header-info">
1133
- <div className="feature-info">
1134
- <span className="label">功能模块:</span>
1135
- <span className="value">{selectedFeature?.name}</span>
1110
+ {/* 统计和批量操作行 */}
1111
+ <div className="control-panel-stats">
1112
+ <div className="stats-left">
1113
+ <Space size="large">
1114
+ <span className="stat-item">
1115
+ <span className="stat-label">功能模块:</span>
1116
+ <span className="stat-value">{selectedFeature?.name}</span>
1117
+ </span>
1118
+
1136
1119
  {selectedGroup && (
1137
- <Tag color="blue" className="group-badge">{selectedGroup}</Tag>
1138
- )}
1139
- </div>
1140
- <div className="interface-stats">
1141
- {searchValue ? (
1142
- <Badge
1143
- count={`搜索"${searchValue}" - ${filteredInterfaces.length}个结果`}
1144
- style={{ backgroundColor: '#108ee9' }}
1145
- />
1146
- ) : (
1147
- <Badge
1148
- count={`共 ${filteredInterfaces.length} 个接口`}
1149
- style={{ backgroundColor: '#52c41a' }}
1150
- />
1120
+ <span className="stat-item">
1121
+ <span className="stat-label">分组:</span>
1122
+ <Tag color="blue">{selectedGroup}</Tag>
1123
+ </span>
1151
1124
  )}
1152
- </div>
1125
+
1126
+ <span className="stat-item">
1127
+ {searchValue ? (
1128
+ <Badge
1129
+ count={`搜索"${searchValue}" - ${filteredInterfaces.length}个结果`}
1130
+ style={{ backgroundColor: '#108ee9' }}
1131
+ />
1132
+ ) : (
1133
+ <Badge
1134
+ count={`共 ${filteredInterfaces.length} 个接口`}
1135
+ style={{ backgroundColor: '#52c41a' }}
1136
+ />
1137
+ )}
1138
+ </span>
1139
+ </Space>
1153
1140
  </div>
1154
- <div className="batch-actions">
1141
+
1142
+ <div className="stats-right">
1155
1143
  {selectedRowKeys.length > 0 && (
1156
1144
  <Space>
1157
1145
  <span className="selected-count">
@@ -1175,72 +1163,64 @@ const InterfaceManagement = () => {
1175
1163
  </Popconfirm>
1176
1164
  </Space>
1177
1165
  )}
1166
+
1167
+ {selectedGroup && (
1168
+ <Space style={{ marginLeft: selectedRowKeys.length > 0 ? 16 : 0 }}>
1169
+ <Popconfirm
1170
+ title={`确定要启用分组 "${selectedGroup}" 中的所有接口吗?`}
1171
+ onConfirm={() => handleBatchToggleActive(true)}
1172
+ okText="确定"
1173
+ cancelText="取消"
1174
+ >
1175
+ <Button
1176
+ type="primary"
1177
+ size="small"
1178
+ loading={groupActionLoading}
1179
+ >
1180
+ 分组启用
1181
+ </Button>
1182
+ </Popconfirm>
1183
+ <Popconfirm
1184
+ title={`确定要禁用分组 "${selectedGroup}" 中的所有接口吗?`}
1185
+ onConfirm={() => handleBatchToggleActive(false)}
1186
+ okText="确定"
1187
+ cancelText="取消"
1188
+ >
1189
+ <Button
1190
+ danger
1191
+ size="small"
1192
+ loading={groupActionLoading}
1193
+ >
1194
+ 分组禁用
1195
+ </Button>
1196
+ </Popconfirm>
1197
+ </Space>
1198
+ )}
1178
1199
  </div>
1179
1200
  </div>
1180
1201
  </Card>
1202
+
1203
+ {!features.length && (
1204
+ <Alert
1205
+ message="未找到功能模块"
1206
+ description="请先在模拟数据页面创建功能模块,然后再添加接口"
1207
+ type="warning"
1208
+ showIcon
1209
+ style={{ marginBottom: 16 }}
1210
+ />
1211
+ )}
1212
+
1213
+ {selectedFeature?.active === false && (
1214
+ <Alert
1215
+ message="功能模块已禁用"
1216
+ description="当前功能模块已被禁用,所有关联接口不会生效。您可以在模拟数据页面启用此功能模块。"
1217
+ type="warning"
1218
+ showIcon
1219
+ style={{ marginBottom: 16 }}
1220
+ />
1221
+ )}
1222
+
1181
1223
 
1182
- {/* 列配置区域 */}
1183
- <div style={{
1184
- marginBottom: 16,
1185
- display: 'flex',
1186
- justifyContent: 'flex-end',
1187
- alignItems: 'center'
1188
- }}>
1189
- <Popover
1190
- title="自定义显示列"
1191
- trigger="click"
1192
- open={columnConfigVisible}
1193
- onOpenChange={handleColumnConfigToggle}
1194
- content={
1195
- <div style={{ width: 280 }}>
1196
- <div style={{ marginBottom: 12 }}>
1197
- <Space>
1198
- <Button size="small" onClick={handleSelectAllColumns}>
1199
- 全选
1200
- </Button>
1201
- <Button size="small" onClick={handleResetColumns}>
1202
- 重置
1203
- </Button>
1204
- </Space>
1205
- </div>
1206
- <Checkbox.Group
1207
- value={tableConfig.visibleColumns || COLUMN_CONFIG.map(col => col.key)}
1208
- onChange={handleColumnConfigChange}
1209
- style={{ width: '100%' }}
1210
- >
1211
- <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
1212
- {COLUMN_CONFIG.map(col => (
1213
- <Checkbox
1214
- key={col.key}
1215
- value={col.key}
1216
- disabled={col.required}
1217
- style={{
1218
- width: '100%',
1219
- color: col.required ? '#999' : undefined
1220
- }}
1221
- >
1222
- {col.title}
1223
- {col.required && (
1224
- <span style={{ color: '#999', fontSize: '12px', marginLeft: 4 }}>
1225
- (必须)
1226
- </span>
1227
- )}
1228
- </Checkbox>
1229
- ))}
1230
- </div>
1231
- </Checkbox.Group>
1232
- </div>
1233
- }
1234
- >
1235
- <Button
1236
- icon={<SettingOutlined />}
1237
- size="small"
1238
- type="text"
1239
- >
1240
- 列设置
1241
- </Button>
1242
- </Popover>
1243
- </div>
1244
1224
 
1245
1225
  <Card className="list-container-card" bordered={false} bodyStyle={{ padding: 0 }}>
1246
1226
  <div className="interface-list-container">