Skip to content

Commit cbf565a

Browse files
committed
💡 更新 WangEditor 编辑器为最新版本
1 parent 6743ad5 commit cbf565a

File tree

7 files changed

+179
-110
lines changed

7 files changed

+179
-110
lines changed

blog-admin/src/main/resources/static/assets/js/zhyd.core.js

Lines changed: 132 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -158,89 +158,159 @@ var zhyd = window.zhyd || {
158158
uploadUrl: "",
159159
uploadFileName: "file",
160160
uploadType: "",
161-
customCss: {}
161+
customCss: {
162+
border: "1px solid #ccc;",
163+
height: "300px"
164+
},
165+
defaultHtml: "<p><br></p>"
162166

163167
},
164168
init: function (options) {
165169
var config = $.extend(zhyd.wangEditor.defaultConfig, options);
166-
var E = window.wangEditor;
167-
editor = new E(config.container);
168-
// 配置编辑器 start
169-
// 关闭粘贴样式的过滤
170-
editor.config.pasteFilterStyle = false;
171-
editor.config.zIndex = 100;
172-
editor.config.withCredentials = true;
170+
$(config.container).before($('<div id="toolbar-container"></div>'));
173171
if (config.textareaName) {
174172
$('<textarea class="wangeditor-textarea" id="' + config.textareaName + '" name="' + config.textareaName + '" style="display: none" required="required"></textarea>').insertAfter($(config.container));
175173
}
176174
var $contentBox = $('textarea[name=' + config.textareaName + ']');
177-
editor.config.onchange = function (html) {
178-
// 监控变化,同步更新到 textarea
179-
$contentBox.val(html);
180-
};
181-
// 注册上传文件插件
182-
zhyd.wangEditor.plugins.registerUpload(editor, config.uploadUrl, config.uploadFileName, config.uploadType, function (result, curEditor) {
183-
// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
184-
// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
185-
if (result.status == 200) {
186-
var imgFullPath = result.data;
187-
curEditor.txt.append('<img src="' + imgFullPath + '" alt="" style="max-width: 100%;height: auto;border-radius: 6px;"/>');
188-
// 解决上传完图片如果未进行其他操作,则不会触发编辑器的“change”事件,导致实际文章内容中缺少最后上传的图片文件 2018-07-13
189-
$contentBox.val(editor.txt.html());
190-
} else {
191-
$.alert.error(result.message);
192-
}
193-
});
194-
// 配置编辑器 end
195-
editor.create();
196-
// 注册全屏插件
197-
// 注册图片资源库
198-
zhyd.wangEditor.plugins.registerMaterial(editor, $contentBox);
199175

200176
if (config.customCss) {
201177
// 自定义编辑器的样式
202178
for (var key in config.customCss) {
203179
var value = config.customCss[key];
204-
editor.$textContainerElem.css(key, value);
180+
$(config.container).css(key, value);
205181
}
206182
}
207-
},
208-
plugins: {
209-
registerUpload: function (editor, uploadUrl, uploadFileName, uploadType, callback) {
210-
if (uploadUrl) {
211-
// 上传图片到服务器
212-
editor.config.uploadImgServer = uploadUrl;
213-
editor.config.uploadFileName = uploadFileName;
214-
// 将图片大小限制为 50M
215-
editor.config.uploadImgMaxSize = 50 * 1024 * 1024;
216-
// 超时时间
217-
editor.config.uploadImgTimeout = 10000;
218-
// 自定义上传参数
219-
editor.config.uploadImgParams = {
220-
// 如果版本 <=v3.1.0 ,属性值会自动进行 encode ,此处无需 encode
221-
// 如果版本 >=v3.1.1 ,属性值不会自动 encode ,如有需要自己手动 encode
222-
uploadType: uploadType
223-
};
224-
editor.config.customAlert = function (msg) {
225-
$.alert.error(msg);
226-
};
227-
editor.config.uploadImgHooks = {
228-
error: function (xhr, editor) {
229-
$.alert.error("图片上传出错");
183+
184+
const { createEditor, createToolbar } = window.wangEditor
185+
186+
const editorConfig = {
187+
placeholder: 'Type here...',
188+
onChange(editor) {
189+
const html = editor.getHtml()
190+
// 监控变化,同步更新到 textarea
191+
$contentBox.val(html);
192+
console.log('changed editor content', html)
193+
},
194+
customAlert(msg, type){
195+
switch (type) {
196+
case 'success':
197+
$.alert.info(msg);
198+
break
199+
case 'info':
200+
$.alert.info(msg);
201+
break
202+
case 'warning':
203+
$.alert.error(msg);
204+
break
205+
case 'error':
206+
$.alert.error(msg);
207+
break
208+
default:
209+
$.alert.info(msg);
210+
break
211+
}
212+
},
213+
MENU_CONF: {
214+
uploadImage: {
215+
server: config.uploadUrl,
216+
// form-data fieldName ,默认值 'wangeditor-uploaded-image'
217+
fieldName: config.uploadFileName,
218+
219+
// 单个文件的最大体积限制,默认为 5M
220+
maxFileSize: 5 * 1024 * 1024, // 5M
221+
222+
// 最多可上传几个文件,默认为 100
223+
maxNumberOfFiles: 1,
224+
225+
// 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
226+
allowedFileTypes: ['image/*'],
227+
228+
// 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
229+
meta: {
230+
uploadType: config.uploadType,
230231
},
231-
timeout: function (xhr, editor) {
232-
$.alert.error("请求超时");
232+
233+
// 将 meta 拼接到 url 参数中,默认 false
234+
metaWithUrl: false,
235+
236+
// 自定义增加 http header
237+
headers: {
233238
},
234-
customInsert: function (insertImg, result, editor) {
235-
if (callback) {
236-
callback(result, editor);
239+
240+
// 跨域是否传递 cookie ,默认为 false
241+
withCredentials: true,
242+
243+
// 超时时间,默认为 10 秒
244+
timeout: 10 * 1000,
245+
246+
// 单个文件上传失败
247+
onFailed(file, res) { // TS 语法
248+
console.log(`${file.name} 上传失败`, res)
249+
$.alert.error(`${file.name} 上传失败`);
250+
},
251+
252+
// 上传错误,或者触发 timeout 超时
253+
onError(file, err, res) { // TS 语法
254+
console.log(`${file.name} 上传出错`, err, res)
255+
$.alert.error(`${file.name} 上传出错, ${err}`);
256+
},
257+
// 自定义插入图片
258+
customInsert(result, insertFn) {
259+
// customInsert(res, insertFn) { // JS 语法
260+
// res 即服务端的返回结果
261+
262+
// 从 res 中找到 url alt href ,然后插入图片
263+
console.log('upload callback:', result);
264+
// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
265+
// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
266+
if (result.status === 200) {
267+
var imgFullPath = result.data;
268+
const html = '<img src="' + imgFullPath + '" alt="" style="max-width: 100%;height: auto;border-radius: 6px;"/>';
269+
editor.dangerouslyInsertHtml(html);
237270
} else {
238-
console.log('upload callback:' + insertImg, result, editor);
271+
$.alert.error(result.message);
239272
}
273+
},
274+
},
275+
uploadVideo: {
276+
server: '/api/unsupported_upload_video',
277+
fieldName: 'unsupported',
278+
timeout: 0, // 5 秒
279+
onBeforeUpload(file) {
280+
$.alert.error('不支持在线上传视频,请使用插入视频');
281+
return false
240282
}
241-
};
283+
}
242284
}
243-
},
285+
}
286+
editor = createEditor({
287+
selector: config.container,
288+
html: config.defaultHtml,
289+
config: editorConfig,
290+
mode: 'default', // or 'simple'
291+
})
292+
const toolbarConfig = {
293+
}
294+
295+
const toolbar = createToolbar({
296+
editor,
297+
selector: '#toolbar-container',
298+
config: toolbarConfig,
299+
mode: 'default', // or 'simple'
300+
})
301+
// 注册全屏插件
302+
// 注册图片资源库
303+
zhyd.wangEditor.plugins.registerMaterial(editor, $contentBox);
304+
//
305+
// if (config.customCss) {
306+
// // 自定义编辑器的样式
307+
// for (var key in config.customCss) {
308+
// var value = config.customCss[key];
309+
// editor.$textContainerElem.css(key, value);
310+
// }
311+
// }
312+
},
313+
plugins: {
244314
registerMaterial: function (editor, $contentBox) {
245315
$("div[id^='w-e-img']").unbind("click").click(function () {
246316
setTimeout(function () {

blog-admin/src/main/resources/static/assets/js/zhyd.publish-article.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ if(articleId){
6060
if(contentHtml){
6161
$("#content").val(contentHtml);
6262
if(editor){
63-
editor.txt.html(contentHtml);
63+
editor.setHtml(contentHtml);
6464
}
6565
}
6666
}

blog-admin/src/main/resources/templates/article/publish-we.ftl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
<#include "/include/macros.ftl">
22
<#setting number_format="#">
33
<@header>
4-
4+
<style>
5+
#editor {
6+
border: 1px solid #ccc;
7+
height: 500px;
8+
}
9+
</style>
510
</@header>
611
<form id="publishForm" class="form-horizontal form-label-left" novalidate>
712
<div class="row">

blog-admin/src/main/resources/templates/include/macros.ftl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,15 @@
2626
<link href="https://cdn.bootcdn.net/ajax/libs/switchery/0.8.2/switchery.min.css" rel="stylesheet">
2727
<link href="https://cdn.bootcdn.net/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput-typeahead.css" rel="stylesheet">
2828
<link href="https://cdn.bootcdn.net/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.css" rel="stylesheet">
29+
<link href="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css" rel="stylesheet">
30+
2931
</#if>
3032
<link href="/assets/css/bootstrap-treetable.css" rel="stylesheet" type="text/css" />
3133
<link href="/assets/css/zhyd.core.css" rel="stylesheet">
3234
<#nested>
35+
<style>
36+
#toolbar-container { border: 1px solid #ccc; }
37+
</style>
3338
</head>
3439
<body class="nav-md">
3540
<div class="container body">

blog-admin/src/main/resources/templates/layout/footer.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/zTree.v3/3.5.37/js/jquery.ztree.core.min.js"></script>
3030
<script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/zTree.v3/3.5.37/js/jquery.ztree.excheck.min.js"></script>
3131
<script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/switchery/0.8.2/switchery.min.js"></script>
32-
<script type="text/javascript" src="https://unpkg.com/wangeditor@4.7.9/dist/wangEditor.min.js"></script>
32+
<script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
3333
<script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.min.js"></script>
3434
</#if>
3535
<script src="https://www.layuicdn.com/layui/layui.js"></script>

blog-admin/src/main/resources/templates/other/editor.ftl

Lines changed: 30 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
<#include "/include/macros.ftl">
22
<@header>
33
<style type="text/css">
4-
.toolbar {
5-
background-color: #f1f1f1;
6-
border: 1px solid #ccc;
7-
}
84
.text {
95
border: 1px solid #ccc;
106
height: 200px;
@@ -24,41 +20,18 @@
2420
</div>
2521
<div class="x_content">
2622
<div class="form-group row">
27-
<label class="control-label col-md-2 col-sm-2 col-xs-12" for="name">菜单和编辑器区域分开 wangEditor</label>
23+
<label class="control-label col-md-2 col-sm-2 col-xs-12" for="name">原生 wangEditor</label>
2824
<div class="col-md-8 col-sm-8 col-xs-12">
29-
<div id="toolbar" class="toolbar"></div>
30-
<div style="padding: 5px 0; color: #ccc">中间隔离带</div>
31-
<div id="div1" class="text" style="height: 100px">
32-
<p>第一个 demo(菜单和编辑器区域分开)</p>
25+
<div id="toolbar1" style="border: 1px solid #ccc;"></div>
26+
<div id="editor1" class="text" style="height: 500px">
3327
</div>
3428
</div>
3529
</div>
3630
<div class="form-group row">
37-
<label class="control-label col-md-2 col-sm-2 col-xs-12" for="name">普通的编辑器 wangEditor</label>
38-
<div class="col-md-8 col-sm-8 col-xs-12">
39-
<div id="div2">
40-
<p>第二个 demo(常规)</p>
41-
</div>
42-
</div>
43-
</div>
44-
<br>
45-
<div class="form-group row">
46-
<label class="control-label col-md-2 col-sm-2 col-xs-12" for="name">oneBlog系统定制的编辑器 wangEditor</label>
31+
<label class="control-label col-md-2 col-sm-2 col-xs-12" for="name">oneBlog系统定制的 wangEditor</label>
4732
<div class="col-md-8 col-sm-8 col-xs-12">
4833
<div id="editor">
49-
<p>第三个 demo(oneBlog系统单独定制,支持文件上传)</p>
50-
<p>
51-
使用方式:
52-
<pre><code># html<br>&lt;div id="editor"&gt;&lt;/div&gt;<br><br># js<br>$.wangEditor.init({<br> container: "#editor",<br> textareaName: "content",<br> uploadUrl: "/api/uploadFile",<br> uploadFileName: "file",<br> uploadType: "goods",<br> customCss: {<br> "overflow-y": "scroll",<br> "height": "100%",<br> "max-height": "125px"<br> }<br>})</code></pre>
53-
</p>
54-
<ul>
55-
<li>container: 编辑器的id,默认为editor</li>
56-
<li>textareaName: 自动生成的textarea组件的name,默认为content。可以自定义为表单中实际的参数name</li>
57-
<li>uploadUrl: 文件上传的api路径。如果不为空,则开启上传文件的功能</li>
58-
<li>uploadFileName: 文件上传时后台接收文件的参数名,默认为file</li>
59-
<li>uploadType: 当前上传文件的场景类型,<strong>最好根据实际业务取名</strong>,它会决定最终上传完成后的文件路径,比如在商品信息管理页中指定了uploadType = goods,那么最终上传完成后的文件路径就是:<code>oneblog/goods/{filename}.png</code>,默认为空</li>
60-
<li>customCss: 自定义的css,可以修改编辑器大小,默认为空。注:如果是修改高度,必须通过<code>max-height</code>参数修改,并且一定要加上:<code>"overflow-y": "scroll"</code>, <code>"height": "100%"</code>这两项配置,否则可能会使编辑器显示不正确</li>
61-
</ul>
34+
6235
</div>
6336
</div>
6437
</div>
@@ -75,15 +48,27 @@
7548
</div>
7649
<@footer>
7750
<script type="text/javascript">
78-
var E = window.wangEditor
79-
var editor1 = new E('#toolbar', '#div1');
80-
editor1.config.zIndex = 10;
81-
editor1.create();
82-
83-
var editor2 = new E('#div2');
84-
editor2.config.zIndex = 10;
85-
editor2.create();
86-
$("#div2").find(".w-e-text-container").css("height","100px");
51+
const { createEditor, createToolbar } = window.wangEditor
52+
const editor1 = createEditor({
53+
selector: '#editor1',
54+
html: '<p><br></p>',
55+
config: {
56+
placeholder: 'Type here...',
57+
onChange(editor) {
58+
const html = editor.getHtml()
59+
console.log('changed editor content', html)
60+
// 也可以同步到 <textarea>
61+
}
62+
},
63+
mode: 'default', // or 'simple'
64+
})
65+
createToolbar({
66+
editor: editor1,
67+
selector: '#toolbar1',
68+
config: {
69+
},
70+
mode: 'default', // or 'simple'
71+
})
8772
8873
// oneblog定制版的wangEditor
8974
zhyd.wangEditor.init({
@@ -92,15 +77,15 @@
9277
uploadUrl: "/api/uploadFile",
9378
uploadFileName: "file",
9479
uploadType: "goods",
80+
defaultHtml: '',
9581
customCss: {
96-
"overflow-y": "scroll",
97-
"height": "100%",
98-
"max-height": "600px"
82+
"border": "1px solid #ccc",
83+
"height": "300px"
9984
}
10085
})
10186
10287
zhyd.tinymce.init({
103-
selector: "#editor",
88+
selector: "#editor3",
10489
uploadUrl: "/api/uploadFile",
10590
uploadFileName: "file",
10691
textareaName: "content2",

update.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
----
55

6+
### 2024-07-21
7+
8+
- 更新 WangEditor 编辑器为最新版本
9+
610
### 2024-06-23
711

812
- 合并 [Gitee PR#48](https://gitee.com/yadong.zhang/DBlog/pulls/48)

0 commit comments

Comments
 (0)