// 规则库 — 行业规则包 / AIGC 护栏包的上传与查看(原 AIDS 拆解库的 rules tab 拆出) const RulePackPage = () => { const [packs, setPacks] = React.useState([]); const [selPackId, setSelPackId] = React.useState(null); const [loading, setLoading] = React.useState(false); const [err, setErr] = React.useState(""); const [uploading, setUploading] = React.useState(false); const uploadRef = React.useRef(null); React.useEffect(() => { loadRules(); }, []); const loadRules = async () => { setLoading(true); setErr(""); try { const d = await API.rulePacks.list(); const items = d.items || []; setPacks(items); if (items.length && !selPackId) setSelPackId(items[0].pack_id); } catch (e) { setErr(String(e.message || e)); } finally { setLoading(false); } }; const selPack = packs.find(p => p.pack_id === selPackId); const onUploadRule = async (file) => { if (!file) return; const form = new FormData(); form.append("file", file); form.append("display_name", file.name.replace(/\.[^.]+$/, "")); setUploading(true); try { await API.rulePacks.upload(form); await loadRules(); } catch (e) { setErr(String(e.message || e)); } finally { setUploading(false); } }; return ( <> onUploadRule(e.target.files[0])} /> } /> {err && (
{err}
)}
{/* 左:规则包列表 */}
规则包 {packs.length} 条
{loading && !packs.length &&
加载中…
} {packs.map(p => (
setSelPackId(p.pack_id)} className="row gap-8" style={{ padding:8, borderRadius:5, cursor:"pointer", alignItems:"flex-start", background: p.pack_id===selPackId ? "color-mix(in oklch, var(--cyan) 10%, var(--bg-1))" : "var(--bg-1)", border: `1px solid ${p.pack_id===selPackId ? "var(--cyan)" : "var(--line-1)"}`, }}>
{p.display_name}
{p.category==="industry_rule_pack" ? "行业规则" : "AIGC护栏"} {p.industry_key && {p.industry_key}}
{p.size_kb} KB · {p.created_at ? p.created_at.slice(0,16).replace("T"," ") : ""}
))} {!loading && !packs.length &&
暂无规则包
}
{/* 右:规则包详情 */}
{selPack && (
{selPack.display_name} {selPack.category==="industry_rule_pack" ? "行业规则" : "AIGC护栏"}
ID{selPack.pack_id}
大小{selPack.size_kb} KB
文件名{selPack.filename}
创建时间{selPack.created_at ? selPack.created_at.slice(0,16).replace("T"," ") : "—"}
{selPack.industry_key && (
行业{selPack.industry_key}
)}
文件路径:{selPack.file_path}
内容类型:{selPack.content_type}
状态:{selPack.enabled ? "已启用" : "已禁用"}
备注:{selPack.note || "—"}
{selPack.filename.endsWith(".md") && (
内容预览
(文本型规则包内容需在服务端读取,此处仅展示元信息)
)}
)} {!selPack && (
请在左侧选择一个规则包
或点击右上角「上传规则包」上传 .md / .pdf 文件
)}
); }; Object.assign(window, { RulePackPage });