123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <template>
- <div class="tinymce-editor">
- <Editor
- :id="tinymceId"
- :init="init"
- :disabled="disabled"
- v-model="myValue"
- @onClick="onClick"
- ></Editor>
- </div>
- </template>
- <script>
- // import axios from "axios";
- import tinymce from "tinymce/tinymce"; //tinymce默认hidden,不引入不显示
- import Editor from "@tinymce/tinymce-vue"; //编辑器引入
- import "tinymce/themes/silver/theme"; //编辑器主题
- // 引入编辑器插件(基本免费插件都在这儿了)
- import "tinymce/plugins/advlist"; //高级列表
- import "tinymce/plugins/autolink"; //自动链接
- import "tinymce/plugins/link"; //超链接
- import "tinymce/plugins/image"; //插入编辑图片
- import "tinymce/plugins/lists"; //列表插件
- import "tinymce/plugins/charmap"; //特殊字符
- import "tinymce/plugins/media"; //插入编辑媒体
- import "tinymce/plugins/wordcount"; // 字数统计
- // import Cookies from "js-cookie";
- // const OSS = require("ali-oss");
- const fonts = [
- "宋体=宋体",
- "微软雅黑=微软雅黑",
- "新宋体=新宋体",
- "黑体=黑体",
- "楷体=楷体",
- "隶书=隶书",
- "Courier New=courier new,courier",
- "AkrutiKndPadmini=Akpdmi-n",
- "Andale Mono=andale mono,times",
- "Arial=arial,helvetica,sans-serif",
- "Arial Black=arial black,avant garde",
- "Book Antiqua=book antiqua,palatino",
- "Comic Sans MS=comic sans ms,sans-serif",
- "Courier New=courier new,courier",
- "Georgia=georgia,palatino",
- "Helvetica=helvetica",
- "Impact=impact,chicago",
- "Symbol=symbol",
- "Tahoma=tahoma,arial,helvetica,sans-serif",
- "Terminal=terminal,monaco",
- "Times New Roman=times new roman,times",
- "Trebuchet MS=trebuchet ms,geneva",
- "Verdana=verdana,geneva",
- "Webdings=webdings",
- "Wingdings=wingdings,zapf dingbats"
- ];
- export default {
- name: "TinymceEditor",
- components: {
- Editor
- },
- props: {
- //内容
- value: {
- type: String,
- default: ""
- },
- //是否禁用
- disabled: {
- type: Boolean,
- default: false
- },
- //插件
- plugins: {
- type: [String, Array],
- default: "advlist image lists wordcount " // media link autolink charmap
- },
- //工具栏
- toolbar: {
- type: [String, Array],
- default:
- "undo redo | formatselect | colorpicker | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | image" // | lists image media table link
- }
- },
- data() {
- return {
- //初始化配置
- tinymceId: "tinymce",
- myValue: this.value,
- init: {
- selector: "#tinymce",
- language_url: "/tinymce/langs/zh_CN.js", //汉化路径是自定义的,一般放在public或static里面
- language: "zh_CN",
- skin_url: "/tinymce/skins/ui/oxide", //皮肤
- icons_url: "/tinymce/icons/default/icons.min.js", //图标
- plugins: this.plugins, //插件
- //工具栏
- toolbar: this.toolbar,
- toolbar_location: "/",
- fontsize_formats:
- "12px 14px 16px 18px 20px 22px 24px 28px 32px 36px 48px 56px 72px", //字体大小
- font_formats: fonts.join(";"),
- content_style: "img {max-width:100%;}", // 图片最大的宽度,避免超出屏幕
- image_description: false,
- image_dimensions: false,
- height: 500, //高度
- placeholder: "在这里输入文字",
- branding: false, //隐藏右下角技术支持
- link_context_toolbar: true,
- media_dimensions: false,
- media_alt_source: false,
- //图片上传
- images_upload_handler: function(blobInfo, success, failure) {
- //文件上传的formData传递,忘记为什么要用这个了
- const isAccord =
- blobInfo.blob().type === "image/jpeg" ||
- blobInfo.blob().type === "image/png" ||
- blobInfo.blob().type === "image/GIF" ||
- blobInfo.blob().type === "image/jpg" ||
- blobInfo.blob().type === "image/BMP";
- if (blobInfo.blob().size / 1024 / 1024 > 2) {
- failure("上传失败,图片大小请控制在 2M 以内");
- } else if (blobInfo.blob().type == isAccord) {
- failure("图片格式错误");
- } else {
- let formData = new FormData();
- // 服务端接收文件的参数名,文件数据,文件名
- formData.append("image-file", blobInfo.blob(), blobInfo.filename());
- window.$_http.post("/image/upload", formData).then(res => {
- console.log("--upload--" + JSON.stringify(res));
- success(res.data.url);
- });
- }
- },
- // file_picker_callback: function(callback, value, meta) {
- // //文件分类
- // var filetype =
- // ".pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4";
- // //后端接收上传文件的地址
- // //为不同插件指定文件类型及后端地址
- // let bucket = "jtxt-file-public";
- // let ossPath = "file/";
- // switch (meta.filetype) {
- // case "image":
- // filetype = ".jpg, .jpeg, .png, .gif";
- // ossPath = "image/";
- // break;
- // case "media":
- // bucket = "jtxt-video-public";
- // filetype = ".mp3, .mp4";
- // ossPath = "media/";
- // break;
- // case "file":
- // bucket = "jtxt-file-public";
- // filetype =
- // ".pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx";
- // ossPath = "file/";
- // break;
- // default:
- // }
- // //模拟出一个input用于添加本地文件
- // var input = document.createElement("input");
- // input.setAttribute("type", "file");
- // input.setAttribute("accept", filetype);
- // input.onchange = function(res) {
- // console.log("change----" + JSON.stringify(res));
- // let file = res.target.files[0];
- // window.$_http.get("/assume-oss-writer").then(res => {
- // console.log("--oss-writer--" + JSON.stringify(res));
- // const client = new OSS({
- // // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
- // region: "oss-cn-beijing",
- // // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
- // accessKeyId: res.data.accessKeyId,
- // accessKeySecret: res.data.accessKeySecret,
- // // 从STS服务获取的安全令牌(SecurityToken)。
- // stsToken: res.data.securityToken,
- // // 填写Bucket名称。
- // bucket: bucket
- // });
- // // 上传oss
- // try {
- // client.put(ossPath + file.name, file).then(res => {
- // console.log(res);
- // callback(res.url);
- // });
- // } catch (e) {
- // console.error(e);
- // }
- // // 回调
- // });
- // };
- // input.click();
- // },
- menu: {
- file: { title: "File", items: "newdocument" },
- edit: {
- title: "Edit",
- items: "undo redo | cut copy pastetext | selectall"
- },
- insert: { title: "Insert", items: "link image media | template hr" },
- view: { title: "View", items: "visualaid" },
- format: {
- title: "Format",
- items:
- "bold italic underline strikethrough superscript subscript | removeformat"
- },
- table: {
- title: "Table",
- items: "inserttable tableprops deletetable | cell row column"
- },
- tools: { title: "Tools", items: "spellchecker code" }
- }
- }
- };
- },
- watch: {
- //监听内容变化
- value(newValue) {
- this.myValue = newValue == null ? "" : newValue;
- },
- myValue(newValue) {
- if (this.triggerChange) {
- this.$emit("change", newValue);
- } else {
- this.$emit("input", newValue);
- }
- }
- },
- mounted() {
- tinymce.init({});
- },
- methods: {
- onClick(e) {
- this.$emit("onClick", e, tinymce);
- },
- //清空内容
- clear() {
- this.myValue = "";
- }
- }
- };
- </script>
- <style lang="less" scoped>
- @import "~@/styles/common/variable.less";
- </style>
|