vue安装tinyMCE
官网:
https://www.tiny.cloud/auth/signup/
资源下载
tinymce 官方为 vue 项目提供了一个组件tinymce-vue
npm install @tinymce/tinymce-vue -S
在 vscode、webstorm 的终端运行这段代码可能会报错,最好使用操作系统自带的命令行工具
如果有购买 tinymce 的服务,可以参考 tinymce-vue 的说明,通过 api-key 直接使用 tinymce
像我这样没购买的,还是要老老实实下载 tinymce
npm install tinymce -S
安装之后,在 node_modules 中找到 tinymce/skins 目录,然后将 skins 目录拷贝到 public 目录下
// 如果是使用 vue-cli 3.x 项目,就放到 public 目录下,
tinymce 默认是英文界面,所以还需要下载一个中文语言包
https://www.tiny.cloud/get-tiny/language-packages/

然后将这个语言包放到 public 目录下,为了结构清晰,我包了一层 tinymce 目录

上代码
<template>
<div class="app-container">
<!-- 添加或修改对话框 -->
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-tabs type="border-card">
<el-tab-pane label="基本配置">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="标题"/>
</el-form-item>
<el-form-item label="标签" prop="keywords">
<el-input v-model="form.keywords" placeholder="标签"/>
</el-form-item>
<el-form-item label="文章作者" prop="author">
<el-input v-model="form.author" placeholder="文章作者"/>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="文章内容">
<el-form-item label="" label-width="0" prop="content">
<editor v-model="form.content" :init="init"></editor>
</el-form-item>
</el-tab-pane>
</el-tabs>
<hr />
<div v-html="form.content"></div>
</el-form>
<div>
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</div>
</template>
<script>
import {getArticle, addArticle, updateArticle} from '@/api/article'
import tinymce from 'tinymce/tinymce'
import Editor from '@tinymce/tinymce-vue'
import "tinymce/themes/silver"
import 'tinymce/icons/default/icons.min.js'
// 编辑器插件plugins 里用到的插件,都要import引入一下,不然控制台会报错
// 更多插件参考:https://www.tiny.cloud/docs/plugins/
import 'tinymce/plugins/advlist'
import 'tinymce/plugins/autolink'
import 'tinymce/plugins/charmap'
import 'tinymce/plugins/print'
import 'tinymce/plugins/preview'
import 'tinymce/plugins/anchor'
import 'tinymce/plugins/colorpicker'
import 'tinymce/plugins/textcolor'
import 'tinymce/plugins/contextmenu'
import 'tinymce/plugins/searchreplace'
import 'tinymce/plugins/visualblocks'
import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/help'
import 'tinymce/plugins/autoresize'
import 'tinymce/plugins/image'// 插入上传图片插件
import 'tinymce/plugins/imagetools'// 图片编辑
import 'tinymce/plugins/media'// 插入视频插件
import 'tinymce/plugins/table'// 插入表格插件
import 'tinymce/plugins/lists'// 列表插件
import 'tinymce/plugins/wordcount'// 字数统计插件
import "tinymce/themes/silver/theme"
import "tinymce/plugins/paste"
import "tinymce/plugins/link"
import "tinymce/plugins/code"
import 'tinymce/plugins/fullscreen';
import {uploadAvatar} from "@/api/system/sysuser"; //上组组件
export default {
components: {
Editor
},
name: 'ArticleCreate',
data() {
return {
init: {
// 引入汉化组件
language_url: '/tinymce/zh_CN.js', //public目录下
// 设定语言为中文
language: 'zh_CN',
// 官网抄的图片上传 项目如果用了vue-resource可以用$http 因为比较懒就没改
images_upload_handler(blobInfo, success, failure) {
// 图片base64
// let imageUrl = "data:image/jpg;base64,"+ blobInfo.base64();
// console.log("blobInfo", blobInfo);
// let imageUrl = 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1596234646&di=c6754daed08666a5b975f8960120e77b&src=http://pic1.win4000.com/pic/2/7c/bed1803982.jpg';
// success(imageUrl) //成功后插入图片
let formData = new FormData
let imageUrl = ""
formData.append("upload[]",blobInfo.blob(),blobInfo.filename());
//Axios上传图片
uploadAvatar(formData).then(response => {
if (response.code === 200) {
imageUrl = process.env.VUE_APP_BASE_API + '/' + response.data
success(imageUrl) //成功后插入图片
// this.msgSuccess('修改成功')
} else {
this.msgError(response.msg)
}
})
},
// 加入主题
skin_url: '/tinymce/skins/ui/oxide', //public目录下 //主题样式
height: 500, //高度
// toolbar: false,//false禁用工具栏(隐藏工具栏)
// menubar: false,// 隐藏最上方menu菜单
browser_spellcheck: true, // 拼写检查
branding: false, // 去水印
// statusbar: false, // 隐藏编辑器底部的状态栏
// elementpath: false, //禁用下角的当前标签路径
paste_data_images: true, // 允许粘贴图像
plugins: [
'advlist autolink lists link imagetools image charmap print preview anchor colorpicker textcolor contextmenu',
'searchreplace visualblocks code fullscreen',
'insertdatetime media table paste code help wordcount autoresize'
],
toolbar:
'undo redo | formatselect | bold italic backcolor | \
alignleft aligncenter alignright alignjustify | \
bullist numlist outdent indent |imagetools image media | removeformat | help'
},
// 遮罩层
loading: true,
isEdit: false,
// 类型数据字典
typeOptions: [],
isRecommendOptions: [], isTopOptions: [], statusOptions: [],
// 表单参数
form: {},
// 表单校验
rules: {
articleId:
[
{required: true, message: '不能为空', trigger: 'blur'}
],
navigateId:
[
{required: true, message: '栏目ID不能为空', trigger: 'blur'}
],
title:
[
{required: true, message: '标题不能为空', trigger: 'blur'}
],
author:
[
{required: true, message: '文章作者不能为空', trigger: 'blur'}
],
content:
[
{required: true, message: '内容不能为空', trigger: 'blur'}
],
}
}
},
created() {
this.getDicts('sys_yes_no').then(response => {
this.isRecommendOptions = response.data
})
this.getDicts('sys_yes_no').then(response => {
this.isTopOptions = response.data
})
this.getDicts('sys_normal_disable').then(response => {
this.statusOptions = response.data
})
},
watch: {},
methods: {
// 取消按钮
cancel() {
this.reset()
},
// 表单重置
reset() {
this.form = {
articleId: undefined,
navigateId: undefined,
title: undefined,
keywords: undefined,
description: undefined,
imageUrl: undefined,
content: undefined,
author: undefined,
source: undefined,
hits: undefined,
isRecommend: undefined,
isTop: undefined,
url: undefined,
tags: undefined,
commentNums: undefined,
status: undefined,
timeFormt: undefined,
}
this.resetForm('form')
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm('queryForm')
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const articleId = row.articleId || this.ids
getArticle(articleId).then(response => {
this.form = response.data
this.open = true
this.title = '修改文章表'
this.isEdit = true
})
},
// 上传图片
// uploadImg() {
// this.$refs.cropper.getCropBlob(data => {
// const formData = new FormData()
// formData.append('upload[]', data)
// uploadAvatar(formData).then(response => {
// if (response.code === 200) {
// this.open = false
// this.options.img = process.env.VUE_APP_BASE_API + '/' + response.data
// this.msgSuccess('修改成功')
// } else {
// this.msgError(response.msg)
// }
// this.$refs.cropper.clearCrop()
// })
// })
// },
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.articleId !== undefined) {
updateArticle(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess('修改成功')
this.open = false
this.getList()
} else {
this.msgError(response.msg)
}
})
} else {
addArticle(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess('新增成功')
this.open = false
this.getList()
} else {
this.msgError(response.msg)
}
})
}
}
})
},
}
}
</script>
效果




已经上传到后台的static目录里了

到此已经完成了
vue安装tinyMCE的更多相关文章
- Vue集成tinymce富文本编辑器并实现本地化指南(2019.11.21最新)
tinymce是一款综合口碑特别好.功能异常强大的富文本编辑器,在某些网站,甚至享有"宇宙最强富文本编辑器"的称号.那么,在Vue项目中如何集成呢?这并不困难,只需要参照官方教程 ...
- [Vue安装教程]十分钟学会vue 安装
Vue的安装主要有一下几个步骤: 1.安装npm淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 2.安装脚手架工 ...
- 前端笔记之Vue(一)初识SPA和Vue&webpack配置和vue安装&指令
一.单页面应用(SPA) 1.1 C/S到B/S页面架构的转变 C/S:客户端/服务器(Client/Server)架构的软件. C/S 软件的特点: ① 从window桌面双击打开 ② 更新的时候会 ...
- vue安装搭建
title: vue安装搭建 date: 2018-04-21 14:00:03 tags: [vue] --- 安装 首先安装nodejs 直接官网下载最新版本http://nodejs.cn/do ...
- vue安装及环境搭建
vue项目在pycharm里运行需要安装一个插件,打开settings,找到plugins,里面搜索vue.js,点击安装. vue安装 先安装node.js npm install -g @vue/ ...
- Vue系列(2):Vue 安装
前言:关于页面上的知识点,如有侵权,请看 这里 . 关键词:小白.Vue 安装.Vue目录结构.Vue 构建页面流程 ? 初学者安装 vue 用什么好 大家都知道,学 Vue 最好还是去官网学,官网写 ...
- vue 安装与起步
vue安装: 1.官网下载vue,在script标签里引用(去下载) 2.使用CDN(建议下载到本地,不推荐这种方法): BootCDN:https://cdn.bootcss.com/vue/2.2 ...
- Vue安装及插件Vue Devtools
vue安装: # 最新稳定版 $ npm install vue # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新 ...
- vue安装遇到的5个报错小结
前言 这篇博文不会教你怎么安装vue,但会告知安装过程中可能遇到的5个问题 2017年我写过一篇安装vue的博客,详情:https://www.cnblogs.com/tu-0718/p/752109 ...
- vue安装及创建项目的几种方式
原文地址:https://www.wjcms.net/archives/vue安装及创建项目的几种方式 VUE安装的方式 直接用 script标签 引入 对于制作原型或学习,你可以这样使用最新版本: ...
随机推荐
- kafka主题、消费者、生产者命令行操作
十二.Kafka (1)Topic 1)查看当前服务器中的所有topic bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --list 2) ...
- Linux服务器定时器
网络程序需要处理的第三类事件是定时事件,比如定期检测一个客户连接的活动状态.服务器程序通常管理着众多定时事件,因此有效地组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器 ...
- JWT登录认证-项目BotBattle
目录 session 授权认证原理 密码存储与加密 jwt(JSON Web Token)验证 JWT 的无状态认证机制 实践与调试 实现目标:在没有判断登录认证的情况下,访问任意界面,直接跳转到登录 ...
- #欧拉回路#AT4518 [AGC032C] Three Circuits
题目 给定一个 \(n\) 个点,\(m\) 条边的简单无向连通图, 问是否能将边分成三部分,使每部分都能成为环 分析 每个点的度数都得为偶数,这不由得想到了欧拉回路. 如果整张图是一个简单环那么一定 ...
- 应用缺少POI数据,如何开发地点深度信息?
用户在App里搜索某个地点时,并不满足单一的地点信息,希望得到更多可以帮助其做决策的深度信息.例如有打车出行需求的用户,在打车App里搜索地点时可以显示周边的地点,精确到某个路口,让用户可以自由选择合 ...
- 在 Visual Studio 2022 中创建一个类似于旧版本 Visual Studio 中的 Win32 Console Application 项目
在 Visual Studio 2022 中创建一个项目,其自动生成的源文件内容包含 #include "stdafx.h" 和使用_tmain 作为入口点,意味着你需要创建一个基 ...
- mysql 必知必会整理—组合查询与全文搜索[九]
前言 简单整理一下组合查询与全文搜索. 正文 什么是组合查询,就是我们常说的交并补集. 直接上例子. 举一个例子,假如需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的 ...
- Redis工具类,不用框架时备用
redis.hostName=127.0.0.1 redis.port=6379 redis.database=3 redis.timeout=15000 redis.usePool=true red ...
- 实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】
引言 集成测试可在包含应用支持基础结构(如数据库.文件系统和网络)的级别上确保应用组件功能正常. ASP.NET Core 通过将单元测试框架与测试 Web 主机和内存中测试服务器结合使用来支持集成测 ...
- mysql错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)