Ueditor 编辑器实战 HTML / vue+v-model
简介
富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器。市面上流行的编辑器有很多,大致如下:
名称 | 优势 | 不足 |
---|---|---|
wangEditor | 轻量简洁,最重要的是开源且中文文档齐全。设计的UI漂亮 | 没有强大的后台支持 |
kindeditor | 文档齐全 中文文档便于阅读理解 界面类似百度 | 存在图片上传问题,如果上传历史过多,会全部加载,导致浏览器卡,反应慢 |
bootstrap-wysiwyg | 外观简洁大方,使用方便,支持网站充分利用Bootstrap、Font Awesome等工具库的优秀特性 | 没有表情包 , 没有开发文档不便于阅读使用 |
Jquery-notebook | 简单,干净,优雅.用鼠标选中文字可看到效果 | 由于bootstrap兼容问题 需要运行在现代浏览器上 , 没有开发文档不便于阅读 |
summernote | 界面简介,舒服,强大的API文档,开发方便,组件内元素易于控制(重要)移动或WEB端回显完美支持 | 功能单一 |
ueditor | 插件多,基本满足各种需求 | 重量级插件(个人观点哈),加载过慢,界面陈旧,官方早期插件已停止迭代优化,问题较多,组件内元素不易控制 |
本章节就 ueditor 进行开发阐述,至于开发过程中遇到的一些问题,后续我会在博客中一一向大家阐述,同时欢迎留言质问。
功能介绍
Ueditor 有着丰富且强大的功能,如图所示
我们分为两大类:1、基本功能 2、增值功能(在下自定义)
基本功能:加粗、字体、字号、下划线、表格…一些不需要后台支持的功能;
增值功能:所有均需要后端代码支持。
例如:图片视频文件上传插件一般都有配置,富文本也不例外,配置一定是针对功能的,既然功能有区别,配置也有,ueditor的配置文件有两种,一种是基本配置,有个专属的配置js文件供大家使用,并且里面有详细的使用说明;
HTML 开发
-
引入js/css 文件
ueditor.config.js :配置文件 ueditor基本配置都存放于此。详细介绍请看官方文档介绍,此处不一一列举。
ueditor.all.js: 核心源码
zh-cn.js: 中文包 -
初始化插件
<script type="text/javascript" charset="utf-8" src="${base}/lib/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="${base}/lib/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="${base}/lib/ueditor/lang/zh-cn/zh-cn.js"></script>
<div>
<script id="container" type="text/plain" style="width:100%;height:500px;"></script>
</div>
<script type="text/javascript">
var ucontent = ${content};
var ue = UE.getEditor('container',{initialFrameHeight:400,scaleEnabled:true});
UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;
UE.Editor.prototype.getActionUrl = function(action) {
if (action == 'uploadimage' || action == 'uploadscrawl' || action == 'uploadvideo' || action == 'uploadfile') {
return '${filebase}/editor/upload'; //在这里返回我们实际的上传图片地址
} else {
return this._bkGetActionUrl.call(this, action);
}
};
ue.ready(function() {
ue.setContent(ucontent);
});
</script>
- 后端接口支持
上传文件接口:
后端提供文件上传接口,这里的文件上传包括图片视频音频等,都调用同一个接口,需要注意的是接口返回的数据严格按照此种json格式来,否则编辑时识别不了将不会回显图片,至于上传功能,您可以自由发挥,但必须确保返回的路径可以访问哦!
/**
* 上传文件 到fastdfs文件服务器
*
* @param file 需要上传的文件
* @return 保存后的文件地址,文件组名
* @author Jung
* @since 2018年06月16日12:17:42
*/
@PostMapping("upload")
public String upload(@RequestParam(required = false) MultipartFile file) {
//fastdfs 文件服务器地址
if (file == null || file.isEmpty()) {
return "error";
}
try {
FastdfsFileDTO fileDTO = fileService.fileUpload(file, false);
String config = "{\"state\": \"SUCCESS\"," +
"\"url\": \"" + fileDTO.getFileUrl() + "\"," +
"\"title\": \"" + fileDTO.getFileName() + "\"," +
"\"original\": \"" + fileDTO.getFileName() + "\"}";
return config;
} catch (UnityRuntimeException e) {
return "error";
}
}
获取功能项配置接口
编辑器此项有没有增值功能,全部依赖此接口返回,若你不想配置某项功能可以在接口中删掉对应的属性,前端则无此功能,这些配置里包含着上传路径,上传action名称,表单名称,限制文件大小等等,皆有详细注释。此接口地址在前段需要配置在config.js 中,如图所示
@RequestMapping(value = "/config")
@ResponseBody
public String config(HttpServletRequest request, HttpServletResponse response) {
String config = "{\n" +
" /* 上传图片配置项 */\n" +
" \"imageActionName\": \"uploadimage\", /* 执行上传图片的action名称 */\n" +
" \"imageFieldName\": \"file\", /* 提交的图片表单名称 */\n" +
" \"imageMaxSize\": 2048000, /* 上传大小限制,单位B */\n" +
" \"imageAllowFiles\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"], /* 上传图片格式显示 */\n" +
" \"imageCompressEnable\": true, /* 是否压缩图片,默认是true */\n" +
" \"imageCompressBorder\": 1600, /* 图片压缩最长边限制 */\n" +
" \"imageInsertAlign\": \"none\", /* 插入的图片浮动方式 */\n" +
" \"imageUrlPrefix\": \"\", /* 图片访问路径前缀 */\n" +
" \"imagePathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\", /* 上传保存路径,可以自定义保存路径和文件名格式 */\n" +
" /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */\n" +
" /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */\n" +
" /* {time} 会替换成时间戳 */\n" +
" /* {yyyy} 会替换成四位年份 */\n" +
" /* {yy} 会替换成两位年份 */\n" +
" /* {mm} 会替换成两位月份 */\n" +
" /* {dd} 会替换成两位日期 */\n" +
" /* {hh} 会替换成两位小时 */\n" +
" /* {ii} 会替换成两位分钟 */\n" +
" /* {ss} 会替换成两位秒 */\n" +
" /* 非法字符 \\ : * ? \" < > | */\n" +
" /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */\n" +
"\n" +
" /* 涂鸦图片上传配置项 */\n" +
" \"scrawlActionName\": \"uploadscrawl\", /* 执行上传涂鸦的action名称 */\n" +
" \"scrawlFieldName\": \"file\", /* 提交的图片表单名称 */\n" +
" \"scrawlPathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\", /* 上传保存路径,可以自定义保存路径和文件名格式 */\n" +
" \"scrawlMaxSize\": 2048000, /* 上传大小限制,单位B */\n" +
" \"scrawlUrlPrefix\": \"\", /* 图片访问路径前缀 */\n" +
" \"scrawlInsertAlign\": \"none\",\n" +
"\n" +
" /* 截图工具上传 */\n" +
" \"snapscreenActionName\": \"uploadimage\", /* 执行上传截图的action名称 */\n" +
" \"snapscreenPathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\", /* 上传保存路径,可以自定义保存路径和文件名格式 */\n" +
" \"snapscreenUrlPrefix\": \"\", /* 图片访问路径前缀 */\n" +
" \"snapscreenInsertAlign\": \"none\", /* 插入的图片浮动方式 */\n" +
"\n" +
" /* 抓取远程图片配置 */\n" +
" \"catcherLocalDomain\": [\"127.0.0.1\", \"localhost\", \"img.baidu.com\"],\n" +
" \"catcherActionName\": \"catchimage\", /* 执行抓取远程图片的action名称 */\n" +
" \"catcherFieldName\": \"source\", /* 提交的图片列表表单名称 */\n" +
" \"catcherPathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\", /* 上传保存路径,可以自定义保存路径和文件名格式 */\n" +
" \"catcherUrlPrefix\": \"\", /* 图片访问路径前缀 */\n" +
" \"catcherMaxSize\": 2048000, /* 上传大小限制,单位B */\n" +
" \"catcherAllowFiles\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"], /* 抓取图片格式显示 */\n" +
"\n" +
" /* 上传视频配置 */\n" +
" \"videoActionName\": \"uploadvideo\", /* 执行上传视频的action名称 */\n" +
" \"videoFieldName\": \"file\", /* 提交的视频表单名称 */\n" +
" \"videoPathFormat\": \"/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}\", /* 上传保存路径,可以自定义保存路径和文件名格式 */\n" +
" \"videoUrlPrefix\": \"\", /* 视频访问路径前缀 */\n" +
" \"videoMaxSize\": 52428800, /* 上传大小限制,单位B,50MB */\n" +
" \"videoAllowFiles\": [\n" +
" \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n" +
" \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\"], /* 上传视频格式显示 */\n" +
"\n" +
" /* 上传文件配置 */\n" +
" \"fileActionName\": \"uploadfile\", /* controller里,执行上传视频的action名称 */\n" +
" \"fileFieldName\": \"file\", /* 提交的文件表单名称 */\n" +
" \"filePathFormat\": \"/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}\", /* 上传保存路径,可以自定义保存路径和文件名格式 */\n" +
" \"fileUrlPrefix\": \"\", /* 文件访问路径前缀 */\n" +
" \"fileMaxSize\": 52428800, /* 上传大小限制,单位B,默认50MB */\n" +
" \"fileAllowFiles\": [\n" +
" \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n" +
" \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n" +
" \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n" +
" \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n" +
" \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n" +
" ], /* 上传文件格式显示 */\n" +
"\n" +
" /* 列出指定目录下的图片 */\n" +
" \"imageManagerActionName\": \"listimage\", /* 执行图片管理的action名称 */\n" +
" \"imageManagerListPath\": \"/ueditor/jsp/upload/image/\", /* 指定要列出图片的目录 */\n" +
" \"imageManagerListSize\": 20, /* 每次列出文件数量 */\n" +
" \"imageManagerUrlPrefix\": \"\", /* 图片访问路径前缀 */\n" +
" \"imageManagerInsertAlign\": \"none\", /* 插入的图片浮动方式 */\n" +
" \"imageManagerAllowFiles\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"], /* 列出的文件类型 */\n" +
"\n" +
" /* 列出指定目录下的文件 */\n" +
" \"fileManagerActionName\": \"listfile\", /* 执行文件管理的action名称 */\n" +
" \"fileManagerListPath\": \"/ueditor/jsp/upload/file/\", /* 指定要列出文件的目录 */\n" +
" \"fileManagerUrlPrefix\": \"\", /* 文件访问路径前缀 */\n" +
" \"fileManagerListSize\": 20, /* 每次列出文件数量 */\n" +
" \"fileManagerAllowFiles\": [\n" +
" \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n" +
" \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n" +
" \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n" +
" \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n" +
" \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n" +
" ] /* 列出的文件类型 */\n" +
"\n" +
"}";
return config;
}
至此纯HTML 方式集成编辑器就完成了。
vue + ueditor + v-model 开发
1、引入VueUeditorWrap组件
2、绑定数据
3、配置组件
其中 serverUrl 是指 从后端获取 【功能项配置】和【上传图片视频文件】的地址,与纯HTML方式不同的是后端接口,纯HTML 需要后端支持两个接口,则vue集成后 会将两个接口合二为一,将文件上传接口和获取功能项配置接口合并,ueditor会通过 传不同的表单参数来上传文件或者获取数据,如图所示:
@RequestMapping("config")
public void ueditorConfig(HttpServletRequest request, HttpServletResponse response, MultipartFile file) {
try {
String exec = "";
request.setCharacterEncoding("utf-8");
response.setContentType("text/plain");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
String actionType = request.getParameter("action");
String callback = request.getParameter("callback");
System.out.println(callback);
// 获取配置
if ("config".equals(actionType)) {
exec = StringUtils.isNotEmpty(callback) ? callback + "(" + getConfig() + ")" : getConfig();
} else {
if (file == null || file.isEmpty()) {
exec = "error";
}else {
FastdfsFileDTO fileDTO = fileService.fileUpload(file, false);
exec = resultMap(fileDTO);
}
}
PrintWriter writer = response.getWriter();
writer.write(exec);
writer.flush();
writer.close();
} catch (Exception e) {
logger.info("上传错误");
}
}
至此,vue 集成编辑器就此完成。