|
@@ -1,126 +1,107 @@
|
|
|
<template lang="html">
|
|
|
<div class="editor">
|
|
|
- <div ref="toolbar" class="toolbar">
|
|
|
+ <div ref="toolbar" class="toolbar" id="toolbar-container">
|
|
|
</div>
|
|
|
- <div ref="editor" class="text">
|
|
|
+ <div ref="editor" class="text" id="editor-container">
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import E from 'wangeditor';
|
|
|
+// import E from 'wangeditor';
|
|
|
+import '@wangeditor/editor/dist/css/style.css';
|
|
|
+import { createEditor, createToolbar } from '@wangeditor/editor';
|
|
|
+import MyMenu from '@lib/editorButtom2.js';
|
|
|
import $axios from '@lib/axios.js';
|
|
|
+// toolbar
|
|
|
+let editor;
|
|
|
export default {
|
|
|
name: 'editoritem',
|
|
|
data () {
|
|
|
return {
|
|
|
- editor: null,
|
|
|
- info_: null
|
|
|
+ info_: null,
|
|
|
+ myMenuConf: {
|
|
|
+ key: 'menu1',
|
|
|
+ factory() {
|
|
|
+ return new MyMenu();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ editorConfig: {
|
|
|
+ MENU_CONF: {}
|
|
|
+ }
|
|
|
};
|
|
|
},
|
|
|
- model: {
|
|
|
- prop: 'value',
|
|
|
- event: 'change'
|
|
|
- },
|
|
|
props: {
|
|
|
value: {
|
|
|
type: String,
|
|
|
default: ''
|
|
|
- },
|
|
|
- isClear: {
|
|
|
- type: Boolean,
|
|
|
- default: false
|
|
|
- }
|
|
|
- },
|
|
|
- watch: {
|
|
|
- isClear (val) {
|
|
|
- // 触发清除文本域内容
|
|
|
- if (val) {
|
|
|
- this.editor.txt.clear();
|
|
|
- this.info_ = null;
|
|
|
- }
|
|
|
- },
|
|
|
- value: function (value) {
|
|
|
- if (value !== this.editor.txt.html()) {
|
|
|
- this.editor.txt.html(this.value);
|
|
|
- }
|
|
|
}
|
|
|
- // value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值
|
|
|
},
|
|
|
mounted () {
|
|
|
this.seteditor();
|
|
|
- this.editor.txt.html(this.value);
|
|
|
},
|
|
|
methods: {
|
|
|
seteditor () {
|
|
|
- this.editor = new E(this.$refs.toolbar, this.$refs.editor);
|
|
|
- this.editor.config.uploadImgShowBase64 = false; // base 64 存储图片
|
|
|
- this.editor.config.uploadImgMaxSize = 50 * 1024 * 1024; // 将图片大小限制为 2M
|
|
|
- this.editor.config.uploadImgMaxLength = 1; // 限制一次最多上传 3 张图片
|
|
|
- this.editor.config.uploadImgTimeout = 3 * 60 * 1000; // 设置超时时间
|
|
|
- this.editor.config.showLinkImg = false;
|
|
|
- // 配置菜单
|
|
|
- this.editor.config.menus = [
|
|
|
- 'head', // 标题
|
|
|
- 'bold', // 粗体
|
|
|
- 'fontSize', // 字号
|
|
|
- 'fontName', // 字体
|
|
|
- 'italic', // 斜体
|
|
|
- 'underline', // 下划线
|
|
|
- 'strikeThrough', // 删除线
|
|
|
- 'foreColor', // 文字颜色
|
|
|
- 'backColor', // 背景颜色
|
|
|
- 'link', // 插入链接
|
|
|
- 'list', // 列表
|
|
|
- 'justify', // 对齐方式
|
|
|
- 'quote', // 引用
|
|
|
- 'emoticon', // 表情
|
|
|
- 'image', // 插入图片
|
|
|
- 'table', // 表格
|
|
|
- 'video', // 插入视频
|
|
|
- 'code', // 插入代码
|
|
|
- 'undo', // 撤销
|
|
|
- 'redo', // 重复
|
|
|
- 'fullscreen' // 全屏
|
|
|
- ];
|
|
|
- // 自定义文件上传
|
|
|
- this.editor.config.customUploadImg = async function (resultFiles, insertImgFn) {
|
|
|
- // resultFiles 是 input 中选中的文件列表
|
|
|
- var data = new FormData();
|
|
|
- const filesUpload = '/api/files/filestore/upload';
|
|
|
- data.append('file', resultFiles[0]);
|
|
|
- const headers = {
|
|
|
- 'Content-Type': 'multipart/form-data'
|
|
|
- };
|
|
|
- const res = await $axios.post(filesUpload, data, null, headers);
|
|
|
- // insertImgFn 是获取图片 url 后,插入到编辑器的方法
|
|
|
- // const url = `http://127.0.0.1:9002${res.data.filePath}`;
|
|
|
- const url = res.data.filePath;
|
|
|
- // 上传图片,返回结果,将图片插入到编辑器中
|
|
|
- insertImgFn(url);
|
|
|
- };
|
|
|
- // this.editor.config.onlineVideoCheck = (src) => {
|
|
|
- // const videoMod = `<iframe src="${src}"> </iframe>`;
|
|
|
- // // this.editor.txt.append(videoMod);
|
|
|
- // this.editor.cmd.do('insertHTML', videoMod);
|
|
|
+ // 解决重复key问题
|
|
|
+ // if (!editor) Boot.registerMenu(this.myMenuConf);
|
|
|
+ // 创建编辑器
|
|
|
+ editor = createEditor({
|
|
|
+ selector: '#editor-container',
|
|
|
+ config: {
|
|
|
+ onChange: (editor) => {
|
|
|
+ this.info_ = editor.getHtml(); // 绑定当前逐渐地值
|
|
|
+ this.$emit('change', this.info_); // 将内容同步到父组件中
|
|
|
+ },
|
|
|
+ MENU_CONF: {
|
|
|
+ uploadImage: {
|
|
|
+ async customUpload(file, insertFn) {
|
|
|
+ var data = new FormData();
|
|
|
+ const filesUpload = '/api/files/filestore/upload';
|
|
|
+ data.append('file', file);
|
|
|
+ const headers = {
|
|
|
+ 'Content-Type': 'multipart/form-data'
|
|
|
+ };
|
|
|
+ const res = await $axios.post(filesUpload, data, null, headers);
|
|
|
+ const url = res.data.filePath;
|
|
|
+ const alt = res.data.name;
|
|
|
+ const href = res.data.filePath;
|
|
|
+ // 上传图片,返回结果,将图片插入到编辑器中
|
|
|
+ insertFn(url, alt, href);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 创建工具栏
|
|
|
+ createToolbar({
|
|
|
+ editor,
|
|
|
+ selector: '#toolbar-container'
|
|
|
+ });
|
|
|
+ // toolbar.config.insertKeys = {
|
|
|
+ // index: 0,
|
|
|
+ // keys: ['menu1']
|
|
|
// };
|
|
|
- this.editor.config.onchange = (html) => {
|
|
|
- this.info_ = html; // 绑定当前逐渐地值
|
|
|
- this.$emit('change', this.info_); // 将内容同步到父组件中
|
|
|
- };
|
|
|
- // 创建富文本编辑器
|
|
|
- this.editor.create();
|
|
|
+ editor.setHtml((this.value));
|
|
|
}
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ if (editor == null) return;
|
|
|
+ editor.destroy(); // 组件销毁时,及时销毁编辑器
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
-<style lang="css">
|
|
|
+<style lang="scss">
|
|
|
.editor {
|
|
|
width: 100%;
|
|
|
margin: 0 auto;
|
|
|
position: relative;
|
|
|
z-index: 0;
|
|
|
+ p {
|
|
|
+ line-height: 2em;
|
|
|
+ font-size: 16px;
|
|
|
+ text-align: justify;
|
|
|
+ }
|
|
|
}
|
|
|
.toolbar {
|
|
|
border: 1px solid #ccc;
|