LayUI富文本域使用案例

article/2025/9/24 20:56:44

LayUI富文本域是一款轻量级的富文本编辑器,页面设计比较简约。之前写项目时因为用的是LayUI框架,所以富文本域当时就用的LayUI富文本编辑器,这里整理一下。

先来看一下效果图,页面效果图。

 

访问效果图:

首先需要引入LayUI的JS和CSS样式文件。

显示LayUI的富文本域页面只需要放一个textarea标签,可以设置富文本域的默认值。

<textarea id="lay_edit" lay-verify="content" name = "text" th:text="${model.text}"></textarea>

之后用JS渲染页面。

<script>layui.use(['layedit', 'form'], function(){var form = layui.form;var layedit = layui.layedit;layedit.set({	//设置图片接口uploadImage: {url: 'layEdit/upload', //接口urltype: 'post'}});//创建一个编辑器,lay_edit为textarea标签的id值var index = layedit.build('lay_edit',{height: 350    //设置编辑器的高度});//提交时把值同步到文本域中form.verify({//content富文本域中的lay-verify值content: function(value) {return layedit.sync(index);}});});
</script>

上面代码主要有三部分。

设置图片上传的接口。

layedit.set({	//设置图片接口uploadImage: {url: 'layEdit/upload', //接口urltype: 'post'}
});

图片上传后台方法。

@RequestMapping(value="/upload")
@ResponseBody
public Object upload(MultipartFile file) {String filename = file.getOriginalFilename();String uuid = UUID.randomUUID().toString();boolean boole = fileService.saveFile(file, uuid);if (boole) {Map<String,Object> map = new HashMap<String,Object>();Map<String,Object> map2 = new HashMap<String,Object>();map.put("code", 0);	//0表示上传成功map.put("msg","上传成功"); //提示消息map2.put("src", "http://localhost/layEdit/download?uuid="+uuid);map2.put("title", filename);map.put("data", map2);return map;} else {return file.getOriginalFilename();}
}

返回的数据格式是LayUI固定的,LayUI前台接收返回的数据格式为:

{"code": 0,      //0表示成功,其他表示失败"msg": "",       //提示信息,//一般上传失败后返回"data":  {"src": "图片路径","title":  "图片名称"    //可选}
}

其中saveFile方法为图片上传方法,上传返回的地址是下载方法的地址,其代码如下。

// 图片存放位置
private final static String IMAGEPATH="e:\\layui\\image";//保存图片
@Transactional
public boolean saveFile(MultipartFile file, String uuid){try{File path = path(file.getContentType());String filename = file.getOriginalFilename();FileImg fileEntity = new FileImg();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date=new Date();fileEntity.setFileName(filename);fileEntity.setUuid(uuid);String storeaddress = path.getAbsolutePath();fileEntity.setStoreaddress(storeaddress);File saveFile = new File(path,uuid);try {fileRepository.save(fileEntity);file.transferTo(saveFile);return true;} catch (IllegalStateException | IOException e) {e.printStackTrace();return false;}}catch (Exception e){System.out.println("图片保存异常");return false;}
}//图片地址是否存在
private File path(String filename) {File pat=new File("e:\\layui");File path = new File(FileService.IMAGEPATH);if(!pat.isDirectory()) {pat.mkdir();}if(!path.isDirectory()) {path.mkdir();}return path;
}/*** 下载* @param uuid* @param request* @param response*/
public void download(String uuid, HttpServletRequest request, HttpServletResponse response) {FileImg fileentity = fileRepository.findByUuid(uuid);String filename = fileentity.getFileName();filename = getStr(request, filename);File file = new File(fileentity.getStoreaddress(), uuid);if(file.exists()) {FileInputStream fis;try {fis = new FileInputStream(file);response.setContentType("application/x-msdownload");response.addHeader("Content-Disposition", "attachment; filename=" + filename );ServletOutputStream out = response.getOutputStream();byte[] buf=new byte[2048];int n=0;while((n=fis.read(buf))!=-1){out.write(buf, 0, n);}fis.close();out.flush();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}private String getStr(HttpServletRequest request, String fileName) {String downloadFileName = null;String agent = request.getHeader("USER-AGENT");try {if(agent != null && agent.toLowerCase().indexOf("firefox") > 0){//downloadFileName = "=?UTF-8?B?" + (new String(Base64Utils.encode(fileName.getBytes("UTF-8")))) + "?=";//设置字符集downloadFileName = "=?UTF-8?B?" + Base64Utils.encodeToString(fileName.getBytes("UTF-8")) + "?=";}else{downloadFileName =  java.net.URLEncoder.encode(fileName, "UTF-8");}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return downloadFileName;
}

渲染textarea富文本域。

//创建一个编辑器,lay_edit为textarea标签的id值
var index = layedit.build('lay_edit',{height: 350
});

其他属性参数。

属性类型描述
toolArray重新定制编辑器工具栏,如: tool: ['link', 'unlink', 'face']
hideToolArray不显示编辑器工具栏,一般用于隐藏默认配置的工具bar
heightNumber设定编辑器的初始高度
uploadImageObject设定图片上传接口,如:uploadImage: {url: '/upload/', type: 'post'}

目前LayUI富文本域可选的Bar有(顺序可以自由排列):

tool: ['strong' //加粗,'italic' //斜体,'underline' //下划线,'del' //删除线,'|' //分割线,'left' //左对齐,'center' //居中对齐,'right' //右对齐,'link' //超链接,'unlink' //清除链接,'face' //表情,'image' //插入图片,'help' //帮助
]

同步富文本域中的数据。

//提交时把值同步到textarea文本域中
form.verify({//content富文本域中的lay-verify值content: function(value) {return layedit.sync(index);}
});

通过上面的JS渲染代码就可以得到一个完整的富文本域了,效果图如下(可以根据自己需求修改属性)。

页面全部代码。

<style type="text/css">#myForm{background: white;padding: 30px;}
</style>
<form id="myForm" method="post" class="layui-form white-bg radius"><div class="layui-form-item"><label class="layui-form-label">标题</label><div class="layui-input-block"><input type="text" class="layui-input" name="title" ></div></div><div class="layui-form-item"><label class="layui-form-label">发布人</label><div class="layui-input-block"><input type="text" class="layui-input" name="name" ></div></div><div class="layui-form-item"><label class="layui-form-label">内容</label><div class="layui-input-block"><textarea id="lay_edit" lay-verify="content" name = "text" ></textarea></div></div><div class="layui-form-item"><div class="layui-input-block"><button type="submit" lay-submit="" class="layui-btn layui-btn-radius layui-btn-normal" style="width: 150px" lay-filter="formSubmit" >保存</button></div></div>
</form><script>layui.use(['layedit', 'form'], function(){var form = layui.form;var layedit = layui.layedit;layedit.set({	//设置图片接口uploadImage: {url: 'layEdit/upload', //接口urltype: 'post'}});//创建一个编辑器var index = layedit.build('lay_edit',{height: 350});//提交时把值同步到文本域中form.verify({//content富文本域中的lay-verify值content: function(value) {return layedit.sync(index);}});form.on("submit(formSubmit)", function (data) {console.log(data.field);$.post("layEdit/save", data.field, function(result){layer.msg(result.msg,{offset:'rb'});});return false;  })});
</script>

关于富文本域的部分上面已经说的很清楚了,JS部分还包含了一个保存的方法。因为在富文本域渲染时设置了,提交时把值同步到textarea文本域中。所以这里就不用管了。

保存时,我们可以通过控制台输出看到表单序列化后的参数。

后台保存方法,新增和修改保存公用的一个方法,用ID作为区分,ID为null是新增,不为null为修改。

@Override
public Object save(LayEditForm form) throws InstantiationException, IllegalAccessException {try {LayEdit model = new LayEdit();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Integer id = form.getId();if(id!=null) {model=layEditService.findById(id);}else{form.setCreatdate(sdf.format(new Date()));}BeanUtils.copyProperties(form, model,"id");layEditService.save(model);return new AjaxResult("数据保存成功");} catch (Exception e) {return new AjaxResult(false,"数据保存失败");}
}

就写到这里了,如果还什么问题欢迎下方留言交流。

 


http://chatgpt.dhexx.cn/article/eROgEHYQ.shtml

相关文章

文本域(可输入多行文本)

1&#xff09;和文本、密码输入框一样&#xff0c;文本域的代码也是在<form></form>标签内部的。 语法如下&#xff1a; <textarea rows"行数" cols"列数">文本</textarea>如&#xff1a; <!DOCTYPE HTML> <html> <…

文本域、标签、密码域、文本区、滚动窗格——文本输入

文本域 将文本域添加到窗口的常用办法就是将它添加到面板或者其他的容器中&#xff1a; JPanel panel new JPanel(); JTextField textField new JTextField("Default input", 20); panel.add(textField);上面的代码添加一个文本域&#xff0c;同时传递“Default …

第十三篇、文本框、密码框和文本域。

文章目录 前言一、文本框、密码框和文本域之间的对比二、代码示例1.文本框2.密码框3.文本域 总结 前言 上一篇我们共同学习了下拉框和列表框&#xff0c;本篇我们将学习文本框、密码框和回顾我们之前学习的文本域。 一、文本框、密码框和文本域之间的对比 文本框&#xff1a;…

java:文本域的简单使用

文本域的简单使用 一、关键代码二、简单说明三、流程图四、源码&#xff08;一&#xff09;、源码A&#xff08;二&#xff09;、源码A的运行效果 五、结语六、定位日期 一、关键代码 常见的创建类方式&#xff0c;创建文本域。需要注意添加相关的包类&#xff0c;具体可看源码…

HTML|下拉框和文本域、文件域

HTML|下拉框和文本域、文件域 1.下拉框 在平时我们填问卷或者冲浪的时候做筛选的时候都会遇到下拉框&#xff0c;html写一个下拉框的方式是使用select标签&#xff0c;name和id是默认属性 <select name"1" id""></select>在select标签内部可…

20、HTML <textarea>标签(文本域)

在使用表单时&#xff0c;例如姓名、年龄字段我们可以使用单行文本框&#xff0c;但是当涉及到描述信息&#xff0c;内容比较多时&#xff0c;单行文本框很有可能放不下所有的内容&#xff0c;这时就需要用到多行文本框。 在 HTML 中&#xff0c;使用 <textarea> 标签来…

概率论公式整理

1、排列与组合公式 2、加法和乘法原理 3、随机试验和随机事件 4、基本事件、样本空间和事件  5、事件的关系与运算 6、概率的公理化定义 7、古典概型  8、几何概型 9、加法公式 10、减法公式 11、条件概率 12、乘法公式 13、独立性 14、全概率公式 15、贝叶斯…

古典概率,条件概率,全概率

文章目录 概率论的基本概念排列数组合数例题 古典概率例题例题 联合概率条件概率例题 条件概率的推广例题 全概率公式例题 贝叶斯公式例题 概率论的基本概念 排列数 组合数 例题 古典概率 例题 例题 联合概率 条件概率 例题 条件概率的推广 例题 全概率公式 例题 贝叶斯公式 例…

《高数叔》概率论与数理统计期末总复习笔记(持续更新中)

文章目录 一、随机时间与概率---day11.随机事件与样本空间的概念2.事件的关系&#xff08;集合之间的关系&#xff09;3.事件的运算律---交换律-结合律-分配律-德摩根律4.概率的概念和性质5.古典概型6.条件概率7.乘法定理8.全概率公式9.贝叶斯公式全概率&贝叶斯举例 10.事件…

概率论发展史上的几个经典问题

1.巴拿赫的火柴盒问题 巴拿赫 Stefan Banach 是 20 世纪初最重要的数学家之一——如果你对流行数学感兴趣&#xff0c;你就会听说过 Banach-Tarski 悖论&#xff1b;如果你做过任何严肃的线性代数&#xff0c;你就会知道巴拿赫空间&#xff1b;如果你读过《破解数学》&#xf…

古典概型,条件概率,贝叶斯公式

概率的定义&#xff0c;性质 定义 设 E E E 是随机试验&#xff0c; S S S 是它的样本空间。    对于 E E E 的每一个事件 A A A 赋予一个实数&#xff0c;记为 P ( A ) P(A) P(A)&#xff0c;称为事件 A A A 的概率。    如果集合函数 P ( ⋅ ) P(\, \boldsymbo…

古典概率基础

1. 抛硬币问题&#xff1a;(二项分布) 一般地&#xff0c;抛硬币n次&#xff0c;其中正面出现k次的情况是, 所以正面出现k次的概率为 练习&#xff1a;使用数值或者解析方法&#xff0c;分析n->无穷的情况&#xff0c;得出结论。 2. 掷骰子 1.用列举法枚举骰子的情况 2.…

古典概率习题

对于至少有一个人中奖&#xff0c;我们都要将其转换为没有人中奖&#xff0c;然后再拿1减去这个概率

统计-4 概率、古典概率

概率 描述事件发生可能性的指标&#xff1b; 假设4个人要出去玩&#xff0c;要决定是否带伞&#xff0c;因此对事件 A “明天会下雨”估计&#xff0c;甲说100%可能下雨&#xff0c;乙说70%&#xff0c;丙说30%&#xff0c;丁说0%肯定不下雨&#xff1b;这些数字代表了每个人对…

C3: 古典概率/几何概率/概率定义及性质/条件概率

》》点赞&#xff0c;收藏关注&#xff0c;理财&技术不迷路《《 目录&#xff1a; 3. 古典概率Classical Probability 频率概率&#xff1a; 古典概型&#xff1a; 这个例子&#xff0c;n的区别就是指定和没有指定。 后面365*364******* 意思是每个人的生日都不一样&…

古典概率,排列组合和贝叶斯定理(学习笔记)

第一次用CSDN写博客&#xff0c;其实主要目的是用来自己做统计学笔记归纳。 我现在是在外国就读统计与数据分析本科。其实本人以前在国内是个数学白痴&#xff0c;只是出国了突然就成了数学好..而且也是听朋友说读统计数据分析以后找工作不愁&#xff0c;所以就误打误撞近了这…

古典概率,先验概率,后验概率,贝叶斯分类器

古典概率&#xff1a;随机现象所能发生的事件是有限的、互不相容的,而且每个基本事件发生的可能性相等。 两个特点&#xff1a; 一是试验的样本空间有限&#xff0c;如掷硬币有正反两种结果&#xff0c;掷骰子有6种结果等&#xff1b; 二是试验中每个结果出现的可能性相同&am…

app测试和app接口测试要点详解

一、app测试要点 1.安装、卸载&#xff1a;测试app能否正常安装或者卸载 2.app升级&#xff1a;本地升级&#xff0c;在线升级&#xff0c;原数据是否正常 3.功能性 不同平台一致性 4稳定性 系统交互,低电量,蓝牙耳机 5.权限 6.正常场景 基本功能 7.异常场景 无电,无网 …

App测试流程及测试点

目录 1 APP测试基本流程1.1 流程图1.2 测试周期1.3 测试资源1.4 日报及产品上线报告 2 App测试点2.1 安全测试2.1.1 软件权限2.1.2 安装与卸载安全性2.1.3 数据安全性2.1.4 通讯安全性2.1.5 人机接口安全性 2.2 安装、卸载测试2.2.1 安装2.2.2 卸载 2.3 UI测试2.3.1 导航测试2.…