579 lines
18 KiB
Vue
579 lines
18 KiB
Vue
<template>
|
||
<Head>
|
||
<Title>寄托天下 - 面经发布</Title>
|
||
<Meta name="keyword" content="留学资讯,留学交流论坛,留学面经,面试经验,寄托天下" />
|
||
</Head>
|
||
<div class="content-box">
|
||
<div class="flexacenter save-box save-left" @click="submit(0)">
|
||
<img class="save-icon" src="@/assets/img/arrow-gray.png" />
|
||
保存并退出
|
||
</div>
|
||
<div class="flexacenter save-box save-right" @click="abandonSaving">
|
||
放弃保存
|
||
<img class="save-icon" src="@/assets/img/cross-icon.png" />
|
||
</div>
|
||
<div class="contentcontent flex1">
|
||
<div class="header flexacenter">发布面经</div>
|
||
<div class="box flex1 flexflex">
|
||
<div class="box-left">
|
||
<div class="area-box">
|
||
<div class="item">
|
||
<div class="titletitle flexacenter">
|
||
申请信息
|
||
<div class="asterisk">*</div>
|
||
</div>
|
||
<div class="info-box">
|
||
<div class="info-item flexacenter">
|
||
<div class="info-name">院校</div>
|
||
<div class="flex1">
|
||
<el-autocomplete v-model="info.school" :fetch-suggestions="querySchoolSearch" clearable class="inline-input w-50" placeholder="输入关键词,选择院校" @select="handleSchoolSelect" :trigger-on-focus="false">
|
||
<!-- <template #suffix>
|
||
<img class="arrows-icon" :class="{ 'spin': isSchoolSpin }" src="@/assets/img/arrow-black.svg" />
|
||
</template> -->
|
||
</el-autocomplete>
|
||
</div>
|
||
</div>
|
||
<div class="info-item flexacenter">
|
||
<div class="info-name">专业</div>
|
||
<div class="flex1">
|
||
<el-autocomplete v-model="info.profession" :fetch-suggestions="queryMajorSearch" clearable class="inline-input w-50" placeholder="输入关键词,选择专业" @select="handleMajorSelect" :trigger-on-focus="false">
|
||
<!-- <template #suffix>
|
||
<img class="arrows-icon" :class="{ 'spin': isMajorSpin }" src="@/assets/img/arrow-black.svg" />
|
||
</template> -->
|
||
</el-autocomplete>
|
||
</div>
|
||
</div>
|
||
<div class="info-item flexacenter">
|
||
<div class="info-name">项目</div>
|
||
<el-input class="flex1 input" placeholder="请输入" v-model="info.project"></el-input>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<div class="titletitle flexacenter">
|
||
面试时间
|
||
<div class="asterisk">*</div>
|
||
</div>
|
||
|
||
<div class="time-box item-input-box flexacenter">
|
||
<el-config-provider :locale="zhCn">
|
||
<el-date-picker v-model="info.interviewtime" type="date" placeholder="请选择" size="large" class="flex1 flexacenter" :clear-icon="{}" value-format="YYYY-MM-DD" :disabled-date="setDisabled" />
|
||
</el-config-provider>
|
||
<img class="calendar-icon" src="@/assets/img/calendar-icon.svg" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<div class="titletitle flexacenter">
|
||
面经帖标题
|
||
<div class="asterisk">*</div>
|
||
</div>
|
||
|
||
<div class="title-box item-input-box flexacenter"><el-input v-model="info.subject" placeholder="给你的面经帖起一个吸引的标题吧" show-word-limit maxlength="80"></el-input></div>
|
||
</div>
|
||
</div>
|
||
<div class="visible-box flexacenter" @click="cutVisible()">
|
||
<img class="visible-icon" v-if="info.isvisiblereply == 0" src="@/assets/img/frame-no.svg" />
|
||
<img class="visible-icon" v-else src="@/assets/img/frame-pitch.svg" />
|
||
回复/点赞可见
|
||
</div>
|
||
</div>
|
||
<div class="box-right">
|
||
<div class="area-box">
|
||
<div class="item">
|
||
<div class="titletitle flexacenter">
|
||
面试构成及过程
|
||
<div class="asterisk">*</div>
|
||
</div>
|
||
<div class="course-box">
|
||
<el-input v-model="info.message" type="textarea" autosize show-word-limit maxlength="2000" placeholder="例如:项目介绍、面试时长、面试官、问题QA、需要注意的地方"></el-input>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="hint-box flexcenter">注:请确保以上内容已正确填写,发布后将不能修改</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="floor-box">
|
||
<div class="box flexacenter">
|
||
<div class="anonymous-box flexacenter" @click="cutAnonymous()">
|
||
<img class="anonymous-icon" v-if="info.anonymous == 0" src="@/assets/img/frame-no.svg" />
|
||
<img class="anonymous-icon" v-else src="@/assets/img/frame-pitch.svg" />
|
||
匿名发表
|
||
<div class="text">(发布后可修改)</div>
|
||
</div>
|
||
<div class="issue-btn flexcenter" @click="submit()">发布{{ loading ? "中..." : "" }}</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ElMessage } from "element-plus"
|
||
import zhCn from "element-plus/dist/locale/zh-cn.mjs"
|
||
const router = useRouter()
|
||
useHead({
|
||
script: [
|
||
// { src: "https://app.gter.net/bottom?tpl=header&menukey=mj" },
|
||
{ src: "https://app.gter.net/bottom?tpl=footer", body: true },
|
||
],
|
||
})
|
||
|
||
const setDisabled = time => {
|
||
return time.getTime() > Date.now() // 可选历史天、可选当前天、不可选未来天
|
||
}
|
||
|
||
onMounted(() => {
|
||
getInit()
|
||
})
|
||
|
||
onBeforeMount(() => {
|
||
clearBottom()
|
||
// clearTop()
|
||
})
|
||
|
||
// let isSchoolSpin = ref(false) // 院校左边箭头旋转
|
||
// let isMajorSpin = ref(false) // 专业左边箭头旋转
|
||
|
||
// const SchoolSearchBlur = () => (isSchoolSpin.value = false)
|
||
// const MajorSearchBlur = () => (isMajorSpin.value = false)
|
||
|
||
// 清除底部的次数
|
||
let clearBottomCount = 0
|
||
|
||
// 清除 底部
|
||
const clearBottom = () => {
|
||
const indexFooter = document.querySelector("section.index-footer")
|
||
if (!indexFooter) {
|
||
clearBottomCount++
|
||
setTimeout(() => clearBottom(), 50)
|
||
return
|
||
}
|
||
if (clearBottomCount == 15) return
|
||
indexFooter.style.display = "none"
|
||
}
|
||
|
||
// 清除顶部的次数
|
||
let clearTopCount = 0
|
||
|
||
// 清除 底部
|
||
const clearTop = () => {
|
||
const indexHeader = document.querySelector("header.page-header")
|
||
if (!indexHeader) {
|
||
clearTopCount++
|
||
setTimeout(() => clearTop(), 50)
|
||
return
|
||
}
|
||
if (clearTopCount == 5) return
|
||
|
||
indexHeader.style.display = "none"
|
||
}
|
||
|
||
let typetype = ref("")
|
||
let token = ""
|
||
const getInit = () => {
|
||
publishInitHttp().then(res => {
|
||
if (res.code != 200) {
|
||
ElMessage.error(res.message)
|
||
return
|
||
}
|
||
const data = res.data
|
||
token = data["token"]
|
||
let interviewtime = data["info"]["interviewtime"] || 0
|
||
if (interviewtime) data["info"]["interviewtime"] = handleDate(interviewtime)
|
||
|
||
info.value = { ...data["info"] }
|
||
})
|
||
}
|
||
|
||
// 处理初始化 面试时间的 时间戳格式
|
||
const handleDate = timestamp => {
|
||
// 使用Date对象将时间戳转换为日期对象
|
||
var date = new Date(timestamp * 1000)
|
||
|
||
// 获取年份、月份和日期
|
||
var year = date.getFullYear()
|
||
var month = ("0" + (date.getMonth() + 1)).slice(-2) // 月份从0开始,需要加1并补0
|
||
var day = ("0" + date.getDate()).slice(-2) // 获取日期并补0
|
||
|
||
// 拼接为yyyy-mm-dd格式的日期字符串
|
||
var formattedDate = year + "-" + month + "-" + day
|
||
|
||
return formattedDate
|
||
}
|
||
|
||
let info = ref({
|
||
school: "", // 学校
|
||
profession: "", // 专业
|
||
project: "", // 项目时间
|
||
interviewtime: "", // 面试时间
|
||
subject: "", //标题
|
||
isvisiblereply: 0, // 回复点赞可见
|
||
message: "", // 过程
|
||
anonymous: 0, // 匿名状态
|
||
})
|
||
|
||
// 关键字搜索学校
|
||
const querySchoolSearch = (queryString, cb) => {
|
||
publishSchoolSearchHttp({ keyword: queryString }).then(res => {
|
||
if (res.code != 200) return
|
||
let data = res.data || []
|
||
|
||
let isRepetition = false
|
||
|
||
data.forEach(element => {
|
||
element["value"] = element["checkname"]
|
||
if (element["checkname"] == queryString) isRepetition = true
|
||
})
|
||
if (!isRepetition) data.push({ value: queryString })
|
||
// isSchoolSpin.value = true
|
||
cb(data)
|
||
})
|
||
}
|
||
|
||
// 选择院校
|
||
const handleSchoolSelect = item => {
|
||
info.value["schoolid"] = item["id"] || 0
|
||
// isSchoolSpin.value = false
|
||
}
|
||
|
||
// 关键字搜索专业
|
||
const queryMajorSearch = (queryString, cb) => {
|
||
publishProfessionSearchHttp({ keyword: queryString }).then(res => {
|
||
if (res.code != 200) return
|
||
let data = res.data || []
|
||
|
||
let isRepetition = false
|
||
|
||
data.forEach(element => {
|
||
element["value"] = element["name"]
|
||
if (element["name"] == queryString) isRepetition = true
|
||
})
|
||
if (!isRepetition) data.push({ value: queryString })
|
||
|
||
// isMajorSpin.value = true
|
||
cb(data)
|
||
})
|
||
}
|
||
|
||
// 选择专业
|
||
const handleMajorSelect = item => {
|
||
info.value["profession_id"] = item["id"] || 0
|
||
// isMajorSpin.value = false
|
||
}
|
||
|
||
// 切换匿名状态
|
||
const cutAnonymous = () => {
|
||
info.value["anonymous"] = info.value["anonymous"] == 0 ? 1 : 0
|
||
}
|
||
|
||
// 切换回复可见状态
|
||
const cutVisible = () => {
|
||
info.value["isvisiblereply"] = info.value["isvisiblereply"] == 0 ? 1 : 0
|
||
}
|
||
|
||
let loading = ref(false)
|
||
// 提交发布
|
||
const submit = (status = 1) => {
|
||
if (loading.value) {
|
||
ElMessage.error("提交中,稍等")
|
||
return
|
||
}
|
||
|
||
loading.value = true
|
||
publishSubmitHttp({ info: info.value, token, status })
|
||
.then(res => {
|
||
if (res.code != 200) {
|
||
ElMessage.error(res.message)
|
||
return
|
||
}
|
||
|
||
const data = res.data
|
||
ElMessage.success(res.message)
|
||
|
||
// router.push(`/details/${data["uniqid"]}`)
|
||
if (status == 0) goToURL(`/index.html`, false)
|
||
else goToURL(`/details/${data["uniqid"]}`, false)
|
||
})
|
||
.finally(() => (loading.value = false))
|
||
}
|
||
|
||
// 放弃保存 跳跃上一页或者首页
|
||
const abandonSaving = () => {
|
||
if (router.currentRoute.value.meta.previousPage) router.go(-1)
|
||
else goToURL("./index.html", false) // 跳转到首页
|
||
// else router.push("./index.html") // 跳转到首页
|
||
}
|
||
</script>
|
||
|
||
<style scoped lang="less">
|
||
.content-box {
|
||
// padding: 0 10px;
|
||
padding: 0 122px;
|
||
display: flex;
|
||
justify-content: center;
|
||
}
|
||
|
||
@media (max-width: 920px) {
|
||
.content-box {
|
||
display: block;
|
||
padding: 0 10px;
|
||
// padding: 0 122px;
|
||
}
|
||
}
|
||
.contentcontent {
|
||
// width: 1200px;
|
||
max-width: 1200px;
|
||
min-width: 900px;
|
||
// height: 882px;
|
||
// min-height: 718px;
|
||
min-height: calc(100vh - 120px);
|
||
background: #fff;
|
||
margin: 30px auto 90px;
|
||
border-radius: 16px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
position: relative;
|
||
// margin: 0 10px;
|
||
|
||
.header {
|
||
font-weight: 650;
|
||
font-size: 20px;
|
||
color: #000000;
|
||
border-bottom: 1px solid #ebebeb;
|
||
height: 88px;
|
||
padding-left: 30px;
|
||
}
|
||
|
||
.box {
|
||
.titletitle {
|
||
color: #666666;
|
||
font-size: 14px;
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.box-left {
|
||
width: 44.333%;
|
||
border-right: 16px solid #f6f6f6;
|
||
.area-box {
|
||
padding: 30px;
|
||
padding-right: 50px;
|
||
border-bottom: 1px solid #ebebeb;
|
||
|
||
.item {
|
||
&:not(:last-of-type) {
|
||
margin-bottom: 30px;
|
||
}
|
||
}
|
||
|
||
.info-box {
|
||
// width: 452px;
|
||
height: 158px;
|
||
background-color: rgba(255, 255, 255, 0);
|
||
border: 1px solid rgba(215, 215, 215, 1);
|
||
border-radius: 5px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
.info-item {
|
||
height: 50px;
|
||
|
||
&:not(:last-of-type) {
|
||
border-bottom: 1px solid #d7d7d7;
|
||
}
|
||
|
||
.info-name {
|
||
font-size: 14px;
|
||
color: #666666;
|
||
padding: 0 14px;
|
||
}
|
||
|
||
.input {
|
||
height: 100%;
|
||
// background: #000000;
|
||
// padding: 1px 11px;
|
||
border: none;
|
||
outline: none;
|
||
box-shadow: none;
|
||
|
||
/deep/ .el-input__wrapper {
|
||
box-shadow: none;
|
||
}
|
||
}
|
||
|
||
/deep/ .el-autocomplete {
|
||
width: 99%;
|
||
|
||
.el-input__wrapper {
|
||
box-shadow: none;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.item-input-box {
|
||
// width: 452px;
|
||
height: 46px;
|
||
border: 1px solid rgba(215, 215, 215, 1);
|
||
border-radius: 5px;
|
||
cursor: pointer;
|
||
/deep/ .el-input {
|
||
height: 100%;
|
||
.el-input__wrapper {
|
||
height: 100%;
|
||
box-shadow: none;
|
||
}
|
||
}
|
||
}
|
||
|
||
.time-box {
|
||
.calendar-icon {
|
||
width: 15px;
|
||
height: 16px;
|
||
margin: 0 12px;
|
||
}
|
||
|
||
/deep/ .el-input {
|
||
.el-input__prefix {
|
||
display: none;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.visible-box {
|
||
margin: 30px;
|
||
font-size: 14px;
|
||
color: #555555;
|
||
cursor: pointer;
|
||
user-select: none;
|
||
.visible-icon {
|
||
width: 18px;
|
||
height: 18px;
|
||
margin-right: 5px;
|
||
}
|
||
}
|
||
}
|
||
|
||
.box-right {
|
||
width: 54.333%;
|
||
.area-box {
|
||
padding: 30px;
|
||
padding-left: 50px;
|
||
|
||
.course-box {
|
||
// width: 572px;
|
||
min-height: 480px;
|
||
background-color: rgba(255, 255, 255, 0);
|
||
border: 1px solid rgba(215, 215, 215, 1);
|
||
border-radius: 5px;
|
||
|
||
/deep/ .el-textarea__inner {
|
||
min-height: 480px !important;
|
||
box-shadow: none;
|
||
padding: 13px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.hint-box {
|
||
height: 58px;
|
||
background-color: rgba(246, 246, 246, 1);
|
||
color: #555555;
|
||
font-size: 13px;
|
||
}
|
||
}
|
||
.asterisk {
|
||
color: #fa9183;
|
||
margin-left: 5px;
|
||
}
|
||
|
||
.floor-box {
|
||
width: 100vw;
|
||
min-width: 1200px;
|
||
height: 90px;
|
||
background-color: rgba(255, 255, 255, 1);
|
||
-moz-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.192156862745098);
|
||
-webkit-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.192156862745098);
|
||
box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.192156862745098);
|
||
position: fixed;
|
||
bottom: 0;
|
||
.box {
|
||
width: 1200px;
|
||
height: 100%;
|
||
margin: 0 auto;
|
||
justify-content: space-between;
|
||
padding: 0 30px;
|
||
.anonymous-box {
|
||
cursor: pointer;
|
||
color: #333333;
|
||
font-size: 14px;
|
||
user-select: none;
|
||
|
||
.text {
|
||
color: rgb(170, 170, 170);
|
||
font-size: 13px;
|
||
}
|
||
.anonymous-icon {
|
||
width: 18px;
|
||
height: 18px;
|
||
}
|
||
}
|
||
.issue-btn {
|
||
width: 200px;
|
||
height: 46px;
|
||
background-color: rgba(253, 223, 109, 1);
|
||
border-radius: 190px;
|
||
font-size: 16px;
|
||
color: #000000;
|
||
cursor: pointer;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
.save-box {
|
||
font-size: 14px;
|
||
color: #666666;
|
||
position: absolute;
|
||
// position: fixed;
|
||
top: 30px;
|
||
cursor: pointer;
|
||
transition: all 0.3s;
|
||
z-index: 1;
|
||
&.save-left {
|
||
left: 0px;
|
||
// left: calc((1200px - 100vw) / 2 + 25px);
|
||
}
|
||
&.save-right {
|
||
right: 0px;
|
||
// right: calc((1200px - 100vw) / 2 + 25px);
|
||
|
||
.save-icon {
|
||
width: 16px;
|
||
height: 16px;
|
||
margin-left: 10px;
|
||
}
|
||
}
|
||
.save-icon {
|
||
width: 22px;
|
||
height: 22px;
|
||
margin-right: 10px;
|
||
transform: rotate(180deg);
|
||
}
|
||
}
|
||
|
||
// .arrows-icon {
|
||
// transition: all 0.3s;
|
||
|
||
// &.spin {
|
||
// transform: rotate(180deg);
|
||
// }
|
||
// }
|
||
</style>
|