Merge branch 'new_1205_bug' into zcwy-teacher-manage

This commit is contained in:
zhangsir
2024-12-16 10:02:50 +08:00
24 changed files with 1515 additions and 767 deletions

View File

@@ -2,10 +2,7 @@ NODE_ENV=boe
VUE_APP_BASE=/manage VUE_APP_BASE=/manage
VUE_APP_BASE_API=/manageApi VUE_APP_BASE_API=/manageApi
VUE_APP_LOGIN_URL=//u-pre.boe.com/web?returnUrl= VUE_APP_LOGIN_URL=//u-pre.boe.com/web?returnUrl=
# VUE_APP_BOE_API_URL=//u-pre.boe.com VUE_APP_BOE_API_URL=//u-pre.boe.com
VUE_APP_BOE_API_URL=//pretest.zcwytd.com
# 导入学员模板 # 导入学员模板
VUE_APP_UP_LOAD_STUDENT_TEMPLATE=coursefile/导入学员模版-1677140876274.xlsx VUE_APP_UP_LOAD_STUDENT_TEMPLATE=coursefile/导入学员模版-1677140876274.xlsx
# 外部考试导入成绩模板 # 外部考试导入成绩模板
@@ -15,4 +12,5 @@ VUE_APP_ONLINE_CLASS_URL=//u-pre.boe.com/mobile/pages/study/courseStudy?id=
VITE_BOE_CASS_DETAIL_URL=//u-pre.boe.com/pc/case/detail?id= VITE_BOE_CASS_DETAIL_URL=//u-pre.boe.com/pc/case/detail?id=
VUE_APP_EXAM_DETAIL_URL=//u-pre.boe.com/mobile/pages/exam/exam?id= VUE_APP_EXAM_DETAIL_URL=//u-pre.boe.com/mobile/pages/exam/exam?id=
# 批量面授报名模板 # 批量面授报名模板
VUE_APP_FACE_STUDENT_TEMPLATE=coursefile/批量面授报名模版-1679595849719.xlsx VUE_APP_FACE_STUDENT_TEMPLATE=coursefile/批量面授报名模版-1679595849719.xlsx
VUE_APP_FILE_PATH=/upload/boe/file/

View File

@@ -18,4 +18,4 @@ export const REFRESH_TOKEN_API = "/userbasic/refreshToken";
export const COURSE_AUDIT = "/systemapi/xboe/m/course/manage/audit post formData"; export const COURSE_AUDIT = "/systemapi/xboe/m/course/manage/audit post formData";
export const OTHER_AUDIT = "/systemapi/xboe/m/course/audit/appoint post formData"; export const OTHER_AUDIT = "/systemapi/xboe/m/course/audit/appoint post formData";
export const ONLINE_COURSE_DEL = (id, courseId,studentId) => `/systemapi/xboe/school/study/course/delete-signup?id=${id}&couserId=${courseId}&studentId=${studentId} post`; export const ONLINE_COURSE_DEL = (id, courseId,studentId) => `/systemapi/xboe/school/study/course/delete-signup?id=${id}&courseId=${courseId}&studentId=${studentId} post`;

View File

@@ -501,9 +501,6 @@ export async function request(_url, params) {
if (res.code === 0 || res.code === 200 || res.status === 200) { if (res.code === 0 || res.code === 200 || res.status === 200) {
return res; return res;
} }
if (res.code === 4 ){
return Promise.reject(res);
}
if (res.code === 1000 || res.code === 1002) { if (res.code === 1000 || res.code === 1002) {
window.location.href = process.env.VUE_APP_LOGIN_URL + encodeURIComponent(window.location.protocol + process.env.VUE_APP_BOE_API_URL + process.env.VUE_APP_BASE + router.currentRoute.value.fullPath) window.location.href = process.env.VUE_APP_LOGIN_URL + encodeURIComponent(window.location.protocol + process.env.VUE_APP_BOE_API_URL + process.env.VUE_APP_BASE + router.currentRoute.value.fullPath)
localStorage.removeItem('refreshPage') localStorage.removeItem('refreshPage')

View File

@@ -574,7 +574,7 @@
{ {
name: "感恩教师", name: "感恩教师",
}, { }, {
name:'认证讲师库2023' name:'认证讲师库'
} }
]; ];
} }

View File

@@ -394,7 +394,7 @@
circle: selectedKeys[0] === 'sub22-4' ? false : true, circle: selectedKeys[0] === 'sub22-4' ? false : true,
}" }"
></span> ></span>
<router-link to="/teachertopic">认证讲师库2023</router-link> <router-link to="/teachertopic">认证讲师库</router-link>
</a-menu-item> </a-menu-item>
<a-menu-item key="sub22-5" v-if="checkMenu('tooldown')"> <a-menu-item key="sub22-5" v-if="checkMenu('tooldown')">
<span <span
@@ -994,7 +994,7 @@ export default {
href: "/teachertopic", href: "/teachertopic",
openKeys: "sub22", openKeys: "sub22",
selectedKeys: "sub22-4", selectedKeys: "sub22-4",
pagename: "认证讲师库2023", pagename: "认证讲师库",
}, },
{ {
href: "/tooldown", href: "/tooldown",

View File

@@ -0,0 +1,342 @@
<template>
<div class="twoDimensionalCode">
<!--二维码页面 -->
<a-modal
:visible="codevisible"
:footer="null"
:closable="closableQR"
wrapClassName="codeModal"
style="margin-top: 400px"
:zIndex="9999"
@cancel="qr_exit"
>
<div id="qrcode" class="QR">
<div class="qr_header"></div>
<div class="qr_main">
<div class="qrm_header">
<span style="title">{{
codeInfo.title ? codeInfo.title : ""
}}</span>
<div class="close_exit" @click="closeCodeModal"></div>
</div>
<div class="downloadCode" style="">
<div class="qrm_body">
<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" :title="codeInfo.name">
开课{{ codeInfo.name ? codeInfo.name : "" }}
</div>
<div v-if="codeInfo.teacherName" class="codename" :title="codeInfo.titleTeacherName">
讲师{{ codeInfo.teacherName ? codeInfo.teacherName : "" }}
</div>
</div>
<qrcode-vue
:value="codeInfo.url.startsWith('/')?(`${domain+codeInfo.url}&t=10`):`${codeInfo.url}&t=10`"
:size="qrcodeSize"
style="width: 200px; height: 200px"
></qrcode-vue>
</div>
</div>
<div class="codeUrl" :style="{ display: showUrl ? 'flex' : 'none' }">
<div class="codeUrlLink">链接</div>
<a-input
:value="codeInfo.url.startsWith('/')?`${domain+codeInfo.url}&t=10`:`${codeInfo.url}&t=10`"
disabled
class="codeUrlInp"
/>
<a-input
:value="codeInfo.url.startsWith('/')?`${domain+codeInfo.url}&t=10`:`${codeInfo.url}&t=10`"
id="courseUrl"
class="codeUrlInp"
style="position: absolute; opacity: 0; z-index: -1"
/>
<div @click="copyUrl" class="codeUrlCopy">复制链接</div>
</div>
<div class="qrm_footer">
<span
style="color: #387df7; cursor: pointer"
@click="downloadQr(200)"
>下载二维码</span
>
<!-- <div class="qrmbtn" @click="downloadQr(200)">
<div class="btntext">200*200</div>
</div> -->
<!-- <div class="qrmbtn" @click="downloadQr(200)">
<div class="btntext">400*400</div>
</div>
<div class="qrmbtn" @click="downloadQr(200)">
<div class="btntext">800*800</div>
</div> -->
</div>
</div>
</div>
</a-modal>
<!--二维码页面 -->
</div>
</template>
<script>
import { reactive, toRefs, watch } from "vue";
import QrcodeVue from "qrcode.vue";
import html2canvas from "html2canvas";
import { message } from "ant-design-vue";
export default {
name: "TwoDimensionalCode",
components: {
QrcodeVue,
},
props: {
codevisible: {
type: Boolean,
default: false,
},
codeInfo: {
type: Object,
default: function () {
return {};
},
},
index: {
type: String,
default: "",
},
type: {
type: String,
default: "",
},
},
setup(props, ctx) {
const state = reactive({
qrcodeSize: 800,
codeInfo: {},
courseUrl: "https://www.baidu.com/",
showUrl: false,
domain: location.protocol+'//'+location.host
});
//下载二维码图片
const downloadQr = (num) => {
state.qrcodeSize = num;
html2canvas(
document.querySelectorAll(".downloadCode")[Number(props.index)],
{
useCORS: true, //支持图片跨域
}
).then((canvas) => {
// console.log("canvas", canvas, canvas.width, canvas.style.width);
let filename = `${new Date().getTime()}.png`;
let imageUrl = canvas.toDataURL("image/png");
let a = document.createElement("a");
a.style.display = "none";
a.download = filename;
a.href = imageUrl;
document.body.appendChild(a);
a.click();
});
// let canvas =document.getElementsByClassName('codeModal')[Number(props.index)].getElementsByTagName('canvas')[0];
// let filename = `${new Date().getTime()}.png`;
// let imageUrl = canvas.toDataURL("image/png");
// let a = document.createElement("a");
// a.style.display = "none";
// a.download = filename;
// a.href = imageUrl;
// document.body.appendChild(a);
// a.click();
};
//复制链接
const copyUrl = () => {
// const range = document.createRange(); //创建range对象
// range.selectNode(document.getElementById('courseUrl')); //获取复制内容的 id 选择器
// const selection = window.getSelection(); //创建 selection对象
// if (selection.rangeCount > 0) selection.removeAllRanges(); //如果页面已经有选取了的话,会自动删除这个选区,没有选区的话,会把这个选取加入选区
// selection.addRange(range); //将range对象添加到selection选区当中会高亮文本块
// document.execCommand("Copy"); //复制选中的文字到剪贴板
// message.success('复制成功')
// selection.removeRange(range); // 移除选中的元素
var input = document.createElement("input"); // 创建input对象
input.value = state.codeInfo.url.startsWith('/')?(state.domain+state.codeInfo.url):state.codeInfo.url; // 设置复制内容
document.body.appendChild(input); // 添加临时实例
input.select(); // 选择实例内容
document.execCommand("Copy"); // 执行复制
document.body.removeChild(input); // 删除临时实例
message.success("复制成功!");
};
const closeCodeModal = () => {
ctx.emit("update:codevisible", false);
};
watch(() => {
let obj = {
title: "",
name: "",
url: "",
teacherName: "",
};
state.codeInfo = Object.assign(obj, props.codeInfo);
console.log("codeInfo22222", state.codeInfo, props.index, props.type);
if (props.type === "签到二维码"|| props.type === "评估二维码") {
state.showUrl = false;
console.log(" state.showUrl", state.showUrl);
} else if (props.type === "课程二维码") {
state.showUrl = true;
}
});
return {
...toRefs(state),
downloadQr,
closeCodeModal,
copyUrl,
};
},
};
</script>
<style scoped lang="scss">
.twoDimensionalCode {
}
.codeModal {
.ant-modal {
.ant-modal-content {
width: 479px !important;
.ant-modal-body {
.QR {
z-index: 9999;
width: 520px;
background: #ffffff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
position: absolute;
left: 50%;
top: 10%;
transform: translate(-50%, -50%);
.qr_header {
position: absolute;
width: calc(100%);
height: 40px;
background: linear-gradient(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%
);
}
.qr_main {
width: 100%;
position: relative;
.qrm_header {
display: flex;
align-items: center;
padding-top: 20px;
padding-left: 26px;
font-size: 16px;
.title {
font-size: 16px;
font-weight: 600;
color: #333333;
line-height: 22px;
}
.close_exit {
position: absolute;
right: 42px;
cursor: pointer;
width: 20px;
height: 20px;
background-image: url(@/assets/images/coursewareManage/close.png);
background-size: 100% 100%;
}
}
.qrm_body {
width: 100%;
padding-top: 22px;
padding-bottom: 32px;
display: flex;
flex-direction: column;
align-items: center;
.qrm_body_item{
width: 100%;
margin-left: 270px;
}
.codename {
font-size: 18px;
font-weight: 400;
color: #333333;
line-height: 25px;
margin-bottom: 20px;
margin-left: 20px;
margin-right: 20px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 300px;
}
}
.codeUrl {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 24px;
.codeUrlLink {
width: 72px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-weight: 400;
color: #c7cbd2;
line-height: 20px;
border: 1px solid #c7cbd2;
border-right: 0px solid #c7cbd2;
}
.codeUrlInp {
width: 305px;
height: 40px;
border: 1px solid #c7cbd2;
}
.ant-input-disabled {
background-color: rgba(0, 0, 0, 0) !important;
}
.ant-input[disabled] {
background-color: rgba(0, 0, 0, 0) !important;
}
.codeUrlCopy {
width: 96px;
height: 40px;
background-color: #4ea6ff;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 20px;
cursor: pointer;
margin-left: 8px;
}
}
.qrm_footer {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 44px;
.qrmbtn {
width: 80px;
height: 32px;
display: flex;
line-height: 32px;
justify-content: center;
border-radius: 4px;
border: 1px solid #387df7;
// margin-left: 16px;
cursor: pointer;
.btntext {
color: #387df7;
}
}
}
}
}
}
}
}
}
</style>

View File

@@ -487,20 +487,19 @@ const columns = ref([
key: "teacher", key: "teacher",
width: "20%", width: "20%",
align: "center", align: "center",
ellipsis: true,
customRender: ({ record }) => { customRender: ({ record }) => {
// const teachers = record.offteachers; // const teachers = record.offteachers;
// return teachers.map((teacher, index) => { // return teachers.map((teacher, index) => {
// // 如果需要显示为列表形式 // // 如果需要显示为列表形式
// return ( // return (
// <div key={index}> // <div key={index}>
// {teacher.teacherName} // {teacher.teacherName}
// {index !== teachers.length - 1 && ', '} // {index !== teachers.length - 1 && ', '}
// </div> // </div>
// ); // );
// }); // });
return record.offteachers.map(item=>item.teacherName).join(',') return record.offteachers.map(item=>item.teacherName).join(',')
}, },
}, },
{ {

View File

@@ -442,10 +442,6 @@ export default {
{/* 导出数据 */ } {/* 导出数据 */ }
function exportData() { function exportData() {
if(state.tabledata.length==0){
message.error("没有数据可以导出");
return
}
// window.open(`${process.env.VUE_APP_BASE_API}/admin/exam/manage/exportExam?chapterId=${props.datasource.chapterId}&targetId=${props.datasource.routerId}&taskId=${props.datasource.courseId}&type=${1}`) // window.open(`${process.env.VUE_APP_BASE_API}/admin/exam/manage/exportExam?chapterId=${props.datasource.chapterId}&targetId=${props.datasource.routerId}&taskId=${props.datasource.courseId}&type=${1}`)
window.open(`${process.env.VUE_APP_BASE_API}/admin/exam/manage/exportExam?currentStageId=${props.datasource.chapterId}&type=${1}&pid=${props.datasource.routerId}&targetId=${props.datasource.routerId}&taskId=${props.datasource.courseId}&taskType=${props.datasource.type}`) window.open(`${process.env.VUE_APP_BASE_API}/admin/exam/manage/exportExam?currentStageId=${props.datasource.chapterId}&type=${1}&pid=${props.datasource.routerId}&targetId=${props.datasource.routerId}&taskId=${props.datasource.courseId}&taskType=${props.datasource.type}`)

View File

@@ -71,6 +71,7 @@ const rulesRef = ref({
Form.useForm(modelV, rulesRef, { debounce: { wait: 800 } }); Form.useForm(modelV, rulesRef, { debounce: { wait: 800 } });
onMounted(() => { onMounted(() => {
validateValue()
if(props.onceName==modelV.value.value){ if(props.onceName==modelV.value.value){
isExistName.value = false; isExistName.value = false;
}else{ }else{
@@ -90,10 +91,11 @@ watch(props, () => {
watch(() => modelV.value.value, () => { watch(() => modelV.value.value, () => {
emit("update:validated", 1); emit("update:validated", 1);
emit("update:value", modelV.value.value); emit("update:value", modelV.value.value);
}); },{immediate: true});
async function validateValue() { async function validateValue() {
if (!modelV.value.value) { if (!modelV.value.value) {
emit("update:validated", 2);
return Promise.reject("请输入名称"); return Promise.reject("请输入名称");
} }
return validateName({ name: modelV.value.value, type: props.type, id: props.id }).then(res => { return validateName({ name: modelV.value.value, type: props.type, id: props.id }).then(res => {

View File

@@ -125,7 +125,16 @@ watch(() => modelV.value.value, () => {
emit("update:validated", 1); emit("update:validated", 1);
emit("update:value", modelV.value.value); emit("update:value", modelV.value.value);
}); });
const timer = ref(null)
watch(()=>props.validated, (val)=>{
if(val===1){
timer.value = setTimeout(() => {
emit("update:validated", 2);
}, 10000);
}else{
clearTimeout(timer.value)
}
})
async function validateValue() { async function validateValue() {
if (!modelV.value.value) { if (!modelV.value.value) {
return Promise.reject("请输入名称"); return Promise.reject("请输入名称");
@@ -138,7 +147,10 @@ async function validateValue() {
emit("update:validated", 2); emit("update:validated", 2);
return Promise.resolve(); return Promise.resolve();
} }
); ).catch(err => {
emit("update:validated", 2);
return Promise.resolve();
})
} }
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@@ -0,0 +1,56 @@
<template>
<a-select
:getPopupContainer="
(triggerNode) => {
return triggerNode.parentNode || document.body;
}
"
v-model:value="numValue"
style="width: 100%;"
placeholder="请选择项目编号"
:options="options"
showSearch
allowClear
@change="handleChange"
>
</a-select>
</template>
<script setup>
import {computed, defineEmits, defineProps, onMounted, ref, watch} from 'vue';
import { useStore } from "vuex";
const props = defineProps({
value: String,
})
const emit = defineEmits(['update:value'])
const store = useStore();
const numValue = computed(()=>store.state.project_number.find(item=>item.value == props.value)?.name || null)
const handleChange = (value,option)=>{
emit('update:value',option?.searchData || '')
}
onMounted(() => {
// console.log(store.state.project_number,'store.state.project_number')
});
const options = computed(() => {
const projectNumberList = store.state.project_number;
const sortedList = projectNumberList.sort((a, b) => {
if (a.sort !== b.sort) {
return b.sort - a.sort;
}
const aTimestamp = Date.parse(a.createTime);
const bTimestamp = Date.parse(b.createTime);
return bTimestamp - aTimestamp;
});
return sortedList.map(e => ({
value: e.value + e.name,
label: ' 【 ' + e.value + ' 】 ' + e.name,
searchData: e.value
}));
});
</script>
<style lang="scss" scoped>
::v-deep .ant-select-selector{
border-radius: 8px !important;
}
</style>

View File

@@ -500,13 +500,21 @@ const audiColums = ref([
ellipsis: true, ellipsis: true,
}, },
{ {
title: "人数", title: "人数",
dataIndex: "totalMember", dataIndex: "totalMember",
key: "totalMember", key: "totalMember",
width: 30, width: 30,
align: "center", align: "center",
className: "h", className: "h",
}, },
{
title: "在职人数",
dataIndex: "workMember",
key: "workMember",
width: 30,
align: "center",
className: "h",
},
]); ]);
const orgSelectKeys = ref([]); const orgSelectKeys = ref([]);
const auditTableRef = ref(); const auditTableRef = ref();
@@ -612,7 +620,7 @@ const submitAuth = () => {
function handleDialogOk() { function handleDialogOk() {
if (auditSelectRowKeys.value.length || deptList.value.length) { if (auditSelectRowKeys.value.length || deptList.value.length) {
dialog({ content: "您选择了组织或受众,此添加为异步添加,请稍后手动刷新学员!", ok: handleStageOk }); dialog({ content: "您选择了组织或受众,此添加为异步添加,请稍后手动刷新学员!(本次添加只添加在职人员)", ok: handleStageOk });
return; return;
} }
handleStageOk(); handleStageOk();

View File

@@ -91,6 +91,11 @@
导出 导出
</a-button> </a-button>
</a-col> </a-col>
<a-col>
<a-button class="cus-btn" style="background: #4ea6ff; color: #fff; width: 150px" @click="exportStudy">
导出详细学习记录
</a-button>
</a-col>
</a-row> </a-row>
<div style="margin-top: 20px"> <div style="margin-top: 20px">
<a-table <a-table
@@ -121,7 +126,8 @@ import dialog from "@/utils/dialog";
import {ONLINE_COURSE_DEL} from "@/api/ThirdApi"; import {ONLINE_COURSE_DEL} from "@/api/ThirdApi";
import {useStore} from "vuex"; import {useStore} from "vuex";
import {useAsyncStu, useResetRef} from "@/utils/useCommon"; import {useAsyncStu, useResetRef} from "@/utils/useCommon";
import {downLoadXlsx} from "@/utils/zipdownload";
import {message} from "ant-design-vue";
const props = defineProps({ const props = defineProps({
permissions: { permissions: {
type: String, type: String,
@@ -323,7 +329,12 @@ function reset() {
function exportStu() { function exportStu() {
window.open(`${process.env.VUE_APP_BASE_API}/admin/student/exportOnlineStudent?type=3&&thirdType=8&pid=${searchParams.value.pid}`); window.open(`${process.env.VUE_APP_BASE_API}/admin/student/exportOnlineStudent?type=3&&thirdType=8&pid=${searchParams.value.pid}`);
} }
function exportStudy() {
if(studentList.value.length == 0){
return message.warning('暂无可导出的学习记录')
}
downLoadXlsx(`${process.env.VUE_APP_BASE_API}/admin/student/exportOnlineStudentDetail?type=4&&thirdType=8&pid=${searchParams.value.pid}`,'在线课学员学习记录')
}
defineExpose({ defineExpose({
searchStu, searchStu,
loading, loading,

View File

@@ -196,7 +196,7 @@
:data-source="tableData.list" :data-source="tableData.list"
:pagination="stuPagination" :pagination="stuPagination"
:loading="tableData.loading" :loading="tableData.loading"
:scroll="{ x: 1500 }" :scroll="{ x: 1350 }"
row-key="id" row-key="id"
:row-selection="stuRowSelection" :row-selection="stuRowSelection"
> >
@@ -467,7 +467,7 @@ const tablecolumns = ref([
title: "姓名", title: "姓名",
dataIndex: "studentName", dataIndex: "studentName",
key: "studentName", key: "studentName",
width: "10%", width: "80px",
align: "left", align: "left",
className: "h", className: "h",
ellipsis: true, ellipsis: true,
@@ -496,7 +496,7 @@ const tablecolumns = ref([
title: "工号", title: "工号",
dataIndex: "studentUserNo", dataIndex: "studentUserNo",
key: "studentUserNo", key: "studentUserNo",
width: "20%", width: "60px",
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true, ellipsis: true,
@@ -505,12 +505,13 @@ const tablecolumns = ref([
title: "部门", title: "部门",
dataIndex: "studentDepartName", dataIndex: "studentDepartName",
key: "studentDepartName", key: "studentDepartName",
width: "15%", width: "120px",
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true, customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
customRender: ({ record: { studentOrgName, studentDepartName } }) => customRender: ({ record: { studentOrgName, studentDepartName } }) =>
allDepartShow(studentOrgName), // <a-tooltip color="white" placement="topLeft" title={allDepartShow(studentOrgName)} >{allDepartShow(studentOrgName)}</a-tooltip>
<a-tooltip color="white" placement="topLeft" title={studentOrgName} >{studentDepartName}</a-tooltip>
}, },
{ {
title: "所属小组", title: "所属小组",
@@ -522,10 +523,10 @@ const tablecolumns = ref([
ellipsis: true, ellipsis: true,
}, },
{ {
title: "加入方式", title: "报名方式",
dataIndex: "source", dataIndex: "source",
key: "source", key: "source",
width: "10%", width: "60px",
align: "center", align: "center",
customRender: ({ record: { source } }) => customRender: ({ record: { source } }) =>
// ({ 1: "快速添加", 2: "组织", 3: "受众", 4: "报名" }[source]), // ({ 1: "快速添加", 2: "组织", 3: "受众", 4: "报名" }[source]),
@@ -535,8 +536,9 @@ const tablecolumns = ref([
2: "手动加入", 2: "手动加入",
3: "手动加入", 3: "手动加入",
4: "导入", 4: "导入",
5: "报名", 5: "自主报名",
6: "导入", 6: "导入",
8: "扫码报名",
}[source]), }[source]),
}, },
...props.columns, ...props.columns,
@@ -544,7 +546,8 @@ const tablecolumns = ref([
title: "操作", title: "操作",
dataIndex: "operation", dataIndex: "operation",
key: "operation", key: "operation",
width: 260, width: '120px',
fixed: "right",
align: "center", align: "center",
slots: { customRender: "action" }, slots: { customRender: "action" },
}, },
@@ -559,7 +562,10 @@ function allDepartShow(a, b) {
: a; : a;
let depart = b == "" || b == null || b == undefined ? (b = "") : b; let depart = b == "" || b == null || b == undefined ? (b = "") : b;
let allname = org == "" && depart == "" ? "-" : org + depart; let allname = org == "" && depart == "" ? "-" : org + depart;
return allname; const parts = allname.split('/');
const reversedParts = parts.reverse();
const reversedStr = reversedParts.join('/');
return reversedStr;
} }
const tableParam = ref({ const tableParam = ref({
@@ -618,7 +624,7 @@ function exportTaskStu() {
window.open( window.open(
`${ `${
process.env.VUE_APP_BASE_API process.env.VUE_APP_BASE_API
}/admin/student/exportTaskStudent?type=${1}&pid=${props.id}` }/admin/student/exportTaskStudent?type=${1}&pid=${props.id}&studentName=${tableParam.value.studentName === null ?'':tableParam.value.studentName}&studentDepartName=${tableParam.value.studentDepartName===null?'':tableParam.value.studentDepartName}&topFlag=${tableParam.value.topFlag===null?'':tableParam.value.topFlag}`
); );
} }
@@ -858,7 +864,9 @@ const exportHomeWorkShow = () => {
// message.success("导出作业成功"); // message.success("导出作业成功");
exportHomeWorkV.value = true; exportHomeWorkV.value = true;
downloadUrl.value = res.data.data; downloadUrl.value = res.data.data;
}); }).catch(err=>{
// message.error(err.data.msg)
})
}; };
// //导出作业 // //导出作业
// const exportHomeWork = () => { // const exportHomeWork = () => {

View File

@@ -131,5 +131,6 @@ async function init() {
initDict("course_pic"); //课程封面 initDict("course_pic"); //课程封面
initDict("job_type"); //岗位 initDict("job_type"); //岗位
initDict("band"); //band initDict("band"); //band
initDict("examine_cover") initDict("examine_cover") //讲师认证封面图
initDict("project_number") //项目编号
} }

View File

@@ -5,7 +5,16 @@ const mimeMap = {
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
zip: 'application/zip' zip: 'application/zip'
} }
export function downLoadXlsx(str, filename) {
axios({
method: 'get',
url: str,
responseType: 'blob',
headers: { 'Authorization': 'Bearer ' + getCookieForName("token") }
}).then(res => {
resolveBlob(res, mimeMap.xlsx,filename)
})
}
const baseUrl = process.env.VUE_APP_ACT_API const baseUrl = process.env.VUE_APP_ACT_API
export function downLoadZip(str, filename) { export function downLoadZip(str, filename) {
var url = baseUrl + str var url = baseUrl + str

View File

@@ -693,7 +693,7 @@ const column = [
}, },
}, },
{ {
title: "人数", title: "人数",
dataIndex: "members", dataIndex: "members",
key: "members", key: "members",
width: "5%", width: "5%",
@@ -704,6 +704,18 @@ const column = [
return text ? text : "-"; return text ? text : "-";
}, },
}, },
{
title: "在职人数",
dataIndex: "workMembers",
key: "workMembers",
width: "5%",
align: "center",
ellipsis: true,
className: "h",
customRender: ({ text }) => {
return text ? text : "-";
},
},
{ {
title: "状态", title: "状态",
dataIndex: "state", dataIndex: "state",

File diff suppressed because it is too large Load Diff

View File

@@ -173,9 +173,9 @@ const ViewReviewcolumns = reactive([
dataIndex: '课程名称', dataIndex: '课程名称',
fixed: 'left', fixed: 'left',
align: 'left', align: 'left',
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}}, customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',}}},
customRender: ({ text }) => { customRender: ({ text }) => {
return <span title={text}>{text ? text : ""}</span> return <span style="user-select: text;" title={text}>{text ? text : ""}</span>
}, },
}, },
@@ -1276,7 +1276,7 @@ const vwtext = ref(null)
class="ant-table-striped" size="middle"> class="ant-table-striped" size="middle">
<template #bodyCell="{ column, record, index, text }"> <template #bodyCell="{ column, record, index, text }">
<template v-if="column.key === 'name'"> <template v-if="column.key === 'name'">
<span> <span style="user-select:text">
{{ index + 1 }} {{ index + 1 }}
</span> </span>
</template> </template>
@@ -1284,12 +1284,12 @@ const vwtext = ref(null)
<!-- <span> <!-- <span>
{{ text === 0 ? '通过' : (text === 1 ? '未通过' : (text === 2 ? '进行中' : '已报名')) }} {{ text === 0 ? '通过' : (text === 1 ? '未通过' : (text === 2 ? '进行中' : '已报名')) }}
</span> --> </span> -->
<span :style="{ color: record.平均分 >= 80 ? '#31AF0D' : (record.平均分 < 80 ? '#f5222d' : '#3da8f0') }"> <span style="user-select:text" :style="{ color: record.平均分 >= 80 ? '#31AF0D' : (record.平均分 < 80 ? '#f5222d' : '#3da8f0') }">
{{ record.平均分==null?'': record.平均分 >= 80 ? '通过' : (record.平均分 < 80 ? '未通过' : (null)) }} {{ record.平均分==null?'': record.平均分 >= 80 ? '通过' : (record.平均分 < 80 ? '未通过' : (null)) }}
</span> </span>
</template> </template>
<template v-else-if="column.key === '平均分'"> <template v-else-if="column.key === '平均分'">
<span :style="{ color: text >= 80 ? '#31AF0D' : (text < 80 ? '#f5222d' : '#3da8f0') }"> <span style="user-select:text" :style="{ color: text >= 80 ? '#31AF0D' : (text < 80 ? '#f5222d' : '#3da8f0') }">
<!-- {{ text >= 80 ? '已通过' : (text < 80 ? '未通过' : text) }} --> <!-- {{ text >= 80 ? '已通过' : (text < 80 ? '未通过' : text) }} -->
{{text}} {{text}}
</span> </span>
@@ -1504,6 +1504,10 @@ const vwtext = ref(null)
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .ant-table-thead > tr > th,
.ant-table-tbody > tr > td {
user-select: text !important;
}
::v-deep .ant-col-5{ ::v-deep .ant-col-5{
flex: none; flex: none;
} }
@@ -1573,6 +1577,7 @@ const vwtext = ref(null)
color: #333; color: #333;
font-weight: 400; font-weight: 400;
text-align: center; text-align: center;
user-select: text !important;
} }
@@ -1608,6 +1613,7 @@ const vwtext = ref(null)
:deep(.ant-table-tbody > tr > td) { :deep(.ant-table-tbody > tr > td) {
text-align: center; text-align: center;
user-select: text !important;
} }
.btn1 { .btn1 {
.search { .search {

View File

@@ -147,6 +147,13 @@
<a-radio :style="radioStyle" :value="0"></a-radio> <a-radio :style="radioStyle" :value="0"></a-radio>
</a-radio-group> </a-radio-group>
</div> </div>
<div class="num" style="flex:3" v-if="projectInfo.boeFlag === 1">
<div class="num_text">项目编号</div>
<div class="num_input">
<!-- <a-input style="border-radius: 8px;" show-count allowClear maxlength="30" v-model:value="projectInfo.numValue" placeholder="请输入项目编号" /> -->
<ProjectNumber v-model:value="projectInfo.numValue"></ProjectNumber>
</div>
</div>
</div> </div>
<div class="name name2"> <div class="name name2">
<div class="namebox"> <div class="namebox">
@@ -269,7 +276,7 @@ import * as api2 from "../../api/indexAudit";
import {validateName} from "@/api/index1"; import {validateName} from "@/api/index1";
import dayjs from "dayjs"; import dayjs from "dayjs";
import {scrollLoad} from "@/api/method"; import {scrollLoad} from "@/api/method";
import ProjectNumber from "@/components/project/ProjectNumber";
export default { export default {
name: "projectAdd", name: "projectAdd",
components: { components: {
@@ -279,6 +286,7 @@ export default {
TrainClass, TrainClass,
NameInput, NameInput,
OrgClass, OrgClass,
ProjectNumber
}, },
setup() { setup() {
const store = useStore(); const store = useStore();
@@ -334,6 +342,11 @@ export default {
state.projectInfo.parentName = routers.query.parentName; state.projectInfo.parentName = routers.query.parentName;
state.projectInfo.parentId = routers.query.parentId; state.projectInfo.parentId = routers.query.parentId;
}); });
watch(()=>state.projectInfo.boeFlag,(val)=>{
if(!val){
state.projectInfo.numValue = ''
}
})
function getProjectInfo() { function getProjectInfo() {
state.projectInfo.parentName = routers.query.parentName; state.projectInfo.parentName = routers.query.parentName;
@@ -489,6 +502,7 @@ export default {
id: state.projectInfo.id, id: state.projectInfo.id,
}).then((res) => { }).then((res) => {
return res.data.data == 1; return res.data.data == 1;
}).catch((err) => {
}); });
if (offName) { if (offName) {
message.destroy(); message.destroy();
@@ -506,6 +520,10 @@ export default {
path: "/taskpage", path: "/taskpage",
query: { projectId: res.data.data }, query: { projectId: res.data.data },
}); });
}).catch((err) => {
state.loading = false;
message.destroy();
message.error('创建项目失败,请重新创建');
}); });
}; };
@@ -772,6 +790,21 @@ export default {
} }
} }
.num{
display: flex;
justify-content: left;
align-items: center;
.num_text{
color: #6f6f6f;
font-size: 14px;
min-width: 70px;
// margin-right: 7px;
}
.num_input{
width: 100%;
}
}
.filebox { .filebox {
margin-left: 14px; margin-left: 14px;
flex: 1; flex: 1;

View File

@@ -3,6 +3,37 @@
<div class="curriculum"> <div class="curriculum">
<!-- 以下为顶部搜索框 --> <!-- 以下为顶部搜索框 -->
<div class="filter"> <div class="filter">
<div class="select">
<a-input
style="width: 100%; height: 40px; border-radius: 8px"
placeholder="请输入课程名称"
allowClear
showSearch
v-model:value="name"
@pressEnter="searchData"
>
</a-input>
</div>
<div class="select">
<a-input
style="width: 100%; height: 40px; border-radius: 8px"
placeholder="请输入创建者"
allowClear
showSearch
v-model:value="createName"
@pressEnter="searchData"
>
</a-input>
</div>
<div class="select">
<a-select
v-model:value="searchStatus"
style="width: 100%; height: 40px; border-radius: 8px"
placeholder="请选择类型"
:options="StateList"
allowClear
></a-select>
</div>
<div class="select"> <div class="select">
<a-cascader <a-cascader
change-on-select change-on-select
@@ -19,27 +50,22 @@
> >
</a-cascader> </a-cascader>
</div> </div>
<div class="select"> <div style="display: flex; margin-bottom: 20px">
<a-input <div class="btnzx btnzx1" @click="searchData">
style="width: 100%; height: 40px; border-radius: 8px" <div class="search"></div>
placeholder="请输入课程名称" <div class="btnzText">搜索</div>
allowClear </div>
showSearch <div class="btnz btnzx2" @click="resetClick">
v-model:value="name" <div class="search"></div>
> <div class="btnzText">重置</div>
</a-input> </div>
</div> </div>
<div class="select"> <div @click="()=>{isShowChange = !isShowChange}" class="right_btn">
<a-input <span class="text">{{isShowChange?'展开':'收起'}}</span>
style="width: 100%; height: 40px; border-radius: 8px" <DownOutlined v-if="isShowChange" style="color:#4ea6ff;" />
placeholder="请输入创建者" <UpOutlined v-else style="color:#4ea6ff;" />
allowClear
showSearch
v-model:value="createName"
>
</a-input>
</div> </div>
<div class="select"> <div v-if="!isShowChange" class="select">
<a-cascader <a-cascader
style="width: 100%" style="width: 100%"
placeholder="请选择分类" placeholder="请选择分类"
@@ -55,7 +81,7 @@
}" }"
></a-cascader> ></a-cascader>
</div> </div>
<div class="select"> <div v-if="!isShowChange" class="select" style="min-width: 300px">
<a-range-picker <a-range-picker
v-model:value="publishTime" v-model:value="publishTime"
type="date" type="date"
@@ -64,16 +90,7 @@
style="width: 100%; margin-right: 0px" style="width: 100%; margin-right: 0px"
/> />
</div> </div>
<div style="display: flex; margin-bottom: 20px">
<div class="btnzx btnzx1" @click="searchData">
<div class="search"></div>
<div class="btnzText">搜索</div>
</div>
<div class="btnz btnzx2" @click="resetClick">
<div class="search"></div>
<div class="btnzText">重置</div>
</div>
</div>
</div> </div>
<!-- 以下为导出按钮 --> <!-- 以下为导出按钮 -->
<div class="btnzs"> <div class="btnzs">
@@ -152,8 +169,16 @@ import Cookies from "vue-cookies";
import downLoad from "../../utils/downLoad"; import downLoad from "../../utils/downLoad";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import {useStore} from 'vuex' import {useStore} from 'vuex'
import {
DownOutlined,
UpOutlined,
} from '@ant-design/icons-vue';
export default { export default {
name: "CurriculuM", name: "CurriculuM",
components: {
DownOutlined,
UpOutlined,
},
setup() { setup() {
const store = useStore(); const store = useStore();
const state = reactive({ const state = reactive({
@@ -166,12 +191,19 @@ export default {
name: "", name: "",
type: null, type: null,
createName: "", createName: "",
searchStatus: null,
publishTime: "", // 发布时间 publishTime: "", // 发布时间
allowClear: false, allowClear: false,
option: [], option: [],
selectedRowKeys: [], selectedRowKeys: [],
typeOption:[] typeOption:[],
isShowChange: true,
}); });
const StateList = ref([
{value:'',label:'全部'},
{value:'1',label:'面授'},
{value:'0',label:'在线'},
])
const searchData=async()=>{ const searchData=async()=>{
state.pageNo=1 state.pageNo=1
state.pageSize=10 state.pageSize=10
@@ -235,11 +267,14 @@ export default {
// publishTime: state.publishTime, // publishTime: state.publishTime,
startTime: typeof state.publishTime[0] === 'undefined' ? null : state.publishTime[0]+ " 00:00:00", startTime: typeof state.publishTime[0] === 'undefined' ? null : state.publishTime[0]+ " 00:00:00",
endTime: typeof state.publishTime[0] === 'undefined' ? null : state.publishTime[1]+ " 23:59:59", endTime: typeof state.publishTime[0] === 'undefined' ? null : state.publishTime[1]+ " 23:59:59",
courseType: state.searchStatus,
}; };
const res = await api.boeuCourseListPageV2(params); const res = await api.boeuCourseListPageV2(params);
if (res) { if (res) {
tableData.value = res.data.result.rows; if(res.data.status == 200){
state.tableDataTotal = res.data.result.total; tableData.value = res.data.result.rows;
state.tableDataTotal = res.data.result.total;
}
state.tableLoading = false; state.tableLoading = false;
} }
}; };
@@ -266,6 +301,17 @@ export default {
align: "center", align: "center",
width: 120, width: 120,
}, },
{
title: "内容分类",
dataIndex: "oneType",
ellipsis: true,
key: "oneType",
align: "center",
width: 300,
customRender({record:{oneType,twoType,threeType,type}}){
return type.split('-').join(' / ');
}
},
{ {
title: "课程类型", title: "课程类型",
dataIndex: "courseType", dataIndex: "courseType",
@@ -282,110 +328,102 @@ export default {
align: "center", align: "center",
width: 120, width: 120,
}, },
{ // {
title: "归属项目", // title: "归属项目",
dataIndex: "projectName", // dataIndex: "projectName",
ellipsis: true, // ellipsis: true,
key: "projectName", // key: "projectName",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "归属路径图", // title: "归属路径图",
dataIndex: "routerName", // dataIndex: "routerName",
ellipsis: true, // ellipsis: true,
key: "routerName", // key: "routerName",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "一级分类", // title: "一级分类",
dataIndex: "oneType", // dataIndex: "oneType",
ellipsis: true, // ellipsis: true,
key: "oneType", // key: "oneType",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "二级分类", // title: "二级分类",
dataIndex: "twoType", // dataIndex: "twoType",
ellipsis: true, // ellipsis: true,
key: "twoType", // key: "twoType",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "三级分类", // title: "三级分类",
dataIndex: "threeType", // dataIndex: "threeType",
ellipsis: true, // ellipsis: true,
key: "threeType", // key: "threeType",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "授课教师", // title: "授课教师",
dataIndex: "teacher", // dataIndex: "teacher",
ellipsis: true, // ellipsis: true,
key: "teacher", // key: "teacher",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "开课次数", // title: "开课次数",
dataIndex: "classTotal", // dataIndex: "classTotal",
ellipsis: true, // ellipsis: true,
key: "classTotal", // key: "classTotal",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "学习人数", // title: "学习人数",
dataIndex: "learnerNumber", // dataIndex: "learnerNumber",
ellipsis: true, // ellipsis: true,
key: "learnerNumber", // key: "learnerNumber",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "评论数", // title: "评论数",
dataIndex: "commentTotal", // dataIndex: "commentTotal",
ellipsis: true, // ellipsis: true,
key: "commentTotal", // key: "commentTotal",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "点赞数", // title: "点赞数",
dataIndex: "likesTotal", // dataIndex: "likesTotal",
ellipsis: true, // ellipsis: true,
key: "likesTotal", // key: "likesTotal",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "收藏数", // title: "收藏数",
dataIndex: "collectionsTotal", // dataIndex: "collectionsTotal",
ellipsis: true, // ellipsis: true,
key: "collectionsTotal", // key: "collectionsTotal",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{ // {
title: "平均评分", // title: "平均评分",
dataIndex: "score", // dataIndex: "score",
ellipsis: true, // ellipsis: true,
key: "score", // key: "score",
align: "center", // align: "center",
width: 120, // width: 120,
}, // },
{
title: "发布时间",
dataIndex: "publishTime",
ellipsis: true,
key: "publishTime",
align: "center",
width: 140,
},
{ {
title: "发布状态", title: "发布状态",
dataIndex: "publishStatus", dataIndex: "publishStatus",
@@ -394,14 +432,6 @@ export default {
align: "center", align: "center",
width: 120, width: 120,
}, },
{
title: "启用状态",
dataIndex: "enabled",
ellipsis: true,
key: "enabled",
align: "center",
width: 120,
},
{ {
title: "创建人", title: "创建人",
dataIndex: "createName", dataIndex: "createName",
@@ -410,6 +440,38 @@ export default {
align: "center", align: "center",
width: 120, width: 120,
}, },
{
title: "发布时间",
dataIndex: "publishTime",
ellipsis: true,
key: "publishTime",
align: "center",
width: 140,
},
// {
// title: "发布状态",
// dataIndex: "publishStatus",
// ellipsis: true,
// key: "publishStatus",
// align: "center",
// width: 120,
// },
{
title: "启用状态",
dataIndex: "enabled",
ellipsis: true,
key: "enabled",
align: "center",
width: 120,
},
// {
// title: "创建人",
// dataIndex: "createName",
// ellipsis: true,
// key: "createName",
// align: "center",
// width: 120,
// },
{ {
title: "操作", title: "操作",
dataIndex: "operation", dataIndex: "operation",
@@ -449,6 +511,7 @@ export default {
state.type = null; state.type = null;
state.createName = ""; state.createName = "";
state.publishTime = []; state.publishTime = [];
state.searchStatus = null;
getTableData(); getTableData();
}; };
const exportList = () => { const exportList = () => {
@@ -663,6 +726,7 @@ export default {
exportDetailClick, exportDetailClick,
getOption, getOption,
searchData, searchData,
StateList,
}; };
}, },
}; };
@@ -679,10 +743,22 @@ export default {
margin-top: 30px; margin-top: 30px;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
position: relative;
.select { .select {
margin-right: 20px; margin-right: 20px;
margin-bottom: 20px; margin-bottom: 20px;
width: calc((100% - 76px - 220px) / 3); width: calc((100% - 76px - 220px) / 5);
}
.right_btn{
position: absolute;
right: 20px;
height: 40px;
line-height: 40px;
cursor: pointer;
.text{
margin-right: 14px;
color:#4ea6ff;
}
} }
.btnz { .btnz {

View File

@@ -1635,7 +1635,7 @@ export default {
var day = dayjs(new Date()).date(); var day = dayjs(new Date()).date();
console.log("initTime year:",year,"month:",month,"day:",day); console.log("initTime year:",year,"month:",month,"day:",day);
var year1 = year; var year1 = year;
var month1 = parseInt(month) - 5; var month1 = parseInt(month) - 1;
if(month1<=0){ if(month1<=0){
year1 = parseInt(year1) - 1; year1 = parseInt(year1) - 1;
month1 = 12 - (Math.abs(month1)%12); month1 = 12 - (Math.abs(month1)%12);

View File

@@ -156,6 +156,7 @@ shan<!-- 评估管理页面 -->
:closable="false" :closable="false"
style="margin-top: 250px" style="margin-top: 250px"
:centered="true" :centered="true"
:maskClosable="false"
> >
<div class="out"> <div class="out">
<div class="top"> <div class="top">
@@ -475,10 +476,12 @@ const handleRest = () => {
function handleCancel() { function handleCancel() {
resetFormFields(); resetFormFields();
formData.value.id = null
newNext.value = false; newNext.value = false;
} }
const handleNew = () => { const handleNew = () => {
formData.value.assessmentName = ''
newNext.value = true; newNext.value = true;
}; };
@@ -516,6 +519,7 @@ const handleNext = async () => {
assessmentName: formData.value.assessmentName, assessmentName: formData.value.assessmentName,
}); });
fetch(); fetch();
formData.value.id = null
} }
}; };
</script> </script>

View File

@@ -15,7 +15,7 @@
class="nameimg" class="nameimg"
src="../../../assets/images/basicinfo/asterisk.png" src="../../../assets/images/basicinfo/asterisk.png"
/> />
<div class="inname">标题{{ index }}</div> <div class="inname">标题{{ index+1 }}</div>
</div> </div>
<div class="in"> <div class="in">
<a-input <a-input