Files
fe-manage/src/components/drawers/project/CreateCertificate.vue
2023-02-03 18:40:20 +08:00

487 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<a-drawer
:visible="CCertificate"
class="drawerStyle CreateCertificate"
width="800px"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ edit ? "编辑" : "创建" }}证书</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<a-form
ref="formRef"
name="custom-validation"
:model="state"
:rules="rules"
v-bind="layout"
@finish="handleFinish"
@validate="handleValidate"
@finishFailed="handleFinishFailed"
>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">证书名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="inputV1"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入证书名称"
show-count
:maxlength="20"
/>
</div>
</div>
<div class="main_item" style="align-items: flex-start">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">证书封面</span>
</div>
<div
class="btnbox"
style="flex-direction: column; align-items: flex-start"
>
<a-upload
v-model:file-list="fileList"
name="avatar"
style="width: 200px"
list-type="picture-card"
class="avatar-uploader"
:show-upload-list="false"
action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
:before-upload="beforeUpload"
@change="handleChange"
>
<img v-if="imageUrl" :src="imageUrl" alt="avatar" />
<div v-else>
<loading-outlined v-if="loading"></loading-outlined>
<plus-outlined v-else></plus-outlined>
<div class="ant-upload-text">+</div>
</div>
</a-upload>
<div style="font-size: 14px; color: #666">
建议尺寸750*348 格式支持jpggifpngjpegsvgbmp
</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">证书说明</span>
</div>
<div class="textarea" style="width: 400px">
<a-textarea
v-model:value="textV1"
placeholder="请输入证书说明"
allow-clear
:rows="6"
show-count
:maxlength="200"
/>
</div>
</div>
</div>
</div>
</a-form>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="updateRef">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
import * as api from "../../../api/indexExternalChain";
import * as apiTask from "../../../api/indexTaskadd";
import { message } from "ant-design-vue";
import { RouterEditTask } from "@/api/indexTask";
import { addTempTask } from "../../../api/indexTaskadd";
export default {
name: "AddRef",
props: {
CCertificate: {
type: Boolean,
default: false,
},
EditRefId: {
type: Number,
default: null,
},
edit: {
// 是否为编辑
type: Boolean,
default: null,
},
projectId: {
type: Number,
default: null,
},
chooseStageId: {
type: Number,
default: null,
},
routerTaskId: {
type: Number,
default: 0,
},
isLevel: {
// 是否是关卡页面触发
type: Number,
default: null,
},
projectTaskId: {
// 要编辑的projectId
type: Number,
default: null,
},
routerId: {
type: Number,
default: null,
},
isactive: {
type: Number,
default: null,
},
projectTemplateId: {
type: Number,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
inputV1: "",
inputV2: "",
textV1: "",
title: null,
isClick: false,
});
const closeDrawer = () => {
ctx.emit("update:CCertificate", false);
ctx.emit("update:edit", false);
state.inputV2 = "";
state.inputV1 = "";
state.textV1 = "";
// ctx.emit("changeData", false);
localStorage.setItem("stageId", props.chooseStageId);
localStorage.setItem("chapterId", props.isactive);
};
const afterVisibleChange = () => {
if (props.edit) {
queryRef();
}
};
const handleFinish = (values) => {
console.log(values);
//updateRef(props.EditRefId)
};
const handleFinishFailed = (errors) => {
console.log(errors);
// message.error("handleFinishFailed");
};
const updateTask = async (res) => {
if (props.isLevel == 1) {
if (!props.isactive) {
message.destroy();
return message.warning("请先选中关卡");
}
RouterEditTask({
chapterId: props.isactive,
courseId: res.data.data.linkId,
name: res.data.data.linkName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 7,
})
.then(async () => {
// message.success(`${props.edit ? "编辑" : "新增"}关卡任务成功`);
await ctx.emit("changeData", false);
closeDrawer();
state.addLoading = false;
})
.catch(() => {
// message.error(`${props.edit ? "编辑" : "新增"}关卡任务失败`);
});
} else if (props.isLevel == 2) {
apiTask
.addTask({
courseId: res.data.data.linkId,
name: res.data.data.linkName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 7,
})
.then(() => {
// message.success(`${props.EditTestId ? "编辑" : "新增"}阶段任务成功`);
ctx.emit("changeData", false);
closeDrawer();
})
.catch(() => {
//message.error(`${props.EditTestId ? "编辑" : "新增"}阶段任务失败`);
});
} else if (props.isLevel == 3) {
addTempTask({
courseId: res.data.data.linkId,
name: res.data.data.linkName,
projectTemplateId: props.projectTemplateId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 7,
})
.then(() => {
//message.success( `${props.EditTestId ? "编辑" : "新增"}阶段任务成功`);
ctx.emit("changeData", false);
closeDrawer();
})
.catch(() => {
//message.error(`${props.EditTestId ? "编辑" : "新增"}阶段任务失败`);
});
}
};
//创建外链
const updateRef = () => {
let c = 1111;
if (c > 0) {
closeDrawer();
return;
}
if (!state.inputV1) return message.warning("请输入外链名称");
if (!state.inputV2) {
return message.warning("请输入链接");
} else {
const reg =
/(https?|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/;
if (!reg.test(state.inputV2) && state.inputV2 != "") {
return message.warning("请输入合法的链接地址");
}
}
if (state.isClick) {
message.destroy();
message.error("请勿频繁点击");
return;
}
state.isClick = true;
let obj = {
linkAddress: state.inputV2,
linkDescription: state.textV1,
linkId: props.edit ? props.EditRefId : 0,
linkName: state.inputV1,
};
if (props.edit) {
api
.updateLinks(obj)
.then(async (res) => {
message.success("编辑成功");
await updateTask(res);
ctx.emit("changeData", false);
state.isClick = false;
})
.catch(() => {
state.isClick = false;
});
} else {
api
.createExternalChain(obj)
.then(async (res) => {
message.success("提交成功");
await updateTask(res);
ctx.emit("changeData", false);
state.isClick = false;
})
.catch(() => {
state.isClick = false;
});
}
};
// 查询任务
const queryRef = () => {
let d = props.EditRefId;
api
.getLink({ linkId: d })
.then((res) => {
state.inputV1 = res.data.data.linkName;
state.inputV2 = res.data.data.linkAddress;
state.textV1 = res.data.data.linkDescription;
})
.catch(() => {
//message.error(`查询失败`);
});
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
handleFinish,
handleFinishFailed,
updateRef,
};
},
};
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.CreateCertificate {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>