在很多业务系统中,有时候需要编辑富文本,就是包括图文消息排版等处理,图片有时候需要结合后端实现图片的上传处理,在本篇随笔中,结合@wangeditor的富文本编辑器和上传文件的处理的封装,来实现系统新闻资讯的管理,可以实现图片上传和图文排版的常规操作。

1、@wangeditor的富文本编辑器

该富文本编辑器控件的官网地址:https://www.wangeditor.com/,官网提供很详尽的使用介绍。

对应Vue版本的编辑器控件是:@wangeditor/editor-for-vue

因此我们可以通过pnpm 、npm等安装管理工具进行组件的安装。

pnpm install @wangeditor/editor-for-vue --save

其他的处理就和常规的组件使用差不多了。我们来大概介绍下使用的案例。

界面代码

<template>
<div style="border: 1px solid #ccc;">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editor"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
style="height: 500px; overflow-y: hidden;"
v-model="html"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="onCreated"
/>
</div>
</template>

脚本控制代码

<script>
import Vue from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue' export default Vue.extend({
components: { Editor, Toolbar },
data() {
return {
editor: null,
html: '<p>hello</p>',
toolbarConfig: {},
editorConfig: { placeholder: '请输入内容...' },
mode: 'default', // or 'simple'
}
},
methods: {
onCreated(editor) {
this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
},
},
mounted() {
// 模拟 ajax 请求,异步渲染编辑器
setTimeout(() => {
this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
}, 1500)
},
beforeDestroy() {
const editor = this.editor
if (editor == null) return
editor.destroy() // 组件销毁时,及时销毁编辑器
},
})
</script>

通过官方案例的指引,我们可以对其工具栏、编辑器配置、菜单、以及相应API进行处理即可。

界面效果如下所示。

2、自定义上传文件的处理

一般富文本的编辑器,都会提供相应的图片上传接口处理,该@wangeditor的富文本编辑器也是提供了很弹性化的文件上传接口的处理,以便兼容我们各自五花八门的图片上传接口处理。

通过官网的配置介绍,我们可以适应自己后端的接口和相关的配置信息。

如我的后端上传文件的接口为: /api/fileupload/postupload ,后端接口定义如下所示。

        /// <summary>
/// 多文件上传处理(自动根据配置文件选择合适的上传方式)
/// </summary>
/// <returns></returns>
[RequestSizeLimit(100000000)] //请求正文最大大小100M
[HttpPost]
[Route("postupload")]
public async Task<List<ResponseFileInfo>> PostUpload()
{
var httpContext = this.HttpContext;
var form = await Request.ReadFormAsync();
string? guid = form["guid"];
string? folder = form["folder"];
var files = form.Files;

其中我们接受的参数包括guid(附件的GUID),folder(图片类别)以及接收Files的集合。返回的集合里面包括有id,文件名称,文件地址等内容,如下所示。

因此根据我的后端接口上传处理,传入相关的参数来处理编辑器控件配置。

// 更多详细配置看 https://www.wangeditor.com/v5/menu-config.html#%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87
editorConfig.MENU_CONF["uploadImage"] = {
// 服务端上传地址,根据实际业务改写
server: "/api/fileupload/postupload",
// form-data 的 fieldName,根据实际业务改写
fieldName: "file",
// 选择文件时的类型限制,根据实际业务改写
allowedFileTypes: ["image/png", "image/jpg", "image/jpeg"], // 单个文件的最大体积限制,默认为 2M
maxFileSize: 1 * 1024 * 1024, // 1M // 最多可上传几个文件,默认为 100
maxNumberOfFiles: 10, // 自定义上传参数,参数会被添加到 formData 中,一起上传到服务端。
meta: {
folder: props.imageFolder,
guid: props.imageGuid,
},
// 自定义增加 http headers,如果接口需要令牌头信息,需要带上
headers: {
Accept: 'text/x-json',
Authorization: 'Bearer ' + getAccessToken(),
}, // 将 meta 拼接到 url 参数中,默认 false
metaWithUrl: false, // 自定义插入图片
customInsert(res: any, insertFn: InsertFnType) {
// console.log("customInsert", res);
const result = res.result as Array<ResponseFileInfo>;
if (result.length > 0) {
const { id, name, url } = result[0];
// res.data.url是后端返回的图片地址,根据实际业务改写
if (url) {
setTimeout(() => { // insertFn插入图片进编辑器
insertFn(url, name, url);
}, 2000);
}
}
}
};

根据返回的结果,我们调用编辑器的接口实现图片的插入。

  // 自定义插入图片
customInsert(res: any, insertFn: InsertFnType) {
// console.log("customInsert", res);
const result = res.result as Array<ResponseFileInfo>;
if (result.length > 0) {
const { id, name, url } = result[0];
// res.data.url是后端返回的图片地址,根据实际业务改写
if (url) {
setTimeout(() => { // insertFn插入图片进编辑器
insertFn(url, name, url);
}, 2000);
}
}
}
};

3、实现框架中的系统新闻资讯的管理

为了方便使用富文本编辑器,不用每次都配置一次相关的参数,我们把集成好上传图片的功能整合到自定义编辑器控件里面去,因此就可以实现重用了。

因此定义了该控件的几个可以传入来的相关属性参数如下所示。

const props = defineProps({
modelValue: {
type: String,
required: false
},
placeholder: {
type: String,
default: '请输入内容...',
required: false
},
imageFolder: {
type: String,
default: '文章图片',
required: false
},
imageGuid: {
type: String,
default: util.guid(),
required: false
}
});

并在内容变化的时候,触发事件通知。

// Emits
const emit = defineEmits<{
(e: 'update:modelValue', val: any | any[]): void;
}>();

再把前面的编辑器自定义参数处理内容整合进去。

// 更多详细配置看 https://www.wangeditor.com/v5/menu-config.html#%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87
editorConfig.MENU_CONF["uploadImage"] = {
// 服务端上传地址,根据实际业务改写
server: "/api/fileupload/postupload",
// form-data 的 fieldName,根据实际业务改写
fieldName: "file",
// 选择文件时的类型限制,根据实际业务改写
allowedFileTypes: ["image/png", "image/jpg", "image/jpeg"], // 单个文件的最大体积限制,默认为 2M
maxFileSize: 1 * 1024 * 1024, // 1M // 最多可上传几个文件,默认为 100
maxNumberOfFiles: 10, // 自定义上传参数,参数会被添加到 formData 中,一起上传到服务端。
meta: {
folder: props.imageFolder,
guid: props.imageGuid,
},
// 自定义增加 http headers,如果接口需要令牌头信息,需要带上
headers: {
Accept: 'text/x-json',
Authorization: 'Bearer ' + getAccessToken(),
}, // 将 meta 拼接到 url 参数中,默认 false
metaWithUrl: false, // 自定义插入图片
customInsert(res: any, insertFn: InsertFnType) {
// console.log("customInsert", res);
const result = res.result as Array<ResponseFileInfo>;
if (result.length > 0) {
const { id, name, url } = result[0];
// res.data.url是后端返回的图片地址,根据实际业务改写
if (url) {
setTimeout(() => { // insertFn插入图片进编辑器
insertFn(url, name, url);
}, 2000);
}
}
}
};

由于我们后端的接口不是匿名的,需要令牌,因此需要额外增加对应的Token令牌信息的头部。

  // 自定义增加 http  headers,如果接口需要令牌头信息,需要带上
headers: {
Accept: 'text/x-json',
Authorization: 'Bearer ' + getAccessToken(),
},

然后监控相关的内容处理即可。

// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor == null) return;
editor.destroy();
}); //加载的时候,赋值给编辑器
onMounted(() => {
valueHtml.value = props.modelValue ?? "";
// console.log(props.modelValue)
}); watch(() => props.modelValue, (val) => {
valueHtml.value = val
}) watch(() => valueHtml.value, (newVal) => {
emit("update:modelValue", newVal)
// 使用 nextTick 确保 DOM 更新完成后再更新编辑器内容
nextTick(() => {
if (editorRef.value) {
editorRef.value.setHtml(newVal);
}
});
})

完成编辑器的自定义控件,如下所示。

然后我们在具体的页面里面,导入自定义控件,就可以在页面代码中使用自己的富文本编辑控件了。

 <my-editor v-model="editForm.content" image-folder="文章图片" />

在我们完成了@wangeditor的富文本编辑器和上传文件的处理的封装后,我们可以用它来实现系统新闻资讯的管理。

然后尝试上传文件处理

测试上传文件,完成后端接口对接处理即可。

这样我们就可以在多端中查看或者处理相关的系统新闻资讯内容了,如以下界面是通过H5对接后端接口,实现新闻资讯内容的管理。

   

在Vue3+ElementPlus前端中增加对@wangeditor的富文本编辑器和上传文件的处理的封装,实现系统新闻资讯的管理的更多相关文章

  1. 【前端】wangEditor(富文本编辑器) 简易使用示例

    转载请说明作者或者注明出处,谢谢 说到前端常用的编辑器,自然也少不了富文本编辑器(RichText Editor) 笔者在此之前也看了一些相关的在线编辑器,其中包括了当百度搜索“富文本编辑器”字样时出 ...

  2. Vue.js中使用wangEditor富文本编辑器

    1.前端代码 前端HTML <script src="https://cdn.bootcss.com/wangEditor/10.0.13/wangEditor.js"> ...

  3. React+wangeditor+node富文本处理带图片上传

    最近有个需求出现在我的视野中,因为我的另外的博客需要上传文章,但是我不想每次都在我的数据库中慢慢的修改格式,所以我另做了一个后台去编辑文本后发送给服务器,那么这里就涉及到两点,一个是富文本,一个是需要 ...

  4. 是时候选择一款富文本编辑器了(wangEditor)

    需要一款富文本编辑器,当然不能自己造轮子.本来想使用cnblog也在用的TinyMCE,名气大,功能全.但是发现TinyMCE从4.0开始,不再支持直接下载.所以还是决定选用wangEditor.遗憾 ...

  5. Django项目中添加富文本编辑器django-ckeditor

    django-ckeditor库的使用步骤: 1.在命令行下安装django-ckeditor这个库: 命令:pip install django-ckeditor 2.安装成功后,配置Django项 ...

  6. 前端轻量级、简单、易用的富文本编辑器 wangEditor 的基本用法

    1.富文本编辑器市面上有很多,但是综合考虑之后wangEditor是最易用的框架,推荐使用 首先进入官网 http://www.wangeditor.com 基本是2中方式引入: 使用CDN://un ...

  7. 「newbee-mall新蜂商城开源啦」 页面优化,最新版 wangEditor 富文本编辑器整合案例

    大家比较关心的新蜂商城 Vue3 版本目前已经开发了大部分内容,相信很快就能够开源出来让大家尝鲜了,先让大家看看当前的开发进度: 开源仓库地址为 https://github.com/newbee-l ...

  8. 更加简洁易用——wangEditor富文本编辑器新版本发布

    1. 前言 wangEditor富文本编辑器(www.wangEditor.com)从去年11月份发布,至今已经有将近10各月了.它就像一个襁褓中的小婴儿,在我的努力以及众多使用者的支持下不断摸索.成 ...

  9. 轻量级富文本编辑器wangEditor源码结构介绍

    1. 引言 wangEditor——一款轻量级html富文本编辑器(开源软件) 网站:http://www.wangeditor.com/ demo演示:http://www.wangeditor.c ...

  10. 百度富文本编辑器ueditor在jsp中的使用(ssm框架中的应用)

    折腾了一下午终于把百度富文本编辑器ueditor搞定了!   项目地址:https://github.com/724888/lightnote_new     首先我参考了一个ueditor的demo ...

随机推荐

  1. 模板导入_分页_cookie_装饰器_实例

    程序目录 urls.py """s14_day21 URL Configuration"""from django.contrib impo ...

  2. ShadowSql之开源不易

    ShadowSql集本人以前为公司内部开发的ORM之众长 再次进化而来,性能更好也更通用 其一.历时3个多月,已经发布了8个版本 在此期间深感做个开源项目非常的不易 好在现在本人想要的功能基本都已经开 ...

  3. linux 的 Docker 配置(版本24.04)

    linux 的docker配置(版本24.04) 这里默认是server版本的, 个人感觉好用,资源消耗少 1.配置ssh连接 个人习惯用ssh连接使用 (如果失败,先配置下一步的换源) sudo a ...

  4. 【公众号搬运】React-Native开发鸿蒙NEXT(7)-上线

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. python实现小时划分

    1.要实现图表如下图  2.后台的数据结构 说明:将每个小时按10分钟为一个时间间隔,分成6段,00.10.20.30.40.50然后将每个时间段组成如下数据:{'time': '22:30', 's ...

  6. Java 枚举类的简单介绍

    综述   enum 的全称为 enumeration, 是Java1.5引入的新特性,通过关键字enum来定义枚举类.它是一种特殊类,和普通类一样可以使用构造器.定义成员变量和方法,也能实现一个或多个 ...

  7. yoga14c2024(ultra7-155H)使用雷电4转接oculink外接RTX4070Ti Super跑分

    yoga14c2024(ultra7-155H)使用雷电4转接oculink外接RTX4070Ti Super跑分 自媒体跑分 内屏 \[损耗=1-16731/24723\approx32.3\%\n ...

  8. C/C++中的volatile

    C/C++中的volatile 约定 Volatile 这个话题,涉及到计算机科学多个领域多个层次的诸多细节.仅靠一篇博客,很难穷尽这些细节.因此,若不对讨论范围做一些约定,很容易就有诸多漏洞.到时误 ...

  9. AppBox拖拽设计增删改查用户界面

      之前为了应对客制化大屏设计的需求,在框架内实现了拖拽方式(动态化)生成用户界面的功能,跟大部分实现方式差不多,设计时生成配置json,然后在运行时解析json生成用户界面.这次完善了一下该功能,支 ...

  10. 微信小程序调用SAP发布的REST显示数据列表

    看了一段时间的微信小程序,感觉对一些企业来说,也是可以用起来的.哪怕只是简单的使用. 先发布REST:参照这里:https://www.cnblogs.com/sapSB/p/9968054.html ...