From 132b2db2d20470e2e5cecca99a905c5c2d83365c Mon Sep 17 00:00:00 2001 From: logan Date: Mon, 1 Jun 2026 21:07:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B9=B3=E5=8F=B0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BF=AE=E5=A4=8D=20-=20=E9=9A=90=E8=97=8FLD?= =?UTF-8?q?AP=E9=87=8D=E5=A4=8D=E5=88=86=E7=BB=84=E3=80=81=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E5=AD=97=E6=AE=B5=E5=88=97=E8=A1=A8textarea=E5=A4=9A?= =?UTF-8?q?=E8=A1=8C=E5=B1=95=E7=A4=BA=E3=80=81=E5=88=86=E7=BB=84=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 过滤ldap分组(有独立LDAP页面不重复展示) - 敏感字段列表从单行input改为textarea每行一个字段名(key修正data_masking_sensitive_fields) - 添加GROUP_ORDER固定展示顺序:查询控制→安全策略→数据脱敏→日志清理→执行器→Ghost/OSC - 所有分组输入框均有默认值,cleanup组retention天数输入框正常显示 --- frontend/src/pages/PlatformConfigPage.tsx | 53 +++++++++++++++++------ 1 file changed, 40 insertions(+), 13 deletions(-) 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 && ( +