epmet pc工作端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

154 lines
4.4 KiB

/* eslint-disable */
<template>
<textarea :id="tinymceId" style="visibility: hidden" />
</template>
<script>
import loadTinymce from "@/utils/loadTinymce";
import { plugins, toolbar } from "./config";
import { debounce } from "throttle-debounce";
import Cookie from "js-cookie";
// import constants from '@/utils/constants'
import nextTick from "dai-js/tools/nextTick";
let num = 1;
export default {
name: "Tinymce",
props: {
id: {
type: String,
default: () => {
num === 10000 && (num = 1);
return `tinymce${+new Date()}${num++}`;
},
},
value: {
default: "",
},
customerId: {
type: String,
default: "",
},
},
data() {
return {
tinymceId: this.id,
};
},
mounted() {
loadTinymce((tinymce) => {
let token = this.getUserToken();
// let uploadUrl = '1111'
let uploadUrl =
window.SITE_CONFIG["apiURL"] + "/oss/file/function/upload";
// :data="{customerId:customerId}"
// let uploadUrl = constants.userUploadUrl
// eslint-disable-next-line global-require
require("./zh_CN");
let conf = {
selector: `#${this.tinymceId}`,
language: "zh_CN",
menubar: "false",
skin_url:
"/" + process.env.VUE_APP_PUBLIC_PATH + "/tinymce/skins/ui/tduck",
content_style: "p {margin:3px 0; border:0px; padding:0px}",
content_css:
"/" +
process.env.VUE_APP_PUBLIC_PATH +
"/tinymce/skins/content/tduck",
cache_suffix: "?v=0.0.1",
plugins,
toolbar,
toolbar_drawer: "sliding",
toolbar_mode: "sliding",
height: 400,
// fontsize_formats: "8pt 10pt 12pt 14pt 18pt 24pt 36pt",
branding: false,
object_resizing: false,
end_container_on_empty_block: true,
powerpaste_word_import: "clean",
// code_dialog_height: 450,
// code_dialog_width: 1000,
// autoresize_max_height: 450, // 编辑区域的最大高度
// autoresize_min_height: 350, //编辑区域的最小高度
advlist_bullet_styles: "square",
advlist_number_styles: "default",
default_link_target: "_blank",
link_title: false,
statusbar: false,
nonbreaking_force_tab: true,
// images_upload_url: uploadUrl,
images_upload_handler: function (blobInfo, succFun, failFun) {
var xhr, formData;
var file = blobInfo.blob(); // 转化为易于理解的file对象
xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.open("POST", uploadUrl);
xhr.setRequestHeader("token", token);
xhr.onload = function () {
var json;
if (xhr.status != 200) {
failFun("HTTP Error: " + xhr.status);
return;
}
json = JSON.parse(xhr.responseText);
if (!json || typeof json.data.url != "string") {
failFun("Invalid JSON: " + xhr.responseText);
return;
}
succFun(json.data.url);
};
formData = new FormData();
formData.append("file", file, file.name); // 此处与源文档不一样
// formData.append('customerId', '111')
xhr.send(formData);
},
};
conf = Object.assign(conf, this.$attrs);
conf.init_instance_callback = (editor) => {
if (this.value) editor.setContent(this.value);
this.vModel(editor);
};
tinymce.init(conf);
});
},
destroyed() {
this.destroyTinymce();
},
methods: {
vModel(editor) {
// 控制连续写入时setContent的触发频率
const debounceSetContent = debounce(250, editor.setContent);
this.$watch("value", (val, prevVal) => {
if (editor && val !== prevVal && val !== editor.getContent()) {
if (typeof val !== "string") val = val.toString();
debounceSetContent.call(editor, val);
}
});
editor.on("change keyup undo redo", () => {
this.$emit("input", editor.getContent());
});
editor.on("blur", () => {
this.$emit("blur");
});
},
getUserToken() {
let token = localStorage.getItem("token");
return token;
},
destroyTinymce() {
if (!window.tinymce) return;
const tinymce = window.tinymce.get(this.tinymceId);
if (tinymce) {
tinymce.destroy();
}
},
},
};
</script>