Ver código fonte

feat(题目编辑): 为所有题型添加学期和课程选择功能

添加学期和课程选择字段到所有题型编辑表单
实现学期变更时加载对应课程列表的功能
移除bankTypeFormatter中的Number转换以直接使用文本值
tanshanming 6 meses atrás
pai
commit
12f84fdc41

+ 121 - 2
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.semesterId">
+					<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)
@@ -158,7 +187,7 @@
 		question: null,
 		loading: false
 	})
-	const levelEnum = computed(() => examStore.levelEnum)
+	// const levelEnum = computed(() => examStore.levelEnum)
 	const subjects = computed(() => examStore.subjects)
 
 	onMounted(async () => {
@@ -170,9 +199,94 @@
 			tQuestionApi.select(id).then((re) => {
 				Object.assign(form, re)
 				formLoading.value = false
+				// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+				if (re.semesterId) {
+					// 直接加载课程列表
+					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) {
+			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.semesterId">
+					<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) {
+					// 直接加载课程列表
+					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) {
+			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.semesterId">
+					<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) {
+					// 直接加载课程列表
+					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) {
+			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.semesterId">
+					<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) {
+					// 直接加载课程列表
+					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) {
+			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.semesterId">
+					<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) {
+					// 直接加载课程列表
+					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) {
+			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)
 	}