Vue项目快速整合WangEditor富文本编辑器

Vue项目快速整合WangEditor富文本编辑器

在这里插入图片描述
在这里插入图片描述

一、安装依赖

npm i wangeditor --save   //富文本编辑器
npm install highlight.js -S    //代码高亮
npm install dompurify  vue-dompurify-html  // 防xss 库

二、app.vue代码案例

已对接图片、视频接口 ,具体看如下代码案例 。

2.1、图片接口数据格式
{"data": [{"alt": "图片文字说明","href": "跳转链接","url": "http://localhost:8080/uploads/1727435190_2.jpg"}],"errno": 0
}
2.2、视频接口数据格式
{"data": {"url": "http://localhost:8080/uploads/1727435236_20240920_092347.mp4"},"errno": 0
}
<template><div id="app"><h1>Hello WangEditor</h1><button @click="logEditorContent">输出编辑器内容</button><br><br><div ref="editorContainer" style="height: 300px; border: 1px solid #ccc;"></div></div>
</template><script>
import E from 'wangeditor';
import 'highlight.js/styles/github.css';export default {name: 'App',data() {return {editor: null,};},mounted() {this.$nextTick(() => {this.editor = new E(this.$refs.editorContainer);// 配置图片上传的服务器接口this.editor.config.uploadImgServer = 'http://localhost:8080/upload';this.editor.config.uploadFileName = 'file';// 配置视频上传的服务器接口this.editor.config.uploadVideoServer = 'http://localhost:8080/upload-video';this.editor.config.uploadVideoName = 'file';this.editor.highlight = window.hljs;// 图片上传的回调处理逻辑this.editor.config.uploadImgHooks = {customInsert: (insertImgFn, result) => {if (result.errno === 0 && result.data && Array.isArray(result.data) && result.data.length > 0) {const imageData = result.data[0];if (imageData.url && typeof imageData.url === 'string' && imageData.url.trim() !== '') {insertImgFn(imageData.url, imageData.alt, imageData.href);}}},};// 视频上传的回调处理逻辑this.editor.config.uploadVideoHooks = {customInsert: (insertVideoFn, result) => {if (result.errno === 0 && result.data && result.data.url) {insertVideoFn(result.data.url);} else {console.error('视频上传失败');}},};this.editor.create();});},beforeDestroy() {if (this.editor) {this.editor.destroy();}},methods: {logEditorContent() {if (this.editor) {const content = this.editor.txt.html();  // 获取编辑器中的HTML内容console.log("编辑器内容:", content);}},},
};
</script><style>
#app {width: 80%;margin: 20px auto;
}.w-e-text-container {min-height: 300px;
}
</style>

go后端接口案例,可直接复制用

package mainimport ("fmt""github.com/gin-gonic/gin""mime/multipart""net/http""path/filepath""strings""time"
)func main() {router := gin.Default()// 跨域中间件router.Use(CORSMiddleware())// 静态文件服务,将 "./uploads" 目录公开router.Static("/uploads", "./uploads")// 图片上传接口router.POST("/upload", uploadFile)// 视频上传接口router.POST("/upload-video", uploadVideo)// 启动服务器,监听8080端口router.Run(":8080")
}// 上传文件处理(图片)
func uploadFile(c *gin.Context) {uploadCommon(c, "image")
}// 上传视频处理
func uploadVideo(c *gin.Context) {uploadCommon(c, "video")
}// uploadCommon 是通用的文件上传处理函数,接受图片或视频
func uploadCommon(c *gin.Context, fileTypeExpected string) {file, err := c.FormFile("file")if err != nil {c.JSON(http.StatusBadRequest, gin.H{"errno": 1,"data":  gin.H{},})return}// 使用时间戳生成唯一文件名filename := fmt.Sprintf("%d_%s", time.Now().Unix(), filepath.Base(file.Filename))savePath := filepath.Join("./uploads", filename)// 保存文件到指定路径if err := c.SaveUploadedFile(file, savePath); err != nil {c.JSON(http.StatusInternalServerError, gin.H{"errno": 1,"data":  gin.H{},})return}// 判断文件类型fileType := getFileType(file)if fileType == fileTypeExpected {// 如果文件类型匹配(图片或视频),根据不同类型返回相应的 JSON 响应if fileType == "image" {c.JSON(http.StatusOK, gin.H{"errno": 0,"data": []gin.H{{"url":  "http://localhost:8080/uploads/" + filename,"alt":  "图片文字说明","href": "跳转链接",},},})} else if fileType == "video" {c.JSON(http.StatusOK, gin.H{"errno": 0,"data": gin.H{"url": "http://localhost:8080/uploads/" + filename,},})}} else {// 文件类型不匹配c.JSON(http.StatusBadRequest, gin.H{"errno": 1,"data":  gin.H{},})}
}// getFileType 返回文件的 MIME 类型
func getFileType(file *multipart.FileHeader) string {ext := strings.ToLower(filepath.Ext(file.Filename))switch ext {case ".jpg", ".jpeg", ".png", ".gif", ".bmp":return "image"case ".mp4", ".avi", ".mkv", ".mov":return "video"default:return "other"}
}// CORSMiddleware 处理跨域请求的中间件
func CORSMiddleware() gin.HandlerFunc {return func(c *gin.Context) {c.Writer.Header().Set("Access-Control-Allow-Origin", "*")c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, X-Auth-Token, Authorization")// 处理预检请求if c.Request.Method == "OPTIONS" {c.AbortWithStatus(http.StatusNoContent)return}c.Next()}
}

三、预防xss代码案例

首先main.js文件装载
在这里插入图片描述

import DOMPurify from 'dompurify';Vue.directive('dompurify-html', {bind(el, binding) {// 使用 DOMPurify 清理绑定的 HTML 内容el.innerHTML = DOMPurify.sanitize(binding.value);},update(el, binding) {// 每次数据更新时再次清理内容el.innerHTML = DOMPurify.sanitize(binding.value);}
});
<template><div id="app"><h1>安全渲染 HTML 内容</h1><div v-dompurify-html="htmlContent"></div></div>
</template><script>
export default {data() {return {// 动态 HTML 内容,可能来自用户输入或外部数据htmlContent: '<p οnclick="alert(\'XSS\')">这是一些<strong>带有恶意代码</strong>的HTML</p>'};}
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/433697.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用canvas截取web camera指定区域,并生成图片

目标&#xff0c;截取红色色块背后的视频区域。 代码结构如下&#xff1a; <div id"p1"><video id"v1" autoplay playsinline></video><div id"mrz"></div><canvas id"captureCanvas"></can…

小程序开发设计-小程序的宿主环境:宿主环境简介⑥

上一篇文章导航&#xff1a; 小程序开发设计-小程序代码的构成&#xff1a;小程序页面的组成部分详解⑤-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142306902?spm1001.2014.3001.5501 注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 目录 上…

【C++】模板、宏、命名空间、

十五、C中的模板templates 本部分讨论C中的模板templates 在别的语言中&#xff0c;比如java、c、c#等托管语言中&#xff0c;模板类似泛型的概念&#xff0c;但模板比泛型要强大得多。模板有点像宏&#xff0c;而泛型却非常受限于类型系统以及其他很多因素。同时模板也是一个…

腾讯云SDK基本概念

本文旨在介绍您在使用音视频终端 SDK&#xff08;腾讯云视立方&#xff09;产品过程中可能会涉及到的基本概念。 音视频终端 SDK&#xff08;腾讯云视立方&#xff09; 应用 音视频终端 SDK&#xff08;腾讯云视立方&#xff09;通过应用的形式来管理您的项目&#xff08;Ap…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

【一文读懂】C#如何实现通用的排序功能

目录 通用排序功能 1.升序 2.降序 测试 1.测试代码 2.测试结果 本篇文章来分享一下C#如何实现通用的排序功能。在项目中经常会使用到排序的方法&#xff0c;那如何使排序方法更加通用呢&#xff1f;可以通过泛型&#xff0c;接口&#xff0c;委托来实现。 通用排序功能…

学校周赛(1)

A - Short Sort 题目&#xff1a; 思路&#xff1a; 本条题目只允许改一处地方&#xff0c;只有三个字母&#xff0c;我们可以直接枚举所有移动过的结果&#xff0c;同时使用哈希去记录其值&#xff0c;对于每一个输入我们都寻找是否有这个值记录&#xff0c;有则输出YES否则…

数据结构与算法——Java实现 19.队列

目录 一、概述 二、链表实现队列 接口定义 接口实现类 测试类 三、环形数组实现队列 优点 下标计算 判满和判空 判满 判空 辅助变量size判空和判满 方法1 接口定义 接口实现类 测试类 方式2 接口定义 接口实现类 测试类 方法3 接口定义 接口实现类 测试类 生活鲜少给人留下退…

项目实战:构建高效可扩展的Flask Web框架:集成Flask-SQLAlchemy、Marshmallow与日志管理

前言 在Web开发中&#xff0c;构建一个既高效又可扩展的框架是项目成功的基石。Flask作为一个轻量级的Web应用框架&#xff0c;凭借其易用性和灵活性&#xff0c;特别适合快速开发和原型设计。结合Flask-SQLAlchemy&#xff08;为Flask提供SQLAlchemy ORM支持的扩展&#xff0…

剑指 offer 刷题集

目录 数组 1. LCR 121. 寻找目标值 - 二维数组 2. LCR 120. 寻找文件副本 3. LCR 128. 库存管理 I 4. LCR 131. 砍竹子 I 5. LCR 132. 砍竹子 II 6. LCR 135. 报数 7. LCR 139. 训练计划 I 8. LCR 158. 库存管理 II 9. LCR 159. 库存管理 III 10. LCR 160. 数据流中…

计算机毕业设计 在线项目管理与任务分配系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

一文带你读懂分库分表,分片,Sharding的许多概念

一文带你读懂分库分表,分片,Sharding的许多概念 分库是将一个库拆分为多个库&#xff0c;分表就是将一个表拆分为多个表。分库分表有垂直拆分和水平拆分。垂直拆分一般是按照业务将表分到不同的库中&#xff08;此种不在本发的讨论范围&#xff09;。水平拆分是将表的数据拆分…

HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13

HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13

华为玄玑感知系统震撼发布:智能穿戴新品引领情绪健康新纪元

在科技日新月异的今天&#xff0c;华为再次以其卓越的创新能力&#xff0c;为智能穿戴领域带来了一场革命性的变革。 8月28日&#xff0c;华为玄玑感知系统暨穿戴创新技术发布会圆满落幕&#xff0c;会上正式揭晓了这款名为“玄玑”的神秘感知系统&#xff0c;预示着穿戴设备将…

.netcore nacos注册成功,服务列表找不到任何服务

命令空间id不要自动生成 .netcore 配置文件里&#xff0c;Namespace 配置命名空间id 而不是命名空间名称。

宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?

猫毛、狗毛、鹦鹉毛&#xff0c;总之只要家里养着有带毛的宠物&#xff0c;毛就会出现在各种地方&#xff0c;床上、沙发上、衣服上、水杯里...根本躲不开。而且&#xff0c;除了肉眼可见的&#xff0c;呼吸时、说话时&#xff0c;不经意间还会吃到毛毛。这些毛毛飘在空气里时&…

动手学LLM(ch2)

2.1 理解词嵌入 深度神经网络模型&#xff0c;包括大型语言模型&#xff08;LLMs&#xff09;&#xff0c;无法直接处理原始文本&#xff0c;因为文本是分类数据&#xff0c;与神经网络的数学运算不兼容。为了达到这个目的&#xff0c;需要将单词转换为连续值向量。记住一句话…

17【Protues单片机仿真】基于51单片机的太阳能智能谷物翻晒机器人

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;避障&#xff0c;低于50CM报警&#xff0c;LED灯亮起&#xff0c;自动翻晒用光敏电阻&#xff0c;光照强度大&#xff0c;电机转动&#xff0c;相当于翻晒粮食&#xff0…

Linux——pod的调度

pod的调度 控制器: rc/rs 副本数量控制器 主要保证pod的数量符合管理员要求&#xff0c;并不会对pod进行额外的管理 以下三种控制器&#xff0c;本质上是服务控制器。具备以下特性&#xff1a; 副本数量的控制服务的滚动更新&#xff08;更新pod&#xff09;支持更新失…

高校教师成果管理小程序的设计与实现springboot(lw+演示+源码+运行)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…