diff --git a/frontend/src/pages/PlatformConfigPage.tsx b/frontend/src/pages/PlatformConfigPage.tsx index ff77672..2264893 100644 --- a/frontend/src/pages/PlatformConfigPage.tsx +++ b/frontend/src/pages/PlatformConfigPage.tsx @@ -16,17 +16,23 @@ interface SettingItem { type SettingsMap = Record; /* ── 清理操作子组件 ── */ +interface CleanupPreviewItem { count: number; days: number } function CleanupActions() { - const [preview, setPreview] = useState | null>(null); + const [preview, setPreview] = useState | null>(null); const [loading, setLoading] = useState(false); const [cleaning, setCleaning] = useState(false); const [result, setResult] = useState(''); + const LABEL_MAP: Record = { + tickets: '工单', audit_logs: '审计日志', + query_history: '查询历史', slow_logs: '慢日志', + }; + const handlePreview = async () => { setLoading(true); setResult(''); try { - const res = await api.get('/settings/cleanup/preview') as Record; + const res = await api.get('/settings/cleanup/preview') as Record; setPreview(res); } catch { setResult('预览失败'); @@ -67,7 +73,7 @@ function CleanupActions() { {preview && (
{Object.entries(preview).map(([k, v]) => ( -
{k}: {v} 条
+
{LABEL_MAP[k] || k}(保留 {v.days} 天): {v.count} 条待清理
))}
)} @@ -78,7 +84,11 @@ function CleanupActions() { ); } -/* ── 分组元信息 ── */ +// 隐藏的分组(有独立页面的不在平台配置中展示) +const HIDDEN_GROUPS = new Set(['ldap', 'appearance']); + +/* ── 分组元信息 + 展示顺序 ── */ +const GROUP_ORDER = ['query', 'security', 'data_masking', 'cleanup', 'executor', 'ghost']; const GROUP_META: Record = { query: { label: '查询控制', icon: '🔍', desc: 'LIMIT 上限、超时、自动 LIMIT、危险检测' }, security: { label: '安全策略', icon: '🔒', desc: '登录锁定、密码策略、会话超时' }, @@ -139,7 +149,8 @@ export default function PlatformConfigPage() { return
加载中...
; } - const groupKeys = Object.keys(settings); + // 按 GROUP_ORDER 排序,过滤隐藏分组 + const visibleGroups = GROUP_ORDER.filter(g => settings[g]); const hasChanges = Object.keys(changed).length > 0; return ( @@ -156,9 +167,9 @@ export default function PlatformConfigPage() { )} {/* 各分组 */} - {groupKeys.map(group => { + {visibleGroups.map(group => { const meta = GROUP_META[group] || { label: group, icon: '⚙️', desc: '' }; - const items = settings[group] || []; + const items = (settings[group] || []).filter((it: SettingItem) => !HIDDEN_GROUPS.has(it.group)); return (
@@ -173,19 +184,22 @@ export default function PlatformConfigPage() { {/* 设置项列表 */}
- {items.map(item => { + {items.map((item: SettingItem) => { const val = displayValue(item); const isChanged = changed[item.key] !== undefined; + // 敏感字段列表 → textarea 多行展示 + const isSensitiveList = item.key === 'data_masking_sensitive_fields'; return ( -
-
+
+
{item.label}
{item.description && (
{item.description}
)}
+ {!isSensitiveList && (
{/* 重置按钮 */} {isChanged && item.default_value && ( @@ -212,8 +226,8 @@ export default function PlatformConfigPage() { )} - {/* 整数 → 数字输入 */} - {item.value_type === 'integer' && ( + {/* 整数/数字 → 数字输入 */} + {(item.value_type === 'integer' || item.value_type === 'number') && ( )} - {/* 字符串 → 文本 */} + {/* 普通字符串 → 文本 */} {item.value_type === 'string' && ( )}
+ )} + + {/* 敏感字段列表 → textarea 每行一个字段 */} + {isSensitiveList && ( +