diff --git a/package-lock.json b/package-lock.json index 9ecda927..b5f3909e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,9 +83,9 @@ } }, "node_modules/@ant-design/icons-svg": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", - "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" }, "node_modules/@ant-design/icons-vue": { "version": "6.1.0", @@ -12570,9 +12570,9 @@ } }, "@ant-design/icons-svg": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", - "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" }, "@ant-design/icons-vue": { "version": "6.1.0", diff --git a/src/api/index.js b/src/api/index.js index 215b7666..f3f684d2 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -53,6 +53,7 @@ export const getProjectList = (obj) => http.post('/admin/project/list', obj) // 获取项目详情信息(包含阶段及任务列表) export const getProjectDetail = (obj) => http.get('/admin/project/detail', {params: obj}) +export const getDraftTask = (obj) => http.get('/admin/project/detailDraft', { params: obj }) //发布项目 export const releaseProject = (obj) => http.post('/admin/project/publish', obj) //获取项目学员 diff --git a/src/api/index1.js b/src/api/index1.js index ac32f578..fd519e53 100644 --- a/src/api/index1.js +++ b/src/api/index1.js @@ -133,7 +133,7 @@ export const getStuList = (obj) => http.post('/admin/orgStruct/getStudentRef', o //获取用户登录 export const getUser = () => http.post('/admin/CheckUser/login', { withCredentials: true }) //公共信息--------------------------------------------------- - +export const courseData =(obj)=> http.post("/admin/offcourse/allPlanList",obj); //添加项目学员 export const addStudentProject = (obj) => http.post('/admin/project/addStudent', obj) //添加课程学员 @@ -178,6 +178,7 @@ export const exportHomeWork = (obj) => http.get('/admin/student/exportHomeWork', export const exportHomeWorkTemplate = (obj) => http.get('/admin/student/exportHomeWorkTemplate', { params: obj }) //签到 export const attendanceSign = (obj) => http.post('/stu/task/attendance/sign', obj) +export const attendanceSignAll = (obj) => http.post('/stu/task/all/sign', obj) //请假 export const attendanceLeave = (obj) => http.post('/stu/task/attendance/leave', obj) diff --git a/src/assets/scss/common.scss b/src/assets/scss/common.scss index 6d09f7d9..95df1ef7 100644 --- a/src/assets/scss/common.scss +++ b/src/assets/scss/common.scss @@ -374,6 +374,234 @@ textarea { } } + .drawerMain { + .header { + height: 73px; + border-bottom: 1px solid #e8e8e8; + display: flex; + justify-content: space-between; + align-items: center; + + .headerTitle { + font-size: 18px; + font-weight: 600; + color: #333333; + line-height: 25px; + margin-left: 24px; + } + } + + .contentMain { + .main_items { + display: flex; + + margin-bottom: 12px; + margin-top: 32px; + flex-wrap: wrap; + + .mi_ipts { + display: flex; + margin-bottom: 20px; + + .mii_ipt { + display: flex; + align-items: center; + margin-right: 24px; + + .ipt_name { + white-space: nowrap; + } + } + } + + .mi_btns { + display: flex; + margin-left: 38px; + margin-bottom: 20px; + cursor: pointer; + + .btn { + padding: 0px 26px 0px 26px; + height: 38px; + border-radius: 8px; + border: 1px solid rgba(64, 158, 255, 1); + display: flex; + align-items: center; + justify-content: center; + margin-left: 14px; + flex-shrink: 0; + + .search { + background-size: 100%; + } + + .btnText { + font-size: 14px; + font-weight: 400; + line-height: 36px; + margin-left: 5px; + } + } + + .btn1 { + background: rgb(64, 158, 255); + + .search { + width: 15px; + height: 17px; + background-image: url("@/assets/images/coursewareManage/search0.png"); + } + + .btnText { + color: rgb(255, 255, 255); + } + } + + .btn2 { + background: rgb(255, 255, 255); + + .search { + width: 15px; + height: 17px; + background-image: url("@/assets/images/coursewareManage/reset1.png"); + } + + .btnText { + color: rgb(64, 158, 255); + } + } + + .btn1:hover { + background: rgb(255, 255, 255); + + .search { + background-image: url("@/assets/images/courseManage/search1.png"); + } + + .btnText { + color: #4ea6ff; + } + } + + .btn2:hover { + background: rgba(64, 158, 255, 1); + + .search { + background-image: url("@/assets/images/courseManage/reset0.png"); + } + + .btnText { + color: #ffffff; + } + } + } + } + + .main_notice { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 32px; + height: 40px; + background-color: #e9f6fe; + + .mntc_left { + display: flex; + align-items: center; + + .title { + color: rgba(0, 0, 0, 0.65); + margin-right: 17px; + } + + .data { + color: #4ea6ff; + } + + .notice_icon { + width: 14px; + height: 14px; + margin-right: 9px; + margin-left: 9px; + background-image: url(@/assets/images/coursewareManage/gan.png); + background-size: 100% 100%; + } + } + + .mntc_right { + cursor: pointer; + } + } + } + + .main_table { + position: relative; + padding-bottom: 80px; + + .ant-checkbox-wrapper { + align-items: center; + margin-top: -2px; + } + + .ant-table-selection-column { + padding: 0px !important; + padding-left: 5px !important; + } + + .ant-table-thead>tr>th { + background-color: rgba(239, 244, 252, 1); + } + + th.h { + background-color: #eff4fc !important; + } + + .ant-table-tbody>tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)>td { + background: #f6f9fd; + } + + .pa { + left: 0; + width: 100%; + display: flex; + justify-content: center; + position: absolute; + bottom: 20px; + } + } + + .main_btns { + height: 72px; + width: 100%; + bottom: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16); + + .btn1 { + width: 100px; + height: 40px; + border: 1px solid #4ea6ff; + border-radius: 8px; + color: #4ea6ff; + background-color: #fff; + cursor: pointer; + } + + .btn2 { + cursor: pointer; + width: 100px; + height: 40px; + background: #4ea6ff; + border-radius: 8px; + border: 0; + margin-left: 15px; + color: #fff; + } + } + } } //抽屉-------------------------------------------------------- diff --git a/src/components/TwoDimensionalCode.vue b/src/components/TwoDimensionalCode.vue index 4000fa25..20b1dbe0 100644 --- a/src/components/TwoDimensionalCode.vue +++ b/src/components/TwoDimensionalCode.vue @@ -21,8 +21,16 @@
-
- {{ codeInfo.name ? codeInfo.name : "" }} +
+
+ {{ codeInfo.name ? codeInfo.name : "" }} +
+
+ 开课:{{ codeInfo.name ? codeInfo.name : "" }} +
+
+ 讲师:{{ codeInfo.teacherName ? codeInfo.teacherName : "" }} +
-
{{ name }}
+
+
项目:{{ courseName }}
+
开课:{{ name }}
+
讲师:{{ createName }}
+
@@ -65,6 +69,8 @@ const props = defineProps({ default: 800 }, name: String, + createName: String, + courseName: String, title: { type: String, default: "二维码" @@ -162,15 +168,23 @@ function copyUrl() { display: flex; flex-direction: column; align-items: center; - + .qrm_body_info{ + width: 100%; + margin-left: 278px; + } .codename { font-size: 18px; font-weight: 400; color: #333333; line-height: 25px; - margin-bottom: 20px; + margin-bottom: 5px; margin-left: 20px; margin-right: 20px; + text-align: left; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 300px; } } diff --git a/src/components/drawers/AddOpenCourse.vue b/src/components/drawers/AddOpenCourse.vue index f1620f61..bd38f866 100644 --- a/src/components/drawers/AddOpenCourse.vue +++ b/src/components/drawers/AddOpenCourse.vue @@ -125,7 +125,7 @@ 面授时间
- --> + + + + +
-
-
+
+
授课教师
-
- +
+
+ + + 权重 +
+ + + +
+
+
@@ -262,13 +306,15 @@
- 允许项目内人员临时到场参加(不在本场次培训的人员可以临时签到参加) + :un-check-value="0" + @change="toggleCheckboxes('projectSignFlag')"> + 允许项目内人员临时到场参加(不在本场次培训的人员可以临时签到评估) + :un-check-value="0" + @change="toggleCheckboxes('outSignFlag')"> 允许项目外人员临时到场参加
@@ -370,31 +416,44 @@ @@ -1132,7 +1378,35 @@ defineExpose({ openDrawer }); margin: auto; align-items: center; margin-bottom: 23px; - + .teacher_input{ + .ant-input-number{ + width: 15%; + height: 40px !important; + border-radius: 8px !important; + border: 1px solid #C7CBD2 !important; + margin: 0 10px 0 10px; + padding-top: 3px; + } + } + .btn-add{ + margin: 0 10px 0 10px; + } + .btn-circle{ + text-align: center; + line-height: 100%; + margin-top: 5px; + .custom-icon{ + font-size: 20px; + svg{ + margin: auto; + } + } + span{ + width: 100%; + height: 100%; + font-size: 33px; + } + } .signbox { display: flex; justify-content: end; diff --git a/src/components/drawers/router/RouterFaceStu.vue b/src/components/drawers/router/RouterFaceStu.vue index 3c10f798..746c2927 100644 --- a/src/components/drawers/router/RouterFaceStu.vue +++ b/src/components/drawers/router/RouterFaceStu.vue @@ -37,7 +37,7 @@
- {{ item.teacher }} + {{ item.offteachers.map(item => item.teacherName).join(',') }}
@@ -81,11 +81,12 @@
-
+
签到二维码
@@ -94,6 +95,7 @@ style="margin-right: 20px" v-if="data[coursePlanIndex]?.assessmentId" @click="qrcodeAssement()" + :class="{ 'notClick': courseSelectRows.length > 0 }" >
评估二维码
@@ -101,6 +103,7 @@ class="btn btn1" style="margin-right: 20px" @click="qrcodeVisible()" + :class="{ 'notClick': courseSelectRows.length > 0 }" >
开课二维码
@@ -112,14 +115,13 @@ :infoType="type" @finash="submitCall" > - - - 添加学员 - +
+
+
添加学员
+
-
+
导入学员
@@ -127,18 +129,21 @@
批量签到
-
+
+
全部签到
+
+
导出签到数据
-
+
导出评估数据
@@ -180,6 +185,11 @@ const signOptions = ref([ value: 0, label: "请假", }, + { + id: 3, + value: 2, + label: "未签到", + }, ]); const props = defineProps({ type: { @@ -198,6 +208,10 @@ const props = defineProps({ type: Boolean, default: false, }, + courseName:{ + type: String, + default: null, + }, datasource: { type: Object, default: function() { @@ -277,7 +291,7 @@ const columns = ref([ ellipsis: true, className: "h", customRender: (text) => - {text.record.signStatus ? "签到" : text.record.leaveStatus ? "请假" : inAttendanceTime.value ? "-" : "缺勤"} + {text.record.signStatus ? "签到" : text.record.leaveStatus ? "请假" : inAttendanceTime.value ? "未签到" : "缺勤"} }, { title: "签到状态", @@ -288,7 +302,7 @@ const columns = ref([ ellipsis: true, className: "h", customRender: (text) => - {(text.record.signStatus || text.record.leaveStatus) ? "正常" : inAttendanceTime.value ? "-" : "异常"} + {(text.record.signStatus || text.record.leaveStatus) ? "正常" : inAttendanceTime.value ? "未签到" : "异常"} }, { title: "考勤情况", @@ -362,7 +376,19 @@ const batchSign = () => { }, }); }; - +const batchSignAll = () => { + dialog({ + content: "确定全部签到吗?", + ok: async () => { + message.success("全部签到成功"); + tableRef.value.toLoading(); + await api.attendanceSignAll({ + courseId: offcoursePlanId.value + }); + tableRef.value.fetch(); + }, + }); +}; function stuSign(text) { text.record.signStatus = !text.record.signStatus; text.record.leaveStatus = !text.record.signStatus; @@ -439,7 +465,7 @@ const qrcodeVisible = () => { url: `${location.protocol}//${location.host}${process.env.VUE_APP_BASE_API}/stu/project/redirectDetail?courseId=${courseId}`, }); } - + // qrCode({ // title: "【开课】二维码", // name: openCourseName.value?openCourseName.value:data.value[0]?.name, @@ -484,11 +510,13 @@ const qrcodeVisibleSign = () => { // url: `${location.protocol}//${location.host}${process.env.VUE_APP_BASE_API}/admin/student/studentSign?taskId=${data.value[coursePlanIndex.value]?.id}&taskType=${2}&type=${3}`, // }); }; - const qrcodeAssement = () =>{ qrCode({ title: "【评估】二维码", - name: data.value[coursePlanIndex.value]?.assessmentName, + courseName: props.courseName + '项目', + createName: data.value[coursePlanIndex.value].offteachers.map(teacher => teacher.teacherName).join(', '), + // name: data.value[coursePlanIndex.value]?.assessmentName + '课程评估', + name: openCourseName.value?openCourseName.value:data.value[coursePlanIndex.value]?.name + '课程评估', url: `${location.protocol}//${location.host}/student-h5/investigatpage?id=${data.value[coursePlanIndex.value]?.id}&type=3&infoId=${data.value[coursePlanIndex.value]?.id}&courseId=${data.value[coursePlanIndex.value].assessmentId}&chapterOrStageId=0`, }); } @@ -504,6 +532,17 @@ const change = (e) => {