Merge remote-tracking branch 'origin/master'

This commit is contained in:
yujicun
2023-05-16 14:33:41 +08:00
10 changed files with 235 additions and 243 deletions

View File

@@ -34,7 +34,7 @@ import {USER_PERMISSION} from "@/api/ThirdApi";
const store = useStore();
const isLogin = ref(false);
console.log("版本3.0.3------------");
console.log("版本3.0.4------------");

View File

@@ -37,19 +37,19 @@
:placeholder="[' 开始时间', ' 结束时间']" />
</div>
</div>
<!-- <div class="main_item">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
</div>
<span style="margin-right: 3px">活动时长</span>
<span style="margin-right: 3px">持续时间</span>
</div>
<div class="btnbox">
<a-input-number :min="0" :max="999999" :precision="0" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.activityDuration" />
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div> -->
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">

View File

@@ -52,19 +52,19 @@
valueFormat="YYYY-MM-DD HH:mm" @change="timeChange" :placeholder="[' 开始时间', ' 结束时间']" />
</div>
</div>
<!-- <div class="main_item">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img src="@/assets/images/coursewareManage/asterisk.png" alt="" />
</div>
<span style="margin-right: 3px">直播时长</span>
<span style="margin-right: 3px">持续时间</span>
</div>
<div class="btnbox">
<a-input-number :min="0" :max="999999" :precision="0" style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.liveDuration"></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div> -->
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">

View File

@@ -74,7 +74,7 @@ const columns = ref([
key: "type",
width: "100px",
align: "center",
customRender: ({ record: { type } }) => ({ 10: "微课", 21: "直播", 20: "录播", 30: "面授", 90: "混合" }[type]),
customRender: () => <span>在线课</span>,
},
{
title: "创建人",
@@ -83,13 +83,13 @@ const columns = ref([
width: "100px",
align: "center",
},
{
title: "时长",
dataIndex: "studyTime",
key: "studyTime",
width: "80px",
align: "center",
},
// {
// title: "时长",
// dataIndex: "studyTime",
// key: "studyTime",
// width: "80px",
// align: "center",
// },
{
title: "发布时间",
dataIndex: "publishTime",

View File

@@ -113,24 +113,6 @@
></NameInput>
</div>
</div>
<div class="cstm_items">
<div class="signbox">
<div class="sign">
</div>
<span style="margin-right: 3px">地点</span>
</div>
<div class="b_input">
<a-input
v-model:value="formData.address"
maxlength="50"
style="width: 88%; height: 40px; border-radius: 8px"
placeholder="请输入详细地点"
/>
<div class="inp_num" style="right: 90px">
<span style="color: #c7cbd2">{{ formData.address.length || 0 }}/50</span>
</div>
</div>
</div>
<div class="cstm_items">
<div class="signbox">
<div class="sign">
@@ -172,6 +154,49 @@
v-model:name="formData.teacher"
></ProjectManager>
</div>
</div>
<div class="cstm_items">
<div class="signbox">
<div class="sign">
<img src="@/assets/images/coursewareManage/asterisk.png" alt=""/>
</div>
<span style="margin-right: 3px">持续时间</span>
</div>
<div class="b_input">
<a-input-number
:min="0"
:max="999999"
:precision="0"
placeholder="请输入持续时间"
style="
width: 88%;
height: 32px;
border-radius: 8px;
overflow: hidden;"
v-model:value="formData.duration"
></a-input-number>
<div class="inp_num" style="right: 96px;line-height: 12px">
<span style="color: #c7cbd2">分钟</span>
</div>
</div>
</div>
<div class="cstm_items">
<div class="signbox">
<div class="sign">
</div>
<span style="margin-right: 3px">地点</span>
</div>
<div class="b_input">
<a-input
v-model:value="formData.address"
maxlength="50"
style="width: 88%; height: 40px; border-radius: 8px"
placeholder="请输入详细地点"
/>
<div class="inp_num" style="right: 90px">
<span style="color: #c7cbd2">{{ formData.address.length || 0 }}/50</span>
</div>
</div>
</div>
<div class="cstm_items">
<div class="signbox">
@@ -451,6 +476,7 @@ const formData = useResetRef({
evalFlag: 0,
assessmentName: "",
assessmentId: "",
duration: "",
workInfo: {},
examInfo: {},
attach: "",
@@ -490,6 +516,12 @@ const formDataRule = {
message: "请选择教师",
},
],
duration: [
{
required: true,
message: "请输入持续时间",
},
],
};
const { validate } = Form.useForm(formData, formDataRule);

View File

@@ -307,7 +307,7 @@ export default {
state.CWvisible = true
}}
>
查看作业2
查看作业
</a-button>}
{value.examStatus===1 && <a-button
type="link"
@@ -317,7 +317,7 @@ export default {
state.CQvisible = true
}}
>
查看答卷3
查看答卷
</a-button>}
</div>)
);

View File

@@ -43,7 +43,7 @@
</div>
</div>
</div>
<div class="search">
<div class="search" v-if="data?.length">
<div class="leftchoose">
<div class="namecon" style="margin-right: 30px">
<div class="name">姓名</div>
@@ -81,7 +81,7 @@
</div>
</div>
</div>
<div class="btnss" style="margin-top: 20px" v-if="checkPer(permissions,createId)">
<div class="btnss" style="margin-top: 20px" v-if="checkPer(permissions,createId) && data?.length">
<div
class="btn btn1"
style="margin-right: 20px"
@@ -297,10 +297,11 @@ const columns = ref([
key: "opacation",
width: 100,
align: "center",
customRender: ({record:{workStatus,answerId,examinationScore,studentId}}) =>
customRender: ({record:{workStatus,answerId,examinationScore,studentId,finishStatus}}) =>
<div style="display:flex;justify-content:center;">
<a class="opa" style={{color:examinationScore?'':'#666',marginRight:'12px'}} onClick={() =>examinationScore && showExamAnswer(answerId)}>查看答卷</a>
<a class="opa" style={{color:workStatus?'':'#666'}} onClick={() => workStatus && showCWvisible(studentId)}>查看作业</a>
{examinationScore?<a className="opa" style={{color: examinationScore ? '' : '#666', marginRight: '12px'}} onClick={() => examinationScore && showExamAnswer(answerId)}>查看答卷</a>:''}
{workStatus ? <a class="opa" style={{color:workStatus?'':'#666'}} onClick={() => workStatus && showCWvisible(studentId)}>查看作业</a>:''}
{finishStatus != 1 ? <a className="opa" onClick={() => finishTask(studentId)}>标记为完成</a> : ''}
</div>
},
]);
@@ -339,6 +340,23 @@ const batchFinish = () => {
});
};
const finishTask = (stuId) => dialog({
content: "确定标注完成吗?",
ok: async () => {
message.success("标注完成成功");
tableRef.value.toLoading();
await api.batchFinishTask({
ids: [stuId],
type: 3,
taskId: props.datasource.routerTaskId,
pid: offcoursePlanId.value,
taskType: props.datasource.type,
currentStageId: props.datasource.currentStageId,
});
tableRef.value.fetch();
},
});
const answerId = ref('');
const showExamAnswer = (id) => {
answerId.value = id;

View File

@@ -43,7 +43,7 @@
</div>
</div>
</div>
<div class="search">
<div class="search" v-if="data?.length">
<div class="leftchoose">
<div class="namecon" style="margin-right: 30px">
<div class="name">姓名</div>
@@ -81,7 +81,7 @@
</div>
</div>
</div>
<div class="btnss" style="margin-top: 20px" v-if="checkPer(permissions,createId)">
<div class="btnss" style="margin-top: 20px" v-if="checkPer(permissions,createId) && data?.length">
<div
class="btn btn1"
style="margin-right: 20px"
@@ -89,6 +89,14 @@
>
<div class="wz">签到二维码</div>
</div>
<div
class="btn btn1"
style="margin-right: 20px"
v-if="data[coursePlanIndex]?.assessmentId"
@click="qrcodeAssement()"
>
<div class="wz">评估二维码</div>
</div>
<div
class="btn btn1"
style="margin-right: 20px"
@@ -119,9 +127,13 @@
<div class="btn btn1" @click="batchSign" style="margin-right: 20px">
<div class="wz">批量签到</div>
</div>
<div class="btn btn1" @click="exportTaskStu">
<div class="btn btn1" @click="exportTaskStu" style="margin-right: 20px">
<div class="img2"></div>
<div class="wz">导出数据</div>
<div class="wz">导出签到数据</div>
</div>
<div class="btn btn1" @click="exportAssessment" v-if="data[coursePlanIndex]?.assessmentId">
<div class="img2"></div>
<div class="wz">导出评估数据</div>
</div>
</div>
<div class="tableBox" style="margin-top: 30px">
@@ -151,6 +163,7 @@ import {useRequest} from "@/api/request";
import CommonImport from "@/components/common/CommonImport";
import CommonStudent from "@/components/student/CommonStudent";
import dayjs from "dayjs";
import {delStudentList} from "@/api/index1";
const coursePlanIndex = ref(0);
const tableRef = ref();
@@ -291,6 +304,19 @@ const columns = ref([
<a-radio checked={text.record.leaveStatus} onClick={() => stuSign(text)}>请假</a-radio>
</div>
},
{
title: "操作",
ellipsis: true,
className: "h",
dataIndex: "opacation",
key: "opacation",
width: 130,
align: "center",
customRender: (text) =>
<div class="opa">
<a className="opa" style={{color: '#666'}} onClick={()=>removeStu(text.record.id)}>删除</a>
</div>
},
]);
const { data = [], loading, fetchData } = useRequest(COURSE_PLAN_LIST, planParams, false);
@@ -309,6 +335,11 @@ const ChoiceCourse = (n) => {
tableRef.value.fetch();
};
const removeStu=(id)=> dialog({
content: "确定删除该学员吗?",
ok: () => delStudentList({ ids: [id] }).then(() => fetchData())
})
const closeDrawer = () => emit("update:FSvisible", false);
//批量签到
const batchSign = () => {
@@ -369,6 +400,8 @@ function exportTaskStu() {
window.open(`${process.env.VUE_APP_BASE_API}/admin/student/exportTaskStudent?type=3&pid=${offcoursePlanId.value}&thirdType=2`);
}
const exportAssessment = () =>window.open(`${process.env.VUE_APP_BASE_API}/admin/assessment/manage/exportAssessmentMessage?chapterId=${props.type === 1 ? props.datasource.stageId : props.datasource.chapterId}&type=${props.type}&pid=${props.type === 1 ? props.datasource.projectId : props.datasource.routerId}&courseId=${data.value[coursePlanIndex.value].assessmentId}&taskId=${props.datasource.id}&taskType=${props.datasource.type}`);
function afterVisibleChange(bool) {
bool && fetchData()
}
@@ -396,6 +429,14 @@ const qrcodeVisibleSign = () => {
});
};
const qrcodeAssement = () =>{
qrCode({
title: "【评估】二维码",
name: data.value[coursePlanIndex.value]?.assessmentName,
url: `${location.protocol}//${location.host}${process.env.VUE_APP_BASE_API}/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`,
});
}
const change = (e) => {
console.log(e)
if(e==="end"){

View File

@@ -3202,26 +3202,22 @@ export default defineComponent({
console.log(val);
rest();
getTea();
};
const handelChangePageTea1 = (page, pageSize) => {
state.currentPageTea1 = page;
state.pageSizeTea1 = pageSize;
rest();
getTea();
};
const handleChangeTea2 = (val) => {
console.log(787877);
console.log(val);
options4CurName.value = val;
rest();
getTea();
};
const handelChangePageTea2 = (page, pageSize) => {
state.currentPageTea2 = page;
state.pageSizeTea2 = pageSize;
rest();
getTea();
};
//获取分类、场景、封面图、-----------字典配置-------------------------------
@@ -3476,7 +3472,6 @@ export default defineComponent({
const options4CurName = ref("张");
const of_hShow = () => {
state.offcourseId = "";
getTea();
if (state.of_hs == false) {
state.of_hs = true;
}
@@ -3546,7 +3541,6 @@ export default defineComponent({
state.qdms_inputV1 = state.xzinputV1;
state.xzinputV1 = "";
getTea();
}
if (state.bs_hs && state.valueE1 == 1) {
state.addOnlineCoursevisible = true;
@@ -4325,50 +4319,6 @@ export default defineComponent({
// }); */
// }
};
//获取教师
const getTea = async () => {
options4CurName.value = state.teacher;
options4CurId.value = state.teacherId;
const item1 = await getMemberInfoApi({
pageNo: state.currentPageTea1,
pageSize: state.pageSizeTea1,
keyWord: options4CurName.value,
id: options4CurId.value ? options4CurId.value : null,
})
.then((res) => {
console.log("获取授课教师", res);
if (res.data.code === 200) return res.data.data;
})
.catch((err) => {
console.log("获取授课教师失败", err);
});
const { rows, total } = item1;
state.tableDataTotalTea1 = total;
state.tableDataTotalTea2 = total;
let newArr = [];
for (let item of rows) {
if (options4CurId.value === item.id) {
if (state.offcoursePlanId && state.offcourseId) {
options4CurName.value = item.realName;
state.xjkkinputV4 = item.realName;
state.teacherId = item.id;
} else if (state.offcourseId) {
options4CurName.value = item.realName;
state.qdms_inputV5 = item.realName;
state.teacher = item.realName;
state.teacherId = item.id;
console.log("那个老师", item);
}
}
newArr.push({
value: item.id,
label: item.realName,
});
}
options4.value = newArr;
console.log("options4.value");
console.log(options4.value);
};
//编辑面授课
const handleEdit = async (itm, type) => {
if (type === "1") {
@@ -4423,7 +4373,6 @@ export default defineComponent({
// state.ft_hs = true;
CourseModalRef.value.visibleOpen(state.offcourseId, null);
state.ft_eidt = true;
// getTea();
};
// handleTagChange

View File

@@ -12,12 +12,8 @@
>
<div class="modalHeader">
<div class="headerLeft">
<img
style="width: 17px; height: 18px; margin-right: 8px"
src="@/assets/images/basicinfo/add.png"
/>
<span v-if="ft_eidt" class="headerLeftText">编辑面授课</span>
<span v-else class="headerLeftText"></span>
<span v-else class="headerLeftText">新建面授课</span>
</div>
<div style="margin-right: 57px; cursor: pointer">
<img
@@ -35,7 +31,6 @@
</div>
<div class="faceteach" :style="{ display: ft_hs ? 'block' : 'none' }">
<div class="ft_main">
<div class="m_title">课程信息</div>
<div class="m_body">
<div class="mb_left">
<div class="mbl_items">
@@ -133,21 +128,16 @@
align-items: center;
"
>
<img
v-for="(item, index) in optionsUrl"
:key="index"
class="choiceoptionurl"
:style="{
border:
pathBgId === item.id
? '3px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc',
display: index >= 3 ? 'none' : 'flex',
}"
:src="item.value"
:alt="item.name"
@click="chooseImg(item)"
/>
<div v-for="(item, index) in optionsUrl"
:key="index"
class="choiceoptionurl"
:style="{
border:pathBgId === item.id? '3px solid rgba(78, 166, 255, 1)': '1px solid #ccc',
display: index >= 3 ? 'none' : 'flex',
background: `url(${item.value}) center center / 100% no-repeat`,
}"
@click="chooseImg(item)"
/>
<div
@click="showLearnBgMore"
class="learnBgItem learnBgMore"
@@ -306,137 +296,104 @@
</div>
</div>
</div>
<div class="mbl_items">
<div class="item_nam" style="margin-bottom: 110px">
<span style="margin-right: 14px">课程价值</span>
</div>
<div class="item_inp">
<div class="i1_input">
<a-textarea
v-model:value="qdms_inputV3"
maxlength="200"
style="width: 440px; height: 140px; border-radius: 8px"
placeholder="请输入课程价值"
/>
<div class="inp_num" style="top: 110px">
<span style="color: #c7cbd2">
{{ qdms_inputV3.length }}/200
</span>
<div class="mbl_items">
<div class="item_nam" style="margin-top: 8px">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt="asterisk"
/>
</div>
<span style="margin-right: 14px">课程简介</span>
</div>
</div>
</div>
</div>
<div class="mbl_items">
<div class="item_nam">
<span style="margin-right: 14px">场景</span>
</div>
<div class="item_inp">
<div class="i1_input">
<a-input
v-model:value="chang_jin"
maxlength="50"
style="width: 440px; height: 40px; border-radius: 8px"
placeholder="请输入场景"
/>
<div class="inp_num">
<span style="color: #c7cbd2">
{{ chang_jin.length }}/50
</span>
<div class="item_inp">
<div class="i10_textarea">
<a-textarea
v-model:value="qdms_inputV6"
:maxlength="200"
style="width: 440px; height: 100px; border-radius: 8px"
placeholder="请输入"/>
<div class="inp_num">
<span style="color: #c7cbd2">
{{ qdms_inputV6.length }}/200
</span>
</div>
</div>
</div>
</div>
</div>
<!-- <div class="item_inp">
<div class="select i7_input">
<a-select :getPopupContainer="
(triggerNode) => {
return triggerNode.parentNode || document.body;
}
" v-model:value="chang_jin" dropdownClassName="dropdown-style" style="width: 440px" placeholder="请选择"
:options="options3" allowClear showSearch />
</div>
</div> -->
</div>
<div class="mbl_items">
<div class="item_nam">
<span style="margin-right: 14px">内容标签</span>
</div>
<div class="item_inp">
<div
style="cursor: pointer"
@click="handleTagChange"
>
<a-input
v-model:value="tags_val_single"
style="width: 440px; height: 40px; border-radius: 8px"
placeholder="请输入内容标签按回车键添加内容标签,可添加多个内容标签。"
@pressEnter="handleTagChange"
/>
<img
style="width: 20px; height: 20px;margin-left: 20px; "
src="../../assets/images/courseManage/add1.png"
/>
</div>
<div class="tag-content">
<a-tag
v-for="(item, index) in tags_val"
:key="index"
closable
@close="handleTagClose(item)"
>
{{ item }}
</a-tag>
</div>
</div>
</div>
</div>
<div class="mb_right">
<!--
<div class="mbl_items">
<div class="item_nam" style="margin-top:5px;">
<div class="asterisk_icon">
<img src="@/assets/images/coursewareManage/asterisk.png" alt="asterisk" />
</div>
<span style="margin-right: 14px">授课教师</span>
</div>
<div class="item_inp">
<div class="select" style="width:88%;">
<ProjectManager v-model:value="member.value" v-model:name="member.name" />
</div>
</div>
</div>
-->
<div class="mbl_items">
<div class="item_nam">
<span style="margin-right: 14px">内容标签</span>
</div>
<div class="item_inp">
<div class="mbl_items2">
<div class="item_nam" style="margin-top: 8px">
<div class="asterisk_icon">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt="asterisk"
/>
</div>
<span style="margin-right: 14px">课程简介</span>
<div
style="cursor: pointer"
@click="handleTagChange"
>
<a-input
v-model:value="tags_val_single"
style="width: 440px; height: 40px; border-radius: 8px"
placeholder="请输入内容标签按回车键添加内容标签,可添加多个内容标签。"
@pressEnter="handleTagChange"
/>
<img
style="width: 20px; height: 20px;margin-left: 20px; "
src="../../assets/images/courseManage/add1.png"
/>
</div>
<div class="tag-content">
<a-tag
v-for="(item, index) in tags_val"
:key="index"
closable
@close="handleTagClose(item)"
>
{{ item }}
</a-tag>
</div>
</div>
</div>
<div class="item_inp">
<div class="i10_textarea">
<a-textarea
v-model:value="qdms_inputV6"
maxlength="150"
style="width: 440px; height: 100px; border-radius: 8px"
placeholder="请输入"
/>
<div class="inp_num">
<span style="color: #c7cbd2">
{{ qdms_inputV6.length }}/150
</span>
<div class="mbl_items">
<div class="item_nam">
<span style="margin-right: 14px">场景</span>
</div>
<div class="item_inp">
<div class="i1_input">
<a-textarea
v-model:value="chang_jin"
:maxlength="200"
style="width: 440px; height: 80px; border-radius: 8px"
placeholder="请输入场景"/>
<div class="inp_num">
<span style="color: #c7cbd2"> {{ chang_jin.length }}/200 </span>
</div>
</div>
</div>
</div>
<div class="mbl_items">
<div class="item_nam" style="margin-bottom: 110px">
<span style="margin-right: 14px">课程价值</span>
</div>
<div class="item_inp">
<div class="i1_input">
<a-textarea
v-model:value="qdms_inputV3"
:maxlength="200"
style="width: 440px; height: 140px; border-radius: 8px"
placeholder="请输入课程价值"/>
<div class="inp_num" style="top: 110px">
<span style="color: #c7cbd2">{{ qdms_inputV3.length }}/200</span>
</div>
</div>
</div>
</div>
</div>
<div class="mbl_items">
<div class="item_nam" style="margin-top: 8px">
<span style="margin-right: 10px">附件</span>
@@ -515,11 +472,8 @@
:key="item.id"
class="learnBgItem"
:style="{
border:
pathBgId === item.id
? '3px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc',
'background-image': 'url(' + item.value + ')',
border: pathBgId === item.id? '3px solid rgba(78, 166, 255, 1)' : '1px solid #ccc',
'background': `url(${item.value}) center center / 100% no-repeat`,
}"
>
<!-- <img class="im" :src="item.source" /> -->
@@ -1568,8 +1522,6 @@ export default defineComponent({
width: 100px;
height: 100px;
background-size: 100%;
background-repeat: no-repeat;
// margin-bottom: 20px;
margin-right: 6px;
}