Files
fe-manage/src/components/drawers/CreVote.vue
2023-06-13 13:31:01 +08:00

600 lines
16 KiB
Vue

<template>
<a-drawer
:visible="crevoteVisible"
class="drawerStyle crevoteDrawer"
width="80%"
title="创建投票"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div v-if="editStem" class="headerTitle">编辑投票</div>
<div v-else class="headerTitle">创建投票</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="contentMain">
<!--
<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: 424px; height: 32px"
placeholder="请输入投票名称"
/>
</div>
</div> -->
<div class="box" @click="showDrawerCreVote">
<button class="cjtpbtn" @click="addQue()">创建题干</button>
</div>
<div class="queBox" v-for="(q, index) in questions" :key="index">
<div class="delBtn" v-if="questions.length > 1" @click="delQue(questions,index)">
<img src="@/assets/images/projectadd/delete.png" alt="" />
<div class="btnText">删除题干</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px"
>{{ q.stemTit }}{{ index + 1 }}</span
>
</div>
<div class="btnbox">
<a-input
v-model:value="q.inputV"
style="width: 424px; height: 32px"
placeholder="请输入题干"
/>
</div>
</div>
<div class="option" v-for="(o, index) in q.options" :key="index">
<div class="mainoptions">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">{{ o.title }}{{index+1}}</span>
</div>
<div class="optionbox">
<div class="btnbox">
<a-input
v-model:value="o.opvalue"
style="width: 424px; height: 32px"
/>
<button v-if="q.options.length > 2" class="delbtn" @click="delOpt(q.options,index)">
删除
</button>
</div>
<!-- <a-upload
v-show="!item.imgVal"
class="in uploadBtn"
:show-upload-list="false"
:before-upload="beforeUpload"
>
<div class="addimg">+ 上传图片</div>
</a-upload> -->
<a-button type="link">+ 上传图片</a-button>
<!-- <input class="file-upload" type="file" accept="image/*" name="picture"/> -->
</div>
</div>
</div>
<div class="main_item">
<div class="signbox"></div>
<div class="btnbox">
<div class="tjxxbtn" @click="addOpt(q.options)">
<div class="btntext">添加选项</div>
</div>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1">取消</button>
<button class="btn2" @click="creoredi()">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
import * as api from "../../api/indexVote";
import { message } from "ant-design-vue";
export default {
name: "CreVote",
props: {
crevoteVisible: {
type: Boolean,
default: false,
},
ballotId: {
type: Number,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
inputV1: "",
creVote: true,
questions: [
{
stemTit: "题干",
inputV: "",
options: [
{
title: "选项",
opvalue: "",
},
{
title: "选项",
opvalue: "",
},
],
},
],
});
const addQue = () => {
state.questions.push({
stemTit: "题干",
inputV: "",
options: [
{
title: "选项",
opvalue: "",
},
{
title: "选项",
opvalue: "",
},
],
});
};
const delQue = (value,index)=>{
value.splice(value[index],1)
}
const addOpt = (value) => {
value.push({
title: "选项",
opvalue: "",
});
};
const delOpt = (value,index) => {
value.splice(value[index],1)
}
const closeDrawer = () => {
state.inputV1 ="",
state.questions=[
{
stemTit: "题干",
inputV: "",
options: [
{
title: "选项",
opvalue: "",
},
{
title: "选项",
opvalue: "",
},
],
},
],
ctx.emit("update:crevoteVisible", false);
};
const afterVisibleChange = () => {
if (props.ballotId != 0) {
queryStemText()
}
};
//创建题干还是编辑题干
const creoredi = () => {
if (props.ballotId) {
createQueTit()
}
else {
changeStemText()
}
}
//创建题干接口
const createQueTit = () => {
for (let i = 0; i < state.questions.length; i++) {
if (!state.questions[i].inputV) {
message.destroy();
return message.warning("请输入题干");
}
}
for (let i = 0; i < state.questions.length; i++) {
for (let k = 0; k < state.questions[i].options.length; k++) {
if (!state.questions[i].options[k].opvalue) {
message.destroy();
return message.warning("请输入选项");
}
}
}
let obj = {
"ballotId": 0,
"ballotName": state.inputV1,
"createTime": "",
"createUser": 0,
"updateTime": "",
"updateUser": 0,
"voteStemDtoList": [
{
"ballotId": 0,
"createTime": "",
"createUser": 0,
"optionDetailList": [
{
"createTime": "",
"createUser": 0,
"optionFlag": "",
"optionId": 0,
// "optionName": state.questions[i].options[k].opvalue,
"optionName": "",
"optionOrderNum": "",
"optionPictureAddress": "",
"stem": "",
"updateTime": "",
"updateUser": 0,
"voteStemId": 0
}
],
"orderNumber": "",
"updateTime": "",
"updateUser": 0,
"voteStemFlag": "",
"voteStemId": 0,
// "voteStemName": state.questions[i].inputV,
"voteStemName": "",
}
]
}
api
.createOptionMessage(obj)
.then((res) => {
message.success("创建成功");
let objstem = {
ballotName: state.inputV1,
voteStemName: state.questions[0].inputV,
voteStemId: res.data.data.voteStemVoList[0].voteStemId,
ballotId: res.data.data.ballotId,
creVote: true,
};
ctx.emit("getData", objstem);
closeDrawer();
})
.catch(() => {
message.error("创建失败");
});
};
//删除选项信息
const delOptText = () => {
let objdelopt = {
// optionId: optionId
}
api
.deleteVoteStemOption(objdelopt)
.then(() => {
message.success("删除成功");
})
.catch(() => {
message.error("创建失败")s;
});
}
//根据id获取题干信息
const queryStemText = () => {
api
.queryStemByStemId({ballotId:props.ballotId})
.then((res) => {
state.inputV1 = res.data.data.voteName
})
.catch(() => {
})
}
//编辑题干信息
const changeStemText = () => {
let objcst = {
"ballotId": 0,
"ballotName": "",
"createTime": "",
"createUser": 0,
"updateTime": "",
"updateUser": 0,
"voteStemDtoList": [
{
"ballotId": 0,
"createTime": "",
"createUser": 0,
"optionDetailList": [
{
"createTime": "",
"createUser": 0,
"optionFlag": "",
"optionId": 0,
"optionName": "",
"optionOrderNum": "",
"optionPictureAddress": "",
"stem": "",
"updateTime": "",
"updateUser": 0,
"voteStemId": 0
}
],
"orderNumber": "",
"updateTime": "",
"updateUser": 0,
"voteStemFlag": "",
"voteStemId": 0,
"voteStemName": ""
}
]
}
api.updateStemMessage(objcst)
.then(() => {
message.success("修改题干信息成功")
})
.catch(() => {
message.error("修改题干信息失败")
})
}
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
addQue,
delQue,
addOpt,
delOpt,
creoredi,
createQueTit,
delOptText,
};
},
};
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.crevoteDrawer {
z-index: 9999;
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
.box {
display: flex;
flex: 1;
align-items: center;
margin-bottom: 30px;
.cjtpbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
margin-top: 32px;;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
margin-right: 5px;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
}
}
.mainoptions {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
padding-top: 5px;
margin-right: 5px;
.sign {
margin-right: 5px;
}
}
.optionbox {
.btnbox {
display: flex;
align-items: center;
}
.delbtn {
border: none;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
}
}
.queBox {
border: 1px solid #e8e8e8;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
padding-top: 30px;
margin-bottom: 30px;
.delBtn {
width: 130px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
margin-left: 20px;
margin-bottom: 20px;
img {
margin-right: 10px;
}
}
.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;
.tjxxbtn {
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
.btntext {
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>