防作弊、互评调整:

作弊统计 放到测验结果里
课程作业保存时 互评 和查重 否时清数据
作答时限后加提示 限时多少分钟内进行提交,超过时间则算一次作弊
This commit is contained in:
1378012178@qq.com 2025-01-15 17:02:35 +08:00
parent a481d31fb2
commit e7ccc3a38e
3 changed files with 93 additions and 25 deletions

View File

@ -155,7 +155,7 @@
</a-col>
<a-col :span="24" class="jbxx-cytm">
<a-form-item label="作答时限">
<a-input-number id="inputNumber" v-model:value="zyInfo.zdsx" :min="0" :max="120" :controls="false" :precision="0" :disabled="editDisabled"/>
<a-input-number id="inputNumber" v-model:value="zyInfo.zdsx" :min="0" :max="120" :controls="false" :precision="0" :disabled="editDisabled"/><span style="margin-left: 10px; color:#AAAAAA;">限时多少分钟内进行提交超过时间则算一次作弊</span>
</a-form-item>
</a-col>
<a-col :span="24" class="jbxx-ms">
@ -622,7 +622,7 @@
</a-col>
<a-col :span="24" style="text-align: center; margin-top: 10px; margin-bottom: 40px">
<a-button type="primary" @click="submitForm" v-if="!editDisabled">保存2</a-button>
<a-button type="primary" @click="submitForm" v-if="!editDisabled">保存</a-button>
<a-button type="primary" @click="reloadZy" style="margin-left: 15px">返回</a-button>
</a-col>
</a-row>

View File

@ -1,5 +1,5 @@
<template>
<div >
<div>
<div class="jeecg-basic-table-form-container">
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
@ -29,7 +29,8 @@
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls" style="margin-left: 8px"> 导出</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"
style="margin-left: 8px"> 导出</a-button>
<!-- <a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button> -->
</a-col>
</span>
@ -38,17 +39,26 @@
</a-form>
</div>
<a-spin :spinning="loadingCeshi">
<!--引用表格-->
<BasicTable @register="registerTable">
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</a-spin>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
</a-spin>
<!-- 表单区域 -->
<WjxWjxxTmlbDjjgModal ref="WjxWjxxTmlbDjjgModalPage" @success="reload"></WjxWjxxTmlbDjjgModal>
<ZgtpfModal ref="ZgtpfModalPage" @success="reload"></ZgtpfModal>
<a-modal :title="'违规信息'" :visible="wgxxOpen" @ok="wgxxOpen = false" @cancel="wgxxOpen = false" cancelText="关闭">
<div class="timeline">
<div v-for="item of wgxxData" :key="item.id" class="timeline-item">
<div class="timeline-point"></div>
<div class="timeline-content">{{ item.content }}</div>
</div>
</div>
</a-modal>
</div>
</template>
@ -62,6 +72,8 @@ import { list, getExportUrl } from './WjxWjxxTmlbDjjgs.api';
import WjxWjxxTmlbDjjgModal from '/@/views/kc/wjxWjxx/components/WjxWjxxTmlbDjjgModal.vue';
import ZgtpfModal from '/@/views/kc/wjxWjxx/components/ZgtpfModal.vue';
const wgxxOpen = ref(false)
const wgxxData = ref([])
const queryParam = ref<any>({});
const isFinished = ref<string>('');
const toggleSearchStatus = ref<boolean>(false);
@ -162,6 +174,14 @@ function handleHqjg(record){
})
}
async function handleWeiGui(info){
wgxxData.value = []
let res = await defHttp.get({ url: '/wjxDjxxFzbtj/wjxDjxxFzbtj/list', params: { vid: info.vid, createBy: info.userId, pageNo: 1, pageSize: -1 } });
console.log("🎅 ~ handleWeiGui ~ res:", res)
wgxxData.value = res.records
wgxxOpen.value = true
}
/**
* 操作栏
*/
@ -172,6 +192,11 @@ function getTableAction(record) {
label: '答卷结果',
onClick: handlePeizhiDjjg.bind(null, record),
},
{
label: '违规信息',
onClick: handleWeiGui.bind(null, record),
ifShow:record.zbcs > 0
},
// {
// label: '',
// onClick: handleHqjg.bind(null, record),
@ -220,4 +245,50 @@ defineExpose({
text-align: center;
}
}
.timeline {
position: relative;
padding-left: 40px; /* 调整左侧内边距以适应新的时间点位置 */
padding-bottom: 20px;
}
.timeline::before {
content: '';
position: absolute;
width: 2px; /* 灰线变细 */
height: calc(100% - 40px);
background-color: #dfe1e6;
top: 8px; /* 确保灰线上下有适当的间距 */
bottom: 8px; /* 确保灰线下方也有相同的间距 */
left: 55px; /* 让灰线从时间点的中心穿过14px (时间点左边距) + 6px (时间点半径) = 20px */
z-index: 1;
}
.timeline-item {
margin-top: 25px;
margin-bottom: 25px;
position: relative;
}
.timeline-item:last-child {
margin-bottom: 0;
}
.timeline-point {
width: 10px; /* 圆点大小 */
height: 10px; /* 圆点大小 */
background-color: #1890ff;
border-radius: 50%;
position: absolute;
top: 4px; /* 保持时间点的垂直位置以对齐文本 */
left: 17px; /* 设置时间点距离左边界的距离,使其中心与灰线对齐 */
transform: translateX(-50%); /* 将时间点中心对齐灰线 */
z-index: 2;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); /* 添加阴影效果 */
}
.timeline-content {
padding-left: 28px; /* 减少左侧内边距,使内容更贴近时间点 */
line-height: 1.5715; /* 设置行高,确保文本对齐 */
}
</style>

View File

@ -967,10 +967,15 @@ async function handleBohui(record: Recordable) {
okText: '确认',
cancelText: '取消',
onOk: async () => {
let stuZyIds = await defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/getZyStuIdById', data: { zyinfoId: record.mainId, xh: record.createBy } })
stuZyIds.forEach(async stu => {
await defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editBohui', params: { id: stu.id } })
})
let zyinfo = await defHttp.get({ url: '/zyInfo/zyInfo/queryById', params: { id: record.mainId } })
if(zyinfo.xzxstjzy == 'Y'){
let stuZyIds = await defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/getZyStuIdById', data: { zyinfoId: record.mainId, xh: record.createBy } })
stuZyIds.forEach(async stu => {
await defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editBohui', params: { id: stu.id } })
})
}else{
await defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editBohui', params: { id: record.id } })
}
createMessage.success('作业驳回成功!')
handleSuccess();
},
@ -1414,14 +1419,7 @@ async function submitForm() {
return;
}
}
} else {
//
model.wwtgl = null;
model.wwcc = null;
model.xncc = null;
model.nwcc = null;
model.aigccc = null;
}
}
var xshpkssj = model.xshpkssj;
var xshpjssj = model.xshpjssj;
@ -1456,7 +1454,6 @@ async function submitForm() {
return;
}
}
await saveOrUpdate(model, isUpdate.value)
.then((res) => {
if (res.success) {