halo/src/views/sheet/SheetEdit.vue

326 lines
9.6 KiB
Vue
Raw Normal View History

2019-03-20 12:22:52 +00:00
<template>
2019-04-04 08:45:43 +00:00
<div class="page-header-index-wide">
<a-row :gutter="12">
2019-04-27 11:45:37 +00:00
<a-col :span="24">
2019-04-16 14:01:37 +00:00
<div style="margin-bottom: 16px">
<a-input
2019-04-24 14:57:18 +00:00
v-model="sheetToStage.title"
2019-04-16 14:01:37 +00:00
v-decorator="['title', { rules: [{ required: true, message: '请输入页面标题' }] }]"
size="large"
placeholder="请输入页面标题"
/>
</div>
<div id="editor">
2019-04-24 03:14:44 +00:00
<mavon-editor
2019-07-15 15:49:53 +00:00
ref="md"
2019-04-24 14:57:18 +00:00
v-model="sheetToStage.originalContent"
2019-04-24 03:14:44 +00:00
:boxShadow="false"
2019-04-24 12:31:05 +00:00
:toolbars="toolbars"
2019-04-24 03:14:44 +00:00
:ishljs="true"
2019-04-30 17:37:46 +00:00
:autofocus="false"
2019-07-15 15:49:53 +00:00
@imgAdd="pictureUploadHandle"
2019-04-24 03:14:44 +00:00
/>
2019-04-16 14:01:37 +00:00
</div>
2019-04-04 08:45:43 +00:00
</a-col>
2019-04-24 03:14:44 +00:00
<a-col
:xl="24"
:lg="24"
:md="24"
:sm="24"
:xs="24"
>
2019-04-04 08:45:43 +00:00
<a-drawer
title="页面设置"
2019-04-17 12:56:29 +00:00
:width="isMobile()?'100%':'460'"
2019-04-04 08:45:43 +00:00
:closable="true"
2019-05-10 15:49:34 +00:00
@close="()=>this.sheetSettingVisible = false"
:visible="sheetSettingVisible"
2019-04-04 08:45:43 +00:00
>
<div class="post-setting-drawer-content">
<div :style="{ marginBottom: '16px' }">
<h3 class="post-setting-drawer-title">基本设置</h3>
<div class="post-setting-drawer-item">
<a-form layout="vertical">
2019-04-16 14:01:37 +00:00
<a-form-item
label="页面路径:"
:help="options.blog_url+'/s/'+ (sheetToStage.url ? sheetToStage.url : '{auto_generate}')"
2019-04-16 14:01:37 +00:00
>
2019-04-24 14:57:18 +00:00
<a-input v-model="sheetToStage.url" />
2019-04-04 08:45:43 +00:00
</a-form-item>
2019-04-24 14:57:18 +00:00
<a-form-item label="开启评论:">
2019-04-24 03:14:44 +00:00
<a-radio-group
2019-04-24 14:57:18 +00:00
v-model="sheetToStage.disallowComment"
2019-04-24 03:14:44 +00:00
:defaultValue="false"
>
2019-04-12 15:39:39 +00:00
<a-radio :value="false">开启</a-radio>
<a-radio :value="true">关闭</a-radio>
</a-radio-group>
2019-04-04 08:45:43 +00:00
</a-form-item>
<a-form-item
label="发表时间:"
>
<a-date-picker
showTime
:defaultValue="pickerDefaultValue"
format="YYYY-MM-DD HH:mm:ss"
placeholder="Select Publish Time"
@change="onChange"
@ok="onOk"
/>
</a-form-item>
2019-04-04 08:45:43 +00:00
<a-form-item label="自定义模板:">
2019-04-24 14:57:18 +00:00
<a-select v-model="sheetToStage.template">
2019-05-10 15:49:34 +00:00
<a-select-option
key=""
value=""
></a-select-option>
2019-04-24 03:14:44 +00:00
<a-select-option
v-for="tpl in customTpls"
:key="tpl"
:value="tpl"
>{{ tpl }}</a-select-option>
2019-04-04 08:45:43 +00:00
</a-select>
</a-form-item>
</a-form>
</div>
</div>
2019-04-24 03:14:44 +00:00
<a-divider />
2019-04-04 08:45:43 +00:00
<div :style="{ marginBottom: '16px' }">
<h3 class="post-setting-drawer-title">缩略图</h3>
<div class="post-setting-drawer-item">
2019-04-24 14:57:18 +00:00
<div class="sheet-thum">
2019-04-24 03:14:44 +00:00
<img
class="img"
2019-05-05 15:29:26 +00:00
:src="sheetToStage.thumbnail || '//i.loli.net/2019/05/05/5ccf007c0a01d.png'"
2019-05-10 15:49:34 +00:00
@click="()=>this.thumDrawerVisible = true"
2019-04-24 03:14:44 +00:00
>
2019-04-25 12:21:47 +00:00
<a-button
class="sheet-thum-remove"
type="dashed"
@click="handlerRemoveThumb"
>移除</a-button>
2019-04-04 08:45:43 +00:00
</div>
</div>
</div>
2019-05-10 15:49:34 +00:00
<a-divider class="divider-transparent" />
2019-04-04 08:45:43 +00:00
</div>
2019-04-24 14:57:18 +00:00
<AttachmentSelectDrawer
v-model="thumDrawerVisible"
2019-04-26 18:40:10 +00:00
@listenToSelect="handleSelectSheetThumb"
2019-04-24 14:57:18 +00:00
:drawerWidth="460"
/>
2019-04-25 12:21:47 +00:00
<div class="bottom-control">
2019-04-24 03:14:44 +00:00
<a-button
style="marginRight: 8px"
@click="handleDraftClick"
>保存草稿</a-button>
<a-button
type="primary"
@click="handlePublishClick"
2019-04-28 14:17:57 +00:00
>发布</a-button>
2019-04-04 08:45:43 +00:00
</div>
</a-drawer>
</a-col>
</a-row>
2019-04-24 03:14:44 +00:00
<AttachmentDrawer v-model="attachmentDrawerVisible" />
<footer-tool-bar :style="{ width: isSideMenu() && isDesktop() ? `calc(100% - ${sidebarOpened ? 256 : 80}px)` : '100%'}">
<a-button
type="primary"
2019-05-10 15:49:34 +00:00
@click="()=>this.sheetSettingVisible = true"
2019-04-24 03:14:44 +00:00
>发布</a-button>
<a-button
type="dashed"
style="margin-left: 8px;"
2019-05-10 15:49:34 +00:00
@click="()=>this.attachmentDrawerVisible = true"
2019-04-24 03:14:44 +00:00
>附件库</a-button>
2019-04-16 14:01:37 +00:00
</footer-tool-bar>
2019-04-04 08:45:43 +00:00
</div>
2019-03-20 12:22:52 +00:00
</template>
2019-03-19 08:43:49 +00:00
<script>
2019-04-04 08:45:43 +00:00
import { mavonEditor } from 'mavon-editor'
2019-04-19 16:26:01 +00:00
import AttachmentDrawer from '../attachment/components/AttachmentDrawer'
2019-04-24 14:57:18 +00:00
import AttachmentSelectDrawer from '../attachment/components/AttachmentSelectDrawer'
2019-04-16 14:01:37 +00:00
import FooterToolBar from '@/components/FooterToolbar'
2019-04-04 08:45:43 +00:00
import { mixin, mixinDevice } from '@/utils/mixin.js'
2019-04-25 12:21:47 +00:00
import { toolbars } from '@/core/const'
2019-04-04 08:45:43 +00:00
import 'mavon-editor/dist/css/index.css'
2019-04-24 14:57:18 +00:00
import sheetApi from '@/api/sheet'
2019-04-12 15:39:39 +00:00
import themeApi from '@/api/theme'
import optionApi from '@/api/option'
2019-07-15 15:49:53 +00:00
import attachmentApi from '@/api/attachment'
import moment from 'moment'
2019-04-04 08:45:43 +00:00
export default {
components: {
2019-04-16 14:01:37 +00:00
mavonEditor,
2019-04-19 16:26:01 +00:00
FooterToolBar,
2019-04-24 14:57:18 +00:00
AttachmentDrawer,
AttachmentSelectDrawer
2019-04-04 08:45:43 +00:00
},
mixins: [mixin, mixinDevice],
data() {
return {
2019-04-25 12:21:47 +00:00
toolbars,
2019-04-04 08:45:43 +00:00
wrapperCol: {
xl: { span: 24 },
sm: { span: 24 },
xs: { span: 24 }
},
2019-04-19 16:26:01 +00:00
attachmentDrawerVisible: false,
2019-04-24 14:57:18 +00:00
thumDrawerVisible: false,
2019-05-10 15:49:34 +00:00
sheetSettingVisible: false,
2019-04-12 15:39:39 +00:00
customTpls: [],
2019-04-28 14:17:57 +00:00
sheetToStage: {},
timer: null,
options: [],
keys: ['blog_url']
2019-04-04 08:45:43 +00:00
}
},
created() {
this.loadCustomTpls()
this.loadOptions()
2019-04-28 14:17:57 +00:00
clearInterval(this.timer)
this.timer = null
this.autoSaveTimer()
},
destroyed: function() {
clearInterval(this.timer)
this.timer = null
2019-04-04 08:45:43 +00:00
},
2019-05-10 15:49:34 +00:00
beforeRouteLeave(to, from, next) {
if (this.timer !== null) {
clearInterval(this.timer)
}
// Auto save the sheet
this.autoSaveSheet()
next()
},
2019-04-12 15:39:39 +00:00
beforeRouteEnter(to, from, next) {
2019-04-24 14:57:18 +00:00
// Get sheetId id from query
const sheetId = to.query.sheetId
2019-04-12 15:39:39 +00:00
next(vm => {
2019-04-24 14:57:18 +00:00
if (sheetId) {
sheetApi.get(sheetId).then(response => {
const sheet = response.data.data
vm.sheetToStage = sheet
2019-04-12 15:39:39 +00:00
})
}
})
},
computed: {
pickerDefaultValue() {
if (this.sheetToStage.createTime) {
var date = new Date(this.sheetToStage.createTime)
return moment(date, 'YYYY-MM-DD HH:mm:ss')
}
return moment(new Date(), 'YYYY-MM-DD HH:mm:ss')
}
},
2019-04-04 08:45:43 +00:00
methods: {
loadCustomTpls() {
2019-04-12 15:39:39 +00:00
themeApi.customTpls().then(response => {
2019-04-04 08:45:43 +00:00
this.customTpls = response.data.data
})
},
loadOptions() {
optionApi.listAll(this.keys).then(response => {
this.options = response.data.data
})
},
2019-04-12 15:39:39 +00:00
handlePublishClick() {
2019-04-24 14:57:18 +00:00
this.sheetToStage.status = 'PUBLISHED'
2019-05-10 15:49:34 +00:00
this.saveSheet()
2019-04-12 15:39:39 +00:00
},
handleDraftClick() {
2019-04-24 14:57:18 +00:00
this.sheetToStage.status = 'DRAFT'
2019-05-10 15:49:34 +00:00
this.saveSheet()
2019-04-12 15:39:39 +00:00
},
2019-04-25 12:21:47 +00:00
handlerRemoveThumb() {
this.sheetToStage.thumbnail = null
},
2019-05-17 01:44:17 +00:00
createOrUpdateSheet(createSuccess, updateSuccess, autoSave) {
2019-04-24 14:57:18 +00:00
if (this.sheetToStage.id) {
2019-05-17 01:44:17 +00:00
sheetApi.update(this.sheetToStage.id, this.sheetToStage, autoSave).then(response => {
2019-04-24 14:57:18 +00:00
this.$log.debug('Updated sheet', response.data.data)
2019-05-10 15:49:34 +00:00
if (updateSuccess) {
updateSuccess()
}
2019-04-12 15:39:39 +00:00
})
} else {
2019-05-17 01:44:17 +00:00
sheetApi.create(this.sheetToStage, autoSave).then(response => {
2019-04-24 14:57:18 +00:00
this.$log.debug('Created sheet', response.data.data)
2019-05-10 15:49:34 +00:00
if (createSuccess) {
createSuccess()
}
2019-04-24 14:57:18 +00:00
this.sheetToStage = response.data.data
2019-04-12 15:39:39 +00:00
})
}
},
2019-05-10 15:49:34 +00:00
saveSheet() {
2019-05-17 01:44:17 +00:00
this.createOrUpdateSheet(
2019-05-31 14:35:09 +00:00
() => this.$message.success('页面创建成功!'),
() => this.$message.success('页面更新成功!'),
2019-05-17 01:44:17 +00:00
false
)
2019-05-10 15:49:34 +00:00
},
autoSaveSheet() {
if (this.sheetToStage.title != null && this.sheetToStage.originalContent != null) {
2019-05-17 01:44:17 +00:00
this.createOrUpdateSheet(null, null, true)
2019-05-10 15:49:34 +00:00
}
2019-04-24 14:57:18 +00:00
},
2019-04-26 18:40:10 +00:00
handleSelectSheetThumb(data) {
2019-07-16 13:43:20 +00:00
this.sheetToStage.thumbnail = encodeURI(data.path)
2019-04-24 14:57:18 +00:00
this.thumDrawerVisible = false
2019-04-28 14:17:57 +00:00
},
autoSaveTimer() {
if (this.timer == null) {
this.timer = setInterval(() => {
2019-05-10 15:49:34 +00:00
this.autoSaveSheet()
2019-04-28 14:17:57 +00:00
}, 15000)
}
2019-07-15 15:49:53 +00:00
},
pictureUploadHandle(pos, $file) {
var formdata = new FormData()
formdata.append('file', $file)
attachmentApi.upload(formdata).then((response) => {
var responseObject = response.data
if (responseObject.status === 200) {
var MavonEditor = this.$refs.md
2019-07-16 13:43:20 +00:00
MavonEditor.$img2Url(pos, encodeURI(responseObject.data.path))
2019-07-15 15:49:53 +00:00
this.$message.success('图片上传成功')
} else {
this.$message.error('图片上传失败:' + responseObject.message)
}
})
},
onChange(value, dateString) {
this.sheetToStage.createTime = value.valueOf()
},
onOk(value) {
this.sheetToStage.createTime = value.valueOf()
2019-04-04 08:45:43 +00:00
}
}
}
</script>
2019-04-25 12:21:47 +00:00
<style lang="less" scoped>
2019-04-04 08:45:43 +00:00
.v-note-wrapper {
z-index: 1000;
2019-04-19 16:51:37 +00:00
min-height: 580px;
2019-04-04 08:45:43 +00:00
}
2019-04-25 12:21:47 +00:00
.sheet-thum {
.img {
width: 100%;
cursor: pointer;
border-radius: 4px;
}
.sheet-thum-remove {
margin-top: 16px;
}
2019-04-04 08:45:43 +00:00
}
2019-03-19 08:43:49 +00:00
</style>