Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	src/components/vote/AddVote.vue
#	src/components/vote/CreateVote.vue
This commit is contained in:
yuping
2023-02-23 01:00:55 +08:00
17 changed files with 276 additions and 434 deletions

497
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -16,6 +16,7 @@
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"ant-design-vue": "^3.2.12", "ant-design-vue": "^3.2.12",
"axios": "^1.1.3", "axios": "^1.1.3",
"babel-eslint": "^10.1.0",
"core-js": "^3.8.3", "core-js": "^3.8.3",
"dayjs": "^1.11.6", "dayjs": "^1.11.6",
"element-plus": "^2.2.17", "element-plus": "^2.2.17",

View File

@@ -26,7 +26,7 @@
</div> </div>
<div class="endtime" style="margin-left: 64px">签到时间{{beginTime}}</div> <div class="endtime" style="margin-left: 64px">签到时间{{beginTime}}</div>
<!-- <div class="endtime" style="margin-left: 40px">签退时间{{endTime}}</div> --> <div class="endtime" style="margin-left: 40px">签退时间{{endTime}}</div>
</div> </div>
<div class="search"> <div class="search">

View File

@@ -293,7 +293,7 @@ const disabledDate = (current) => {
}; };
const disabledRangeTime = () => ({ const disabledRangeTime = () => ({
disabledHours: () => range(0, 24).splice(4, 20), // disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(30, 60), disabledMinutes: () => range(30, 60),
disabledSeconds: () => [55, 56], disabledSeconds: () => [55, 56],
}); });

View File

@@ -153,7 +153,7 @@ const disabledDate = (current) => {
}; };
const disabledRangeTime = () => ({ const disabledRangeTime = () => ({
disabledHours: () => range(0, 24).splice(4, 20), // disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(30, 60), disabledMinutes: () => range(30, 60),
disabledSeconds: () => [55, 56], disabledSeconds: () => [55, 56],
}); });

View File

@@ -452,7 +452,7 @@ const disabledDate = (current) => {
}; };
const disabledRangeTime = () => ({ const disabledRangeTime = () => ({
disabledHours: () => range(0, 24).splice(4, 20), // disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(30, 60), disabledMinutes: () => range(30, 60),
disabledSeconds: () => [55, 56], disabledSeconds: () => [55, 56],
}); });

View File

@@ -68,14 +68,14 @@
</div> </div>
<span style="margin-right: 3px">选择试卷</span> <span style="margin-right: 3px">选择试卷</span>
</div> </div>
<s-test v-model:id="formData.examinationTestId" v-model:name="formData.examinationTestName"> <s-test v-model:id="formData.examinationPaperId" v-model:name="formData.examinationTestName">
<div class="btnbox"> <div class="btnbox">
<button class="xkbtn" style="margin:0"> <button class="xkbtn" style="margin:0">
{{ formData.examinationTestId ? "重选" : "选择" }}试卷 {{ formData.examinationPaperId ? "重选" : "选择" }}试卷
</button> </button>
</div> </div>
</s-test> </s-test>
<div v-if="formData.examinationTestId"> <div v-if="formData.examinationPaperId">
<a-tag closable color="processing" @close="delTag" :closeIcon="true"> <a-tag closable color="processing" @close="delTag" :closeIcon="true">
<span style="font-size: 14px; line-height: 33px">{{ formData.examinationTestName }}</span> <span style="font-size: 14px; line-height: 33px">{{ formData.examinationTestName }}</span>
</a-tag> </a-tag>
@@ -328,7 +328,7 @@ const props = defineProps({
const visible = ref(false) const visible = ref(false)
const initValue = { const initValue = {
examinationName: '', examinationName: '',
examinationTestId: '', examinationPaperId: '',
examinationStartTime: '', examinationStartTime: '',
examinationEndTime: '', examinationEndTime: '',
examinationDuration: '', examinationDuration: '',
@@ -349,7 +349,7 @@ const innerRule = {
message: '请输入考试名称', message: '请输入考试名称',
}, },
], ],
examinationTestId: [ examinationPaperId: [
{ {
required: true, required: true,
message: '请输入选择试卷', message: '请输入选择试卷',
@@ -451,7 +451,7 @@ function openDrawer(i, row) {
} }
const delTag = () => { const delTag = () => {
formData.value.examinationTestId = ''; formData.value.examinationPaperId = '';
formData.value.examinationTestName = ''; formData.value.examinationTestName = '';
} }

View File

@@ -22,8 +22,8 @@
<img src="../../assets/images/studentimg/character.png" /> <img src="../../assets/images/studentimg/character.png" />
</div> </div>
<div class="stumation"> <div class="stumation">
<div class="stuname">{{pro.routerInfo.name}}</div> <div class="stuname">{{pro==null?"":pro.routerInfo.name}}</div>
<div class="stugangw">{{pro.routerInfo.organizationName?pro.routerInfo.organizationName:"" + '-' + pro.routerInfo.jobName?pro.routerInfo.jobName:""}}</div> <div class="stugangw">{{pro==null?"":pro.routerInfo.organizationName?pro.routerInfo.organizationName:"" + '-' + pro==null?"":pro.routerInfo.jobName?pro.routerInfo.jobName:""}}</div>
</div> </div>
<div class="sortbox"> <div class="sortbox">
<div class="sortname">进度排名</div> <div class="sortname">进度排名</div>
@@ -43,8 +43,8 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">完成必修</div> <div class="sortname">完成必修</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{pro.currentReqCnt}}</span> <span class="nub1">{{pro==null?"":pro.currentReqCnt}}</span>
<span class="total">/{{pro.totalReqCnt}}</span> <span class="total">/{{pro==null?"":pro.totalReqCnt}}</span>
</div> </div>
</div> </div>
<a-divider <a-divider
@@ -57,18 +57,18 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div> <div class="sortname">已修证书</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">{{pro.routerInfo.certCnt?pro.routerInfo.certCnt:0}}</span> <span class="nub1">{{pro==null?"":pro.routerInfo.certCnt?pro.routerInfo.certCnt:0}}</span>
</div> </div>
</div> </div>
</div> </div>
<div class="secondrow"> <!-- <div class="secondrow">
<div class="rowleft">{{ pro.name }}</div> <div class="rowleft">{{ pro.name }}</div> -->
<!-- <div class="rowbox" @click="showProMess"> <!-- <div class="rowbox" @click="showProMess">
<div class="shuom">说明</div> <div class="shuom">说明</div>
<div><img src="../../assets/images/studentimg/chak.png" /></div> <div><img src="../../assets/images/studentimg/chak.png" /></div>
</div> --> </div> -->
</div> <!-- </div> -->
<div v-for="(item) in pro.chapterList" class="mainbox" <!-- <div v-for="(item) in pro.chapterList" class="mainbox"
style="margin-top: 15px; height: 56px" style="margin-top: 15px; height: 56px"
:key="item.chapterId"> :key="item.chapterId">
<div class="rowtitle" @click="changeDown"> <div class="rowtitle" @click="changeDown">
@@ -99,7 +99,7 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div> -->
<div class="mainbox"> <div class="mainbox">
<a-collapse v-model:activeKey="stageListActive"> <a-collapse v-model:activeKey="stageListActive">
@@ -115,7 +115,7 @@
<div></div> <div></div>
</template> </template>
<a-collapse-panel <a-collapse-panel
v-for="value in pro.chapterList" v-for="value in pro==null?[]:pro.chapterList"
:key="value.chapterId" :key="value.chapterId"
:header="value.chapterName" :header="value.chapterName"
@@ -169,7 +169,7 @@
: item.type === 12 : item.type === 12
? require('../../assets/images/leveladd/tou.png') ? require('../../assets/images/leveladd/tou.png')
: item.type === 13 : item.type === 13
? require('../../assets/images/leveladd/diao.png') ? require('../../assets/images/leveladd/xiangmu.png')
: null : null
" "
/> />
@@ -266,8 +266,8 @@ export default {
const getStuProgress = () => { const getStuProgress = () => {
state.loading = true state.loading = true
let obj = { let obj = {
routerId:props.routerId, routerId:props.routerId==null?props.studentId:props.routerId
studentId:props.studentId // routerId:props.studentId
} }
stuProgress(obj).then(res => { stuProgress(obj).then(res => {
console.log("查询当前学员进度信息success",res) console.log("查询当前学员进度信息success",res)
@@ -296,6 +296,7 @@ export default {
"测评", "测评",
"评估", "评估",
"投票", "投票",
"项目",
]; ];
return typeRules[type]; return typeRules[type];
} }

View File

@@ -8,7 +8,7 @@
> >
<div class="drawerMain"> <div class="drawerMain">
<div class="header"> <div class="header">
<div class="headerTitle">组员名单1</div> <div class="headerTitle">组员名单</div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png" src="../../assets/images/basicinfo/close.png"
@@ -498,7 +498,7 @@ export default {
let obj = { let obj = {
projectGroupId: props.chooseGroupId, projectGroupId: props.chooseGroupId,
projectId: props.projectId, projectId: props.projectId,
studentIds: state.selectedRows, ids: state.selectedRows,
}; };
console.log("删除小组学员obj", obj); console.log("删除小组学员obj", obj);
delGroupStudent(obj) delGroupStudent(obj)

View File

@@ -110,6 +110,8 @@
? require('../../assets/images/leveladd/tou.png') ? require('../../assets/images/leveladd/tou.png')
: item.course === '评估' : item.course === '评估'
? require('../../assets/images/leveladd/diao.png') ? require('../../assets/images/leveladd/diao.png')
: item.course === '项目'
? require('../../assets/images/leveladd/xiangmu.png')
: null : null
" /> " />
</div> </div>

View File

@@ -348,7 +348,7 @@ export default {
currentStageId: props.datasource.stageId, currentStageId: props.datasource.stageId,
type: 1, type: 1,
pid: props.datasource.projectId, pid: props.datasource.projectId,
taskId: props.datasource.projectTaskId, taskId: props.datasource.id,
taskType: props.datasource.type, taskType: props.datasource.type,
status: state.projectName, status: state.projectName,
studentName: state.name, studentName: state.name,
@@ -360,7 +360,7 @@ export default {
currentStageId: props.datasource.stageId, currentStageId: props.datasource.stageId,
type: 1, type: 1,
pid: props.datasource.projectId, pid: props.datasource.projectId,
taskId: props.datasource.projectTaskId, taskId: props.datasource.id,
taskType: props.datasource.type, taskType: props.datasource.type,
status: state.projectName, status: state.projectName,
studentName: state.name, studentName: state.name,

View File

@@ -333,18 +333,39 @@ export default {
ellipsis: true, ellipsis: true,
className: "h", className: "h",
customRender: (text) => { customRender: (text) => {
debugger
console.log("text"+text.record)
if (text.record.finishStatus===1 || text.record.finishStatus===2) {
return ( return (
<div class="racona"> <div class="racona">
<a <a-button
type="link"
onClick={()=>{ onClick={()=>{
state.studentKid = text.record.studentKid; state.studentKid = text.record.studentKid;
state.datasource = text.record; state.datasource = text.record;
state.CAvisible = true; state.CAvisible = true;
}}> }}>
查看答卷 查看答卷
</a> </a-button>
</div> </div>
); );
}else {
return (
<div class="racona">
<a-button
type="link"
disabled
onClick={()=>{
state.studentKid = text.record.studentKid;
state.datasource = text.record;
state.CAvisible = true;
}}>
查看答卷
</a-button>
</div>
);
}
}, },
}, },
], ],

View File

@@ -897,8 +897,8 @@ const submitAuth = () => {
}; };
function handleStageOk() { function handleStageOk() {
// 判断添加人数是否已超过限制人数 // 判断添加人数是否已超过限制人数 限制 = 本次添加的人 + 原有的人
if (props.groupMemberCount < selectsData.value.projectMemberList.length + props.groupMemberNumber) { if (props.groupMemberCount < selectsData.value.studentList.length + props.groupMemberNumber) {
return message.warning("添加小组学员超过最大值"); return message.warning("添加小组学员超过最大值");
} }
// 对选中的人员进行判断是否已经分组了 // 对选中的人员进行判断是否已经分组了

View File

@@ -231,7 +231,14 @@
type="link" type="link"
>拒绝</a-button >拒绝</a-button
> >
<a-button v-if="checkPer(permissions)" @click="del(record.id)" type="link" danger>删除</a-button> <a-button
v-if="checkPer(permissions)"
:disabled="record.isLeader === '1' "
@click="del(record.id,record)"
type="link"
danger
>删除</a-button
>
</a-space> </a-space>
</template> </template>
</a-table> </a-table>
@@ -368,7 +375,7 @@ const props = defineProps({
type: Number, type: Number,
permissions: { permissions: {
type: String, type: String,
default: '' default: "",
}, },
id: String, id: String,
columns: { columns: {
@@ -533,8 +540,6 @@ const stuRowSelection = computed(() => ({
preserveSelectedRowKeys: true, preserveSelectedRowKeys: true,
})); }));
//显示学员换组弹窗 //显示学员换组弹窗
function showChangeGroupModal() { function showChangeGroupModal() {
// debugger // debugger
@@ -547,12 +552,12 @@ 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.targetId}` }/admin/student/exportTaskStudent?type=${1}&pid=${props.id}`
); );
} }
function exportTaskStuRouter() { function exportTaskStuRouter() {
console.log("props.datasource", props); console.log("props.datasource", props, props.id);
window.open( window.open(
`${ `${
process.env.VUE_APP_BASE_API process.env.VUE_APP_BASE_API
@@ -614,15 +619,25 @@ function reset() {
} }
function bathDel() { function bathDel() {
debugger
if (stuSelectKeys.value && stuSelectKeys.value.length === 0) { if (stuSelectKeys.value && stuSelectKeys.value.length === 0) {
message.destroy(); message.destroy();
return message.warning("请先选中学员"); return message.warning("请先选中学员");
} }
// 判断选择的人员中是否有小组长
let arr = [...tableData.value.list].filter(x => [...stuSelectKeys.value].some(id => id === x.id)).filter(item => item.isLeader === '1');
if (arr.length > 0) {
return message.warning("选择人员中:"+arr[0].studentName + "是小组长,请勿删除!");
}
tableData.value.loading = true; tableData.value.loading = true;
delStudentList({ids: stuSelectKeys.value,}).then(() => getStuList()); delStudentList({ ids: stuSelectKeys.value }).then(() => getStuList());
}
function del(id,row) {
if (row.isLeader === '1') {
return message.warning(""+row.name + "是小组长,请勿删除!");
} }
function del(id) {
Modal.confirm({ Modal.confirm({
title: () => "确定删除?", title: () => "确定删除?",
icon: () => createVNode(ExclamationCircleOutlined), icon: () => createVNode(ExclamationCircleOutlined),
@@ -761,7 +776,6 @@ const exportStu = () => {
}/admin/student/exportTaskStudent?type=${3}&pid=${props.id}&thirdType=2` }/admin/student/exportTaskStudent?type=${3}&pid=${props.id}&thirdType=2`
); );
} }
}; };
//批量操作 结业、通过、拒绝等 //批量操作 结业、通过、拒绝等
@@ -803,11 +817,11 @@ const AddImpStuvisibleClose = (isget) => {
if (isget) { if (isget) {
getStuList(); getStuList();
} }
} };
function startLoading() { function startLoading() {
tableData.value.loading = true; tableData.value.loading = true;
} }
defineExpose({getStuList,startLoading}) defineExpose({ getStuList, startLoading });
</script> </script>
<style lang="scss"> <style lang="scss">
.TableStudent { .TableStudent {

View File

@@ -59,7 +59,7 @@
class="nameimg" class="nameimg"
src="../../assets/images/basicinfo/asterisk.png" src="../../assets/images/basicinfo/asterisk.png"
/> />
<div class="inname">封面图</div> <div class="inname">封面图2</div>
</div> </div>
<div class="in select" style="flex: 1; display: flex"> <div class="in select" style="flex: 1; display: flex">
<div <div
@@ -324,11 +324,24 @@
<div class="topc">封面图</div> <div class="topc">封面图</div>
</div> </div>
<div class="imagesBox"> <div class="imagesBox">
<div <!-- <div
@click="() => (projectInfo.picUrl = src.value)" @click="() => (projectInfo.picUrl = src.value)"
v-for="item in projectPic" v-for="item in projectPic"
:key="item.code" :key="item.code"
class="learnBgItem" class="learnBgItem"
> -->
<div
@click="chooseImg2(item)"
v-for="item in projectPic"
:key="item.code"
class="learnBgItem"
:style="{
border:
pathBgId === item.code
? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc',
'background-image': 'url(' + item.value.split(',')[0] + ')',
}"
> >
<!-- <img class="im" :src="item.source" /> --> <!-- <img class="im" :src="item.source" /> -->
</div> </div>

View File

@@ -3468,7 +3468,7 @@ export default {
<a-select-option value="删除" label="删除"> <a-select-option value="删除" label="删除">
<div <div
onClick={() => { onClick={() => {
// console.log("点击了111", text); {/* console.log("点击了111", text); */}
showDeleteOne(text.record.studentId); showDeleteOne(text.record.studentId);
}} }}
> >

View File

@@ -15,7 +15,8 @@ module.exports = defineConfig({
port: 8070, port: 8070,
proxy: { proxy: {
"/manageApi": { "/manageApi": {
target: 'http:' + process.env.VUE_APP_PROXY_URL, // target: 'http:' + process.env.VUE_APP_PROXY_URL,
target: 'http://localhost:30001',
changeOrigin: true, //表示是否改变原域名 changeOrigin: true, //表示是否改变原域名
pathRewrite: { pathRewrite: {
"^/manageApi": "", "^/manageApi": "",