Vue.js中集成summernote
首先引用summernote样式及js:
<!--summernote css -->
<link href="${ctxPath}/static/css/summernote/summernote-0.8.8.css" rel="stylesheet"> <!--summernote-->
<script src="${ctxPath}/static/plugins/summernote/summernote.js"></script>
<script src="${ctxPath}/static/plugins/summernote/summernote-zh-CN.min.js"></script>
Add.html:
<input id="content" name="content" type="hidden" v-model="sysNotify.notifyContent">
<div class="col-sm-11">
<div class="ibox-content no-padding">
<div id="content_sn" class="summernote"></div>
</div>
</div>
Add.js:
$().ready(function() {
$('.summernote').summernote({
height : '220px',
lang : 'zh-CN',
callbacks : {
onImageUpload: function(files, editor, $editable) {
sendFile(files);
}
}
});
});
var vm = new Vue({
el:'#dpLTE',
data: {
sysNotify: {
id:
}
},
methods : {
/* html_encode: function (str) {
var s = ''
if (str.length === 0) return ''
s = str.replace(/&/g, '&')
s = s.replace(/</g, '<')
s = s.replace(/>/g, '>')
s = s.replace(/ /g, ' ')
s = s.replace(/'/g, ''')
s = s.replace(/"/g, '"')
s = s.replace(/\n/g, '<br>')
return s
},
html_decode: function (str) {
var s = ''
if (str.length === 0) return ''
s = str.replace(/&/g, '&')
s = s.replace(/</g, '<')
s = s.replace(/>/g, '>')
s = s.replace(/ /g, ' ')
s = s.replace(/'/g, '\'')
s = s.replace(/"/g, '"')
s = s.replace(/<br>/g, '\n')
return s }, */
acceptClick: function() {
if (!$('#form').Validform()) {
return false;
}
var content_sn = $("#content_sn").summernote('code');
$("#content").val(content_sn);
//vm.sysNotify.notifyContent=html_encode(content_sn); //采用js中直接转义方式,调用公用的转义函数encode
vm.sysNotify.notifyContent=content_sn; //采用过滤器的方式,在数据提交时进行转义
//alert(vm.sysNotify.notifyContent);
$.SaveForm({
url: '../../sys/notify/save?_' + $.now(),
param: vm.sysNotify,
success: function(data) {
$.currentIframe().vm.load();
}
});
}
}
})
Edit.js:
$().ready(function() {
$('.summernote').summernote({
height : '220px',
lang : 'zh-CN',
callbacks: {
onImageUpload: function(files, editor, $editable) {
sendFile(files);
}
}
});
});
var vm = new Vue({
el:'#dpLTE',
data: {
sysNotify: {
id:
}
},
methods : {
/* html_encode: function (str) {
var s = ''
if (str.length === 0) return ''
s = str.replace(/&/g, '&')
s = s.replace(/</g, '<')
s = s.replace(/>/g, '>')
s = s.replace(/ /g, ' ')
s = s.replace(/'/g, ''')
s = s.replace(/"/g, '"')
s = s.replace(/\n/g, '<br>')
return s
},
html_decode: function (str) {
var s = ''
if (str.length === 0) return ''
s = str.replace(/&/g, '&')
s = s.replace(/</g, '<')
s = s.replace(/>/g, '>')
s = s.replace(/ /g, ' ')
s = s.replace(/'/g, '\'')
s = s.replace(/"/g, '"')
s = s.replace(/<br>/g, '\n')
return s
}, */
setForm: function() {
$.SetForm({
url: '../../sys/notify/info?_' + $.now(),
param: vm.sysNotify.id,
success: function(data) {
vm.sysNotify = data;
///alert(vm.sysNotify.notifyContent);
//$('#content_sn').summernote('code', html_decode(vm.sysNotify.notifyContent)); //采用js中直接转义方式,调用公用的转义函数decode
$('#content_sn').summernote('code', vm.sysNotify.notifyContent); //采用过滤器的方式,在数据提交时进行转义
}
});
},
acceptClick: function() {
if (!$('#form').Validform()) {
return false;
}
var content_sn = $("#content_sn").summernote('code');
$("#content").val(content_sn);
vm.sysNotify.notifyContent=vm.html_encode(content_sn);
$.ConfirmForm({
url: '../../sys/notify/update?_' + $.now(),
param: vm.sysNotify,
success: function(data) {
$.currentIframe().vm.load();
}
});
}
}
})
summernote图片上传回调函数sendFile:
//编辑器新增的ajax上传图片函数
function sendFile(files, editor, $editable) {
var size = files[].size;
if((size / / ) > ) {
alert("图片大小不能超过2M...");
return false;
}
console.log("size="+size);
var formData = new FormData();
formData.append("file", files[]);
$.ajax({
data : formData,
type : "POST",
url : "/sys/file/upload", // 图片上传出来的url,返回的是图片上传后的路径,http格式
cache : false,
contentType : false,
processData : false,
dataType : "json",
success: function(data) {//data是返回的hash,key之类的值,key是定义的文件名
$('.summernote').summernote('insertImage',data.fileName);
},
error:function(){
alert("上传失败");
}
});
}
后台upload方法:
@ResponseBody
@PostMapping("/upload")
R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
/*if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}*/
String fileName = file.getOriginalFilename();
fileName = FileUtil.renameToUUID(fileName);
SysFileEntity sysFile = new SysFileEntity(FileType.fileType(fileName), "/files/" + fileName, new Date());
try {
FileUtil.uploadFile(file.getBytes(), dpConfig.getUploadPath(), fileName);
} catch (Exception e) {
return R.error();
} if (sysFileService.save(sysFile) > ) {
return R.ok().put("fileName",sysFile.getUrl());
}
return R.error();
}
文件上传路径虚拟映射:
registry.addResourceHandler("/files/**").addResourceLocations("file:///"+dpConfig.getUploadPath());
文件路径过滤:
public FilterRegistrationBean xssFilterRegistration() {
XssFilter xssFilter = new XssFilter();
FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter);
registration.setOrder(Integer.MAX_VALUE);
registration.addUrlPatterns("/upload");
return registration;
}
这样就不需要在前端encode和decode,xssFilter过滤器会自动做这些事情。
测试图例:



Vue.js中集成summernote的更多相关文章
- vue.js中,input和textarea上的v-model指令到底做了什么?
v-model是 vue.js 中用于在表单表单元素上创建双向数据绑定,它的本质只是一个语法糖,在单向数据绑定的基础上,增加了监听用户输入事件并更新数据的功能: 对,它本质上只是一个语法糖,但到底是一 ...
- 实例分析Vue.js中 computed和methods不同机制
在vue.js中,有methods和computed两种方式来动态当作方法来用的 1.首先最明显的不同 就是调用的时候,methods要加上() 2.我们可以使用 methods 来替代 comput ...
- Vue.js中使用select选择下拉框
在Vue.js中使用select选择下拉框有两种方法: 第一种: Add.html: <select v-model="sysNotice.noticeType" id=&q ...
- vue.js 中双向绑定的实现---初级
1. 1 我们看到的变量,其实都不是独立的,它们都是windows对象上的属性 <!DOCTYPE html> <html lang="en"> <h ...
- 浅析Vue.js 中的条件渲染指令
1 应用于单个元素 Vue.js 中的条件渲染指令可以根据表达式的值,来决定在 DOM 中是渲染还是销毁元素或组件. html: <div id="app"> < ...
- vue.js中的slot
vue.js 中的 slot 一.slot 的作用 调用组件的时候,对于数据,我们会用props将数据从父组件传至子组件.但是,如果从父组件到子组件,单纯是页面局部渲染的改变,slot会更合适. 二. ...
- Vue.js中css的作用域
Vue.js中的css的作用域问题: 如果在vue组件下的style中定义样式,效果会作用于整个html页面,如果只想本组件的css样式只作用于本组件的话,在<style>标签里添加sco ...
- vue.js 中 data, prop, computed, method,watch 介绍
vue.js 中 data, prop, computed, method,watch 介绍 data, prop, computed, method 的区别 类型 加载顺序 加载时间 写法 作用 备 ...
- angular.js和vue.js中实现函数去抖(debounce)
问题描述 搜索输入框中,只当用户停止输入后,才进行后续的操作,比如发起Http请求等. 学过电子电路的同学应该知道按键防抖.原理是一样的:就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用 ...
随机推荐
- 转:对UI自动化测试的一些感悟
不断发掘自动化测试对各个团队的附加价值,这样才能得到来自四面八方的支持,没有将自动化加入项目过程的自动化都达不到预期的效果. UI自动化框架 把UI自动化框架设计成一个拼图性质的架构.把每个特性都设计 ...
- python学习第20天
python中的继承 单继承 多继承
- Django—入门
索引 1.搭建环境 2.创建项目 3.设计模型 4.管理站点 5.视图及URL 6.模板 软件框架 问题1:什么是软件框架? 举个简单的例子,对于一个公司来说,公司中有各个职能部门,每个部门各司其职, ...
- 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法
1.改变background-size属性 将图片作为某个html元素的背景图片,用transition属性改变图片的大小. .container{ background-size: 100% 100 ...
- zoj4027 线性dp!好题
非常好的dp,可是我太菜做不出来.. /* 第i个左括号不可能越过第i+1个左括号 如果第i个左括号到位置j,前提是第i+1个左括号就必须到位置j+1即以后 用dp[i][j]表示把第i个左括号转移到 ...
- oracle导入.dmp文件
在日常开发中,经常需要往一个数据库里导入.dmp文件,下面简单介绍下如何通过命令导入 1.创建一个awsbpm用户create user 用户名 identified by 密码; 如:create ...
- Python_多进程
Python 多进程库 multiprocessing ,支持子进程.通信.数据共享.执行不同形式的同步 多进程,绕过gil ,实现多核的利用,多进程也是原生进程,由操作系统维护 在pycharm中, ...
- vs2019 cdkey 秘钥
专业版NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y 企业版BF8Y8-GN2QH-T84XB-QVY3B-RC4DF
- java集成swagger
概览: java集成Swagger Swagger-UI的使用 Springboot跨域请求的访问解决 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 W ...
- Linux bash基础特性二
shell脚本的组成部分 shebang 各种命令组合 编程变量种类 本地变量: 仅仅在当前的shell生效 环境变量: 在当前和子shell生效 局部变量: shell进程某代码片段 位置变量: $ ...