feat:增加导出作业

This commit is contained in:
lixg
2023-01-07 19:48:29 +08:00
parent ec61608e52
commit 72d2e7b987
15 changed files with 363 additions and 53 deletions

2
.env
View File

@@ -16,3 +16,5 @@ VUE_APP_IFRAME_STUDENT_URL=https://u-pre.boe.com/pc/loading
# 课程二维码
VUE_APP_COURSE_STUDY=https://u-pre.boe.com/pc/course/studyindex?id=
# 导入学员模板
VUE_APP_TEMPLATE=https://u-pre.boe.com/upload/

View File

@@ -9,4 +9,6 @@ VUE_APP_BOE_API_URL=https://u.boe.com
VUE_APP_IFRAME_URL=https://u.boe.com/pc/iframe
VUE_APP_IFRAME_STUDENT_URL=https://u.boe.com/pc/loading
VUE_APP_COURSE_STUDY=https://u.boe.com/pc/course/studyindex?id=
VUE_APP_COURSE_STUDY=https://u.boe.com/pc/course/studyindex?id=
VUE_APP_TEMPLATE=https://u-pre.boe.com/upload/

View File

@@ -9,4 +9,6 @@ VUE_APP_BOE_API_URL=https://u.boe.com
VUE_APP_IFRAME_URL=https://u.boe.com/pc-release/iframe
VUE_APP_IFRAME_STUDENT_URL=https://u.boe.com/pc-release/loading
VUE_APP_COURSE_STUDY=https://u.boe.com/pc-release/course/studyindex?id=
VUE_APP_COURSE_STUDY=https://u.boe.com/pc-release/course/studyindex?id=
VUE_APP_TEMPLATE=https://u-pre.boe.com/upload/

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-04 22:45:31
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-06 18:04:16
* @LastEditTime: 2023-01-07 16:53:23
* @FilePath: /fe-manage/src/api/index1.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@@ -173,5 +173,7 @@ export const batchFinishTask = (obj) => http.post('/admin/student/batchFinishTas
//批量更新学员状态
export const batchUpdateStatus = (obj) => http.post('/admin/student/batchUpdateStatus', obj)
// //面授课批量导入成绩
export const batchImportScore = (offcoursePlanId, obj) =>
http.post(`/admin/offcourse/batchImportScore?offcoursePlanId=${offcoursePlanId}`, obj);
export const batchImportScore = (obj) =>
http.post('/admin/student/importHomeWork', obj, {
headers: { "Content-Type": "multipart/form-data" },
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,187 @@
<!--
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-07 17:25:14
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-07 17:43:55
* @FilePath: /fe-manage/src/components/Modals/ExportHomeWork.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<a-modal
:visible="exportHomeWorkV"
:footer="null"
wrapClassName="exportHomeWork"
centered="true"
>
<div class="delete">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<div class="icon"></div>
<span>提示</span>
<div class="close_exit" @click="clostModal"></div>
</div>
<div class="body">
<img
style="width: 40px; height: 40px; margin-bottom: 16px"
src="../../assets/images/leveladd/success.png"
/>
<span>作业导出完成请下载本地或去下载中心查看</span>
</div>
<div class="del_btnbox">
<div class="del_btn btn1" @click="clostModal">
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="downloadHomeWork">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</template>
<script>
import { toRefs, reactive } from "vue";
export default {
name: "ProjectHomeWorkManage",
props: {
exportHomeWorkV: {
type: Boolean,
default: false,
},
},
setup(props, ctx) {
const state = reactive({});
//关闭弹窗
const clostModal = () => {
ctx.emit("update:exportHomeWorkV", false);
};
// //下载作业
// const downloadHomeWork=()=>{
// // props.url
// }
console.log("props", props);
return {
...toRefs(state),
clostModal,
};
},
};
</script>
<style lang="scss">
.exportHomeWork {
.ant-modal {
width: 424px !important;
height: 308px !important;
.ant-modal-content {
width: 424px !important;
height: 308px !important;
.ant-modal-body {
width: 424px !important;
height: 308px !important;
padding: 0 !important;
.delete {
z-index: 999;
width: 424px;
height: 308px;
background: #ffffff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
border-radius: 4px;
// position: absolute;
// left: 50%;
// top: 10%;
// transform: translate(-50%, -50%);
.del_header {
position: absolute;
width: calc(100%);
height: 68px;
background: linear-gradient(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%
);
}
.del_main {
width: 100%;
position: relative;
.header {
display: flex;
align-items: center;
padding-top: 20px;
padding-left: 26px;
font-size: 16px;
.icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/taskpage/gan.png);
background-size: 100% 100%;
}
.close_exit {
position: absolute;
right: 42px;
cursor: pointer;
width: 20px;
height: 20px;
background-image: url(@/assets/images/coursewareManage/close.png);
background-size: 100% 100%;
}
}
.body {
width: 100%;
margin: 34px auto 56px auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
// background-color: red;
position: relative;
.back {
position: absolute;
top: 30px;
font-size: 12px;
font-weight: 400;
color: #666666;
}
}
.del_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
.ant-modal-close-x {
display: none;
}
}
}
</style>

View File

@@ -18,7 +18,7 @@
<div class="main">
<div class="minatitl">
<div class="up1">请下载</div>
<div class="up2">模板</div>
<a class="up2" :href="template" style="course: pointer">模板</a>
<div class="up1">按要求填写数据并导入</div>
</div>
<div class="upload">
@@ -138,7 +138,10 @@ export default {
},
},
setup(props, ctx) {
const state = reactive({});
const state = reactive({
template:
process.env.VUE_APP_TEMPLATE + "导入学员模版-1672998102528.xlsx",
});
const closeDrawer = () => {
ctx.emit("update:AddImpStuvisible", false);
};

View File

@@ -28,10 +28,12 @@
<div style="height: 176px; margin-bottom: 20px">
<a-upload-dragger
v-model:fileList="fileList"
:action="BATCH_IMPORT_SCORE + '?offcoursePlanId=' + id"
action="/admin/student/importHomeWork"
name="file"
:multiple="true"
:before-upload="beforeUpload"
@change="handleChange"
@customRequest="handleUpload"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
@@ -60,8 +62,8 @@
</div>
<div class="curloading">
<div class="cur">55%</div>
<div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div>
<!-- <div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div> -->
</div>
</div>
</div>
@@ -79,10 +81,22 @@
</div>
<div class="curloading">
<div class="cur">55%</div>
<div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div>
<div
style="color: #387df7; margin-left: 20px; cursor: pointer"
>
下载失败数据
</div>
<!-- <div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div> -->
</div>
<div
class="defeat"
style="display: flex; align-items: center"
>
<div style="color: #ff7474">
20条数据导入成功5条数据导入失败
</div>
</div>
<div class="defeat">下载失败数据</div>
</div>
</div>
<div class="loadborder">
@@ -99,7 +113,7 @@
</div>
<div class="curloading">
<div class="cur">100%</div>
<div class="cancel" style="margin-left: 20px">删除</div>
<!-- <div class="cancel" style="margin-left: 20px">删除</div> -->
</div>
</div>
</div>
@@ -150,7 +164,18 @@ export default {
//上传文件
const handleChange = (info) => {
console.log("info", info, props.id);
console.log("info", info);
let timer = setInterval(() => {
if (info.file.percent < 100) {
console.log("info111", info.file.percent);
} else {
console.log("info22", info.file.percent);
clearInterval(timer);
}
}, 1000);
// if (info.event) {
// console.log("info.event", info.event);
// }
const status = info.file.status;
if (status !== "uploading") {
console.log(info.file, info.fileList);
@@ -159,24 +184,61 @@ export default {
const formData = new FormData();
formData.append("uploadFile", info.file);
// formData.append("offcoursePlanId", props.id);
console.log(info.file);
api.batchImportScore(props.id, formData).then((res) => {
// if (res.data.code === 200) {
// console.log('上传成功')
// }
console.log("上传成绩", res);
});
console.log("info.file", info.file);
// api.batchImportScore(formData).then((res) => {
// // if (res.data.code === 200) {
// // console.log('上传成功')
// // }
// console.log("上传成绩", res);
// });
message.success(`${info.file.name} file uploaded successfully.`);
} else if (status === "error") {
message.error(`${info.file.name} file upload failed.`);
}
};
const beforeUpload = (file) => {
return new Promise((resolve, reject) => {
// const isJpgOrPng =
// file.name.indexOf(".xlsx") !== "-1" ||
// file.name.indexOf(".xls") !== "-1";
// if (!isJpgOrPng) {
// message.destroy();
// message.error("仅支持xls、xlsx格式!");
// return reject(false);
// }
const formData = new FormData();
formData.append("uploadFile", file);
// let progress = { percent: 1 };
// const intervalId = setInterval(() => {
// if (progress.percent < 100) {
// progress.percent++;
// file.onProgress(progress);
// } else {
// clearInterval(intervalId);
// }
// }, 100);
api.batchImportScore(formData).then((res) => {
if (res.data.code === 200) {
console.log("上传成功", res);
return reject(true);
}
});
return reject(false);
});
};
const handleUpload = (e) => {
console.log("handleUpload", e);
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
handleChange,
BATCH_IMPORT_SCORE,
beforeUpload,
handleUpload,
};
},
};
@@ -281,12 +343,13 @@ export default {
margin-left: 20px;
position: relative;
.defeat {
width: 400px;
position: absolute;
left: 46px;
top: 38px;
font-size: 14px;
font-weight: 500;
color: #ff7474;
justify-content: space-between;
}
.img {
width: 30px;

View File

@@ -709,9 +709,7 @@ export default {
process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?currentStageId=${
props.projectTaskInfo.stageId
}&type=${1}&pid=${props.projectTaskInfo.projectId}&taskId=${
props.projectTaskInfo.projectTaskId
}&taskType=${props.projectTaskInfo.type}`
}&type=${1}&pid=${props.projectTaskInfo.projectId}&taskType=0`
);
// api
// .exportTaskStudent({

View File

@@ -82,7 +82,7 @@
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
<div class="btn btn2" @click="exportHomeWork">
<div class="btn btn2" @click="exportHomeWorkShow">
<div class="wz">导出作业</div>
</div>
</div>
@@ -165,6 +165,9 @@
<CKWork v-model:CWvisible="CWvisible" />
<!-- 查看答卷抽屉 -->
<CQue v-model:CQvisible="CQvisible" />
<!-- 导出作业提示框 -->
<ExportHomeWork v-model:exportHomeWorkV="exportHomeWorkV" />
</template>
<script>
@@ -176,6 +179,7 @@ import CQue from "../CheckQue.vue";
import EntryScores from "../EntryScores.vue";
// import * as api from "../../../api/index";
import * as api from "../../../api/index1";
import ExportHomeWork from "../../Modals/ExportHomeWork.vue";
export default {
name: "ProjectFaceTaskManage",
components: {
@@ -183,6 +187,7 @@ export default {
CKWork,
CQue,
ASOver,
ExportHomeWork,
},
props: {
Fvisible: {
@@ -473,6 +478,7 @@ export default {
},
},
],
exportHomeWorkV: false,
});
// //面授直播管理列表操作
// const ListOpera = () => {
@@ -656,9 +662,7 @@ export default {
process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?currentStageId=${
props.projectTaskInfo.stageId
}&type=${1}&pid=${props.projectTaskInfo.projectId}&taskId=${
props.projectTaskInfo.projectTaskId
}&taskType=${props.projectTaskInfo.type}`
}&type=${1}&pid=${props.projectTaskInfo.projectId}taskType=0`
);
// api
// .exportTaskStudent({
@@ -676,6 +680,12 @@ export default {
// console.log(err);
// });
}
//显示导出作业弹窗
const exportHomeWorkShow = () => {
state.exportHomeWorkV = true;
// exportHomeWork();
};
//导出作业
function exportHomeWork() {
console.log("props.projectTaskInfo", props.projectTaskInfo);
@@ -704,6 +714,7 @@ export default {
resetTaskList,
changePaginationStu,
exportTaskStu,
exportHomeWorkShow,
exportHomeWork,
getStudent,
};

View File

@@ -72,7 +72,7 @@
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
<div class="btn btn2" @click="exportHomeWork">
<div class="btn btn2" @click="exportHomeWorkShow">
<div class="wz">导出作业</div>
</div>
<div class="btn btn2">
@@ -134,6 +134,9 @@
<CKWork v-model:CWvisible="CWvisible" />
<!-- 查看答卷抽屉 -->
<CQue v-model:CQvisible="CQvisible" />
<!-- 导出作业提示框 -->
<ExportHomeWork v-model:exportHomeWorkV="exportHomeWorkV" />
</template>
<script>
@@ -145,6 +148,7 @@ import CQue from "../CheckQue.vue";
import EScore from "../ExportScore.vue";
// import * as api from "../../../api/index";
import * as api from "../../../api/index1";
import ExportHomeWork from "../../Modals/ExportHomeWork.vue";
export default {
name: "ProjectHomeWorkManage",
components: {
@@ -152,6 +156,7 @@ export default {
CKWork,
CQue,
EScore,
ExportHomeWork,
},
props: {
Wvisible: {
@@ -382,6 +387,7 @@ export default {
className: "h",
},
],
exportHomeWorkV: false,
});
//面授直播管理列表操作
const ListOpera = () => {
@@ -546,9 +552,7 @@ export default {
process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?currentStageId=${
props.projectTaskInfo.stageId
}&type=${1}&pid=${props.projectTaskInfo.projectId}&taskId=${
props.projectTaskInfo.projectTaskId
}&taskType=${props.projectTaskInfo.type}`
}&type=${1}&pid=${props.projectTaskInfo.projectId}&taskType=0`
);
// api
// .exportTaskStudent({
@@ -566,6 +570,12 @@ export default {
// console.log(err);
// });
}
//显示导出作业弹窗
const exportHomeWorkShow = () => {
state.exportHomeWorkV = true;
// exportHomeWork();
};
//导出作业
function exportHomeWork() {
console.log("props.projectTaskInfo", props.projectTaskInfo);
@@ -595,6 +605,7 @@ export default {
changePaginationStu,
exportTaskStu,
exportHomeWork,
exportHomeWorkShow,
};
},
};

View File

@@ -641,9 +641,7 @@ export default {
process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?currentStageId=${
props.datasource.chapterId
}&type=${2}&pid=${props.datasource.routerId}&taskId=${
props.datasource.routerTaskId
}&taskType=${props.datasource.type}`
}&type=${2}&pid=${props.datasource.routerId}&taskType=0`
);
// api
// .exportTaskStudent({

View File

@@ -77,7 +77,7 @@
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
<div class="btn btn2" @click="exportHomeWork">
<div class="btn btn2" @click="exportHomeWorkShow">
<div class="wz">导出作业</div>
</div>
</div>
@@ -150,6 +150,8 @@
<CKWork v-model:CWvisible="CWvisible" />
<!-- 查看答卷抽屉 -->
<CQue v-model:CQvisible="CQvisible" />
<!-- 导出作业提示框 -->
<ExportHomeWork v-model:exportHomeWorkV="exportHomeWorkV" />
</template>
<script>
@@ -161,6 +163,7 @@ import CQue from "../CheckQue.vue";
import EntryScores from "../EntryScores.vue";
// import * as api from "../../../api/index";
import * as api from "../../../api/index1";
import ExportHomeWork from "../../Modals/ExportHomeWork.vue";
export default {
name: "RouterFaceTeachManage",
components: {
@@ -168,6 +171,7 @@ export default {
CKWork,
CQue,
ASOver,
ExportHomeWork,
},
props: {
FaceTeachModelVisible: {
@@ -418,6 +422,7 @@ export default {
className: "h",
},
],
exportHomeWorkV: false,
});
//面授直播管理列表操作
const ListOpera = () => {
@@ -602,9 +607,7 @@ export default {
process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?currentStageId=${
props.datasource.chapterId
}&type=${2}&pid=${props.datasource.routerId}&taskId=${
props.datasource.routerTaskId
}&taskType=${props.datasource.type}`
}&type=${2}&pid=${props.datasource.routerId}&taskType=0`
);
// api
// .exportTaskStudent({
@@ -622,6 +625,13 @@ export default {
// console.log(err);
// });
}
//显示导出作业弹窗
const exportHomeWorkShow = () => {
state.exportHomeWorkV = true;
// exportHomeWork();
};
//导出作业
function exportHomeWork() {
console.log("props.datasource", props.datasource);
@@ -651,6 +661,7 @@ export default {
exportTaskStu,
exportHomeWork,
getStudent,
exportHomeWorkShow,
};
},
};

View File

@@ -67,7 +67,7 @@
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
<div class="btn btn2" @click="exportHomeWork">
<div class="btn btn2" @click="exportHomeWorkShow">
<div class="wz">导出作业</div>
</div>
<div class="btn btn2">
@@ -129,6 +129,9 @@
<CKWork v-model:CWvisible="CWvisible" />
<!-- 查看答卷抽屉 -->
<CQue v-model:CQvisible="CQvisible" />
<!-- 导出作业提示框 -->
<ExportHomeWork v-model:exportHomeWorkV="exportHomeWorkV" />
</template>
<script>
@@ -140,6 +143,7 @@ import CQue from "../CheckQue.vue";
import EScore from "../ExportScore.vue";
// import * as api from "../../../api/index";
import * as api from "../../../api/index1";
import ExportHomeWork from "../../Modals/ExportHomeWork.vue";
export default {
name: "RouterCommonManage",
components: {
@@ -147,6 +151,7 @@ export default {
CKWork,
CQue,
EScore,
ExportHomeWork,
},
props: {
HomeworkModelVisible: {
@@ -393,6 +398,7 @@ export default {
className: "h",
},
],
exportHomeWorkV: false,
});
//面授直播管理列表操作
const ListOpera = () => {
@@ -554,9 +560,7 @@ export default {
process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?currentStageId=${
props.datasource.chapterId
}&type=${2}&pid=${props.datasource.routerId}&taskId=${
props.datasource.routerTaskId
}&taskType=${props.datasource.type}`
}&type=${2}&pid=${props.datasource.routerId}&taskType=0`
);
// api
// .exportTaskStudent({
@@ -574,6 +578,12 @@ export default {
// console.log(err);
// });
}
//显示导出作业弹窗
const exportHomeWorkShow = () => {
state.exportHomeWorkV = true;
// exportHomeWork();
};
//导出作业
function exportHomeWork() {
console.log("props.datasource", props.datasource);
@@ -603,6 +613,7 @@ export default {
changePaginationStu,
exportTaskStu,
exportHomeWork,
exportHomeWorkShow,
};
},
};

View File

@@ -161,7 +161,7 @@
<div
class="stmm_btn btn5"
style="margin-left: 15px"
@click="exportHomeWork"
@click="exportHomeWorkShow"
>
<div class="btnText">导出作业</div>
</div>
@@ -339,6 +339,8 @@
<!-- 导入作业成绩抽屉 -->
<ExportScore v-model:eScorevisible="eScorevisible" :type="3" :id="id" />
<!-- 导出作业提示框 -->
<ExportHomeWork v-model:exportHomeWorkV="exportHomeWorkV" />
</template>
<script setup>
import { computed, defineProps, onMounted, ref, watch } from "vue";
@@ -350,6 +352,7 @@ import { message } from "ant-design-vue";
import SeeStu from "../../components/drawers/SeeStu";
import ExportScore from "../drawers/ExportScore.vue";
import OrgClass from "@/components/project/OrgClass";
import ExportHomeWork from "../Modals/ExportHomeWork.vue";
const props = defineProps({
type: Number,
id: String,
@@ -627,14 +630,20 @@ const showEScoreModal = () => {
eScorevisible.value = true;
};
//导出作业
const exportHomeWork = () => {
window.open(
`${
process.env.VUE_APP_PROXY_URL
}admin/student/exportHomeWork?type=${3}&pid=${props.id}`
);
//显示导出作业弹窗
const exportHomeWorkV = ref(false);
const exportHomeWorkShow = () => {
exportHomeWorkV.value = true;
// exportHomeWork();
};
// //导出作业
// const exportHomeWork = () => {
// window.open(
// `${
// process.env.VUE_APP_PROXY_URL
// }admin/student/exportHomeWork?type=${3}&pid=${props.id}`
// );
// };
//导出
const exportStu = () => {
window.open(