瀏覽代碼

feat(考试管理): 重构考试和问卷管理功能

- 将问卷管理界面改为考试管理风格,统一UI和功能
- 新增考试状态显示和筛选功能
- 添加工具栏配置到store并在各题型编辑器中使用
- 移除调试日志和多余的空格
- 优化表单字段,增加课程选择和日期限制
- 统一试卷选择逻辑,使用单选模式
tanshanming 7 月之前
父節點
當前提交
d863475a4b

+ 1 - 2
src/components/Editor/index.vue

@@ -44,7 +44,7 @@
 			default:
 				'undo redo |  forecolor backcolor bold italic underline strikethrough link | blocks fontfamily fontsize | \
 				alignleft aligncenter alignright alignjustify outdent indent lineheight | bullist numlist | \
-				image table  preview | code selectall | numberedline | kityformula-editor'
+				image table  preview | code selectall'
 		},
 		fileUploadFunction: {
 			type: Function,
@@ -74,7 +74,6 @@
 		automatic_uploads: false,
 		images_upload_handler(blobInfo, progress) {
 			return new Promise((resolve, reject) => {
-				console.log('调用上传文件回显:', blobInfo.blob)
 				const param = new FormData()
 				param.append('file', blobInfo.blob(), blobInfo.filename())
 				props

+ 4 - 0
src/store/exam.js

@@ -20,6 +20,10 @@ const format = function (array, key) {
 
 export const useExamStore = defineStore('exam', {
 	state: () => ({
+		toolbar:
+			'undo redo |  forecolor backcolor bold italic underline strikethrough link | blocks fontfamily fontsize | \
+				alignleft aligncenter alignright alignjustify outdent indent lineheight | bullist numlist | \
+				image table  preview | code selectall | numberedline | kityformula-editor',
 		// 学科相关
 		subjects: [],
 		// 枚举相关

+ 0 - 2
src/utils/newRequest.js

@@ -1,4 +1,3 @@
- 
 // 统一的请求发送
 import axios from 'axios'
 import qs from 'qs'
@@ -69,7 +68,6 @@ const error = () => {
 // HTTP response 拦截器
 service.interceptors.response.use(
 	(response) => {
-		console.log(response, '文件')
 		// 配置了blob,不处理直接返回文件流
 		if (response.config.responseType === 'blob') {
 			if (response.status === 200) {

+ 31 - 31
src/views/exm/examinationManagement/form.vue

@@ -12,13 +12,6 @@
 			<a-form-item label="考试标题" name="examName" :rules="rules.examName">
 				<a-input v-model:value="form.examName" placeholder="请输入考试标题" />
 			</a-form-item>
-			<a-form-item label="试卷类型" name="paperType">
-				<a-select v-model:value="paperPage.queryParam.paperType" placeholder="请选择试卷类型" @change="paperTypeChange">
-					<a-select-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key">
-						{{ item.value }}
-					</a-select-option>
-				</a-select>
-			</a-form-item>
 			<a-form-item label="选择试卷" name="paperId" :rules="rules.paperId">
 				<a-input-group compact>
 					<a-input
@@ -30,9 +23,11 @@
 					<a-button type="primary" @click="addPaper" style="width: 100px">选择试卷</a-button>
 				</a-input-group>
 			</a-form-item>
-			<a-form-item label="章节" name="chapterId">
-				<a-select v-model:value="form.chapterId" placeholder="请选择章节(可选)" allowClear>
-					<!-- 预留章节选择位置 -->
+			<a-form-item label="课程" name="chapterId">
+				<a-select v-model:value="form.chapterId" placeholder="请选择课程(可选)" allowClear>
+					<a-select-option v-for="item in courseList" :key="item.courseId" :value="item.courseId">
+						{{ item.courseName }}
+					</a-select-option>
 				</a-select>
 			</a-form-item>
 			<a-form-item label="开始时间" name="startTime" :rules="rules.startTime">
@@ -42,6 +37,7 @@
 					format="YYYY-MM-DD HH:mm:ss"
 					placeholder="请选择开始时间"
 					style="width: 100%"
+					:disabledDate="disabledStartDate"
 				/>
 			</a-form-item>
 			<a-form-item label="结束时间" name="endTime" :rules="rules.endTime">
@@ -76,10 +72,14 @@
 			@cancel="() => (paperPage.showDialog = false)"
 		>
 			<a-form layout="inline">
-				<a-form-item label="学科">
-					<a-select v-model:value="paperPage.queryParam.subjectId" allowClear style="width: 200px">
-						<a-select-option v-for="item in paperPage.subjectFilter" :key="item.id" :value="item.id">
-							{{ item.name }} ( {{ item.levelName }} )
+				<a-form-item label="试卷类型">
+					<a-select
+						v-model:value="paperPage.queryParam.paperType"
+						placeholder="请选择试卷类型"
+						@change="paperTypeChange"
+					>
+						<a-select-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key">
+							{{ item.value }}
 						</a-select-option>
 					</a-select>
 				</a-form-item>
@@ -123,6 +123,8 @@
 	import { useExamStore } from '@/store/exam.js'
 	import examManagerApi from '@/api/exam/paper/examManager.js'
 	import examPaperApi from '@/api/exam/paper/examPaperApi.js'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
 	import dayjs from 'dayjs'
 	const emit = defineEmits(['success'])
 	const props = defineProps({
@@ -136,6 +138,7 @@
 	const { subjectEnumFormat } = examStore
 	const paperTypeEnum = computed(() => examStore.paperTypeEnum)
 	const formLoading = ref(false)
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		examName: '',
@@ -157,7 +160,7 @@
 
 	const modalColumns = [
 		{ title: 'Id', dataIndex: 'id', key: 'id', width: 90 },
-		{ title: '学科', dataIndex: 'subjectId', key: 'subjectId', width: 120 },
+		// { title: '学科', dataIndex: 'subjectId', key: 'subjectId', width: 120 },
 		{ title: '名称', dataIndex: 'name', key: 'name' },
 		{
 			title: '创建时间',
@@ -193,11 +196,10 @@
 		}
 	})
 
-	// 初始化学科
-	const initSubject = async (cb) => {
-		await examStore.initSubject()
-		paperPage.subjectFilter = examStore.subjects
-		if (cb) cb()
+	// 禁用开始时间大于今天的日期
+	const disabledStartDate = (current) => {
+		// 禁用大于今天的日期
+		return current && current < dayjs().endOf('day')
 	}
 
 	// 试卷类型变更
@@ -209,10 +211,6 @@
 
 	// 选择试卷
 	const addPaper = () => {
-		if (!paperPage.queryParam.paperType) {
-			message.warning('请先选择试卷类型')
-			return
-		}
 		paperPage.showDialog = true
 		search()
 	}
@@ -224,11 +222,12 @@
 		const params = {
 			...paperPage.queryParam,
 			current: paperPage.queryParam.pageIndex,
-			size: paperPage.queryParam.pageSize
+			size: paperPage.queryParam.pageSize,
+			paperType: paperPage.queryParam.paperType
 		}
 		delete params.pageIndex
 		delete params.pageSize
-		const data = await examPaperApi.taskExamPage(params)
+		const data = await examPaperApi.pageList(params)
 		const re = data
 		paperPage.tableData = re.records
 		paperPage.total = re.total
@@ -281,10 +280,9 @@
 				} else {
 					await examManagerApi.createExam(submitData)
 				}
-				message.success('操作成功')
 				emit('success')
 			} catch (e) {
-				message.error(e.msg || '操作失败')
+				console.error(e)
 			} finally {
 				formLoading.value = false
 			}
@@ -308,9 +306,6 @@
 
 	// 初始化
 	onMounted(() => {
-		initSubject(() => {
-			paperPage.subjectFilter = examStore.subjects
-		})
 		const id = props.id
 		if (id && parseInt(id) !== 0) {
 			formLoading.value = true
@@ -328,6 +323,11 @@
 				formLoading.value = false
 			})
 		}
+		resourceAuditApi.courseAllList().then((re) => {
+			if (re.code === 200) {
+				courseList.value = re.data
+			}
+		})
 	})
 </script>
 

+ 1 - 2
src/views/exm/examinationManagement/index.vue

@@ -2,7 +2,7 @@
 	<div class="task-container">
 		<a-form layout="inline" :model="queryParam">
 			<a-form-item label="考试标题:">
-				<a-input v-model:value="queryParam.examName" placeholder="请输入考试标题" style="min-width: 200px" />
+				<a-input v-model:value="queryParam.examName" placeholder="请输入考试标题" style="min-width: 200px" allowClear />
 			</a-form-item>
 			<a-form-item label="考试状态:">
 				<a-select style="min-width: 150px" v-model:value="queryParam.examStatus" allowClear placeholder="考试状态">
@@ -16,7 +16,6 @@
 				<a-button style="margin-left: 20px" type="primary" @click="createTask">创建考试</a-button>
 			</a-form-item>
 		</a-form>
-
 		<a-table
 			:loading="listLoading"
 			:data-source="tableData"

+ 2 - 1
src/views/exm/question/edit/gap-filling.vue

@@ -91,7 +91,7 @@
 			centered
 			destroy-on-close
 		>
-			<Editor v-model="richEditorContent" :height="300" />
+			<Editor v-model="richEditorContent" :toolbar="toolbar" :height="300" />
 			<div style="text-align: right; margin-top: 16px">
 				<a-button type="primary" @click="editorConfirm">确定</a-button>
 				<a-button @click="richEditor.dialogVisible = false">取消</a-button>
@@ -112,6 +112,7 @@
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
+	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
 	const props = defineProps({
 		id: {

+ 2 - 2
src/views/exm/question/edit/multiple-choice.vue

@@ -95,7 +95,7 @@
 			centered
 			destroy-on-close
 		>
-			<Editor v-model="richEditorContent" :height="300" />
+			<Editor v-model="richEditorContent" :toolbar="toolbar" :height="300" />
 			<div style="text-align: right; margin-top: 16px">
 				<a-button type="primary" @click="editorConfirm">确定</a-button>
 				<a-button @click="richEditor.dialogVisible = false">取消</a-button>
@@ -116,7 +116,7 @@
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
-
+	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
 	const props = defineProps({
 		id: {

+ 2 - 2
src/views/exm/question/edit/short-answer.vue

@@ -82,7 +82,7 @@
 			centered
 			destroy-on-close
 		>
-			<Editor v-model="richEditorContent" :height="300" />
+			<Editor v-model="richEditorContent" :toolbar="toolbar" :height="300" />
 			<div style="text-align: right; margin-top: 16px">
 				<a-button type="primary" @click="editorConfirm">确定</a-button>
 				<a-button @click="richEditor.dialogVisible = false">取消</a-button>
@@ -102,7 +102,7 @@
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
-
+	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
 	const props = defineProps({
 		id: {

+ 2 - 2
src/views/exm/question/edit/single-choice.vue

@@ -95,7 +95,7 @@
 			centered
 			destroy-on-close
 		>
-			<Editor v-model="richEditorContent" :height="300" />
+			<Editor v-model="richEditorContent" :toolbar="toolbar" :height="300" />
 			<div style="text-align: right; margin-top: 16px">
 				<a-button type="primary" @click="editorConfirm">确定</a-button>
 				<a-button @click="richEditor.dialogVisible = false">取消</a-button>
@@ -116,7 +116,7 @@
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
-
+	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
 	const props = defineProps({
 		id: {

+ 2 - 1
src/views/exm/question/edit/true-false.vue

@@ -93,7 +93,7 @@
 			centered
 			destroy-on-close
 		>
-			<Editor v-model="richEditorContent" :height="300" />
+			<Editor v-model="richEditorContent" :toolbar="toolbar" :height="300" />
 			<div style="text-align: right; margin-top: 16px">
 				<a-button type="primary" @click="editorConfirm">确定</a-button>
 				<a-button @click="richEditor.dialogVisible = false">取消</a-button>
@@ -113,6 +113,7 @@
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
+	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
 	const props = defineProps({
 		id: {

+ 132 - 75
src/views/exm/questionnaireManagement/form.vue

@@ -9,33 +9,57 @@
 			:loading="formLoading"
 			layout="horizontal"
 		>
-			<a-form-item label="年级" name="gradeLevel" :rules="rules.gradeLevel">
-				<a-select v-model:value="form.gradeLevel" placeholder="请选择年级" @change="levelChange">
-					<a-select-option v-for="item in levelEnum" :key="item.key" :value="item.key">
-						{{ item.value }}
+			<a-form-item label="考试标题" name="examName" :rules="rules.examName">
+				<a-input v-model:value="form.examName" placeholder="请输入考试标题" />
+			</a-form-item>
+			<a-form-item label="选择试卷" name="paperId" :rules="rules.paperId">
+				<a-input-group compact>
+					<a-input
+						v-model:value="selectedPaperName"
+						placeholder="请选择试卷"
+						readonly
+						style="width: calc(100% - 100px)"
+					/>
+					<a-button type="primary" @click="addPaper" style="width: 100px">选择试卷</a-button>
+				</a-input-group>
+			</a-form-item>
+			<a-form-item label="课程" name="chapterId">
+				<a-select v-model:value="form.chapterId" placeholder="请选择课程(可选)" allowClear @change="chapterChange">
+					<a-select-option v-for="item in courseList" :key="item.courseId" :value="item.courseId">
+						{{ item.courseName }}
 					</a-select-option>
 				</a-select>
 			</a-form-item>
-			<a-form-item label="标题" name="title" :rules="rules.title">
-				<a-input v-model:value="form.title" placeholder="请输入任务标题" />
+			<a-form-item label="开始时间" name="startTime" :rules="rules.startTime">
+				<a-date-picker
+					v-model:value="form.startTime"
+					show-time
+					format="YYYY-MM-DD HH:mm:ss"
+					placeholder="请选择开始时间"
+					style="width: 100%"
+					:disabledDate="disabledStartDate"
+				/>
 			</a-form-item>
-			<a-form-item label="试卷">
-				<a-table :dataSource="form.paperItems" :columns="paperColumns" rowKey="id" bordered :pagination="false">
-					<template #bodyCell="{ column, record }">
-						<template v-if="column.key === 'subjectId'">
-							{{ subjectEnumFormat(record.subjectId) }}
-						</template>
-						<template v-else-if="column.key === 'action'">
-							<a-button type="link" danger @click="removePaper(record)">删除</a-button>
-						</template>
-					</template>
-				</a-table>
+			<a-form-item label="结束时间" name="endTime" :rules="rules.endTime">
+				<a-date-picker
+					v-model:value="form.endTime"
+					show-time
+					format="YYYY-MM-DD HH:mm:ss"
+					placeholder="请选择结束时间"
+					style="width: 100%"
+				/>
+			</a-form-item>
+			<a-form-item label="考试状态" name="examStatus">
+				<a-radio-group v-model:value="form.examStatus">
+					<a-radio :value="0">未开始</a-radio>
+					<a-radio :value="1">已开始</a-radio>
+					<a-radio :value="2">已结束</a-radio>
+				</a-radio-group>
 			</a-form-item>
 			<a-form-item>
 				<a-space>
 					<a-button type="primary" @click="submitForm">提交</a-button>
 					<a-button @click="resetForm">重置</a-button>
-					<a-button type="dashed" @click="addPaper">添加试卷</a-button>
 				</a-space>
 			</a-form-item>
 		</a-form>
@@ -48,10 +72,14 @@
 			@cancel="() => (paperPage.showDialog = false)"
 		>
 			<a-form layout="inline">
-				<a-form-item label="学科">
-					<a-select v-model:value="paperPage.queryParam.subjectId" allowClear style="width: 200px">
-						<a-select-option v-for="item in paperPage.subjectFilter" :key="item.id" :value="item.id">
-							{{ item.name }} ( {{ item.levelName }} )
+				<a-form-item label="试卷类型">
+					<a-select
+						v-model:value="paperPage.queryParam.paperType"
+						placeholder="请选择试卷类型"
+						@change="paperTypeChange"
+					>
+						<a-select-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key">
+							{{ item.value }}
 						</a-select-option>
 					</a-select>
 				</a-form-item>
@@ -90,10 +118,14 @@
 </template>
 
 <script setup>
-	import { ref, reactive, onMounted } from 'vue'
+	import { ref, reactive, onMounted, computed } from 'vue'
+	import { message } from 'ant-design-vue'
 	import { useExamStore } from '@/store/exam.js'
-	import taskApi from '@/api/exam/paper/task.js'
+	import examManagerApi from '@/api/exam/paper/examManager.js'
 	import examPaperApi from '@/api/exam/paper/examPaperApi.js'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
+	import dayjs from 'dayjs'
 	const emit = defineEmits(['success'])
 	const props = defineProps({
 		id: {
@@ -104,30 +136,31 @@
 	const formRef = ref()
 	const examStore = useExamStore()
 	const { subjectEnumFormat } = examStore
-	const levelEnum = computed(() => examStore.getLevelEnum)
+	const paperTypeEnum = computed(() => examStore.paperTypeEnum)
 	const formLoading = ref(false)
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
-		gradeLevel: null,
-		title: '',
-		paperItems: []
+		examName: '',
+		paperId: null,
+		chapterId: null,
+		startTime: null,
+		endTime: null,
+		examStatus: 0
 	})
 
 	const rules = {
-		gradeLevel: [{ required: true, message: '请选择年级', trigger: 'change' }],
-		title: [{ required: true, message: '请输入任务标题', trigger: 'blur' }]
+		examName: [{ required: true, message: '请输入考试标题', trigger: 'blur' }],
+		paperId: [{ required: true, message: '请选择试卷', trigger: 'change' }],
+		startTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
+		endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }]
 	}
 
-	const paperColumns = [
-		{ title: '学科', dataIndex: 'subjectId', key: 'subjectId', width: 120 },
-		{ title: '名称', dataIndex: 'name', key: 'name' },
-		{ title: '创建时间', dataIndex: 'createTime', key: 'createTime', width: 160 },
-		{ title: '操作', key: 'action', width: 100 }
-	]
+	const selectedPaperName = ref('')
 
 	const modalColumns = [
 		{ title: 'Id', dataIndex: 'id', key: 'id', width: 90 },
-		{ title: '学科', dataIndex: 'subjectId', key: 'subjectId', width: 120 },
+		// { title: '学科', dataIndex: 'subjectId', key: 'subjectId', width: 120 },
 		{ title: '名称', dataIndex: 'name', key: 'name' },
 		{
 			title: '创建时间',
@@ -139,12 +172,11 @@
 
 	const paperPage = reactive({
 		subjectFilter: [],
-		multipleSelection: [],
+		selectedPaper: null,
 		showDialog: false,
 		queryParam: {
 			subjectId: null,
-			level: null,
-			paperType: 6,
+			paperType: null,
 			pageIndex: 1,
 			pageSize: 5
 		},
@@ -153,32 +185,35 @@
 		total: 0
 	})
 
-	// 试卷选择表格
+	// 试卷选择表格
 	const selectedRowKeys = ref([])
 	const rowSelection = reactive({
+		type: 'radio',
 		selectedRowKeys: selectedRowKeys,
 		onChange: (selectedRowKeysVal, selectedRows) => {
 			selectedRowKeys.value = selectedRowKeysVal
-			paperPage.multipleSelection = selectedRows
+			paperPage.selectedPaper = selectedRows[0] || null
 		}
 	})
+	const chapterChange = async () => {
+		form.chapterId = ''
+	}
 
-	// 初始化学科
-	const initSubject = async (cb) => {
-		await examStore.initSubject()
-		paperPage.subjectFilter = examStore.subjects
-		if (cb) cb()
+	// 禁用开始时间大于今天的日期
+	const disabledStartDate = (current) => {
+		// 禁用大于今天的日期
+		return current && current < dayjs().endOf('day')
 	}
 
-	// 年级变更
-	const levelChange = () => {
+	// 试卷类型变更
+	const paperTypeChange = () => {
 		paperPage.queryParam.subjectId = null
-		paperPage.subjectFilter = examStore.subjects.filter((data) => data.level === form.gradeLevel)
+		form.paperId = null
+		selectedPaperName.value = ''
 	}
 
-	// 添加试卷
+	// 选择试卷
 	const addPaper = () => {
-		paperPage.queryParam.level = form.gradeLevel
 		paperPage.showDialog = true
 		search()
 	}
@@ -190,11 +225,12 @@
 		const params = {
 			...paperPage.queryParam,
 			current: paperPage.queryParam.pageIndex,
-			size: paperPage.queryParam.pageSize
+			size: paperPage.queryParam.pageSize,
+			paperType: paperPage.queryParam.paperType
 		}
 		delete params.pageIndex
 		delete params.pageSize
-		const data = await examPaperApi.taskExamPage(params)
+		const data = await examPaperApi.pageList(params)
 		const re = data
 		paperPage.tableData = re.records
 		paperPage.total = re.total
@@ -204,11 +240,12 @@
 
 	// 确认选择试卷
 	const confirmPaperSelect = () => {
-		paperPage.multipleSelection.forEach((ep) => {
-			if (!form.paperItems.some((item) => item.id === ep.id)) {
-				form.paperItems.push(ep)
-			}
-		})
+		if (!paperPage.selectedPaper) {
+			message.warning('请选择一个试卷')
+			return
+		}
+		form.paperId = paperPage.selectedPaper.id
+		selectedPaperName.value = paperPage.selectedPaper.name
 		paperPage.showDialog = false
 		selectedRowKeys.value = []
 	}
@@ -230,21 +267,25 @@
 		search()
 	}
 
-	// 删除试卷
-	const removePaper = (row) => {
-		const idx = form.paperItems.findIndex((item) => item.id === row.id)
-		if (idx !== -1) form.paperItems.splice(idx, 1)
-	}
-
 	// 提交表单
 	const submitForm = () => {
 		formRef.value.validate().then(async () => {
 			formLoading.value = true
 			try {
-				await taskApi.edit(form)
+				const submitData = {
+					...form,
+					startTime: form.startTime ? form.startTime.format('YYYY-MM-DD HH:mm:ss') : null,
+					endTime: form.endTime ? form.endTime.format('YYYY-MM-DD HH:mm:ss') : null
+				}
+
+				if (form.id) {
+					await examManagerApi.edit(submitData)
+				} else {
+					await examManagerApi.createExam(submitData)
+				}
 				emit('success')
 			} catch (e) {
-				//
+				console.error(e)
 			} finally {
 				formLoading.value = false
 			}
@@ -256,24 +297,40 @@
 		const lastId = form.id
 		formRef.value.resetFields()
 		form.id = lastId
-		form.gradeLevel = null
-		form.title = ''
-		form.paperItems = []
+		form.examName = ''
+		form.paperId = null
+		form.chapterId = null
+		form.startTime = null
+		form.endTime = null
+		form.examStatus = 0
+		selectedPaperName.value = ''
+		paperPage.queryParam.paperType = null
 	}
 
 	// 初始化
 	onMounted(() => {
-		initSubject(() => {
-			paperPage.subjectFilter = examStore.subjects
-		})
 		const id = props.id
 		if (id && parseInt(id) !== 0) {
 			formLoading.value = true
-			taskApi.select(id).then((re) => {
-				Object.assign(form, re)
+			examManagerApi.select(id).then((re) => {
+				Object.assign(form, {
+					...re,
+					startTime: re.startTime ? dayjs(re.startTime) : null,
+					endTime: re.endTime ? dayjs(re.endTime) : null
+				})
+				// 如果有试卷ID,需要获取试卷名称显示
+				if (re.paperId) {
+					// 这里可以根据需要调用接口获取试卷名称
+					selectedPaperName.value = '已选择试卷'
+				}
 				formLoading.value = false
 			})
 		}
+		resourceAuditApi.courseAllList().then((re) => {
+			if (re.code === 200) {
+				courseList.value = re.data
+			}
+		})
 	})
 </script>
 

+ 35 - 17
src/views/exm/questionnaireManagement/index.vue

@@ -1,19 +1,21 @@
 <template>
 	<div class="task-container">
 		<a-form layout="inline" :model="queryParam">
-			<a-form-item label="年级:">
-				<a-select style="min-width: 150px" v-model:value="queryParam.gradeLevel" allowClear placeholder="年级">
-					<a-select-option v-for="item in levelEnum" :key="item.key" :value="item.key">
-						{{ item.value }}
-					</a-select-option>
+			<a-form-item label="考试标题:">
+				<a-input v-model:value="queryParam.examName" placeholder="请输入考试标题" style="min-width: 200px" allowClear />
+			</a-form-item>
+			<a-form-item label="考试状态:">
+				<a-select style="min-width: 150px" v-model:value="queryParam.examStatus" allowClear placeholder="考试状态">
+					<a-select-option :value="0">未开始</a-select-option>
+					<a-select-option :value="1">已开始</a-select-option>
+					<a-select-option :value="2">已结束</a-select-option>
 				</a-select>
 			</a-form-item>
 			<a-form-item>
 				<a-button type="primary" @click="submitForm">查询</a-button>
-				<a-button style="margin-left: 20px" type="primary" @click="createTask">创建任务</a-button>
+				<a-button style="margin-left: 20px" type="primary" @click="createTask">创建考试</a-button>
 			</a-form-item>
 		</a-form>
-
 		<a-table
 			:loading="listLoading"
 			:data-source="tableData"
@@ -23,9 +25,24 @@
 			style="margin-top: 16px"
 		>
 			<a-table-column title="Id" dataIndex="id" key="id" width="100" />
-			<a-table-column title="标题" dataIndex="title" key="title" />
-			<!-- <a-table-column title="学级" dataIndex="gradeLevel" key="gradeLevel" :customRender="levelFormatter" /> -->
-			<a-table-column title="发送人" dataIndex="createUserName" key="createUserName" width="100" />
+			<a-table-column title="考试标题" dataIndex="examName" key="examName" />
+			<a-table-column title="考试状态" dataIndex="examStatus" key="examStatus" width="120">
+				<template #default="{ record }">
+					<a-tag :color="record.examStatus === 0 ? 'default' : record.examStatus === 1 ? 'processing' : 'success'">
+						{{ record.examStatus === 0 ? '未开始' : record.examStatus === 1 ? '已开始' : '已结束' }}
+					</a-tag>
+				</template>
+			</a-table-column>
+			<a-table-column title="开始时间" dataIndex="startTime" key="startTime" width="160">
+				<template #default="{ record }">
+					{{ formatDateTime(record.startTime) }}
+				</template>
+			</a-table-column>
+			<a-table-column title="结束时间" dataIndex="endTime" key="endTime" width="160">
+				<template #default="{ record }">
+					{{ formatDateTime(record.endTime) }}
+				</template>
+			</a-table-column>
 			<a-table-column title="创建时间" dataIndex="createTime" key="createTime" width="160">
 				<template #default="{ record }">
 					{{ formatDateTime(record.createTime) }}
@@ -65,7 +82,7 @@
 <script setup>
 	import { ref, reactive, onMounted } from 'vue'
 	import { message, Modal } from 'ant-design-vue'
-	import taskApi from '@/api/exam/paper/task.js'
+	import examManagerApi from '@/api/exam/paper/examManager.js'
 	import TaskEdit from './form.vue'
 	import { useExamStore } from '@/store/exam.js'
 	import { storeToRefs } from 'pinia'
@@ -77,7 +94,8 @@
 	const editId = ref(null)
 
 	const queryParam = reactive({
-		gradeLevel: null,
+		examName: null,
+		examStatus: null,
 		pageIndex: 1,
 		pageSize: 10
 	})
@@ -95,7 +113,7 @@
 			}
 			delete params.pageIndex
 			delete params.pageSize
-			const data = await taskApi.pageList(params)
+			const data = await examManagerApi.pageList(params)
 			tableData.value = data.records || []
 			total.value = data.total || 0
 			queryParam.pageIndex = data.current || 1
@@ -126,16 +144,16 @@
 
 	const editTask = (record) => {
 		drawerVisible.value = true
-		drawerTitle.value = '编辑任务'
+		drawerTitle.value = '编辑考试'
 		editId.value = record.id
 	}
 
 	const deleteTask = (record) => {
 		Modal.confirm({
-			title: '确认删除该任务吗?',
+			title: '确认删除该考试吗?',
 			onOk: async () => {
 				try {
-					await taskApi.deleteTask(record.id)
+					await examManagerApi.deleteExam([{ id: record.id }])
 					message.success('删除成功')
 					fetchList()
 				} catch (e) {
@@ -150,7 +168,7 @@
 	}
 	const createTask = () => {
 		drawerVisible.value = true
-		drawerTitle.value = '创建任务'
+		drawerTitle.value = '创建考试'
 		editId.value = null
 	}
 	const onEditSuccess = () => {

File diff suppressed because it is too large
+ 0 - 146
stats.html


Some files were not shown because too many files changed in this diff