Files
ylst-pc/src/Layouts/BaseLayout.vue
2022-11-16 23:30:15 +08:00

635 lines
16 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>
<div class="header">
<div class="left">
<i class="iconfont icon-xiangzuo-moren"
@click="backHome"></i>
<a-tooltip placement="right">
<template #title>
{{ project_name }}
</template>
<div class="question-name">{{ project_name }}</div>
</a-tooltip>
</div>
<div class="tab-container">
<div class="tab-item"
style="font-size:18px"
v-for="(tab, index) in tabs"
:key="index"
:class="[tab.link === currentPath ? 'active' : '']"
@click="toPage(tab.link, tab.title)">
<span :class="tab.link === currentPath ? 'click' : 'click2'">{{ index+1 }}</span>
<span style="font-size:16px">{{ tab.title }}</span>
<span v-if="index!=3"
style="width:27px;margin:0 10px;border-top: 1px dashed #C4C0C0;"></span>
</div>
</div>
<div class="right"
v-if="showPreview || isRenderBtn || showShare">
<template v-if="!showLoading">
<div v-show="showPreview"
class="preview-btn"
@click="toPreview">
<i class="iconfont icon-yulan"></i>
<span style="margin-left: 6px;width: 29px;">预览</span>
</div>
<a-button
class="publish-btn share-button"
style="display: flex;align-items: center;"
@click.stop="clickEntrance">
<template #icon>
<img class="download_img"
:src="require('@/assets/img/fenxiang.png')" />
</template>
分享
</a-button>
</template>
<template v-else>
<div style="display: flex; align-items: center;">
<a-spin size="small" style="padding-left: 40px;"/>
<span style="margin-left: 10px;width: 90px;">正在保存中...</span>
</div>
</template>
<a-button v-show="!showPublish && isRenderBtn"
type="primary"
class="publish-btn"
style="display: flex;align-items: center;"
@click="openPublishModal">
<template #icon>
<img class="download_img"
:src="require('@/assets/img/fabu.png')" />
</template>
发布
</a-button>
<a-button type="primary"
class="download-btn share-button"
style="display: flex;align-items: center;"
@click.stop="toDownload"
v-if="showDownload&&showxiazai">
<template #icon>
<img class="download_img"
:src="require('@/assets/img/download_center.png')" />
</template>
下载中心
</a-button>
<!-- <Avatar :onlyUserShow="false" /> -->
</div>
<div class="right"
v-if="!showPreview && !isRenderBtn && !showShare">
<a-button
class="publish-btn share-button"
style="display: flex;align-items: center;"
@click.stop="clickEntrance">
<template #icon>
<img class="download_img"
:src="require('@/assets/img/fenxiang.png')" />
</template>
分享
</a-button>
<a-button type="primary"
class="download-btn share-button"
style="display: flex;align-items: center;"
@click.stop="toDownload"
v-if="showDownload">
<template #icon>
<img class="download_img"
:src="require('@/assets/img/download_center.png')" />
</template>
下载中心
</a-button>
<!-- <Avatar :onlyUserShow="false" /> -->
</div>
</div>
<Group ref="groupInfo"
:visible="visibleShare"
:sn="sn"></Group>
<div class="big_box"
@click.stop="visibleShare = false"
v-show="visibleShare"
style="z-index: 1"></div>
<a-modal v-model:visible="visible"
@ok="handlePublish">
<div class="content">
<div class="tips">
<div class="iconfont icon-tixing"></div>
<div>提示!</div>
</div>
<div class="text">确定发布该问卷吗</div>
</div>
</a-modal>
<!-- 下载中心 -->
<DownloadCenter v-model:visible="downloadVisible" v-if="downloadVisible"></DownloadCenter>
</template>
<script setup>
import { ref, computed, onMounted, createVNode,nextTick } from "vue";
import { useRouter, useRoute } from "vue-router";
import useEmitter from "@/composables/useEmitter";
import { publishSurvey, getSurveyInfo } from "@/api/publish";
import { useStore } from "vuex";
import {
ExclamationCircleFilled,
ShareAltOutlined,
ExclamationCircleOutlined,
} from "@ant-design/icons-vue";
import Group from "./components/Group/Group.vue";
import Avatar from "@/views/Home/components/Avatar.vue";
import { tr } from "element-plus/lib/locale";
import { Modal } from "ant-design-vue";
import { cloneDeep } from "lodash";
import DownloadCenter from "@/views/DownloadCenter/index.vue";
import { canPlanetPublish } from "./utils";
const router = useRouter();
const route = useRoute();
const store = useStore();
const emitter = useEmitter();
const publish_type = 0;
const sn = route.query.sn;
const tabs = ref([
{
title: "问卷设计",
link: "/survey/planet",
},
{
title: "问卷投放",
link: "/survey/publish",
},
{
title: "执行进度",
link: "/survey/schedule/recycle",
},
{
title: "数据分析",
link: "/survey/analyse",
},
]);
const getParentNode = () => {
return document.querySelector(".header");
};
const visible = ref(false);
const project_name = ref("");
const currentPath = computed(() => {
const matches = route.matched.map((item) => item.path);
if (!matches) {
return "";
}
let paths = cloneDeep(matches);
const links = tabs.value.map((item) => item.link);
let nearestPath = "";
while (paths.length > 0) {
const pop = paths.pop();
if (links.includes(pop)) {
nearestPath = pop;
}
}
return nearestPath;
});
const toJump = (url) => {
router.push(url);
};
const toTeamCenter = () => {
toJump("/team-manage/team-center");
};
const isRenderBtn = computed(() => {
// return currentPath.value.includes('design')
return (
route.matched.some((item) => item.meta?.showPublish) &&
(store.state.common.surveyStatus !== 1 || route.path !== "/survey/planet/answer-setting")
);
});
const showPreview = computed(() => {
return route.matched.some((item) => item.meta?.showPreview);
});
const showDownload = computed(() => {
return route.matched.some((item) => item.meta?.showDownload);
});
const showShare = computed(() => {
return route.matched.some((item) => item.meta?.showShare);
});
const showPublish = computed(() => {
return store.state.common.surveyStatus;
});
const showLoading = computed(() => {
if (store.state.common.websocket.param !== undefined) {
return !store.state.common.websocket.param.is_cache;
}
return false;
});
const toPage = (path, title) => {
console.log(path, title)
showxiazai.value=null
if(path!='/survey/planet'&&path!="/survey/schedule/recycle"){
showxiazai.value=true
}
router.push({
path,
query: route.query,
});
document.title = title;
};
const toPreview = async () => {
var res = await canPlanetPublish(route.query.sn);
if (res) {
router.push({
path: "/preview",
query: route.query,
});
document.title = name;
}
};
const openPublishModal = async () => {
var res = await canPlanetPublish(route.query.sn);
if(res){
visible.value = true;
return;
}
// //console.log();
// // return;
// let isFb = true;
// let content = "";
// const qSteams = [];
// let type = 0;
// let title = "推荐提示";
// store.state.common.questionInfo.questions &&
// store.state.common.questionInfo.questions.forEach((s) => {
// if (s.question_type === 105 && s.config.design_version <= 0) {
// isFb = false;
// content = createVNode(<div>maxdiff未生成设计请先进行生成设计才能进行发布</div>);
// title = "推荐提示";
// type = 1;
// }
// if (s.question_type === 25 || s.question_type === 26) {
// if ((s.options?.[0]?.length || 0) <= 0 && (s?.associate?.length || 0) <= 0) {
// isFb = false;
// qSteams.push(`(${s.title})`);
// type = 2;
// }
// }
// });
// if (isFb === true) {
// visible.value = true;
// } else {
// if (type === 2) {
// const titleStr = qSteams.join(",");
// title = "添加选区";
// content = createVNode(<div>{titleStr} 未添加选区,请添加选区后进行发布</div>);
// }
// Modal.confirm({
// title: title,
// icon: createVNode(ExclamationCircleOutlined),
// content: content,
// onOk () { },
// width: "640px",
// height: "364px",
// onCancel () { },
// class: "test",
// });
// }
};
const handlePublish = () => {
publishSurvey({
sn,
publish_type,
}).then((res) => {
visible.value = false;
store.commit("common/M_COMMON_SET_SURVEY_STATUS", 1);
router.push({
path: "/survey/publish",
query: {
sn,
is_publish: true, //添加标识
},
});
});
};
const backHome = () => {
router.push("/home");
document.title = "智能调研工具";
};
const fetchInfo = () => {
getSurveyInfo(sn).then((res) => {
project_name.value = res.data.project_name;
store.commit("common/M_COMMON_SET_SURVEY_NAME", res.data.project_name);
store.commit("common/M_COMMON_SET_SURVEY_STATUS", res.data.status);
});
};
const visibleShare = ref(false);
// 展示分享入口
const clickEntrance = () => {
console.log("展示入口");
visibleShare.value = true;
};
const groupInfo = ref(null);
const downloadVisible = computed(() => {
return store.state.downloadCenter.isShow;
});
// 下载中心
const toDownload = () => {
console.log("下载中心");
store.dispatch('downloadCenter/changeCenterUrl', route.path)
// downloadVisible.value = true
store.dispatch('downloadCenter/changeCenterShow',true)
// router.push({
// path: "/downloadCenter",
// query: { path: route.path, sn },
// });
};
const showxiazai=ref(true)
onMounted(() => {
if(route.path=='/survey/planet/design'){
showxiazai.value=false
}
fetchInfo();
});
</script>
<style lang="scss" scoped>
.header {
box-sizing: border-box;
padding: 0 34px;
height: 70px;
display: flex;
align-items: center;
background: #fff;
box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.06);
.left,
.right {
display: flex;
align-items: center;
width: 40%;
.question-name {
margin-left: 17px;
font-size: 16px;
font-family: PingFangSC-Regular, PingFang SC;
color: #434343;
width: 150px;
overflow:hidden;
text-overflow: ellipsis;
white-space: nowrap;
-webkit-line-clamp: 1;
}
.icon-xiangzuo-moren {
cursor: pointer;
font-size: 10px;
}
}
.tab-container {
width: 60%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
.tab-item {
position: relative;
width: auto;
height: 100%;
display: flex;
align-items: center;
font-size: 18px;
color: #434343;
white-space: nowrap;
font-family: PingFangSC-Regular, PingFang SC;
cursor: pointer;
&.active {
font-size: 20px;
color: #70b936;
font-weight: 500;
font-family: PingFangSC-Semibold, PingFang SC;
.click {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
padding-top:5px;
padding-bottom:5px;
line-height: 10px;
border-radius: 60%;
background-color: #70b936;
color: #fff;
}
.click2 {
width: 20px;
height: 20px;
padding-top:5px;
padding-bottom:5px;
line-height: 10px;
border-radius: 60%;
background-color: #f5f5f5;
color: black;
text-align: center;
}
}
}
}
.right {
justify-content: flex-end;
}
.preview-btn {
display: flex;
align-items: center;
font-size: 16px;
color: #646a73;
cursor: pointer;
}
.preview-btn:hover {
color: #70b936;
}
.publish-btn {
margin-left: 10px;
height: 36px;
line-height: 18px;
border-radius: 6px;
}
.download-btn {
margin-left: 32px;
// width: 88px;
height: 36px;
line-height: 18px;
border-radius: 6px;
}
.share-button {
margin-left: 10px;
font-size: 16px;
}
.head-portrait {
width: 32px;
height: 32px;
background: #70b936;
border-radius: 50%;
opacity: 1;
margin-left: 32px;
color: #fff;
font-size: 12px;
font-family: PingFang SC-中粗体, PingFang SC;
font-weight: normal;
text-align: center;
line-height: 32px;
}
&::v-deep .ant-dropdown-menu-item {
padding: 0;
}
}
.ant-dropdown-menu {
margin: 0;
}
.ant-dropdown-placement-bottomRight {
height: 398px;
}
.head-portrait-menu {
width: 360px;
height: 398px;
margin-top: 26px;
.wai {
width: auto;
// height: 398px;
.one {
width: 296px;
height: 124px;
border-bottom: 1px solid #e8e8e8;
margin-left: 32px;
display: flex;
.leftt {
width: 60px;
height: 60px;
border-radius: 50%;
background: #70b936;
opacity: 1;
margin-top: 32px;
text-align: center;
line-height: 60px;
color: #fff;
}
.rightt {
width: 60px;
height: 60px;
margin-left: 12px;
margin-top: 39px;
.wenzi {
font-size: 16px;
font-family: PingFang SC-中粗体, PingFang SC;
font-weight: 700;
}
}
}
.two {
width: 296px;
height: 124px;
border-bottom: 1px solid #e8e8e8;
margin-left: 32px;
overflow: hidden;
.homepage {
font-size: 16px;
margin-top: 32px;
font-weight: 700;
}
.team-members {
font-size: 16px;
margin-top: 32px;
// margin-bottom: 16px;
font-weight: 700;
}
}
.three {
width: 296px;
height: 124px;
margin-left: 32px;
// overflow: hidden;
.switch-team {
display: flex;
justify-content: space-between;
font-size: 16px;
margin-top: 32px;
font-weight: 700;
}
.log-out {
font-size: 16px;
margin-top: 32px;
font-weight: 700;
}
}
}
}
.tips {
display: flex;
align-items: center;
.icon-tixing {
margin-right: 8px;
color: #fbad13;
font-size: 14px;
font-weight: bold;
}
}
.text {
margin-top: 12px;
}
.big_box {
width: 100%;
height: calc(100% + 70px);
position: fixed;
top: 0;
// background-color: #000;
}
.iconfont {
transform-origin: right;
}
.icon-chexiao {
transform: rotateY(180deg);
}
.download_img {
width: 24px;
height: 24px;
margin-right: 6px;
}
.click {
width: 20px;
height: 20px;
padding-top:5px;
padding-bottom:5px;
line-height: 10px;
font-size: 12px;
border-radius: 60%;
background-color: #70b936;
color: #fff;
text-align: center;
margin-right: 8px;
}
.click2 {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
padding-top:5px;
padding-bottom:5px;
line-height: 10px;
font-size: 12px;
border-radius: 60%;
background-color: #f5f5f5;
margin-right: 8px;
}
</style>