whistle.mock-plugins 1.1.3-dev.6 → 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.
package/package.json
CHANGED
|
@@ -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-
|
|
980
|
-
<div className="
|
|
981
|
-
<div className="
|
|
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:
|
|
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:
|
|
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="
|
|
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
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
<
|
|
1082
|
-
|
|
1083
|
-
|
|
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
|
-
<
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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">
|
|
@@ -20,33 +20,39 @@
|
|
|
20
20
|
background: #f5f7fa;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
/*
|
|
24
|
-
.interface-
|
|
23
|
+
/* 统一控制台 */
|
|
24
|
+
.interface-control-panel {
|
|
25
25
|
margin-bottom: 16px;
|
|
26
26
|
border-radius: 12px;
|
|
27
27
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
28
28
|
overflow: hidden;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
.
|
|
31
|
+
.control-panel-header {
|
|
32
32
|
display: flex;
|
|
33
33
|
justify-content: space-between;
|
|
34
34
|
align-items: center;
|
|
35
35
|
padding: 8px 0;
|
|
36
|
+
border-bottom: 1px solid #f0f0f0;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
.
|
|
39
|
+
.control-left {
|
|
39
40
|
display: flex;
|
|
40
41
|
align-items: center;
|
|
41
42
|
flex-wrap: wrap;
|
|
42
|
-
gap:
|
|
43
|
+
gap: 8px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.control-right {
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
43
49
|
}
|
|
44
50
|
|
|
45
51
|
.feature-selector {
|
|
46
52
|
display: flex;
|
|
47
53
|
align-items: center;
|
|
48
54
|
background: #f9f9f9;
|
|
49
|
-
padding:
|
|
55
|
+
padding: 6px 12px;
|
|
50
56
|
border-radius: var(--border-radius);
|
|
51
57
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
|
|
52
58
|
transition: all var(--transition-time);
|
|
@@ -57,9 +63,74 @@
|
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
.feature-selector span {
|
|
60
|
-
margin-right:
|
|
66
|
+
margin-right: 8px;
|
|
61
67
|
font-weight: 600;
|
|
62
68
|
color: var(--text-secondary);
|
|
69
|
+
font-size: 14px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.control-panel-stats {
|
|
73
|
+
display: flex;
|
|
74
|
+
justify-content: space-between;
|
|
75
|
+
align-items: center;
|
|
76
|
+
padding: 12px 0 8px 0;
|
|
77
|
+
min-height: 40px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.stats-left {
|
|
81
|
+
display: flex;
|
|
82
|
+
align-items: center;
|
|
83
|
+
flex-wrap: wrap;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.stats-right {
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
gap: 12px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.stat-item {
|
|
93
|
+
display: inline-flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
font-size: 14px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.stat-label {
|
|
99
|
+
color: var(--text-secondary);
|
|
100
|
+
margin-right: 6px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.stat-value {
|
|
104
|
+
font-weight: 600;
|
|
105
|
+
color: var(--font-color);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.selected-count {
|
|
109
|
+
font-weight: 600;
|
|
110
|
+
color: var(--primary-color);
|
|
111
|
+
font-size: 13px;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* 旧版样式兼容 */
|
|
115
|
+
.interface-header-card {
|
|
116
|
+
margin-bottom: 16px;
|
|
117
|
+
border-radius: 12px;
|
|
118
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
119
|
+
overflow: hidden;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.interface-management-header {
|
|
123
|
+
display: flex;
|
|
124
|
+
justify-content: space-between;
|
|
125
|
+
align-items: center;
|
|
126
|
+
padding: 8px 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.feature-selector-container {
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
flex-wrap: wrap;
|
|
133
|
+
gap: 12px;
|
|
63
134
|
}
|
|
64
135
|
|
|
65
136
|
.interface-actions {
|