-- fix 开课选择评估和考试

This commit is contained in:
yuping
2023-02-21 17:34:14 +08:00
parent b1c7888c11
commit 74c9b161d3
5 changed files with 1291 additions and 400 deletions

View File

@@ -20,7 +20,7 @@
</div>
<div class="main_item">
<button class="xkbtn" @click="goResearchmanage">新建评估</button>
<button class="xkbtn" style="margin:0" @click="goResearchmanage">新建评估</button>
</div>
<div class="main_notice" style="display: none">

View File

@@ -1,261 +1,89 @@
<!-- 评估列表 -->
<template>
<a-drawer
:visible="assessmentVisible"
class="drawerStyle addinvistDrawer"
width="70%"
title="添加评估"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div @click="openDrawer">
<slot></slot>
</div>
<a-drawer :visible="visible" class="drawerStyle addinvistDrawer" width="900px" title="添加评估" placement="right">
<div class="drawerMain">
<div class="header">
<div v-if="edit" class="headerTitle">编辑评估</div>
<div v-else class="headerTitle">添加评估</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
<div class="headerTitle">{{assessmentId?'编辑评估':'添加评估'}}</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"/>
</div>
<div class="contentMain">
<div class="main">
<div class="main_left">
<div class="main_item">
<div class="fi_input">
<a-input
v-model:value="inputV1"
style="width: 424px; height: 40px; border-radius: 8px;"
placeholder="请输入评估名称"
maxlength="20"
/>
</div>
<div class="btns" @click="getAllInvistText">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btnsn" @click="resetInvist">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
</div>
<div class="main_table">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()"
:data-source="tableData"
:loading="tableDataTotal === -1 ? true : false"
expandRowByClick="true"
@expand="expandTable"
:pagination="false"
:row-selection="rowSelection"
filterMultiple:false
/>
<div class="tableBox" style="margin-top:85px;">
<div class="pa">
<a-pagination
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="pageSize"
:current="currentPage"
:total="tableDataTotal"
class="pagination"
@change="handelChangePage"
/>
</div></div>
<AssessmentAll v-model:id="formData.assessmentId" v-model:name="formData.assessmentName"/>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="submitCheck">确定</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
import * as api from "../../api/indexInvist.js";
import dayjs from "dayjs";
export default {
name: "AssessmentList",
// components: {
// },
props: {
assessmentVisible: {
type: Boolean,
default: false,
<script setup>
import {defineEmits, defineProps, ref, watch} from "vue";
import {Form, message} from "ant-design-vue";
import AssessmentAll from "@/components/drawers/AssessmentAll.vue";
const props = defineProps({
assessmentId: String,
assessmentName: String,
})
const visible = ref(false)
const formData = ref({
assessmentId: '',
assessmentName: '',
})
const emit = defineEmits({})
const rulesRef = ref({
assessmentId: [
{
required: true,
message: '请选择评估',
},
assessmentId: {
type: Number,
default: null,
],
assessmentName: [
{
required: true,
message: '请选择评估',
},
assessmentName: {
type: String,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
assessmentVisible: false,
assessment: null,
inputV1: "",
currentPage: 1,
pageSize: 10,
tableDataTotal: 0,
tableData: [],
selectedRowKeys: [],
assessmentName:null,
assessmentId:null,
],
});
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch(props,()=>{
formData.value.assessmentId = props.assessmentId
formData.value.assessmentName = props.assessmentName
})
const closeDrawer = () => {
ctx.emit("update:assessmentVisible", false);
visible.value = false
resetFields()
};
const afterVisibleChange = (bool) => {
console.log("state getAllInvistText", bool);
if (props.assessmentVisible) {
getAllInvistText();
}
};
const tableDataFunc = () => {
const columns = [
{
title: "名称",
dataIndex: "name",
// width: "30%",
key: "name",
width: "40%",
className: "classify",
ellipsis: true,
},
{
title: "题数",
dataIndex: "num",
key: "num",
width: "20%",
align: "center",
ellipsis: true,
},
{
title: "创建人",
dataIndex: "creator",
key: "creator",
width: "20%",
align: "center",
ellipsis: true,
},
{
title: "创建时间",
dataIndex: "time",
key: "time",
width: "20%",
align: "center",
ellipsis: true,
},
];
return columns;
};
const rowSelection = {
type: "radio",
onSelect: (selectedRows) => {
state.assessment = selectedRows;
console.log("selectedRows=======", state.assessment);
ctx.emit("checkedAss", state.assessment);
state.selectedRowKeys = [];
},
};
const submitCheck=()=>{
ctx.emit("update:assessmentId", state.assessment.assessmentId);
ctx.emit("update:assessmentName", state.assessment.name);
closeDrawer();
}
const handelChangePage = (page, pageSize) => {
state.currentPage = page;
state.pageSize = pageSize;
getAllInvistText();
};
const getTableDate = (tableData) => {
let data = tableData;
let array = [];
data.map((value, index) => {
let n1 = value.essayQuestionVoList
? Number(value.essayQuestionVoList.length)
: 0 ;
let n2 = value.multipleStemVoList
? Number(value.multipleStemVoList.length)
: 0;
let n3 = value.scoringQuestionVoList
? Number(value.scoringQuestionVoList.length)
: 0;
let n4 = value.singleStemVoList
? Number(value.singleStemVoList.length)
: 0;
let num = n1 + n2 + n3 +n4;
let obj = {
key: index,
assessmentId: value.assessmentId,
num: num,
name: value.assessmentName ? value.assessmentName : "-",
creator: value.createUserName ? value.createUserName : "-",
time: dayjs(value.createTime).format("YYYY-MM-DD HH:mm"),
};
array.push(obj);
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
(state.selectedRowKeys = []), (state.tableData = array);
};
//获取全部评估信息接口
const getAllInvistText = () => {
api
.queryAssessmentDetailList({
assessmentName: state.inputV1,
pageNo: state.currentPage,
pageSize: state.pageSize,
releaseStatus: 2 ,
searchEndTime:"",
})
.then((res) => {
let arr = res.data.data.rows;
if (res.status === 200) {
// console.log("获取全部评估信息", res.data.data);
getTableDate(arr);
state.tableDataTotal = Number(res.data.data.total);
emit('update:assessmentId', formData.value.assessmentId)
emit('update:assessmentName', formData.value.assessmentName)
closeDrawer()
}
})
.catch((err) => {
console.log("获取全部评估信息接口失败", err);
// state.createLoading = false;
});
};
//重置评估信息
const resetInvist = () => {
state.inputV1 = "";
getAllInvistText();
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
tableDataFunc,
rowSelection,
getAllInvistText,
resetInvist,
handelChangePage,
submitCheck,
};
},
};
function openDrawer() {
visible.value = true
}
defineExpose({openDrawer})
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addinvistDrawer {
.drawerMain {
.header {
@@ -264,6 +92,7 @@ export default {
display: flex;
justify-content: space-between;
align-items: center;
.headerTitle {
font-size: 18px;
font-weight: 600;
@@ -272,18 +101,23 @@ export default {
margin-left: 24px;
}
}
.contentMain {
.main {
width: 100%;
.main_left {
padding-right: 30px;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
margin-bottom: 32px;
.fi_input {
margin-right: 20px;
}
.btns {
margin-right: 20px;
padding: 0px 26px 0px 26px;
@@ -297,12 +131,14 @@ export default {
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 15px;
height: 17px;
background-image: url("../../assets/images/courseManage/search0.png");
background-size: 100% 100%;
}
.btnText {
font-size: 14px;
font-weight: 400;
@@ -311,6 +147,7 @@ export default {
margin-left: 5px;
}
}
.btnsn {
padding: 0px 26px 0px 26px;
height: 38px;
@@ -323,12 +160,14 @@ export default {
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 16px;
height: 18px;
background-image: url("../../assets/images/courseManage/reset1.png");
background-size: 100% 100%;
}
.btnText {
font-size: 14px;
font-weight: 400;
@@ -338,56 +177,57 @@ export default {
}
}
}
.main_item2 {
.pa {
width: 100%;
margin: 15px auto;
.main_notice {
display: flex;
justify-content: center;
}
}
}
}
.main_table {
position: relative;
padding-bottom: 80px;
.ant-checkbox-wrapper {
justify-content: space-between;
align-items: center;
margin-top: -2px;
}
.ant-table-selection-column {
padding: 0px !important;
padding-left: 5px !important;
}
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1);
}
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.pa {
left: 0;
width: 100%;
margin-bottom: 3px;
height: 40px;
background-color: #e9f6fe;
.mntc_left {
display: flex;
justify-content: center;
position: absolute;
bottom: 20px;
align-items: center;
.title {
color: rgba(0, 0, 0, 0.65);
margin-right: 17px;
}
.data {
color: #4ea6ff;
}
.notice_icon {
width: 14px;
height: 14px;
margin-right: 9px;
margin-left: 9px;
background-image: url(@/assets/images/coursewareManage/gan.png);
background-size: 100% 100%;
}
}
.mntc_right {
cursor: pointer;
}
}
}
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
@@ -397,6 +237,7 @@ export default {
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;

View File

@@ -0,0 +1,392 @@
<template>
<div @click="openDrawer">
<slot></slot>
</div>
<a-drawer :visible="visible" class="drawerStyle addhomeworkDrawer" width="800" placement="right">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ info.workName ? "编辑" : "添加" }}任务</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"/>
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">作业名称</span>
</div>
<div class="btnbox">
<a-input v-model:value="formData.workName" style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入作业名称" autocomplete="off" show-count :maxlength="20"/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">开始时间</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{ format: 'hh:mm' }"
:disabled-date="disabledDate"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY/MM/DD HH:mm"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">作业要求</span>
</div>
<div class="textarea">
<a-textarea v-model:value="formData.workRequirement" placeholder="请输入作业要求" autocomplete="off"
allow-clear :rows="6" show-count :maxlength="200"/>
</div>
</div>
<div class="mbl_items">
<div class="item_nam">
<span style="margin-right: 10px"></span>
</div>
<div class="item_inp">
<FJUpload v-model:value="formData.workEnclosureAddress"/>
</div>
</div>
<div style="width:100%;height: 80px;"></div>
</div>
</div>
<div class="main_btns" style="background:#fff;">
<a-button class="btn1" @click="closeDrawer">取消</a-button>
<a-button class="btn2" html-type="submit" @click="confirm">确定</a-button>
</div>
</div>
</a-drawer>
</template>
<script setup>
import {defineEmits, defineProps, ref, watch} from "vue";
import dayjs from "dayjs";
import FJUpload from "@/components/common/FJUpload";
import {Form, message} from "ant-design-vue";
const props = defineProps({
info: {}
})
const visible = ref(false)
const initValue = {
workName: '',
submitStartTime: '',
submitEndTime: '',
workRequirement: '',
workEnclosureAddress: '',
}
const formData = ref(initValue)
const emit = defineEmits({})
const dateTime = ref([]);
const rulesRef = ref({
workName: [
{
required: true,
message: '请输入作业名称',
},
],
submitStartTime: [
{
required: true,
message: '请输入开始时间',
},
],
submitEndTime: [
{
required: true,
message: '请输入结束时间',
},
],
workRequirement: [
{
required: true,
message: '请输入作业要求',
},
],
});
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch([props, visible], () => {
resetFields(props.info)
dateTime.value = [props.info?.submitStartTime || '', props.info?.submitEndTime || '']
})
const closeDrawer = () => {
visible.value = false
resetFields()
dateTime.value = []
};
function timeChange(time, timeStr) {
formData.value.submitStartTime = timeStr[0]
formData.value.submitEndTime = timeStr[1]
}
const disabledDate = (current) => {
return current && current < dayjs().startOf('day');
};
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
emit('update:info', {...formData.value})
closeDrawer()
}
function openDrawer() {
visible.value = true
}
defineExpose({openDrawer})
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addhomeworkDrawer {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.mbl_items {
display: flex;
align-items: center;
justify-content: flex-end;
margin-bottom: 10px;
.item_nam {
width: 100px;
display: flex;
align-items: center;
justify-content: flex-end;
white-space: nowrap;
.asterisk_icon {
width: 10px;
height: 10px;
margin-right: 5px;
margin-top: -15px;
}
}
.item_inp {
flex: 1;
position: relative;
margin-left: -25px;
.inp_num {
position: absolute;
left: 398px;
top: 10px;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 373px;
.ant-input {
width: 100%;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
margin-left: 124px;
}
}
}
}
}
.main_btns {
position: absolute;
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>

View File

@@ -0,0 +1,695 @@
<template>
<div @click="openDrawer">
<slot></slot>
</div>
<a-drawer
:visible="visible"
class="drawerStyle addtestDrawer"
width="800"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ info.examinationName >= 0 ? "编辑" : "添加" }}考试</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div style="display: flex; flex-direction: row; padding-top: 0px; margin-top: 20px; margin-left: 32px;">
<div>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(1)"
:class="formData.examType === 1 ? 'outer' : 'notOuter'"
>
系统考试
</button>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(2)"
:class="formData.examType === 2 ? 'outer' : 'notOuter'"
>
外部考试
</button>
</div>
</div>
<div v-if="formData.examType===1" class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">选择试卷</span>
</div>
<s-test v-model:id="formData.examinationTestId" v-model:name="formData.examinationTestName">
<div class="btnbox">
<button class="xkbtn">
{{ formData.examinationTestId ? "重选" : "选择" }}试卷
</button>
</div>
</s-test>
<div v-if="formData.examinationTestId">
<a-tag closable color="processing" @close="delTag" :closeIcon="true">
<span style="font-size: 14px; line-height: 33px">{{ formData.examinationTestName }}</span>
</a-tag>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试时间</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{format:'hh:mm'}"
:disabled-date="disabledDate"
format="YYYY/MM/DD HH:mm"
valueFormat="YYYY/MM/DD HH:mm"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试时长</span>
</div>
<div class="select">
<a-input-number
:min="0"
:max="300"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.examinationDuration"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">及格线</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考试说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.examinationExplain"
placeholder="请输入考试说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px;margin-top: 10px;">考试限制</span>
</div>
<div class="kqszbox">
<div class="setbox">
<div class="timerbox">
<span>允许重复考试</span>
<a-input-number
:min="-1"
:max="300"
:precision="0"
style="
width: 100px;
height: 32px;
border-radius: 8px;
overflow: hidden;"
v-model:value="formData.examinationLimit"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>,-1表示无限制</span
>
</div>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">显示答案</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.showAnswers"
>
<a-radio :value="1">允许查看</a-radio>
<a-radio :value="2">不允许查看</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">显示解析</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.showAnalysis"
>
<a-radio :value="1">允许查看</a-radio>
<a-radio :value="2">不允许查看</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">评分模式</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.scoringModel"
>
<a-radio :value="1">最高一次</a-radio>
<a-radio :value="2">最后一次</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">试题排列</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.questionArrangement"
>
<a-radio :value="1">试题乱序</a-radio>
<a-radio :value="2">选项乱序</a-radio>
<a-radio :value="3">全部乱序</a-radio>
<a-radio :value="4">不乱序</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item" style="height: 20px;"></div>
</div>
</div>
<div v-else class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">数据来源</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.source"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入数据来源"
:maxlength="20"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考试说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.externalExplain"
placeholder="请输入考试说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<a-button class="btn1" @click="closeDrawer">取消</a-button>
<a-button class="btn2" @click="confirm">确定</a-button>
</div>
</div>
</a-drawer>
</template>
<script setup>
import {defineEmits, defineProps, ref, watch} from "vue";
import STest from "./SelectTest.vue";
import dayjs from "dayjs";
import {Form, message} from "ant-design-vue";
const props = defineProps({
info: {}
})
const visible = ref(false)
const initValue = {
examinationName: '',
examinationTestId: '',
examinationStartTime: '',
examinationEndTime: '',
examinationDuration: '',
passLine: '',
examType: 1,
source: "",
showAnswers: 2,
showAnalysis: 2,
scoringModel: 2,
questionArrangement: 4,
externalExplain: ""
}
const formData = ref(initValue)
const innerRule = {
examinationName: [
{
required: true,
message: '请输入考试名称',
},
],
examinationTestId: [
{
required: true,
message: '请输入选择试卷',
},
],
examinationStartTime: [
{
required: true,
message: '请输入开始开始时间',
},
],
examinationEndTime: [
{
required: true,
message: '请输入开始结束时间',
},
],
examinationDuration: [
{
required: true,
message: '请输入考试时长',
},
],
passLine: [
{
required: true,
message: '请输入及格线',
},
],
}
const outerRule = {
examinationName: [
{
required: true,
message: '请输入考试名称',
},
],
source: [
{
required: true,
message: '请输入数据来源',
},
],
}
const rulesRef = ref(innerRule);
const emit = defineEmits({})
const dateTime = ref([]);
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch(() => formData.value.examType, () => {
formData.value.examType === 1 ? rulesRef.value = innerRule : rulesRef.value = outerRule
})
watch([props, visible], () => {
resetFields(props.info)
dateTime.value = [props.info?.examinationStartTime || '', props.info?.examinationEndTime || '']
})
const closeDrawer = () => {
visible.value = false
resetFields()
dateTime.value = []
};
function timeChange(time, timeStr) {
formData.value.examinationStartTime = timeStr[0]
formData.value.examinationEndTime = timeStr[1]
}
const disabledDate = (current) => {
return current && current < dayjs().startOf('day');
};
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
emit('update:info', {...formData.value})
closeDrawer()
}
function openDrawer() {
visible.value = true
}
const delTag = () => {
formData.value.examinationTestId = '';
formData.value.examinationTestName = '';
}
function changeOuter(v) {
formData.value.examType = v;
}
defineExpose({openDrawer})
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.outer {
background-color: #4ea6ff;
color: #fff;
border-radius: 5px;
border: 1px solid #a09292;
height: 36px;
margin-right: 10px;
}
.notOuter {
color: #000;
border-radius: 5px;
border: 1px solid #a09292;
background: #fff;
margin-right: 10px;
padding: 3px;
}
.tag-style {
color: rgb(113, 113, 237);
background-color: #d7d1f7;
}
.addtestDrawer {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 400px;
.ant-input {
width: 100%;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.main_table {
position: relative;
padding-bottom: 80px;
.ant-checkbox-wrapper {
align-items: center;
margin-top: -2px;
}
.ant-table-selection-column {
padding: 0px !important;
padding-left: 5px !important;
}
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1);
}
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.pa {
left: 0;
width: 100%;
display: flex;
justify-content: center;
position: absolute;
bottom: 20px;
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>

View File

@@ -953,7 +953,9 @@
<div v-if="checked4" class="cstm_items main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="showAssessment">选择评估</button>
<AssessmentList v-model:assessmentName="assessmentName" v-model:assessmentId="assessmentId">
<button class="xkbtn" @click="showAssessment" style="margin-bottom: 0;margin-top: 0">选择评估</button>
</AssessmentList>
<div v-if="assessmentId > 0">
<a-tag closable @close="removePG" color="processing">
<span style="font-size: 14px; line-height: 33px">
@@ -961,54 +963,40 @@
</span>
</a-tag>
</div>
<AssessmentList
v-model:assessmentVisible="assessmentVisible"
v-model:assessmentName="assessmentName"
:assessmentId="assessmentId"
@checkedAss="getCheckedAss"
/>
</div>
</div>
<div class="cstm_items main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="showDrawerAddHomework">
<add-homework v-model:info="workInfo">
<button class="xkbtn" style="margin-bottom: 0;margin-top: 0">
配置作业
</button>
<div v-if="EditWorkId > 0">
</add-homework>
<div v-if="workInfo.workName">
<a-tag closable @close="logW" color="processing">
<span style="font-size: 14px; line-height: 33px">
{{ workName }}
{{ workInfo.workName }}
</span>
</a-tag>
</div>
<add-homework
v-model:addhomeworkVisible="addhomeworkvisible"
@getWork="getWork"
:faceLevel="true"
v-model:EditWorkId="EditWorkId"
v-model:workName="workName"
/>
</div>
</div>
<div class="cstm_items main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="showDrawerAddTest">配置考试</button>
<div v-if="EditTestId > 0">
<add-test v-model:info="examInfo">
<button class="xkbtn" style="margin-bottom: 0;margin-top: 0">配置考试</button>
</add-test>
<div v-if="examInfo.examinationName">
<a-tag closable @close="logT" color="processing">
<span style="font-size: 14px; line-height: 33px">
{{ testName }}
{{ examInfo.examinationName }}
</span>
</a-tag>
</div>
<add-test
v-model:addtestVisible="addtestvisible"
v-model:EditTestId="EditTestId"
v-model:testName="testName"
:faceLevel="true"
/>
</div>
</div>
<!--
@@ -1036,7 +1024,7 @@
</a-checkbox>
</div>
</div> -->
<div class="cstm_items items_fj">
<div class="cstm_items items_fj" style="height:80px">
<div class="signbox">
<span style="margin-right: 3px"></span>
</div>
@@ -1503,15 +1491,11 @@ import {
computed,
} from "vue";
import * as api from "../../api/indexInvist.js";
import * as apis from "../../api/indexTaskManage";
import {message} from "ant-design-vue";
import {useRouter, useRoute} from "vue-router";
import CommonStudent from "@/components/student/CommonStudent";
import OwnerTableModelStudent from "@/components/student/OwnerTableModelStudent";
// import StuAdd from "../../components/drawers/StuAdd";
// import OwnPower from "../../components/drawers/OwnPower.vue";
// import Corpowerlist from "../../components/drawers/CorPowerlist.vue";
import addOnlineCourse from "../../components/Modals/addOnlineCourse.vue";
import ProjOwnerShip from "../../components/drawers/ProjectOwn";
@@ -1550,11 +1534,11 @@ import SeeModal from "./components/seeModal.vue";
import CourseModal from "./courseModal.vue";
import * as moment from "moment";
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
import {codeUrl, toDate} from "../../api/method";
import {codeUrl, toDate} from "@/api/method";
import {queryWorkDetailById} from "@/api/indexWork";
import {queryExaminationDetailById} from "@/api/indexExam";
import AddHomework from "../../components/drawers/AddHomework.vue";
import AddTest from "../../components/drawers/AddTest.vue";
import AddHomework from "../../components/drawers/CommonHomework.vue";
import AddTest from "../../components/drawers/CommonTest.vue";
import TableStudent from "@/components/student/TableStudent";
import FJUpload from "@/components/common/FJUpload";
import {updateStudent} from "@/api/indexProjStu";
@@ -1562,7 +1546,6 @@ import {useStore} from "vuex";
import DropDown from "@/components/common/DropDown";
import {checkPer} from "@/utils/utils";
import dayjs from "dayjs";
// import { commonExport } from '@/utils/commonExcel'
//列表表格
const columns1 = [
@@ -2171,6 +2154,8 @@ export default defineComponent({
const store = useStore();
const state = reactive({
workInfo:{},
examInfo:{},
tableLoading: false,
//新加
stuColumns: [
@@ -3193,13 +3178,11 @@ export default defineComponent({
const showDrawerAddTest = () => {
state.addtestvisible = true;
};
const logW = (e) => {
state.EditWorkId = null;
console.log(e);
const logW = () => {
state.workInfo = {}
};
const logT = (e) => {
state.EditTestId = 0;
console.log(e);
const logT = () => {
state.examInfo = {}
};
const removePG = () => {
console.log("11111");
@@ -3670,13 +3653,7 @@ export default defineComponent({
startTime = dayjs(state.xjkkinputV3[0]).format('YYYY-MM-DD HH:mm') //parseInt(state.xjkkinputV3[0].$d.getTime() / 1000);
endTime = dayjs(state.xjkkinputV3[1]).format('YYYY-MM-DD HH:mm') //parseInt(state.xjkkinputV3[1].$d.getTime() / 1000);
}
// console.log("state.validate", state.validate);
// if (!state.validate) {
// message.destroy();
// return message.warning("该开课名称已存在");
// }
const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(res => {
const offName = await validateName({ name: state.xjkkinputV1, type: 5 ,id:state.offcoursePlanId}).then(res => {
console.log(res,res.data.data);
return res.data.data === 1;
});
@@ -3706,6 +3683,8 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
// signWordFlag: state.xjkkradioV1 === 1 ? 1 : 0, //签到是否需要口令:1是0否
teacherId: state.member.value,
teacher: state.member.name,
workInfo: state.workInfo,//提交的作业信息
examInfo: state.examInfo//提交的考试信息
};
console.log(postData);
const checkList = [
@@ -3735,30 +3714,14 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
state.offcourseId = item.offcourseId;
state.offcoursePlanId = item.id;
if (item.evaluateId) {
api
.queryAppraiseDetailById({assessmentId: item.evaluateId})
.then((res) => {
state.assessmentName = res.data.data.assessmentName;
})
.catch();
}
if (item.homeWorkId) {
queryWorkDetailById({workId: item.homeWorkId}).then((res) => {
state.workName = res.data.data.workName;
});
queryWorkDetailById({workId: item.homeWorkId}).then((res) => state.workInfo = res.data.data);
}
if (item.testId) {
queryExaminationDetailById({examinationId: item.testId}).then(
(res) => {
state.testName = res.data.data.examinationName;
}
);
queryExaminationDetailById({examinationId: item.testId}).then((res) => state.examInfo = res.data.data);
}
console.log("res");
console.log("获取面授课开课详情", item);
state.xjkkinputV2 = item.address;
state.checked1 = item.applyFlag === 1 ? true : false;
let arrss = item.attach.split(",");
@@ -3781,7 +3744,8 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
(state.comLeave =
item.completeType.split(",")[1] == "1" ? true : false),
(state.checked4 = item.evalFlag === 1 ? true : false);
state.assessmentId = String(item.evaluateId);
state.assessmentName = item.assessmentName;
state.assessmentId = String(item.assessmentId);
state.EditTestId = Number(item.testId);
state.EditWorkId = String(item.homeWorkId);
state.xjkkinputV1 = item.name;
@@ -4675,7 +4639,6 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
};
const disabledDate = (current) => {
// Can not select days before today and today
console.log("1111", dayjs().endOf("day"));
return current && current < dayjs().startOf("day");
};