富文本编辑器
富文本编辑器
This commit is contained in:
210
TinymceEditor/README.md
Normal file
210
TinymceEditor/README.md
Normal file
@@ -0,0 +1,210 @@
|
||||
## 项目更换富文本编辑器
|
||||
|
||||
项目的富文本编辑器 `vue-quill-editor` 目前不支持表格,决定更换为 `tinymce` 编辑器。
|
||||
|
||||
### 项目当前环境
|
||||
|
||||
项目当前的环境为 Vue 2.6.11 ,需要的版本
|
||||
|
||||
```json
|
||||
{
|
||||
"tinymce": "^5.4.2",
|
||||
"@tinymce/tinymce-vue": "^3.2.2",
|
||||
}
|
||||
```
|
||||
|
||||
### 配置安装
|
||||
|
||||
#### 安装依赖
|
||||
|
||||
输入以下的命令,进行依赖的安装
|
||||
|
||||
```shell
|
||||
npm install tinymce@5.4.2
|
||||
npm install @tinymce/tinymce-vue@3.2.2
|
||||
```
|
||||
|
||||
#### 安装汉化包
|
||||
|
||||
[点击进入汉化包下载页面](https://link.juejin.cn/?target=https%3A%2F%2Fwww.tiny.cloud%2Fget-tiny%2Flanguage-packages%2F)
|
||||
|
||||
<img src="https://vip1.loli.io/2022/03/10/dH62CvlAkiU3j7K.jpg" alt="Jiulinxiri_20220307103321" style="zoom:40%;" />
|
||||
|
||||
将解压的文件放在 `public` 文件夹
|
||||
|
||||
<img src="https://vip2.loli.io/2022/03/10/DiwzASagZ9HWvtI.jpg" alt="Jiulinxiri_20220307103322" style="zoom:50%;" />
|
||||
|
||||
### 配置使用
|
||||
|
||||
封装后的 `tinymce-editor.vue`文件内容如下
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<div class="tinymce">
|
||||
<editor
|
||||
v-model="myValue"
|
||||
:id="id"
|
||||
:disabled="disabled"
|
||||
:init="editorInit"
|
||||
output-format="html"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
// 引入组件
|
||||
import tinymce from 'tinymce/tinymce'
|
||||
import Editor from '@tinymce/tinymce-vue'
|
||||
import 'tinymce/icons/default/icons' // 解决了icons.js 报错Unexpected token '<'
|
||||
// 引入富文本编辑器主题的js和css
|
||||
import 'tinymce/themes/silver/theme.min.js'
|
||||
import 'tinymce/skins/ui/oxide/skin.min.css'
|
||||
// 扩展插件
|
||||
import 'tinymce/plugins/link'
|
||||
import 'tinymce/plugins/lists'
|
||||
import 'tinymce/plugins/image'
|
||||
import 'tinymce/plugins/code'
|
||||
import 'tinymce/plugins/table'
|
||||
import 'tinymce/plugins/wordcount'
|
||||
|
||||
export default {
|
||||
name: "tinymce-editor",
|
||||
components: {
|
||||
Editor
|
||||
},
|
||||
props: {
|
||||
id: {
|
||||
type: String,
|
||||
default: 'tinymceEditor'
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 编辑器初始化配置
|
||||
editorInit: {
|
||||
selector: '#tinymce', // 容器
|
||||
language_url: '/tinymce/langs/zh_CN.js',
|
||||
language: 'zh_CN',
|
||||
skin_url: '/tinymce/skins/ui/oxide', // 主题
|
||||
height: 300,
|
||||
plugins: 'link lists image table wordcount', // 用到的插件:链接、列表、图片、代码块、表格、字数
|
||||
toolbar: 'bold italic underline | subscript superscript | formatselect fontsizeselect | forecolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | link unlink table image| removeformat',
|
||||
toolbar_mode: 'wrap',
|
||||
fontsize_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px',
|
||||
setup: function(editor) {
|
||||
editor.on('init', function() {
|
||||
this.getBody().style.fontSize = '14px';
|
||||
});
|
||||
},
|
||||
// 工具栏
|
||||
images_upload_base_path: 'http://file.ourhonour.cn', // 上传图片基础路径
|
||||
images_upload_url: 'http://api.bjmcc.ourhonour.cn/zjzk/file/uploadImageLocation', // 上传图片地址
|
||||
// images_upload_handler: (blobInfo, success, failure) => { // 图片上传
|
||||
// console.log(blobInfo, success, failure, '上传图片====--==-')
|
||||
// const img = `data:${blobInfo.blob().type};base64,${blobInfo.base64()}`
|
||||
// success(img)
|
||||
// // this.handleImgUpload(blobInfo, success, failure)
|
||||
// },
|
||||
// forced_root_block : false,
|
||||
statusbar: false, // 底部的状态栏
|
||||
menubar: false, // 最上方的菜单
|
||||
branding: false, // 水印“Powered by TinyMCE”
|
||||
max_height: 500,
|
||||
min_height: 300
|
||||
},
|
||||
myValue: this.value
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
tinymce.init({})
|
||||
},
|
||||
methods: {
|
||||
handleChange(e, editor) {
|
||||
console.log(this.tinymceHtml)
|
||||
this.$emit('editorChange', e, editor)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
value(newValue) {
|
||||
this.myValue = newValue
|
||||
},
|
||||
myValue(newValue) {
|
||||
this.$emit('input', this.id, newValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.TinyMCE {
|
||||
.preview {
|
||||
min-height: 200px;
|
||||
max-height: 400px;
|
||||
font-size: 14px;
|
||||
overflow-y: auto;
|
||||
margin: 25px auto;
|
||||
border: 1px solid #ccc;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
}
|
||||
// 解决菜单下拉选项不显示的问题
|
||||
.tox-tinymce-aux {
|
||||
z-index: 19891015 !important;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
父组件使用的方式
|
||||
|
||||
```vue
|
||||
<tinymce-editor
|
||||
@input="editorChange"
|
||||
id="achievements"
|
||||
:disabled="false"
|
||||
v-mode="form.achievements">
|
||||
</tinymce-editor>
|
||||
```
|
||||
|
||||
### 后台上传图片接口
|
||||
|
||||
```java
|
||||
/**
|
||||
* 上传图片方法
|
||||
* @param multipartFile
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/uploadImageLocation")
|
||||
@ResponseBody
|
||||
public FileDTO uploadImageLocation(@RequestParam(value = "file") MultipartFile multipartFile, HttpServletRequest request) {
|
||||
FileDTO fileDTO = new FileDTO();
|
||||
String path = "";
|
||||
try {
|
||||
path = fdfsClientUtils.upload(multipartFile);
|
||||
fileDTO.setLocation(path);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return fileDTO;
|
||||
}
|
||||
|
||||
// FileDTO.java
|
||||
package cn.ourhonour.modules.file.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class FileDTO {
|
||||
private String location;
|
||||
}
|
||||
|
||||
```
|
||||
|
117
TinymceEditor/tinymce-editor.vue
Normal file
117
TinymceEditor/tinymce-editor.vue
Normal file
@@ -0,0 +1,117 @@
|
||||
<template>
|
||||
<div class="tinymce">
|
||||
<editor
|
||||
v-model="myValue"
|
||||
:id="id"
|
||||
:disabled="disabled"
|
||||
:init="editorInit"
|
||||
output-format="html"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
// 引入组件
|
||||
import tinymce from 'tinymce/tinymce'
|
||||
import Editor from '@tinymce/tinymce-vue'
|
||||
import 'tinymce/icons/default/icons' // 解决了icons.js 报错Unexpected token '<'
|
||||
// 引入富文本编辑器主题的js和css
|
||||
import 'tinymce/themes/silver/theme.min.js'
|
||||
import 'tinymce/skins/ui/oxide/skin.min.css'
|
||||
// 扩展插件
|
||||
import 'tinymce/plugins/link'
|
||||
import 'tinymce/plugins/lists'
|
||||
import 'tinymce/plugins/image'
|
||||
import 'tinymce/plugins/code'
|
||||
import 'tinymce/plugins/table'
|
||||
import 'tinymce/plugins/wordcount'
|
||||
|
||||
export default {
|
||||
name: "tinymce-editor",
|
||||
components: {
|
||||
Editor
|
||||
},
|
||||
props: {
|
||||
id: {
|
||||
type: String,
|
||||
default: 'tinymceEditor'
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 编辑器初始化配置
|
||||
editorInit: {
|
||||
selector: '#tinymce', // 容器
|
||||
language_url: '/tinymce/langs/zh_CN.js',
|
||||
language: 'zh_CN',
|
||||
skin_url: '/tinymce/skins/ui/oxide', // 主题
|
||||
height: 300,
|
||||
plugins: 'link lists image table wordcount', // 用到的插件:链接、列表、图片、代码块、表格、字数
|
||||
toolbar: 'bold italic underline | subscript superscript | formatselect fontsizeselect | forecolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | link unlink table image| removeformat',
|
||||
toolbar_mode: 'wrap',
|
||||
fontsize_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px',
|
||||
setup: function(editor) {
|
||||
editor.on('init', function() {
|
||||
this.getBody().style.fontSize = '14px';
|
||||
});
|
||||
},
|
||||
// 工具栏
|
||||
images_upload_base_path: 'http://file.ourhonour.cn', // 上传图片基础路径
|
||||
images_upload_url: 'http://api.bjmcc.ourhonour.cn/zjzk/file/uploadImageLocation', // 上传图片地址
|
||||
// images_upload_handler: (blobInfo, success, failure) => { // 图片上传
|
||||
// console.log(blobInfo, success, failure, '上传图片====--==-')
|
||||
// const img = `data:${blobInfo.blob().type};base64,${blobInfo.base64()}`
|
||||
// success(img)
|
||||
// // this.handleImgUpload(blobInfo, success, failure)
|
||||
// },
|
||||
// forced_root_block : false,
|
||||
statusbar: false, // 底部的状态栏
|
||||
menubar: false, // 最上方的菜单
|
||||
branding: false, // 水印“Powered by TinyMCE”
|
||||
max_height: 500,
|
||||
min_height: 300
|
||||
},
|
||||
myValue: this.value
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
tinymce.init({})
|
||||
},
|
||||
methods: {
|
||||
handleChange(e, editor) {
|
||||
this.$emit('editorChange', e, editor)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
value(newValue) {
|
||||
this.myValue = newValue
|
||||
},
|
||||
myValue(newValue) {
|
||||
this.$emit('input', this.id, newValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.TinyMCE {
|
||||
.preview {
|
||||
min-height: 200px;
|
||||
max-height: 400px;
|
||||
font-size: 14px;
|
||||
overflow-y: auto;
|
||||
margin: 25px auto;
|
||||
border: 1px solid #ccc;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
}
|
||||
</style>
|
Reference in New Issue
Block a user