import React, { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import {
ChevronLeft, Plus, Sparkles, Send, Check, X,
Trash2, Edit2, FileText
} from 'lucide-react';
import { questionBankService, QuestionBank, QuestionBankItem, CreateQuestionBankItemDto } from '../../services/questionBankService';
import { templateService } from '../../services/templateService';
import { AssessmentTemplate } from '../../types';
const QUESTION_TYPES = [
{ value: 'SHORT_ANSWER', label: '简答题' },
{ value: 'MULTIPLE_CHOICE', label: '选择题' },
{ value: 'TRUE_FALSE', label: '判断题' },
];
const DIFFICULTIES = [
{ value: 'STANDARD', label: '标准' },
{ value: 'ADVANCED', label: '高级' },
{ value: 'SPECIALIST', label: '专家' },
];
const DIMENSIONS = [
{ value: 'PROMPT', label: 'Prompt' },
{ value: 'LLM', label: 'LLM' },
{ value: 'IDE', label: 'IDE' },
{ value: 'DEV_PATTERN', label: '开发模式' },
{ value: 'WORK_CAPABILITY', label: '工作能力' },
];
export default function QuestionBankDetailView() {
const { id: bankId } = useParams<{ id: string }>();
const navigate = useNavigate();
if (!bankId) {
return (
无效的题库ID
);
}
const [bank, setBank] = useState(null);
const [items, setItems] = useState([]);
const [templates, setTemplates] = useState([]);
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
const [error, setError] = useState('');
const [showAddItem, setShowAddItem] = useState(false);
const [showGenerate, setShowGenerate] = useState(false);
const [editingItem, setEditingItem] = useState(null);
const [itemForm, setItemForm] = useState({
questionText: '',
questionType: 'SHORT_ANSWER',
keyPoints: [],
difficulty: 'STANDARD',
dimension: 'WORK_CAPABILITY',
});
const [keyPointsInput, setKeyPointsInput] = useState('');
const [generateForm, setGenerateForm] = useState({
count: 5,
knowledgeBaseContent: '',
});
const [generating, setGenerating] = useState(false);
useEffect(() => {
fetchData();
fetchTemplates();
}, [bankId]);
const fetchData = async () => {
try {
setLoading(true);
const bankData = await questionBankService.getBank(bankId);
setBank(bankData);
const itemsData = await questionBankService.getBankItems(bankId);
setItems(itemsData);
} catch (err: any) {
setError(err.message || '加载失败');
} finally {
setLoading(false);
}
};
const fetchTemplates = async () => {
try {
const data = await templateService.getAll();
setTemplates(data);
} catch (err) {
console.error('加载模板失败:', err);
}
};
const handleCreateItem = async (e: React.FormEvent) => {
e.preventDefault();
if (!itemForm.questionText.trim()) return;
setSaving(true);
try {
const payload = {
...itemForm,
keyPoints: keyPointsInput.split('\n').filter(k => k.trim()),
};
await questionBankService.createItem(bankId, payload);
setShowAddItem(false);
setItemForm({
questionText: '',
questionType: 'SHORT_ANSWER',
keyPoints: [],
difficulty: 'STANDARD',
dimension: 'WORK_CAPABILITY',
});
setKeyPointsInput('');
fetchData();
} catch (err: any) {
alert('创建失败: ' + (err.message || '未知错误'));
} finally {
setSaving(false);
}
};
const handleUpdateItem = async (e: React.FormEvent) => {
e.preventDefault();
if (!editingItem || !itemForm.questionText.trim()) return;
setSaving(true);
try {
const payload = {
...itemForm,
keyPoints: keyPointsInput.split('\n').filter(k => k.trim()),
};
await questionBankService.updateItem(bankId, editingItem.id, payload);
setEditingItem(null);
setItemForm({
questionText: '',
questionType: 'SHORT_ANSWER',
keyPoints: [],
difficulty: 'STANDARD',
dimension: 'WORK_CAPABILITY',
});
setKeyPointsInput('');
fetchData();
} catch (err: any) {
alert('更新失败: ' + (err.message || '未知错误'));
} finally {
setSaving(false);
}
};
const handleDeleteItem = async (itemId: string) => {
if (!confirm('确定要删除这道题目吗?')) return;
try {
await questionBankService.deleteItem(bankId, itemId);
fetchData();
} catch (err: any) {
alert('删除失败: ' + (err.message || '未知错误'));
}
};
const handleGenerate = async () => {
setGenerating(true);
try {
await questionBankService.generateQuestions(bankId, generateForm.count, generateForm.knowledgeBaseContent);
setShowGenerate(false);
setGenerateForm({ count: 5, knowledgeBaseContent: '' });
fetchData();
} catch (err: any) {
alert('生成失败: ' + (err.message || '未知错误'));
} finally {
setGenerating(false);
}
};
const handleSubmitForReview = async () => {
if (!confirm('确定要提交审核吗?')) return;
try {
await questionBankService.submitForReview(bankId);
fetchData();
} catch (err: any) {
alert('提交失败: ' + (err.message || '未知错误'));
}
};
const handlePublish = async () => {
if (!confirm('确定要发布题库吗?')) return;
try {
await questionBankService.publishBank(bankId);
fetchData();
} catch (err: any) {
alert('发布失败: ' + (err.message || '未知错误'));
}
};
const handleApproveItem = async (itemId: string) => {
try {
await questionBankService.updateItem(bankId, itemId, { status: 'PUBLISHED' as any });
fetchData();
} catch (err: any) {
alert('操作失败: ' + (err.message || '未知错误'));
}
};
const openEditItem = (item: QuestionBankItem) => {
setEditingItem(item);
setItemForm({
questionText: item.questionText,
questionType: item.questionType,
options: item.options || [],
keyPoints: item.keyPoints,
difficulty: item.difficulty,
dimension: item.dimension,
});
setKeyPointsInput(item.keyPoints.join('\n'));
};
const getStatusBadge = (status: string) => {
switch (status) {
case 'PUBLISHED':
return 已发布;
case 'PENDING_REVIEW':
return 待审核;
default:
return 草稿;
}
};
if (loading) {
return (
);
}
if (error) {
return (
加载失败: {error}
);
}
const pendingItems = items.filter(i => i.status === 'PENDING_REVIEW');
const publishedItems = items.filter(i => i.status === 'PUBLISHED');
return (
{bank?.name}
{bank?.description || '暂无描述'}
模板: {templates.find(t => t.id === bank?.templateId)?.name || '未关联'}
{getStatusBadge(bank?.status || 'DRAFT')}
{bank?.status === 'DRAFT' && (
)}
{bank?.status === 'PENDING_REVIEW' && (
)}
{pendingItems.length}
待审核
{publishedItems.length}
已发布
题目列表
{items.length === 0 ? (
) : (
{items.map((item) => (
{QUESTION_TYPES.find(t => t.value === item.questionType)?.label}
{DIFFICULTIES.find(d => d.value === item.difficulty)?.label}
{DIMENSIONS.find(d => d.value === item.dimension)?.label}
{getStatusBadge(item.status)}
{item.questionText}
{item.keyPoints.length > 0 && (
评分要点:
{item.keyPoints.map((kp, i) => (
• {kp}
))}
)}
{item.basis && (
依据:{item.basis}
)}
{item.status === 'PENDING_REVIEW' && (
)}
))}
)}
{showAddItem && (
{ setShowAddItem(false); setEditingItem(null); }} />
)}
{editingItem ? '编辑题目' : '添加题目'}
{showGenerate && (
<>
setShowGenerate(false)} />
AI生成题目
>
)}
);
}