feat:增加面授课成绩录入

This commit is contained in:
lixg
2023-01-10 18:00:51 +08:00
9 changed files with 167 additions and 67 deletions

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-04 22:45:31 * @Date: 2022-11-04 22:45:31
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-09 16:29:37 * @LastEditTime: 2023-01-10 17:38:43
* @FilePath: /fe-manage/src/api/index1.js * @FilePath: /fe-manage/src/api/index1.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@@ -184,4 +184,6 @@ export const getImportStatus = (uuid) => http.get('/admin/student/getImportStatu
// export const exportHomeWork=(obj)=>http.get('admin/student/exportHomeWork',{params:obj}) // export const exportHomeWork=(obj)=>http.get('admin/student/exportHomeWork',{params:obj})
// 面授课导入学员 // 面授课导入学员
export const FaceTeachImportStudent = (obj) => http.post('/admin/student/importStudent', obj, {headers: { "Content-Type": "multipart/form-data" }}) export const FaceTeachImportStudent = (obj) => http.post('/admin/student/importStudent', obj, { headers: { "Content-Type": "multipart/form-data" } })
//成绩录入
export const updateStudent = (obj) => http.post('/admin/student/updateStudent', obj)

View File

@@ -171,6 +171,7 @@ export default {
const state = reactive({ const state = reactive({
template: process.env.VUE_APP_TEMPLATE + "导入学员模版-1672998102528.xlsx", template: process.env.VUE_APP_TEMPLATE + "导入学员模版-1672998102528.xlsx",
importStudent: process.env.VUE_APP_BASE_API + "admin/student/importStudent", importStudent: process.env.VUE_APP_BASE_API + "admin/student/importStudent",
timers: "", // 定时器,用于清空定时器使用
uploadpercent: -1, uploadpercent: -1,
uploadErr: false, //上传失败 uploadErr: false, //上传失败
addLoading: false, addLoading: false,
@@ -182,6 +183,7 @@ export default {
locationHref: location.href.indexOf('http://') !== -1 ? 'http://111.231.196.214:12016/' : location.href.slice(0, location.href.indexOf('/m')) + '/upload/' locationHref: location.href.indexOf('http://') !== -1 ? 'http://111.231.196.214:12016/' : location.href.slice(0, location.href.indexOf('/m')) + '/upload/'
}); });
const closeDrawer = () => { const closeDrawer = () => {
clearInterval(state.timers);
state.fileList = []; state.fileList = [];
state.uploadpercent = -1; state.uploadpercent = -1;
state.addLoading = false; state.addLoading = false;
@@ -191,6 +193,8 @@ export default {
state.errNum = 0; state.errNum = 0;
state.downloadErrUrl = ""; state.downloadErrUrl = "";
ctx.emit("update:AddImpStuvisible", false); ctx.emit("update:AddImpStuvisible", false);
// 通知父组件重新获取学员列表
ctx.emit("AddImpStuvisibleClose", false);
}; };
const afterVisibleChange = (bool) => { const afterVisibleChange = (bool) => {
@@ -228,7 +232,7 @@ export default {
type: 3 type: 3
}) })
let i = 0; let i = 0;
let timer = setInterval(() => { state.timers = setInterval(() => {
let uid = info.file.response.data; let uid = info.file.response.data;
api api
.getImportStatus(uid) .getImportStatus(uid)
@@ -246,12 +250,12 @@ export default {
state.succNum = res.data.data.successNum; state.succNum = res.data.data.successNum;
state.errNum = res.data.data.failedNum; state.errNum = res.data.data.failedNum;
state.downloadErrUrl = res.data.data.url; state.downloadErrUrl = res.data.data.url;
clearInterval(timer); clearInterval(state.timers);
} }
} }
}) })
.catch((err) => { .catch((err) => {
clearInterval(timer); clearInterval(state.timers);
state.showBottomBar = true; state.showBottomBar = true;
state.addLoading = false; state.addLoading = false;
console.log("查询导入状态失败", err); console.log("查询导入状态失败", err);

View File

@@ -6,7 +6,7 @@
placement="right" placement="right"
width="700px" width="700px"
@after-visible-change="afterVisibleChange" @after-visible-change="afterVisibleChange"
:zIndex="999" :zIndex="1000"
> >
<div class="drawerMain"> <div class="drawerMain">
<div class="header"> <div class="header">
@@ -70,8 +70,8 @@
</div> </div>
<div class="curloading"> <div class="curloading">
<!-- <div class="cur">55%</div> --> <!-- <div class="cur">55%</div> -->
<div class="cancel" style="margin-left: 20px">暂停</div> <!-- <div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div> <div class="cancel" style="margin-left: 15px">取消</div> -->
</div> </div>
</div> </div>
</div> </div>
@@ -207,7 +207,7 @@ export default {
type: Number, type: Number,
default: null, default: null,
}, },
getStudent: { searchTaskList: {
type: Function, type: Function,
default: null, default: null,
}, },
@@ -275,11 +275,12 @@ export default {
message.destroy(); message.destroy();
message.success(`${info.file.name}上传成功`); message.success(`${info.file.name}上传成功`);
state.addLoading = false; state.addLoading = false;
props.searchTaskList && props.searchTaskList();
} }
state.succNum = res.data.data.successNum; state.succNum = res.data.data.successNum;
state.errNum = res.data.data.failedNum; state.errNum = res.data.data.failedNum;
state.downloadErrUrl = res.data.data.url; state.downloadErrUrl = res.data.data.url;
props.getStudent && props.getStudent(); console.log("props.getStudent", props.getStudent);
clearInterval(timer); clearInterval(timer);
} }
} }
@@ -336,6 +337,10 @@ export default {
state.fileList = []; state.fileList = [];
state.uploadpercent = -1; state.uploadpercent = -1;
state.uploadErr = false; //上传失败 state.uploadErr = false; //上传失败
state.succNum = 0;
state.errNum = 0;
state.downloadErrUrl = null;
state.addLoading = false;
}; };
// 下载失败数据 // 下载失败数据
const downloadEeeorData = () => { const downloadEeeorData = () => {

View File

@@ -180,7 +180,7 @@
<!-- 二维码签到弹窗 --> <!-- 二维码签到弹窗 -->
<SignQR v-model:signQRvisible="signQRvisible" /> <SignQR v-model:signQRvisible="signQRvisible" />
<!-- 导入学员抽屉 --> <!-- 导入学员抽屉 -->
<imp-stu v-model:AddImpStuvisible="AddImpStuvisible" :courseId="projectTaskInfo.courseId" :courseType="2"/> <imp-stu v-model:AddImpStuvisible="AddImpStuvisible" @AddImpStuvisibleClose="AddImpStuvisibleClose" :courseId="projectTaskInfo.courseId" :courseType="2"/>
<!-- 批量签到弹窗 --> <!-- 批量签到弹窗 -->
<a-modal <a-modal
v-model:visible="copyModal" v-model:visible="copyModal"
@@ -727,6 +727,14 @@ export default {
// console.log(err); // console.log(err);
// }); // });
} }
{/* 添加学员弹框关闭,重新获取学员列表 */}
const AddImpStuvisibleClose = () => {
console.log('关闭了导入学员弹框')
{/* 此处操作重新获取学员列表数据 */}
getStudent()
}
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,
@@ -746,6 +754,7 @@ export default {
changePaginationStu, changePaginationStu,
exportTaskStu, exportTaskStu,
clearLine, clearLine,
AddImpStuvisibleClose
}; };
}, },
}; };

View File

@@ -133,8 +133,8 @@
<EScore <EScore
v-model:eScorevisible="Evisible" v-model:eScorevisible="Evisible"
:type="1" :type="1"
:id="datasource.projectTaskId" :id="projectTaskInfo?.projectTaskId"
v-model:getStudent="getStudent" v-model:searchTaskList="searchTaskList"
/> />
<!-- 查看作业抽屉 --> <!-- 查看作业抽屉 -->
<CKWork v-model:CWvisible="CWvisible" /> <CKWork v-model:CWvisible="CWvisible" />
@@ -639,6 +639,7 @@ export default {
exportTaskStu, exportTaskStu,
exportHomeWork, exportHomeWork,
exportHomeWorkShow, exportHomeWorkShow,
getStudent,
}; };
}, },
}; };

View File

@@ -174,7 +174,7 @@
<!-- 二维码签到弹窗 --> <!-- 二维码签到弹窗 -->
<SignQR v-model:signQRvisible="signQRvisible" /> <SignQR v-model:signQRvisible="signQRvisible" />
<!-- 导入学员抽屉 --> <!-- 导入学员抽屉 -->
<imp-stu v-model:AddImpStuvisible="AddImpStuvisible" :courseId="datasource.courseId" :courseType="1"/> <imp-stu v-model:AddImpStuvisible="AddImpStuvisible" @AddImpStuvisibleClose="AddImpStuvisibleClose" :courseId="datasource.courseId" :courseType="1" />
<!-- 批量签到弹窗 --> <!-- 批量签到弹窗 -->
<a-modal <a-modal
v-model:visible="copyModal" v-model:visible="copyModal"
@@ -695,6 +695,14 @@ export default {
state.codeIndex = 1; state.codeIndex = 1;
state.codeType = 2; state.codeType = 2;
}; };
{/* 添加学员弹框关闭,重新获取学员列表 */}
const AddImpStuvisibleClose = () => {
console.log('关闭了导入学员弹框')
{/* 此处操作重新获取学员列表数据 */}
getStudent()
}
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,
@@ -715,6 +723,7 @@ export default {
exportTaskStu, exportTaskStu,
clearLine, clearLine,
qrcodeVisible, qrcodeVisible,
AddImpStuvisibleClose
}; };
}, },
}; };

View File

@@ -128,8 +128,8 @@
<EScore <EScore
v-model:eScorevisible="Evisible" v-model:eScorevisible="Evisible"
:type="2" :type="2"
:id="datasource.routerTaskId" :id="datasource?.routerTaskId"
v-model:getStudent="getStudent" v-model:searchTaskList="searchTaskList"
/> />
<!-- 查看作业抽屉 --> <!-- 查看作业抽屉 -->
<CKWork v-model:CWvisible="CWvisible" /> <CKWork v-model:CWvisible="CWvisible" />
@@ -647,6 +647,7 @@ export default {
exportTaskStu, exportTaskStu,
exportHomeWork, exportHomeWork,
exportHomeWorkShow, exportHomeWorkShow,
getStudent,
}; };
}, },
}; };

View File

@@ -102,7 +102,9 @@
<a-button class="cus-btn white"> 批量换组 </a-button> <a-button class="cus-btn white"> 批量换组 </a-button>
</a-col> </a-col>
<a-col :span="1.5" v-if="type === 1"> <a-col :span="1.5" v-if="type === 1">
<a-button class="cus-btn white" @click="exportTaskStu"> 导出学习信息 </a-button> <a-button class="cus-btn white" @click="exportTaskStu">
导出学习信息
</a-button>
</a-col> </a-col>
<a-col :span="1.5"> <a-col :span="1.5">
<a-button class="cus-btn white" @click="bathDel"> <a-button class="cus-btn white" @click="bathDel">
@@ -338,7 +340,12 @@
/> />
<!-- 导入作业成绩抽屉 --> <!-- 导入作业成绩抽屉 -->
<ExportScore v-model:eScorevisible="eScorevisible" :type="3" :id="id" /> <EScore
v-model:eScorevisible="eScorevisible"
:type="3"
:id="id"
v-model:searchTaskList="getStuList"
/>
<!-- 导出作业提示框 --> <!-- 导出作业提示框 -->
<ExportHomeWork <ExportHomeWork
v-model:exportHomeWorkV="exportHomeWorkV" v-model:exportHomeWorkV="exportHomeWorkV"
@@ -353,7 +360,7 @@ import ChangeLevelModal from "./ChangeLevelModal.vue";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
// import { topStudent } from "../../api/indexProjStu"; // import { topStudent } from "../../api/indexProjStu";
import SeeStu from "../../components/drawers/SeeStu"; import SeeStu from "../../components/drawers/SeeStu";
import ExportScore from "../drawers/ExportScore.vue"; import EScore from "../drawers/ExportScore.vue";
import OrgClass from "@/components/project/OrgClass"; import OrgClass from "@/components/project/OrgClass";
import ExportHomeWork from "../Modals/ExportHomeWork.vue"; import ExportHomeWork from "../Modals/ExportHomeWork.vue";
import * as api from "../../api/index1"; import * as api from "../../api/index1";
@@ -372,6 +379,10 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
isgetStudent: {
type: Boolean,
default: null,
},
}); });
const topFlagList = ref([ const topFlagList = ref([
{ {
@@ -484,13 +495,14 @@ function exportTaskStu() {
process.env.VUE_APP_PROXY_URL process.env.VUE_APP_PROXY_URL
}admin/student/exportTaskStudent?type=${1}&pid=${props.id}&taskType=0` }admin/student/exportTaskStudent?type=${1}&pid=${props.id}&taskType=0`
); );
} }
onMounted(() => { onMounted(() => {
getStuList(); getStuList();
}); });
watch(props.isgetStudent, () => {
console.log("监测");
});
watch(props, () => { watch(props, () => {
if (!props.visable) { if (!props.visable) {
stuSelectKeys.value = []; stuSelectKeys.value = [];

View File

@@ -93,7 +93,11 @@
</div> </div>
<div class="btns"> <div class="btns">
<!-- 2022-11-30注释 后面放开 --> <!-- 2022-11-30注释 后面放开 -->
<div class="btn btn3" @click="openMessage" style="margin-right:14px;"> <div
class="btn btn3"
@click="openMessage"
style="margin-right: 14px"
>
<div class="search"></div> <div class="search"></div>
<div class="btnText">导出</div> <div class="btnText">导出</div>
</div> </div>
@@ -1706,6 +1710,7 @@
:id="offcoursePlanId" :id="offcoursePlanId"
:columns="stuColumns" :columns="stuColumns"
:visable="sm_hs" :visable="sm_hs"
:isgetStudent="isgetStudent"
> >
<template #extension="{ data: { record } }"> <template #extension="{ data: { record } }">
<div style="display: flex"> <div style="display: flex">
@@ -2545,7 +2550,10 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.studentName?text.record.studentName:"-"}</span> <span>
{" "}
{text.record.studentName ? text.record.studentName : "-"}
</span>
</div> </div>
); );
}, },
@@ -2559,7 +2567,10 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span> <span>
{" "}
{text.record.studentUserNo ? text.record.studentUserNo : "-"}
</span>
</div> </div>
); );
}, },
@@ -2573,7 +2584,7 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.name?text.record.name:"-"}</span> <span> {text.record.name ? text.record.name : "-"}</span>
</div> </div>
); );
}, },
@@ -2587,7 +2598,7 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.address?text.record.address:"-"}</span> <span> {text.record.address ? text.record.address : "-"}</span>
</div> </div>
); );
}, },
@@ -2601,7 +2612,10 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.courseSource?text.record.courseSource:"-"}</span> <span>
{" "}
{text.record.courseSource ? text.record.courseSource : "-"}
</span>
</div> </div>
); );
}, },
@@ -2615,7 +2629,10 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.lastStudyTime?text.record.lastStudyTime:"-"}</span> <span>
{" "}
{text.record.lastStudyTime ? text.record.lastStudyTime : "-"}
</span>
</div> </div>
); );
}, },
@@ -2629,7 +2646,7 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.signTime?text.record.signTime:"-"}</span> <span> {text.record.signTime ? text.record.signTime : "-"}</span>
</div> </div>
); );
}, },
@@ -2643,7 +2660,12 @@ const columns2 = [
customRender: (text) => { customRender: (text) => {
return ( return (
<div class="racona"> <div class="racona">
<span> {text.record.finishStatus==0 || text.record.finishStatus == null ?"未开始":"已完成"}</span> <span>
{" "}
{text.record.finishStatus == 0 || text.record.finishStatus == null
? "未开始"
: "已完成"}
</span>
</div> </div>
); );
}, },
@@ -2980,7 +3002,7 @@ export default defineComponent({
return ( return (
<div class="racona"> <div class="racona">
<span> <span>
{text.record.studentJobName {text && text.record.studentJobName
? text.record.studentJobName ? text.record.studentJobName
: "-"} : "-"}
</span> </span>
@@ -2994,13 +3016,11 @@ export default defineComponent({
dataIndex: "studentBandDesc", dataIndex: "studentBandDesc",
key: "7", key: "7",
align: "center", align: "center",
customRender: (text) => { customRender: (record) => {
return ( return (
<div class="racona"> <div class="racona">
<span> <span>
{text.record.studentBandDesc {record.studentBandDesc ? record.studentBandDesc : "-"}
? text.record.studentBandDesc
: "-"}
</span> </span>
</div> </div>
); );
@@ -3063,9 +3083,11 @@ export default defineComponent({
key: "7", key: "7",
align: "center", align: "center",
customRender: ({ record }) => { customRender: ({ record }) => {
switch (String(record.status)) {
case "0":
return ( return (
<div class="racona">
{record.workScore ? (
<span>{record.workScore}</span>
) : (
<span <span
style={{ color: "#4EA6FF", cursor: "pointer" }} style={{ color: "#4EA6FF", cursor: "pointer" }}
onClick={() => { onClick={() => {
@@ -3074,12 +3096,26 @@ export default defineComponent({
> >
成绩录入 成绩录入
</span> </span>
)}
</div>
); );
case "1": // switch (String(record.status)) {
return "-"; // case "0":
case "2": // return (
return "-"; // <span
} // style={{ color: "#4EA6FF", cursor: "pointer" }}
// onClick={() => {
// handlJoinStu(record);
// }}
// >
// 成绩录入
// </span>
// );
// case "1":
// return "-";
// case "2":
// return "-";
// }
}, },
}, },
{ {
@@ -3314,6 +3350,8 @@ export default defineComponent({
xygl_inputV1: "", xygl_inputV1: "",
//录入成绩 //录入成绩
lrcj_inputV1: "", lrcj_inputV1: "",
scoreId: null, //录入成绩id
isgetStudent: false, //是否重新获取学员
//结业 //结业
jyradioV1: "", jyradioV1: "",
@@ -3854,6 +3892,7 @@ export default defineComponent({
state.studentItem = itm; state.studentItem = itm;
state.rg_hs = true; state.rg_hs = true;
state.scoreId = itm.id;
}; };
const handleOverStu = (itm) => { const handleOverStu = (itm) => {
console.log(itm); console.log(itm);
@@ -4091,7 +4130,7 @@ export default defineComponent({
offcoursePlanId: state.offcoursePlanId, offcoursePlanId: state.offcoursePlanId,
name: state.xygl_inputV1, name: state.xygl_inputV1,
}; };
// console.log("获取学员信息", obj); console.log("获取学员信息", obj);
let res = await studentList(obj); let res = await studentList(obj);
console.log("获取学员列表", res); console.log("获取学员列表", res);
const { rows, total, pageNo } = res.data.data; const { rows, total, pageNo } = res.data.data;
@@ -4147,7 +4186,7 @@ export default defineComponent({
state.gl_selectV2 = undefined; state.gl_selectV2 = undefined;
state.manageStuLoading = true; state.manageStuLoading = true;
getCourseStudentList(); getCourseStudentList();
} };
// const getTableDate33 = async () => { // const getTableDate33 = async () => {
// let datas = state.tableData2; // let datas = state.tableData2;
// let res = await listReview({ // let res = await listReview({
@@ -4724,25 +4763,30 @@ export default defineComponent({
const handleJoin = async () => { const handleJoin = async () => {
if (state.rg_hs) { if (state.rg_hs) {
if (state.piliang) { if (state.piliang) {
handleStudent({ api1.updateStudent({
offcoursePlanId: state.offcoursePlanId,
score: state.lrcj_inputV1, score: state.lrcj_inputV1,
studentIds: state.selectedRowKeys7, id: state.scoreId,
type: 1,
}); });
getTableDate2(); getTableDate2();
delete_exit1(); delete_exit1();
} else { } else {
handleStudent({ api1
offcoursePlanId: state.offcoursePlanId, .updateStudent({
score: state.lrcj_inputV1, score: state.lrcj_inputV1,
studentIds: [state.studentId], id: state.scoreId,
type: 1, })
}).then((res) => { .then((res) => {
console.log("成绩录入", res);
if (res.data.code === 200) { if (res.data.code === 200) {
getTableDate2(); // getTableDate2();
state.isgetStudent = true;
delete_exit1(); delete_exit1();
state.lrcj_inputV1 = "";
state.scoreId = null;
} }
})
.catch((err) => {
console.log("录入失败", err);
}); });
} }
} }
@@ -4950,10 +4994,21 @@ export default defineComponent({
} }
window.open( window.open(
`${process.env.VUE_APP_PROXY_URL}admin/offcourse/export?pageNo=${state.currentPage1}&pageSize=${state.pageSize1}&auditStatus=${state.auditStatus?state.auditStatus:""}&categoryId=${state.categoryId?state.categoryId:""}&projectName=${state.projectName?state.projectName:""}&name=${state.name?state.name:""}&createName=${state.createName?state.createName:""}&endTime=${endTime?endTime:""}&beginTime=${startTime?startTime:""}` `${process.env.VUE_APP_PROXY_URL}admin/offcourse/export?pageNo=${
state.currentPage1
}&pageSize=${state.pageSize1}&auditStatus=${
state.auditStatus ? state.auditStatus : ""
}&categoryId=${state.categoryId ? state.categoryId : ""}&projectName=${
state.projectName ? state.projectName : ""
}&name=${state.name ? state.name : ""}&createName=${
state.createName ? state.createName : ""
}&endTime=${endTime ? endTime : ""}&beginTime=${
startTime ? startTime : ""
}`
); );
{/* exportP({ {
/* exportP({
pageNo: state.currentPage1, pageNo: state.currentPage1,
pageSize: state.pageSize1, pageSize: state.pageSize1,
auditStatus: state.auditStatus, auditStatus: state.auditStatus,
@@ -4967,7 +5022,8 @@ export default defineComponent({
if (res.data.code === 200) { if (res.data.code === 200) {
message.success("导出成功"); message.success("导出成功");
} }
}); */} }); */
}
}; };
//获取教师 //获取教师
const getTea = async () => { const getTea = async () => {
@@ -5497,7 +5553,8 @@ export default defineComponent({
url: url:
type == 1 type == 1
? process.env.VUE_APP_COURSE_STUDY + record.offcourseId ? process.env.VUE_APP_COURSE_STUDY + record.offcourseId
:process.env.VUE_APP_BOE_API_URL + `/admin/student/studentSign?taskId=${ : process.env.VUE_APP_BOE_API_URL +
`/admin/student/studentSign?taskId=${
record.offcoursePlanId record.offcoursePlanId
}&type=${3}`, }&type=${3}`,
}; };