一、新增内容
4月27日,完成对管理员端题库管理功能的细化。
题库管理包括功能介绍、所有题库与增加题库三个功能。功能介绍负责介绍题库管理的功能;所有题库可以查看当前大模型生成的所有题库及其题目;增加题库可以增加新的题库及题目。
题库目前支持选择,填空,判断以及材料四种题型。
二、主要代码
所有题库主要代码:
<template>
<div class="exam">
<el-table :data="pagination.records" border :row-class-name="tableRowClassName">
<el-table-column fixed="left" prop="subject" label="试卷名称" width="180"></el-table-column>
<el-table-column prop="question" label="题目信息" width="490"></el-table-column>
<el-table-column prop="section" label="所属章节" width="200"></el-table-column>
<el-table-column prop="type" label="题目类型" width="200"></el-table-column>
<el-table-column prop="score" label="试题分数" width="150"></el-table-column>
<el-table-column prop="level" label="难度等级" width="133"></el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagination.current"
:page-sizes="[6, 10]"
:page-size="pagination.size"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total"
class="page"
></el-pagination>
</div>
</template>
<script>
export default {
data() {
return {
pagination: {
//分页后的信息
current: 1, //当前页
total: null, //记录条数
size: 6 //每页条数
}
};
},
created() {
this.getAnswerInfo();
},
methods: {
getAnswerInfo() {
//分页查询
this.$axios(
`/api/answers/${this.pagination.current}/${this.pagination.size}`
)
.then(res => {
this.pagination = res.data.data;
console.log(res);
})
.catch(error => {});
},
//改变当前记录条数
handleSizeChange(val) {
this.pagination.size = val;
this.getAnswerInfo();
},
//改变当前页码,重新发送请求
handleCurrentChange(val) {
this.pagination.current = val;
this.getAnswerInfo();
},
tableRowClassName({ row, rowIndex }) {
if (rowIndex % 2 == 0) {
return "warning-row";
} else {
return "success-row";
}
}
}
};
</script>
添加题库主要代码:
<template>
<div class="add">
<el-tabs v-model="activeName">
<el-tab-pane name="first">
<span slot="label"><i class="el-icon-circle-plus"></i>添加试题</span>
<section class="append">
<ul>
<li>
<span>题目类型:</span>
<el-select v-model="optionValue" placeholder="请选择题型" class="w150">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
<li v-if="optionValue == '选择题'">
<span>所属章节:</span>
<el-input
placeholder="请输入对应章节"
v-model="postChange.section"
class="w150"
clearable>
</el-input>
</li>
<li v-if="optionValue == '填空题'">
<span>所属章节:</span>
<el-input
placeholder="请输入对应章节"
v-model="postFill.section"
class="w150"
clearable>
</el-input>
</li>
<li v-if="optionValue == '判断题'">
<span>所属章节:</span>
<el-input
placeholder="请输入对应章节"
v-model="postJudge.section"
class="w150"
clearable>
</el-input>
</li>
<li v-if="optionValue == '材料题'">
<span>所属章节:</span>
<el-input
placeholder="请输入对应章节"
v-model="postMaterial.section"
class="w150"
clearable>
</el-input>
</li>
<li v-if="optionValue == '选择题'">
<span>难度等级:</span>
<el-select v-model="postChange.level" placeholder="选择难度等级" class="w150">
<el-option
v-for="item in levels"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
<li v-if="optionValue == '填空题'">
<span>难度等级:</span>
<el-select v-model="postFill.level" placeholder="选择难度等级" class="w150">
<el-option
v-for="item in levels"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
<li v-if="optionValue == '判断题'">
<span>难度等级:</span>
<el-select v-model="postJudge.level" placeholder="选择难度等级" class="w150">
<el-option
v-for="item in levels"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
<li v-if="optionValue == '材料题'">
<span>难度等级:</span>
<el-select v-model="postMaterial.level" placeholder="选择难度等级" class="w150">
<el-option
v-for="item in levels"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
<li v-if="optionValue == '选择题'">
<span>正确选项:</span>
<el-select v-model="postChange.rightAnswer" placeholder="选择正确答案" class="w150">
<el-option
v-for="item in rights"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
</ul>
<!-- 选择题部分 -->
<div class="change" v-if="optionValue == '选择题'">
<div class="title">
<el-tag>题目:</el-tag><span>在下面的输入框中输入题目</span>
<el-input
type="textarea"
rows="4"
v-model="postChange.question"
placeholder="请输入题目内容"
resize="none"
class="answer">
</el-input>
</div>
<div class="options">
<ul>
<li>
<el-tag type="success">A</el-tag>
<el-input
placeholder="请输入选项A的内容"
v-model="postChange.answerA"
clearable="">
</el-input>
</li>
<li>
<el-tag type="success">B</el-tag>
<el-input
placeholder="请输入选项B的内容"
v-model="postChange.answerB"
clearable="">
</el-input>
</li>
<li>
<el-tag type="success">C</el-tag>
<el-input
placeholder="请输入选项C的内容"
v-model="postChange.answerC"
clearable="">
</el-input>
</li>
<li>
<el-tag type="success">D</el-tag>
<el-input
placeholder="请输入选项D的内容"
v-model="postChange.answerD"
clearable="">
</el-input>
</li>
</ul>
</div>
<div class="title">
<el-tag>解析:</el-tag><span>在下面的输入框中输入题目解析</span>
<el-input
type="textarea"
rows="4"
v-model="postChange.analysis"
placeholder="请输入答案解析"
resize="none"
class="answer">
</el-input>
</div>
<div class="submit">
<el-button type="primary" @click="changeSubmit()">立即添加</el-button>
</div>
</div>
<!-- 填空题部分 -->
<div class="change fill" v-if="optionValue == '填空题'">
<div class="title">
<el-tag>题目:</el-tag><span>输入题目,形如--从计算机网络系统组成的角度看,计算机网络可以分为()和()。注意需要考生答题部分一定要用括号(英文半角)括起来。</span>
<el-input
type="textarea"
rows="4"
v-model="postFill.question"
placeholder="请输入题目内容"
resize="none"
class="answer">
</el-input>
</div>
<div class="fillAnswer">
<el-tag>正确答案:</el-tag>
<el-input v-model="postFill.answer"></el-input>
</div>
<div class="title analysis">
<el-tag type="success">解析:</el-tag><span>下方输入框中输入答案解析</span>
<el-input
type="textarea"
rows="4"
v-model="postFill.analysis"
placeholder="请输入答案解析"
resize="none"
class="answer">
</el-input>
</div>
<div class="submit">
<el-button type="primary" @click="fillSubmit()">立即添加</el-button>
</div>
</div>
<!-- 材料题部分 -->
<div class="change material" v-if="optionValue == '材料题'">
<div class="title">
<el-tag>材料及题目:</el-tag><span>输入材料及题目</span>
<el-input
type="textarea"
rows="4"
v-model="postMaterial.question"
placeholder="请输入材料及题目内容"
resize="none"
class="answer">
</el-input>
</div>
<div class="materialAnswer">
<el-tag>参考答案:</el-tag>
<el-input v-model="postMaterial.answer"></el-input>
</div>
<div class="title analysis">
<el-tag type="success">解析:</el-tag><span>下方输入框中输入答案解析</span>
<el-input
type="textarea"
rows="4"
v-model="postMaterial.analysis"
placeholder="请输入答案解析"
resize="none"
class="answer">
</el-input>
</div>
<div class="submit">
<el-button type="primary" @click="materialSubmit()">立即添加</el-button>
</div>
</div>
<!-- 判断题 -->
<div class="change judge" v-if="optionValue == '判断题'">
<div class="title">
<el-tag>题目:</el-tag><span>在下面的输入框中输入题目</span>
<el-input
type="textarea"
rows="4"
v-model="postJudge.question"
placeholder="请输入题目内容"
resize="none"
class="answer">
</el-input>
</div>
<div class="judgeAnswer">
<el-radio v-model="postJudge.answer" label="T">正确</el-radio>
<el-radio v-model="postJudge.answer" label="F">错误</el-radio>
</div>
<div class="title">
<el-tag>解析:</el-tag><span>在下面的输入框中输入题目解析</span>
<el-input
type="textarea"
rows="4"
v-model="postJudge.analysis"
placeholder="请输入答案解析"
resize="none"
class="answer">
</el-input>
</div>
<div class="submit">
<el-button type="primary" @click="judgeSubmit()">立即添加</el-button>
</div>
</div>
</section>
</el-tab-pane>
<el-tab-pane name="second">
<span slot="label"><i class="iconfont icon-daoru-tianchong"></i>在线组卷</span>
<div class="box">
<ul>
<li>
<span>试题难度:</span>
<el-select v-model="difficultyValue" placeholder="试题难度" class="w150">
<el-option
v-for="item in difficulty"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</li>
<li>
<span>选择题数量:</span> <el-input type="text" v-model="changeNumber"></el-input>
</li>
<li>
<span>填空题数量:</span> <el-input type="text" v-model="fillNumber"></el-input>
</li>
<li>
<span>判断题数量:</span> <el-input type="text" v-model="judgeNumber"></el-input>
</li>
<li>
<span>材料题数量:</span> <el-input type="text" v-model="materialNumber"></el-input>
</li>
<li>
<el-button type="primary" @click="create()">立即组卷</el-button>
</li>
</ul>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
export default {
data() {
return {
changeNumber: null, //选择题出题数量
fillNumber: null, //填空题出题数量
judgeNumber: null, //判断题出题数量
materialNumber:null,//材料题出题数量
activeName: 'first', //活动选项卡
options: [ //题库类型
{
value: '选择题',
label: '选择题'
},
{
value: '填空题',
label: '填空题'
},
{
value: '判断题',
label: '判断题'
},
{
value:'材料题',
label:'材料题'
},
],
difficulty: [ //试题难度
{
value: '简单',
label: '简单'
},
{
value: '一般',
label: '一般'
},
{
value: '困难',
label: '困难'
}
],
difficultyValue: '简单',
levels: [ //难度等级
{
value: '1',
label: '1'
},
{
value: '2',
label: '2'
},
{
value: '3',
label: '3'
},
{
value: '4',
label: '4'
},
{
value: '5',
label: '5'
},
],
rights: [ //正确答案
{
value: 'A',
label: 'A'
},
{
value: 'B',
label: 'B'
},
{
value: 'C',
label: 'C'
},
{
value: 'D',
label: 'D'
},
],
paperId: null,
optionValue: '选择题', //题型选中值
subject: '', //试卷名称用来接收路由参数
postChange: { //选择题提交内容
subject: '', //试卷名称
level: '', //难度等级选中值
rightAnswer: '', //正确答案选中值
section: '', //对应章节
question: '', //题目
analysis: '', //解析
answerA: '',
answerB: '',
answerC: '',
answerD: '',
},
postFill: { //填空题提交内容
subject: '', //试卷名称
level: '', //难度等级选中值
answer: '', //正确答案
section: '', //对应章节
question: '', //题目
analysis: '', //解析
},
postMaterial: { //材料题提交内容
subject: '', //试卷名称
level: '', //难度等级选中值
answer: '', //正确答案
section: '', //对应章节
question: '', //题目
analysis: '', //解析
},
postJudge: { //判断题提交内容
subject: '', //试卷名称
level: '', //难度等级选中值
answer: '', //正确答案
section: '', //对应章节
question: '', //题目
analysis: '', //解析
},
postPaper: { //考试管理表对应字段
paperId: null,
questionType: null, // 试卷类型 1--选择题 2--填空题 3--判断题 4--材料题
questionId: null,
}
};
},
created() {
this.getParams()
},
methods: {
// handleClick(tab, event) {
// console.log(tab, event);
// },
create() {
this.$axios({
url: '/api/item',
method: 'post',
data: {
changeNumber: this.changeNumber,
fillNumber: this.fillNumber,
judgeNumber: this.judgeNumber,
materialNumber:this.materialNumber,
paperId: this.paperId,
subject: '计算机网络' //题目数量太少,指定为计算机网络出题
}
}).then(res => {
console.log(res)
let data = res.data
if(data.code==200){
setTimeout(() => {
this.$router.push({path: '/selectAnswer'})
},1000)
this.$message({
message: data.message,
type: 'success'
})
}else if(data.code==400){
this.$message({
message: data.message,
type: 'error'
})
}
})
},
getParams() {
let subject = this.$route.query.subject //获取试卷名称
let paperId = this.$route.query.paperId //获取paperId
this.paperId = paperId
this.subject = subject
this.postPaper.paperId = paperId
},
changeSubmit() { //选择题题库提交
this.postChange.subject = this.subject
this.$axios({ //提交数据到选择题题库表
url: '/api/MultiQuestion',
method: 'post',
data: {
...this.postChange
}
}).then(res => { //添加成功显示提示
let status = res.data.code
if(status == 200) {
this.$message({
message: '已添加到题库',
type: 'success'
})
this.postChange = {}
}
}).then(() => {
this.$axios(`/api/multiQuestionId`).then(res => { //获取当前题目的questionId
let questionId = res.data.data.questionId
this.postPaper.questionId = questionId
this.postPaper.questionType = 1
this.$axios({
url: '/api/paperManage',
method: 'Post',
data: {
...this.postPaper
}
})
})
})
},
fillSubmit() { //填空题提交
this.postFill.subject = this.subject
this.$axios({
url: '/api/fillQuestion',
method: 'post',
data: {
...this.postFill
}
}).then(res => {
let status = res.data.code
if(status == 200) {
this.$message({
message: '已添加到题库',
type: 'success'
})
this.postFill = {}
}
}).then(() => {
this.$axios(`/api/fillQuestionId`).then(res => { //获取当前题目的questionId
let questionId = res.data.data.questionId
this.postPaper.questionId = questionId
this.postPaper.questionType = 2
this.$axios({
url: '/api/paperManage',
method: 'Post',
data: {
...this.postPaper
}
})
})
})
},
materialSubmit() { //材料题提交
this.postMaterial.subject = this.subject
this.$axios({
url: '/api/materialQuestion',
method: 'post',
data: {
...this.postMaterial
}
}).then(res => {
let status = res.data.code
if(status == 200) {
this.$message({
message: '已添加到题库',
type: 'success'
})
this.postMaterial = {}
}
}).then(() => {
this.$axios(`/api/materialQuestionId`).then(res => { //获取当前题目的questionId
let questionId = res.data.data.questionId
this.postPaper.questionId = questionId
this.postPaper.questionType = 4
this.$axios({
url: '/api/paperManage',
method: 'Post',
data: {
...this.postPaper
}
})
})
})
},
judgeSubmit() { //判断题提交
this.postJudge.subject = this.subject
this.$axios({
url: '/api/judgeQuestion',
method: 'post',
data: {
...this.postJudge
}
}).then(res => {
let status = res.data.code
if(status == 200) {
this.$message({
message: '已添加到题库',
type: 'success'
})
this.postJudge = {}
}
}).then(() => {
this.$axios(`/api/judgeQuestionId`).then(res => { //获取当前题目的questionId
let questionId = res.data.data.questionId
this.postPaper.questionId = questionId
this.postPaper.questionType = 3
this.$axios({
url: '/api/paperManage',
method: 'Post',
data: {
...this.postPaper
}
})
})
})
}
},
};
</script>
目前添加题库使用人工输入进行测试,之后将会调用大模型生成题目,无需人工出题。
三、未来开发计划
之后将会对学生端进行进一步的开发,目前已经开始了学生端的设计,计划为学生端添加试卷查看以及试卷作答等功能。