mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-manage.git
synced 2025-12-09 02:46:45 +08:00
Merge branch 'test11' into zcwy-zsx0223
# Conflicts: # src/components/drawers/router/RouterFaceStu.vue
This commit is contained in:
12
package-lock.json
generated
12
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
//获取项目学员
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//抽屉--------------------------------------------------------
|
||||
|
||||
@@ -21,8 +21,16 @@
|
||||
</div>
|
||||
<div class="downloadCode" style="">
|
||||
<div class="qrm_body">
|
||||
<div class="codename">
|
||||
{{ codeInfo.name ? codeInfo.name : "" }}
|
||||
<div :class="codeInfo.teacherName?'qrm_body_item':''">
|
||||
<div v-if="codeInfo.name&&!codeInfo.teacherName" class="codename">
|
||||
{{ codeInfo.name ? codeInfo.name : "" }}
|
||||
</div>
|
||||
<div v-if="codeInfo.name&&codeInfo.teacherName" class="codename">
|
||||
开课:{{ codeInfo.name ? codeInfo.name : "" }}
|
||||
</div>
|
||||
<div v-if="codeInfo.teacherName" class="codename">
|
||||
讲师:{{ codeInfo.teacherName ? codeInfo.teacherName : "" }}
|
||||
</div>
|
||||
</div>
|
||||
<qrcode-vue
|
||||
:value="codeInfo.url.startsWith('/')?(`${domain+codeInfo.url}&t=10`):`${codeInfo.url}&t=10`"
|
||||
@@ -163,6 +171,7 @@ export default {
|
||||
title: "",
|
||||
name: "",
|
||||
url: "",
|
||||
teacherName: "",
|
||||
};
|
||||
state.codeInfo = Object.assign(obj, props.codeInfo);
|
||||
console.log("codeInfo22222", state.codeInfo, props.index, props.type);
|
||||
@@ -241,6 +250,10 @@ export default {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
.qrm_body_item{
|
||||
width: 100%;
|
||||
margin-left: 270px;
|
||||
}
|
||||
.codename {
|
||||
font-size: 18px;
|
||||
font-weight: 400;
|
||||
@@ -249,6 +262,10 @@ export default {
|
||||
margin-bottom: 20px;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 300px;
|
||||
}
|
||||
}
|
||||
.codeUrl {
|
||||
|
||||
@@ -18,7 +18,11 @@
|
||||
</div>
|
||||
<div class="downloadCode" style="">
|
||||
<div class="qrm_body">
|
||||
<div class="codename">{{ name }}</div>
|
||||
<div class="qrm_body_info">
|
||||
<div class="codename" v-if="courseName">项目:{{ courseName }}</div>
|
||||
<div class="codename">开课:{{ name }}</div>
|
||||
<div class="codename" v-if="createName">讲师:{{ createName }}</div>
|
||||
</div>
|
||||
<QrcodeVue :value="url" :size="size" style="width: 200px; height: 200px"></QrcodeVue>
|
||||
</div>
|
||||
</div>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
<span style="margin-right: 3px">面授时间</span>
|
||||
</div>
|
||||
<div class="select fitems">
|
||||
<a-range-picker
|
||||
<!-- <a-range-picker
|
||||
style="width: 88%; height: 40px; border-radius: 8px"
|
||||
:show-time="{ format: 'HH:mm' }"
|
||||
format="YYYY-MM-DD HH:mm"
|
||||
@@ -135,12 +135,46 @@
|
||||
separator="至"
|
||||
:placeholder="[' 开始时间', ' 结束时间']"
|
||||
:disabled="editBeginClass"
|
||||
/> -->
|
||||
<a-date-picker
|
||||
style="width: 41%; height: 40px; border-radius: 8px"
|
||||
:show-time="{ format: 'HH:mm' }"
|
||||
:format="['YYYY-MM-DD HH:mm','YYYY/MM/DD HH:mm']"
|
||||
valueFormat="YYYY-MM-DD HH:mm"
|
||||
v-model:value="dateTime[0]"
|
||||
@change="timeChange"
|
||||
:placeholder="' 开始时间'"
|
||||
:disabled="editBeginClass"
|
||||
@blur="onBlurStart"
|
||||
@focus="onFocusStart"
|
||||
@select="onDateSelect"
|
||||
:open="openStart"
|
||||
@ok="onOkStart"
|
||||
ref="datePicker"
|
||||
/>
|
||||
|
||||
<span style="margin: 0 10px;">至</span>
|
||||
<!-- 第二个日期选择器,用于结束时间 -->
|
||||
<a-date-picker
|
||||
style="width: 41%; height: 40px; border-radius: 8px"
|
||||
:show-time="{ format: 'HH:mm' }"
|
||||
:format="['YYYY-MM-DD HH:mm','YYYY/MM/DD HH:mm']"
|
||||
valueFormat="YYYY-MM-DD HH:mm"
|
||||
v-model:value="dateTime[1]"
|
||||
@change="timeChangeEnd"
|
||||
:placeholder="' 结束时间'"
|
||||
:disabled="editBeginClass"
|
||||
@focus="onFocusEnd"
|
||||
@blur="onBlurEnd"
|
||||
@select="onDateEnd"
|
||||
:open="openEnd"
|
||||
@ok="onOkEnd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="cstm_items">
|
||||
<div class="signbox">
|
||||
<div class="cstm_items" style="align-items: baseline;">
|
||||
<div class="signbox" style="position: relative;top: -5px;">
|
||||
<div class="sign">
|
||||
<img
|
||||
src="@/assets/images/coursewareManage/asterisk.png"
|
||||
@@ -149,12 +183,22 @@
|
||||
</div>
|
||||
<span style="margin-right: 3px">授课教师</span>
|
||||
</div>
|
||||
<div class="select" style="width: 74.5%">
|
||||
<ProjectManager
|
||||
v-model:value="formData.teacherId"
|
||||
v-model:name="formData.teacher"
|
||||
:disabled="editBeginClass"
|
||||
></ProjectManager>
|
||||
<div class="teacher_input select" style="display: flex; flex-wrap: wrap;width: 74.5%">
|
||||
<div v-for="(item, index) in formData.offteachers"
|
||||
:key="index" style="display: flex;margin-bottom: 10px;width: 100%;">
|
||||
<ProjectManager
|
||||
v-model:value="item.teacherId"
|
||||
v-model:name="item.teacherName"
|
||||
:disabled="editBeginClass"
|
||||
></ProjectManager>
|
||||
<a-input-number :min="0" @change="inputWeightChange(index)" v-model:value="item.weight" placeholder="%"/>
|
||||
<span style="margin-top: 10px;width: 34px;">权重</span>
|
||||
<div style="display: flex;">
|
||||
<a-button v-if="index===0" shape="circle" class="btn-circle btn-add" @click="inputAdd">+</a-button>
|
||||
<a-button shape="circle" class="btn-circle" @click="inputRemove(index)" :disabled="formData.offteachers.length == 1"><template #icon><delete-outlined class="custom-icon"/></template></a-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="cstm_items">
|
||||
@@ -262,13 +306,15 @@
|
||||
<div class="b_input" style="width: 88%;display: flex;flex-direction: column;">
|
||||
<CheckBox v-model="formData.projectSignFlag"
|
||||
:check-value="1"
|
||||
:un-check-value="0">
|
||||
<span style="color: #6d7584">允许项目内人员临时到场参加(不在本场次培训的人员可以临时签到参加)</span>
|
||||
:un-check-value="0"
|
||||
@change="toggleCheckboxes('projectSignFlag')">
|
||||
<span style="color: #6d7584">允许项目内人员临时到场参加(不在本场次培训的人员可以临时签到评估)</span>
|
||||
</CheckBox>
|
||||
<CheckBox v-model="formData.outSignFlag"
|
||||
:check-value="1"
|
||||
style="margin-left: 0px;"
|
||||
:un-check-value="0">
|
||||
:un-check-value="0"
|
||||
@change="toggleCheckboxes('outSignFlag')">
|
||||
<span style="color: #6d7584">允许项目外人员临时到场参加</span>
|
||||
</CheckBox>
|
||||
</div>
|
||||
@@ -370,31 +416,44 @@
|
||||
</a-drawer>
|
||||
</template>
|
||||
<script setup lang="jsx">
|
||||
import {defineProps, ref, nextTick, computed} from "vue";
|
||||
import {defineProps, ref, nextTick, computed,defineEmits } from "vue";
|
||||
import {Form, message} from "ant-design-vue";
|
||||
import FJUpload from "@/components/common/FJUpload";
|
||||
import CheckBox from "@/components/common/CheckBox";
|
||||
import RangePicker from "@/components/common/RangePicker";
|
||||
import ProjectManager from "@/components/project/ProjectManagerNew";
|
||||
import ProjectManager from "@/components/project/ProjectManagerNewTeacher";
|
||||
import AddHomework from "@/components/drawers/CommonHomework.vue";
|
||||
import AddTest from "@/components/drawers/CommonTest.vue";
|
||||
import NameInput from "@/components/project/NameInput";
|
||||
import AssessmentList from "@/components/drawers/AssessmentList.vue";
|
||||
import {COURSE_PLAN_EDIT, COURSE_PLAN_PAGE, DEL_PLAN, EXAM_DETAIL, WORK_DETAIL} from "@/api/apis";
|
||||
import {COURSE_PLAN_EDIT, COURSE_PLAN_PAGE, DEL_PLAN, EXAM_DETAIL, WORK_DETAIL,PROJECT_DETAIL_MODIFY,PROJECT_RELEASE} from "@/api/apis";
|
||||
import dayjs from "dayjs";
|
||||
import BaseTable from "@/components/common/BaseTable";
|
||||
import {request,useRowsPageNoInit} from "@/api/request";
|
||||
import dialog from "@/utils/dialog";
|
||||
import {useResetRef} from "@/utils/useCommon";
|
||||
import { validateName } from "@/api/index1";
|
||||
|
||||
import moment from 'moment';
|
||||
import * as api from "../../api/indexTaskadd";
|
||||
import {useRoute} from "vue-router";
|
||||
import { DeleteOutlined } from '@ant-design/icons-vue';
|
||||
const props = defineProps({
|
||||
type: Number,
|
||||
});
|
||||
const openCourseVisible = ref(false);
|
||||
const offCourseNewVisiable = ref(false);
|
||||
const tableRef = ref();
|
||||
|
||||
const toggleCheckboxes = (checkedName)=>{
|
||||
if (checkedName === 'projectSignFlag') {
|
||||
if(formData.value.projectSignFlag){
|
||||
formData.value.outSignFlag = !formData.value.projectSignFlag;
|
||||
}
|
||||
} else if (checkedName === 'outSignFlag') {
|
||||
if(formData.value.outSignFlag){
|
||||
formData.value.projectSignFlag = !formData.value.outSignFlag;
|
||||
}
|
||||
}
|
||||
}
|
||||
const columns = ref([
|
||||
{
|
||||
title: "名称",
|
||||
@@ -423,6 +482,19 @@ const columns = ref([
|
||||
key: "teacher",
|
||||
width: "20%",
|
||||
align: "center",
|
||||
customRender: ({ record }) => {
|
||||
const teachers = record.offteachers;
|
||||
return teachers.map((teacher, index) => {
|
||||
// 如果需要显示为列表形式
|
||||
return (
|
||||
<div key={index}>
|
||||
{teacher.teacherName}
|
||||
{index !== teachers.length - 1 && ', '}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
},
|
||||
|
||||
},
|
||||
{
|
||||
title: "学员数",
|
||||
@@ -461,6 +533,13 @@ const params = ref({
|
||||
taskId: "",
|
||||
createBeginTime: '',
|
||||
createEndTime: '',
|
||||
offteachers:[
|
||||
{
|
||||
teacherId: '',
|
||||
teacherName: '',
|
||||
weight: '',
|
||||
}
|
||||
]
|
||||
});
|
||||
const validated = ref(0);
|
||||
const dateTime = ref([]);
|
||||
@@ -470,7 +549,7 @@ const formData = useResetRef({
|
||||
name: "",
|
||||
address: "",
|
||||
teacherId: "",
|
||||
teacher: "",
|
||||
// teacher: "",
|
||||
beforeValue: "",
|
||||
afterStartValue: "",
|
||||
applyFlag: 0,
|
||||
@@ -487,6 +566,13 @@ const formData = useResetRef({
|
||||
offcourseId: "",
|
||||
draftTaskId: "",
|
||||
taskId: "",
|
||||
offteachers: [
|
||||
{
|
||||
teacherId: "",
|
||||
teacherName: "",
|
||||
weight:''
|
||||
}
|
||||
],
|
||||
});
|
||||
const formDataRule = {
|
||||
name: [
|
||||
@@ -495,46 +581,134 @@ const formDataRule = {
|
||||
message: "请输入开课名称",
|
||||
},
|
||||
],
|
||||
beginTime: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择开始时间",
|
||||
},
|
||||
],
|
||||
endTime: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择结束时间",
|
||||
},
|
||||
],
|
||||
teacher: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择教师",
|
||||
},
|
||||
],
|
||||
teacherId: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择教师",
|
||||
},
|
||||
],
|
||||
// duration: [
|
||||
// beginTime: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: "请输入持续时间",
|
||||
// message: "请选择开始时间",
|
||||
// },
|
||||
// ],
|
||||
// endTime: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: "请选择结束时间",
|
||||
// },
|
||||
// ],
|
||||
offteachers: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (!value.every(item => item.teacherName)) {
|
||||
callback(new Error('请填写教师名称和设置权重'));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
message: '请填写教师名称和设置权重',
|
||||
fields: {
|
||||
teacherName: [
|
||||
{
|
||||
required: true,
|
||||
message: "请填写教师名称和设置权重",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
const { validate } = Form.useForm(formData, formDataRule);
|
||||
const durationText = computed(() => dateTime.value?.length?dayjs(dateTime.value[1]).diff(dayjs(dateTime.value[0]),'minute'):'请输入持续时间');
|
||||
function timeChange(time, timeStr) {
|
||||
formData.value.beginTime = timeStr[0];
|
||||
formData.value.endTime = timeStr[1];
|
||||
|
||||
function inputAdd() {
|
||||
formData.value.offteachers.push({
|
||||
teacherId: "",
|
||||
teacherName: "",
|
||||
weight: '',
|
||||
});
|
||||
}
|
||||
function inputRemove(index) {
|
||||
dialog({
|
||||
content: "确定删除此授课教师吗?",
|
||||
ok: async () => {
|
||||
formData.value.offteachers.splice(index, 1);
|
||||
message.success("删除成功");
|
||||
},
|
||||
});
|
||||
}
|
||||
const totalWeightSum = ref(0)
|
||||
function inputWeightChange(index) {
|
||||
let totalWeight = 0
|
||||
formData.value.offteachers.forEach(item => {
|
||||
totalWeight += Number(item.weight);
|
||||
});
|
||||
if (totalWeight > 100) {
|
||||
message.info('权重值最大为100%')
|
||||
formData.value.offteachers[index].weight -= totalWeight - 100;
|
||||
totalWeight = 100;
|
||||
}
|
||||
totalWeightSum.value = totalWeight
|
||||
}
|
||||
function timeChange(timeStr) {
|
||||
console.log(timeStr,'timeStr')
|
||||
formData.value.beginTime = timeStr;
|
||||
// formData.value.duration = durationText.value
|
||||
// formData.value.duration || (formData.value.duration = dayjs(timeStr[1]).diff(dayjs(timeStr[0]),'minute'))
|
||||
}
|
||||
|
||||
function onDateSelect(date) {
|
||||
const month = String(date.$M+1).padStart(2, '0')
|
||||
const day = String(date.$D).padStart(2, '0')
|
||||
const hour = String(date.$H).padStart(2, '0')
|
||||
const minute = String(date.$m).padStart(2, '0')
|
||||
dateTime.value[0]=date.$y+'-'+month+'-'+day+' '+hour+':'+minute
|
||||
}
|
||||
const openStart = ref(false)
|
||||
const onOkStart = ()=>{
|
||||
openStart.value = false
|
||||
}
|
||||
function onBlurStart(e){
|
||||
dateTime.value[0]=e.target.value
|
||||
openStart.value = false
|
||||
}
|
||||
function onFocusStart(){
|
||||
openStart.value = true
|
||||
if(!dateTime.value[0]){
|
||||
// dateTime.value[0] = moment().format('YYYY-MM-DD HH:mm')
|
||||
// let now=new Date()
|
||||
// let start=new Date(now.setFullYear(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0))
|
||||
// dateTime.value = [
|
||||
// moment(start).format('YYYY-MM-DD HH:mm'),
|
||||
// dateTime.value[1]
|
||||
// ];
|
||||
}
|
||||
}
|
||||
function timeChangeEnd(timeStr){
|
||||
formData.value.endTime = timeStr;
|
||||
}
|
||||
const openEnd = ref(false)
|
||||
const onOkEnd = ()=>{
|
||||
openEnd.value = false
|
||||
}
|
||||
function onBlurEnd(e){
|
||||
dateTime.value[1]=e.target.value
|
||||
openEnd.value = false
|
||||
}
|
||||
function onDateEnd(date) {
|
||||
const month = String(date.$M+1).padStart(2, '0')
|
||||
const day = String(date.$D).padStart(2, '0')
|
||||
const hour = String(date.$H).padStart(2, '0')
|
||||
const minute = String(date.$m).padStart(2, '0')
|
||||
dateTime.value[1]=date.$y+'-'+month+'-'+day+' '+hour+':'+minute
|
||||
}
|
||||
function onFocusEnd(){
|
||||
openEnd.value = true
|
||||
// if(!dateTime.value[1]){
|
||||
// let now=new Date()
|
||||
// let start=new Date()
|
||||
// let end=new Date(now.setFullYear(now.getFullYear()))
|
||||
// dateTime.value = [
|
||||
// dateTime.value[0],
|
||||
// moment(end).format('YYYY-MM-DD HH:mm')
|
||||
// ];
|
||||
// }
|
||||
}
|
||||
function search() {
|
||||
tableRef.value.fetch();
|
||||
}
|
||||
@@ -557,9 +731,19 @@ const closeDrawer = () => {
|
||||
draftTaskId: params.value.draftTaskId,
|
||||
});
|
||||
};
|
||||
|
||||
function confirm() {
|
||||
const route = useRoute();
|
||||
const projectInfo = ref({});
|
||||
const emit = defineEmits(['call-parent-method']);
|
||||
const confirm = async()=>{
|
||||
closeDrawer();
|
||||
await api.getDraftTask({projectId: route.query.projectId}).then((res) => {
|
||||
projectInfo.value = res.data.data
|
||||
});
|
||||
request(PROJECT_DETAIL_MODIFY, { ...projectInfo.value });
|
||||
if(projectInfo.value.projectInfo.status==3){
|
||||
request(PROJECT_RELEASE, {projectId: route.query.projectId})
|
||||
}
|
||||
emit('call-parent-method');
|
||||
}
|
||||
|
||||
const createNewCourse = () => {
|
||||
@@ -568,10 +752,18 @@ const createNewCourse = () => {
|
||||
type: props.type,
|
||||
offcourseId: params.value.offcourseId,
|
||||
draftTaskId: params.value.draftTaskId,
|
||||
name:courseName.value
|
||||
});
|
||||
dateTime.value = [];
|
||||
dateTime.value = [moment().format('YYYY-MM-DD HH:mm'),''];
|
||||
validated.value = 0;
|
||||
onceName.value = "";
|
||||
formData.value.offteachers = [
|
||||
{
|
||||
teacherId: "",
|
||||
teacherName: "",
|
||||
weight: '',
|
||||
},
|
||||
];
|
||||
offCourseNewVisiable.value = true;
|
||||
};
|
||||
const handleCancelStu = () => offCourseNewVisiable.value = false;
|
||||
@@ -597,10 +789,45 @@ const del = (id,record) => {
|
||||
};
|
||||
|
||||
async function coursePlanConfirm() {
|
||||
|
||||
if(!dateTime.value[0]){
|
||||
message.info('开始时间未填写')
|
||||
return
|
||||
}
|
||||
if(!dateTime.value[1]){
|
||||
message.info('结束时间未填写')
|
||||
return
|
||||
}
|
||||
await validate().catch(({ errorFields }) => {
|
||||
message.warning(errorFields[0].errors.join());
|
||||
throw Error("数据校验不通过");
|
||||
});
|
||||
inputWeightChange()
|
||||
if(formData.value.offteachers.length==1&& totalWeightSum.value!=100){
|
||||
message.error('单名教师您设置的权重应该是100%')
|
||||
return
|
||||
}else if(formData.value.offteachers.length>1&& totalWeightSum.value!=100){
|
||||
console.log(totalWeightSum.value,'权重值不为100%')
|
||||
message.error('多名教师权重合计值为100%')
|
||||
return
|
||||
}
|
||||
const teacherNames = new Set(formData.value.offteachers.map(item => item.teacherName));
|
||||
if (teacherNames.size !== formData.value.offteachers.length) {
|
||||
message.error('教师重复,请检查');
|
||||
return;
|
||||
}
|
||||
if(formData.value.offteachers.some(item => item.weight==0)){
|
||||
message.error('权重值不能为0%')
|
||||
return
|
||||
}
|
||||
if(editBeginClass.value){
|
||||
message.info('讲师费已进入审批阶段,无法编辑')
|
||||
return
|
||||
}
|
||||
if(dateTime.value.length<2){
|
||||
message.info('请选择开始时间和结束时间')
|
||||
return
|
||||
}
|
||||
await validate().catch(({ errorFields }) => {
|
||||
message.warning(errorFields[0].errors.join());
|
||||
throw Error("数据校验不通过");
|
||||
@@ -623,7 +850,19 @@ async function coursePlanConfirm() {
|
||||
// TODO 当点击选择了是否评估按钮 点击保存的时候没有选择评估 则是否需要评估重置为 0 不需要
|
||||
formData.value.evalFlag = formData.value.assessmentName ? 1 : 0;
|
||||
formData.value.duration = formData.value.duration ? formData.value.duration : durationText.value
|
||||
formData.value.outSignFlag = formData.value.outSignFlag ? 1 : 0;
|
||||
formData.value.projectSignFlag = formData.value.projectSignFlag ? 1 : 0;
|
||||
formData.value.beginTime = dateTime.value[0]
|
||||
formData.value.endTime = dateTime.value[1]
|
||||
await request(COURSE_PLAN_EDIT, { ...formData.value });
|
||||
await api.getDraftTask({projectId: route.query.projectId}).then((res) => {
|
||||
projectInfo.value = res.data.data
|
||||
});
|
||||
request(PROJECT_DETAIL_MODIFY, { ...projectInfo.value });
|
||||
if(projectInfo.value.projectInfo.status==3){
|
||||
request(PROJECT_RELEASE, {projectId: route.query.projectId})
|
||||
}
|
||||
emit('call-parent-method');
|
||||
handleCancelStu();
|
||||
tableRef.value.fetch();
|
||||
}
|
||||
@@ -637,6 +876,8 @@ function planEdit(record) {
|
||||
}
|
||||
onceName.value = record.name;
|
||||
formData.value = { ...record };
|
||||
formData.value.duration = ''
|
||||
console.log({ ...record },'{ ...record }')
|
||||
validated.value = 0;
|
||||
formData.value.homeWorkId && request(WORK_DETAIL(formData.value.homeWorkId), {}).then(res => formData.value.workInfo = res.data);
|
||||
formData.value.testId && request(EXAM_DETAIL(formData.value.testId), {}).then(res => formData.value.examInfo = res.data);
|
||||
@@ -675,6 +916,11 @@ const changevalue = (e) => {
|
||||
const logT = () => {
|
||||
formData.value.examInfo = {};
|
||||
};
|
||||
const removePG = () => {
|
||||
formData.value.assessmentId = null;
|
||||
formData.value.assessmentName = "";
|
||||
// state.isEvaluate = "0";
|
||||
};
|
||||
|
||||
defineExpose({ openDrawer });
|
||||
</script>
|
||||
@@ -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;
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</div>
|
||||
<div style="font-size: 14px;">
|
||||
<img src="../../../assets/images/courseManage/persion.png" style="width:16px;height:16px;">
|
||||
{{ item.teacher }}
|
||||
{{ item.offteachers.map(item => item.teacherName).join(',') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -81,11 +81,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btnss" style="margin-top: 20px" v-if="checkPer(permissions,createId) && data?.length">
|
||||
<div class="btnss" style="margin-top: 20px;flex-wrap: wrap;" v-if="checkPer(permissions,createId) && data?.length">
|
||||
<div
|
||||
class="btn btn1"
|
||||
style="margin-right: 20px"
|
||||
@click="qrcodeVisibleSign()"
|
||||
:class="{ 'notClick': courseSelectRows.length > 0 }"
|
||||
>
|
||||
<div class="wz">签到二维码</div>
|
||||
</div>
|
||||
@@ -94,6 +95,7 @@
|
||||
style="margin-right: 20px"
|
||||
v-if="data[coursePlanIndex]?.assessmentId"
|
||||
@click="qrcodeAssement()"
|
||||
:class="{ 'notClick': courseSelectRows.length > 0 }"
|
||||
>
|
||||
<div class="wz">评估二维码</div>
|
||||
</div>
|
||||
@@ -101,6 +103,7 @@
|
||||
class="btn btn1"
|
||||
style="margin-right: 20px"
|
||||
@click="qrcodeVisible()"
|
||||
:class="{ 'notClick': courseSelectRows.length > 0 }"
|
||||
>
|
||||
<div class="wz">开课二维码</div>
|
||||
</div>
|
||||
@@ -112,14 +115,13 @@
|
||||
:infoType="type"
|
||||
@finash="submitCall"
|
||||
>
|
||||
<a-button class="cus-btn" style="background: #4ea6ff; color: #fff">
|
||||
<template #icon><img style="margin-right: 10px" src="../../../assets/images/courseManage/add0.png"/>
|
||||
</template>
|
||||
添加学员
|
||||
</a-button>
|
||||
<div :class="{ 'notClick': courseSelectRows.length > 0 }" class="btn btn1">
|
||||
<div class="img3"></div>
|
||||
<div class="wz">添加学员</div>
|
||||
</div>
|
||||
</CommonStudent>
|
||||
<CommonImport @change="change" title="导入学员" :template-url="stuTemplateUrl" :data="{ targetId: offcoursePlanId, type:3 }" :url="`/admin/student/importStudent`" name="uploadFile">
|
||||
<div class="btn btn1" style="margin-right: 20px;margin-left: 20px">
|
||||
<div :class="{ 'notClick': courseSelectRows.length > 0 }" class="btn btn1" style="margin-right: 20px;margin-left: 20px">
|
||||
<div class="img1"></div>
|
||||
<div class="wz">导入学员</div>
|
||||
</div>
|
||||
@@ -127,18 +129,21 @@
|
||||
<div class="btn btn1" @click="batchSign" style="margin-right: 20px">
|
||||
<div class="wz">批量签到</div>
|
||||
</div>
|
||||
<div class="btn btn1" @click="exportTaskStu" style="margin-right: 20px">
|
||||
<div class="btn btn1" @click="batchSignAll" style="margin-right: 20px">
|
||||
<div class="wz">全部签到</div>
|
||||
</div>
|
||||
<div class="btn btn1" @click="exportTaskStu" style="margin-right: 20px" :class="{ 'notClick': courseSelectRows.length > 0 }">
|
||||
<div class="img2"></div>
|
||||
<div class="wz">导出签到数据</div>
|
||||
</div>
|
||||
<div class="btn btn1" @click="exportAssessment" v-if="data[coursePlanIndex]?.assessmentId">
|
||||
<div class="btn btn1" @click="exportAssessment" v-if="data[coursePlanIndex]?.assessmentId" :class="{ 'notClick': courseSelectRows.length > 0 }">
|
||||
<div class="img2"></div>
|
||||
<div class="wz">导出评估数据</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tableBox" style="margin-top: 30px">
|
||||
<BaseTable ref="tableRef" :url="STUDENT_LIST" v-model:params="params" :columns="columns" :init="false"
|
||||
v-model:selectedRows="courseSelectRows"
|
||||
v-model:selectedRows="courseSelectRows" :showSizeChanger="true"
|
||||
type="checkbox"/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -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) =>
|
||||
<span>{text.record.signStatus ? "签到" : text.record.leaveStatus ? "请假" : inAttendanceTime.value ? "-" : "缺勤"}</span>
|
||||
<span>{text.record.signStatus ? "签到" : text.record.leaveStatus ? "请假" : inAttendanceTime.value ? "未签到" : "缺勤"}</span>
|
||||
},
|
||||
{
|
||||
title: "签到状态",
|
||||
@@ -288,7 +302,7 @@ const columns = ref([
|
||||
ellipsis: true,
|
||||
className: "h",
|
||||
customRender: (text) =>
|
||||
<span>{(text.record.signStatus || text.record.leaveStatus) ? "正常" : inAttendanceTime.value ? "-" : "异常"}</span>
|
||||
<span>{(text.record.signStatus || text.record.leaveStatus) ? "正常" : inAttendanceTime.value ? "未签到" : "异常"}</span>
|
||||
},
|
||||
{
|
||||
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) => {
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.notClick{
|
||||
// cursor: pointer;
|
||||
// pointer-events: none;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
border: 1px solid #d7d7d7 !important;
|
||||
border-radius: 8px;
|
||||
color: #fff !important;
|
||||
background-color: #d7d7d7 !important;
|
||||
}
|
||||
|
||||
.me {
|
||||
.ant-modal-body {
|
||||
padding: 0px;
|
||||
@@ -748,6 +787,13 @@ const change = (e) => {
|
||||
background-size: 100% 100%;
|
||||
margin-right: 7px;
|
||||
}
|
||||
.img3 {
|
||||
width: 15px;
|
||||
height: 17px;
|
||||
background-image: url(../../../assets/images/courseManage/add0.png);
|
||||
background-size: 100% 100%;
|
||||
margin-right: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn1 {
|
||||
@@ -777,7 +823,7 @@ const change = (e) => {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
margin-bottom: 10px;
|
||||
.img1 {
|
||||
width: 19px;
|
||||
height: 19px;
|
||||
@@ -793,6 +839,13 @@ const change = (e) => {
|
||||
background-size: 100% 100%;
|
||||
margin-right: 7px;
|
||||
}
|
||||
.img3 {
|
||||
width: 19px;
|
||||
height: 19px;
|
||||
background-image: url(../../../assets/images/courseManage/add0.png);
|
||||
background-size: 100% 100%;
|
||||
margin-right: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn1 {
|
||||
@@ -874,7 +927,15 @@ const change = (e) => {
|
||||
|
||||
.tableBox {
|
||||
// margin-bottom: 80px;
|
||||
|
||||
.ant-select-dropdown{
|
||||
display: inline-block;
|
||||
}
|
||||
.ant-select-selection-item{
|
||||
margin-left: 3px;
|
||||
}
|
||||
.ant-pagination-options-size-changer.ant-select{
|
||||
width: 84px;
|
||||
}
|
||||
.classify {
|
||||
// margin-left: 11px !important;
|
||||
// padding-left: 9px !important;
|
||||
|
||||
@@ -85,7 +85,7 @@ watch(props, () => {
|
||||
isExistName.value = true;
|
||||
}
|
||||
modelV.value.value = props.value;
|
||||
});
|
||||
},{immediate: true});
|
||||
|
||||
watch(() => modelV.value.value, () => {
|
||||
emit("update:validated", 1);
|
||||
|
||||
@@ -45,13 +45,20 @@ const id = computed(() => {
|
||||
});
|
||||
|
||||
const emit = defineEmits({});
|
||||
|
||||
const options = computed(() =>
|
||||
store.state.project_level.map((e) => ({
|
||||
const secondItem = store.state.project_level.find((e, index) => index === 1);
|
||||
const options = computed(() =>{
|
||||
const projectLevels = store.state.project_level.slice();
|
||||
const lastItem = projectLevels.pop();
|
||||
projectLevels.unshift(lastItem);
|
||||
if (projectLevels.length >= 3) {
|
||||
const thirdItem = projectLevels.splice(1, 1)[0];
|
||||
projectLevels.splice(2, 0, thirdItem);
|
||||
}
|
||||
return projectLevels.map((e) => ({
|
||||
value: parseInt(e.value),
|
||||
label: e.name,
|
||||
}))
|
||||
);
|
||||
}));
|
||||
});
|
||||
|
||||
function change(key) {
|
||||
emit("update:value", key);
|
||||
|
||||
121
src/components/project/ProjectManagerNewTeacher.vue
Normal file
121
src/components/project/ProjectManagerNewTeacher.vue
Normal file
@@ -0,0 +1,121 @@
|
||||
<template>
|
||||
<a-select
|
||||
:getPopupContainer="
|
||||
(triggerNode) => {
|
||||
return triggerNode.parentNode || document.body;
|
||||
}
|
||||
"
|
||||
v-model:value="managerArray"
|
||||
:placeholder="placeholder"
|
||||
:filterOption="false"
|
||||
:options="isOpen?options:selectOptions"
|
||||
allowClear
|
||||
showSearch
|
||||
:mode="mode"
|
||||
:disabled="disabled"
|
||||
@popupScroll="memberScroll"
|
||||
@search="searchMember"
|
||||
:open="isOpen"
|
||||
@change="change"
|
||||
@blur="blur"
|
||||
:show-arrow="false"
|
||||
style="width: 60%"
|
||||
>
|
||||
<template v-if="loading" #notFoundContent>
|
||||
<a-spin size="small"/>
|
||||
</template>
|
||||
</a-select>
|
||||
</template>
|
||||
<script setup>
|
||||
import {computed, defineEmits, defineProps, onMounted, ref, watch} from "vue";
|
||||
import {useThrottlePage} from "@/api/request";
|
||||
import {USER_LIST} from "@/api/apis";
|
||||
|
||||
const props = defineProps({
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
name: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
disabled: Boolean,
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: "请输入搜索关键字",
|
||||
},
|
||||
mode: String
|
||||
})
|
||||
|
||||
const selectOptions = ref([])
|
||||
|
||||
const managerArray = computed(() => props.mode === 'select' ? props.value : (props.value ? props.value.split(',') : []))
|
||||
|
||||
const emit = defineEmits({})
|
||||
|
||||
const isOpen = ref(false)
|
||||
|
||||
const memberParam = ref({keyword: '', pageNo:1, pageSize: 20})
|
||||
|
||||
const {data: userList, loading} = useThrottlePage(USER_LIST, memberParam.value, false)
|
||||
|
||||
const options = computed(() => userList.value.filter(e => !(props.value + '').includes(e.id)).map(e => ({
|
||||
label: e.realName + e.userNo,
|
||||
value: e.id,
|
||||
...e,
|
||||
audienceList: null
|
||||
})))
|
||||
|
||||
watch(props, init)
|
||||
|
||||
function init() {
|
||||
//第一次进来 编辑赋值
|
||||
if (props.value && (props.value + '') !== selectOptions.value.map(e => e.value).join(',')) {
|
||||
selectOptions.value = (props.value + '').split(',').map((e, i) => ({label: props.name.split(',')[i], value: e}))
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
console.log('onMounted')
|
||||
init()
|
||||
})
|
||||
|
||||
|
||||
const memberScroll = ({target: {scrollHeight, scrollTop, clientHeight}}) => {
|
||||
scrollHeight === (clientHeight + scrollTop) && memberParam.value.pageNo++
|
||||
};
|
||||
|
||||
//搜索学员
|
||||
const searchMember = (keyword) => {
|
||||
console.log('searchMember', keyword)
|
||||
loading.value = true
|
||||
isOpen.value = true
|
||||
userList.value = []
|
||||
memberParam.value.pageNo = 1
|
||||
memberParam.value.keyword = keyword
|
||||
console.log('searchMember', memberParam.value)
|
||||
};
|
||||
|
||||
function blur() {
|
||||
isOpen.value = false
|
||||
memberParam.value.keyword = ''
|
||||
memberParam.value.pageNo = 1
|
||||
}
|
||||
|
||||
function change(e, l) {
|
||||
memberParam.value.keyword = ''
|
||||
memberParam.value.pageNo = 1
|
||||
isOpen.value = false
|
||||
Array.isArray(l) && (selectOptions.value = l)
|
||||
Array.isArray(selectOptions.value) && emit('onChange', e, l, selectOptions.value.find(e => e.departId)?.departId, selectOptions.value.find(e => e.departId)?.departName, selectOptions.value.find(e => e.departId)?.orgName)
|
||||
if (Array.isArray(l)) {
|
||||
emit('update:name', l.map(t => t.label).join(','))
|
||||
emit('update:value', l.map(t => t.value).join(','))
|
||||
} else {
|
||||
emit('update:name', l?.label)
|
||||
emit('update:value', l?.value)
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -942,8 +942,8 @@
|
||||
</div>
|
||||
<span style="margin-right: 3px">面授时间</span>
|
||||
</div>
|
||||
<div class="select fitems">
|
||||
<a-range-picker
|
||||
<div class="select fitems" style="width: 84%">
|
||||
<!-- <a-range-picker
|
||||
style="width: 440px; height: 40px; border-radius: 8px"
|
||||
:show-time="{ format: 'HH:mm' }"
|
||||
format="YYYY-MM-DD HH:mm"
|
||||
@@ -952,6 +952,37 @@
|
||||
separator="至"
|
||||
:placeholder="[' 开始时间', ' 结束时间']"
|
||||
:disabled="editBeginClass"
|
||||
/> -->
|
||||
<a-date-picker
|
||||
style="width: 45%; height: 40px; border-radius: 8px"
|
||||
:show-time="{ format: 'HH:mm' }"
|
||||
:format="['YYYY-MM-DD HH:mm','YYYY/MM/DD HH:mm']"
|
||||
valueFormat="YYYY-MM-DD HH:mm"
|
||||
v-model:value="xjkkinputV3[0]"
|
||||
@change="timeChange"
|
||||
:placeholder="' 开始时间'"
|
||||
:disabled="editBeginClass"
|
||||
@blur="onBlurStart"
|
||||
@focus="onFocusStart"
|
||||
@select="onDateSelect"
|
||||
:open="openStart"
|
||||
@ok="onOkStart"
|
||||
/>
|
||||
<span style="margin: 0 10px;">至</span>
|
||||
<a-date-picker
|
||||
style="width: 45%; height: 40px; border-radius: 8px"
|
||||
:show-time="{ format: 'HH:mm' }"
|
||||
:format="['YYYY-MM-DD HH:mm','YYYY/MM/DD HH:mm']"
|
||||
valueFormat="YYYY-MM-DD HH:mm"
|
||||
v-model:value="xjkkinputV3[1]"
|
||||
@change="timeChangeEnd"
|
||||
:placeholder="' 结束时间'"
|
||||
:disabled="editBeginClass"
|
||||
@focus="onFocusEnd"
|
||||
@blur="onBlurEnd"
|
||||
@select="onDateEnd"
|
||||
:open="openEnd"
|
||||
@ok="onOkEnd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -983,8 +1014,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cstm_items">
|
||||
<div class="signbox">
|
||||
<div class="cstm_items" style="align-items: baseline;">
|
||||
<div class="signbox" style="position: relative;top: -5px">
|
||||
<div class="sign">
|
||||
<img
|
||||
src="@/assets/images/coursewareManage/asterisk.png"
|
||||
@@ -993,12 +1024,26 @@
|
||||
</div>
|
||||
<span style="margin-right: 3px">授课教师</span>
|
||||
</div>
|
||||
<div class="select" style="width: 440px">
|
||||
<ProjectManager
|
||||
<div class="select teacher_input" style="display: flex; flex-wrap: wrap;width: 74.5%">
|
||||
<!-- <ProjectManager
|
||||
v-model:value="member.value"
|
||||
v-model:name="member.name"
|
||||
:disabled="editBeginClass"
|
||||
></ProjectManager>
|
||||
></ProjectManager> -->
|
||||
<div v-for="(item, index) in offteachers"
|
||||
:key="index" style="display: flex;margin-bottom: 10px;width: 100%;">
|
||||
<ProjectManager
|
||||
v-model:value="item.teacherId"
|
||||
v-model:name="item.teacherName"
|
||||
:disabled="editBeginClass"
|
||||
></ProjectManager>
|
||||
<a-input-number :min="0" @change="inputWeightChange(index)" v-model:value="item.weight" placeholder="%"/>
|
||||
<span style="margin-top: 10px;width: 34px;">权重</span>
|
||||
<div style="display: flex;">
|
||||
<a-button v-if="index===0" shape="circle" class="btn-circle btn-add" @click="inputAdd">+</a-button>
|
||||
<a-button shape="circle" class="btn-circle" @click="inputRemove(index)" :disabled="offteachers.length == 1"><delete-outlined class="custom-icon"/></a-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cstm_items">
|
||||
@@ -1264,7 +1309,7 @@
|
||||
</div>
|
||||
<div class="stmm_i4">
|
||||
<span style="color: #999ba3">授课教师:</span>
|
||||
<span>{{ currentPlanItem.teacher }}</span>
|
||||
<!-- <span>{{ currentPlanItem.teacher }}</span> -->
|
||||
</div>
|
||||
<div class="stmm_i5">
|
||||
<TableStudent
|
||||
@@ -1750,7 +1795,7 @@ import { fileUp } from "../../api/indexEval";
|
||||
import * as api1 from "../../api/index1";
|
||||
|
||||
import "@wangeditor/editor/dist/css/style.css";
|
||||
import ProjectManager from "@/components/project/ProjectManagerNew";
|
||||
import ProjectManager from "@/components/project/ProjectManagerNewTeacher";
|
||||
|
||||
import SeeModal from "./components/seeModal.vue";
|
||||
import CourseModal from "./courseModal.vue";
|
||||
@@ -1769,6 +1814,7 @@ import DropDown from "@/components/common/DropDown";
|
||||
import { checkPer, checkOwner } from "@/utils/utils";
|
||||
import dayjs from "dayjs";
|
||||
import {duration} from "moment";
|
||||
import { DeleteOutlined } from '@ant-design/icons-vue';
|
||||
|
||||
//列表表格
|
||||
|
||||
@@ -1941,9 +1987,18 @@ const columns6 = [
|
||||
width: "8%",
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
customRender: ({ text }) => {
|
||||
return text ? text : "-";
|
||||
},
|
||||
customRender: ({ record }) => {
|
||||
const teachers = record.offteachers;
|
||||
return teachers.map((teacher, index) => {
|
||||
// 如果需要显示为列表形式
|
||||
return (
|
||||
<div key={index}>
|
||||
{teacher.teacherName}
|
||||
{index !== teachers.length - 1 && ', '}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
@@ -2182,6 +2237,7 @@ export default defineComponent({
|
||||
// },
|
||||
addOnlineCourse,
|
||||
TwoDimensionalCode,
|
||||
DeleteOutlined
|
||||
},
|
||||
setup() {
|
||||
const CourseModalRef = ref(null);
|
||||
@@ -2402,11 +2458,16 @@ export default defineComponent({
|
||||
addLoading: false,
|
||||
currentPlanItem: {},
|
||||
teacherId: null,
|
||||
teacher: null,
|
||||
// teacher: null,
|
||||
selectedRowKeys7: [],
|
||||
auditDescription: "",
|
||||
isEdit: 0,
|
||||
member: { name: "", value: "" },
|
||||
offteachers:[{
|
||||
teacherId: "",
|
||||
teacherName: "",
|
||||
weight: '',
|
||||
}],
|
||||
//列表表格
|
||||
tableData1: [
|
||||
// {
|
||||
@@ -2619,7 +2680,7 @@ export default defineComponent({
|
||||
onceName: "",
|
||||
xjkkinputV2: "",
|
||||
duration: "",
|
||||
xjkkinputV3: "",
|
||||
xjkkinputV3: [],
|
||||
xjkkinputV4: null,
|
||||
beforeValue: null, //考勤 开始前
|
||||
afterStartValue: null, //考勤 开始后
|
||||
@@ -2829,8 +2890,97 @@ export default defineComponent({
|
||||
codeType: null, //二维码类型
|
||||
});
|
||||
|
||||
function timeChange(time, timeStr) {
|
||||
// state.duration || (state.duration = dayjs(timeStr[1]).diff(dayjs(timeStr[0]),'minute'))
|
||||
// function timeChange(time, timeStr) {
|
||||
// // state.duration || (state.duration = dayjs(timeStr[1]).diff(dayjs(timeStr[0]),'minute'))
|
||||
// }
|
||||
// function timeChange(timeStr) {
|
||||
// console.log(timeStr,'timeStr')
|
||||
// formData.value.beginTime = timeStr;
|
||||
// }
|
||||
function onDateSelect(date) {
|
||||
const month = String(date.$M+1).padStart(2, '0')
|
||||
const day = String(date.$D).padStart(2, '0')
|
||||
const hour = String(date.$H).padStart(2, '0')
|
||||
const minute = String(date.$m).padStart(2, '0')
|
||||
state.xjkkinputV3[0]=date.$y+'-'+month+'-'+day+' '+hour+':'+minute
|
||||
}
|
||||
const openStart = ref(false)
|
||||
const onOkStart = ()=>{
|
||||
openStart.value = false
|
||||
}
|
||||
function onBlurStart(e){
|
||||
state.xjkkinputV3[0]=e.target.value
|
||||
openStart.value = false
|
||||
}
|
||||
function onFocusStart(){
|
||||
openStart.value = true
|
||||
// if(!state.xjkkinputV3[0]){
|
||||
// let now=new Date()
|
||||
// let start=new Date(now.setFullYear(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0))
|
||||
// state.xjkkinputV3 = [
|
||||
// moment(start).format('YYYY-MM-DD HH:mm'),
|
||||
// state.xjkkinputV3[1]
|
||||
// ];
|
||||
// }
|
||||
}
|
||||
// function timeChangeEnd(timeStr){
|
||||
// formData.value.endTime = timeStr;
|
||||
// }
|
||||
function onDateEnd(date) {
|
||||
const month = String(date.$M+1).padStart(2, '0')
|
||||
const day = String(date.$D).padStart(2, '0')
|
||||
const hour = String(date.$H).padStart(2, '0')
|
||||
const minute = String(date.$m).padStart(2, '0')
|
||||
state.xjkkinputV3[1]=date.$y+'-'+month+'-'+day+' '+hour+':'+minute
|
||||
}
|
||||
const openEnd = ref(false)
|
||||
const onOkEnd = ()=>{
|
||||
openEnd.value = false
|
||||
}
|
||||
function onBlurEnd(e){
|
||||
state.xjkkinputV3[1]=e.target.value
|
||||
openEnd.value = false
|
||||
}
|
||||
function onFocusEnd(){
|
||||
openEnd.value = true
|
||||
// if(!state.xjkkinputV3[1]){
|
||||
// let now=new Date()
|
||||
// let start=new Date()
|
||||
// let end=new Date(now.setFullYear(now.getFullYear()))
|
||||
// state.xjkkinputV3 = [
|
||||
// state.xjkkinputV3[0],
|
||||
// moment(end).format('YYYY-MM-DD HH:mm')
|
||||
// ];
|
||||
// }
|
||||
}
|
||||
const totalWeightSum = ref(0)
|
||||
function inputWeightChange(index) {
|
||||
let totalWeight = 0
|
||||
state.offteachers.forEach(item => {
|
||||
totalWeight += Number(item.weight);
|
||||
});
|
||||
if (totalWeight > 100) {
|
||||
message.info("权重值最大为100%");
|
||||
state.offteachers[index].weight -= totalWeight - 100;
|
||||
totalWeight = 100;
|
||||
}
|
||||
totalWeightSum.value = totalWeight
|
||||
}
|
||||
function inputAdd() {
|
||||
state.offteachers.push({
|
||||
teacherId: "",
|
||||
teacherName: "",
|
||||
weight: '',
|
||||
});
|
||||
}
|
||||
function inputRemove(index) {
|
||||
dialog({
|
||||
content: "确定删除此授课教师吗?",
|
||||
ok: async () => {
|
||||
state.offteachers.splice(index, 1);
|
||||
message.success("删除成功");
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function findClassFullName(list, classify, name = "") {
|
||||
@@ -3239,7 +3389,7 @@ export default defineComponent({
|
||||
const rest = () => {
|
||||
options4CurName.value = "";
|
||||
options4CurId.value = "";
|
||||
state.teacher = null;
|
||||
// state.teacher = null;
|
||||
state.teacherId = null;
|
||||
};
|
||||
const handleChangeTea1 = (val) => {
|
||||
@@ -3409,7 +3559,7 @@ export default defineComponent({
|
||||
pageNo: type?state.currentPage2:state.currentPage222,
|
||||
pageSize: state.pageSize222,
|
||||
createName: state.kk_inputV1,
|
||||
teacher: state.kk_inputV2,
|
||||
// teacher: state.kk_inputV2,
|
||||
beginTime: beginTime,
|
||||
endTime: endTime,
|
||||
offcourseId: state.offcourseId,
|
||||
@@ -3655,9 +3805,16 @@ export default defineComponent({
|
||||
handleRestTable();
|
||||
};
|
||||
const createkk = () => {
|
||||
state.xjkkinputV1 = state.newCourseName
|
||||
state.offcoursePlanId = null;
|
||||
state.itemType = 3;
|
||||
state.member = {};
|
||||
state.offteachers = [{
|
||||
teacherId: "",
|
||||
teacherName: "",
|
||||
weight: '',
|
||||
}]
|
||||
state.xjkkinputV3 = [moment().format('YYYY-MM-DD HH:mm'),'']
|
||||
state.cstm_hs = true;
|
||||
};
|
||||
const handleCancelStu = () => {
|
||||
@@ -3672,7 +3829,7 @@ export default defineComponent({
|
||||
state.onceName = "";
|
||||
state.xjkkinputV2 = "";
|
||||
state.duration = "";
|
||||
state.xjkkinputV3 = "";
|
||||
state.xjkkinputV3 = [];
|
||||
state.xjkkinputV4 = null;
|
||||
state.checked1 = false;
|
||||
state.checked4 = false;
|
||||
@@ -3696,7 +3853,7 @@ export default defineComponent({
|
||||
}
|
||||
let startTime,
|
||||
endTime = 0;
|
||||
if (state.xjkkinputV3) {
|
||||
if (state.xjkkinputV3.length!=0) {
|
||||
startTime = dayjs(state.xjkkinputV3[0]).format("YYYY-MM-DD HH:mm"); //parseInt(state.xjkkinputV3[0].$d.getTime() / 1000);
|
||||
endTime = dayjs(state.xjkkinputV3[1]).format("YYYY-MM-DD HH:mm"); //parseInt(state.xjkkinputV3[1].$d.getTime() / 1000);
|
||||
}
|
||||
@@ -3734,8 +3891,9 @@ export default defineComponent({
|
||||
name: state.xjkkinputV1,
|
||||
signFlag: state.xjkkradioV1 ? 1 : 0, //是否允许未报名的签到:1是0否
|
||||
// signWordFlag: state.xjkkradioV1 === 1 ? 1 : 0, //签到是否需要口令:1是0否
|
||||
teacherId: state.member.value,
|
||||
teacher: state.member.name,
|
||||
// teacherId: state.member.value,
|
||||
// teacher: state.member.name,
|
||||
offteachers: state.offteachers,
|
||||
workInfo: state.workInfo, //提交的作业信息
|
||||
examInfo: state.examInfo, //提交的考试信息
|
||||
beforeStart: state.beforeValue, //考勤 开始前
|
||||
@@ -3745,15 +3903,33 @@ export default defineComponent({
|
||||
if(!postData.name){
|
||||
return message.error("请输入开课名称");
|
||||
}
|
||||
if(!postData.beginTime){
|
||||
return message.error("请选择开课时间");
|
||||
if(!state.xjkkinputV3[0]){
|
||||
return message.error("开始时间未填写");
|
||||
}
|
||||
if(!postData.endTime){
|
||||
return message.error("请选择结束时间");
|
||||
if(!state.xjkkinputV3[1]){
|
||||
return message.error("结束时间未填写");
|
||||
}
|
||||
if(!postData.teacherId){
|
||||
return message.error("请选择授课老师");
|
||||
if(state.offteachers.some(item => !item.teacherName)){
|
||||
return message.error("请填写教师名称和设置权重");
|
||||
}
|
||||
inputWeightChange()
|
||||
if(state.offteachers.length==1&& totalWeightSum.value!=100){
|
||||
message.error('单名教师您设置的权重应该是100%')
|
||||
return
|
||||
}else if(state.offteachers.length>1&& totalWeightSum.value!=100){
|
||||
message.error('多名教师权重合计值为100%')
|
||||
return
|
||||
}
|
||||
const teacherNames = new Set(state.offteachers.map(item => item.teacherName));
|
||||
if (teacherNames.size !== state.offteachers.length) {
|
||||
message.error('教师重复,请检查');
|
||||
return;
|
||||
}
|
||||
if(state.offteachers.some(item => item.weight==0)){
|
||||
message.error('权重值不能为0%')
|
||||
return
|
||||
}
|
||||
console.log(postData,'传输的数据')
|
||||
// if(!postData.duration){
|
||||
// return message.error("请输入持续时间");
|
||||
// }
|
||||
@@ -3801,7 +3977,7 @@ export default defineComponent({
|
||||
// }
|
||||
console.log("获取面授课开课详情", item);
|
||||
state.xjkkinputV2 = item.address;
|
||||
state.duration = item.duration;
|
||||
// state.duration = item.duration;
|
||||
state.checked1 = item.applyFlag === 1 ? true : false;
|
||||
state.attach = item.attach;
|
||||
|
||||
@@ -3827,7 +4003,8 @@ export default defineComponent({
|
||||
//是否允许未报名的签到:1是0否
|
||||
state.xjkkradioV1 = true;
|
||||
}
|
||||
state.member = { value: item.teacherId, name: item.teacher };
|
||||
// state.member = { value: item.teacherId, name: item.teacher };
|
||||
state.offteachers = [...item.offteachers]
|
||||
state.cstm_hs = true;
|
||||
state.kk_eidt = true;
|
||||
};
|
||||
@@ -4417,10 +4594,11 @@ export default defineComponent({
|
||||
state.chang_jin = String(item.sceneId);
|
||||
state.tags_val = item.tips ? item.tips.split(",") : [];
|
||||
//state.qdms_inputV5 = item.teacherId;
|
||||
state.teacher = item.teacher;
|
||||
state.teacherId = item.teacherId;
|
||||
// state.teacher = item.teacher;
|
||||
// state.teacherId = item.teacherId;
|
||||
state.qdms_inputV6 = item.intro;
|
||||
state.member = { value: item.teacherId, name: item.teacher };
|
||||
// state.member = { value: item.teacherId, name: item.teacher };
|
||||
state.offteachers = [...item.offteachers]
|
||||
if (item.attach == "") {
|
||||
state.imgList = [];
|
||||
} else {
|
||||
@@ -4902,9 +5080,11 @@ export default defineComponent({
|
||||
const qrcodeVisible = (record, type) => {
|
||||
// `${location.protocol}//${location.host}${import.meta.env.VUE_APP_BASE_API}/stu/project/redirectDetail?courseId=${record.id}`
|
||||
state.codevisible = true;
|
||||
let teacherNames = record.offteachers?.filter(teacher => teacher.teacherName !== null).map(teacher => teacher.teacherName);
|
||||
state.codeInfo = {
|
||||
title: type == 1 ? "【课程】二维码" : "【签到】二维码",
|
||||
name: record.name ? record.name : "",
|
||||
name: record.name ? record.name+'签到' : "",
|
||||
teacherName: teacherNames.length > 0 ? teacherNames.join(' ') : "",
|
||||
url:
|
||||
type == 1
|
||||
? process.env.VUE_APP_BASE_API +
|
||||
@@ -5054,8 +5234,24 @@ export default defineComponent({
|
||||
logW,
|
||||
logT,
|
||||
qrcodeVisible,
|
||||
timeChange,
|
||||
editBeginClass
|
||||
// timeChange,
|
||||
editBeginClass,
|
||||
|
||||
onDateSelect,
|
||||
onOkStart,
|
||||
openStart,
|
||||
onBlurStart,
|
||||
onFocusStart,
|
||||
// timeChangeEnd,
|
||||
onDateEnd,
|
||||
onOkEnd,
|
||||
onFocusEnd,
|
||||
openEnd,
|
||||
onBlurEnd,
|
||||
inputWeightChange,
|
||||
totalWeightSum,
|
||||
inputAdd,
|
||||
inputRemove
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -5560,6 +5756,35 @@ export default defineComponent({
|
||||
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;
|
||||
|
||||
@@ -564,7 +564,15 @@ const closeChangeModal = () => {
|
||||
};
|
||||
|
||||
//暂存
|
||||
const currentTaskList = computed(() => {
|
||||
return routerInfo.value?.chapterList[activeIndex.value]?.draftTaskList.length;
|
||||
});
|
||||
watch(currentTaskList, (oldValue,newValue) => {
|
||||
request(ROUTER_DETAIL_MODIFY, routerInfo.value)
|
||||
getDetail()
|
||||
});
|
||||
const temporaryStorage = async () => {
|
||||
console.log(routerInfo.value,'routerInfo.value')
|
||||
confirmLoading.value = true;
|
||||
await request(ROUTER_DETAIL_MODIFY, routerInfo.value);
|
||||
await getDetail();
|
||||
|
||||
@@ -572,6 +572,16 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="set_content">
|
||||
<div class="setc_name"><span>积分排行榜</span></div>
|
||||
<div class="setc_main">
|
||||
<a-radio v-model:checked="projectInfo.rankFlag" :disabled="true"
|
||||
><span style="color: #333333"
|
||||
>是否显示积分</span
|
||||
></a-radio
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="set_content" v-if="projectInfo.remark ">
|
||||
<div class="setc_name"><span>项目说明:</span></div>
|
||||
<div class="setc_main">
|
||||
@@ -1205,6 +1215,7 @@ export default defineComponent({
|
||||
systemId: state.projectInfo.systemId,
|
||||
boeFlag: state.projectInfo.boeFlag ? 1 : 0,
|
||||
courseSyncFlag: state.projectInfo.courseSyncFlag ? 1 : 0,
|
||||
rankFlag: state.projectInfo.rankFlag ? 1 : 0,
|
||||
notice: state.projectInfo.notice,
|
||||
noticeFlag: state.projectInfo.noticeFlag,
|
||||
projectTemplateId: projectId,
|
||||
@@ -1226,6 +1237,7 @@ export default defineComponent({
|
||||
systemId: state.projectInfo.systemId,
|
||||
boeFlag: state.projectInfo.boeFlag ? 1 : 0,
|
||||
courseSyncFlag: state.projectInfo.courseSyncFlag ? 1 : 0,
|
||||
rankFlag: state.projectInfo.rankFlag ? 1 : 0,
|
||||
notice: state.projectInfo.notice,
|
||||
noticeFlag: state.projectInfo.noticeFlag,
|
||||
projectTemplateId: projectId,
|
||||
|
||||
@@ -164,6 +164,22 @@
|
||||
</a-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<div class="name name2">
|
||||
<div class="namebox">
|
||||
<div class="inname">积分排行榜</div>
|
||||
</div>
|
||||
<div class="in ggysxz">
|
||||
<a-checkbox v-model:checked="rankFlag">
|
||||
<span style="
|
||||
width: 100%;
|
||||
color: rgba(109, 117, 132, 1);
|
||||
font-size: 14px;
|
||||
">
|
||||
是否显示积分
|
||||
</span>
|
||||
</a-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<div class="name name2">
|
||||
<div class="namebox">
|
||||
<div class="inname" style="margin-top: 13px">项目说明</div>
|
||||
@@ -285,6 +301,7 @@ export default {
|
||||
},
|
||||
classifyList5: [],
|
||||
courseSyncFlag: true,
|
||||
rankFlag:false,
|
||||
auditDescription: "",
|
||||
ptojectType: "",
|
||||
changeCondition: false,
|
||||
@@ -340,6 +357,7 @@ export default {
|
||||
state.projectInfo.endTime,
|
||||
];
|
||||
state.courseSyncFlag = !!state.projectInfo.courseSyncFlag;
|
||||
state.rankFlag = !!state.projectInfo.rankFlag;
|
||||
if (Number(state.projectInfo.status) === -5) {
|
||||
let obj = {
|
||||
project_id: state.projectInfo.id,
|
||||
@@ -479,6 +497,7 @@ export default {
|
||||
}
|
||||
state.projectInfo.type = 3;
|
||||
state.projectInfo.courseSyncFlag = state.courseSyncFlag ? 1 : 0;
|
||||
state.projectInfo.rankFlag = state.rankFlag ? 1 : 0;
|
||||
api.createProject(state.projectInfo).then((res) => {
|
||||
state.loading = false;
|
||||
message.destroy();
|
||||
|
||||
@@ -227,6 +227,25 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="name name2">
|
||||
<div class="namebox">
|
||||
<div class="inname">积分排行榜</div>
|
||||
</div>
|
||||
<div class="in">
|
||||
<a-checkbox
|
||||
v-model:checked="rankFlag"
|
||||
:disabled="viewDetail ? true : false"
|
||||
><span
|
||||
style="
|
||||
width: 100%;
|
||||
color: rgba(109, 117, 132, 1);
|
||||
font-size: 14px;
|
||||
"
|
||||
>是否显示积分</span
|
||||
></a-checkbox
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="name name2">
|
||||
<div class="namebox">
|
||||
<div class="inname" style="margin-top: 13px">项目说明</div>
|
||||
@@ -365,6 +384,7 @@ export default {
|
||||
pageSize1: 10, //项目经理
|
||||
projectInfo: {},
|
||||
courseSyncFlag: false,
|
||||
rankFlag:false,
|
||||
learnBgMore: false,
|
||||
projectPic: [],
|
||||
loading: false,
|
||||
@@ -404,6 +424,7 @@ export default {
|
||||
state.projectInfo.endTime,
|
||||
];
|
||||
state.courseSyncFlag = !!state.projectInfo.courseSyncFlag;
|
||||
state.rankFlag = !!state.projectInfo.rankFlag
|
||||
});
|
||||
}
|
||||
|
||||
@@ -473,6 +494,7 @@ export default {
|
||||
return message.warning("项目名称重复,请重新填写");
|
||||
}
|
||||
state.projectInfo.courseSyncFlag = state.courseSyncFlag ? 1 : 0;
|
||||
state.projectInfo.rankFlag = state.rankFlag ? 1 : 0;
|
||||
api.createProject(state.projectInfo).then(() => {
|
||||
state.loading = false;
|
||||
message.destroy();
|
||||
|
||||
@@ -609,6 +609,14 @@ const selectRowAll = () => {
|
||||
};
|
||||
|
||||
//暂存
|
||||
const currentTaskList = computed(() => {
|
||||
return projectInfo.value?.stageList[activeIndex.value]?.taskDraftDtoList.length;
|
||||
});
|
||||
watch(currentTaskList, (oldValue,newValue) => {
|
||||
request(PROJECT_DETAIL_MODIFY, projectInfo.value)
|
||||
// request(PROJECT_RELEASE, {projectId: route.query.projectId})
|
||||
getTask()
|
||||
});
|
||||
const temporaryStorage = async () => {
|
||||
confirmLoading.value = true
|
||||
await request(PROJECT_DETAIL_MODIFY, projectInfo.value)
|
||||
@@ -623,6 +631,8 @@ const submitStorage = async () => {
|
||||
content: '该项目已经发布,修改后如未点击暂存当前操作未保存数据将丢失,确认保存?',
|
||||
ok: async () => {
|
||||
confirmLoading.value = true
|
||||
request(PROJECT_DETAIL_MODIFY, projectInfo.value)
|
||||
await getTask()
|
||||
await request(PROJECT_RELEASE, {projectId: route.query.projectId})
|
||||
message.success("保存成功");
|
||||
confirmLoading.value = false;
|
||||
|
||||
@@ -588,13 +588,13 @@
|
||||
{{ item.type==2 ? item.createTime !== null ? item.createTime : "-" : item.startTime !== null ? item.startTime : "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="progress">
|
||||
<div class="progresstext">
|
||||
<div class="progress" v-if="item.averageScore" style="display: flex;flex-grow: 0;margin: 0;min-width: 60px;">
|
||||
<!-- <div class="progresstext">
|
||||
{{ item.finishStuCnt || 0 }}/{{
|
||||
item.totalStuCnt || 0
|
||||
}}人
|
||||
</div>
|
||||
<div style="display: flex">
|
||||
</div> -->
|
||||
<!-- <div style="display: flex">
|
||||
<a-progress
|
||||
:showInfo="false"
|
||||
:percent="
|
||||
@@ -612,9 +612,75 @@
|
||||
) || 0
|
||||
}}%</span
|
||||
>
|
||||
</div> -->
|
||||
<div>
|
||||
{{ item.averageScore}}分
|
||||
</div>
|
||||
<div class="img_daoc" @click="exportScore(item)"></div>
|
||||
</div>
|
||||
<div class="progress" v-if="!item.averageScore" style="display: flex;flex-grow: 0;margin: 0;min-width: 60px;">
|
||||
|
||||
</div>
|
||||
<div class="operations">
|
||||
<div class="operations_dropdown">
|
||||
<a-dropdown :getPopupContainer='triggerNode=> triggerNode.parentNode' v-if="item.assessmentIds.filter(id => id !== null).length>1&&item.type == 2" :trigger="['click']" v-model:visible="visibleEwmpg[item.id]">
|
||||
<a class="ant-dropdown-link" @click="qrcodeAssement(item)">
|
||||
评估二维码
|
||||
<DownOutlined />
|
||||
</a>
|
||||
<template #overlay>
|
||||
<a-menu @click="handleMenuClickpg">
|
||||
<template v-for="(item, index) in qrCodeItemspg" :key="index">
|
||||
<a-menu-item>
|
||||
<div>
|
||||
<p>{{ item.name }}</p>
|
||||
</div>
|
||||
</a-menu-item>
|
||||
</template>
|
||||
</a-menu>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
<div v-if="item.assessmentIds.filter(id => id !== null).length==1&&item.type == 2">
|
||||
<a class="ant-dropdown-link" @click="qrcodeAssement(item)">
|
||||
评估二维码
|
||||
<DownOutlined />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="operations_dropdown" v-if="item.assessmentIds.length!=1">
|
||||
<a-dropdown :getPopupContainer='(triggerNode) => triggerNode.parentNode' v-if="item.type == 2" :trigger="['click']" v-model:visible="visibleEwm[item.id]">
|
||||
<a class="ant-dropdown-link" @click="qrcodeVisible(item)">
|
||||
签到二维码
|
||||
<DownOutlined />
|
||||
</a>
|
||||
<template #overlay v-if="qrCodeItems.length>0">
|
||||
<a-menu @click="handleMenuClick">
|
||||
<template v-for="(item, index) in qrCodeItems" :key="index">
|
||||
<a-menu-item>
|
||||
<div>
|
||||
<p>{{ item.name }}</p>
|
||||
</div>
|
||||
</a-menu-item>
|
||||
</template>
|
||||
</a-menu>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
</div>
|
||||
<div class="operations_dropdown" v-if="item.assessmentIds.length==1">
|
||||
<a class="ant-dropdown-link" @click="qrcodeVisible(item)">
|
||||
签到二维码
|
||||
<DownOutlined />
|
||||
</a>
|
||||
</div>
|
||||
<div
|
||||
class="operation"
|
||||
style="cursor: pointer"
|
||||
@click="openCourse(item,key)"
|
||||
v-if="item.type == 2"
|
||||
>
|
||||
开课
|
||||
</div>
|
||||
<div
|
||||
class="operation"
|
||||
style="cursor: pointer"
|
||||
@@ -641,6 +707,7 @@
|
||||
class="operation"
|
||||
style="cursor: pointer"
|
||||
@click="showCodeModel(item)"
|
||||
v-if="item.type !== 2"
|
||||
>
|
||||
二维码
|
||||
</div>
|
||||
@@ -932,7 +999,7 @@
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="5" tab="项目积分">
|
||||
<a-tab-pane key="5" tab="项目积分" v-if="rankFlag">
|
||||
<ProjectScore
|
||||
v-if="activeKey == '5'"
|
||||
:permissions="permissions"
|
||||
@@ -1291,6 +1358,16 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="set_content">
|
||||
<div class="setc_name"><span>积分排行榜</span></div>
|
||||
<div class="setc_main">
|
||||
<a-radio v-model:checked="rankFlag" :disabled="true"
|
||||
><span style="color: #333333"
|
||||
>是否显示积分</span
|
||||
></a-radio
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="set_content" v-if="remark">
|
||||
<div class="setc_name"><span>项目说明:</span></div>
|
||||
<div class="setc_main">
|
||||
@@ -1653,13 +1730,14 @@
|
||||
:createId="createId"
|
||||
/>
|
||||
<!-- 面授学员抽屉 -->
|
||||
<RouterFaceStu
|
||||
:permissions="permissions"
|
||||
:createId="createId"
|
||||
v-model:FSvisible="FSvisible"
|
||||
:datasource="facestudent"
|
||||
:type="1"
|
||||
/>
|
||||
<RouterFaceStu
|
||||
:permissions="permissions"
|
||||
:createId="createId"
|
||||
v-model:FSvisible="FSvisible"
|
||||
:datasource="facestudent"
|
||||
:type="1"
|
||||
:courseName="name"
|
||||
/>
|
||||
<!-- 活动直播考勤抽屉 -->
|
||||
<active-attendance
|
||||
:permissions="permissions"
|
||||
@@ -2267,10 +2345,13 @@
|
||||
:checkgroupStuId="checkgroupStuId"
|
||||
/>
|
||||
<!-- 换组弹窗 -->
|
||||
<!-- 面授课开课弹框 -->
|
||||
<AddOpenCourse @call-parent-method="getTaskListAll" ref="coursePlanRef" :type="1"/>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="jsx">
|
||||
import { reactive, toRefs, onMounted, watch, computed } from "vue";
|
||||
import AddOpenCourse from "@/components/drawers/AddOpenCourse.vue";
|
||||
import { reactive, toRefs, onMounted, watch, computed,ref } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import { useRouter } from "vue-router";
|
||||
import TimeManage from "../../components/drawers/TimeManage";
|
||||
@@ -2321,10 +2402,13 @@ import TrainClass from "@/components/project/TrainClass";
|
||||
import ProjectManager from "@/components/project/ProjectManagerNew";
|
||||
import TableStudent from "@/components/student/TableStudent";
|
||||
import TableCertificateStudent from "@/components/student/TableCertificateStudent";
|
||||
import { getStuPage } from "@/api/index1";
|
||||
import { getStuPage,courseData } from "@/api/index1";
|
||||
import ChangeGroupModal from "@/components/student/ChangeGroupModal.vue";
|
||||
import { checkPer,fixDoublePer } from "@/utils/utils";
|
||||
import ImpoterGroupLeader from "@/components/drawers/project/ImpoterGroupLeader.vue";
|
||||
import qrCode from "@/utils/qrCode";
|
||||
import {request} from "@/api/request";
|
||||
import { PROJECT_RELEASE} from "@/api/apis";
|
||||
export default {
|
||||
name: "taskPage",
|
||||
components: {
|
||||
@@ -2359,8 +2443,106 @@ export default {
|
||||
ProjectVoteManage,
|
||||
ChangeGroupModal,
|
||||
ImpoterGroupLeader,
|
||||
AddOpenCourse
|
||||
},
|
||||
setup() {
|
||||
const exportScore = (item) => {
|
||||
window.open(`${process.env.VUE_APP_BASE_API}/admin/assessment/manage/export?assessmentIds=${item.assessmentIds}&pid=${item.id}`)
|
||||
};
|
||||
const coursePlanRef = ref();
|
||||
const openCourse = async (item,index) => {
|
||||
await apitl.getDraftTask({projectId: item.projectId}).then((item)=>{
|
||||
coursePlanRef.value.openDrawer(item.data.data.stageList[0].taskDraftDtoList[index]);
|
||||
})
|
||||
}
|
||||
const qrCodeItems = ref([]);
|
||||
const visibleEwm = ref({});
|
||||
const qrcodeVisible = async (item)=>{
|
||||
if(qrCodeItems.value.length!=0){
|
||||
qrCodeItems.value = []
|
||||
}
|
||||
visibleEwm.value[item.id] = !visibleEwm.value[item.id];
|
||||
const planParams = {
|
||||
type: 1,
|
||||
offcourseId: item.courseId,
|
||||
taskId: item.id,
|
||||
};
|
||||
await courseData(planParams).then((res)=>{
|
||||
qrCodeItems.value = res.data.data.map((dataItem) => ({
|
||||
...dataItem,
|
||||
courseName: item.name,
|
||||
}));
|
||||
if(qrCodeItems.value.length==1){
|
||||
qrCode({
|
||||
title: "【签到】二维码",
|
||||
courseName: state.name+'项目',
|
||||
name: qrCodeItems.value[0].name+'课程签到',
|
||||
createName:qrCodeItems.value[0].offteachers.map(teacher => teacher.teacherName).join(', ')||qrCodeItems.value[0].teacher,
|
||||
url: `${location.protocol}//${location.host}${process.env.VUE_APP_BASE_API}/admin/student/studentSign?taskId=${qrCodeItems.value[0].id}&taskType=${2}&type=${3}`,
|
||||
});
|
||||
}
|
||||
if(qrCodeItems.value.length==0){
|
||||
message.info("暂无签到二维码")
|
||||
}
|
||||
})
|
||||
}
|
||||
function handleMenuClick({key}) {
|
||||
const name = qrCodeItems.value[key].name;
|
||||
const teacher = qrCodeItems.value[key].teacher;
|
||||
const id = qrCodeItems.value[key].id;
|
||||
const offteachers = qrCodeItems.value[key].offteachers.map(teacher => teacher.teacherName).join(', ');
|
||||
qrCode({
|
||||
title: "【签到】二维码",
|
||||
courseName: state.name+'项目',
|
||||
name: name+'课程签到',
|
||||
createName:offteachers||teacher,
|
||||
url: `${location.protocol}//${location.host}${process.env.VUE_APP_BASE_API}/admin/student/studentSign?taskId=${id}&taskType=${2}&type=${3}`,
|
||||
});
|
||||
}
|
||||
const qrCodeItemspg = ref([]);
|
||||
const visibleEwmpg = ref({});
|
||||
const qrcodeAssement = async (item)=>{
|
||||
if(qrCodeItemspg.value.length!=0){
|
||||
qrCodeItemspg.value = []
|
||||
}
|
||||
visibleEwmpg.value[item.id] = !visibleEwmpg.value[item.id];
|
||||
const planParams = {
|
||||
type: 1,
|
||||
offcourseId: item.courseId,
|
||||
taskId: item.id,
|
||||
};
|
||||
await courseData(planParams).then((res)=>{
|
||||
const qrCodeItemspgItem = res.data.data.map((dataItem) => ({
|
||||
...dataItem,
|
||||
courseName: item.name,
|
||||
}));
|
||||
qrCodeItemspg.value = qrCodeItemspgItem.filter(item => item.assessmentId !== null);
|
||||
if(qrCodeItemspg.value.length==1){
|
||||
qrCode({
|
||||
title: "【评估】二维码",
|
||||
courseName: state.name+'项目',
|
||||
name: qrCodeItemspg.value[0].name+'课程评估',
|
||||
createName:qrCodeItemspg.value[0].offteachers.map(teacher => teacher.teacherName).join(', ')||qrCodeItemspg.value[0].teacher,
|
||||
url: `${location.protocol}//${location.host}/student-h5/investigatpage?id=${qrCodeItemspg.value[0].id}&type=3&infoId=${qrCodeItemspg.value[0].id}&courseId=${qrCodeItemspg.value[0].assessmentId}&chapterOrStageId=0`,
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
function handleMenuClickpg({key}) {
|
||||
const name = qrCodeItemspg.value[key].name;
|
||||
const offteachers = qrCodeItemspg.value[key].offteachers.map(teacher => teacher.teacherName).join(', ');
|
||||
const teacher = qrCodeItemspg.value[key].teacher;
|
||||
const id = qrCodeItemspg.value[key].id;
|
||||
const assessmentId = qrCodeItemspg.value[key].assessmentId;
|
||||
qrCode({
|
||||
title: "【评估】二维码",
|
||||
courseName: state.name+'项目',
|
||||
name: name+'课程评估',
|
||||
createName:offteachers||teacher,
|
||||
url: `${location.protocol}//${location.host}/student-h5/investigatpage?id=${id}&type=3&infoId=${id}&courseId=${assessmentId}&chapterOrStageId=0`,
|
||||
});
|
||||
}
|
||||
|
||||
const store = useStore();
|
||||
const route = useRoute();
|
||||
const headers = { token: getCookieForName("token") };
|
||||
@@ -2563,6 +2745,7 @@ export default {
|
||||
checked1: true,
|
||||
checked2: false,
|
||||
checkedSty: false, //同步学习记录
|
||||
rankFlag:false,
|
||||
checkedBOEU: false, //是否BOEU实施
|
||||
radioV1: "",
|
||||
radioV2: "",
|
||||
@@ -3021,6 +3204,14 @@ export default {
|
||||
return store.state.orgtreeList ? store.state.orgtreeList : [];
|
||||
});
|
||||
//任务大纲渲染
|
||||
const getTaskListAll = () =>{
|
||||
// request(PROJECT_RELEASE, {projectId: route.query.projectId})
|
||||
getTaskList();
|
||||
getTaskInfo();
|
||||
getGroup();
|
||||
getOverview();
|
||||
reget();
|
||||
}
|
||||
const getTaskList = () => {
|
||||
let objtl = {
|
||||
projectId: state.projectId,
|
||||
@@ -4002,6 +4193,7 @@ export default {
|
||||
state.systemId = info.systemId;
|
||||
state.tsystemId = info.systemId;
|
||||
state.checkedSty = info.courseSyncFlag == 1;
|
||||
state.rankFlag = info.rankFlag == 1;
|
||||
state.courseSyncFlag = info.courseSyncFlag;
|
||||
state.checkedBOEU = info.boeFlag == 1;
|
||||
state.boeFlag = info.boeFlag;
|
||||
@@ -4959,6 +5151,7 @@ export default {
|
||||
showCodeModal,
|
||||
tabsChange,
|
||||
getTaskList,
|
||||
getTaskListAll,
|
||||
rankTimeChange,
|
||||
getbillboard,
|
||||
rankSearch,
|
||||
@@ -5037,7 +5230,23 @@ export default {
|
||||
studytimeRank,
|
||||
xsSelectChange,
|
||||
changePagination,
|
||||
handleChangeGroupLeader
|
||||
handleChangeGroupLeader,
|
||||
qrcodeVisible,
|
||||
qrcodeAssement,
|
||||
|
||||
handleMenuClick,
|
||||
qrCodeItems,
|
||||
visibleEwm,
|
||||
qrCodeItemspg,
|
||||
visibleEwmpg,
|
||||
handleMenuClickpg,
|
||||
coursePlanRef,
|
||||
openCourse,
|
||||
exportScore,
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -6464,7 +6673,7 @@ export default {
|
||||
flex-shrink: 0;
|
||||
margin-right: 24px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
// flex-wrap: wrap;
|
||||
align-items: center;
|
||||
padding: 25px 0px;
|
||||
margin-left: 22px;
|
||||
@@ -6475,7 +6684,7 @@ export default {
|
||||
.first {
|
||||
//position: relative;
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
// flex-grow: 1;
|
||||
align-items: center;
|
||||
//height: 71px;
|
||||
margin-left: 12px;
|
||||
@@ -6504,7 +6713,7 @@ export default {
|
||||
.type {
|
||||
//height: 71px;
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
// flex-grow: 1;
|
||||
align-items: center;
|
||||
margin-right: 50px;
|
||||
|
||||
@@ -6532,7 +6741,7 @@ export default {
|
||||
.time {
|
||||
//height: 71px;
|
||||
flex-grow: 1;
|
||||
margin-right: 50px;
|
||||
margin-right: 14px;
|
||||
width: 100px;
|
||||
|
||||
.timetext {
|
||||
@@ -6542,11 +6751,19 @@ export default {
|
||||
}
|
||||
|
||||
.progress {
|
||||
width: 168px;
|
||||
width: 60px;
|
||||
margin-left: 10px;
|
||||
margin-right: 50px;
|
||||
flex-grow: 1;
|
||||
|
||||
.img_daoc {
|
||||
cursor: pointer;
|
||||
width: 16px;
|
||||
height: 18px;
|
||||
background-image: url(@/assets/images/coursewareManage/export.png);
|
||||
background-size: 100% 100%;
|
||||
// background-color: #4ea6ff;
|
||||
margin-left: 7px;
|
||||
}
|
||||
.progresstext {
|
||||
color: #ffc067;
|
||||
font-size: 14px;
|
||||
@@ -6555,9 +6772,16 @@ export default {
|
||||
|
||||
.operations {
|
||||
display: flex;
|
||||
width: 240px;
|
||||
|
||||
//flex-grow: 1;
|
||||
width: 420px;
|
||||
flex-grow: 1;
|
||||
.operations_dropdown{
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: 10px;
|
||||
min-width: 90px;
|
||||
}
|
||||
.operation {
|
||||
color: #4ea6ff;
|
||||
font-size: 14px;
|
||||
|
||||
Reference in New Issue
Block a user