editor.vue
<template>
<!-- 富文本 -->
<div>
<editor
id="tinymce"
v-model="content"
:init="init"
@onClick="onClick"
></editor>
</div>
</template>
<script>
import tinymce from "tinymce/tinymce"; // version: 5.0.1
import Editor from "@tinymce/tinymce-vue"; // version: 3.0.1
import 'tinymce/icons/default/icons';
import "tinymce/themes/silver";
import "tinymce/plugins/image";
import "tinymce/plugins/media";
import "tinymce/plugins/table";
import "tinymce/plugins/lists";
import "tinymce/plugins/contextmenu";
import "tinymce/plugins/wordcount";
import "tinymce/plugins/colorpicker";
import "tinymce/plugins/textcolor";
import "tinymce/plugins/preview";
import "tinymce/plugins/code";
import "tinymce/plugins/link";
import "tinymce/plugins/advlist";
import "tinymce/plugins/codesample";
import "tinymce/plugins/hr";
import "tinymce/plugins/fullscreen";
import "tinymce/plugins/textpattern";
import "tinymce/plugins/searchreplace";
import "tinymce/plugins/autolink";
import "tinymce/plugins/directionality";
import "tinymce/plugins/visualblocks";
import "tinymce/plugins/visualchars";
import "tinymce/plugins/template";
import "tinymce/plugins/charmap";
import "tinymce/plugins/nonbreaking";
import "tinymce/plugins/insertdatetime";
import "tinymce/plugins/imagetools";
import "tinymce/plugins/autosave";
import "tinymce/plugins/autoresize";
export default {
components: {
Editor,
},
props: {
value: {
type: String,
default: "",
},
disabled: {
type: Boolean,
default: false,
},
plugins: {
type: [String, Array],
default:
"preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr nonbreaking insertdatetime advlist lists wordcount imagetools textpattern autosave autoresize",
},
toolbar: {
type: [String, Array],
default:
"code undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link codesample | alignleft aligncenter alignright alignjustify outdent indent formatpainter | \
styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \
table image media charmap hr pagebreak insertdatetime | fullscreen preview",
},
},
data() {
return {
//初始化配置
init: {
language_url:
process.env.NODE_ENV === "production"
? window.SITE_CONFIG.version + "/static/plugins/langs/zh_CN.js"
: "/static/plugins/langs/zh_CN.js",
language: "zh_CN",
skin_url:
process.env.NODE_ENV === "production"
? window.SITE_CONFIG.version + "/static/plugins/skins/ui/oxide"
: "/static/plugins/skins/ui/oxide",
height: 350,
min_height: 350,
max_height: 350,
toolbar_mode: "wrap",
plugins: this.plugins,
toolbar: this.toolbar,
content_style: "p {margin: 5px 0;}",
content_css:
process.env.NODE_ENV === "production"
? window.SITE_CONFIG.version +
"/static/plugins/skins/content/default/content.css"
: "/static/plugins/skins/content/default/content.css",
fontsize_formats: "12px 14px 16px 18px 24px 36px 48px 56px 72px",
font_formats:
"微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;",
branding: false,
//此处为图片上传处理函数,这个直接用了base64的图片形式上传图片,
//如需ajax上传可参考https://www.tiny.cloud/docs/configure/file-image-upload/
images_upload_handler: (blobInfo, success, failure) => {
var xhr, formData;
xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.open("POST", window.SITE_CONFIG.baseUrl + "/sys/upload/file");
xhr.setRequestHeader("token", this.$cookie.get("token"));
xhr.onload = function () {
var json;
if (xhr.status != 200) {
failure("上传失败!" + xhr.status);
return;
}
json = JSON.parse(xhr.responseText);
console.log(json);
success(window.SITE_CONFIG.imageUrl + json.data);
};
formData = new FormData();
formData.append("file", blobInfo.blob(), blobInfo.filename());
console.log("formData", formData);
xhr.send(formData);
},
},
content: this.value,
};
},
methods: {
onClick(e) {
this.$emit("onClick", e, tinymce);
},
},
watch: {
value(newValue) {
this.content = newValue;
},
content(newValue) {
this.$emit("input", newValue);
},
},
};
</script>
<style scoped lang="scss">
</style>
|