parent
da9be7517a
commit
913365cd70
5 changed files with 545 additions and 144 deletions
@ -0,0 +1,229 @@ |
|||||||
|
import React, { Component } from 'react'; |
||||||
|
import { Form, Input, Button, Radio, Checkbox, Select, message} from 'antd'; |
||||||
|
import { getDetail} from 'api/examPaper'; |
||||||
|
import { findIndustry} from 'api/question'; |
||||||
|
|
||||||
|
const { Option } = Select; |
||||||
|
|
||||||
|
interface optionsState { |
||||||
|
value: string; |
||||||
|
label: string; |
||||||
|
} |
||||||
|
|
||||||
|
// 定义单个试题的状态接口
|
||||||
|
interface QuestionState { |
||||||
|
id: string; |
||||||
|
serviceTypeId: string; |
||||||
|
questionTypes: string; |
||||||
|
questionContent: string; |
||||||
|
answerOptions: optionsState[]; |
||||||
|
answer: string | null; |
||||||
|
} |
||||||
|
|
||||||
|
// 定义组件的状态接口
|
||||||
|
interface States { |
||||||
|
id: string | undefined; |
||||||
|
industryDict: any; |
||||||
|
paperName : string | undefined; |
||||||
|
industryId : number | undefined; |
||||||
|
questionCount : number | undefined; |
||||||
|
totalScore : number | undefined; |
||||||
|
examDuration : string | undefined; |
||||||
|
durationType : number | undefined; |
||||||
|
paperContent : string | undefined; |
||||||
|
questions: QuestionState[]; |
||||||
|
} |
||||||
|
|
||||||
|
class ExamPaperView extends Component<any, States> { |
||||||
|
formRef: any; |
||||||
|
constructor(props: any) { |
||||||
|
super(props); |
||||||
|
this.formRef = React.createRef(); |
||||||
|
this.state = { |
||||||
|
id: undefined, |
||||||
|
industryDict: undefined, |
||||||
|
paperName: undefined, |
||||||
|
industryId: undefined, |
||||||
|
questionCount: undefined, |
||||||
|
totalScore: undefined, |
||||||
|
examDuration: undefined, |
||||||
|
durationType: undefined, |
||||||
|
paperContent: undefined, |
||||||
|
questions: [], |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
// 初期
|
||||||
|
componentDidMount() { |
||||||
|
const id = sessionStorage.getItem('id'); |
||||||
|
sessionStorage.removeItem('id'); |
||||||
|
this.findIndustry(); |
||||||
|
this.getDetail(id); |
||||||
|
} |
||||||
|
|
||||||
|
// 监管行业
|
||||||
|
findIndustry() { |
||||||
|
findIndustry().then((res: any) => { |
||||||
|
if (res.data) { |
||||||
|
this.setState({ industryDict: res.data }); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 试卷详情
|
||||||
|
getDetail = (id: string | null) => { |
||||||
|
getDetail(id).then((res: any) => { |
||||||
|
if (res.data) { |
||||||
|
const newQuestions: QuestionState[] = res.data.data.map((questionData: any) => { |
||||||
|
const options = questionData.options.split(','); |
||||||
|
const answerOptions = options.map((option: any) => { |
||||||
|
const [value, label] = option.split(':'); |
||||||
|
return { value, label }; |
||||||
|
}); |
||||||
|
return { |
||||||
|
id: String(questionData.id), |
||||||
|
serviceTypeId: String(questionData.serviceTypeId), |
||||||
|
questionTypes: String(questionData.questionTypes), |
||||||
|
questionContent: String(questionData.questionContent), |
||||||
|
answerOptions: answerOptions, |
||||||
|
answer: String(questionData.answer) |
||||||
|
}; |
||||||
|
}); |
||||||
|
const paperName = res.data.head.paperName; |
||||||
|
const industryId = res.data.head.industryId; |
||||||
|
const questionCount = res.data.head.questionCount; |
||||||
|
const totalScore = res.data.head.totalScore; |
||||||
|
const examDuration = res.data.head.examDuration; |
||||||
|
const durationType = res.data.head.durationType; |
||||||
|
const paperContent = res.data.head.paperContent; |
||||||
|
this.setState({ |
||||||
|
questions: newQuestions, |
||||||
|
paperName, |
||||||
|
industryId, |
||||||
|
questionCount, |
||||||
|
totalScore, |
||||||
|
examDuration, |
||||||
|
durationType, |
||||||
|
paperContent, |
||||||
|
}); |
||||||
|
} |
||||||
|
}).catch(() => { |
||||||
|
message.error('获取题目详情失败,请重试'); |
||||||
|
}); |
||||||
|
}; |
||||||
|
findDurationTypeName = (durationType:number | undefined) => { |
||||||
|
switch (durationType) { |
||||||
|
case 1: |
||||||
|
return '分(min)'; |
||||||
|
case 2: |
||||||
|
return '时(h)'; |
||||||
|
default: |
||||||
|
return '未知'; |
||||||
|
} |
||||||
|
}; |
||||||
|
findIndustryName = (industryId:number | undefined) => { |
||||||
|
const { industryDict } = this.state; |
||||||
|
if (industryDict) { |
||||||
|
const industry = industryDict.find((item:any) => item.industryId === String(industryId)); |
||||||
|
return industry ? industry.industryName : '未知行业'; |
||||||
|
} |
||||||
|
return '未知行业'; |
||||||
|
}; |
||||||
|
render() { |
||||||
|
const { |
||||||
|
questions, |
||||||
|
paperName, |
||||||
|
industryId, |
||||||
|
questionCount, |
||||||
|
totalScore, |
||||||
|
examDuration, |
||||||
|
durationType, |
||||||
|
paperContent, |
||||||
|
} = this.state; |
||||||
|
// 页面跳转
|
||||||
|
const handleListQuestion = () => { |
||||||
|
this.props.history.push('/examPaperList'); |
||||||
|
}; |
||||||
|
return ( |
||||||
|
<div className="container"> |
||||||
|
<Form ref={this.formRef}> |
||||||
|
<h3 style={{ fontWeight: 'bold' }}>基本信息</h3> |
||||||
|
<Form.Item label="试卷名称:"> |
||||||
|
<span>{paperName}</span> |
||||||
|
</Form.Item> |
||||||
|
<div style={{ display: 'flex', gap: 20 }}> |
||||||
|
<Form.Item label="监管行业:"> |
||||||
|
<span>{this.findIndustryName(industryId)}</span> |
||||||
|
</Form.Item> |
||||||
|
<Form.Item label="题目数量:"> |
||||||
|
<span>{questionCount}</span> |
||||||
|
</Form.Item> |
||||||
|
<Form.Item label="总分值:"> |
||||||
|
<span>{totalScore}</span> |
||||||
|
</Form.Item> |
||||||
|
<Form.Item label="考试时长:"> |
||||||
|
<span>{examDuration}</span> |
||||||
|
</Form.Item> |
||||||
|
<Form.Item label=""> |
||||||
|
<span>{this.findDurationTypeName(durationType)}</span> |
||||||
|
</Form.Item> |
||||||
|
</div> |
||||||
|
<Form.Item label="内容描述:"> |
||||||
|
<span>{paperContent}</span> |
||||||
|
</Form.Item> |
||||||
|
<div style={{ display: 'flex' }}> |
||||||
|
<h3 style={{ fontWeight: 'bold' }}>试题详情</h3> |
||||||
|
</div> |
||||||
|
{questions.map((question, index) => ( |
||||||
|
<div |
||||||
|
style={{ |
||||||
|
border: '1px solid #e8e8e8', |
||||||
|
padding: 10, |
||||||
|
marginBottom: 10 |
||||||
|
}} |
||||||
|
> |
||||||
|
<span style={{ fontWeight: 'bold' }}>{index + 1}. {question.questionContent}</span> |
||||||
|
<Form.Item> |
||||||
|
{question.questionTypes === '1'? ( |
||||||
|
<Radio.Group value={question.answer}> |
||||||
|
{question.answerOptions.map((option) => ( |
||||||
|
<Radio value={option.value}> |
||||||
|
{option.value}. {option.label} |
||||||
|
</Radio> |
||||||
|
))} |
||||||
|
</Radio.Group> |
||||||
|
) : ( |
||||||
|
<Checkbox.Group value={question.answer? question.answer.split(',') : []}> |
||||||
|
{question.answerOptions.map((option) => ( |
||||||
|
<Checkbox value={option.value}> |
||||||
|
{option.value}. {option.label} |
||||||
|
</Checkbox> |
||||||
|
))} |
||||||
|
</Checkbox.Group> |
||||||
|
)} |
||||||
|
</Form.Item> |
||||||
|
</div> |
||||||
|
))} |
||||||
|
<div |
||||||
|
style={{ |
||||||
|
textAlign: 'right', |
||||||
|
position: 'fixed', |
||||||
|
bottom: 10, |
||||||
|
right: 10, |
||||||
|
width: '100%', |
||||||
|
backgroundColor: 'white', |
||||||
|
zIndex: 1000 |
||||||
|
}} |
||||||
|
> |
||||||
|
<Button type="default" htmlType="button" onClick={ |
||||||
|
handleListQuestion |
||||||
|
}> |
||||||
|
取消 |
||||||
|
</Button> |
||||||
|
</div> |
||||||
|
</Form> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
export default ExamPaperView; |
Loading…
Reference in new issue