import { useEffect, useMemo, useState } from 'react'; import { Plus, Search, Trash2 } from 'lucide-react'; import { Breadcrumb, Button, Input, Modal, Select, Table, Tag, type TableColumn } from '@/components/ui'; import { adminApi, type DictionaryItem } from '@/api/adminApi'; type SensitiveWordItem = DictionaryItem & { word?: string; level?: string; }; const levelLabelMap: Record = { low: '低', medium: '中', high: '高', block: '拦截', }; const levelToneMap: Record = { low: 'success', medium: 'warning', high: 'danger', block: 'danger', }; const levelOptions = [ { label: '低', value: 'low' }, { label: '中', value: 'medium' }, { label: '高', value: 'high' }, { label: '拦截', value: 'block' }, ]; export function AdminSensitiveWordsPage() { const [items, setItems] = useState([]); const [keyword, setKeyword] = useState(''); const [word, setWord] = useState(''); const [level, setLevel] = useState('medium'); const [modalOpen, setModalOpen] = useState(false); const [error, setError] = useState(''); function loadData() { adminApi.listSensitiveWords({ keyword }) .then((data) => { setItems(data as SensitiveWordItem[]); setError(''); }) .catch((failure: Error) => setError(failure.message || '敏感词加载失败')); } useEffect(() => { loadData(); }, []); const filteredItems = useMemo(() => items.filter((item) => { const text = [item.word, item.level, item.status].join(' '); return !keyword || text.includes(keyword); }), [items, keyword]); const columns = useMemo>>(() => [ { key: 'word', title: '敏感词', width: '180px', render: (record) => {record.word} }, { key: 'level', title: '级别', width: '120px', render: (record) => {levelLabelMap[record.level ?? 'medium'] ?? record.level} }, { key: 'status', title: '状态', width: '120px', render: (record) => {record.status === 'active' ? '启用' : record.status === 'deleted' ? '已删除' : '停用'} }, { key: 'createdAt', title: '创建时间', width: '190px', render: (record) => record.createdAt ?? '-' }, { key: 'actions', title: '操作', width: '130px', align: 'right', render: (record) => ( ), }, ], []); function addItem() { adminApi.createSensitiveWord({ word, level, status: 'active' }) .then(() => { setWord(''); setLevel('medium'); setModalOpen(false); loadData(); }) .catch((failure: Error) => setError(failure.message || '添加敏感词失败')); } return (

敏感词管理

{error ?

{error}

: null}
setKeyword(event.target.value)} placeholder="搜索敏感词、级别或状态" prefix={} value={keyword} />
)} onClose={() => setModalOpen(false)} open={modalOpen} size="xl" title="添加敏感词" >
setWord(event.target.value)} placeholder="请输入敏感词" value={word} />