This commit is contained in:
dongruihua
2023-03-01 09:17:39 +08:00
30 changed files with 773 additions and 1219 deletions

4
.env
View File

@@ -27,10 +27,10 @@ VUE_APP_UP_LOAD_STUDENT_TEMPLATE=导入学员模版-1673963663229.xlsx
VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=外部考试学员成绩导入模板-1676551319283.xlsx VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=外部考试学员成绩导入模板-1676551319283.xlsx
#在线 #在线
VITE_BOE_ONLINE_CLASS_URL=//u-pre.boe.com/pc/course/studyindex?id= VUE_APP_ONLINE_CLASS_URL=//u-pre.boe.com/mobile/pages/study/courseStudy?id=
#案例 #案例
VITE_BOE_CASS_DETAIL_URL=//u-pre.boe.com/pc/case/detail?id= VITE_BOE_CASS_DETAIL_URL=//u-pre.boe.com/pc/case/detail?id=
#考试 #考试
VITE_BOE_EXAM_DETAIL_URL=//u-pre.boe.com/pc/exam/test?id= VUE_APP_EXAM_DETAIL_URL=//u-pre.boe.com/mobile/pages/exam/exam?id=
#h5的基本url #h5的基本url
VUE_APP_H5=//u-pre.boe.com/student-h5 VUE_APP_H5=//u-pre.boe.com/student-h5

View File

@@ -11,6 +11,6 @@ VUE_APP_UP_LOAD_STUDENT_TEMPLATE=coursefile/导入学员模版-1677140876274.xls
# 外部考试导入成绩模板 # 外部考试导入成绩模板
VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=coursefile/外部考试学员成绩导入模板-1677055614438.xlsx VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=coursefile/外部考试学员成绩导入模板-1677055614438.xlsx
#在线 #在线
VITE_BOE_ONLINE_CLASS_URL=//u-pre.boe.com/pc/course/studyindex?id= VUE_APP_ONLINE_CLASS_URL=//u-pre.boe.com/mobile/pages/study/courseStudy?id=
VITE_BOE_CASS_DETAIL_URL=//u-pre.boe.com/pc/case/detail?id= VITE_BOE_CASS_DETAIL_URL=//u-pre.boe.com/pc/case/detail?id=
VITE_BOE_EXAM_DETAIL_URL=//u-pre.boe.com/pc/exam/test?id= VUE_APP_EXAM_DETAIL_URL=//u-pre.boe.com/mobile/pages/exam/exam?id=

View File

@@ -17,6 +17,6 @@ VUE_APP_UP_LOAD_STUDENT_TEMPLATE=导入学员模版-1673963663229.xlsx
# 外部考试导入成绩模板 # 外部考试导入成绩模板
VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=外部考试学员成绩导入模板-1676551319283.xlsx VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=外部考试学员成绩导入模板-1676551319283.xlsx
VITE_BOE_ONLINE_CLASS_URL=//u.boe.com/pc/course/studyindex?id= VUE_APP_ONLINE_CLASS_URL=//u.boe.com/mobile/pages/study/courseStudy?id=
VITE_BOE_CASS_DETAIL_URL=//u.boe.com/pc/case/detail?id= VITE_BOE_CASS_DETAIL_URL=//u.boe.com/pc/case/detail?id=
VITE_BOE_EXAM_DETAIL_URL=//u.boe.com/pc/exam/test?id= VUE_APP_EXAM_DETAIL_URL=//u.boe.com/mobile/pages/exam/exam?id=

View File

@@ -16,6 +16,6 @@ VUE_APP_COURSE_STUDY=//u.boe.com/pc-release/course/studyindex?id=
VUE_APP_UP_LOAD_STUDENT_TEMPLATE=导入学员模版-1673963663229.xlsx VUE_APP_UP_LOAD_STUDENT_TEMPLATE=导入学员模版-1673963663229.xlsx
# 外部考试导入成绩模板 # 外部考试导入成绩模板
VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=外部考试学员成绩导入模板-1676551319283.xlsx VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE=外部考试学员成绩导入模板-1676551319283.xlsx
VITE_BOE_ONLINE_CLASS_URL=//u.boe.com/pc-release/course/studyindex?id= VUE_APP_ONLINE_CLASS_URL=//u.boe.com/mobile/pages/study/courseStudy?id=
VITE_BOE_CASS_DETAIL_URL=//u.boe.com/pc-release/case/detail?id= VITE_BOE_CASS_DETAIL_URL=//u.boe.com/pc-release/case/detail?id=
VITE_BOE_EXAM_DETAIL_URL=//u.boe.com/pc-release/exam/test?id= VUE_APP_EXAM_DETAIL_URL=//u.boe.com/mobile/pages/exam/exam?id=

BIN
src/assets/images/evImg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

View File

@@ -948,7 +948,7 @@ export default {
process.env.VUE_APP_BASE_API + process.env.VUE_APP_BASE_API +
`/admin/student/studentSign?taskId=${props.datasource.id}&taskType=${ `/admin/student/studentSign?taskId=${props.datasource.id}&taskType=${
props.datasource.type props.datasource.type
}&type=${2}`, }&type=${1}`,
}; };
console.log("codeInfo", state.codeInfo); console.log("codeInfo", state.codeInfo);
state.codeIndex = 0; state.codeIndex = 0;

View File

@@ -60,87 +60,7 @@
</div> </div>
</div> </div>
<div class="contentMain nolimits" v-else> <div class="contentMain nolimits" v-else>
<div class="limitstext1"> <img style="width: 700px" src="../../assets/images/evImg.png" />
抱歉,您没有关联测评的权限,您可以联系下方管理员开启权限
</div>
<div class="limitstext2">测评工具介绍</div>
<div class="limitsRow">
<div class="limitsRowDrop"></div>
<div class="limitsRowText">
人才发展项目中恰当运用测评手段可以更为精准地定位培训需求,更有针对性地设计培养项目和课程;同时,也能够帮助学员精准认知自身问题,提高在项目中的参与度。
</div>
</div>
<div class="limitsRow" style="margin-top: 10px">
<div class="limitsRowDrop"></div>
<div class="limitsRowText">
BOEU测评部经过多年的额实践积累了一套覆盖“能力、性格和动力”三大方面的测评工具可在人才发展项目中选择使用。
</div>
</div>
<div class="tool" v-for="(item, key) in toolList" :key="key">
<div
class="toolName"
:style="{
backgroundColor:
key === 0
? 'rgba(0, 77, 126)'
: key === 1
? 'rgba(184, 0, 0)'
: 'rgba(46, 129, 83)',
}"
>
<div>{{ item.name[0] }}</div>
<div>{{ item.name[1] }}</div>
</div>
<div class="toolEvery1" v-for="(i, k) in item.children" :key="k">
<div
class="toolEveryText1"
:style="{
color:
key === 0
? 'rgba(5,75,120)'
: key === 1
? 'rgba(169,3,3)'
: 'rgba(44,120,79)',
}"
>
{{ i.text1 }}
</div>
<div class="toolEveryText2">{{ i.text2 }}</div>
<div
class="toolEveryText3"
v-if="i.text3"
:style="{
color:
key === 0
? 'rgba(5,75,120)'
: key === 1
? 'rgba(169,3,3)'
: 'rgba(44,120,79)',
}"
>
{{ i.text3 }}
</div>
<div class="toolEveryText4" v-if="i.text4">{{ i.text4 }}</div>
</div>
</div>
<div class="limitsRow">
<div class="limitsRowDrop"></div>
<div class="limitsRowText">
如项目中有测评需求请您联系BOEU测评部
</div>
</div>
<div class="limitsRow" style="align-items: flex-start">
<div class="limitsRowDrop"></div>
<div style="margin-top: 10px">
<div class="limitsRowText">联系人:</div>
<div class="limitsRowText">
王逸10167304 联系电话010-60965646
</div>
<div class="limitsRowText">
宋哲10157955 联系电话010-60965435
</div>
</div>
</div>
</div> </div>
<div class="main_btns"> <div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button> <button class="btn1" @click="closeDrawer">取消</button>
@@ -155,67 +75,67 @@ import { useBoeApiPage } from "@/api/request";
import { TEST_PAGE } from "@/api/ThirdApi"; import { TEST_PAGE } from "@/api/ThirdApi";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import { useStore } from "vuex"; import { useStore } from "vuex";
const toolList = ref([ // const toolList = ref([
{ // {
name: ["能力类", "测验工具"], // name: ["能力类", "测验工具"],
children: [ // children: [
{ // {
text1: "职场准备度测评", // text1: "职场准备度测评",
text2: "无工作经验学生", // text2: "无工作经验学生",
text3: "职业能力成熟度测评", // text3: "职业能力成熟度测评",
text4: "五年以内工龄员工", // text4: "五年以内工龄员工",
}, // },
{ // {
text1: "职业认知能力测评", // text1: "职业认知能力测评",
text2: "五年内工龄员工", // text2: "五年内工龄员工",
text3: "商业推荐测评", // text3: "商业推荐测评",
text4: "五年内工龄员工", // text4: "五年内工龄员工",
}, // },
{ // {
text1: "沟通能力测评", // text1: "沟通能力测评",
text2: "五年内工龄员工", // text2: "五年内工龄员工",
text3: "情商测评", // text3: "情商测评",
text4: "各层级人员", // text4: "各层级人员",
}, // },
{ // {
text1: "管理行为自检问卷", // text1: "管理行为自检问卷",
text2: "//高层管理者", // text2: "//高层管理者",
text3: "管理者情境判断测评", // text3: "管理者情境判断测评",
text4: "/中高层管理者", // text4: "/中高层管理者",
}, // },
], // ],
}, // },
{ // {
name: ["性格/风格", "测验工具"], // name: ["性格/风格", "测验工具"],
children: [ // children: [
{ // {
text1: "PDP性格类型测验", // text1: "PDP性格类型测验",
text2: "各层级人员", // text2: "各层级人员",
}, // },
{ // {
text1: "大五职业性格测评", // text1: "大五职业性格测评",
text2: "各层级人员", // text2: "各层级人员",
}, // },
{ // {
text1: "领导风格测验", // text1: "领导风格测验",
text2: "各层级人员", // text2: "各层级人员",
}, // },
], // ],
}, // },
{ // {
name: ["动机/价值观", "测验工具"], // name: ["动机/价值观", "测验工具"],
children: [ // children: [
{ // {
text1: "动机测验内隐&外显", // text1: "动机测验内隐&外显",
text2: "各层级人员", // text2: "各层级人员",
}, // },
{ // {
text1: "职业兴趣测验", // text1: "职业兴趣测验",
text2: "各层级人员", // text2: "各层级人员",
}, // },
], // ],
}, // },
]); // ]);
const props = defineProps({ const props = defineProps({
taskList: [], taskList: [],
evaluationTypeId: String, evaluationTypeId: String,

View File

@@ -358,7 +358,6 @@ export default {
}; };
//把数据放到state里 //把数据放到state里
const getTableDataList = (tableData) => { const getTableDataList = (tableData) => {
debugger
let data = tableData; let data = tableData;
let array = []; let array = [];
data.map((value) => { data.map((value) => {

View File

@@ -402,8 +402,8 @@ export default {
taskId: props.datasource.courseId, taskId: props.datasource.courseId,
targetId: props.datasource.projectId targetId: props.datasource.projectId
}).then(res=>{ }).then(res=>{
state.tabledata = res.data.data.managementDtoList; state.tabledata = res.data.data.managementDtoList.records;
state.tableDataTotal = res.data.data.total; state.tableDataTotal = res.data.data.managementDtoList.total;
state.loadingData = false; state.loadingData = false;
}) })
} }

View File

@@ -403,8 +403,8 @@ export default {
taskId: props.datasource.courseId, taskId: props.datasource.courseId,
targetId: props.datasource.routerId targetId: props.datasource.routerId
}).then(res => { }).then(res => {
state.tabledata = res.data.data.managementDtoList; state.tabledata = res.data.data.managementDtoList.records;
state.tableDataTotal = res.data.data.total; state.tableDataTotal = res.data.data.managementDtoList.total;
state.loadingData = false; state.loadingData = false;
}) })
} }

View File

@@ -1,20 +1,18 @@
<template> <template>
<a-input <a-input
v-model:value="modelV" v-model:value="modelV.value"
:placeholder="placeholder" :placeholder="placeholder"
:show-count="showCount" :show-count="showCount"
:maxlength="maxlength" :maxlength="maxlength"
:validate="validate"
@change="validateProName"
/> />
<div style="color: red; font-size: 10px" v-if="modelV && !validated"> <div style="color: red; font-size: 10px" v-if="modelV.value && validated===0">
名称重复请重新输入 名称重复请重新输入
</div> </div>
</template> </template>
<script setup> <script setup>
import {defineProps, defineEmits, watch, ref, onMounted} from "vue"; import {defineProps, defineEmits, watch, ref} from "vue";
import {validateName} from "@/api/index1"; import {validateName} from "@/api/index1";
import {throttle} from "@/api/method"; import {Form} from "ant-design-vue";
const props = defineProps({ const props = defineProps({
value: { value: {
@@ -38,70 +36,70 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
validated: {
type: Number,
default: 0,
}
}); });
const emit = defineEmits({}); const emit = defineEmits(["update:value",'update:validated']);
const modelV = ref(); const modelV = ref({
value: props.value
const validating = ref(false)
const validated = ref(true)
onMounted(() => {
modelV.value = props.value;
}); });
watch( const rulesRef = ref({
() => props.value, value: [{
() => { required: true,
if (props.value !== modelV.value) { validator: validateValue,
modelV.value = props.value; trigger: "change",
message: "请输入名称",
},
],
});
Form.useForm(modelV, rulesRef, { debounce: { wait: 800 } });
watch(props, () => {
modelV.value.value = props.value;
});
watch(() => modelV.value.value, () => {
emit("update:validated", 1);
emit("update:value", modelV.value.value);
});
async function validateValue() {
if (!modelV.value.value) {
return Promise.reject("请输入名称");
}
return validateName({ name: modelV.value.value, type: props.type, id: props.id }).then(res => {
if (res.data.data === 1) {
emit("update:validated", 0);
return Promise.reject("名称重复");
} }
emit("update:validated", 2);
return Promise.resolve();
} }
); );
watch(modelV, () => {
emit("update:value", modelV.value);
});
function validate() {
console.log('validate')
;
}
function validateNameFun() {
validateName({name: props.value, type: props.type, id: props.id}).then(res => {
validating.value = false
validated.value = res.data.data !== 1
}
)
}
const throttleValidateName = throttle(validateNameFun, 500)
function validateProName() {
validating.value = true
validated.value = true
props.value && throttleValidateName()
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.pro { .pro {
.ant-input-affix-wrapper { .ant-input-affix-wrapper {
padding: 4px 8px; padding: 4px 8px;
border-radius: 8px; border-radius: 8px;
}
} }
.road { }
.road {
.ant-input-affix-wrapper { .ant-input-affix-wrapper {
padding: 0px 8px; padding: 0px 8px;
border-radius: 8px; border-radius: 8px;
} }
} }
.b_input, .b_input,

View File

@@ -401,8 +401,9 @@ const getStu = () => {
arr.map((value) => { arr.map((value) => {
let obj = { let obj = {
id: value.id, id: value.id,
studentId: value.studentId,
realName: value.studentName, realName: value.studentName,
userNo: value.studentId, userNo: value.studentUserNo,
isLeader: value.isLeader, isLeader: value.isLeader,
groupId: value.groupId, groupId: value.groupId,
orgName: value.studentOrgName ? value.studentOrgName : "-", orgName: value.studentOrgName ? value.studentOrgName : "-",
@@ -792,7 +793,6 @@ function handleDialogOk() {
} }
function handleStageOk() { function handleStageOk() {
// debugger
// 判断添加人数是否已超过限制人数 限制 = 本次添加的人 + 原有的人 // 判断添加人数是否已超过限制人数 限制 = 本次添加的人 + 原有的人
if (props.type === 1) { if (props.type === 1) {
if (props.groupMemberCount !== null) { // 只有添加组员的时候判断 if (props.groupMemberCount !== null) { // 只有添加组员的时候判断
@@ -804,21 +804,26 @@ function handleStageOk() {
if (haveGroupNum.length > 0) { if (haveGroupNum.length > 0) {
message.warning("部分学员已经有小组,再次添加会被添加到当前小组."); message.warning("部分学员已经有小组,再次添加会被添加到当前小组.");
} }
// 判断是否是组长,组长不能添加
const leaderArray = selectsData.value.projectMemberList.filter(item => item.isLeader === "1");
if (leaderArray.length > 0) {
return message.warning("当前选中学员" + leaderArray[0].realName + "已是小组长,请勿重复选择。");
}
} else if (activeKey.value === 1) { } else if (activeKey.value === 1) {
selectMember = selectsData.value.studentList.length; selectMember = selectsData.value.studentList.length;
} else if (activeKey.value === 2) { } else if (activeKey.value === 2) {
selectMember = selectsData.value.groupList.length; selectMember = selectsData.value.groupList.length;
} else if (activeKey.value === 3) { } else if (activeKey.value === 3) {
selectMember = selectsData.value.deptList.length; selectMember = selectsData.value.deptList.length;
} }
if (props.groupMemberCount < selectMember + Number(props.groupMemberNumber)) { if (props.groupMemberCount < selectMember + Number(props.groupMemberNumber)) {
return message.warning("添加小组学员超过最大值"); return message.warning("添加小组学员超过最大值");
} }
// 判断是否是组长,组长不能添加
const leaderArray = selectsData.value.projectMemberList.filter(item => item.isLeader === "1");
if (leaderArray.length > 0) {
return message.warning("当前选中学员" + leaderArray[0].realName + "已是小组长,请勿重复选择。");
}
} }
} }

View File

@@ -93,7 +93,6 @@ import { reactive, toRefs } from "vue";
import * as api from "@/api/index1"; import * as api from "@/api/index1";
import OrgClass from "@/components/project/OrgClass"; import OrgClass from "@/components/project/OrgClass";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import { toDate } from "@/api/method";
import dayjs from "dayjs"; import dayjs from "dayjs";
export default { export default {
name: "TableCertificateStudent", name: "TableCertificateStudent",
@@ -160,17 +159,7 @@ export default {
key: "createTime", key: "createTime",
width: 60, width: 60,
align: "center", align: "center",
className: "h", className: "h"
customRender: (record) => {
// console.log(text.record.checked1);
return (
<div>
{record.record.createTime
? toDate(record.record.createTime / 1000, "Y-M-D h:m")
: "-"}
</div>
);
},
}, },
{ {
title: "操作", title: "操作",

View File

@@ -9,70 +9,70 @@
import {createStore} from "vuex"; import {createStore} from "vuex";
// import * as api from '../api/index1' // import * as api from '../api/index1'
export default createStore({ export default createStore({
state: { state: {
openpages: localStorage.getItem("openpages") openpages: localStorage.getItem("openpages")
? JSON.parse(localStorage.getItem("openpages")) ? JSON.parse(localStorage.getItem("openpages"))
: [ : [
{ {
pagename: "学习路径图", pagename: "学习路径图",
href: "/learningpath", href: "/learningpath",
active: true, active: true,
}, },
], ],
assessmentName: "", assessmentName: "",
routerId: null, routerId: null,
projectTemplateId: null, projectTemplateId: null,
userInfo: {}, userInfo: {},
orgtreeList: [], orgtreeList: [],
faceclassPic: null, faceclassPic: null,
faceclassClass: [], faceclassClass: [],
faceclassScene: [], faceclassScene: [],
projectLevel: [],//项目级别 projectLevel: [],//项目级别
projectSys: [],//培训分类 projectSys: [],//培训分类
pathmapPic: [],//学习路径背景图 pathmapPic: [],//学习路径背景图
memberInitInfo: [],//学员默认 memberInitInfo: [],//学员默认
sysType: [],//学员默认 sysType: [],//学员默认
menus:[] menus: []
},
getters: {},
mutations: {
chengeOpenpages(state, list) {
// console.log('list', list)
state.openpages = list;
}, },
getters: {}, chengeRouterId(state, routerId) {
mutations: { // console.log('list', list)
chengeOpenpages(state, list) { state.routerId = routerId;
// console.log('list', list)
state.openpages = list;
},
chengeRouterId(state, routerId) {
// console.log('list', list)
state.routerId = routerId;
},
SET_assessmentName(state, name) {
state.assessmentName = name;
console.log("state.assessmentName");
console.log(state.assessmentName);
},
//获取组织树
getOrgtreeList(state, data) {
state.orgtreeList = data
},
SET_DICT(state, {key, data}) {
state[key] = data
},
SET_MEMBER_INFO(state, data) {
state.memberInitInfo = data
},
SET_USER(state, userInfo) {
state.userInfo = userInfo
},
SET_projectTemplateId(state, projectTemplateId) {
state.projectTemplateId = projectTemplateId;
},
SET_PERMISSION(state,permissions){
state.menus = permissions;
}
}, },
actions: {},
modules: {}, SET_assessmentName(state, name) {
state.assessmentName = name;
console.log("state.assessmentName");
console.log(state.assessmentName);
},
//获取组织树
getOrgtreeList(state, data) {
state.orgtreeList = data;
},
SET_DICT(state, { key, data }) {
state[key] = data;
},
SET_MEMBER_INFO(state, data) {
state.memberInitInfo = data;
},
SET_USER(state, userInfo) {
userInfo.avatar = userInfo.avatar?.includes(process.env.VUE_APP_FILE_PATH) ? userInfo.avatar : (process.env.VUE_APP_FILE_PATH + userInfo.avatar);
state.userInfo = userInfo;
},
SET_projectTemplateId(state, projectTemplateId) {
state.projectTemplateId = projectTemplateId;
},
SET_PERMISSION(state, permissions) {
state.menus = permissions;
}
},
actions: {},
modules: {},
}); });

View File

@@ -135,10 +135,11 @@
<NameInput <NameInput
placeholder="请输入课程名称" placeholder="请输入课程名称"
v-model:value="xzinputV1" v-model:value="xzinputV1"
v-model:validate="validate" v-model:validated="validated"
:id="offcourseId"
:maxlength="20" :maxlength="20"
show-count show-count
:type="3" :type="2"
></NameInput> ></NameInput>
<!-- <a-input--> <!-- <a-input-->
<!-- v-model:value="xzinputV1"--> <!-- v-model:value="xzinputV1"-->
@@ -286,9 +287,9 @@
<div class="btn btn5" @click="of_exit1"> <div class="btn btn5" @click="of_exit1">
<div class="btnText">取消</div> <div class="btnText">取消</div>
</div> </div>
<div class="btn btn6" @click="createft"> <a-button class="btn btn6" @click="createft" :loading="validated===1">
<div class="btnText">确定</div> 确定
</div> </a-button>
</div> </div>
</div> </div>
</div> </div>
@@ -918,10 +919,10 @@
<NameInput <NameInput
maxlength="30" maxlength="30"
v-model:value="xjkkinputV1" v-model:value="xjkkinputV1"
v-model:validate="validate" v-model:validated="validated"
show-count show-count
:id="offcourseId" :id="offcoursePlanId"
:type="2" :type="5"
style="width: 440px; height: 40px; border-radius: 8px" style="width: 440px; height: 40px; border-radius: 8px"
placeholder="请输入开课名称" placeholder="请输入开课名称"
></NameInput> ></NameInput>
@@ -1168,9 +1169,9 @@
<div class="cstm_btn btn5" @click="handleCancelStu"> <div class="cstm_btn btn5" @click="handleCancelStu">
<div class="btnText">取消</div> <div class="btnText">取消</div>
</div> </div>
<div class="cstm_btn btn6" @click="handleSureStu"> <a-button class="cstm_btn btn6" @click="handleSureStu" :loading="validated===1">
<div class="btnText">确定</div> 确定
</div> </a-button>
</div> </div>
</div> </div>
</div> </div>
@@ -2575,7 +2576,7 @@ export default defineComponent({
imageUrl: "", imageUrl: "",
imgList: [], imgList: [],
validate: true, validated: 0,
attach: "", attach: "",
pageSize2: 10, pageSize2: 10,
currentPage2: 0, currentPage2: 0,
@@ -3501,9 +3502,7 @@ export default defineComponent({
return message.warning("请输入必填项"); return message.warning("请输入必填项");
} }
console.log("state.validate", state.validate); if (!state.validated == 2) {
if (!state.validate) {
message.destroy(); message.destroy();
return message.warning("该课程名称已存在"); return message.warning("该课程名称已存在");
} }

View File

@@ -13,16 +13,13 @@
<iframe <iframe
id="iframe" id="iframe"
style="width: 100%; height: 100%" style="width: 100%; height: 100%"
:src="iframeUrl + '/course/manages'" :src="iframeUrl + '/course/manages?page=manage'"
frameborder="0" frameborder="0"
name="myframe" name="myframe"
security="restricted" security="restricted"
sandbox="allow-forms allow-scripts allow-same-origin allow-popups" sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
></iframe> ></iframe>
<OnlineClassModelStudent ref="stuRef"></OnlineClassModelStudent> <OnlineClassModelStudent ref="stuRef"></OnlineClassModelStudent>
<div @click="test">
测试
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
@@ -35,10 +32,6 @@ const stuRef = ref()
onMounted(() => { onMounted(() => {
window.openSelectStu = stuRef.value.openDrawer window.openSelectStu = stuRef.value.openDrawer
}) })
function test() {
window.openSelectStu()
}
</script> </script>
<style lang="scss"> <style lang="scss">
.courseManage { .courseManage {

View File

@@ -54,7 +54,7 @@
ref="inputRef" ref="inputRef"
placeholder="请输入课程名称" placeholder="请输入课程名称"
v-model:value="qdms_inputV1" v-model:value="qdms_inputV1"
v-model:validate="validate" v-model:validated="validated"
:maxlength="20" :maxlength="20"
show-count show-count
:type="2" :type="2"
@@ -457,9 +457,9 @@
<div class="btn btn5" @click="noEditClose"> <div class="btn btn5" @click="noEditClose">
<div class="btnText">取消</div> <div class="btnText">取消</div>
</div> </div>
<div class="btn btn6" @click="handlePush"> <a-button class="btn btn6" @click="handlePush" :loading="validated===1">
<div class="btnText">保存</div> <div class="btnText">保存</div>
</div> </a-button>
</div> </div>
</div> </div>
</div> </div>
@@ -507,7 +507,7 @@
</div> </div>
<div class="btn"> <div class="btn">
<button class="samtn btn1" @click="closeLearnBgMore">取消</button> <button class="samtn btn1" @click="closeLearnBgMore">取消</button>
<button class="samtn btn2" @click="closeLearnBgMore">确定</button> <a-button class="samtn btn2" @click="closeLearnBgMore">确定</a-button>
</div> </div>
</div> </div>
</a-modal> </a-modal>
@@ -556,7 +556,7 @@ export default defineComponent({
hideshow: true, hideshow: true,
ft_eidt: false, ft_eidt: false,
attach: "", attach: "",
validate: true, validated: 0,
ft_hs: false, ft_hs: false,
addLoading: false, addLoading: false,
statusJuJue: 0, statusJuJue: 0,

View File

@@ -3,7 +3,7 @@
<iframe <iframe
id="iframe" id="iframe"
style="width: 100%; height: 100%" style="width: 100%; height: 100%"
:src="iframeUrl + '/iframe/course/reviewed'" :src="iframeUrl + '/pc/iframe/course/reviewed'"
frameborder="0" frameborder="0"
name="myframe" name="myframe"
security="restricted" security="restricted"

View File

@@ -3,7 +3,7 @@
<iframe <iframe
id="iframe" id="iframe"
style="width: 100%; height: 100%" style="width: 100%; height: 100%"
:src="iframeUrl + '/iframe/course/noapproved'" :src="iframeUrl + '/pc/iframe/course/noapproved'"
frameborder="0" frameborder="0"
name="myframe" name="myframe"
security="restricted" security="restricted"

View File

@@ -210,7 +210,7 @@
<NameInput <NameInput
placeholder="请输入路径名称" placeholder="请输入路径名称"
v-model:value="pathName" v-model:value="pathName"
v-model:validate="validate" v-model:validated="validated"
:maxlength="20" :maxlength="20"
show-count show-count
:type="3" :type="3"
@@ -285,7 +285,7 @@
<a-button <a-button
class="samtn btn2" class="samtn btn2"
@click="createLearnPath" @click="createLearnPath"
:loading="confirmLoading" :loading="confirmLoading || validated === 1"
>确定</a-button >确定</a-button
> >
</div> </div>
@@ -780,6 +780,7 @@ export default {
selectTime: null, selectTime: null,
sh: false, sh: false,
validate: true, validate: true,
validated: 0,
tableData: [ tableData: [
// { // {
// key: 1, // key: 1,

View File

@@ -2595,13 +2595,10 @@ export default {
if (item.type == 1) { if (item.type == 1) {
if (item.taskStatus == 1 || item.taskStatus == 2) if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。"); return message.error("该任务无法学习,请联系管理员进行替换。");
window.open( codeUrl =
window.location.protocol + window.location.protocol +
import.meta.env.VUE_APP_BOE_API_URL + process.env.VUE_APP_ONLINE_CLASS_URL +
"/mobile/pages/study/courseStudy?id=" + item.targetId;
item.targetId,
"_top"
);
} }
if (item.type == 2) { if (item.type == 2) {
let date1 = new Date(item.endTime).getTime(); let date1 = new Date(item.endTime).getTime();
@@ -2629,7 +2626,7 @@ export default {
"/homeworkpage?courseId=" + "/homeworkpage?courseId=" +
item.courseId + item.courseId +
"&type=2&id=" + "&type=2&id=" +
item.routerTaskId; item.id;
} }
// 考试 停用 // 考试 停用
if (item.type == 5) { if (item.type == 5) {
@@ -2642,6 +2639,11 @@ export default {
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/externalexam?courseId=" + "/externalexam?courseId=" +
item.courseId; item.courseId;
} else {
codeUrl =
window.location.protocol +
process.env.VUE_APP_EXAM_DETAIL_URL +
item.targetId;
} }
} }
// 直播结束时间 // 直播结束时间
@@ -2652,10 +2654,10 @@ export default {
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/livebroadcast?courseId=" + "/liveboradcast?courseId=" +
item.courseId + item.courseId +
"&type=2&id=" + "&type=2&id=" +
item.routerTaskId; item.id;
} }
// 外链 // 外链
if (item.type == 7) { if (item.type == 7) {
@@ -2665,7 +2667,7 @@ export default {
"/outerchain?courseId=" + "/outerchain?courseId=" +
item.courseId + item.courseId +
"&type=2&id=" + "&type=2&id=" +
item.routerTaskId + item.id +
"&chapterOrStageId=" + "&chapterOrStageId=" +
item.chapterId + item.chapterId +
"&infoId=" + "&infoId=" +
@@ -2679,7 +2681,7 @@ export default {
"/discusspage?courseId=" + "/discusspage?courseId=" +
item.courseId + item.courseId +
"&type=2&id=" + "&type=2&id=" +
item.routerTaskId; item.id;
} }
//活动 //活动
if (item.type == 9) { if (item.type == 9) {
@@ -2692,7 +2694,7 @@ export default {
"/activitiespage?courseId=" + "/activitiespage?courseId=" +
item.courseId + item.courseId +
"&type=2&id=" + "&type=2&id=" +
item.routerTaskId; item.id;
} }
//活动 //活动
if (item.type == 10) { if (item.type == 10) {
@@ -2711,13 +2713,14 @@ export default {
if (item.type == 11) { if (item.type == 11) {
if (item.taskStatus == 1 || item.taskStatus == 2) if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。"); return message.error("该任务无法学习,请联系管理员进行替换。");
console.log("item", item);
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/investigatage?courseId=" + "/investigatage?courseId=" +
item.courseId + item.courseId +
"&type=2&id=" + "&type=2&id=" +
item.routerTaskId + item.id +
"&chapterOrStageId=" + "&chapterOrStageId=" +
item.chapterId + item.chapterId +
"&infoId=" + "&infoId=" +
@@ -2731,7 +2734,7 @@ export default {
"/ballotpage?courseId=" + "/ballotpage?courseId=" +
item.courseId + item.courseId +
"&btype=2&id=" + "&btype=2&id=" +
item.routerTaskId + item.id +
"&chapterOrStageId=" + "&chapterOrStageId=" +
item.chapterId + item.chapterId +
"&infoId=" + "&infoId=" +

View File

@@ -261,7 +261,7 @@
size="small" active-color="red"/> size="small" active-color="red"/>
<div class="showt clearfix"> <div class="showt clearfix">
<div class="bi" :style="{ <div class="bi" :style="{
'z-index': element.flag ? 999 : 998, 'z-index': element.flag ? 889 : 887,
}"> }">
必修 必修
</div> </div>
@@ -1946,7 +1946,7 @@ const cancelStorage = async () => {
background-color: #5dc988; background-color: #5dc988;
line-height: 23px; line-height: 23px;
position: absolute; position: absolute;
z-index: 998; z-index: 888;
color: #ffffff; color: #ffffff;
border-radius: 4px; border-radius: 4px;
} }
@@ -1958,7 +1958,7 @@ const cancelStorage = async () => {
line-height: 23px; line-height: 23px;
// display: none; // display: none;
position: absolute; position: absolute;
z-index: 998; z-index: 888;
color: #5dc988; color: #5dc988;
border-radius: 4px; border-radius: 4px;
} }

View File

@@ -2,8 +2,9 @@
<template xmlns:display="http://www.w3.org/1999/xhtml"> <template xmlns:display="http://www.w3.org/1999/xhtml">
<div class="projectAdd"> <div class="projectAdd">
<div class="header"> <div class="header">
<span class="title">{{ projectInfo.id ? "编辑" : "创建" <span class="title">{{
}}{{ ptojectType == "3" ? "班级" : "项目" }}</span> projectInfo.id ? "编辑" : "创建"
}}{{ ptojectType == "3" ? "班级" : "项目" }}</span>
<div @click="backPage" style="cursor: pointer" to="/projectmanage" class="goback"> <div @click="backPage" style="cursor: pointer" to="/projectmanage" class="goback">
<span class="return"></span><span class="returntext">返回</span> <span class="return"></span><span class="returntext">返回</span>
</div> </div>
@@ -12,7 +13,7 @@
<div class="main"> <div class="main">
<div class="name" v-if="projectInfo.parentName"> <div class="name" v-if="projectInfo.parentName">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">项目归属</div> <div class="inname">项目归属</div>
</div> </div>
<div class="in"> <div class="in">
@@ -23,19 +24,20 @@
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname"> <div class="inname">
{{ ptojectType == 3 ? "班级名称" : "项目名称" }} {{ ptojectType == 3 ? "班级名称" : "项目名称" }}
</div> </div>
</div> </div>
<div class="in"> <div class="in">
<NameInput placeholder="请输入项目名称" v-model:value="projectInfo.name" v-model:validate="projectInfo.validate" <NameInput placeholder="请输入项目名称" v-model:value="projectInfo.name"
:maxlength="30" show-count :id="projectInfo.id"></NameInput> v-model:validated="projectInfo.validated" :type="1"
:maxlength="30" show-count :id="projectInfo.id"></NameInput>
</div> </div>
</div> </div>
<div class="name flex-top"> <div class="name flex-top">
<div class="namebox" style="margin-top: 10px"> <div class="namebox" style="margin-top: 10px">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">封面图</div> <div class="inname">封面图</div>
</div> </div>
<div class="in select" style="flex: 1; display: flex"> <div class="in select" style="flex: 1; display: flex">
@@ -54,7 +56,7 @@
height: 100px; height: 100px;
margin-bottom: 4px; margin-bottom: 4px;
margin-right: 4px; margin-right: 4px;
" :src="src.value" alt="avatar" /> " :src="src.value" alt="avatar"/>
</div> </div>
<div @click="showLearnBgMore" v-if="projectPic.length > 3" style=" <div @click="showLearnBgMore" v-if="projectPic.length > 3" style="
width: 100px; width: 100px;
@@ -74,47 +76,49 @@
line-height: 36px; line-height: 36px;
"> ">
查看更多 查看更多
<img src="../../assets/images/projectadd/go.png" alt="" /> <img src="../../assets/images/projectadd/go.png" alt=""/>
</div> </div>
</div> </div>
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">项目时间</div> <div class="inname">项目时间</div>
</div> </div>
<div class="in"> <div class="in">
<a-range-picker separator="至" :show-time="{ format: 'HH:mm' }" :placeholder="[' 开始时间', ' 结束时间']" <a-range-picker separator="至" :show-time="{ format: 'HH:mm' }"
:disabledDate="disabledDate" v-model:value="timeRange" @calendarChange="calendarChange" :placeholder="[' 开始时间', ' 结束时间']"
style="width: 100%; height: 40px; border-radius: 5px" :allowClear="false" format="YYYY-MM-DD HH:mm" :disabledDate="disabledDate" v-model:value="timeRange" @calendarChange="calendarChange"
valueFormat="YYYY-MM-DD HH:mm" @change="timeChange" :disabled="!!viewDetail" /> style="width: 100%; height: 40px; border-radius: 5px" :allowClear="false"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm" @change="timeChange" :disabled="!!viewDetail"/>
</div> </div>
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">项目经理</div> <div class="inname">项目经理</div>
</div> </div>
<div class="in"> <div class="in">
<ProjectManager v-model:value="projectInfo.managerId" v-model:name="projectInfo.manager" <ProjectManager v-model:value="projectInfo.managerId" v-model:name="projectInfo.manager"
@onChange="managerChange" mode="multiple"></ProjectManager> @onChange="managerChange" mode="multiple"></ProjectManager>
</div> </div>
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">资源归属</div> <div class="inname">资源归属</div>
</div> </div>
<div class="in select"> <div class="in select">
<OrgClass v-model:value="projectInfo.sourceBelongId" v-model:name="projectInfo.sourceBelongName" <OrgClass v-model:value="projectInfo.sourceBelongId" v-model:name="projectInfo.sourceBelongName"
v-model:fullName="projectInfo.sourceBelongFullName"></OrgClass> v-model:fullName="projectInfo.sourceBelongFullName"></OrgClass>
</div> </div>
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">项目级别</div> <div class="inname">项目级别</div>
</div> </div>
<div class="in select"> <div class="in select">
@@ -123,7 +127,7 @@
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">培训分类</div> <div class="inname">培训分类</div>
</div> </div>
<div class="in select"> <div class="in select">
@@ -132,7 +136,7 @@
</div> </div>
<div class="name"> <div class="name">
<div class="namebox"> <div class="namebox">
<img class="nameimg" src="../../assets/images/basicinfo/asterisk.png" /> <img class="nameimg" src="../../assets/images/basicinfo/asterisk.png"/>
<div class="inname">是否BOEU实施</div> <div class="inname">是否BOEU实施</div>
</div> </div>
<div class="in"> <div class="in">
@@ -177,7 +181,7 @@
</div> </div>
<div class="in"> <div class="in">
<a-textarea v-model:value="projectInfo.remark" style="height: 80px" placeholder="请输入说明" show-count <a-textarea v-model:value="projectInfo.remark" style="height: 80px" placeholder="请输入说明" show-count
:maxlength="200" :disabled="viewDetail ? true : false" /> :maxlength="200" :disabled="viewDetail ? true : false"/>
</div> </div>
</div> </div>
@@ -197,7 +201,7 @@
<a-select :getPopupContainer=" <a-select :getPopupContainer="
(triggerNode) => triggerNode.parentNode || document.body (triggerNode) => triggerNode.parentNode || document.body
" placeholder="请选择模版" style="width: 100%" :options="classifyList5" @change="classificationChange5" " placeholder="请选择模版" style="width: 100%" :options="classifyList5" @change="classificationChange5"
@popupScroll="templateScroll" :fieldNames="{ @popupScroll="templateScroll" :fieldNames="{
label: 'name', label: 'name',
value: 'id', value: 'id',
}"> }">
@@ -215,18 +219,18 @@
</div> </div>
<!-- 更多背景图 v-model:visible="learnBgMore" --> <!-- 更多背景图 v-model:visible="learnBgMore" -->
<a-modal :closable="sh" centered="true" v-model:visible="learnBgMore" :footer="null" :width="650" <a-modal :closable="sh" centered="true" v-model:visible="learnBgMore" :footer="null" :width="650"
wrapClassName="learnBgMoreModal" :z-index="9999"> wrapClassName="learnBgMoreModal" :z-index="9999">
<div class="main"> <div class="main">
<div class="top"> <div class="top">
<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="{ <div @click="chooseImg2(item)" v-for="item in projectPic" :key="item.code" class="learnBgItem" :style="{
border: border:
projectInfo.picUrl === item.value projectInfo.picUrl === item.value
@@ -239,27 +243,27 @@
</div> </div>
<div class="btn"> <div class="btn">
<button class="samtn btn1" @click="closeLearnBgMore">取消</button> <button class="samtn btn1" @click="closeLearnBgMore">取消</button>
<button class="samtn btn2" @click="closeLearnBgMore">确定</button> <a-button class="samtn btn2" @click="closeLearnBgMore" :loading="projectInfo.validated===1">确定</a-button>
</div> </div>
</div> </div>
</a-modal> </a-modal>
</div> </div>
</template> </template>
<script> <script>
import { onMounted, reactive, toRefs, watch } from "vue"; import {onMounted, reactive, toRefs, watch} from "vue";
import { message } from "ant-design-vue"; import {message} from "ant-design-vue";
import { useRoute, useRouter } from "vue-router"; import {useRoute, useRouter} from "vue-router";
import * as api from "../../api/index"; import * as api from "../../api/index";
import { useStore } from "vuex"; import {useStore} from "vuex";
import TrainClass from "@/components/project/TrainClass"; import TrainClass from "@/components/project/TrainClass";
import OrgClass from "@/components/project/OrgClass"; import OrgClass from "@/components/project/OrgClass";
import ProjectManager from "@/components/project/ProjectManagerNew"; import ProjectManager from "@/components/project/ProjectManagerNew";
import NameInput from "@/components/project/NameInput"; import NameInput from "@/components/project/NameInput";
import ProjectLevel from "@/components/project/ProjectLevel"; import ProjectLevel from "@/components/project/ProjectLevel";
import * as api2 from "../../api/indexAudit"; import * as api2 from "../../api/indexAudit";
import { validateName } from "@/api/index1"; import {validateName} from "@/api/index1";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { scrollLoad } from "@/api/method"; import {scrollLoad} from "@/api/method";
export default { export default {
name: "projectAdd", name: "projectAdd",
@@ -283,7 +287,7 @@ export default {
pageSize: 10, //每页10条数据 pageSize: 10, //每页10条数据
totalPages: 0, //总页数 totalPages: 0, //总页数
viewDetail: null, viewDetail: null,
projectInfo: { id: "" }, projectInfo: { id: "", validated: 0 },
projectPic: [], projectPic: [],
memberParam: { memberParam: {
pageNo: 1, pageNo: 1,
@@ -330,43 +334,43 @@ export default {
state.projectInfo.parentId = routers.query.parentId; state.projectInfo.parentId = routers.query.parentId;
state.projectInfo.id = routers.query.projectId; state.projectInfo.id = routers.query.projectId;
(state.projectInfo.id || state.projectInfo.parentId) && (state.projectInfo.id || state.projectInfo.parentId) &&
api api
.getProjectDetail({ .getProjectDetail({
projectId: state.projectInfo.id || state.projectInfo.parentId, projectId: state.projectInfo.id || state.projectInfo.parentId,
}) })
.then((res) => { .then((res) => {
state.projectInfo = { state.projectInfo = {
...res.data.data.projectInfo, ...res.data.data.projectInfo,
...state.projectInfo, ...state.projectInfo,
};
!routers.query.projectId &&
!!routers.query.parentId &&
(state.projectInfo.name = "");
state.timeRange = [
state.projectInfo.beginTime,
state.projectInfo.endTime,
];
state.courseSyncFlag = !!state.projectInfo.courseSyncFlag;
if (Number(state.projectInfo.status) === -5) {
let obj = {
project_id: state.projectInfo.id,
type: 1,
pageNo: 1,
pageSize: 1,
}; };
!routers.query.projectId && api2.auditList(obj).then((d) => {
!!routers.query.parentId && if (d.data.code === 200) {
(state.projectInfo.name = ""); let res = d.data.data;
state.timeRange = [ if (res.rows && res.rows.length > 0) {
state.projectInfo.beginTime, let i = res.rows.length;
state.projectInfo.endTime, state.auditDescription = res.rows[i - 1].description
]; ? res.rows[i - 1].description
state.courseSyncFlag = !!state.projectInfo.courseSyncFlag; : "-";
if (Number(state.projectInfo.status) === -5) {
let obj = {
project_id: state.projectInfo.id,
type: 1,
pageNo: 1,
pageSize: 1,
};
api2.auditList(obj).then((d) => {
if (d.data.code === 200) {
let res = d.data.data;
if (res.rows && res.rows.length > 0) {
let i = res.rows.length;
state.auditDescription = res.rows[i - 1].description
? res.rows[i - 1].description
: "-";
}
} }
}); }
} });
}); }
});
} }
const backPage = () => { const backPage = () => {
@@ -453,7 +457,7 @@ export default {
/** /**
if (!state.projectInfo.validate) { if (!state.projectInfo.validate) {
message.destroy(); message.destroy();
message.warning('项目名称重复,请修改名称!'); message.warning("项目名称重复,请修改名称!");
return; return;
}*/ }*/
const offName = await validateName({ const offName = await validateName({
@@ -508,9 +512,11 @@ export default {
const closeLearnBgMore = () => { const closeLearnBgMore = () => {
state.learnBgMore = false; state.learnBgMore = false;
}; };
function calendarChange(date, dateStr, partial) { function calendarChange(date, dateStr, partial) {
state.datePartial = partial; state.datePartial = partial;
} }
const chooseImg2 = (item) => { const chooseImg2 = (item) => {
// console.log(item); // console.log(item);
state.projectInfo.picUrl = item.value; state.projectInfo.picUrl = item.value;

View File

@@ -304,7 +304,8 @@
<NameInput <NameInput
placeholder="请输入项目名称" placeholder="请输入项目名称"
v-model:value="projectInfo.name" v-model:value="projectInfo.name"
v-model:validate="projectInfo.validate" v-model:validated="projectInfo.validated"
:type="1"
:maxlength="30" :maxlength="30"
show-count show-count
:id="projectInfo.projectId" :id="projectInfo.projectId"
@@ -358,7 +359,7 @@
</div> </div>
<div class="pubtn"> <div class="pubtn">
<a-button class="pubtn1" @click="closeModal2">取消</a-button> <a-button class="pubtn1" @click="closeModal2">取消</a-button>
<a-button class="pubtn2" @click="createStoreyProject" <a-button class="pubtn2" @click="createStoreyProject" :loading="buttonLoading || projectInfo.validated===1"
>确定 >确定
</a-button> </a-button>
</div> </div>
@@ -973,6 +974,7 @@ export default {
setup() { setup() {
const state = reactive({ const state = reactive({
tableLoading: false, tableLoading: false,
buttonLoading: false,
projectName: null, projectName: null,
selectTime: null, selectTime: null,
sonproject: false, sonproject: false,
@@ -1082,6 +1084,7 @@ export default {
// 创建多层项目 // 创建多层项目
const createStoreyProject = async () => { const createStoreyProject = async () => {
state.buttonLoading = true
// 接口需要传递的参数信息 // 接口需要传递的参数信息
const errorMsgs = { const errorMsgs = {
name: "请输入项目名称", name: "请输入项目名称",
@@ -1090,6 +1093,7 @@ export default {
sourceBelongId: "请选择资源归属", sourceBelongId: "请选择资源归属",
}; };
if (!validate(state.projectInfo, errorMsgs)) { if (!validate(state.projectInfo, errorMsgs)) {
state.buttonLoading = false
return; return;
} }
/** /**
@@ -1106,6 +1110,7 @@ export default {
return res.data.data == 1; return res.data.data == 1;
}); });
if (offName) { if (offName) {
state.buttonLoading = false
message.destroy(); message.destroy();
return message.warning("项目名称重复,请重新填写"); return message.warning("项目名称重复,请重新填写");
} }
@@ -1114,6 +1119,7 @@ export default {
message.destroy(); message.destroy();
message.success("创建成功"); message.success("创建成功");
state.currentPage = 1; state.currentPage = 1;
state.buttonLoading = false
getTableDate(); getTableDate();
}); });
}; };

View File

@@ -235,7 +235,7 @@
v-model:checked="element.flag" size="small" v-model:checked="element.flag" size="small"
active-color="red"/> active-color="red"/>
<div class="showt clearfix"> <div class="showt clearfix">
<div class="bi" :style="{'z-index': element.flag ? 999 : 998,}">必修</div> <div class="bi" :style="{'z-index': element.flag ? 889 : 887,}">必修</div>
<div class="xuan">选修</div> <div class="xuan">选修</div>
</div> </div>
</div> </div>
@@ -1585,7 +1585,7 @@ const cancelStorage = async () => {
background-color: #5dc988; background-color: #5dc988;
line-height: 23px; line-height: 23px;
position: absolute; position: absolute;
z-index: 998; z-index: 888;
color: #ffffff; color: #ffffff;
border-radius: 4px; border-radius: 4px;
} }
@@ -1596,7 +1596,7 @@ const cancelStorage = async () => {
background-color: #f2f6fc; background-color: #f2f6fc;
line-height: 23px; line-height: 23px;
position: absolute; position: absolute;
z-index: 998; z-index: 888;
color: #5dc988; color: #5dc988;
border-radius: 4px; border-radius: 4px;
} }

View File

@@ -2852,8 +2852,8 @@ export default {
.studytimeRank(obj) .studytimeRank(obj)
.then((res) => { .then((res) => {
console.log("项目学时榜单获取", res); console.log("项目学时榜单获取", res);
if (res.data.datas) { if (res.data.data) {
state.xueshitabledata = res.data.datas; state.xueshitabledata = res.data.data;
state.studytimeRankLoading = false; state.studytimeRankLoading = false;
} else { } else {
state.xueshitabledata = []; state.xueshitabledata = [];
@@ -4498,13 +4498,10 @@ export default {
if (item.type == 1) { if (item.type == 1) {
if (item.taskStatus == 1 || item.taskStatus == 2) if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。"); return message.error("该任务无法学习,请联系管理员进行替换。");
window.open( codeUrl =
window.location.protocol + window.location.protocol +
import.meta.env.VUE_APP_BOE_API_URL + process.env.VUE_APP_ONLINE_CLASS_URL +
"/mobile/pages/study/courseStudy?id=" + item.targetId;
item.targetId,
"_top"
);
} }
if (item.type == 2) { if (item.type == 2) {
let date1 = new Date(item.endTime).getTime(); let date1 = new Date(item.endTime).getTime();
@@ -4518,7 +4515,7 @@ export default {
"/faceteach?type=2&courseId=" + "/faceteach?type=2&courseId=" +
item.courseId + item.courseId +
"&id=" + "&id=" +
item.projectTaskId; item.id;
} }
if (item.type == 3) return message.error("请在pc端完成"); if (item.type == 3) return message.error("请在pc端完成");
if (item.type == 4) { if (item.type == 4) {
@@ -4531,7 +4528,7 @@ export default {
"/homeworkpage?courseId=" + "/homeworkpage?courseId=" +
item.courseId + item.courseId +
"&type=1&id=" + "&type=1&id=" +
item.projectTaskId; item.id;
} }
// 考试 停用 // 考试 停用
if (item.type == 5) { if (item.type == 5) {
@@ -4544,6 +4541,11 @@ export default {
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/externalexam?courseId=" + "/externalexam?courseId=" +
item.courseId; item.courseId;
} else {
codeUrl =
window.location.protocol +
process.env.VUE_APP_EXAM_DETAIL_URL +
item.targetId;
} }
} }
// 直播结束时间 // 直播结束时间
@@ -4554,10 +4556,10 @@ export default {
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/livebroadcast?courseId=" + "/liveboradcast?courseId=" +
item.courseId + item.courseId +
"&type=1&id=" + "&type=1&id=" +
item.projectTaskId; item.id;
} }
// 外链 // 外链
if (item.type == 7) { if (item.type == 7) {
@@ -4567,7 +4569,7 @@ export default {
"/outerchain?courseId=" + "/outerchain?courseId=" +
item.courseId + item.courseId +
"&type=1&id=" + "&type=1&id=" +
item.projectTaskId + item.id +
"&chapterOrStageId=" + "&chapterOrStageId=" +
item.stageId + item.stageId +
"&infoId=" + "&infoId=" +
@@ -4581,20 +4583,21 @@ export default {
"/discusspage?courseId=" + "/discusspage?courseId=" +
item.courseId + item.courseId +
"&type=1&id=" + "&type=1&id=" +
item.projectTaskId; item.id;
} }
//活动 //活动
if (item.type == 9) { if (item.type == 9) {
let date1 = new Date(item.endTime).getTime(); let date1 = new Date(item.endTime).getTime();
let date2 = new Date().getTime(); let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前活动已结束"); if (date1 < date2) return message.warning("当前活动已结束");
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/activitiespage?courseId=" + "/activitiespage?courseId=" +
item.courseId + item.courseId +
"&type=1&id=" + "&type=1&id=" +
item.projectTaskId; item.id;
} }
//活动 //活动
if (item.type == 10) { if (item.type == 10) {
@@ -4613,13 +4616,14 @@ export default {
if (item.type == 11) { if (item.type == 11) {
if (item.taskStatus == 1 || item.taskStatus == 2) if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。"); return message.error("该任务无法学习,请联系管理员进行替换。");
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_H5 + process.env.VUE_APP_H5 +
"/investigatage?courseId=" + "/investigatage?courseId=" +
item.courseId + item.courseId +
"&type=1&id=" + "&type=1&id=" +
item.projectTaskId + item.id +
"&chapterOrStageId=" + "&chapterOrStageId=" +
item.stageId + item.stageId +
"&infoId=" + "&infoId=" +
@@ -4633,7 +4637,7 @@ export default {
"/ballotpage?courseId=" + "/ballotpage?courseId=" +
item.courseId + item.courseId +
"&btype=2&id=" + "&btype=2&id=" +
item.projectTaskId + item.id +
"&chapterOrStageId=" + "&chapterOrStageId=" +
item.chapterId + item.chapterId +
"&infoId=" + "&infoId=" +

View File

@@ -92,9 +92,7 @@
</div> </div>
</template> </template>
<script> <script>
import { reactive, toRefs, computed } from "vue"; import {reactive, toRefs} from "vue";
// import { message } from "ant-design-vue";
// import { createResearch } from "../../api/indexResearch";
import ResearchAddSingle from "./components/ResearchAddSingle.vue"; import ResearchAddSingle from "./components/ResearchAddSingle.vue";
import ResearchAddMulti from "./components/ResearchAddMulti.vue"; import ResearchAddMulti from "./components/ResearchAddMulti.vue";
import ResearchAddAsk from "./components/ResearchAddAsk.vue"; import ResearchAddAsk from "./components/ResearchAddAsk.vue";
@@ -104,7 +102,7 @@ import {
traverseArr, traverseArr,
filterCommon, filterCommon,
deepCloneFilterString, deepCloneFilterString,
} from "../../utils/utils"; } from "@/utils/utils";
import { import {
queryResearchDetailById, queryResearchDetailById,
editResearchMessage, editResearchMessage,
@@ -112,9 +110,8 @@ import {
deleteChoiceQuestion, deleteChoiceQuestion,
deleteQuestionScAndQa, deleteQuestionScAndQa,
} from "@/api/indexResearch"; } from "@/api/indexResearch";
import { useRouter } from "vue-router"; import {useRoute, useRouter} from "vue-router";
import store from "@/store"; import {message} from "ant-design-vue";
import { message } from "ant-design-vue";
export default { export default {
name: "ResearchAdd", name: "ResearchAdd",
@@ -126,10 +123,11 @@ export default {
}, },
setup() { setup() {
const router = useRouter(); const router = useRouter();
const route = useRoute();
const state = reactive({ const state = reactive({
assessmentId: "", //编辑时候传 assessmentId: "", //编辑时候传
assessmentName: "", assessmentName: "",
assessmentNameNew: computed(() => store.state.assessmentName), assessmentNameNew: route.query.name,
allFormsData: [], allFormsData: [],
valueMore: "", valueMore: "",
@@ -612,10 +610,12 @@ export default {
width: 100%; width: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.header { .header {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.title { .title {
color: #000000; color: #000000;
font-size: 18px; font-size: 18px;
@@ -624,10 +624,12 @@ export default {
padding-left: 37px; padding-left: 37px;
//font-weight: 500; //font-weight: 500;
} }
.goback { .goback {
padding-right: 70px; padding-right: 70px;
//padding-top: 37px; //padding-top: 37px;
position: relative; position: relative;
.return { .return {
display: inline-block; display: inline-block;
width: 42px; width: 42px;
@@ -636,6 +638,7 @@ export default {
margin-right: 10px; margin-right: 10px;
background-image: url("../../assets/images/projectadd/return.png"); background-image: url("../../assets/images/projectadd/return.png");
} }
.returntext { .returntext {
display: inline-block; display: inline-block;
position: absolute; position: absolute;
@@ -645,16 +648,19 @@ export default {
} }
} }
} }
.addtype { .addtype {
display: flex; display: flex;
border-bottom: 1px solid rgba(0, 0, 0, 0.1); border-bottom: 1px solid rgba(0, 0, 0, 0.1);
margin-right: 20px; margin-right: 20px;
align-items: center; align-items: center;
margin-left: 41px; margin-left: 41px;
.addtypen { .addtypen {
color: #6f6f6f; color: #6f6f6f;
font-size: 14px; font-size: 14px;
} }
.types { .types {
cursor: pointer; cursor: pointer;
width: 80px; width: 80px;
@@ -667,11 +673,13 @@ export default {
align-items: center; align-items: center;
margin: 20px 10px; margin: 20px 10px;
} }
.typesCur { .typesCur {
color: #fff; color: #fff;
background: #4ea6ff; background: #4ea6ff;
} }
} }
.content { .content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -680,9 +688,11 @@ export default {
min-width: 690px; min-width: 690px;
margin-left: 38px; margin-left: 38px;
margin-top: 20px; margin-top: 20px;
.tagbox { .tagbox {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.tagname { .tagname {
width: 90px; width: 90px;
height: 32px; height: 32px;
@@ -696,6 +706,7 @@ export default {
color: rgba(64, 158, 255, 1); color: rgba(64, 158, 255, 1);
font-size: 16px; font-size: 16px;
} }
.deleteop { .deleteop {
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -707,6 +718,7 @@ export default {
border: 1px solid #4ea6ff; border: 1px solid #4ea6ff;
border-radius: 8px; border-radius: 8px;
cursor: pointer; cursor: pointer;
.del_text { .del_text {
color: #4ea6ff; color: #4ea6ff;
font-size: 14px; font-size: 14px;
@@ -714,21 +726,25 @@ export default {
} }
} }
} }
.scorebox { .scorebox {
display: flex; display: flex;
align-items: center; align-items: center;
margin-top: 20px; margin-top: 20px;
margin-left: 70px; margin-left: 70px;
.scoretext { .scoretext {
font-size: 14px; font-size: 14px;
color: #56a3f9; color: #56a3f9;
} }
.number { .number {
display: flex; display: flex;
border: 1px solid #d7e5fd; border: 1px solid #d7e5fd;
border-radius: 5px; border-radius: 5px;
margin: 0 10px; margin: 0 10px;
padding: 5px; padding: 5px;
.btn { .btn {
width: 40px; width: 40px;
height: 40px; height: 40px;
@@ -744,30 +760,36 @@ export default {
line-height: 24px; line-height: 24px;
cursor: pointer; cursor: pointer;
} }
.curBtn { .curBtn {
background: #56a3f9; background: #56a3f9;
color: #fff; color: #fff;
} }
} }
} }
.picture { .picture {
width: 100px; width: 100px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-top: 20px; margin-top: 20px;
margin-left: 133px; margin-left: 133px;
.pictureimg { .pictureimg {
width: 100px; width: 100px;
height: 100px; height: 100px;
} }
.picturename { .picturename {
color: #6f6f6f; color: #6f6f6f;
font-size: 14px; font-size: 14px;
} }
} }
.options { .options {
display: flex; display: flex;
} }
.delete { .delete {
cursor: pointer; cursor: pointer;
margin-top: 32px; margin-top: 32px;
@@ -776,10 +798,12 @@ export default {
color: #4ea6ff; color: #4ea6ff;
font-size: 14px; font-size: 14px;
} }
.name2 { .name2 {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
} }
.name { .name {
width: 60%; width: 60%;
// background-color: lightcoral; // background-color: lightcoral;
@@ -794,20 +818,24 @@ export default {
align-items: center; align-items: center;
justify-content: flex-end; justify-content: flex-end;
flex-shrink: 0; flex-shrink: 0;
.nameimg { .nameimg {
width: 10px; width: 10px;
height: 10px; height: 10px;
} }
} }
.inname { .inname {
color: #6f6f6f; color: #6f6f6f;
font-size: 14px; font-size: 14px;
margin-left: 7px; margin-left: 7px;
font-weight: 700; font-weight: 700;
} }
.in { .in {
margin-left: 14px; margin-left: 14px;
flex: 1; flex: 1;
.assess { .assess {
display: flex; display: flex;
width: 226px; width: 226px;
@@ -822,6 +850,7 @@ export default {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.assesswhole { .assesswhole {
width: 50%; width: 50%;
background: rgba(86, 163, 249, 0.1); background: rgba(86, 163, 249, 0.1);
@@ -831,6 +860,7 @@ export default {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.ratio { .ratio {
position: absolute; position: absolute;
right: 10px; right: 10px;
@@ -839,24 +869,29 @@ export default {
font-size: 14px; font-size: 14px;
} }
} }
.addimg { .addimg {
cursor: pointer; cursor: pointer;
color: rgba(78, 166, 255, 1); color: rgba(78, 166, 255, 1);
font-size: 14px; font-size: 14px;
} }
.text { .text {
color: rgba(109, 117, 132, 1); color: rgba(109, 117, 132, 1);
font-size: 14px; font-size: 14px;
//line-height: 24px; //line-height: 24px;
} }
.ant-radio-wrapper { .ant-radio-wrapper {
} }
.ant-input { .ant-input {
border-radius: 5px; border-radius: 5px;
// height: 120%; // height: 120%;
width: 100%; width: 100%;
height: 35px; height: 35px;
} }
.ant-select-selector { .ant-select-selector {
border-radius: 5px; border-radius: 5px;
// height: 120%; // height: 120%;
@@ -864,26 +899,32 @@ export default {
height: 40px; height: 40px;
} }
} }
.numberInp { .numberInp {
width: 200px; width: 200px;
.ant-input-number { .ant-input-number {
width: 200px; width: 200px;
height: 40px; height: 40px;
border-radius: 8px; border-radius: 8px;
} }
// .ant-input-number-input-wrap { // .ant-input-number-input-wrap {
// width: 200px; // width: 200px;
// } // }
} }
} }
} }
.name2 { .name2 {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
} }
.opinion { .opinion {
display: flex; display: flex;
margin-top: 30px; margin-top: 30px;
.namebox { .namebox {
width: 120px; width: 120px;
display: flex; display: flex;
@@ -891,27 +932,33 @@ export default {
justify-content: flex-end; justify-content: flex-end;
flex-shrink: 0; flex-shrink: 0;
} }
.in { .in {
margin-left: 14px; margin-left: 14px;
width: 500px; width: 500px;
.ant-input-textarea-show-count { .ant-input-textarea-show-count {
position: relative; position: relative;
height: 110px; height: 110px;
} }
.ant-input-textarea-show-count::after { .ant-input-textarea-show-count::after {
position: absolute; position: absolute;
right: 10px; right: 10px;
bottom: 0px; bottom: 0px;
} }
.ant-input { .ant-input {
border-radius: 8px; border-radius: 8px;
} }
} }
} }
.footer { .footer {
width: 100%; width: 100%;
margin-top: 31px; margin-top: 31px;
margin-bottom: 14px; margin-bottom: 14px;
.btn { .btn {
display: flex; display: flex;
margin-bottom: 20px; margin-bottom: 20px;
@@ -922,6 +969,7 @@ export default {
.uploadContent { .uploadContent {
display: block !important; display: block !important;
.uploadBtn { .uploadBtn {
margin-left: 120px !important; margin-left: 120px !important;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@
<iframe <iframe
id="iframe" id="iframe"
style="width: 100%; height: 100%" style="width: 100%; height: 100%"
:src="`${BOE_URL}/iframe/ugroup/manages`" :src="`${BOE_URL}/pc/iframe/ugroup/manages`"
name="myframe" name="myframe"
security="restricted" security="restricted"
sandbox="allow-forms allow-scripts allow-same-origin allow-popups" sandbox="allow-forms allow-scripts allow-same-origin allow-popups"