From 32e83b6f97a278366e761ef2fb9bd9e8d220ca05 Mon Sep 17 00:00:00 2001 From: huweihang <916879598@qq.com> Date: Tue, 16 Dec 2025 01:08:10 +0800 Subject: [PATCH 1/4] =?UTF-8?q?style:=20=E8=B0=83=E6=95=B4index.scss?= =?UTF-8?q?=E4=BB=A5=E4=BC=98=E5=8C=96=E5=AF=B9=E8=AF=9D=E6=A1=86=E5=92=8C?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E7=9A=84=E6=A0=B7=E5=BC=8F=EF=BC=9B=E6=9B=B4?= =?UTF-8?q?=E6=96=B0ManageListRemote.vue=E4=BB=A5=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E6=A1=86=E7=9A=84=E4=BA=A4=E4=BA=92=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E5=92=8C=E8=BF=87=E6=BB=A4=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/styles/index.scss | 8 ++-- src/views/course/ManageListRemote.vue | 67 +++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 23bc4561..bf3e7799 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -394,7 +394,7 @@ li{ .custom-confirm-dialog { max-width: 692px; - min-width: 692px; + min-width: 600px; min-height: 222px !important; padding: 0px 0px 0px; border-radius: 10px; @@ -465,9 +465,9 @@ li{ padding-bottom: 20px; .el-button { - min-width: 120px; - height: 40px; - font-size: 16px; + width: 70px; + height: 32px; + font-size: 14px; border-radius: 6px; padding: 0 18px; } diff --git a/src/views/course/ManageListRemote.vue b/src/views/course/ManageListRemote.vue index fdc66fc1..e9a2cbcf 100644 --- a/src/views/course/ManageListRemote.vue +++ b/src/views/course/ManageListRemote.vue @@ -26,6 +26,7 @@ :remote-method="remoteSearchTeacher" :loading="teacherLoading" @input.native="limitTeacherInput" + @visible-change="handleTeacherVisibleChange" @change="handleTeacherChange" @clear="handleTeacherClear" > @@ -70,8 +71,8 @@ {{ showAdvancedFilter ? '收起' : '展开' }} - - + +
@@ -103,6 +104,7 @@ @change="handleResOwnerChange" @input.native="limitResOwnerInput" filterable + :filter-method="resOwnerFilterMethod" >
@@ -121,6 +123,7 @@ :remote-method="remoteSearchCreator" :loading="creatorLoading" @input.native="limitCreatorInput" + @visible-change="handleCreatorVisibleChange" @change="handleCreatorChange" @clear="handleCreatorClear" > @@ -143,8 +146,8 @@ {{ showAdvancedFilter ? '收起' : '展开' }} - - + +
@@ -741,6 +744,16 @@ export default { this.teacherOptions = []; this.params.teacherId = ''; }, + // 授课教师下拉展开时,如果当前没有关键字,则清空上一次的查询结果 + handleTeacherVisibleChange(visible) { + if (!visible) return; + // 打开时才处理 + const select = this.$refs.teacherSelect; + const query = (select && select.query) || ''; + if (!query) { + this.teacherOptions = []; + } + }, async remoteSearchCreator(keyword) { const limited = (keyword || '').slice(0, 50); if (this.$refs.creatorSelect && this.$refs.creatorSelect.query !== limited) { @@ -793,6 +806,15 @@ export default { this.creatorSelected = []; this.params.createUserId = ''; }, + // 创建人下拉展开时,如果当前没有关键字,则清空上一次的查询结果 + handleCreatorVisibleChange(visible) { + if (!visible) return; + const select = this.$refs.creatorSelect; + const query = (select && select.query) || ''; + if (!query) { + this.creatorOptions = []; + } + }, limitTeacherInput(event) { const limited = (event && event.target && event.target.value ? event.target.value : '').slice(0, 50); if (event && event.target && event.target.value !== limited) { @@ -820,6 +842,12 @@ export default { this.$refs.resOwnerCascader.inputValue = limited; } }, + resOwnerFilterMethod(node, keyword) { + if (!keyword) return true; + const text = (node.label || (node.data && node.data.name) || '').toString().toLowerCase(); + const kw = keyword.toString().toLowerCase(); + return text.includes(kw); + }, handleTopSort() { if (this.$refs.topSorter) { this.$refs.topSorter.open(); @@ -1078,7 +1106,7 @@ export default { const url = window.URL.createObjectURL(blob); const timestamp = new Date().toISOString().replace(/[-:T]/g, '').split('.')[0]; link.href = url; - link.download = `课程管理_${timestamp}.xlsx`; + link.download = `在线课列表.xlsx`; document.body.appendChild(link); link.click(); document.body.removeChild(link); @@ -2150,6 +2178,35 @@ export default { padding: 5px 0; } } +.qrcode-img { + width: 150px; + height: 150px; + display: block; + position: relative; + .downloadn-container { + position: absolute; + width: 40px; + height: 45px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 99; + background: white; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + transition: all 0.3s ease; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); + cursor: pointer; + span { + color: #409eff; + display: block; + font-size: 12px; + line-height: 12px; + } + } +} + diff --git a/src/components/signup/SignupModal.vue b/src/components/signup/SignupModal.vue new file mode 100644 index 00000000..04fba641 --- /dev/null +++ b/src/components/signup/SignupModal.vue @@ -0,0 +1,766 @@ + + + + + diff --git a/src/views/course/CourseManageRemote.vue b/src/views/course/CourseManageRemote.vue index 5026c967..9d144d91 100644 --- a/src/views/course/CourseManageRemote.vue +++ b/src/views/course/CourseManageRemote.vue @@ -1,7 +1,7 @@ From 9e4f2038f01fe213562a80d57381353b4e9f73b7 Mon Sep 17 00:00:00 2001 From: huweihang <916879598@qq.com> Date: Wed, 17 Dec 2025 01:54:17 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8A=A5?= =?UTF-8?q?=E5=90=8D=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B7=BB=E5=8A=A0=E5=92=8C=E5=88=A0=E9=99=A4=E6=8A=A5?= =?UTF-8?q?=E5=90=8D=E8=AE=B0=E5=BD=95=EF=BC=8C=E4=BC=98=E5=8C=96=E5=8F=97?= =?UTF-8?q?=E4=BC=97=E9=80=89=E6=8B=A9=E5=BC=B9=E7=AA=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/course/CourseManage.vue | 128 +++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 2 deletions(-) diff --git a/src/views/course/CourseManage.vue b/src/views/course/CourseManage.vue index 2098b1f6..15044d7a 100644 --- a/src/views/course/CourseManage.vue +++ b/src/views/course/CourseManage.vue @@ -47,7 +47,18 @@
- 导出报名记录 + + 添加报名 + + + 导出报名记录 +
@@ -72,6 +83,22 @@ + + +
@@ -226,6 +253,17 @@
+ +
@@ -452,15 +490,27 @@ import apiCoursePortal from "@/api/modules/coursePortal.js"; import { mapGetters, mapActions } from "vuex"; import apiUser from "@/api/system/user.js"; import apiStudy from "@/api/modules/courseStudy.js"; +import apiCourse from "@/api/modules/course.js"; import { getToken } from "@/utils/token"; import axios from "axios"; import NameFilterSelect from "@/components/NameFilterSelect/index.vue"; +import SignupModal from "@/components/signup/SignupModal.vue"; +import AudienceModal from "@/components/signup/AudienceModal.vue"; NameFilterSelect; export default { - components: { NameFilterSelect }, + components: { NameFilterSelect, SignupModal, AudienceModal }, + props: { + showSignupActions: { + type: Boolean, + default: false, + }, + }, computed: { ...mapGetters(["resOwnerMap", "sysTypeMap"]), + hasCourseCrowds() { + return Array.isArray(this.courseCrowds) && this.courseCrowds.length > 0; + }, }, data() { return { @@ -514,6 +564,8 @@ export default { }, studyDateTime: [], courseDetail: JSON.parse(sessionStorage.getItem("courseDetail")), + // 课程详情中的 crowds 信息(通过 apiCourse.detail 获取) + courseCrowds: [], downParams: {}, typePress: false, isHomeWork: false, @@ -538,6 +590,9 @@ export default { value: "", input: "", tabName: "second", + audienceDialogVisible: false, + addSignupVisible: false, + selectedAudiences: [], learningSituation: { pageIndex: 1, //第几页 pageSize: 10, // 每页多少条 @@ -623,6 +678,7 @@ export default { }; }, mounted() { + this.getCourseDetailCrowds(); this.getSignupList(); this.getResOwnerTree().then((rs) => { this.resOwnerListMap = rs; @@ -639,6 +695,58 @@ export default { loadSysTypes: "sysType/loadSysTypes", }), + // 查询课程详情,获取 crowds 信息 + getCourseDetailCrowds() { + if (!this.courseDetail || !this.courseDetail.id) return; + apiCourse + .detail(this.courseDetail.id) + .then((res) => { + console.log('res1', res); + const result = res.result || {}; + this.courseCrowds = Array.isArray(result.crowds) ? result.crowds : []; + }) + .catch(() => { + this.courseCrowds = []; + }); + }, + // 添加报名按钮点击,根据 crowds 是否有值决定弹窗 + handleAddSignupClick() { + if (this.hasCourseCrowds) { + this.audienceDialogVisible = true; + } else { + this.addSignupVisible = true; + } + }, + handleSignupCreate(payload) { + console.log("signup payload", payload); + this.getSignupList(); + }, + handleDeleteSignup(row) { + this.$confirm(`确认删除${row.name || ''}的报名记录吗?`, '删除确认', { + confirmButtonText: '确定', + cancelButtonText: '取消', + dangerouslyUseHTMLString: true, + type: 'warning', + customClass: 'custom-confirm-dialog' + }).then(() => { + apicourseStudy.deleteSignUp(row.id, this.courseDetail.id) + .then((res) => { + if (res && res.status === 200) { + this.$showMessage("删除成功", 'success'); + this.getSignupList(); + } else if (res) { + this.$showMessage(res.message || "删除失败", 'error'); + } + }) + .catch((err) => { + this.$showMessage("删除失败", 'error'); + }); + }) + .catch((err) => { + // this.$showMessage('已取消删除', 'info'); + }); + }, + resetCommonResourceQuery() { this.$refs.commonResourceStudyPeopleNameFilter.handleReset(); this.commonResourceStudyPeopleQuery = { @@ -1079,6 +1187,10 @@ export default { this.learningRecords.pageIndex = val; this.getStudyRecords(); }, + handleAudienceConfirm(list) { + this.selectedAudiences = list; + this.getSignupList(); + }, // 报名列表 getSignupList() { let params = { @@ -1175,6 +1287,18 @@ export default { word-break: break-all; white-space: nowrap; } +.delete-action-link--danger { + color: #E32E2E; + &:hover { + color: #E32E2E; + } + &:active { + color: #E32E2E; + } + &:focus { + color: #E32E2E; + } +} #courseManage { .option-code { margin-left: 4px; From e8615ff1db7224260686bbfa6c5da810d855de71 Mon Sep 17 00:00:00 2001 From: huweihang <916879598@qq.com> Date: Wed, 17 Dec 2025 01:54:41 +0800 Subject: [PATCH 4/4] =?UTF-8?q?style:=20=E5=8F=97=E4=BC=97=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E5=AE=BD=E5=BA=A6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/signup/SignupModal.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/signup/SignupModal.vue b/src/components/signup/SignupModal.vue index 04fba641..9b5f35e5 100644 --- a/src/components/signup/SignupModal.vue +++ b/src/components/signup/SignupModal.vue @@ -596,7 +596,7 @@ export default { .right1 { border-left: 1px solid #f2f6fe; margin-left: 20px; - min-width: 200px; + max-width: 200px; .onerow { display: flex; @@ -635,7 +635,7 @@ export default { width: 64px; height: 24px; margin-top: 25px; - margin-right: 25px; + margin-right: 18px; display: flex; align-items: center; justify-content: center;