Merge branch 'pre-dev' into 'develop'

Pre dev

See merge request !20
This commit is contained in:
huangshengfa
2022-12-14 09:12:26 +08:00
19 changed files with 594 additions and 359 deletions

1
.gitignore vendored
View File

@@ -26,3 +26,4 @@ package-lock.json
src/api/config.js
src/api/config.js
src/api/config.js
src/api/config.js

View File

@@ -44,7 +44,7 @@ export default defineComponent({
const store = useStore();
const isLogin = ref(false);
// console.log("router", router.getRoutes(), route);
console.log("版本0.9.12------------");
console.log("版本0.9.13------------");
const routes = computed(() => {
return router.getRoutes().filter((e) => e.meta?.isLink);
});

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-21 14:32:52
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-12-13 09:24:16
* @LastEditTime: 2022-12-13 15:30:27
* @FilePath: /fe-manage/src/api/config.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/

View File

@@ -70,7 +70,7 @@ export default {
href: "/leveladd",
},
{
name: "管理",
name: "关卡",
},
];
}

View File

@@ -76,7 +76,7 @@ export default {
{
id: 1,
name: "管理员",
go: "/manage/learningpath",
go: "/learningpath",
},
{
id: 2,

View File

@@ -10,7 +10,7 @@
<div class="drawerMain">
<div class="header">
<div v-if="edit" class="headerTitle">编辑评估</div>
<div v-else class="headerTitle">添加评估{{assessmentName}}{{assessmentId}}</div>
<div v-else class="headerTitle">添加评估</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@@ -192,7 +192,7 @@ export default {
} else {
RouterEditTask({
chapterId: props.isactive,
courseTaskId: state.assessmentId,
courseId: state.assessmentId,
name: state.assessmentName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,

View File

@@ -166,6 +166,9 @@
<button class="btn2" @click="updateTask">确定</button>
</div>
</div>
<div class="aeLoading" :style="{ display: addLoading ? 'flex' : 'none' }">
<a-spin :spinning="addLoading" tip="" />
</div>
</a-drawer>
</template>
<script>
@@ -256,6 +259,7 @@ export default {
tableDataTotal: 0,
pageSize: 10,
choicecourse: true,
ddLoading:false,
});
const ChoiceCourse = () => {
state.choicecourse = false;
@@ -295,7 +299,7 @@ export default {
title: "名称",
dataIndex: "name",
key: "name",
width: "40%",
width: "30%",
ellipsis: true,
},
{
@@ -304,20 +308,22 @@ export default {
key: "contenttype",
width: "15%",
align: "center",
ellipsis: true,
},
{
title: "授课教师",
dataIndex: "teacher",
key: "teacher",
width: "15%",
align: "center",
},
// {
// title: "授课教师",
// dataIndex: "teacher",
// key: "teacher",
// width: "15%",
// align: "center",
// },
{
title: "创建人",
dataIndex: "sysCreateBy",
key: "sysCreateBy",
width: "15%x",
align: "center",
ellipsis: true,
},
// {
// title: "创建时间",
@@ -330,8 +336,9 @@ export default {
title: "发布时间",
dataIndex: "publishTime",
key: "publishTime",
width: "15%",
width: "25%",
align: "center",
ellipsis: true,
},
];
return columns;
@@ -462,9 +469,10 @@ export default {
});
};
const updateTask = () => {
state.addLoading =true;
if (props.isLevel == 1) {
if(!props.isactive){
state.addLoading =false;
message.destroy();
return message.warning("请先选中关卡");
}
@@ -495,6 +503,7 @@ export default {
}
message.destroy();
message.warning("在线课" + tipStr + "重复添加");
state.addLoading =false;
return;
} else {
state.addOnlineList.map((value) => {
@@ -507,16 +516,19 @@ export default {
routerTaskId: props.routerTaskId || 0,
type: 1,
})
.then(() => {
message.destroy();
message.success(
.then((res) => {
if(res.data.code == 200){
message.destroy();
message.success(
`${props.edit ? "编辑" : "新增"}关卡任务成功`
);
}
ctx.emit("changeData", false);
closeDrawer();
state.addLoading = false;
})
.catch(() => {
state.addLoading =false;
message.destroy();
message.error(
`${props.edit ? "编辑" : "新增"}关卡任务失败`

View File

@@ -33,10 +33,10 @@
外部考试
</button> -->
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
@@ -49,13 +49,13 @@
<div class="btnbox">
<a-input
v-model:value="test.examinationName"
style="width: 400px; height: 40px; border-radius: 8px;"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
:maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
@@ -70,18 +70,12 @@
<button class="xkbtn" @click="selectTest">
{{ chooseCourse ? "重选" : "选择" }}试卷
</button>
<div v-if="paperName != ''">
<a-tag
closable
color="processing"
@close="delTag"
>
<span style="font-size: 14px; line-height: 33px">{{
paperName
}}</span>
</a-tag>
<div v-if="paperName != ''">
<a-tag closable color="processing" @close="delTag">
<span style="font-size: 14px; line-height: 33px">{{
paperName
}}</span>
</a-tag>
</div>
</div>
<!-- 选择面授侧弹窗 -->
@@ -94,7 +88,7 @@
</div>
<!-- 选择面授侧弹窗 -->
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
@@ -105,8 +99,9 @@
</div>
<span style="margin-right: 3px">考试时间</span>
</div>
<div class="btnbox" >
<a-range-picker style="width: 400px; height: 40px; border-radius: 8px;"
<div class="btnbox">
<a-range-picker
style="width: 400px; height: 40px; border-radius: 8px"
show-time
format="YYYY/MM/DD HH:mm"
v-model:value="test.chooseTime"
@@ -129,7 +124,7 @@
:min="0"
:max="300"
:precision="0"
style="width: 400px; height: 40px; border-radius: 8px;"
style="width: 400px; height: 40px; border-radius: 8px"
v-model:value="test.examinationDuration"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
@@ -154,7 +149,7 @@
<div class="signbox">
<span style="margin-right: 3px">考试限制</span>
</div>
<div class="kqszbox">
<div class="kqszbox">
<div class="setbox">
<div class="timerbox">
<span>允许重复考试</span>
@@ -170,166 +165,138 @@
"
v-model:value="test.examinationLimit"
></a-input-number>
<span style="color: #999999; margin-left: 8px">,-1表示无限制</span>
<span style="color: #999999; margin-left: 8px"
>,-1表示无限制</span
>
</div>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<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="test.showAnswers"
>
<a-radio
v-model:checked="checked"
:value="1"
@click="cloradio1"
>允许查看
</a-radio>
<a-radio
v-model:checked="checked"
:value="2"
@click="cloradio1"
>不允许查看
</a-radio>
</a-radio-group>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="test.showAnswers"
>
<a-radio v-model:checked="checked" :value="1" @click="cloradio1"
>允许查看
</a-radio>
<a-radio v-model:checked="checked" :value="2" @click="cloradio1"
>不允许查看
</a-radio>
</a-radio-group>
</div>
<div class="main_item">
<div class="signbox">
</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="test.showAnalysis"
>
<a-radio
v-model:checked="checked"
:value="1"
@click="cloradio2"
>允许查看
</a-radio>
<a-radio
v-model:checked="checked"
:value="2"
@click="cloradio2"
>不允许查看
</a-radio>
</a-radio-group>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="test.showAnalysis"
>
<a-radio v-model:checked="checked" :value="1" @click="cloradio2"
>允许查看
</a-radio>
<a-radio v-model:checked="checked" :value="2" @click="cloradio2"
>不允许查看
</a-radio>
</a-radio-group>
</div>
<div class="main_item">
<div class="signbox">
</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="test.scoringModel"
>
<a-radio
v-model:checked="checked"
:value="1"
@click="cloradio3"
>最高一次
</a-radio>
<a-radio
v-model:checked="checked"
:value="2"
@click="cloradio3"
>最后一次
</a-radio>
</a-radio-group>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="test.scoringModel"
>
<a-radio v-model:checked="checked" :value="1" @click="cloradio3"
>最高一次
</a-radio>
<a-radio v-model:checked="checked" :value="2" @click="cloradio3"
>最后一次
</a-radio>
</a-radio-group>
</div>
<div class="main_item">
<div class="signbox">
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">及格线</span>
</div>
<div class="btnbox">
<a-input
v-model:value="test.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px;"
/>
<span style="color: #999999; margin-left: 8px"></span>
</div>
<div class="btnbox">
<a-input
v-model:value="test.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
/>
<span style="color: #999999; margin-left: 8px"></span>
</div>
</div>
<div class="main_item">
<div class="main_item">
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">作业要求</span>
</div>
<span style="margin-right: 3px">作业要求</span>
</div>
<div class="btnbox">
<a-radio-group
style="margin-right: 12px"
v-model:value="test.questionArrangement"
>
<a-radio
v-model:checked="checked"
:value="1"
@click="cloradio4"
>试题乱序
</a-radio>
<a-radio
v-model:checked="checked"
:value="2"
@click="cloradio4"
>选项乱序
</a-radio>
<a-radio
v-model:checked="checked"
:value="3"
@click="cloradio4"
>全部乱序
</a-radio>
<a-radio
v-model:checked="checked"
:value="4"
@click="cloradio4"
>不乱序
</a-radio>
</a-radio-group>
<a-radio-group
style="margin-right: 12px"
v-model:value="test.questionArrangement"
>
<a-radio
v-model:checked="checked"
:value="1"
@click="cloradio4"
>试题乱序
</a-radio>
<a-radio
v-model:checked="checked"
:value="2"
@click="cloradio4"
>选项乱序
</a-radio>
<a-radio
v-model:checked="checked"
:value="3"
@click="cloradio4"
>全部乱序
</a-radio>
<a-radio
v-model:checked="checked"
:value="4"
@click="cloradio4"
>不乱序
</a-radio>
</a-radio-group>
</div>
</div>
</div>
</div>
</div>
<div class="main_btns">
<a-button class="btn1" @click="closeDrawer2">取消</a-button>
<a-button class="btn2" @click="updateTest">确定</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>
<div class="main_btns">
<a-button class="btn1" @click="closeDrawer2">取消</a-button>
<a-button class="btn2" @click="updateTest">确定</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>
import { reactive,toRefs } from "vue";
import { reactive, toRefs } from "vue";
import { message } from "ant-design-vue";
import {
createExamination,
@@ -407,10 +374,8 @@ export default {
},
setup(props, ctx) {
const state = reactive({
test:{
test: {},
},
addLoading: false,
isOuter: 1, // 是否为外部考试
STvisible: false, //选择试卷抽屉
@@ -433,14 +398,11 @@ export default {
],
});
const clearAll = () => {
state.test={};
state.test = {};
};
const closeDrawer = () => {
state.statechoosedTime = "";
ctx.emit("update:addtestVisible", false);
ctx.emit("update:edit", false);
@@ -474,14 +436,15 @@ export default {
state.paperName = "";
};
const queryTest = () => {
queryExaminationDetailById({ examinationId: props.EditTestId })
.then((res) => {
state.test = res.data.data;
state.test.showAnswers = Number(state.test.showAnswers);
state.test.showAnalysis = Number(state.test.showAnalysis);
state.test.scoringModel =Number(state.test.scoringModel);
state.test.questionArrangement =Number(state.test.questionArrangement);
state.test.scoringModel = Number(state.test.scoringModel);
state.test.questionArrangement = Number(
state.test.questionArrangement
);
state.test.chooseTime = [
dayjs(res.data.data.examinationStartTime, "YYYY-MM-DD HH:mm:ss"),
dayjs(res.data.data.examinationEndTime, "YYYY-MM-DD HH:mm:ss"),
@@ -489,16 +452,14 @@ export default {
state.paperName = state.test.examinationTestName;
// state.paperId=dayjs
state.paperId = state.test.examinationTestId;
console.log("querytest",state.test);
console.log("querytest", state.test);
})
.catch(() => {
//message.error(`查询失败`);
});
};
const updateTest = () => {
if (!state.test.examinationName) {
message.destroy();
return message.warning("请输入考试名称");
@@ -508,29 +469,29 @@ export default {
return message.warning("请输入选择试卷");
}
if (!state.test.chooseTime) {
message.destroy();
return message.warning("请输入开始结束时间");
message.destroy();
return message.warning("请输入开始结束时间");
}
if (!state.test.examinationDuration) {
message.destroy();
return message.warning("请输入考试时长");
}
state.addLoading = true;
console.log("test",state.test);
// state.test.examinationStartTime = toDate(
console.log("test", state.test);
// state.test.examinationStartTime = toDate(
// new Date(state.test.chooseTime[0].$d).getTime() / 1000,
// "Y-M-D h:m"
// );
// state.test.examinationEndTime =toDate(
// new Date(state.test.$slotschooseTime[1].$d).getTime() / 1000,
// "Y-M-D h:m"
// );
// "Y-M-D h:m"
// );
// state.test.examinationEndTime =toDate(
// new Date(state.test.$slotschooseTime[1].$d).getTime() / 1000,
// "Y-M-D h:m"
// );
state.test.examinationStartTime = toDate(
new Date(state.test.chooseTime[0].$d).getTime() / 1000,
"Y-M-D h:m"
);
state.test.examinationEndTime =toDate(
state.test.examinationEndTime = toDate(
new Date(state.test.chooseTime[1].$d).getTime() / 1000,
"Y-M-D h:m"
);
@@ -538,7 +499,7 @@ export default {
//TODO缺少paperName字段
state.test.examinationTestName = state.paperName;
if (props.EditTestId>0) {
if (props.EditTestId > 0) {
// 编辑任务
updateExamination(state.test)
.then(async (res) => {
@@ -566,14 +527,14 @@ export default {
state.EditTestId = res.data.data.examinationId;
if (props.faceLevel) {
state.EditTestId = res.data.data.examinationId;
closeDrawer();
} else {
if (props.isLevel == 1) {
if(!props.isactive){
message.destroy();
return message.warning("请先选中关卡");
}
if (!props.isactive) {
message.destroy();
return message.warning("请先选中关卡");
}
let editObj1 = {
chapterId: props.isactive,
duration: res.data.data.examinationDuration,
@@ -588,7 +549,7 @@ export default {
console.log("props.edit", props.edit);
message.success(`${props.edit ? "编辑" : "新增"}任务成功`);
ctx.emit("changeData", false);
closeDrawer();
})
.catch(() => {
@@ -673,7 +634,6 @@ export default {
};
return {
afterVisibleChange,
closeDrawer,
closeDrawer2,
@@ -682,9 +642,9 @@ export default {
cloradio2,
cloradio3,
cloradio4,
clearAll,
delTag,
// layout,
@@ -872,36 +832,36 @@ export default {
}
}
.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;
}
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%;

View File

@@ -117,8 +117,8 @@
:loading="tableDataTotal === -1 ? true : false"
:pagination="false"
/>
<div class="tableBox">
<div class="pa" style="display:flex;justify-content:center;padding:20px;">
<div class="tableBox" style="margin-top:85px;">
<div class="pa" style="display:flex;justify-content:center;">
<a-pagination
v-if="tableDataTotal > 10"
:showSizeChanger="false"
@@ -162,14 +162,16 @@ const columns1 = [
width: "30%",
dataIndex: "name",
key: "name",
ellipsis: true,
},
{
title: "内容分类",
width: "15%",
dataIndex: "content",
key: "content",
dataIndex: "category",
key: "category",
align: "center",
ellipsis: true,
},
{
title: "授课教师",
@@ -177,6 +179,7 @@ const columns1 = [
dataIndex: "teacher",
key: "teacher",
align: "center",
ellipsis: true,
},
{
title: "创建人",
@@ -184,6 +187,7 @@ const columns1 = [
dataIndex: "creator",
key: "creator",
align: "center",
ellipsis: true,
},
{
title: "发布时间",
@@ -191,6 +195,7 @@ const columns1 = [
dataIndex: "time",
key: "time",
align: "center",
ellipsis: true,
},
];
@@ -227,6 +232,129 @@ export default {
// time: "2022-10-31 23:12:00",
// }
],
options2222: [
{
title: "领导力",
value: "100",
selectable: false,
children: [
{
title: "领导业务",
value: "1001",
},
{
title: "领导团队",
value: "1002",
},
{
title: "领导自我",
value: "1003",
},
],
},
{
title: "专业力",
value: "200",
selectable: false,
children: [
{
title: "研发",
value: "2001",
},
{
title: "产品和解决方案",
value: "2002",
},
{
title: "生产技术与制造",
value: "2003",
},
{
title: "供应链",
value: "2004",
},
{
title: "营销",
value: "2005",
},
{
title: "品质",
value: "2006",
},
{
title: "战略与企划",
value: "2007",
},
{
title: "流程管理",
value: "2008",
},
{
title: "业绩管理",
value: "2009",
},
{
title: "项目管理",
value: "20010",
},
{
title: "信息技术",
value: "20011",
},
{
title: "环境与安全",
value: "20012",
},
{
title: "人力资源",
value: "20013",
},
{
title: "企业文化",
value: "20014",
},
{
title: "品牌",
value: "20015",
},
{
title: "财务",
value: "20016",
},
{
title: "法务",
value: "20017",
},
{
title: "行政",
value: "20018",
},
{
title: "医工",
value: "20019",
},
],
},
{
title: "通用力",
value: "300",
selectable: false,
children: [
{
title: "职业操守与道德",
value: "3001",
},
{
title: "职业素养与技能",
value: "3002",
},
{
title: "规章制度",
value: "3003",
},
],
},
],
currentPage: 1,
tableDataTotal: null,
pageSize: 10,
@@ -311,6 +439,7 @@ export default {
const getClassData = (tabledata) => {
let data = tabledata;
let array = [];
let options = state.options2222;
data.map((value) => {
let obj = {
key: value.offcourseId,
@@ -320,13 +449,63 @@ export default {
creator: value.createName || "-",
time: value.publishTime,
categoryId: value.categoryId,
category:"",
//需要判断content
};
console.log("obj",obj);
var breaked = false;
for (let i = 0; i < options.length; i++) {
for (let j = 0; j < options[i].children.length; j++) {
if (
String(options[i].children[j].value) ===
String(obj.categoryId)
) {
console.log("obj.categoryId",obj.categoryId);
obj.category = options[i].children[j].title;
console.log("obj. obj.category ", obj.category );
breaked = true;
break;
}
}
if(breaked){
break;
}
}
if(!obj.category ){
obj.category ="-";
}
console.log("obj. obj.category22 ", obj.category );
array.push(obj);
});
state.classTableData = array;
};
/**
/**
const getCategory=(id)=>{
console.log("进来了");
let category="";
let options = state.options2222;
for (let i = 0; i < options.value.length; i++) {
for (let j = 0; j < options.value[i].children.length; j++) {
if (
String(options.value[i].children[j].value) ===
String(id)
) {
console.log();
category = options.value[i].children[j].title;
return category;
}
}
}
return category;
}
const options1 = ref([
{
value: 0,
@@ -378,6 +557,7 @@ export default {
rowSelection,
search,
submitCourse,
// change,
};
},

View File

@@ -88,7 +88,7 @@
</div>
</div>
<div class="btnn">
<button class="btn1">取消</button>
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="CreatSTText()">确定</button>
</div>
</div>
@@ -197,15 +197,15 @@ export default {
className: "h",
ellipsis: true,
},
{
title: "最近更新时间",
dataIndex: "sysUpdateTime",
key: "sysUpdateTime",
ellipsis: true,
width: "20%",
align: "center",
className: "h",
},
// {
// title: "最近更新时间",
// dataIndex: "sysUpdateTime",
// // key: "sysUpdateTime",
// ellipsis: true,
// width: "20%",
// align: "center",
// className: "h",
// },
];
return columns;
}

View File

@@ -67,6 +67,27 @@ function validateProName() {
</script>
<style lang="scss">
.in{
.pro{
.ant-input-affix-wrapper {
position: relative;
display: inline-block;
width: 99%;
min-width: 0;
padding: 4px 8px;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
line-height: 1.5715;
background-color: #fff;
background-image: none;
border: 1px solid #d9d9d9;
border-radius: 8px;
transition: all 0.3s;
display: inline-flex;
}
}
}
.in{
.ant-input-affix-wrapper {
position: relative;

View File

@@ -50,7 +50,7 @@
</div>
<div class="item_inp">
<div class="i1_input">
<NameInput placeholder="请输入课程名称" v-model:value="qdms_inputV1" v-model:validate="validate"
<NameInput ref="inputRef" placeholder="请输入课程名称" v-model:value="qdms_inputV1" v-model:validate="validate"
:maxlength="20" show-count :type="2" :id="offcourseId"></NameInput>
<!-- <a-input-->
<!-- v-model:value="qdms_inputV1"-->
@@ -304,7 +304,7 @@
<span style="margin-right: 14px">授课教师</span>
</div>
<div class="item_inp">
<div class="i1_input">
<div class="select" style="width:88%;">
<ProjectManager
v-model:value="member.value"
v-model:name="member.name"
@@ -426,7 +426,7 @@ export default defineComponent({
hideshow: true,
ft_eidt: false,
attach: "",
validate:false,
validate:true,
ft_hs: false,
addLoading: false,
statusJuJue: 0,

View File

@@ -505,7 +505,7 @@ export default {
console.log(data);
};
const reset = () => {
(state.valueproj = ""),
(state.valueproj = null),
(state.valuecreater = null),
(state.valuename = null),
getList();

View File

@@ -623,7 +623,7 @@ export default {
state.tableData1 = array;
};
const reset = () => {
state.valueproj = "";
state.valueproj = null;
state.valuecreater = null;
state.valuename = null;
getFaceList();

View File

@@ -809,8 +809,8 @@ export default {
},
{
id: 3,
value: "已停用",
label: "已停用",
value: "已结束",
label: "已结束",
classify: -1,
},
],

View File

@@ -211,6 +211,14 @@
/>
</div>
</div>
<div class="name name2">
<div class="namebox">
<div class="inname" style="margin-top: 13px">审核意见</div>
</div>
<div class="description">
{{auditDescription}}
</div>
</div>
</div>
<div class="template">
<div class="name">
@@ -267,6 +275,8 @@ import NameInput from "@/components/project/NameInput";
import ProjectLevel from "@/components/project/ProjectLevel";
import {changeOwnership, scrollLoad} from "@/api/method";
import {storage} from "../../api/storage";
import * as api2 from "../../api/indexAudit";
import {validateName} from "@/api/index1";
export default {
name: "projectAdd",
@@ -297,6 +307,7 @@ export default {
},
classifyList5: [],
courseSyncFlag: false,
auditDescription:"",
});
// 封面图选择
@@ -340,6 +351,24 @@ export default {
state.projectInfo.endTime,
];
state.courseSyncFlag = !!state.projectInfo.courseSyncFlag;
if (Number(state.projectInfo.status) === -5) {
let obj = {
project_id: state.projectInfo.projectId,
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 : "-";
}
}
});
}
});
}
@@ -416,16 +445,24 @@ export default {
return true;
}
const createProject = () => {
const createProject = async() => {
console.log("保存", state.projectInfo);
if (!validate(state.projectInfo, errorMsgs)) {
return;
}
/**
if (!state.projectInfo.validate) {
message.destroy();
message.warning('项目名称重复,请修改名称!');
return;
}
}*/
const offName = await validateName({name:state.projectInfo.name, type:1, id:state.projectInfo.projectId}).then(res => {
return res.data.data == 1;
});
if(offName){
message.destroy();
return message.warning("项目名称重复,请重新填写");
}
state.projectInfo.type = 3;
state.projectInfo.courseSyncFlag = state.courseSyncFlag ? 1 : 0;
api.createProject(state.projectInfo).then((res) => {
@@ -663,7 +700,10 @@ export default {
.name2 {
display: flex;
align-items: flex-start;
.description{
margin-top: 14px;
margin-left: 11px;
}
.ant-input-textarea {
.ant-input {
height: 88px;

View File

@@ -44,7 +44,7 @@
></a-select>
</div>
<div class="select addTimeBox">
<div class="addTime">项目起止时间</div>
<div class="addTime">创建时间</div>
<a-range-picker
v-model:value="searchParam.valueDate"
:show-time="{
@@ -179,7 +179,7 @@
/>
</div>
<div class="inname">项目名称:</div>
<div class="in">
<div class="in pro">
<NameInput
placeholder="请输入项目名称"
v-model:value="projectInfo.name"
@@ -831,6 +831,7 @@ import dayjs from "dayjs";
import * as moment from "moment";
import {changeOwnership} from "@/api/method";
import NameInput from "@/components/project/NameInput";
import {validateName} from "@/api/index1";
export default {
name: "projectManage",
@@ -958,7 +959,7 @@ export default {
}
// 创建多层项目
const createStoreyProject = () => {
const createStoreyProject = async() => {
// 接口需要传递的参数信息
const errorMsgs = {
name: "请输入项目名称",
@@ -969,11 +970,19 @@ export default {
if (!validate(state.projectInfo, errorMsgs)) {
return;
}
/**
if (!state.projectInfo.validate) {
message.destroy();
message.warning("项目名称重复,请修改名称!");
return;
}
} */
const offName = await validateName({name: state.qdms_inputV1, type:1, id:state.projectInfo.projectId}).then(res => {
return res.data.data == 1;
});
if(offName){
message.destroy();
return message.warning("项目名称重复,请重新填写");
}
api.createProject(state.projectInfo).then((res) => {
state.doublepro = false;
message.destroy();
@@ -1355,6 +1364,7 @@ export default {
dayjs().isBefore(value.record.end) ? "进行中" : "已结束",
"-1": () => "已结束",
"-5": () => "草稿",
}[value.record.status + ""]() || ""
: "-"}
</div>
@@ -2092,6 +2102,9 @@ export default {
font-weight: 400;
color: #4ea6ff;
margin-right: -45px;
display: flex;
justify-content: right;
margin-right: 18px;
// line-height: 36px;
.operation1 {

View File

@@ -4,10 +4,10 @@
<div class="header">
<span class="title">创建/编辑单层模板</span>
<div
@click="backPage"
style="cursor: pointer"
to="/manage/libraryAdd"
class="goback"
@click="backPage"
style="cursor: pointer"
to="/libraryAdd"
class="goback"
>
<span class="return"></span><span class="returntext">返回</span>
</div>
@@ -17,25 +17,25 @@
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">模板名称</div>
</div>
<div class="in">
<a-input
v-model:value="projectInfo.name"
placeholder="请输入模板名称"
show-count
:maxlength="30"
v-model:value="projectInfo.name"
placeholder="请输入模板名称"
show-count
:maxlength="30"
/>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">分类</div>
</div>
@@ -43,18 +43,18 @@
<ProjectClass v-model:value="projectInfo.category"></ProjectClass>
</div>
</div>
<div class="name" style="align-items: flex-start;">
<div class="name" style="align-items: flex-start">
<div class="namebox" style="margin-top: 10px">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">封面图</div>
</div>
<div class="in select" style="display: flex">
<div
:class="`box ${projectInfo.picUrl === src.value ? 'active' : ''}`"
style="
:class="`box ${projectInfo.picUrl === src.value ? 'active' : ''}`"
style="
width: 100px;
height: 100px;
border-radius: 5px;
@@ -62,19 +62,19 @@
position: relative;
overflow: hidden;
"
v-for="(src, index) in projectPic"
:key="index"
@click="() => (projectInfo.picUrl = src.value)"
v-for="(src, index) in projectPic"
:key="index"
@click="() => (projectInfo.picUrl = src.value)"
>
<img
style="
style="
width: 100px;
height: 100px;
margin-bottom: 4px;
margin-right: 4px;
"
:src="src.value"
alt="avatar"
:src="src.value"
alt="avatar"
/>
</div>
</div>
@@ -82,53 +82,53 @@
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">项目时间</div>
</div>
<div class="in">
<a-range-picker
separator="至"
:placeholder="[' 开始时间', ' 结束时间']"
v-model:value="projectInfo.rangeTime"
style="width: 100%; height: 40px; border-radius: 5px"
valueFormat="YYYY-MM-DD HH:mm:ss"
@change="timeChange"
separator="至"
:placeholder="[' 开始时间', ' 结束时间']"
v-model:value="projectInfo.rangeTime"
style="width: 100%; height: 40px; border-radius: 5px"
valueFormat="YYYY-MM-DD HH:mm:ss"
@change="timeChange"
/>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">项目经理</div>
</div>
<div class="in">
<ProjectManager
v-model:value="projectInfo.managerId"
v-model:name="projectInfo.manager"
@onChange="managerChange"
mode="multiple"
v-model:value="projectInfo.managerId"
v-model:name="projectInfo.manager"
@onChange="managerChange"
mode="multiple"
></ProjectManager>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">资源归属</div>
</div>
<div class="in select">
<OrgClass
v-model:value="projectInfo.sourceBelongId"
v-model:name="projectInfo.sourceBelongName"
v-model:value="projectInfo.sourceBelongId"
v-model:name="projectInfo.sourceBelongName"
></OrgClass>
</div>
</div>
@@ -138,11 +138,11 @@
</div>
<div class="in">
<a-textarea
v-model:value="projectInfo.remark"
style="height: 80px"
placeholder="请输入说明"
show-count
:maxlength="200"
v-model:value="projectInfo.remark"
style="height: 80px"
placeholder="请输入说明"
show-count
:maxlength="200"
/>
</div>
</div>
@@ -151,24 +151,23 @@
<div class="inname">同步学习记录</div>
</div>
<div class="in">
<a-checkbox
v-model:checked="projectInfo.courseSyncFlag"
><span
<a-checkbox v-model:checked="projectInfo.courseSyncFlag"
><span
style="
width: 100%;
color: rgba(109, 117, 132, 1);
font-size: 14px;
"
>同步课程学习记录如学员在课程库中拥有课程的学习记录自动免修该课程</span
></a-checkbox
>同步课程学习记录如学员在课程库中拥有课程的学习记录自动免修该课程</span
></a-checkbox
>
</div>
</div>
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">项目级别</div>
</div>
@@ -179,8 +178,8 @@
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">培训体系</div>
</div>
@@ -191,15 +190,13 @@
<div class="name">
<div class="namebox">
<img
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
class="nameimg"
src="../../assets/images/basicinfo/asterisk.png"
/>
<div class="inname">是否BOEU实施</div>
</div>
<div class="in">
<a-radio-group
v-model:value="projectInfo.boeFlag"
>
<a-radio-group v-model:value="projectInfo.boeFlag">
<a-radio :value="1"></a-radio>
<a-radio :value="0"></a-radio>
</a-radio-group>
@@ -210,20 +207,18 @@
<div class="footer">
<div class="btn">
<a-button v-on:click="createProject" type="primary" class="btn1"
>确定
</a-button
>
>确定
</a-button>
<a-button @click="backPage" class="btn2">取消</a-button>
</div>
</div>
</div>
</template>
<script setup>
import {useStore} from "vuex";
import {ref, onMounted, watch} from "vue";
import {message} from "ant-design-vue";
import {useRouter, useRoute} from "vue-router";
import { useStore } from "vuex";
import { ref, onMounted, watch } from "vue";
import { message } from "ant-design-vue";
import { useRouter, useRoute } from "vue-router";
import * as api from "../../api/indexTemplate";
import ProjectClass from "@/components/project/ProjectClass";
import TrainClass from "@/components/project/TrainClass";
@@ -234,23 +229,33 @@ import ProjectLevel from "@/components/project/ProjectLevel";
const route = useRoute();
const router = useRouter();
const store = useStore();
const projectInfo = ref({})
const projectPic = ref([])
const projectInfo = ref({});
const projectPic = ref([]);
onMounted(() => {
getDetail()
projectPic.value = store.state.projectPic.map((e) => ({value: e.dictValue, label: e.dictName}));
})
getDetail();
projectPic.value = store.state.projectPic.map((e) => ({
value: e.dictValue,
label: e.dictName,
}));
});
watch(() => route.query.projectTemplateId, () => {
getDetail()
})
watch(
() => route.query.projectTemplateId,
() => {
getDetail();
}
);
const getDetail = () => route.query.projectTemplateId && api.templateDetail(route.query.projectTemplateId)
.then((res) => {
projectInfo.value = res.data.data.projectTemplateInfo;
projectInfo.value.rangeTime = [projectInfo.value.beginTime, projectInfo.value.endTime]
})
const getDetail = () =>
route.query.projectTemplateId &&
api.templateDetail(route.query.projectTemplateId).then((res) => {
projectInfo.value = res.data.data.projectTemplateInfo;
projectInfo.value.rangeTime = [
projectInfo.value.beginTime,
projectInfo.value.endTime,
];
});
const backPage = () => {
router.back();
@@ -285,18 +290,22 @@ const createProject = () => {
return;
}
}
api.templateEdit({...projectInfo.value, courseSyncFlag: projectInfo.value.courseSyncFlag ? 1 : 0}).then(() => {
message.destroy();
message.success("编辑成功");
router.back()
})
api
.templateEdit({
...projectInfo.value,
courseSyncFlag: projectInfo.value.courseSyncFlag ? 1 : 0,
})
.then(() => {
message.destroy();
message.success("编辑成功");
router.back();
});
};
function managerChange(e, l, d, t) {
projectInfo.value.valuesourceBelongId = d
projectInfo.value.sourceBelongName = t
projectInfo.value.valuesourceBelongId = d;
projectInfo.value.sourceBelongName = t;
}
</script>
<style lang="scss">
.active {

View File

@@ -6,8 +6,7 @@
* @FilePath: /fe-manage/vue.config.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
const {defineConfig} = require("@vue/cli-service");
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
publicPath: "/manage",
// transpileDependencies: true,