Sfoglia il codice sorgente

feat(题目管理): 为题目编辑表单添加学期、专业和课程选择功能

为所有题目类型编辑表单添加学期、专业和课程选择功能,并实现级联选择逻辑
移除删除成功提示消息,优化删除操作体验
添加试卷查询接口selectExamList用于考试管理
tanshanming 7 mesi fa
parent
commit
1e325eea08

+ 3 - 1
src/api/exam/paper/examPaperApi.js

@@ -13,5 +13,7 @@ export default {
 	taskExamPage: (query) => request('api/admin/exam/paper/taskExamPage', query, 'post'),
 	edit: (query) => request('api/admin/exam/paper/edit', query, 'post'),
 	select: (id) => request('api/admin/exam/paper/select/' + id, '', 'post'),
-	deletePaper: (id) => request('api/admin/exam/paper/delete/' + id, '', 'post')
+	deletePaper: (id) => request('api/admin/exam/paper/delete/' + id, '', 'post'),
+	// 任务试卷(考试、问卷)查询
+	selectExamList: (data) => request('api/admin/exam/paper/selectExamList', data, 'post')
 }

+ 137 - 24
src/views/exm/examinationManagement/form.vue

@@ -23,8 +23,22 @@
 					<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="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
 					<a-select-option v-for="item in courseList" :key="item.courseId" :value="item.courseId">
 						{{ item.courseName }}
 					</a-select-option>
@@ -77,6 +91,7 @@
 						v-model:value="paperPage.queryParam.paperType"
 						placeholder="请选择试卷类型"
 						@change="paperTypeChange"
+						disabled
 					>
 						<a-select-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key">
 							{{ item.value }}
@@ -138,15 +153,19 @@
 	const { subjectEnumFormat } = examStore
 	const paperTypeEnum = computed(() => examStore.paperTypeEnum)
 	const formLoading = ref(false)
+	const semesterList = ref([])
+	const majorList = ref([])
 	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		examName: '',
 		paperId: null,
-		chapterId: null,
+		courseId: null,
 		startTime: null,
 		endTime: null,
-		examStatus: 0
+		examStatus: 0,
+		semesterId: null,
+		majorId: null
 	})
 
 	const rules = {
@@ -175,8 +194,8 @@
 		selectedPaper: null,
 		showDialog: false,
 		queryParam: {
-			subjectId: null,
-			paperType: null,
+			paperId: null,
+			paperType: '6',
 			pageIndex: 1,
 			pageSize: 5
 		},
@@ -195,7 +214,52 @@
 			paperPage.selectedPaper = selectedRows[0] || null
 		}
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
+	}
 
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 	// 禁用开始时间大于今天的日期
 	const disabledStartDate = (current) => {
 		// 禁用大于今天的日期
@@ -227,7 +291,7 @@
 		}
 		delete params.pageIndex
 		delete params.pageSize
-		const data = await examPaperApi.pageList(params)
+		const data = await examPaperApi.selectExamList(params)
 		const re = data
 		paperPage.tableData = re.records
 		paperPage.total = re.total
@@ -296,12 +360,16 @@
 		form.id = lastId
 		form.examName = ''
 		form.paperId = null
-		form.chapterId = null
+		form.semesterId = null // 重置学期
+		form.majorId = null // 重置专业
+		form.courseId = null
 		form.startTime = null
 		form.endTime = null
 		form.examStatus = 0
 		selectedPaperName.value = ''
 		paperPage.queryParam.paperType = null
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	// 初始化
@@ -309,25 +377,70 @@
 		const id = props.id
 		if (id && parseInt(id) !== 0) {
 			formLoading.value = true
-			examManagerApi.select(id).then((re) => {
-				Object.assign(form, {
-					...re,
-					startTime: re.startTime ? dayjs(re.startTime) : null,
-					endTime: re.endTime ? dayjs(re.endTime) : null
+			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) {
+						paperPage.queryParam.paperId = re.paperId
+						// 这里可以根据需要调用接口获取试卷名称
+						examPaperApi.select(re.paperId).then((r) => {
+							selectedPaperName.value = r.name
+						})
+					}
+
+					// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+					if (re.semesterId && re.majorId) {
+						// 直接加载课程列表
+						loadCourseList()
+					}
+
+					formLoading.value = false
+				})
+				.catch((err) => {
+					message.error('加载考试信息失败:' + (err.message || '网络错误'))
+					formLoading.value = false
 				})
-				// 如果有试卷ID,需要获取试卷名称显示
-				if (re.paperId) {
-					// 这里可以根据需要调用接口获取试卷名称
-					selectedPaperName.value = '已选择试卷'
+		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
 				}
-				formLoading.value = false
 			})
-		}
-		resourceAuditApi.courseAllList().then((re) => {
-			if (re.code === 200) {
-				courseList.value = re.data
-			}
-		})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
 </script>
 

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

@@ -80,7 +80,7 @@
 </template>
 
 <script setup>
-	import { ref, reactive, onMounted, computed } from 'vue'
+	import { ref, reactive, onMounted } from 'vue'
 	import { message, Modal } from 'ant-design-vue'
 	import examManagerApi from '@/api/exam/paper/examManager.js'
 	import TaskEdit from './form.vue'
@@ -155,7 +155,6 @@
 			onOk: async () => {
 				try {
 					await examManagerApi.deleteExam([{ id: record.id }])
-					message.success('删除成功')
 					fetchList()
 				} catch (e) {
 					message.error(e.msg || '删除失败')

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

@@ -15,6 +15,27 @@
 					</a-select-option>
 				</a-select>
 			</a-form-item> -->
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
+					<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="bankType" required>
 				<a-select v-model:value="form.bankType" placeholder="题库类型">
 					<a-select-option v-for="item in bankTypeEnum" :key="item.key" :value="item.key">
@@ -111,6 +132,8 @@
 	import QuestionShow from '../components/Show.vue'
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
 	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
@@ -122,6 +145,9 @@
 	})
 	const emit = defineEmits(['successful'])
 	const formRef = ref()
+	const semesterList = ref([])
+	const majorList = ref([])
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		questionType: 4,
@@ -133,7 +159,10 @@
 		correct: '',
 		score: '',
 		difficult: 0,
-		bankType: null
+		bankType: null,
+		courseId: null,
+		semesterId: null,
+		majorId: null
 	})
 	const subjectFilter = ref([])
 	const formLoading = ref(false)
@@ -170,9 +199,94 @@
 			tQuestionApi.select(id).then((re) => {
 				Object.assign(form, re)
 				formLoading.value = false
+				// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+				if (re.semesterId && re.majorId) {
+					// 直接加载课程列表
+					loadCourseList()
+				}
 			})
 		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
+	}
+
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 
 	function inputClick(object, parameterName) {
 		richEditor.object = object
@@ -256,6 +370,9 @@
 			questionType: 4,
 			// gradeLevel: null,
 			// subjectId: null,
+			semesterId: null,
+			majorId: null,
+			courseId: null,
 			title: '',
 			items: [],
 			analyze: '',
@@ -265,6 +382,8 @@
 			bankType: null
 		})
 		form.id = lastId
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 </script>
 

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

@@ -15,6 +15,27 @@
 					</a-select-option>
 				</a-select>
 			</a-form-item> -->
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
+					<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="bankType" required>
 				<a-select v-model:value="form.bankType" placeholder="题库类型">
 					<a-select-option v-for="item in bankTypeEnum" :key="item.key" :value="item.key">
@@ -115,6 +136,8 @@
 	import QuestionShow from '../components/Show.vue'
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
 	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
@@ -126,6 +149,9 @@
 	})
 	const emit = defineEmits(['successful'])
 	const formRef = ref()
+	const semesterList = ref([])
+	const majorList = ref([])
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		questionType: 2,
@@ -143,7 +169,10 @@
 		correctArray: [],
 		score: '',
 		difficult: 0,
-		bankType: null
+		bankType: null,
+		courseId: null,
+		semesterId: null,
+		majorId: null
 	})
 	const subjectFilter = ref([])
 	const formLoading = ref(false)
@@ -181,9 +210,94 @@
 			tQuestionApi.select(id).then((re) => {
 				Object.assign(form, re)
 				formLoading.value = false
+				// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+				if (re.semesterId && re.majorId) {
+					// 直接加载课程列表
+					loadCourseList()
+				}
 			})
 		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
+	}
+
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 
 	function inputClick(object, parameterName) {
 		richEditor.object = object
@@ -256,6 +370,9 @@
 				{ id: null, prefix: 'C', content: '' },
 				{ id: null, prefix: 'D', content: '' }
 			],
+			semesterId: null,
+			majorId: null,
+			courseId: null,
 			analyze: '',
 			correct: '',
 			correctArray: [],
@@ -264,6 +381,8 @@
 			bankType: null
 		})
 		form.id = lastId
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 </script>
 

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

@@ -15,6 +15,27 @@
 					</a-select-option>
 				</a-select>
 			</a-form-item> -->
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
+					<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="bankType" required>
 				<a-select v-model:value="form.bankType" placeholder="题库类型">
 					<a-select-option v-for="item in bankTypeEnum" :key="item.key" :value="item.key">
@@ -96,11 +117,14 @@
 
 <script setup>
 	import { ref, reactive, computed, onMounted } from 'vue'
+	import { message } from 'ant-design-vue'
 	import { useExamStore } from '@/store/exam'
 	import tQuestionApi from '@/api/exam/question/tQuestionApi'
 	import QuestionShow from '../components/Show.vue'
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
 	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
@@ -112,6 +136,9 @@
 	})
 	const emit = defineEmits(['successful'])
 	const formRef = ref()
+	const semesterList = ref([])
+	const majorList = ref([])
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		questionType: 5,
@@ -123,7 +150,10 @@
 		correct: '',
 		score: '',
 		difficult: 0,
-		bankType: null
+		bankType: null,
+		courseId: null,
+		semesterId: null,
+		majorId: null
 	})
 	const subjectFilter = ref([])
 	const formLoading = ref(false)
@@ -161,9 +191,94 @@
 			tQuestionApi.select(id).then((re) => {
 				Object.assign(form, re)
 				formLoading.value = false
+				// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+				if (re.semesterId && re.majorId) {
+					// 直接加载课程列表
+					loadCourseList()
+				}
 			})
 		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
+	}
+
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 
 	function inputClick(object, parameterName) {
 		richEditor.object = object
@@ -202,6 +317,9 @@
 			questionType: 5,
 			// gradeLevel: null,
 			// subjectId: null,
+			semesterId: null,
+			majorId: null,
+			courseId: null,
 			title: '',
 			items: [],
 			analyze: '',
@@ -211,6 +329,8 @@
 			difficult: 0
 		})
 		form.id = lastId
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	function levelChange() {

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

@@ -15,6 +15,27 @@
 					</a-select-option>
 				</a-select>
 			</a-form-item> -->
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
+					<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="bankType" required>
 				<a-select v-model:value="form.bankType" placeholder="题库类型">
 					<a-select-option v-for="item in bankTypeEnum" :key="item.key" :value="item.key">
@@ -115,6 +136,8 @@
 	import QuestionShow from '../components/Show.vue'
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
 	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
@@ -126,6 +149,9 @@
 	})
 	const emit = defineEmits(['successful'])
 	const formRef = ref()
+	const semesterList = ref([])
+	const majorList = ref([])
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		questionType: 1,
@@ -142,7 +168,10 @@
 		correct: '',
 		score: '',
 		difficult: 0,
-		bankType: null
+		bankType: null,
+		courseId: null,
+		semesterId: null,
+		majorId: null
 	})
 	const subjectFilter = ref([])
 	const formLoading = ref(false)
@@ -180,9 +209,94 @@
 			tQuestionApi.select(id).then((re) => {
 				Object.assign(form, re)
 				formLoading.value = false
+				// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+				if (re.semesterId && re.majorId) {
+					// 直接加载课程列表
+					loadCourseList()
+				}
 			})
 		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
+	}
+
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 
 	function inputClick(object, parameterName) {
 		richEditor.object = object
@@ -237,6 +351,9 @@
 			questionType: 1,
 			// gradeLevel: null,
 			// subjectId: null,
+			semesterId: null,
+			majorId: null,
+			courseId: null,
 			title: '',
 			items: [
 				{ prefix: 'A', content: '' },
@@ -251,6 +368,8 @@
 			bankType: null
 		})
 		form.id = lastId
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	function levelChange() {

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

@@ -15,6 +15,27 @@
 					</a-select-option>
 				</a-select>
 			</a-form-item> -->
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
+					<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="bankType" required>
 				<a-select v-model:value="form.bankType" placeholder="题库类型">
 					<a-select-option v-for="item in bankTypeEnum" :key="item.key" :value="item.key">
@@ -107,11 +128,14 @@
 
 <script setup>
 	import { ref, reactive, computed, onMounted } from 'vue'
+	import { message } from 'ant-design-vue'
 	import { useExamStore } from '@/store/exam'
 	import tQuestionApi from '@/api/exam/question/tQuestionApi'
 	import QuestionShow from '../components/Show.vue'
 	import Editor from '@/components/Editor/index.vue'
 	import '../style/common.less'
+	import resourceAuditApi from '@/api/resourceAudit.js'
+
 	const bankTypeEnum = computed(() => examStore.getBankTypeEnum)
 	const toolbar = computed(() => examStore.toolbar)
 	const examStore = useExamStore()
@@ -121,8 +145,12 @@
 			default: 0
 		}
 	})
+
 	const emit = defineEmits(['successful'])
 	const formRef = ref()
+	const semesterList = ref([])
+	const majorList = ref([])
+	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		questionType: 3,
@@ -137,7 +165,10 @@
 		correct: '',
 		score: '',
 		difficult: 0,
-		bankType: null
+		bankType: null,
+		courseId: null,
+		semesterId: null,
+		majorId: null
 	})
 	const subjectFilter = ref([])
 	const formLoading = ref(false)
@@ -175,9 +206,94 @@
 			tQuestionApi.select(id).then((re) => {
 				Object.assign(form, re)
 				formLoading.value = false
+				// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+				if (re.semesterId && re.majorId) {
+					// 直接加载课程列表
+					loadCourseList()
+				}
 			})
 		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
+	}
+
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 
 	function inputClick(object, parameterName) {
 		richEditor.object = object
@@ -216,6 +332,9 @@
 			questionType: 3,
 			// gradeLevel: null,
 			// subjectId: null,
+			semesterId: null,
+			majorId: null,
+			courseId: null,
 			title: '',
 			items: [
 				{ id: null, prefix: 'A', content: '是' },
@@ -228,6 +347,8 @@
 			bankType: null
 		})
 		form.id = lastId
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	function levelChange() {

+ 1 - 1
src/views/exm/question/index.vue

@@ -231,7 +231,7 @@
 		search()
 	}
 	const bankTypeFormatter = ({ text }) => {
-		const key = Number(text)
+		const key = text
 		return enumFormat(bankTypeEnum.value, key)
 	}
 

+ 129 - 23
src/views/exm/questionnaireManagement/form.vue

@@ -23,8 +23,22 @@
 					<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-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.majorId">
 					<a-select-option v-for="item in courseList" :key="item.courseId" :value="item.courseId">
 						{{ item.courseName }}
 					</a-select-option>
@@ -138,15 +152,19 @@
 	const { subjectEnumFormat } = examStore
 	const paperTypeEnum = computed(() => examStore.paperTypeEnum)
 	const formLoading = ref(false)
+	const semesterList = ref([])
+	const majorList = ref([])
 	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		examName: '',
 		paperId: null,
-		chapterId: null,
+		courseId: null,
 		startTime: null,
 		endTime: null,
-		examStatus: 0
+		examStatus: 0,
+		semesterId: null,
+		majorId: null
 	})
 
 	const rules = {
@@ -195,10 +213,52 @@
 			paperPage.selectedPaper = selectedRows[0] || null
 		}
 	})
-	const chapterChange = async () => {
-		form.chapterId = ''
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.majorId) {
+			loadCourseList()
+		}
 	}
 
+	// 专业变更处理函数
+	const handleMajorChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value && form.semesterId) {
+			loadCourseList()
+		}
+	}
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId,
+				majorId: form.majorId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 	// 禁用开始时间大于今天的日期
 	const disabledStartDate = (current) => {
 		// 禁用大于今天的日期
@@ -299,12 +359,16 @@
 		form.id = lastId
 		form.examName = ''
 		form.paperId = null
-		form.chapterId = null
+		form.semesterId = null // 重置学期
+		form.majorId = null // 重置专业
+		form.courseId = null
 		form.startTime = null
 		form.endTime = null
 		form.examStatus = 0
 		selectedPaperName.value = ''
 		paperPage.queryParam.paperType = null
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	// 初始化
@@ -312,25 +376,67 @@
 		const id = props.id
 		if (id && parseInt(id) !== 0) {
 			formLoading.value = true
-			examManagerApi.select(id).then((re) => {
-				Object.assign(form, {
-					...re,
-					startTime: re.startTime ? dayjs(re.startTime) : null,
-					endTime: re.endTime ? dayjs(re.endTime) : null
+			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) {
+						// 这里可以根据需要调用接口获取试卷名称
+						examPaperApi.select(re.paperId).then((r) => {
+							selectedPaperName.value = r.name
+						})
+					}
+					// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+					if (re.semesterId && re.majorId) {
+						// 直接加载课程列表
+						loadCourseList()
+					}
+					formLoading.value = false
 				})
-				// 如果有试卷ID,需要获取试卷名称显示
-				if (re.paperId) {
-					// 这里可以根据需要调用接口获取试卷名称
-					selectedPaperName.value = '已选择试卷'
+				.catch((err) => {
+					message.error('加载考试信息失败:' + (err.message || '网络错误'))
+					formLoading.value = false
+				})
+		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
 				}
-				formLoading.value = false
 			})
-		}
-		resourceAuditApi.courseAllList().then((re) => {
-			if (re.code === 200) {
-				courseList.value = re.data
-			}
-		})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		const majorLoading = message.loading('正在加载专业列表...', 0)
+		resourceAuditApi
+			.majordownList()
+			.then((res) => {
+				if (res.code === 200) {
+					majorList.value = res.data
+				} else {
+					message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载专业列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				majorLoading()
+			})
 	})
 </script>
 

+ 0 - 1
src/views/exm/questionnaireManagement/index.vue

@@ -155,7 +155,6 @@
 			onOk: async () => {
 				try {
 					await examManagerApi.deleteExam([{ id: record.id }])
-					message.success('删除成功')
 					fetchList()
 				} catch (e) {
 					message.error(e.msg || '删除失败')