mirror of
https://github.com/PanJiaChen/vue-element-admin.git
synced 2025-04-06 03:57:53 +08:00
175 lines
5.3 KiB
Vue
175 lines
5.3 KiB
Vue
<template>
|
|
<div class='tinymce-container editor-container'>
|
|
<textarea class='tinymce-textarea' :id="id"></textarea>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
// import { getToken, upload } from 'api/qiniu'; // 七牛
|
|
export default {
|
|
name: 'tinymce',
|
|
props: {
|
|
id: {
|
|
type: String,
|
|
default: 'tinymceEditor'
|
|
},
|
|
value: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
toolbar: {
|
|
type: Array,
|
|
required: false,
|
|
default() {
|
|
return ['removeformat undo redo | bullist numlist | outdent indent | forecolor | fullscreen code', 'bold italic blockquote | h2 p media link | alignleft aligncenter alignright']
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
hasChange: false,
|
|
hasInit: false
|
|
}
|
|
},
|
|
menubar: {
|
|
default: ''
|
|
},
|
|
height: {
|
|
type: Number,
|
|
required: false,
|
|
default: 360
|
|
}
|
|
},
|
|
watch: {
|
|
value(val) {
|
|
if (!this.hasChange && this.hasInit) {
|
|
this.$nextTick(() => tinymce.get(this.id).setContent(val))
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
const _this = this;
|
|
tinymce.init({
|
|
selector: `#${this.id}`,
|
|
height: this.height,
|
|
body_class: 'panel-body ',
|
|
object_resizing: false,
|
|
// language: 'zh_CN',
|
|
// language_url: '/static/tinymce/langs/zh_CN.js',
|
|
toolbar: this.toolbar,
|
|
menubar: this.menubar,
|
|
plugins: 'advlist,autolink,code,paste,textcolor, colorpicker,fullscreen,link,lists,media,wordcount, imagetools,watermark',
|
|
end_container_on_empty_block: true,
|
|
powerpaste_word_import: 'clean',
|
|
code_dialog_height: 450,
|
|
code_dialog_width: 1000,
|
|
advlist_bullet_styles: 'square',
|
|
advlist_number_styles: 'default',
|
|
block_formats: '普通标签=p;小标题=h2;',
|
|
imagetools_cors_hosts: ['wpimg.wallstcn.com', 'wallstreetcn.com'],
|
|
imagetools_toolbar: 'watermark',
|
|
default_link_target: '_blank',
|
|
link_title: false,
|
|
init_instance_callback: editor => {
|
|
if (_this.value) {
|
|
editor.setContent(_this.value)
|
|
}
|
|
_this.hasInit = true;
|
|
editor.on('NodeChange Change KeyUp', () => {
|
|
this.hasChange = true;
|
|
this.$emit('input', editor.getContent({ format: 'raw' }));
|
|
});
|
|
},
|
|
// 整合七牛上传
|
|
// images_dataimg_filter(img) {
|
|
// setTimeout(() => {
|
|
// const $image = $(img);
|
|
// $image.removeAttr('width');
|
|
// $image.removeAttr('height');
|
|
// if ($image[0].height && $image[0].width) {
|
|
// $image.attr('data-wscntype', 'image');
|
|
// $image.attr('data-wscnh', $image[0].height);
|
|
// $image.attr('data-wscnw', $image[0].width);
|
|
// $image.addClass('wscnph');
|
|
// }
|
|
// }, 0);
|
|
// return img
|
|
// },
|
|
// images_upload_handler(blobInfo, success, failure, progress) {
|
|
// progress(0);
|
|
// const token = _this.$store.getters.token;
|
|
// getToken(token).then(response => {
|
|
// const url = response.data.qiniu_url;
|
|
// const formData = new FormData();
|
|
// formData.append('token', response.data.qiniu_token);
|
|
// formData.append('key', response.data.qiniu_key);
|
|
// formData.append('file', blobInfo.blob(), url);
|
|
// upload(formData).then(() => {
|
|
// success(url);
|
|
// progress(100);
|
|
// })
|
|
// }).catch(err => {
|
|
// failure('出现未知问题,刷新页面,或者联系程序员')
|
|
// console.log(err);
|
|
// });
|
|
// },
|
|
setup(editor) {
|
|
editor.addButton('h2', {
|
|
title: '小标题', // tooltip text seen on mouseover
|
|
text: '小标题',
|
|
onclick() {
|
|
editor.execCommand('mceToggleFormat', false, 'h2');
|
|
},
|
|
onPostRender() {
|
|
const btn = this;
|
|
editor.on('init', () => {
|
|
editor.formatter.formatChanged('h2', state => {
|
|
btn.active(state);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
editor.addButton('p', {
|
|
title: '正文',
|
|
text: '正文',
|
|
onclick() {
|
|
editor.execCommand('mceToggleFormat', false, 'p');
|
|
},
|
|
onPostRender() {
|
|
const btn = this;
|
|
editor.on('init', () => {
|
|
editor.formatter.formatChanged('p', state => {
|
|
btn.active(state);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
},
|
|
destroyed() {
|
|
tinymce.get(this.id).destroy();
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.tinymce-container {
|
|
position: relative
|
|
}
|
|
|
|
.tinymce-textarea {
|
|
visibility: hidden;
|
|
z-index: -1;
|
|
}
|
|
|
|
.editor-custom-btn-container {
|
|
position: absolute;
|
|
right: 15px;
|
|
top: 18px;
|
|
}
|
|
|
|
.editor-upload-btn {
|
|
display: inline-block;
|
|
}
|
|
</style>
|