<template> <div class="createPost-container"> <el-form class="form-container" :model="postForm" :rules="rules" ref="postForm"> <sticky :className="'sub-navbar '+postForm.status"> <template v-if="fetchSuccess"> <div style="display:inline-block"> <el-dropdown trigger="click"> <router-link style="margin-right:15px;" v-show='isEdit' :to="{ path:'create'}"> <el-button type="info">创建form</el-button> </router-link> <el-button>{{!postForm.comment_disabled?'评论已打开':'评论已关闭'}}<i class="el-icon-caret-bottom el-icon--right"></i></el-button> <el-dropdown-menu class="no-padding no-hover" slot="dropdown"> <el-dropdown-item> <el-radio-group style="padding: 10px;" v-model="postForm.comment_disabled"> <el-radio :label="true">关闭评论</el-radio> <el-radio :label="false">打开评论</el-radio> </el-radio-group> </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </div> <el-dropdown trigger="click"> <el-button> 平台<i class="el-icon-caret-bottom el-icon--right"></i> </el-button> <el-dropdown-menu class="no-border" slot="dropdown"> <el-checkbox-group v-model="postForm.platforms" style="padding: 5px 15px;"> <el-checkbox v-for="item in platformsOptions" :label="item.key" :key="item.key"> {{item.name}} </el-checkbox> </el-checkbox-group> </el-dropdown-menu> </el-dropdown> <el-dropdown trigger="click"> <el-button> 外链<i class="el-icon-caret-bottom el-icon--right"></i> </el-button> <el-dropdown-menu class="no-padding no-border" style="width:300px" slot="dropdown"> <el-form-item label-width="0px" style="margin-bottom: 0px" prop="source_uri"> <el-input placeholder="请输入内容" v-model="postForm.source_uri"> <template slot="prepend">填写url</template> </el-input> </el-form-item> </el-dropdown-menu> </el-dropdown> <el-button v-loading="loading" style="margin-left: 10px;" type="success" @click="submitForm()">发布 </el-button> <el-button v-loading="loading" type="warning" @click="draftForm">草稿</el-button> </template> <template v-else> <el-tag>发送异常错误,刷新页面,或者联系程序员</el-tag> </template> </sticky> <div class="createPost-main-container"> <el-row> <el-col :span="21"> <el-form-item style="margin-bottom: 40px;" prop="title"> <MDinput name="name" v-model="postForm.title" required :maxlength="100"> 标题 </MDinput> <span v-show="postForm.title.length>=26" class='title-prompt'>app可能会显示不全</span> </el-form-item> <div class="postInfo-container"> <el-row> <el-col :span="8"> <el-form-item label-width="45px" label="作者:" class="postInfo-container-item"> <multiselect v-model="postForm.author" :options="userLIstOptions" @search-change="getRemoteUserList" placeholder="搜索用户" selectLabel="选择" deselectLabel="删除" track-by="key" :internalSearch="false" label="key"> <span slot='noResult'>无结果</span> </multiselect> </el-form-item> </el-col> <el-col :span="8"> <el-tooltip class="item" effect="dark" content="将替换作者" placement="top"> <el-form-item label-width="50px" label="来源:" class="postInfo-container-item"> <el-input placeholder="将替换作者" style='min-width:150px;' v-model="postForm.source_name"> </el-input> </el-form-item> </el-tooltip> </el-col> <el-col :span="8"> <el-form-item label-width="80px" label="发布时间:" class="postInfo-container-item"> <el-date-picker v-model="postForm.display_time" type="datetime" format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间"> </el-date-picker> </el-form-item> </el-col> </el-row> </div> </el-col> </el-row> <el-form-item style="margin-bottom: 40px;" label-width="45px" label="摘要:"> <el-input type="textarea" class="article-textarea" :rows="1" autosize placeholder="请输入内容" v-model="postForm.content_short"> </el-input> <span class="word-counter" v-show="contentShortLength">{{contentShortLength}}字</span> </el-form-item> <div class="editor-container"> <tinymce :height=400 ref="editor" v-model="postForm.content"></tinymce> </div> <div style="margin-bottom: 20px;"> <Upload v-model="postForm.image_uri"></Upload> </div> </div> </el-form> </div> </template> <script> import Tinymce from '@/components/Tinymce' import Upload from '@/components/Upload/singleImage3' import MDinput from '@/components/MDinput' import Multiselect from 'vue-multiselect'// 使用的一个多选框组件,element-ui的select不能满足所有需求 import 'vue-multiselect/dist/vue-multiselect.min.css'// 多选框组件css import Sticky from '@/components/Sticky' // 粘性header组件 import { validateURL } from '@/utils/validate' import { fetchArticle } from '@/api/article' import { userSearch } from '@/api/remoteSearch' export default { name: 'articleDetail', components: { Tinymce, MDinput, Upload, Multiselect, Sticky }, data() { const validateRequire = (rule, value, callback) => { if (value === '') { this.$message({ message: rule.field + '为必传项', type: 'error' }) callback(null) } else { callback() } } const validateSourceUri = (rule, value, callback) => { if (value) { if (validateURL(value)) { callback() } else { this.$message({ message: '外链url填写不正确', type: 'error' }) callback(null) } } else { callback() } } return { postForm: { title: '', // 文章题目 content: '', // 文章内容 content_short: '', // 文章摘要 source_uri: '', // 文章外链 image_uri: '', // 文章图片 source_name: '', // 文章外部作者 display_time: undefined, // 前台展示时间 id: undefined, platforms: ['a-platform'] }, fetchSuccess: true, loading: false, userLIstOptions: [], platformsOptions: [ { key: 'a-platform', name: 'a-platform' }, { key: 'b-platform', name: 'b-platform' }, { key: 'c-platform', name: 'c-platform' } ], rules: { image_uri: [{ validator: validateRequire }], title: [{ validator: validateRequire }], content: [{ validator: validateRequire }], source_uri: [{ validator: validateSourceUri, trigger: 'blur' }] } } }, computed: { contentShortLength() { return this.postForm.content_short.length }, isEdit() { return this.$route.meta.isEdit // 根据meta判断 // return this.$route.path.indexOf('edit') !== -1 // 根据路由判断 } }, created() { if (this.isEdit) { this.fetchData() } }, methods: { fetchData() { fetchArticle().then(response => { this.postForm = response.data }).catch(err => { this.fetchSuccess = false console.log(err) }) }, submitForm() { this.postForm.display_time = parseInt(this.display_time / 1000) console.log(this.postForm) this.$refs.postForm.validate(valid => { if (valid) { this.loading = true this.$notify({ title: '成功', message: '发布文章成功', type: 'success', duration: 2000 }) this.postForm.status = 'published' this.loading = false } else { console.log('error submit!!') return false } }) }, draftForm() { if (this.postForm.content.length === 0 || this.postForm.title.length === 0) { this.$message({ message: '请填写必要的标题和内容', type: 'warning' }) return } this.$message({ message: '保存成功', type: 'success', showClose: true, duration: 1000 }) this.postForm.status = 'draft' }, getRemoteUserList(query) { userSearch(query).then(response => { if (!response.data.items) return console.log(response) this.userLIstOptions = response.data.items.map(v => ({ key: v.name })) }) } } } </script> <style rel="stylesheet/scss" lang="scss" scoped> @import "src/styles/mixin.scss"; .title-prompt{ position: absolute; right: 0px; font-size: 12px; top:10px; color:#ff4949; } .createPost-container { position: relative; .createPost-main-container { padding: 40px 45px 20px 50px; .postInfo-container { position: relative; @include clearfix; margin-bottom: 10px; .postInfo-container-item { float: left; } } .editor-container { min-height: 500px; margin: 0 0 30px; .editor-upload-btn-container { text-align: right; margin-right: 10px; .editor-upload-btn { display: inline-block; } } } } .word-counter { width: 40px; position: absolute; right: -10px; top: 0px; } } </style>