PC-mj/pages/publish/index.vue

499 lines
16 KiB
Vue
Raw Normal View History

2023-12-18 03:12:07 +00:00
<template>
2024-01-03 09:08:29 +00:00
<Head>
<Title>寄托天下 - 面经发布</Title>
<Meta name="keyword" content="留学资讯,留学交流论坛,留学面经,面试经验,寄托天下" />
</Head>
2023-12-18 03:12:07 +00:00
<div class="content">
2024-01-03 03:42:49 +00:00
<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>
2023-12-18 03:12:07 +00:00
<div class="header flexacenter">发布面经</div>
<div class="box flex1 flexflex">
<div class="box-left">
<div class="area-box">
<div class="item">
2024-01-03 09:08:29 +00:00
<div class="titletitle flexacenter">
2023-12-18 03:12:07 +00:00
申请信息
<div class="asterisk">*</div>
</div>
<div class="info-box">
<div class="info-item flexacenter">
<div class="info-name">院校</div>
<div class="flex1">
2023-12-29 10:37:38 +00:00
<el-autocomplete debounce v-model="info.school" :fetch-suggestions="querySchoolSearch" clearable class="inline-input w-50" placeholder="输入关键词,选择院校" @select="handleSchoolSelect" :trigger-on-focus="false">
2023-12-18 03:12:07 +00:00
<template #suffix>
<img class="" src="@/assets/img/arrow-black.svg" />
</template>
</el-autocomplete>
</div>
</div>
<div class="info-item flexacenter">
<div class="info-name">专业</div>
<div class="flex1">
2023-12-29 10:37:38 +00:00
<el-autocomplete v-model="info.profession" :fetch-suggestions="queryMajorSearch" clearable class="inline-input w-50" placeholder="输入关键词,选择专业" @select="handleMajorSelect" :trigger-on-focus="false">
2023-12-18 03:12:07 +00:00
<template #suffix>
<img class="" src="@/assets/img/arrow-black.svg" />
</template>
</el-autocomplete>
</div>
</div>
<div class="info-item flexacenter">
<div class="info-name">项目</div>
2023-12-29 10:37:38 +00:00
<el-input class="flex1 input" placeholder="请输入" v-model="info.project"></el-input>
2023-12-18 03:12:07 +00:00
</div>
</div>
</div>
<div class="item">
2024-01-03 09:08:29 +00:00
<div class="titletitle flexacenter">
2023-12-18 03:12:07 +00:00
面试时间
<div class="asterisk">*</div>
</div>
<div class="time-box item-input-box flexacenter">
<el-config-provider :locale="zhCn">
2024-01-02 11:03:39 +00:00
<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" />
2023-12-18 03:12:07 +00:00
</el-config-provider>
<img class="calendar-icon" src="@/assets/img/calendar-icon.svg" />
</div>
</div>
<div class="item">
2024-01-03 09:08:29 +00:00
<div class="titletitle flexacenter">
2023-12-18 03:12:07 +00:00
面经帖标题
<div class="asterisk">*</div>
</div>
2023-12-29 10:37:38 +00:00
<div class="title-box item-input-box flexacenter"><el-input v-model="info.subject" placeholder="给你的面经帖起一个吸引的标题吧"></el-input></div>
2023-12-18 03:12:07 +00:00
</div>
</div>
2023-12-29 10:37:38 +00:00
<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" />
2023-12-18 03:12:07 +00:00
回复/点赞可见
</div>
</div>
<div class="box-right">
<div class="area-box">
<div class="item">
2024-01-03 09:08:29 +00:00
<div class="titletitle flexacenter">
2023-12-18 03:12:07 +00:00
面试构成及过程
<div class="asterisk">*</div>
</div>
<div class="course-box">
2023-12-29 10:37:38 +00:00
<el-input v-model="info.message" type="textarea" autosize placeholder="例如项目介绍、面试时长、面试官、问题QA、需要注意的地方"></el-input>
2023-12-18 03:12:07 +00:00
</div>
</div>
</div>
</div>
</div>
<div class="hint-box flexcenter">请确保以上内容已正确填写发布后将不能修改</div>
</div>
<div class="floor-box">
<div class="box flexacenter">
2023-12-29 10:37:38 +00:00
<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" />
2023-12-18 03:12:07 +00:00
匿名发表
<div class="text">发布后可修改</div>
</div>
2023-12-29 10:37:38 +00:00
<div class="issue-btn flexcenter" @click="submit()">发布</div>
2023-12-18 03:12:07 +00:00
</div>
</div>
</template>
<script setup>
2023-12-29 10:37:38 +00:00
import { ElMessage } from "element-plus"
2023-12-18 03:12:07 +00:00
import zhCn from "element-plus/dist/locale/zh-cn.mjs"
2023-12-29 10:37:38 +00:00
const router = useRouter()
2023-12-18 03:12:07 +00:00
2024-01-02 11:03:39 +00:00
const setDisabled = time => {
return time.getTime() > Date.now() // 可选历史天、可选当前天、不可选未来天
}
2023-12-18 03:12:07 +00:00
onMounted(() => {
getInit()
})
2024-01-03 07:28:16 +00:00
//
2024-01-03 09:08:29 +00:00
let typetype = ref("")
2024-01-03 07:28:16 +00:00
// const
2023-12-29 10:37:38 +00:00
let token = ""
2023-12-18 03:12:07 +00:00
const getInit = () => {
publishInitHttp().then(res => {
2023-12-29 10:37:38 +00:00
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"] }
2023-12-18 03:12:07 +00:00
})
}
2023-12-29 10:37:38 +00:00
// 处理初始化 面试时间的 时间戳格式
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) => {
2023-12-25 10:39:49 +00:00
publishSchoolSearchHttp({ keyword: queryString }).then(res => {
if (res.code != 200) return
2023-12-29 10:37:38 +00:00
let data = res.data || []
let isRepetition = false
2023-12-25 10:39:49 +00:00
data.forEach(element => {
2024-01-03 09:08:29 +00:00
element["value"] = element["checkname"]
2023-12-29 10:37:38 +00:00
if (element["name"] == queryString) isRepetition = true
2023-12-25 10:39:49 +00:00
})
2023-12-29 10:37:38 +00:00
if (!isRepetition) {
data.unshift({
value: queryString,
})
}
2023-12-25 10:39:49 +00:00
cb(data)
})
2023-12-29 10:37:38 +00:00
}
2023-12-25 10:39:49 +00:00
2023-12-29 10:37:38 +00:00
// 选择院校
const handleSchoolSelect = item => (info.value["schoolid"] = item["id"] || 0)
2023-12-25 10:39:49 +00:00
2023-12-29 10:37:38 +00:00
// 关键字搜索专业
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.unshift({
value: queryString,
})
}
cb(data)
})
2023-12-18 03:12:07 +00:00
}
2023-12-29 10:37:38 +00:00
// 选择专业
const handleMajorSelect = item => (info.value["profession_id"] = item["id"] || 0)
// 切换匿名状态
const cutAnonymous = () => {
info.value["anonymous"] = info.value["anonymous"] == 0 ? 1 : 0
2023-12-18 03:12:07 +00:00
}
2023-12-29 10:37:38 +00:00
// 切换回复可见状态
const cutVisible = () => {
info.value["isvisiblereply"] = info.value["isvisiblereply"] == 0 ? 1 : 0
}
// 提交发布
const submit = (status = 1) => {
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)
2024-01-03 07:28:16 +00:00
// router.push(`/details/${data["uniqid"]}`)
if (status == 0) goToURL(`/index.html`, false)
else goToURL(`/details/${data["uniqid"]}`, false)
2023-12-29 10:37:38 +00:00
})
2023-12-18 03:12:07 +00:00
}
2023-12-29 10:37:38 +00:00
// 放弃保存 跳跃上一页或者首页
const abandonSaving = () => {
if (router.currentRoute.value.meta.previousPage) router.go(-1)
2024-01-03 09:08:29 +00:00
else goToURL("./index.html", false) // 跳转到首页
2024-01-03 07:28:16 +00:00
// else router.push("./index.html") // 跳转到首页
2023-12-18 03:12:07 +00:00
}
</script>
<style scoped lang="less">
.content {
width: 1200px;
// height: 882px;
// min-height: 718px;
min-height: calc(100vh - 120px);
background: #fff;
margin: 30px auto 90px;
border-radius: 16px;
display: flex;
flex-direction: column;
2024-01-03 03:42:49 +00:00
position: relative;
2023-12-18 03:12:07 +00:00
.header {
font-weight: 650;
font-size: 20px;
color: #000000;
border-bottom: 1px solid #ebebeb;
height: 88px;
padding-left: 30px;
}
.box {
2024-01-03 09:08:29 +00:00
.titletitle {
2023-12-18 03:12:07 +00:00
color: #666666;
font-size: 14px;
margin-bottom: 10px;
}
.box-left {
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: 100%;
.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;
2023-12-29 10:37:38 +00:00
user-select: none;
2023-12-18 03:12:07 +00:00
.visible-icon {
width: 18px;
height: 18px;
margin-right: 5px;
}
}
}
.box-right {
.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;
2023-12-29 10:37:38 +00:00
user-select: none;
2023-12-18 03:12:07 +00:00
.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;
}
}
}
2024-01-03 03:42:49 +00:00
@media (max-width: 1300px) {
.save-box.save-left {
left: 0 !important;
}
.save-box.save-right {
right: 0 !important;
}
}
2023-12-18 03:12:07 +00:00
.save-box {
font-size: 14px;
color: #666666;
2024-01-03 03:42:49 +00:00
position: absolute;
top: 0;
2023-12-18 03:12:07 +00:00
cursor: pointer;
&.save-left {
2024-01-03 03:42:49 +00:00
// left: 0;
left: calc((1200px - 100vw) / 2 + 50px);
2023-12-18 03:12:07 +00:00
}
&.save-right {
2024-01-03 03:42:49 +00:00
// right: 0;
right: calc((1200px - 100vw) / 2 + 50px);
2023-12-18 03:12:07 +00:00
.save-icon {
width: 16px;
height: 16px;
margin-left: 10px;
}
}
.save-icon {
width: 22px;
height: 22px;
margin-right: 10px;
transform: rotate(180deg);
}
}
</style>