import { useState } from 'react' import { Button, Card, Form, Input, message, Space, Switch } from 'antd' import { checkAndCorrectSpelling } from '@/api/spellCheck' interface CorrectionResult { original: string corrected: string position: number suggestions?: string[] } const SpellCheck = () => { const [form] = Form.useForm() const [isGenerating, setIsGenerating] = useState(false) const [correctionResults, setCorrectionResults] = useState([]) const [correctedText, setCorrectedText] = useState('') const maxChars = 5000 const validateCustomVocab = (_: any, value: string) => { if (!value) { return Promise.resolve() } try { const parsed = JSON.parse(value) if (!Array.isArray(parsed)) { return Promise.reject(new Error('必须是JSON数组格式')) } if (!parsed.every(item => typeof item === 'string')) { return Promise.reject(new Error('数组元素必须为字符串')) } return Promise.resolve() } catch (error) { return Promise.reject(new Error('JSON格式无效')) } } const handleGenerate = async () => { try { const formValues = await form.validateFields() // 验证用户输入文本 if (!formValues.user_input_text?.trim()) { message.warning('请输入需要检测错别字的文本') return } // 验证文本长度 if (formValues.user_input_text.length > maxChars) { message.warning(`输入文本不能超过${maxChars}个字符`) return } setIsGenerating(true) setCorrectionResults([]) setCorrectedText('') let customVocabArray: string[] = [] if (formValues.custom_vocab) { try { customVocabArray = JSON.parse(formValues.custom_vocab) } catch (error) { message.error('自定义词汇库格式错误') setIsGenerating(false) return } } const response = await checkAndCorrectSpelling( formValues.user_input_text, formValues.auto_correct || false, customVocabArray ) if (!response.ok) { const errorText = await response.text() throw new Error(`检测请求失败: ${response.status} ${errorText}`) } if (!response.body) { throw new Error('响应体为空') } const reader = response.body.getReader() const decoder = new TextDecoder('utf-8') let buffer = '' let fullContent = '' let results: CorrectionResult[] = [] try { while (true) { const { done, value } = await reader.read() if (done) break buffer += decoder.decode(value, { stream: true }) const lines = buffer.split('\n') buffer = lines.pop() || '' for (const line of lines) { const trimmedLine = line.trim() if (!trimmedLine || trimmedLine === 'data: [DONE]') { if (trimmedLine === 'data: [DONE]') { message.success('检测完成') break } continue } if (trimmedLine.startsWith('data: ')) { try { const data = trimmedLine.slice(6) const parsed = JSON.parse(data) if (parsed.event === 'message' && parsed.answer) { fullContent += parsed.answer // 尝试解析JSON结果 try { results = JSON.parse(fullContent) setCorrectionResults(results) if (formValues.auto_correct) { let corrected = formValues.user_input_text results.forEach(item => { if (item.corrected && item.original) { corrected = corrected.replace(item.original, item.corrected) } }) setCorrectedText(corrected) } } catch (e) { // 解析失败,继续等待 } } else if (parsed.event === 'error') { throw new Error(parsed.message || 'Dify API 返回错误') } } catch (parseError) { console.warn('跳过无法解析的行:', trimmedLine) } } } } } finally { reader.releaseLock() } if (results.length === 0 && fullContent) { try { results = JSON.parse(fullContent) setCorrectionResults(results) if (formValues.auto_correct) { let corrected = formValues.user_input_text results.forEach(item => { if (item.corrected && item.original) { corrected = corrected.replace(item.original, item.corrected) } }) setCorrectedText(corrected) } } catch (e) { message.warning('检测完成,但结果格式异常') } } } catch (error) { console.error('检测错误:', error) message.error(error instanceof Error ? error.message : '检测失败,请稍后重试') } finally { setIsGenerating(false) } } const handleReset = () => { form.resetFields() setCorrectionResults([]) setCorrectedText('') message.info('已重置表单') } const renderCorrectionResults = () => { if (isGenerating) { return (
正在检测中,请稍候...
) } if (correctionResults.length === 0) { return (
错别字检测结果将在这里显示
) } return (
{correctionResults.map((item, index) => (
位置 {item.position}:
原词:{item.original} 建议:{item.corrected}
{item.suggestions && item.suggestions.length > 0 && (
其他建议:{item.suggestions.join('、')}
)}
))}
) } return (
{/* 页面标题区 */}

错别字检测与纠正系统

{/* 参数输入区 */}
格式要求:合法的JSON数组,元素为字符串
{/* 操作按钮区 */}
{/* 内容展示区 */} 0 || isGenerating ? 'block' : 'none' }} >
{renderCorrectionResults()}
{correctedText && (
{correctedText}
)}
) } export default SpellCheck