This commit is contained in:
dongruihua
2023-02-22 09:33:35 +08:00
26 changed files with 1947 additions and 909 deletions

View File

@@ -445,6 +445,7 @@ export default {
const getTableData = () => {
// debugger
console.log('当前是项目还是路径图 1 路径图 2 项目', props)
console.log('当前是项目还是路径图 1 路径图 2 项目', props.types)
if ( props.datasource.type == 6 && props.types==1 || props.datasource.type == 9 && props.types==1) {
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
@@ -458,7 +459,7 @@ export default {
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
signStatus: state.projectName2
signStatus: state.projectName2,
});
api
.AssessmentManagementMessage({
@@ -471,7 +472,7 @@ export default {
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
signStatus: state.projectName2
signStatus: state.projectName2,
})
.then((res) => {
console.log(res);
@@ -499,7 +500,7 @@ export default {
currentStageId: props.datasource.stageId,
type: 1,
pid: props.datasource.projectId,
taskId: props.datasource.projectTaskId,
taskId: props.datasource.id,
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
@@ -512,7 +513,7 @@ export default {
currentStageId: props.datasource.stageId,
type: 1, // 1项目 2 路径
pid: props.datasource.projectId,
taskId: props.datasource.projectTaskId,
taskId: props.datasource.id,
taskType: props.datasource.type,
status: state.projectName,
studentName: state.name,
@@ -758,7 +759,7 @@ export default {
courseId: Number(props.datasource.courseId),
routerId: Number(props.datasource.projectId),
ids: [value.record.studentId],
taskId: Number(props.datasource.projectTaskId),
taskId: Number(props.datasource.id),
taskType: Number(props.datasource.type),
type: 2,
};

View File

@@ -27,10 +27,15 @@
<div class="fi_input">
<a-input
v-model:value="params.keyWord"
style="width: 424px; height: 40px; border-radius: 8px"
style="width: 200px; height: 40px; border-radius: 8px;margin-right:24px;"
placeholder="请输入案例标题"
show-count
:maxlength="20"
/>
</div>
<div class="fi_input">
<a-input
v-model:value="params.authorName"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入作者名字"
/>
</div>
</div>
@@ -99,6 +104,7 @@ const columns = ref([
])
const initParams = {
keyWord: '',
authorName: '',
pageIndex: 1,
pageSize: 10,
orderAsc: true
@@ -148,8 +154,12 @@ const rowSelection = computed(() => ({
selectedRowKeys: rowSelectKeys.value,
onChange: onSelectChange,
preserveSelectedRowKeys: true,
getCheckboxProps: getCheckboxProps
}));
const getCheckboxProps = () => ({
// 某几项默认禁止选中(R: 当state等于1时)
disabled: false
})
function onSelectChange(e, l) {
rowSelectKeys.value = e;
selectsData.value = l;

View File

@@ -18,43 +18,25 @@
/>
</div>
<div style="display: flex; flex-direction: row; padding-top: 0px; margin-top: 20px; margin-left: 32px;">
<div v-if="taskIndex >= 0">
<button
v-if="isOuter==1"
style="width: 100px; cursor: pointer;"
@click="changeOuter(1)"
:class="isOuter == 1 ? 'outer' : 'notOuter'"
>
系统考试
</button>
<button
v-else
style="width: 100px; cursor: pointer;"
@click="changeOuter(2)"
:class="isOuter == 2 ? 'outer' : 'notOuter'"
>
外部考试
</button>
</div>
<div v-else>
<div>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(1)"
:class="isOuter == 1 ? 'outer' : 'notOuter'"
:class="formData.examType === 1 ? 'outer' : 'notOuter'"
>
系统考试
</button>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(2)"
:class="isOuter == 2 ? 'outer' : 'notOuter'"
:class="formData.examType === 2 ? 'outer' : 'notOuter'"
>
外部考试
</button>
</div>
</div>
<div v-if="isOuter===1" class="contentMain">
<div v-if="formData.examType===1" class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
@@ -68,7 +50,6 @@
</div>
<div class="btnbox">
<a-input
:disabled="taskIndex >= 0"
v-model:value="formData.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
@@ -89,13 +70,13 @@
</div>
<s-test v-model:id="formData.examinationTestId" v-model:name="formData.examinationTestName">
<div class="btnbox">
<button class="xkbtn" @click="selectTest" :disabled="taskIndex >= 0">
<button class="xkbtn" style="margin:0">
{{ formData.examinationTestId ? "重选" : "选择" }}试卷
</button>
</div>
</s-test>
<div v-if="formData.examinationTestId">
<a-tag closable color="processing" @close="delTag" :closeIcon="taskIndex >= 0">
<a-tag closable color="processing" @close="delTag" :closeIcon="true">
<span style="font-size: 14px; line-height: 33px">{{ formData.examinationTestName }}</span>
</a-tag>
</div>
@@ -116,8 +97,8 @@
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{format:'hh:mm'}"
:disabled-date="disabledDate"
:disabled-time="disabledRangeTime"
format="YYYY/MM/DD HH:mm"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
@@ -136,7 +117,6 @@
</div>
<div class="select">
<a-input-number
:disabled="taskIndex >= 0"
:min="0"
:max="300"
:precision="0"
@@ -158,7 +138,6 @@
</div>
<div class="btnbox">
<a-input
:disabled="taskIndex >= 0"
v-model:value="formData.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
@@ -173,7 +152,6 @@
</div>
<div class="textarea">
<a-textarea
:disabled="taskIndex >= 0"
v-model:value="formData.examinationExplain"
placeholder="请输入考试说明"
allow-clear
@@ -192,7 +170,6 @@
<div class="timerbox">
<span>允许重复考试</span>
<a-input-number
:disabled="taskIndex >= 0"
:min="-1"
:max="300"
:precision="0"
@@ -217,7 +194,6 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.showAnswers"
>
@@ -232,7 +208,6 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.showAnalysis"
>
@@ -247,7 +222,6 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.scoringModel"
>
@@ -264,7 +238,6 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="taskIndex >= 0"
style="margin-right: 12px"
v-model:value="formData.questionArrangement"
>
@@ -292,7 +265,7 @@
</div>
<div class="btnbox">
<a-input
v-model:value="formDataOuter.examinationName"
v-model:value="formData.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
@@ -311,7 +284,7 @@
</div>
<div class="btnbox">
<a-input
v-model:value="formDataOuter.source"
v-model:value="formData.source"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入数据来源"
:maxlength="20"
@@ -324,7 +297,7 @@
</div>
<div class="textarea">
<a-textarea
v-model:value="formDataOuter.externalExplain"
v-model:value="formData.externalExplain"
placeholder="请输入考试说明"
allow-clear
show-count
@@ -337,75 +310,109 @@
</div>
<div class="main_btns">
<a-button class="btn1" @click="closeDrawer">取消</a-button>
<a-button v-if="isOuter==1" class="btn2" @click="confirm">确定</a-button>
<a-button v-else class="btn2" @click="confirmouter">确定</a-button>
<a-button class="btn2" @click="confirm">确定</a-button>
</div>
<!-- 加载动画 -->
<div class="aeLoading" :style="{ display: addLoading ? 'flex' : 'none' }">
<a-spin :spinning="addLoading" tip=""/>
</div>
<!-- 选择考试抽屉 -->
<s-test v-model:STvisible="STvisible" @getSTData="getData"/>
</div>
</a-drawer>
</template>
<script setup>
import {defineEmits, defineProps, ref} from "vue";
import {defineEmits, defineProps, ref, watch} from "vue";
import STest from "./SelectTest.vue";
import dayjs from "dayjs";
import {message} from "ant-design-vue";
import {Form, message} from "ant-design-vue";
const props = defineProps({
type: Number,
taskList: []
})
const visible = ref(false)
const formData = ref({
const initValue = {
examinationName: '',
examinationTestId: '',
examinationStartTime: '',
examinationEndTime: '',
examinationDuration: '',
passLine: '',
examType: 1,
source: "",
showAnswers: 2,
showAnalysis: 2,
scoringModel: 2,
questionArrangement: 4
})
const formDataOuter = ref({
examType: 2,
examinationName:"",
source:"",
externalExplain:""
})
questionArrangement: 4,
externalExplain: ""
}
const formData = ref(initValue)
const innerRule = {
examinationName: [
{
required: true,
message: '请输入考试名称',
},
],
examinationTestId: [
{
required: true,
message: '请输入选择试卷',
},
],
examinationStartTime: [
{
required: true,
message: '请输入开始开始时间',
},
],
examinationEndTime: [
{
required: true,
message: '请输入开始结束时间',
},
],
examinationDuration: [
{
required: true,
message: '请输入考试时长',
},
],
passLine: [
{
required: true,
message: '请输入及格线',
},
],
}
const outerRule = {
examinationName: [
{
required: true,
message: '请输入考试名称',
},
],
source: [
{
required: true,
message: '请输入数据来源',
},
],
}
const rulesRef = ref(innerRule);
const emit = defineEmits({})
const taskIndex = ref(-1);
const dateTime = ref([]);
const isOuter = ref(1);
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch(() => formData.value.examType, () => {
formData.value.examType === 1 ? rulesRef.value = innerRule : rulesRef.value = outerRule
})
const closeDrawer = () => {
visible.value = false
taskIndex.value = -1
formData.value = {
examType: 1,
showAnswers: 2,
showAnalysis: 2,
scoringModel: 2,
questionArrangement: 4
}
formDataOuter.value = ref({
examType: 2,
examinationName:"",
source:"",
externalExplain:""
})
resetFields()
dateTime.value = []
};
// const range = (start, end) => {
// const result = [];
// for (let i = start; i < end; i++) {
// result.push(i);
// }
// return result;
// };
function timeChange(time, timeStr) {
formData.value.examinationStartTime = timeStr[0]
@@ -416,39 +423,13 @@ const disabledDate = (current) => {
return current && current < dayjs().startOf('day');
};
const disabledRangeTime = () => ({
// disabledHours: () => range(0, 24).splice(4, 20),
// disabledMinutes: () => range(30, 60),
// disabledSeconds: () => [55, 56],
});
// 系统考试
function confirm() {
if (!formData.value.examinationName) {
message.warning("请输入考试名称");
return
}
if (!formData.value.examinationTestId) {
message.warning("请输入选择试卷");
return
}
if (!formData.value.examinationStartTime) {
message.warning("请输入开始结束时间");
return
}
if (!formData.value.examinationEndTime) {
message.warning("请输入开始结束时间");
return
}
if (!formData.value.examinationDuration) {
message.warning("请输入考试时长");
return
}
if (!formData.value.passLine) {
message.warning("请输入及格线");
return
}
// debugger
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
if (taskIndex.value === -1) {
const list = props.taskList
list.push({name: formData.value.examinationName, type: props.type, info: {...formData.value}})
@@ -456,44 +437,17 @@ function confirm() {
const data = props.taskList[taskIndex.value]
data.name = formData.value.examinationName
data.info = formData.value
data.examType = formData.value == 1 ? 1 : 2
}
emit('update:taskList', [...props.taskList])
closeDrawer()
}
// 外部考试
function confirmouter() {
if (!formDataOuter.value.examinationName) {
message.warning("请输入考试名称");
return
}
if (!formDataOuter.value.source) {
message.warning("请输入数据来源");
return
}
if (taskIndex.value === -1) {
const list = props.taskList
list.push({name: formDataOuter.value.examinationName,duration:dayjs(formData.value.examinationEndTime).diff(formData.value.examinationStartTime,'minutes'), type: props.type, info: {...formDataOuter.value}})
} else {
const data = props.taskList[taskIndex.value]
data.name = formDataOuter.value.examinationName
data.info = formDataOuter.value
data.examType = 2
data.duration = dayjs(formData.value.examinationEndTime).diff(formData.value.examinationStartTime,'minutes')
}
emit('update:taskList', [...props.taskList])
closeDrawer()
}
function openDrawer(i, row) {
row && row.info.examType == 1 ? row && (formData.value = row.info) : row && (formDataOuter.value = row.info);
row ? isOuter.value = row.info.examType : isOuter.value = 1;
row && row.info.examType == 1 && (dateTime.value = [dayjs(row.info.examinationStartTime, "YYYY-MM-DD HH:mm"), dayjs(row.info.examinationEndTime, "YYYY-MM-DD HH:mm")]);
row && resetFields(row.info);
row && (dateTime.value = [row.info.examinationStartTime, row.info.examinationEndTime]);
(i >= 0) && (taskIndex.value = i);
visible.value = true
}
const delTag = () => {
@@ -502,7 +456,7 @@ const delTag = () => {
}
function changeOuter(v) {
isOuter.value = v;
formData.value.examType = v;
}
defineExpose({openDrawer})

View File

@@ -20,7 +20,7 @@
</div>
<div class="main_item">
<button class="xkbtn" @click="goResearchmanage">新建评估</button>
<button class="xkbtn" style="margin:0" @click="goResearchmanage">新建评估</button>
</div>
<div class="main_notice" style="display: none">
@@ -156,7 +156,12 @@ const rowSelection = computed(() => ({
selectedRowKeys: rowSelectKeys.value,
onChange: onSelectChange,
preserveSelectedRowKeys: true,
getCheckboxProps: getCheckboxProps
}));
const getCheckboxProps = () => ({
// 某几项默认禁止选中(R: 当state等于1时)
disabled: false
})
function onSelectChange(e, l) {
rowSelectKeys.value = e;

View File

@@ -1,261 +1,89 @@
<!-- 评估列表 -->
<template>
<a-drawer
:visible="assessmentVisible"
class="drawerStyle addinvistDrawer"
width="70%"
title="添加评估"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div @click="openDrawer">
<slot></slot>
</div>
<a-drawer :visible="visible" class="drawerStyle addinvistDrawer" width="900px" title="添加评估" placement="right">
<div class="drawerMain">
<div class="header">
<div v-if="edit" class="headerTitle">编辑评估</div>
<div v-else class="headerTitle">添加评估</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
<div class="headerTitle">{{assessmentId?'编辑评估':'添加评估'}}</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"/>
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="fi_input">
<a-input
v-model:value="inputV1"
style="width: 424px; height: 40px; border-radius: 8px;"
placeholder="请输入评估名称"
maxlength="20"
/>
</div>
<div class="btns" @click="getAllInvistText">
<div class="search"></div>
<div class="btnText">搜索</div>
</div>
<div class="btnsn" @click="resetInvist">
<div class="search"></div>
<div class="btnText">重置</div>
</div>
</div>
<div class="main_table">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()"
:data-source="tableData"
:loading="tableDataTotal === -1 ? true : false"
expandRowByClick="true"
@expand="expandTable"
:pagination="false"
:row-selection="rowSelection"
filterMultiple:false
/>
<div class="tableBox" style="margin-top:85px;">
<div class="pa">
<a-pagination
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="pageSize"
:current="currentPage"
:total="tableDataTotal"
class="pagination"
@change="handelChangePage"
/>
</div></div>
<div class="main">
<div class="main_left">
<AssessmentAll v-model:id="formData.assessmentId" v-model:name="formData.assessmentName"/>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="submitCheck">确定</button>
</div>
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
import * as api from "../../api/indexInvist.js";
import dayjs from "dayjs";
export default {
name: "AssessmentList",
// components: {
// },
props: {
assessmentVisible: {
type: Boolean,
default: false,
},
assessmentId: {
type: Number,
default: null,
},
assessmentName: {
type: String,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
assessmentVisible: false,
assessment: null,
inputV1: "",
currentPage: 1,
pageSize: 10,
tableDataTotal: 0,
tableData: [],
selectedRowKeys: [],
assessmentName:null,
assessmentId:null,
});
const closeDrawer = () => {
ctx.emit("update:assessmentVisible", false);
};
const afterVisibleChange = (bool) => {
console.log("state getAllInvistText", bool);
if (props.assessmentVisible) {
getAllInvistText();
}
};
const tableDataFunc = () => {
const columns = [
{
title: "名称",
dataIndex: "name",
// width: "30%",
key: "name",
width: "40%",
className: "classify",
ellipsis: true,
},
{
title: "题数",
dataIndex: "num",
key: "num",
width: "20%",
align: "center",
ellipsis: true,
},
{
title: "创建人",
dataIndex: "creator",
key: "creator",
width: "20%",
align: "center",
ellipsis: true,
},
{
title: "创建时间",
dataIndex: "time",
key: "time",
width: "20%",
align: "center",
ellipsis: true,
},
];
return columns;
};
const rowSelection = {
type: "radio",
onSelect: (selectedRows) => {
state.assessment = selectedRows;
console.log("selectedRows=======", state.assessment);
ctx.emit("checkedAss", state.assessment);
state.selectedRowKeys = [];
},
};
const submitCheck=()=>{
ctx.emit("update:assessmentId", state.assessment.assessmentId);
ctx.emit("update:assessmentName", state.assessment.name);
closeDrawer();
}
const handelChangePage = (page, pageSize) => {
state.currentPage = page;
state.pageSize = pageSize;
getAllInvistText();
};
const getTableDate = (tableData) => {
let data = tableData;
let array = [];
data.map((value, index) => {
let n1 = value.essayQuestionVoList
? Number(value.essayQuestionVoList.length)
: 0 ;
let n2 = value.multipleStemVoList
? Number(value.multipleStemVoList.length)
: 0;
let n3 = value.scoringQuestionVoList
? Number(value.scoringQuestionVoList.length)
: 0;
let n4 = value.singleStemVoList
? Number(value.singleStemVoList.length)
: 0;
<script setup>
import {defineEmits, defineProps, ref, watch} from "vue";
import {Form, message} from "ant-design-vue";
import AssessmentAll from "@/components/drawers/AssessmentAll.vue";
let num = n1 + n2 + n3 +n4;
let obj = {
key: index,
assessmentId: value.assessmentId,
num: num,
name: value.assessmentName ? value.assessmentName : "-",
creator: value.createUserName ? value.createUserName : "-",
time: dayjs(value.createTime).format("YYYY-MM-DD HH:mm"),
};
array.push(obj);
});
(state.selectedRowKeys = []), (state.tableData = array);
};
//获取全部评估信息接口
const getAllInvistText = () => {
api
.queryAssessmentDetailList({
assessmentName: state.inputV1,
pageNo: state.currentPage,
pageSize: state.pageSize,
releaseStatus: 2 ,
searchEndTime:"",
})
.then((res) => {
let arr = res.data.data.rows;
if (res.status === 200) {
// console.log("获取全部评估信息", res.data.data);
getTableDate(arr);
state.tableDataTotal = Number(res.data.data.total);
}
})
.catch((err) => {
console.log("获取全部评估信息接口失败", err);
// state.createLoading = false;
});
};
const props = defineProps({
assessmentId: String,
assessmentName: String,
})
const visible = ref(false)
const formData = ref({
assessmentId: '',
assessmentName: '',
})
const emit = defineEmits({})
const rulesRef = ref({
assessmentId: [
{
required: true,
message: '请选择评估',
},
],
assessmentName: [
{
required: true,
message: '请选择评估',
},
],
});
//重置评估信息
const resetInvist = () => {
state.inputV1 = "";
getAllInvistText();
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
tableDataFunc,
rowSelection,
getAllInvistText,
resetInvist,
handelChangePage,
submitCheck,
};
},
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch(props,()=>{
formData.value.assessmentId = props.assessmentId
formData.value.assessmentName = props.assessmentName
})
const closeDrawer = () => {
visible.value = false
resetFields()
};
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
emit('update:assessmentId', formData.value.assessmentId)
emit('update:assessmentName', formData.value.assessmentName)
closeDrawer()
}
function openDrawer() {
visible.value = true
}
defineExpose({openDrawer})
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addinvistDrawer {
.drawerMain {
.header {
@@ -264,6 +92,7 @@ export default {
display: flex;
justify-content: space-between;
align-items: center;
.headerTitle {
font-size: 18px;
font-weight: 600;
@@ -272,122 +101,133 @@ export default {
margin-left: 24px;
}
}
.contentMain {
.main_left {
padding-right: 30px;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
margin-bottom: 32px;
.fi_input {
margin-right: 20px;
}
.btns {
margin-right: 20px;
padding: 0px 26px 0px 26px;
height: 38px;
background: #4ea6ff;
border-radius: 8px;
//border: 1px solid rgba(64, 158, 255, 1);
.main {
width: 100%;
.main_left {
padding-right: 30px;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 15px;
height: 17px;
background-image: url("../../assets/images/courseManage/search0.png");
background-size: 100% 100%;
.fi_input {
margin-right: 20px;
}
.btnText {
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 36px;
margin-left: 5px;
.btns {
margin-right: 20px;
padding: 0px 26px 0px 26px;
height: 38px;
background: #4ea6ff;
border-radius: 8px;
//border: 1px solid rgba(64, 158, 255, 1);
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 15px;
height: 17px;
background-image: url("../../assets/images/courseManage/search0.png");
background-size: 100% 100%;
}
.btnText {
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 36px;
margin-left: 5px;
}
}
.btnsn {
padding: 0px 26px 0px 26px;
height: 38px;
background: #ffffff;
border-radius: 8px;
border: 1px solid rgba(64, 158, 255, 1);
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 16px;
height: 18px;
background-image: url("../../assets/images/courseManage/reset1.png");
background-size: 100% 100%;
}
.btnText {
font-size: 14px;
font-weight: 400;
color: #4ea6ff;
line-height: 36px;
margin-left: 5px;
}
}
}
.btnsn {
padding: 0px 26px 0px 26px;
height: 38px;
background: #ffffff;
border-radius: 8px;
border: 1px solid rgba(64, 158, 255, 1);
.main_notice {
display: flex;
justify-content: space-between;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 16px;
height: 18px;
background-image: url("../../assets/images/courseManage/reset1.png");
background-size: 100% 100%;
margin-bottom: 3px;
height: 40px;
background-color: #e9f6fe;
.mntc_left {
display: flex;
align-items: center;
.title {
color: rgba(0, 0, 0, 0.65);
margin-right: 17px;
}
.data {
color: #4ea6ff;
}
.notice_icon {
width: 14px;
height: 14px;
margin-right: 9px;
margin-left: 9px;
background-image: url(@/assets/images/coursewareManage/gan.png);
background-size: 100% 100%;
}
}
.btnText {
font-size: 14px;
font-weight: 400;
color: #4ea6ff;
line-height: 36px;
margin-left: 5px;
.mntc_right {
cursor: pointer;
}
}
}
.main_item2 {
.pa {
width: 100%;
margin: 15px auto;
display: flex;
justify-content: center;
}
}
}
}
.main_table {
position: relative;
padding-bottom: 80px;
.ant-checkbox-wrapper {
align-items: center;
margin-top: -2px;
}
.ant-table-selection-column {
padding: 0px !important;
padding-left: 5px !important;
}
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1);
}
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.pa {
left: 0;
width: 100%;
display: flex;
justify-content: center;
position: absolute;
bottom: 20px;
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
@@ -397,6 +237,7 @@ export default {
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;

View File

@@ -22,8 +22,8 @@
<img src="../../assets/images/studentimg/character.png" />
</div>
<div class="stumation">
<div class="stuname">{{pro.routerInfo.userName}}</div>
<div class="stugangw">{{pro.routerInfo.deptName?pro.routerInfo.deptName:"" + '-' + pro.routerInfo.jobName?pro.routerInfo.jobName:""}}</div>
<div class="stuname">{{pro.routerInfo.name}}</div>
<div class="stugangw">{{pro.routerInfo.organizationName?pro.routerInfo.organizationName:"" + '-' + pro.routerInfo.jobName?pro.routerInfo.jobName:""}}</div>
</div>
<div class="sortbox">
<div class="sortname">进度排名</div>
@@ -57,7 +57,7 @@
<div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div>
<div class="sortnub">
<span class="nub1">{{pro.certCnt?pro.certCnt:0}}</span>
<span class="nub1">{{pro.routerInfo.certCnt?pro.routerInfo.certCnt:0}}</span>
</div>
</div>
</div>

View File

@@ -0,0 +1,392 @@
<template>
<div @click="openDrawer">
<slot></slot>
</div>
<a-drawer :visible="visible" class="drawerStyle addhomeworkDrawer" width="800" placement="right">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ info.workName ? "编辑" : "添加" }}任务</div>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"/>
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">作业名称</span>
</div>
<div class="btnbox">
<a-input v-model:value="formData.workName" style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入作业名称" autocomplete="off" show-count :maxlength="20"/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">开始时间</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{ format: 'hh:mm' }"
:disabled-date="disabledDate"
v-model:value="dateTime"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY/MM/DD HH:mm"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">作业要求</span>
</div>
<div class="textarea">
<a-textarea v-model:value="formData.workRequirement" placeholder="请输入作业要求" autocomplete="off"
allow-clear :rows="6" show-count :maxlength="200"/>
</div>
</div>
<div class="mbl_items">
<div class="item_nam">
<span style="margin-right: 10px"></span>
</div>
<div class="item_inp">
<FJUpload v-model:value="formData.workEnclosureAddress"/>
</div>
</div>
<div style="width:100%;height: 80px;"></div>
</div>
</div>
<div class="main_btns" style="background:#fff;">
<a-button class="btn1" @click="closeDrawer">取消</a-button>
<a-button class="btn2" html-type="submit" @click="confirm">确定</a-button>
</div>
</div>
</a-drawer>
</template>
<script setup>
import {defineEmits, defineProps, ref, watch} from "vue";
import dayjs from "dayjs";
import FJUpload from "@/components/common/FJUpload";
import {Form, message} from "ant-design-vue";
const props = defineProps({
info: {}
})
const visible = ref(false)
const initValue = {
workName: '',
submitStartTime: '',
submitEndTime: '',
workRequirement: '',
workEnclosureAddress: '',
}
const formData = ref(initValue)
const emit = defineEmits({})
const dateTime = ref([]);
const rulesRef = ref({
workName: [
{
required: true,
message: '请输入作业名称',
},
],
submitStartTime: [
{
required: true,
message: '请输入开始时间',
},
],
submitEndTime: [
{
required: true,
message: '请输入结束时间',
},
],
workRequirement: [
{
required: true,
message: '请输入作业要求',
},
],
});
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch([props, visible], () => {
resetFields(props.info)
dateTime.value = [props.info?.submitStartTime || '', props.info?.submitEndTime || '']
})
const closeDrawer = () => {
visible.value = false
resetFields()
dateTime.value = []
};
function timeChange(time, timeStr) {
formData.value.submitStartTime = timeStr[0]
formData.value.submitEndTime = timeStr[1]
}
const disabledDate = (current) => {
return current && current < dayjs().startOf('day');
};
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
emit('update:info', {...formData.value})
closeDrawer()
}
function openDrawer() {
visible.value = true
}
defineExpose({openDrawer})
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addhomeworkDrawer {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.mbl_items {
display: flex;
align-items: center;
justify-content: flex-end;
margin-bottom: 10px;
.item_nam {
width: 100px;
display: flex;
align-items: center;
justify-content: flex-end;
white-space: nowrap;
.asterisk_icon {
width: 10px;
height: 10px;
margin-right: 5px;
margin-top: -15px;
}
}
.item_inp {
flex: 1;
position: relative;
margin-left: -25px;
.inp_num {
position: absolute;
left: 398px;
top: 10px;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 373px;
.ant-input {
width: 100%;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
margin-left: 124px;
}
}
}
}
}
.main_btns {
position: absolute;
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>

View File

@@ -0,0 +1,695 @@
<template>
<div @click="openDrawer">
<slot></slot>
</div>
<a-drawer
:visible="visible"
class="drawerStyle addtestDrawer"
width="800"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ info.examinationName >= 0 ? "编辑" : "添加" }}考试</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div style="display: flex; flex-direction: row; padding-top: 0px; margin-top: 20px; margin-left: 32px;">
<div>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(1)"
:class="formData.examType === 1 ? 'outer' : 'notOuter'"
>
系统考试
</button>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(2)"
:class="formData.examType === 2 ? 'outer' : 'notOuter'"
>
外部考试
</button>
</div>
</div>
<div v-if="formData.examType===1" class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">选择试卷</span>
</div>
<s-test v-model:id="formData.examinationTestId" v-model:name="formData.examinationTestName">
<div class="btnbox">
<button class="xkbtn" style="margin:0">
{{ formData.examinationTestId ? "重选" : "选择" }}试卷
</button>
</div>
</s-test>
<div v-if="formData.examinationTestId">
<a-tag closable color="processing" @close="delTag" :closeIcon="true">
<span style="font-size: 14px; line-height: 33px">{{ formData.examinationTestName }}</span>
</a-tag>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试时间</span>
</div>
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
:show-time="{format:'hh:mm'}"
:disabled-date="disabledDate"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试时长</span>
</div>
<div class="select">
<a-input-number
:min="0"
:max="300"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="formData.examinationDuration"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">及格线</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考试说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.examinationExplain"
placeholder="请输入考试说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px;margin-top: 10px;">考试限制</span>
</div>
<div class="kqszbox">
<div class="setbox">
<div class="timerbox">
<span>允许重复考试</span>
<a-input-number
:min="-1"
:max="300"
:precision="0"
style="
width: 100px;
height: 32px;
border-radius: 8px;
overflow: hidden;"
v-model:value="formData.examinationLimit"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>,-1表示无限制</span
>
</div>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">显示答案</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.showAnswers"
>
<a-radio :value="1">允许查看</a-radio>
<a-radio :value="2">不允许查看</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">显示解析</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.showAnalysis"
>
<a-radio :value="1">允许查看</a-radio>
<a-radio :value="2">不允许查看</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">评分模式</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.scoringModel"
>
<a-radio :value="1">最高一次</a-radio>
<a-radio :value="2">最后一次</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">试题排列</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="formData.questionArrangement"
>
<a-radio :value="1">试题乱序</a-radio>
<a-radio :value="2">选项乱序</a-radio>
<a-radio :value="3">全部乱序</a-radio>
<a-radio :value="4">不乱序</a-radio>
</a-radio-group>
</div>
</div>
<div class="main_item" style="height: 20px;"></div>
</div>
</div>
<div v-else class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">考试名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">数据来源</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.source"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入数据来源"
:maxlength="20"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考试说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.externalExplain"
placeholder="请输入考试说明"
allow-clear
show-count
:maxlength="200"
:rows="6"
/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<a-button class="btn1" @click="closeDrawer">取消</a-button>
<a-button class="btn2" @click="confirm">确定</a-button>
</div>
</div>
</a-drawer>
</template>
<script setup>
import {defineEmits, defineProps, ref, watch} from "vue";
import STest from "./SelectTest.vue";
import dayjs from "dayjs";
import {Form, message} from "ant-design-vue";
const props = defineProps({
info: {}
})
const visible = ref(false)
const initValue = {
examinationName: '',
examinationTestId: '',
examinationStartTime: '',
examinationEndTime: '',
examinationDuration: '',
passLine: '',
examType: 1,
source: "",
showAnswers: 2,
showAnalysis: 2,
scoringModel: 2,
questionArrangement: 4,
externalExplain: ""
}
const formData = ref(initValue)
const innerRule = {
examinationName: [
{
required: true,
message: '请输入考试名称',
},
],
examinationTestId: [
{
required: true,
message: '请输入选择试卷',
},
],
examinationStartTime: [
{
required: true,
message: '请输入开始开始时间',
},
],
examinationEndTime: [
{
required: true,
message: '请输入开始结束时间',
},
],
examinationDuration: [
{
required: true,
message: '请输入考试时长',
},
],
passLine: [
{
required: true,
message: '请输入及格线',
},
],
}
const outerRule = {
examinationName: [
{
required: true,
message: '请输入考试名称',
},
],
source: [
{
required: true,
message: '请输入数据来源',
},
],
}
const rulesRef = ref(innerRule);
const emit = defineEmits({})
const dateTime = ref([]);
const {resetFields, validate} = Form.useForm(formData, rulesRef);
watch(() => formData.value.examType, () => {
formData.value.examType === 1 ? rulesRef.value = innerRule : rulesRef.value = outerRule
})
watch([props, visible], () => {
resetFields(props.info)
dateTime.value = [props.info?.examinationStartTime || '', props.info?.examinationEndTime || '']
})
const closeDrawer = () => {
visible.value = false
resetFields()
dateTime.value = []
};
function timeChange(time, timeStr) {
formData.value.examinationStartTime = timeStr[0]
formData.value.examinationEndTime = timeStr[1]
}
const disabledDate = (current) => {
return current && current < dayjs().startOf('day');
};
async function confirm() {
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
emit('update:info', {...formData.value})
closeDrawer()
}
function openDrawer() {
visible.value = true
}
const delTag = () => {
formData.value.examinationTestId = '';
formData.value.examinationTestName = '';
}
function changeOuter(v) {
formData.value.examType = v;
}
defineExpose({openDrawer})
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.outer {
background-color: #4ea6ff;
color: #fff;
border-radius: 5px;
border: 1px solid #a09292;
height: 36px;
margin-right: 10px;
}
.notOuter {
color: #000;
border-radius: 5px;
border: 1px solid #a09292;
background: #fff;
margin-right: 10px;
padding: 3px;
}
.tag-style {
color: rgb(113, 113, 237);
background-color: #d7d1f7;
}
.addtestDrawer {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 400px;
.ant-input {
width: 100%;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.main_table {
position: relative;
padding-bottom: 80px;
.ant-checkbox-wrapper {
align-items: center;
margin-top: -2px;
}
.ant-table-selection-column {
padding: 0px !important;
padding-left: 5px !important;
}
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1);
}
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.pa {
left: 0;
width: 100%;
display: flex;
justify-content: center;
position: absolute;
bottom: 20px;
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>

View File

@@ -163,7 +163,12 @@ const rowSelection = computed(() => ({
selectedRowKeys: rowSelectKeys.value,
onChange: onSelectChange,
preserveSelectedRowKeys: true,
getCheckboxProps: getCheckboxProps
}));
const getCheckboxProps = () => ({
// 某几项默认禁止选中(R: 当state等于1时)
disabled: false
})
function onSelectChange(e, l) {
rowSelectKeys.value = e;

View File

@@ -37,6 +37,8 @@
:showUploadList="false"
:data="{
type: type,
taskId: Number(id),
workId: datesource.info.id,
targetId: Number(id),
}"
>
@@ -148,8 +150,7 @@
display: flex;
align-items: center;
width: 500px;
height: 40px;
"
height: 40px;"
:style="{
background: errNum
? 'rgba(255, 116, 116, 0.1)'
@@ -199,6 +200,12 @@ export default {
type: Boolean,
default: false,
},
datesource: {
type: Object,
default: function () {
return {};
},
},
//type=3:面授课
type: {
type: String,
@@ -240,6 +247,7 @@ export default {
const afterVisibleChange = (bool) => {
console.log("state", bool);
console.log(props.datesource)
};
//上传文件

View File

@@ -8,7 +8,7 @@
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">组员名单</div>
<div class="headerTitle">组员名单1</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@@ -295,7 +295,7 @@ export default {
return (
<div
onClick={() => {
deleteOne(value.record.key);
deleteOne(value.record.key,value.record);
}}
>
删除
@@ -323,12 +323,17 @@ export default {
};
//点击确认批量删除弹窗
const sureDeModal = () => {
// 判断选择的人员中是否有小组长
let arr = [...state.tabledata].filter(x => [...state.selectedRowKeys].some(id => id === x.key)).filter(item => item.leaderId !== null);
if (arr.length > 0) {
return message.warning("选择人员中:"+arr[0].name + "是小组长,请勿删除!");
}
console.log(arr)
let obj = {
projectGroupId: props.chooseGroupId,
projectId: props.projectId,
ids: state.selectedRowKeys,
};
delGroupStudent(obj)
.then((res) => {
console.log(res, "删除成功");
@@ -362,6 +367,7 @@ export default {
groupId: value.groupId, //小组id
group: value.groupName, //小组名
studentId: value.studentId, //学生id
leaderId: value.leaderId, //小组长
currentStageId: value.currentStageId, //当前关卡id
name: value.studentName, //用户名
bum: value.studentDepartName, //部门
@@ -471,8 +477,11 @@ export default {
//重新获取列表
getStu();
};
const deleteOne = (id) => {
// console.log(id, "fewfew");
const deleteOne = (id,row) => {
console.log("row", row);
if (row.leaderId !== null) {
return message.warning(""+row.name + "是小组长,请勿删除!");
}
console.log(`${id}`);
state.deone = true;
state.selectedRows = [];

View File

@@ -1,22 +1,14 @@
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
<template>
<a-drawer
:visible="Seevisible"
class="drawerStyle seestu"
placement="right"
width="70%"
@after-visible-change="afterVisibleChange"
>
<a-drawer :visible="Seevisible" class="drawerStyle seestu" placement="right" width="70%"
@after-visible-change="afterVisibleChange">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">查看</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="closeDrawer" />
</div>
<a-spin v-if="loading" :spinning="loading"/>
<a-spin v-if="loading" :spinning="loading" />
<div v-if="!loading" class="main">
<div class="stuinfor">
<div class="portrait">
@@ -29,18 +21,15 @@
<div class="sortbox">
<div class="sortname">进度排名</div>
<div class="sortnub">
<span class="nub1">{{rank.current}}</span>
<span class="total">/{{rank.total}}</span>
<span class="nub1">{{ rank.current }}</span>
<span class="total">/{{ rank.total }}</span>
</div>
</div>
<a-divider
type="vertical"
style="
height: 49px;
margin-left: 34px;
background-color: rgba(170, 166, 166, 0.3);
"
/>
<a-divider type="vertical" style="
height: 49px;
margin-left: 34px;
background-color: rgba(170, 166, 166, 0.3);
" />
<div class="sortbox" style="margin-left: 34px">
<div class="sortname">完成必修</div>
<div class="sortnub">
@@ -48,115 +37,96 @@
<span class="total">/{{ totalReqCnt }}</span>
</div>
</div>
<a-divider
type="vertical"
style="
height: 49px;
margin-left: 34px;
background-color: rgba(170, 166, 166, 0.3);"
/>
<a-divider type="vertical" style="
height: 49px;
margin-left: 34px;
background-color: rgba(170, 166, 166, 0.3);" />
<div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div>
<div class="sortnub">
<span class="nub1">{{ certCnt?certCnt:0 }}</span>
<span class="nub1">{{ 0 }}</span>
</div>
</div>
</div>
<div class="secondrow">
<div class="rowleft">{{ name }} </div>
<div class="rowleft">{{ name }} </div>
<div class="rowRight"> 排序号{{ sort }}</div>
</div>
<div class="mainbox">
<a-collapse v-model:activeKey="stageListActive">
<template #expandIcon="{ isActive }">
<img
style="margin-right: 20px"
:src="
isActive
? require('../../assets/images/studentimg/open.png')
: require('../../assets/images/studentimg/close.png')
"
/>
<img style="margin-right: 20px" :src="
isActive
? require('../../assets/images/studentimg/open.png')
: require('../../assets/images/studentimg/close.png')
" />
<div></div>
</template>
<a-collapse-panel
v-for="value in stageList"
:key="value.stageId"
:header="value.stageName"
>
<template #extra >
<div @click.stop="">
<div class="rowbox">
<a-popover title="阶段说明">
<template #content>
<p>{{value.remark}}</p>
</template>
<div class="shuom">说明</div>
</a-popover>
<div><img src="../../assets/images/studentimg/chak.png" /></div>
</div>
</div>
</template>
<div
class="rowclass"
v-for="(item, key) in value.taskList"
:key="key"
>
<a-collapse-panel v-for="value in stageList" :key="value.stageId" :header="value.stageName">
<template #extra>
<div @click.stop="">
<div class="rowbox">
<a-popover title="阶段说明">
<template #content>
<p>{{ value.remark }}</p>
</template>
<div class="shuom">说明</div>
</a-popover>
<div><img src="../../assets/images/studentimg/chak.png" /></div>
</div>
</div>
</template>
<div class="rowclass" v-for="(item, key) in value.taskList" :key="key">
<div class="leftclass">
<div>
<img
:src="
item.course === '在线'
? require('../../assets/images/leveladd/zai.png')
: item.course === '面授'
<img :src="
item.course === '在线'
? require('../../assets/images/leveladd/zai.png')
: item.course === '面授'
? require('../../assets/images/leveladd/mian.png')
: item.course === '案例'
? require('../../assets/images/leveladd/an.png')
: item.course === '作业'
? require('../../assets/images/leveladd/zuo.png')
: item.course === '考试'
? require('../../assets/images/leveladd/kao.png')
: item.course === '直播'
? require('../../assets/images/leveladd/zhi.png')
: item.course === '外链'
? require('../../assets/images/leveladd/wai.png')
: item.course === '讨论'
? require('../../assets/images/leveladd/tao.png')
: item.course === '活动'
? require('../../assets/images/leveladd/huo.png')
: item.course === '测评'
? require('../../assets/images/leveladd/ce.png')
: item.course === '调研'
? require('../../assets/images/leveladd/diao.png')
: item.course === '投票'
? require('../../assets/images/leveladd/tou.png')
: item.course === '评估'
? require('../../assets/images/leveladd/diao.png')
: null
"
/>
? require('../../assets/images/leveladd/an.png')
: item.course === '作业'
? require('../../assets/images/leveladd/zuo.png')
: item.course === '考试'
? require('../../assets/images/leveladd/kao.png')
: item.course === '直播'
? require('../../assets/images/leveladd/zhi.png')
: item.course === '外链'
? require('../../assets/images/leveladd/wai.png')
: item.course === '讨论'
? require('../../assets/images/leveladd/tao.png')
: item.course === '活动'
? require('../../assets/images/leveladd/huo.png')
: item.course === '测评'
? require('../../assets/images/leveladd/ce.png')
: item.course === '调研'
? require('../../assets/images/leveladd/diao.png')
: item.course === '投票'
? require('../../assets/images/leveladd/tou.png')
: item.course === '评估'
? require('../../assets/images/leveladd/diao.png')
: null
" />
</div>
<div class="text1">{{ item.course }}</div>
<div class="text2">{{ item.name }}</div>
</div>
<div class="alreadyclass">
<div class="alimg">
<img
:src="
item.complete === '已完成'
? require('../../assets/images/studentimg/complete.png')
: require('../../assets/images/studentimg/notice.png')
"
/>
<img :src="
item.complete === '已完成'
? require('../../assets/images/studentimg/complete.png')
: require('../../assets/images/studentimg/notice.png')
" />
</div>
<div class="altext">{{ item.complete }}</div>
</div>
</div>
</a-collapse-panel>
</a-collapse>
@@ -173,7 +143,7 @@
<script>
import { reactive, toRefs } from "vue";
import ProMess from "./ProMess.vue";
import {studentProcess, studentRank} from "../../api/indexProjStu";
import { studentProcess, studentRank } from "../../api/indexProjStu";
export default {
name: "SeeStu",
components: { ProMess },
@@ -193,7 +163,7 @@ export default {
},
setup(props, ctx) {
const state = reactive({
loading:false,
loading: false,
userName: null, //用户名
deptName: null, //部门
jobName: null, //岗位
@@ -204,8 +174,8 @@ export default {
Provisible: false,
showDown: true,
showDown1: false,
rank:{total:1,current:1},
sort:null,
rank: { total: 1, current: 1 },
sort: null,
stageList: [
// {
// stageName: "阶段1腾飞班阶段1",
@@ -249,8 +219,8 @@ export default {
studentRank({
projectId: props.projectId,
studentId: props.checkStuId,
type:1
}).then(res=>{
type: 1
}).then(res => {
state.rank = res.data.data
})
}
@@ -275,52 +245,54 @@ export default {
let data = tableData;
console.log('我排序了吗--------------------------》', data)
let array = [];
if(data!=undefined){
if (data != undefined) {
data.map((value) => {
let obj = {
course:
value.type == 1
? "在线"
: value.type == 2
? "面授"
: value.type == 3
? "案例"
: value.type == 4
? "作业"
: value.type == 5
? "考试"
: value.type == 6
? "直播"
: value.type == 7
? "外链"
: value.type == 8
? "讨论"
: value.type == 9
? "活动"
: value.type == 10
? "测评"
: value.type == 11
? "评估"
: value.type == 12
? "投票"
: "-",
name: value.name,
projectId: value.projectId,
complete:
value.status == -1
? "未开始"
: value.status == 1
? "已完成"
: value.status == 0
? "未完成"
: "-",
flag: value.flag == 0 ? "选修" : "必修",
currentRatio: value.currentRatio,
routerTaskId: value.routerTaskId,
};
array.push(obj);
});
array.sort((a,b)=>{return a.projectId - b.projectId})
console.log('我排序了吗---------value-----------------》', value)
let obj = {
course:
value.type == 1
? "在线"
: value.type == 2
? "面授"
: value.type == 3
? "案例"
: value.type == 4
? "作业"
: value.type == 5
? "考试"
: value.type == 6
? "直播"
: value.type == 7
? "外链"
: value.type == 8
? "讨论"
: value.type == 9
? "活动"
: value.type == 10
? "测评"
: value.type == 11
? "评估"
: value.type == 12
? "投票"
: "-",
name: value.name,
projectId: value.projectId,
complete:
value.status == -1
? "未开始"
: value.status == 1
? "已完成"
: value.status == 0
? "未完成"
: "-",
flag: value.flag == 0 ? "选修" : "必修",
currentRatio: value.currentRatio,
routerTaskId: value.routerTaskId,
};
console.log('我排序了吗---------obj-----------------》', obj)
array.push(obj);
});
array.sort((a, b) => { return a.projectId - b.projectId })
}
console.log('我排序了吗-----------1---------------》', array)
@@ -331,31 +303,34 @@ export default {
console.log("查看了学员1", data);
let array = [];
//无阶段任务
if(data?.length ==1 && data[0].stageId ==0){
if (data?.length == 1 && data[0].id == 0) {
console.log("无阶段任务", data);
data.map((value) => {
let obj = {
stageName:"无阶段任务",
stageId:0,
remark:value.remark,
taskList: taskList(value.taskList),
};
array.push(obj);
});
}else{ //有阶段
data.map((value) => {
let obj = {
stageName: value.stageName,
stageId: value.stageId,
remark:value.remark,
taskList: taskList(value.taskList),
};
if(value.stageId >0){
let obj = {
stageName: "无阶段任务",
stageId: 0,
remark: value.remark,
taskList: taskList(value.taskList),
};
array.push(obj);
}
});
});
} else { //有阶段
console.log("有阶段", data);
data.map((value) => {
console.log("有阶段value", value);
let obj = {
stageName: value.name,
stageId: value.id,
remark: value.remark,
taskList: taskList(value.taskList),
};
if (value.id > 0) {
array.push(obj);
}
console.log("有阶段array", array);
});
}
state.stageList = array;
};
const check = () => {
@@ -366,19 +341,20 @@ export default {
};
studentProcess(obj).then((res) => {
state.loading = false
console.log("查看了学员", res.data.data);
console.log("查看了学员", res.data);
let result = res.data.data;
state.userName = result.projectInfo.userName;
console.log("查看了学员result:", result);
state.userName = result.projectInfo.name;
state.deptName = result.projectInfo.deptName;
state.jobName = result.projectInfo.jobName;
state.certCnt = result.projectInfo.certCnt == null ? 0 : result.projectInfo.certCnt;
state.name = result.projectInfo.name;
state.currentReqCnt = result.projectInfo.currentReqCnt;
state.totalReqCnt = result.projectInfo.totalReqCnt;
if (result.stageList.length > 0) {
state.sort = result.stageList[0].sort;
}
setStageList(result.stageList);
});
@@ -403,20 +379,24 @@ export default {
<style lang="scss">
.seestu {
.ant-drawer-content-wrapper {
// max-width: 1000px;
.ant-drawer-header {
display: none !important;
}
.ant-drawer-body {
padding: 0;
}
}
.drawerMain {
min-width: 600px;
margin: 0px 32px 0px 32px;
overflow-x: auto;
display: flex;
flex-direction: column;
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
@@ -426,6 +406,7 @@ export default {
// background-color: red;
margin-bottom: 20px;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
@@ -434,11 +415,13 @@ export default {
// margin-left: 24px;
}
}
.main {
display: flex;
flex-direction: column;
overflow-y: auto;
padding-bottom: 80px;
.stuinfor {
display: flex;
align-items: center;
@@ -448,35 +431,43 @@ export default {
background-image: url("../../assets/images/studentimg/bgimg.png");
background-repeat: no-repeat;
background-position: right;
.stumation {
margin-left: 24px;
.stuname {
color: #333333;
font-size: 18px;
}
.stugangw {
color: #999999;
font-size: 16px;
margin-top: 7px;
}
}
.sortbox {
display: flex;
flex-direction: column;
justify-content: center;
margin-left: 114px;
.sortname {
color: #666660;
font-size: 14px;
}
.sortnub {
display: flex;
justify-content: center;
margin-top: 7px;
.nub1 {
color: #0060ff;
font-size: 22px;
}
.total {
color: #999999;
font-size: 22px;
@@ -484,19 +475,23 @@ export default {
}
}
}
.secondrow {
margin-top: 32px;
display: flex;
.rowleft {
color: rgba(51, 51, 51, 1);
font-size: 16px;
}
}
.mainbox {
// height: 463px;
margin-right: 37px;
margin-top: 32px;
//border: 1px solid rgba(221, 238, 255, 1);
//border-radius: 6px;
.rowbox {
@@ -510,6 +505,7 @@ export default {
background: rgba(64, 158, 255, 0.1);
margin-right: 480px;
cursor: pointer;
.shuom {
color: rgba(64, 158, 255, 1);
font-size: 14px;
@@ -517,23 +513,28 @@ export default {
margin-right: 5px;
}
}
.ant-collapse {
background-color: #ffffff;
border: 0;
}
.ant-collapse-content > .ant-collapse-content-box {
.ant-collapse-content>.ant-collapse-content-box {
padding: 0;
border: 0;
}
.ant-collapse > .ant-collapse-item {
.ant-collapse>.ant-collapse-item {
border: 1px solid rgba(221, 238, 255, 1);
border-radius: 6px;
margin-bottom: 15px;
border-bottom: 0px;
}
.ant-collapse-content {
border-top: 0;
}
.ant-collapse-header {
display: flex;
align-items: center;
@@ -543,52 +544,60 @@ export default {
color: rgba(51, 51, 51, 1);
font-weight: 500;
}
.rowclass {
height: 81px;
border-bottom: 1px solid rgba(221, 238, 255, 1);
display: flex;
justify-content: space-between;
align-items: center;
.leftclass {
display: flex;
margin-left: 25px;
align-items: center;
.text1 {
color: #000000;
font-size: 14px;
font-weight: 500;
margin-left: 25px;
word-break:keep-all;
white-space:nowrap;
word-break: keep-all;
white-space: nowrap;
}
.text2 {
color: rgba(51, 51, 51, 0.8);
font-size: 14px;
margin-left: 65px;
word-break:keep-all;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
word-break: keep-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.alreadyclass {
display: flex;
margin-right: 57px;
.alimg {
height: 16px;
width: 16px;
}
.altext {
color: rgba(56, 125, 247, 1);
font-size: 14px;
margin-left: 16px;
word-break:keep-all;
white-space:nowrap;
word-break: keep-all;
white-space: nowrap;
}
}
}
}
}
.btnn {
height: 72px;
width: 100%;
@@ -600,6 +609,7 @@ export default {
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn2 {
cursor: pointer;
width: 100px;
@@ -612,5 +622,4 @@ export default {
}
}
}
}
</style>
}</style>

View File

@@ -175,7 +175,12 @@ const rowSelection = computed(() => ({
selectedRowKeys: rowSelectKeys.value,
onChange: onSelectChange,
preserveSelectedRowKeys: true,
getCheckboxProps: getCheckboxProps
}));
const getCheckboxProps = () => ({
// 某几项默认禁止选中(R: 当state等于1时)
disabled: false
})
function onSelectChange(e, l) {
rowSelectKeys.value = e;

View File

@@ -690,11 +690,11 @@ export default {
if (!state.condition) return message.warning("请设置获得条件");
if (state.condition == 1 && !state.large)
return message.warning("请选择完成项目类型");
if (state.condition == 2 && !state.selectStageId)
if (state.condition == 2 && !state.selectStageName)
return message.warning("请选择完成阶段");
if (state.condition == 3 && !state.selectTaskId)
if (state.condition == 3 && !state.selectTaskName)
return message.warning("请选择完成任务");
if (state.condition == 4 && !state.selectExamId)
if (state.condition == 4 && !state.selectExamName)
return message.warning("请选择考试");
if (state.condition == 5 && !state.score)
return message.warning("请输入积分");

View File

@@ -10,7 +10,7 @@
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">导入小组长</div>
<div class="headerTitle">{{ title }}</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@@ -64,7 +64,6 @@
<a-progress :percent="file.percent"/>
</div>
<div class="curloading">
<div class="cur">{{ file.percent }}%</div>
<div style="color: #387df7; margin-left: 20px; cursor: pointer"
v-if="file.uploadState?.status === 'FAILED'" @click="downloadErrorData(file.uploadState?.url)">
下载失败数据
@@ -102,6 +101,7 @@ import success from "@/assets/images/success.png";
const props = defineProps({
url: String,
title: String,
accept: String,
fileType: Object,
data: Object,

View File

@@ -135,6 +135,7 @@
:type="1"
:id="projectTaskInfo?.id"
:pid="projectTaskInfo?.projectId"
:datesource="projectTaskInfo"
v-model:searchTaskList="searchTaskList"
/>
<!-- 查看作业抽屉 -->

View File

@@ -473,8 +473,8 @@ const tablecolumns = ref([
1: "导入",
2: "导入",
3: "导入",
4: "报名",
5: "导入",
4: "导入",
5: "报名",
6: "导入",
}[source]),
},

View File

@@ -953,7 +953,9 @@
<div v-if="checked4" class="cstm_items main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="showAssessment">选择评估</button>
<AssessmentList v-model:assessmentName="assessmentName" v-model:assessmentId="assessmentId">
<button class="xkbtn" @click="showAssessment" style="margin-bottom: 0;margin-top: 0">选择评估</button>
</AssessmentList>
<div v-if="assessmentId > 0">
<a-tag closable @close="removePG" color="processing">
<span style="font-size: 14px; line-height: 33px">
@@ -961,54 +963,40 @@
</span>
</a-tag>
</div>
<AssessmentList
v-model:assessmentVisible="assessmentVisible"
v-model:assessmentName="assessmentName"
:assessmentId="assessmentId"
@checkedAss="getCheckedAss"
/>
</div>
</div>
<div class="cstm_items main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="showDrawerAddHomework">
<add-homework v-model:info="workInfo">
<button class="xkbtn" style="margin-bottom: 0;margin-top: 0">
配置作业
</button>
<div v-if="EditWorkId > 0">
</add-homework>
<div v-if="workInfo.workName">
<a-tag closable @close="logW" color="processing">
<span style="font-size: 14px; line-height: 33px">
{{ workName }}
{{ workInfo.workName }}
</span>
</a-tag>
</div>
<add-homework
v-model:addhomeworkVisible="addhomeworkvisible"
@getWork="getWork"
:faceLevel="true"
v-model:EditWorkId="EditWorkId"
v-model:workName="workName"
/>
</div>
</div>
<div class="cstm_items main_item">
<div class="signbox"></div>
<div class="btnbox">
<button class="xkbtn" @click="showDrawerAddTest">配置考试</button>
<div v-if="EditTestId > 0">
<add-test v-model:info="examInfo">
<button class="xkbtn" style="margin-bottom: 0;margin-top: 0">配置考试</button>
</add-test>
<div v-if="examInfo.examinationName">
<a-tag closable @close="logT" color="processing">
<span style="font-size: 14px; line-height: 33px">
{{ testName }}
{{ examInfo.examinationName }}
</span>
</a-tag>
</div>
<add-test
v-model:addtestVisible="addtestvisible"
v-model:EditTestId="EditTestId"
v-model:testName="testName"
:faceLevel="true"
/>
</div>
</div>
<!--
@@ -1036,7 +1024,7 @@
</a-checkbox>
</div>
</div> -->
<div class="cstm_items items_fj">
<div class="cstm_items items_fj" style="height:80px">
<div class="signbox">
<span style="margin-right: 3px"></span>
</div>
@@ -1503,15 +1491,11 @@ import {
computed,
} from "vue";
import * as api from "../../api/indexInvist.js";
import * as apis from "../../api/indexTaskManage";
import {message} from "ant-design-vue";
import {useRouter, useRoute} from "vue-router";
import CommonStudent from "@/components/student/CommonStudent";
import OwnerTableModelStudent from "@/components/student/OwnerTableModelStudent";
// import StuAdd from "../../components/drawers/StuAdd";
// import OwnPower from "../../components/drawers/OwnPower.vue";
// import Corpowerlist from "../../components/drawers/CorPowerlist.vue";
import addOnlineCourse from "../../components/Modals/addOnlineCourse.vue";
import ProjOwnerShip from "../../components/drawers/ProjectOwn";
@@ -1550,11 +1534,11 @@ import SeeModal from "./components/seeModal.vue";
import CourseModal from "./courseModal.vue";
import * as moment from "moment";
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
import {codeUrl, toDate} from "../../api/method";
import {codeUrl, toDate} from "@/api/method";
import {queryWorkDetailById} from "@/api/indexWork";
import {queryExaminationDetailById} from "@/api/indexExam";
import AddHomework from "../../components/drawers/AddHomework.vue";
import AddTest from "../../components/drawers/AddTest.vue";
import AddHomework from "../../components/drawers/CommonHomework.vue";
import AddTest from "../../components/drawers/CommonTest.vue";
import TableStudent from "@/components/student/TableStudent";
import FJUpload from "@/components/common/FJUpload";
import {updateStudent} from "@/api/indexProjStu";
@@ -1562,7 +1546,6 @@ import {useStore} from "vuex";
import DropDown from "@/components/common/DropDown";
import {checkPer} from "@/utils/utils";
import dayjs from "dayjs";
// import { commonExport } from '@/utils/commonExcel'
//列表表格
const columns1 = [
@@ -2171,6 +2154,8 @@ export default defineComponent({
const store = useStore();
const state = reactive({
workInfo:{},
examInfo:{},
tableLoading: false,
//新加
stuColumns: [
@@ -3193,13 +3178,11 @@ export default defineComponent({
const showDrawerAddTest = () => {
state.addtestvisible = true;
};
const logW = (e) => {
state.EditWorkId = null;
console.log(e);
const logW = () => {
state.workInfo = {}
};
const logT = (e) => {
state.EditTestId = 0;
console.log(e);
const logT = () => {
state.examInfo = {}
};
const removePG = () => {
console.log("11111");
@@ -3670,13 +3653,7 @@ export default defineComponent({
startTime = dayjs(state.xjkkinputV3[0]).format('YYYY-MM-DD HH:mm') //parseInt(state.xjkkinputV3[0].$d.getTime() / 1000);
endTime = dayjs(state.xjkkinputV3[1]).format('YYYY-MM-DD HH:mm') //parseInt(state.xjkkinputV3[1].$d.getTime() / 1000);
}
// console.log("state.validate", state.validate);
// if (!state.validate) {
// message.destroy();
// return message.warning("该开课名称已存在");
// }
const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(res => {
const offName = await validateName({ name: state.xjkkinputV1, type: 5 ,id:state.offcoursePlanId}).then(res => {
console.log(res,res.data.data);
return res.data.data === 1;
});
@@ -3706,6 +3683,8 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
// signWordFlag: state.xjkkradioV1 === 1 ? 1 : 0, //签到是否需要口令:1是0否
teacherId: state.member.value,
teacher: state.member.name,
workInfo: state.workInfo,//提交的作业信息
examInfo: state.examInfo//提交的考试信息
};
console.log(postData);
const checkList = [
@@ -3735,30 +3714,14 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
state.offcourseId = item.offcourseId;
state.offcoursePlanId = item.id;
if (item.evaluateId) {
api
.queryAppraiseDetailById({assessmentId: item.evaluateId})
.then((res) => {
state.assessmentName = res.data.data.assessmentName;
})
.catch();
}
if (item.homeWorkId) {
queryWorkDetailById({workId: item.homeWorkId}).then((res) => {
state.workName = res.data.data.workName;
});
queryWorkDetailById({workId: item.homeWorkId}).then((res) => state.workInfo = res.data.data);
}
if (item.testId) {
queryExaminationDetailById({examinationId: item.testId}).then(
(res) => {
state.testName = res.data.data.examinationName;
}
);
queryExaminationDetailById({examinationId: item.testId}).then((res) => state.examInfo = res.data.data);
}
console.log("res");
console.log("获取面授课开课详情", item);
state.xjkkinputV2 = item.address;
state.checked1 = item.applyFlag === 1 ? true : false;
let arrss = item.attach.split(",");
@@ -3781,7 +3744,8 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
(state.comLeave =
item.completeType.split(",")[1] == "1" ? true : false),
(state.checked4 = item.evalFlag === 1 ? true : false);
state.assessmentId = String(item.evaluateId);
state.assessmentName = item.assessmentName;
state.assessmentId = String(item.assessmentId);
state.EditTestId = Number(item.testId);
state.EditWorkId = String(item.homeWorkId);
state.xjkkinputV1 = item.name;
@@ -4675,7 +4639,6 @@ const offName = await validateName({ name: state.xjkkinputV1, type: 5 }).then(re
};
const disabledDate = (current) => {
// Can not select days before today and today
console.log("1111", dayjs().endOf("day"));
return current && current < dayjs().startOf("day");
};

View File

@@ -300,8 +300,6 @@ export default defineComponent({
const state = reactive({
imgList: [],
categoryName: "",
ceshi: "https://u-pre.boe.com/upload/测试下载ppt2-1671002026755.pptx",
ceshi2: "http://43.143.139.204:12016/测试下载ppt3-1671001683026.pptx",
locationHref:
location.href.indexOf("http://") !== -1
? "http://43.143.139.204:12016/"

View File

@@ -169,13 +169,6 @@
</div>
<div class="inname">路径图名称</div>
<div class="in road">
<!-- <a-input-->
<!-- v-model:value="pathName"-->
<!-- maxlength="20"-->
<!-- style="border-radius: 4px"-->
<!-- placeholder="请输入学习路径名称"-->
<!-- />-->
<!-- <div class="showcount">{{ pathName.length }}/20</div>-->
<NameInput
placeholder="请输入路径名称"
v-model:value="pathName"
@@ -218,10 +211,6 @@
</div>
<div class="inname">路径图背景</div>
<div class="in learnBg">
<!-- <img class="im" src="../../assets/px.jpg" />
<img class="im" src="../../assets/px.jpg" />
<img class="im" src="../../assets/px.jpg" /> -->
<div
@click="chooseImg(item)"
v-for="(item, index) in imgData"
@@ -233,13 +222,13 @@
? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #C7CBD2',
'background-image': 'url(' + item.value.split(',')[0] + ')',
display: index >= 5 ? 'none' : 'flex',
display: index >= 3 ? 'none' : 'flex',
}"
style="background-size: 100% 100%"
></div>
<div
@click="showLearnBgMore"
v-if="imgData.length > 5"
v-if="imgData.length > 3"
class="learnBgItem learnBgMore"
>
查看更多 <img src="../../assets/images/projectadd/go.png" />
@@ -255,7 +244,7 @@
</div>
<div class="btn">
<button class="samtn btn1" @click="handleOut">取消</button>
<button class="samtn btn2" @click="createLearnPath">确定</button>
<a-button class="samtn btn2" @click="createLearnPath" :loading="confirmLoading">确定</a-button>
</div>
<div
@@ -297,13 +286,6 @@
</div>
<div class="inname">路径图名称</div>
<div class="in road">
<!-- <a-input-->
<!-- v-model:value="pathName"-->
<!-- maxlength="20"-->
<!-- style="border-radius: 4px"-->
<!-- placeholder="请输入学习路径名称"-->
<!-- />-->
<!-- <div class="showcount">{{ pathName.length }}/20</div>-->
<NameInput
placeholder="请输入路径名称"
v-model:value="pathName"
@@ -370,7 +352,7 @@
</div>
<div
@click="showLearnBgMore"
v-if="imgData.length > 5"
v-if="imgData.length > 3"
class="learnBgItem learnBgMore"
>
查看更多 <img src="../../assets/images/projectadd/go.png" />
@@ -386,7 +368,7 @@
</div>
<div class="btn">
<button class="samtn btn1" @click="handleOut1">取消</button>
<button class="samtn btn2" @click="editLearnPath">确定</button>
<a-button class="samtn btn2" @click="editLearnPath" :loading="confirmLoading">确定</a-button>
</div>
</div>
</div>
@@ -738,7 +720,9 @@ export default {
setup() {
const store = useStore();
const router = useRouter();
const userInfo = computed(()=>store.state.userInfo)
const state = reactive({
confirmLoading:false,
tableLoading: false,
out: false,
out1: false,
@@ -866,17 +850,16 @@ export default {
const handleOut = () => {
console.log(store.state);
// console.log("打开创建路径弹窗");
state.confirmLoading = false;
state.pathName = "";
state.pathBg = "";
state.pathBgId = "";
state.pathIntro = "";
state.out = !state.out;
setTimeout(() => {
if (store.state.userInfo.departId && store.state.userInfo.departName) {
state.organizationSelectName = store.state.userInfo.departName;
state.organizationSelectId = store.state.userInfo.departId;
}
}, 2000);
if (userInfo.value.departId && userInfo.value.departName) {
state.organizationSelectName =userInfo.value.departName;
state.organizationSelectId = userInfo.value.departId;
}
};
const handleOut1 = () => {
state.pathName = "";
@@ -1175,24 +1158,30 @@ export default {
};
//创建学习路径图
const createLearnPath = async () => {
state.confirmLoading = true
if (!state.pathName) {
message.destroy();
state.confirmLoading = false
return message.warning("请输入路径图名称");
}
if (!state.organizationSelectName) {
message.destroy();
state.confirmLoading = false
return message.warning("请选择归属组织");
}
if (!state.pathBg) {
message.destroy();
state.confirmLoading = false
return message.warning("请选择背景图");
}
if (!state.mobilePicUrl) {
message.destroy();
state.confirmLoading = false
return message.warning("未配置H5背景图请联系管理员");
}
if (!state.validate) {
message.destroy();
state.confirmLoading = false
message.warning("路径图名称重复");
return;
}
@@ -1205,9 +1194,9 @@ export default {
});
if (offName) {
message.destroy();
state.confirmLoading = false
return message.warning("项目名称重复,请重新填写");
}
state.lpLoading = true;
api.createLearnPath({
name: state.pathName,
remark: state.pathIntro,
@@ -1218,8 +1207,8 @@ export default {
mobilePicUrl: state.mobilePicUrl,
}).then(id => {
message.destroy();
state.confirmLoading = false
message.success("创建成功");
state.lpLoading = false;
router.push( {path: "/leveladd",query:{routerId: id.data.data }})
})
};
@@ -1268,49 +1257,38 @@ export default {
};
//删除学习路径图
const deleteLearnPath = () => {
let obj = {
routerId: state.deletePathId,
type: -2,
};
api
.handleLearnPath(obj)
.then((res) => {
if (res.data.code === 200) {
console.log("删除成功", res);
message.destroy();
message.success("删除成功");
state.deleteModal = false;
getLearnPath();
}
if (res.data.code === -1) {
message.warning(res.data.msg);
}
})
.catch((err) => {
console.log("删除失败", err);
});
state.deleteModal = false;
state.tableLoading = true;
message.success("删除成功");
api.handleLearnPath({routerId: state.deletePathId, type: -2}).then(() => {getLearnPath()})
};
//编辑学习路径图
const editLearnPath = async () => {
state.confirmLoading = true
if (!state.pathName) {
message.destroy();
state.confirmLoading = false
return message.warning("请输入路径图名称");
}
if (!state.organizationSelectName) {
message.destroy();
state.confirmLoading = false
return message.warning("请选择归属组织");
}
if (!state.pathBgId) {
message.destroy();
state.confirmLoading = false
return message.warning("请选择背景图");
}
if (!state.mobilePicUrl) {
message.destroy();
state.confirmLoading = false
return message.warning("未配置H5背景图请联系管理员");
}
if (!state.validate) {
message.destroy();
state.confirmLoading = false
return message.warning("路径图名称重复");
}
// state.pathName = detail.name;
@@ -1330,10 +1308,15 @@ export default {
});
if (offName) {
message.destroy();
state.confirmLoading = false
return message.warning("项目名称重复,请重新填写");
}
state.out1 = false;
state.confirmLoading = false
message.success("修改成功");
state.tableLoading = true;
let obj = {
routerId: state.editPathId,
id: state.editPathId,
name: state.pathName,
picUrl: state.pathBg,
mobilePicUrl: state.mobilePicUrl,
@@ -1342,40 +1325,10 @@ export default {
organizationId: state.organizationSelectId,
status: 0,
};
api
.createLearnPath(obj)
.then((res) => {
if (res.data.code === 200) {
console.log("修改成功", res);
message.destroy();
message.success("修改成功");
// state.createLoading = false;
// state.currentPage = 1;
state.out1 = false;
// router.push("/leveladd");
getLearnPath();
// setTimeout(() => {
// console.log("修改成功", res);
// message.success("修改成功");
// // state.createLoading = false;
// // state.currentPage = 1;
// state.out1 = false;
// // router.push("/leveladd");
// getLearnPath();
// }, 1000);
}
if (res.data.code === -1) {
message.warning(res.data.msg);
}
})
.catch((err) => {
console.log("修改失败", err);
// state.createLoading = false;
});
api.createLearnPath(obj).then(() => {getLearnPath()})
};
//选择状态
const selectStatusClassify = (e, v) => {
// console.log("eee", e, v);
state.statusValue = e;
state.statusClassify = v.classify;
};
@@ -1523,13 +1476,12 @@ export default {
state.organizationSelectId = detail.organizationId;
state.pathIntro = detail.remark;
state.editPathId = id;
let arr = imgData.value;
arr.forEach((item) => {
if (item.value === state.pathBg) {
state.pathBgId = item.code;
}
});
const imgDict = imgData.value.find((img)=>img.value.split(',')[0] === state.pathBg)
if(imgDict){
state.pathBgId = imgDict.code;
state.pathBg = imgDict.value.split(',')[0];
state.mobilePicUrl = imgDict.value.split(',')[1];
}
//for (let i = 0; i < arr.length; i++) {
// console.log("arr[i].dictValue", arr[i].dictValue, state.pathBg);

View File

@@ -144,8 +144,8 @@
<div>
<span class="nub1" style="color: #5dc988">{{
routerInfoOverview.onlineCourseCnt
}}</span
><span style="color: #5dc988; font-size: 14px">%</span>
}}</span>
<!-- <span style="color: #5dc988; font-size: 14px"></span> -->
</div>
<div class="nub2">在线课程数</div>
</div>
@@ -153,8 +153,8 @@
<div>
<span class="nub1" style="color: #ff90ae">{{
routerInfoOverview.offLineCourseCnt
}}</span
><span style="color: #ff90ae; font-size: 14px">%</span>
}}</span>
<!-- <span style="color: #ff90ae; font-size: 14px">%</span> -->
</div>
<div class="nub2">面授课程数</div>
</div>
@@ -325,16 +325,9 @@
<div style="flex: 1">
<div class="onerow">
<div class="taskmain">任务大纲</div>
<div
@click="showFaceStuSignUp"
class="editright"
style="margin-right: 130px; cursor: pointer"
>
<span class="editextb" style="margin-left: 0px"
>批量面授报名</span
>
</div>
<ImpoterGroupLeader title="批量面授报名" :data="{targetId:routerId,type:2}" :url="`/admin/offcourse/importCourse`" :template-url="`/admin/router/exportTaskCoursePlan/${routerId}?type=1&taskType=2&thirdType=3`">
<button class="btn">批量面授报名</button>
</ImpoterGroupLeader>
<router-link
:to="{ path: '/leveladddetail', query: { routerId: routerId } }"
class="editright"
@@ -1394,7 +1387,7 @@ import RouterHomeworkManage from "../../components/drawers/router/RouterHomework
import RouterCommonManage from "../../components/drawers/router/RouterCommonManage";
import RouterVoteManage from "../../components/drawers/router/RouterVoteManage";
import RouterProjectManage from "../../components/drawers/router/RouterProjectManage";
import ImpoterGroupLeader from "@/components/drawers/project/ImpoterGroupLeader.vue";
import TaskImpStu from "../../components/drawers/TaskFaceIn";
import { checkPer } from "@/utils/utils";
@@ -1402,7 +1395,7 @@ import { checkPer } from "@/utils/utils";
export default {
name: "LevelAdd",
components: {
// PathAddStu,
ImpoterGroupLeader,
ProjCheckShip,
ImpStu,
CheckStu,
@@ -2243,6 +2236,7 @@ export default {
levelList.routerInfoOverview[item] =
res.data.data.routerInfoOverview[item] || 0;
});
console.log("学习路径图概览数据获取1", levelList);
Object.keys(res.data.data.chapterOverviewList).forEach((item) => {
levelList.chapterOverviewList[item] =
res.data.data.chapterOverviewList[item] || 0;

View File

@@ -528,7 +528,7 @@ const deleteChapter = () => {
return
}
routerInfo.value.chapterList.splice(activeIndex.value, 1);
activeIndex.value = activeIndex.value-1;
activeIndex.value && (activeIndex.value = activeIndex.value-1);
deleteChapterModal.value = false;
};

View File

@@ -1,5 +1,5 @@
<!---- 创建项目页面 --->
<template>
<template xmlns:display="http://www.w3.org/1999/xhtml">
<div class="projectAdd">
<div class="header">
<span class="title"
@@ -73,6 +73,9 @@
overflow: hidden;
"
v-for="(src, index) in projectPic"
:style="{
display: index >= 3 ? 'none' : 'flex',
}"
:key="index"
@click="() => (projectInfo.picUrl = src.value)"
>
@@ -87,6 +90,29 @@
alt="avatar"
/>
</div>
<div
@click="showLearnBgMore"
v-if="projectPic.length > 3"
style="
width: 100px;
height: 100px;
padding-left: 15px;
border-radius: 5px;
cursor: pointer;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #c7cbd2;
font-size: 14px;
font-weight: 400;
color: #4ea6ff;
line-height: 36px;
"
>
查看更多 <img src="../../assets/images/projectadd/go.png" alt=""/>
</div>
</div>
</div>
<div class="name">
@@ -283,6 +309,36 @@
</a-button>
</div>
</div>
<!-- 更多背景图 v-model:visible="learnBgMore" -->
<a-modal
:closable="sh"
centered="true"
v-model:visible="learnBgMore"
:footer="null"
:width="650"
wrapClassName="learnBgMoreModal"
:z-index="9999"
>
<div class="main">
<div class="top">
<div class="topc">封面图</div>
</div>
<div class="imagesBox">
<div
@click="() => (projectInfo.picUrl = src.value)"
v-for="item in projectPic"
:key="item.code"
class="learnBgItem"
>
<!-- <img class="im" :src="item.source" /> -->
</div>
</div>
<div class="btn">
<button class="samtn btn1" @click="closeLearnBgMore">取消</button>
<button class="samtn btn2" @click="closeLearnBgMore">确定</button>
</div>
</div>
</a-modal>
</div>
</template>
<script>
@@ -336,10 +392,10 @@ export default {
ptojectType: "",
changeCondition: false,
clickNum: 0,
timeRange: []
timeRange: [],
learnBgMore: false
});
// 封面图选择
const handleChangeSelect = (value) => {
console.log(value);
@@ -534,9 +590,23 @@ export default {
return current && current < dayjs().subtract(1, 'days').endOf('day')
};
//显示更多路径背景弹窗
const showLearnBgMore = () => {
state.learnBgMore = true;
};
//关闭更多路径背景弹窗
const closeLearnBgMore = () => {
state.learnBgMore = false;
};
function calendarChange(date, dateStr, partial) {
state.datePartial = partial
}
const chooseImg2 = (item) => {
// console.log(item);
state.pathBgId = item.code;
state.pathBg = item.value.split(',')[0];
state.mobilePicUrl = item.value.split(',')[1];
};
return {
...toRefs(state),
@@ -550,6 +620,9 @@ export default {
backPage,
templateScroll,
handleChangeSelect,
showLearnBgMore,
closeLearnBgMore,
chooseImg2
};
},
};
@@ -729,6 +802,33 @@ export default {
width: 100%;
// height: 40px;
}
.btn {
width: 33%;
margin-top: 30px;
display: flex;
justify-content: space-between;
margin-bottom: 30px;
.samtn {
width: 100px;
height: 40px;
font-size: 14px;
border: 1px solid #4ea6ff;
border-radius: 8px;
cursor: pointer;
}
.btn1 {
background-color: #fff;
color: #4ea6ff;
}
.btn2 {
background-color: #4ea6ff;
color: #fff;
}
}
}
.filebox {
@@ -871,6 +971,106 @@ export default {
}
}
.learnBgMoreModal {
.ant-modal {
width: 680px !important;
height: 528px !important;
.ant-modal-content {
width: 680px !important;
height: 528px !important;
.ant-modal-body {
width: 680px !important;
height: 528px !important;
padding: 0 !important;
.main {
display: flex;
flex-direction: column;
.top {
padding-left: 51px;
padding-right: 51px;
padding-top: 28px;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
.topc {
font-size: 16px;
font-weight: bold;
color: #000000;
line-height: 36px;
}
}
.imagesBox {
display: flex;
// justify-content: space-between;
flex-wrap: wrap;
padding-left: 51px;
padding-right: 39px;
margin-top: 20px;
height: 350px;
overflow-y: auto;
.learnBgItem {
border-radius: 8px;
width: 136px;
height: 106px;
background-size: 100%;
background-repeat: no-repeat;
margin-bottom: 20px;
margin-right: 10px;
}
}
.btn {
width: 100%;
position: absolute;
bottom: 30px;
margin-top: 30px;
display: flex;
justify-content: center;
.samtn {
width: 100px;
height: 40px;
font-size: 14px;
border: 1px solid #4ea6ff;
border-radius: 8px;
cursor: pointer;
}
.btn1 {
background-color: #fff;
color: #4ea6ff;
}
.btn2 {
background-color: #4ea6ff;
color: #fff;
margin-left: 16px;
}
}
}
}
}
}
}
.btn1 {
background-color: #fff;
color: #4ea6ff;
}
.btn2 {
background-color: #4ea6ff;
color: #fff;
margin-left: 16px;
}
.treeDropdown {
// width: 240px !important;
// border-radius: 5px;

View File

@@ -48,7 +48,7 @@
<!--
<a-range-picker
:show-time="{ format: 'HH:mm' }"
:disabled-date="disabledDate" :disabled-time="disabledRangeTime"
:disabled-date="disabledDate" :disabled-time="disabledRangeTime"
v-model:value="searchParam.valueDate"
format="YYYY-MM-DD"
style="border-radius: 8px; height: 40px; margin-left: 5px"
@@ -169,14 +169,14 @@
<DropDown v-if="checkPer(record.permissions)" value="授权">
<OwnerTableModelStudent
:types="[4, 5, 6]"
:id="record.projectId"
:id="record.id"
:type="6"
>权限名单</OwnerTableModelStudent
>
<CommonStudent :type="4" :id="record.projectId" title="查看权"
<CommonStudent :type="4" :id="record.id" title="查看权"
>查看权</CommonStudent
>
<CommonStudent :type="5" :id="record.projectId" title="管理权"
<CommonStudent :type="5" :id="record.id" title="管理权"
>管理权</CommonStudent
>
</DropDown>
@@ -205,7 +205,7 @@
>
<a-button
v-if="record.status !== -1 && record.type === 3"
@click="showBackFinashModal(record.projectId)"
@click="showBackFinashModal(record.id)"
type="link"
>撤回</a-button
>
@@ -1478,15 +1478,15 @@ export default {
customRender: (value) => {
return (
<div>
{value.record.type === 3
{value.record.status === 3
? {
0: "未审核",
1: "审核",
2: "审核",
3: "已审核",
4: "已审核",
"-1": "已审核",
"-5": "拒绝",
0: "草稿",
1: "提交待审核",
2: "审核通过",
3: "已经发布",
4: "发布",
"-1": "已结束",
"-6": "撤回已结束",
}[value.record.status + ""] || ""
: "-"}
</div>
@@ -1668,7 +1668,7 @@ export default {
function manage(record) {
router.push({
path: "/taskpage",
query: { projectId: record.projectId },
query: { projectId: record.id },
});
}
@@ -2688,4 +2688,4 @@ export default {
}
}
}
</style>
</style>

View File

@@ -250,19 +250,19 @@
">
<div class="opa">
<div class="opacation">
<span v-if="element.type !== 5" style="
<span style="
color: #4ea6ff;
margin-right: 25px;
cursor: pointer;
" @click="editTaskForType(element,index)">
编辑
</span>
<span v-else style="
color: #4ea6ff;
margin-right: 55px;
cursor: pointer;
">
</span>
<!--<span v-else style="-->
<!--color: #4ea6ff;-->
<!--margin-right: 55px;-->
<!--cursor: pointer;-->
<!--">-->
<!--</span>-->
<span style="color: #4ea6ff; cursor: pointer" @click="showDelete(index)">
删除
</span>
@@ -668,7 +668,7 @@ const deleteStage = () => {
return
}
projectInfo.value.stageList.splice(activeIndex.value, 1);
activeIndex.value = activeIndex.value-1;
activeIndex.value && (activeIndex.value = activeIndex.value-1);
deleteStageModal.value = false;
};
onMounted(() => {

View File

@@ -291,8 +291,8 @@
<div>
<span class="nub1" style="color: #5dc988">{{
projectInfoOverview.onlineCourseCnt
}}</span
><span style="color: #5dc988; font-size: 14px">%</span>
}}</span>
<!-- <span style="color: #5dc988; font-size: 14px">%</span> -->
</div>
<div class="nub2">在线课程数</div>
</div>
@@ -300,8 +300,8 @@
<div>
<span class="nub1" style="color: #ff90ae">{{
projectInfoOverview.offLineCourseCnt
}}</span
><span style="color: #ff90ae; font-size: 14px">%</span>
}}</span>
<!-- <span style="color: #ff90ae; font-size: 14px">%</span> -->
</div>
<div class="nub2">面授课程数</div>
</div>
@@ -416,9 +416,9 @@
<div class="split"></div>
<div class="onerow">
<div class="taskmain">任务大纲</div>
<!-- 2022-11-30注释 后面放开 -->
<!-- <button class="btn" @click="showFaceIn" v-if="morFaceT"> -->
<button class="btn" @click="showFaceIn">批量面授报名</button>
<ImpoterGroupLeader title="批量面授报名" :data="{targetId:projectId,type:1}" :url="`/admin/offcourse/importCourse`" :template-url="`/admin/project/exportTaskCoursePlan/${projectId}?type=1&taskType=2&thirdType=3`">
<button class="btn">批量面授报名</button>
</ImpoterGroupLeader>
<router-link
v-if="checkPer(permissions)"
:to="{ path: `/taskadd`, query: { projectId: projectId } }"
@@ -758,7 +758,7 @@
<div class="btn2" @click="exportGroup">
<span class="btn2text">导出小组</span>
</div>
<ImpoterGroupLeader :url="`/admin/studentGroup/importGroup`" :template-url="`/admin/studentGroup/exportGroup/${projectId}`">
<ImpoterGroupLeader :data="{targetId:projectId,type:1}" :url="`/admin/studentGroup/importGroup`" :template-url="`/admin/studentGroup/exportGroup/${projectId}`">
<div class="btn2">
<span class="btn2text">导入小组长</span>
</div>
@@ -1544,8 +1544,6 @@
types="2"
classify="2"
/>
<!-- 批量面授报名 -->
<task-imp-stu v-model:TaskFaceImpStuvisible="TaskFaceImpStuvisible" />
<!-- 概览(无数据)-项目发布弹窗 -->
<div>
<a-modal
@@ -2135,7 +2133,6 @@ import SeeStu from "../../components/drawers/SeeStu";
import ChangeGroup from "../../components/drawers/ChangeGroup";
import NoticePub from "../../components/drawers/NoticePub";
import NoticeHis from "../../components/drawers/NoticeHis";
import TaskImpStu from "../../components/drawers/TaskFaceIn";
import { storage } from "../../api/storage";
import * as api from "../../api/index1";
import * as apis from "../../api/index";
@@ -2191,7 +2188,6 @@ export default {
ChangeGroup,
NoticePub,
ProjectScore,
TaskImpStu,
projSet,
NoticeHis,
TwoDimensionalCode,