日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bootstrap 可视化编辑器summernote

發布時間:2023/12/31 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bootstrap 可视化编辑器summernote 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄(?)[+]

Bootstrap 可視化HTML編輯器之summernote,用其官網上的介紹就是“Super Simple WYSIWYG editor”,不過在我看來,與bootstrap中文官網上提供的“bootstrap-wysiwyg”要更simple,更漂亮,更好用!

雖然我之前嘗試過使用bootstrap-wysiwyg,可參照Bootstrap wysiwyg富文本數據如何保存到mysql,但事后諸葛亮的經驗告訴我,summernote絕對是更佳的富文本編輯器,這里對其工作team點三十二個贊!!!!!

經過一天時間的探索,對summernote有所掌握,那么為了更廣大前端愛好者提供便利,我將費勁一番心血來介紹一下summernote,超級福利啊。

一、官方API和源碼下載

工欲善其事必先利其器,首先把summernote的源碼拿到以及對應官方API告訴大家是首個任務!

官網(demo和api)?
github源碼下載,注意下載開發版

二、效果圖

效果圖1?

效果圖2?

效果圖3?

三、開講內容

大的方向為以下三個內容:

  • summernote的頁面布局(資源引入、初始參數)
  • summernote從本地上傳圖片方法(前端onImageUpload方法、后端springMVC文件保存)
  • summernote所在form表單的數據提交
  • ①、summernote的頁面布局

    <!DOCTYPE html> <html lang="zh-CN"> <%@ include file="/components/common/taglib.jsp"%> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><title>summernote - bs3fa4</title><!-- include jquery --> <script type="text/javascript" src="${ctx}/components/jquery/jquery.js"></script><!-- include libs stylesheets --><link type="text/css" rel="stylesheet" href="${ctx}/components/bootstrap/css/bootstrap.css" /> <script type="text/javascript" src="${ctx}/components/bootstrap/js/bootstrap.min.js"></script><!-- include summernote --> <link type="text/css" rel="stylesheet" href="${ctx}/components/summernote/summernote.css" /> <script type="text/javascript" src="${ctx}/components/summernote/summernote.js"></script> <script type="text/javascript" src="${ctx}/components/summernote/lang/summernote-zh-CN.js"></script><script type="text/javascript">$('div.summernote').each(function() {var $this = $(this);var placeholder = $this.attr("placeholder") || '';var url = $this.attr("action") || '';$this.summernote({lang : 'zh-CN',placeholder : placeholder,minHeight : 300,dialogsFade : true,// Add fade effect on dialogsdialogsInBody : true,// Dialogs can be placed in body, not in// summernote.disableDragAndDrop : false,// default false You can disable drag// and dropcallbacks : {onImageUpload : function(files) {var $files = $(files);$files.each(function() {var file = this;var data = new FormData();data.append("file", file);$.ajax({data : data,type : "POST",url : url,cache : false,contentType : false,processData : false,success : function(response) {var json = YUNM.jsonEval(response);YUNM.debug(json);YUNM.ajaxDone(json);if (json[YUNM.keys.statusCode] == YUNM.statusCode.ok) {// 文件不為空if (json[YUNM.keys.result]) {var imageUrl = json[YUNM.keys.result].completeSavePath;$this.summernote('insertImage', imageUrl, function($image) {});}}},error : YUNM.ajaxError});});}}});});</script> </head> <body> <div class="container"><form class="form-horizontal required-validate" action="#" enctype="multipart/form-data" method="post" onsubmit="return iframeCallback(this, pageAjaxDone)"><div class="form-group"><label for="" class="col-md-2 control-label">項目封面</label><div class="col-md-8 tl th"><input type="file" name="image" class="projectfile" value="${deal.image}"/><p class="help-block">支持jpg、jpeg、png、gif格式,大小不超過2.0M</p></div></div><div class="form-group"><label for="" class="col-md-2 control-label">項目詳情</label><div class="col-md-8"><div class="summernote" name="description" placeholder="請對項目進行詳細的描述,使更多的人了解你的" action="${ctx}/file">${deal.description}</div></div></div></form> </div> </body> </html>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • <!DOCTYPE html>html5的標記是必須的,注意千萬不能是<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">這種doctype,否則summernote的組件顯示怪怪的,按鈕的大小布局不一致,這里就不再上圖了,但是千萬注意!
    • bootstrap 的版本號最好為v3.3.5

    1、布局div

    <div class="summernote" name="description" placeholder="請對項目進行詳細的描述,使更多的人了解你的" action="${ctx}/file">${deal.description}</div>
    • 1
    • 1

    相信你也看到了我為div加上的三個屬性name、placeholder、action,那么我們來詳細介紹一下三個屬性的作用:

  • name,為外層form表單提供summernote數據保存時的數據模型的屬性名,和input標簽的name屬性作用一致,稍候在form提交的時候具體介紹。
  • placeholder,很直白,為summernote提供初始狀態的文本描述,當然還需要后續加工,div顯然是不支持placeholder屬性的。
  • action,為圖片上傳提供后端接收地址,稍候在介紹圖片上傳onImageUpload會再次用到。
  • 另外${deal.description}其實你不需要太多關注,和textarea的賦值的用法一致,就是單純的顯示保存后的內容。

    2、summernote初始化

    $('div.summernote').each(function() {var $this = $(this);var placeholder = $this.attr("placeholder") || '';var url = $this.attr("action") || '';$this.summernote({lang : 'zh-CN',placeholder : placeholder,minHeight : 300,dialogsFade : true,// Add fade effect on dialogsdialogsInBody : true,// Dialogs can be placed in body, not in// summernote.disableDragAndDrop : false,// default false You can disable drag// and drop});});
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    使用jQuery獲取到頁面上的summernote,對其進行初始化,我們來詳細介紹列出參數的用法(先不介紹圖片上傳的onImageUpload 方法)。

  • lang ,指定語言為中文簡體
  • placeholder ,summernote初始化顯示的內容。
  • minHeight,最小高度為300,注意這里沒有使用height,是有原因的,這里稍作解釋,就不上圖了。當使用height指定高度后,假如上傳比height高的圖片,summernote就不會自動調整高度,并且前文中“效果圖3”中標出的紅色區域會不貼著圖片,而溢出到summernote外部。
  • dialogsFade,增加summernote上彈出窗口滑進滑出的動態效果。
  • dialogsInBody,這個屬性也很關鍵,默認為false,字面上的意思是summernote的彈出框是否在body中(in嘛),設置為false時,dialog的式樣會繼承其上一級外部(如上文中的form-horizontal)容器式樣,那么顯示的效果就很別扭,這里也不再上圖;那么設置為true時,就不會繼承上一級外部div的屬性啦,從屬于body嘛。
  • disableDragAndDrop,設置為false吧,有的時候拖拽會出點問題,你可實踐。
  • ②、summernote從本地上傳圖片方法

    1、前端onImageUpload方法

    假如問度娘如下的話:“onImageUpload方法怎么寫?”,度娘大多會為你找到如下回答:

    $(\'.summernote\').summernote({height:300,onImageUpload: function(files, editor, welEditable) {sendFile(files[0],editor,welEditable);}});});function sendFile(file, editor, welEditable) {data = new FormData();data.append("file", file);url = "http://localhost/spichlerz/uploads";$.ajax({data: data,type: "POST",url: url,cache: false,contentType: false,processData: false,success: function (url) {editor.insertImage(welEditable, url);}}); } </script>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    以上資源來自于stackoverflow。

    但其實呢,summernote-develop版本的summernote已經不支持這種onImageUpload寫法,那么如今的寫法是什么樣子呢?參照summernote的官網例子。

    onImageUpload

    Override image upload handler(default: base64 dataURL on IMG tag). You can upload image to server or AWS S3: more…

    // onImageUpload callback $('#summernote').summernote({callbacks: {onImageUpload: function(files) {// upload image to server and create imgNode...$summernote.summernote('insertNode', imgNode);}} });// summernote.image.upload $('#summernote').on('summernote.image.upload', function(we, files) {// upload image to server and create imgNode...$summernote.summernote('insertNode', imgNode); });
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    那么此時onImageUpload的具體寫法呢?(后端為springMVC):

    callbacks : {// onImageUpload的參數為files,summernote支持選擇多張圖片onImageUpload : function(files) {var $files = $(files);// 通過each方法遍歷每一個file$files.each(function() {var file = this;// FormData,新的form表單封裝,具體可百度,但其實用法很簡單,如下var data = new FormData();// 將文件加入到file中,后端可獲得到參數名為“file”data.append("file", file);// ajax上傳$.ajax({data : data,type : "POST",url : url,// div上的actioncache : false,contentType : false,processData : false,// 成功時調用方法,后端返回json數據success : function(response) {// 封裝的eval方法,可百度var json = YUNM.jsonEval(response);// 控制臺輸出返回數據YUNM.debug(json);// 封裝方法,主要是顯示錯誤提示信息YUNM.ajaxDone(json);// 狀態ok時if (json[YUNM.keys.statusCode] == YUNM.statusCode.ok) {// 文件不為空if (json[YUNM.keys.result]) {// 獲取后臺數據保存的圖片完整路徑var imageUrl = json[YUNM.keys.result].completeSavePath;// 插入到summernote$this.summernote('insertImage', imageUrl, function($image) {// todo,后續可以對image對象增加新的css式樣等等,這里默認});}}},// ajax請求失敗時處理error : YUNM.ajaxError});});} }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    注釋當中加的很詳細,這里把其他關聯的代碼一并貼出,僅供參照。

    debug : function(msg) {if (this._set.debug) {if (typeof (console) != "undefined")console.log(msg);elsealert(msg);}}, jsonEval : function(data) {try {if ($.type(data) == 'string')return eval('(' + data + ')');elsereturn data;} catch (e) {return {};}},ajaxError : function(xhr, ajaxOptions, thrownError) {if (xhr.responseText) {$.showErr("<div>" + xhr.responseText + "</div>");} else {$.showErr("<div>Http status: " + xhr.status + " " + xhr.statusText + "</div>" + "<div>ajaxOptions: " + ajaxOptions + "</div>"+ "<div>thrownError: " + thrownError + "</div>");}},ajaxDone : function(json) {if (json[YUNM.keys.statusCode] == YUNM.statusCode.error) {if (json[YUNM.keys.message]) {YUNM.debug(json[YUNM.keys.message]);$.showErr(json[YUNM.keys.message]);}} else if (json[YUNM.keys.statusCode] == YUNM.statusCode.timeout) {YUNM.debug(json[YUNM.keys.message]);$.showErr(json[YUNM.keys.message] || YUNM.msg("sessionTimout"), YUNM.loadLogin);}},
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    2、后端springMVC文件保存

    2.1、為springMVC增加文件的配置
    <bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"><property name="maxUploadSize" value="1024000000"></property></bean><mvc:annotation-driven conversion-service="conversionService" /><bean id="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><property name="converters"><list><!-- 這里使用string to date可以將dao在jsp到controller轉換的時候直接將string格式的日期轉換為date類型 --><bean class="com.honzh.common.plugin.StringToDateConverter" /> <!-- 為type為file類型的數據模型增加轉換器 --><bean class="com.honzh.common.plugin.CommonsMultipartFileToString" /></list></property></bean>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    這里就不做過多介紹了,可參照我之前寫的SpringMVC之context-dispatcher.xml,了解基本的控制器

    2.2、FileController.java
    package com.honzh.spring.controller;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;import com.honzh.common.base.UploadFile; import com.honzh.spring.service.FileService;@Controller @RequestMapping(value = "/file") public class FileController extends BaseController {private static Logger logger = Logger.getLogger(FileController.class);@Autowiredprivate FileService fileService;@RequestMapping("")public void index(HttpServletRequest request, HttpServletResponse response) {logger.debug("獲取上傳文件...");try {UploadFile uploadFiles = fileService.saveFile(request);renderJsonDone(response, uploadFiles);} catch (Exception e) {logger.error(e.getMessage());logger.error(e.getMessage(), e);renderJsonError(response, "文件上傳失敗");}}}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    2.3、FileService.java
    package com.honzh.spring.service;import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Random;import javax.servlet.http.HttpServletRequest;import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest;import com.honzh.common.Variables; import com.honzh.common.base.UploadFile; import com.honzh.common.util.DateUtil;@Service public class FileService {private static Logger logger = Logger.getLogger(FileService.class);public UploadFile saveFile(HttpServletRequest request) throws IOException {logger.debug("獲取上傳文件...");// 轉換為文件類型的requestMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;// 獲取對應file對象Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();Iterator<String> fileIterator = multipartRequest.getFileNames();// 獲取項目的相對路徑(http://localhost:8080/file)String requestURL = request.getRequestURL().toString();String prePath = requestURL.substring(0, requestURL.indexOf(Variables.ctx));while (fileIterator.hasNext()) {String fileKey = fileIterator.next();logger.debug("文件名為:" + fileKey);// 獲取對應文件MultipartFile multipartFile = fileMap.get(fileKey);if (multipartFile.getSize() != 0L) {validateImage(multipartFile);// 調用saveImage方法保存UploadFile file = saveImage(multipartFile);file.setPrePath(prePath);return file;}}return null;}private UploadFile saveImage(MultipartFile image) throws IOException {String originalFilename = image.getOriginalFilename();logger.debug("文件原始名稱為:" + originalFilename);String contentType = image.getContentType();String type = contentType.substring(contentType.indexOf("/") + 1);String fileName = DateUtil.getCurrentMillStr() + new Random().nextInt(100) + "." + type;// 封裝了一個簡單的file對象,增加了幾個屬性UploadFile file = new UploadFile(Variables.save_directory, fileName);file.setContentType(contentType);logger.debug("文件保存路徑:" + file.getSaveDirectory());// 通過org.apache.commons.io.FileUtils的writeByteArrayToFile對圖片進行保存FileUtils.writeByteArrayToFile(file.getFile(), image.getBytes());return file;}private void validateImage(MultipartFile image) {} }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    2.4、UploadFile.java
    package com.honzh.common.base;import java.io.File;import com.honzh.common.Variables;public class UploadFile {private String saveDirectory;private String fileName;private String contentType;private String prePath;private String completeSavePath;private String relativeSavePath;public UploadFile(String saveDirectory, String filesystemName) {this.saveDirectory = saveDirectory;this.fileName = filesystemName;}public String getFileName() {return fileName;}public String getSaveDirectory() {return saveDirectory;}public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}public String getPrePath() {if (prePath == null) {return "";}return prePath;}public void setPrePath(String prePath) {this.prePath = prePath;setCompleteSavePath(prePath + getRelativeSavePath());}public String getCompleteSavePath() {return completeSavePath;}public void setCompleteSavePath(String completeSavePath) {this.completeSavePath = completeSavePath;}public String getRelativeSavePath() {return relativeSavePath;}public void setRelativeSavePath(String relativeSavePath) {this.relativeSavePath = relativeSavePath;}public void setSaveDirectory(String saveDirectory) {this.saveDirectory = saveDirectory;}public void setFileName(String fileName) {this.fileName = fileName;}public File getFile() {if (getSaveDirectory() == null || getFileName() == null) {return null;} else {setRelativeSavePath(Variables.ctx + "/" + Variables.upload + "/" + getFileName());return new File(getSaveDirectory() + "/" + getFileName());}} }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    后端文件保存方法也非常簡單,懂Java的同學都可以看得懂,那么對于后端不使用springmvc的同學,你可以再找找方法。


    辛苦的介紹完前兩節后,我們來一個動態圖看一下效果吧!?

    ③. summernote所在form表單的數據提交

    這里,我們再回顧一下summernote所在的form表單,其中還包含了一個普通file的input標簽,也就是說,該form還需要上傳一張項目封面。

    <form class="form-horizontal required-validate" action="#" enctype="multipart/form-data" method="post" onsubmit="return iframeCallback(this, pageAjaxDone)">
    • 1
    • 1

    先看一下form的屬性:

  • enctype:”multipart/form-data”,表明為文件類型的form保存
  • iframeCallback方法,稍候詳細介紹,主要是對有文件上傳的form表單進行封裝。
  • 1、iframeCallback

    function iframeCallback(form, callback) {YUNM.debug("帶文件上傳處理");var $form = $(form), $iframe = $("#callbackframe");var data = $form.data('bootstrapValidator');if (data) {if (!data.isValid()) {return false;}}// 富文本編輯器$("div.summernote", $form).each(function() {var $this = $(this);if (!$this.summernote('isEmpty')) {var editor = "<input type='hidden' name='" + $this.attr("name") + "' value='" + $this.summernote('code') + "' />";$form.append(editor);} else {$.showErr("請填寫項目詳情");return false;}});if ($iframe.size() == 0) {$iframe = $("<iframe id='callbackframe' name='callbackframe' src='about:blank' style='display:none'></iframe>").appendTo("body");}if (!form.ajax) {$form.append('<input type="hidden" name="ajax" value="1" />');}form.target = "callbackframe";_iframeResponse($iframe[0], callback || YUNM.ajaxDone); } function _iframeResponse(iframe, callback) {var $iframe = $(iframe), $document = $(document);$document.trigger("ajaxStart");$iframe.bind("load", function(event) {$iframe.unbind("load");$document.trigger("ajaxStop");if (iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" || // For// Safariiframe.src == "javascript:'<html></html>';") { // For FF, IEreturn;}var doc = iframe.contentDocument || iframe.document;// fixing Opera 9.26,10.00if (doc.readyState && doc.readyState != 'complete')return;// fixing Opera 9.64if (doc.body && doc.body.innerHTML == "false")return;var response;if (doc.XMLDocument) {// response is a xml document Internet Explorer propertyresponse = doc.XMLDocument;} else if (doc.body) {try {response = $iframe.contents().find("body").text();response = jQuery.parseJSON(response);} catch (e) { // response is html document or plain textresponse = doc.body.innerHTML;}} else {// response is a xml documentresponse = doc;}callback(response);}); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    貼上全部代碼以供參考,但是這里我們只講以下部分:

    // 富文本編輯器$("div.summernote", $form).each(function() {var $this = $(this);if (!$this.summernote('isEmpty')) {var editor = "<input type='hidden' name='" + $this.attr("name") + "' value='" + $this.summernote('code') + "' />";$form.append(editor);} else {$.showErr("請填寫項目詳情");return false;}});
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 通過form獲取到summernote對象$this 后,通過!$this.summernote('isEmpty')來判斷用戶是否對富文本編輯器有內容上的填寫,保證不為空,為空時,就彈出提示信息。
    • $this.summernote('code')可獲得summernote編輯器的html內容,將其封裝到input對象中,name為前文中div提供的name,供后端使用。

    這里其他地方就不做多解釋了,詳細可參照Bootstrap wysiwyg富文本數據如何保存到mysql。

    保存到數據庫中是什么樣子呢?

    <p><img src="http://localhost:8080/ymeng/upload/2016033117093076.jpeg" style=""></p><p><br></p><p>你好,有興趣可以加入到沉默王二的群啊<br></p>
    • 1
    • 1

    頁面效果為:


    2、新版iframeCallback方法

    var $form = $(form), $iframe = $("#callbackframe");YUNM.debug("驗證其他簡單組件");var data = $form.data('bootstrapValidator');if (data) {if (!data.isValid()) {return false;} }// 富文本編輯器 $("div.summernote", $form).each(function() {var $this = $(this);if ($this.summernote('isEmpty')) {} else {YUNM.debug($this.summernote('code'));// 使用base64對內容進行編碼// 1.解決復制不閉合的html文檔,保存后顯示錯亂的bug// 2.解決文本中特殊字符導致的bugvar editor = "<input type='hidden' name='" + $this.attr("name") + "' value='" + $.base64.btoa($this.summernote('code')) + "' />";$form.append(editor);} });YUNM.debug("驗證通過");
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    比對之前的代碼,可以發現代碼有兩處發生了變化:

  • 當summernote為空時,之前沒有做在bootstrap的validator中,是因為還沒有搞清楚summernote這種非input標簽在validator中的使用,下面會做詳細說明。
  • 對summernote的內容加上了base64編碼處理,這會有很多好處,稍候介紹。
  • 3、base64的使用方法

    js端我在Bootstrap wysiwyg富文本數據如何保存到mysql這篇文章中做了說明,此處不再說明。

    可能會有同學需要JavaScript端的base64編碼,而需要在springMVC后端使用base64的解碼,那么此處介紹一個jar包(Java Base64.jar),使用方法很簡單,下載好jar包后,就可以使用如下方法解碼:

    import it.sauronsoftware.base64.Base64;deal.setDescription(StringEscapeUtils.escapeHtml(Base64.decode(description, "utf-8")));
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
  • 首先,base64的import如上,來自于javabase64.jar包。
  • decode的編碼前端js使用的utf-8,此處自然也用utf-8。
  • 至于StringEscapeUtils類,也是一個非常實用的工具類,有興趣的可詳細關注一下(主要可以對html等等特殊標簽進行轉義)。
  • 4、summernote加入到bootstrap validator中

    <div class="form-group"><label for="" class="col-md-1 control-label">項目詳情</label><div class="col-md-10"><div class="summernote" name="description" data-bv-excluded="false" data-bv-notempty placeholder="請對項目進行詳細的描述,使更多的人了解你的云夢"action="${ctx}/file">${deal.description}</div></div> </div>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 注意data-bv-excluded=”false”(由于summernote使用了div作為form表單的呈現形式,非一般的input標簽,所以此處要將該name=”description”的field標識為非excluded,默認的validator是不對“[‘:disabled’, ‘:hidden’, ‘:not(:visible)’]”三種標簽做處理的,而summernote會默認作為disabled的一種,那么設置上data-bv-excluded=”false” 后,validator將會對summernote做非空的判斷)、data-bv-notempty屬性。
  • 當然有了上述兩個屬性后,并不能保證validator的有效性,那么接下來,請繼續看。
  • onChange : function(contents, $editable) {if ($this.parents().length > 0) {var $form = $this.parents().find("form.required-validate", $p);if ($form.length > 0) {var data = $form.data('bootstrapValidator');YUNM.debug($this.summernote('isEmpty'));if ($this.summernote('isEmpty')) {data.updateStatus($this.attr("name"), 'INVALID');} else {data.updateStatus($this.attr("name"), 'VALID');}}}}, onInit : function() {if ($this.parents().length > 0) {var $form = $this.parents().find("form.required-validate", $p);if ($form.length > 0) {var data = $form.data('bootstrapValidator');if (!$this.summernote('isEmpty')) {data.updateStatus($this.attr("name"), 'VALID');}}} },
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在summernote的callbacks中加入onChange 、onInit,當文本域發生變化、初始化時,對summernote在form中的驗證字段進行狀態的更新,validator中使用updateStatus方法。

    /*** Update all validating results of field** @param {String|jQuery} field The field name or field element* @param {String} status The status. Can be 'NOT_VALIDATED', 'VALIDATING', 'INVALID' or 'VALID'* @param {String} [validatorName] The validator name. If null, the method updates validity result for all validators* @returns {BootstrapValidator}*/updateStatus: function(field, status, validatorName) { OK,等補上以上兩個內容后,整個summernote就完整了。

    總結

    以上是生活随笔為你收集整理的Bootstrap 可视化编辑器summernote的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久这里精品视频 | 精品免费国产一区二区三区四区 | 色欲综合视频天天天 | 亚洲视频免费在线观看 | 91精品国产99久久久久久久 | 国产精品国产三级国产专区53 | 在线观看日韩免费视频 | 成人久久免费 | 久久精品1区2区 | 91精品在线观看入口 | 中文字幕国产一区 | 色妞色视频一区二区三区四区 | 国产精品不卡在线播放 | 91av视频在线播放 | 国产一级免费观看 | 国产精品自产拍在线观看中文 | 国产成人久久久久 | 成年人在线观看免费视频 | 亚洲精品乱码久久久久久高潮 | 日韩二区在线 | 国产高清一区二区 | 久久国内免费视频 | 国产视频每日更新 | 国内精品久久久久久久久久久 | 国产免费视频一区二区裸体 | 亚洲欧洲国产日韩精品 | 91久久人澡人人添人人爽欧美 | 97干com| 国产又粗又猛又黄又爽 | 色的网站在线观看 | 91精品视频一区二区三区 | 国色天香在线 | 日本中文字幕在线一区 | 久久精品高清 | 国产成人一区二区三区在线观看 | 国产免费成人 | 99色网站 | 中文字幕在线中文 | 日韩av电影网站在线观看 | 天天做天天射 | 国产一区二区不卡视频 | 亚洲涩涩涩 | 91在线一区 | 天天操夜夜操 | 午夜精品一区二区三区四区 | 在线播放日韩 | 国产一二区在线观看 | 狠狠操操操 | 久久亚洲区 | 欧美 日韩 国产 中文字幕 | 国产免费久久久久 | 日本免费久久高清视频 | 免费日韩电影 | 99精品在线免费 | 国产电影一区二区三区四区 | 久久精品国产成人精品 | 国产成人61精品免费看片 | 免费久久精品视频 | 久久av福利 | 国产1区在线 | 免费亚洲视频在线观看 | 大胆欧美gogo免费视频一二区 | 中文字幕在线国产精品 | 中文字幕av全部资源www中文字幕在线观看 | 日韩免费视频播放 | 精品美女久久久久久免费 | 国产精品久久久久9999吃药 | 久久久男人的天堂 | 国产日产精品一区二区三区四区 | 亚洲一区美女视频在线观看免费 | 91人网站| 黄色大片日本免费大片 | 日韩精品视频网站 | 国产视频精品视频 | 欧美日韩高清 | 中文字幕区 | 欧美日韩午夜在线 | 91成人在线观看高潮 | 免费观看av网站 | 欧美国产视频在线 | 五月天伊人网 | 免费在线观看av不卡 | 久久成视频| 999成人| 99久久精品久久久久久动态片 | 国产中文字幕三区 | 成人免费视频播放 | 婷婷色 亚洲| 黄色av大片 | 人人添人人澡人人澡人人人爽 | 81国产精品久久久久久久久久 | 99热精品在线观看 | av观看在线观看 | 日韩欧美高清不卡 | 黄a在线观看 | 中文字幕久久亚洲 | 国产精品igao视频网入口 | 久久久国产精品电影 | 婷婷丁香六月天 | 国产精品一级在线 | 日韩黄色在线电影 | 久久伦理视频 | 91精品影视 | 久久不卡免费视频 | 国产美女免费观看 | 麻花豆传媒一二三产区 | 中文字幕a在线 | 国产激情久久久 | 九九热在线免费观看 | 97在线免费观看 | 欧美一区二区三区在线视频观看 | 天天艹天天干天天 | 伊人伊成久久人综合网站 | 久久综合色播五月 | 国产成人精品国内自产拍免费看 | 中文字幕亚洲五码 | 在线观看视频福利 | 国产成人精品一区二区三区 | 91精品国产成人观看 | 在线观看av麻豆 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 色视频在线免费 | 九九视频这里只有精品 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 免费看一及片 | 日韩高清在线看 | 国产免费久久久久 | 成人免费在线视频观看 | 毛片网站免费在线观看 | 亚洲成人精品在线 | 成人av网站在线播放 | 在线免费观看黄色 | 亚洲中字幕 | 麻豆精品在线 | 91麻豆看国产在线紧急地址 | 91毛片视频| 国产资源| 午夜精品一区二区三区免费视频 | 日韩成人在线免费观看 | 五月天婷婷丁香花 | 久草在线视频网站 | 91网在线看| 中文字幕欧美日韩va免费视频 | 国产九九热视频 | 一区二区中文字幕在线 | 国产精品美女在线 | 精品久久免费看 | 国产视频欧美视频 | 久久精品aaa | av在线播放中文字幕 | 日韩免费在线视频观看 | 黄色一级网 | 亚洲综合日韩在线 | 国产精品麻豆三级一区视频 | 日韩伦理片hd | 亚洲成人高清在线 | 国内外成人在线 | 国产精品一级在线 | 成人免费毛片aaaaaa片 | 中文字幕首页 | 成人三级黄色 | 免费一级片观看 | 国产精品久久久久久久99 | 国产亚洲欧美在线视频 | 91在线视频在线观看 | 亚洲精品在线观看的 | 欧美久久99 | 在线看成人 | 一级黄色视屏 | 97超碰中文字幕 | 日本成人黄色片 | 亚洲国产欧美一区二区三区丁香婷 | 欧美日韩在线免费观看 | 国产精品乱码在线 | 久久久久久久久久久影院 | 奇米四色影狠狠爱7777 | 久久久91精品国产 | 中文字幕一区二区三区四区 | 国产麻豆果冻传媒在线观看 | 美女精品在线观看 | 成人一级免费视频 | 麻豆传媒视频在线免费观看 | 亚洲成a人片综合在线 | 天堂av观看 | 国产在线一区二区 | 中文字幕免费看 | 伊人婷婷在线 | 亚洲欧美国产精品久久久久 | 欧美精品久久久久久久亚洲调教 | 精品国产自在精品国产精野外直播 | 婷婷国产精品 | 精品久久综合 | 精品视频免费久久久看 | 久久精品系列 | 日批视频国产 | 午夜国产一区二区三区四区 | 中文字幕在线不卡国产视频 | 久久视频二区 | www.久草视频| 国产精品99免费看 | 在线电影 一区 | 狠狠躁日日躁 | 香蕉视频网址 | 国产精品去看片 | 玖草在线观看 | 狠狠色免费| 国产日韩高清在线 | 久久久久一区二区三区四区 | 天天色天天上天天操 | 欧美性护士 | 成人黄色电影视频 | 欧美巨大 | 精品国产一区二区三区久久影院 | 香蕉久久久久久久 | 国产日韩在线播放 | 久久草在线精品 | 久久9999久久 | 黄色大全视频 | 久久在线视频在线 | 久草免费在线视频 | 亚洲国产精品成人女人久久 | 91麻豆精品一区二区三区 | 国产日韩欧美中文 | 久久99精品久久只有精品 | 黄色成人在线网站 | 天堂av在线免费 | 亚洲美女精品视频 | 中文字幕一区三区 | 超碰日韩 | 超碰97免费在线 | 午夜少妇av| 一区二区三区手机在线观看 | 91av蜜桃| 精品亚洲网 | 国产精品激情在线观看 | 开心综合网 | 97人人模人人爽人人喊中文字 | 色婷婷久久久综合中文字幕 | 久久一久久 | 2019中文字幕第一页 | 久久综合影院 | 黄色成人av网址 | 成人精品视频久久久久 | 久久免视频| 免费av免费观看 | 日韩精品一区二区免费视频 | 久av在线| 日韩毛片在线播放 | 国产高清视频网 | 日韩在线观看影院 | 久草在线视频新 | 91亚瑟视频 | 久久久这里有精品 | 欧美久久久久久久久久 | 日韩一区二区三区在线观看 | 国产视频一区二区三区在线 | 在线不卡中文字幕播放 | 午夜精品久久久久久久久久久久久久 | 天堂在线成人 | 欧美色综合天天久久综合精品 | 亚洲精品字幕 | 国产精品一区二区果冻传媒 | 精品国产免费人成在线观看 | 色婷婷狠狠五月综合天色拍 | 激情久久一区二区三区 | 欧美老人xxxx18 | 成人免费av电影 | 亚洲欧洲在线视频 | 91传媒视频在线观看 | 黄色软件视频大全免费下载 | 久久99久久99久久 | 亚洲情感电影大片 | 91在线看片 | 久久福利 | 免费av网址在线观看 | 麻豆免费视频 | 久久一区二区三区日韩 | 欧美日韩不卡在线观看 | 韩国视频一区二区三区 | 欧美a级在线 | 热久久免费国产视频 | 狠狠色丁香婷婷综合 | 久久综合婷婷国产二区高清 | 国产精品国产自产拍高清av | 中文字幕 91 | 99久久一区| 精品一区二区三区久久 | 国产色网站| 最新日韩在线观看视频 | 国产中文字幕在线免费观看 | 日韩电影在线观看一区二区 | 久久综合网色—综合色88 | 又色又爽的网站 | 国产精品专区在线 | 99久久久成人国产精品 | 黄色免费网站下载 | aaa亚洲精品一二三区 | av免费在线网站 | 草久视频在线 | 在线精品在线 | 国产99久久精品一区二区永久免费 | 久久永久视频 | 韩国精品视频在线观看 | 欧美色图另类 | 婷婷综合久久 | 999久久精品| 91视频最新网址 | 激情开心网站 | 国产精品自拍在线 | 国产字幕av | 亚洲www天堂com | 国产精品久久久久久久久久白浆 | 91精品爽啪蜜夜国产在线播放 | 日韩av成人在线 | 国产视频久久久久 | 日日干日日色 | 日韩午夜高清 | 国产精品久久久毛片 | 毛片美女网站 | 日韩免费观看视频 | 97电影网站| 操操操操网 | 丁香在线观看完整电影视频 | 99国产精品久久久久老师 | 中文字幕免 | 久久九九影视 | www免费| 日韩1页 | 亚洲激情综合网 | 国产精品男女啪啪 | 久久不射网站 | 久久久精品国产一区二区 | 正在播放国产精品 | 国产在线视频不卡 | 最近日韩免费视频 | 在线国产视频观看 | 久久免费视屏 | 午夜视频99 | 欧美午夜精品久久久久久浪潮 | 婷婷丁香综合 | 麻豆国产视频下载 | 久久久精品欧美 | 麻豆视频在线播放 | 久久久精品成人 | 香蕉久久久久久av成人 | 西西444www | 久久久久国产成人免费精品免费 | 五月婷婷六月丁香在线观看 | 国产精品久久久久久久久久久久午 | 日日夜夜天天操 | 日韩精品免费一区二区在线观看 | 99成人精品 | 久久国际影院 | 欧美亚洲国产一卡 | www99精品| 久久99在线视频 | av免费在线观看网站 | 国产精品黄色影片导航在线观看 | 国产综合久久 | 韩日精品视频 | 国产最顶级的黄色片在线免费观看 | 成人精品国产免费网站 | 久久综合九色综合欧美就去吻 | 久久成人国产精品 | 伊人色综合久久天天网 | 国产三级午夜理伦三级 | 久久在线精品 | 亚洲自拍偷拍色图 | 亚洲黄色在线 | 国产精品免费视频一区二区 | 日韩精品一区二区三区免费观看 | 玖草在线观看 | 97免费| 成人av在线看 | 九九热免费在线观看 | 亚洲免费在线播放视频 | 国产区 在线 | 视频一区亚洲 | 97福利视频 | 日韩中文字幕免费在线播放 | 天天插天天干 | 日韩| 在线有码中文字幕 | 日韩特黄一级欧美毛片特黄 | www.久久久.cum | 成人国产电影在线观看 | 久久精精品 | 在线观看色视频 | 色在线最新 | 成人污视频在线观看 | 国产精品毛片一区 | 国产男女无遮挡猛进猛出在线观看 | 4438全国亚洲精品观看视频 | 久久国产三级 | 91自拍视频在线观看 | 日韩专区在线 | 少妇性xxx| 黄污污网站 | 人人添人人澡人人澡人人人爽 | 996久久国产精品线观看 | 97精品国产97久久久久久粉红 | 久久精品一区二区 | 黄色99视频 | 99免费在线观看 | 干av在线 | 在线观看黄网站 | 岛国av在线不卡 | 在线免费观看视频一区 | 久久免费看 | 伊人网综合在线观看 | 亚洲成a人片在线观看网站口工 | 久久免费视频在线观看6 | 国产中文在线字幕 | 亚洲精品视频网站在线观看 | 日韩有码中文字幕在线 | 免费毛片aaaaaa | 午夜私人影院 | 91大片成人网 | 久久99视频精品 | 91视频中文字幕 | 麻花天美星空视频 | 伊人狠狠色 | 欧美一区二区三区在线 | 999精品在线 | 国产日本亚洲 | 欧美一级专区免费大片 | 日韩美一区二区三区 | 黄色毛片视频免费 | 午夜日b视频 | 激情av资源网| a在线免费 | 久草在线最新 | 激情视频一区 | 国产福利一区在线观看 | 精品成人a区在线观看 | 三级黄色网址 | 亚洲成人资源网 | 日本黄色特级片 | av黄网站 | 亚洲精品视频偷拍 | 国产精品久久久久久一二三四五 | 91资源在线观看 | 色丁香久久 | 午夜精品婷婷 | 国产精品热视频 | 亚洲人毛片 | 亚洲精品影视在线观看 | 午夜视频在线观看一区二区三区 | 国产精品毛片一区视频播 | 中文字幕色站 | 亚洲成a人片77777潘金莲 | 国产精品11 | 色欧美综合 | 午夜视频一区二区 | 色婷婷综合久久久久中文字幕1 | 91精品国产高清自在线观看 | 一区二区三区免费看 | 国产一区二区不卡在线 | 亚洲免费av电影 | 午夜.dj高清免费观看视频 | 操操操日日 | 九七在线视频 | 免费国产在线精品 | 久久成人18免费网站 | 亚洲精品综合久久 | 久久在线影院 | 国产精品乱码久久久久久1区2区 | 色网av| 亚洲精品综合欧美二区变态 | 黄色软件在线观看免费 | 午夜三级在线 | 亚洲精品久久久久中文字幕二区 | 在线精品观看国产 | 黄色一级免费电影 | 欧美一级片在线观看视频 | 人人爽人人爽人人片av | 亚洲黄色在线免费观看 | av电影不卡| 国产精品白浆 | 国产在线小视频 | av一级在线 | 一区二区三区高清在线观看 | 99视频播放 | 日本黄色免费看 | 亚洲精品毛片一级91精品 | 亚洲黄色一级大片 | 成人午夜精品久久久久久久3d | 婷婷国产v亚洲v欧美久久 | 天天操天天干天天爽 | 亚洲国内精品视频 | 永久免费精品视频网站 | 国产精品久久久久久久久免费 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 日韩精品一区二区三区高清免费 | 丁香网五月天 | 91麻豆精品国产自产在线 | 国产精品视频区 | 国产麻豆视频免费观看 | 超碰国产在线观看 | 日韩免费高清 | 亚洲国产高清视频 | 天天摸天天干天天操天天射 | 中文字幕乱码电影 | 丝袜+亚洲+另类+欧美+变态 | 日韩高清无线码2023 | 国产一区二区在线精品 | 欧美日韩精品网站 | 美女视频黄免费网站 | 欧美专区国产专区 | 亚洲aⅴ一区二区三区 | 国产字幕av | 久久久国产精华液 | 国产成人a亚洲精品 | 成人a大片| 岛国av在线 | 五月婷婷另类国产 | 亚洲在线视频播放 | 麻豆视频在线免费看 | 国产日韩欧美在线一区 | 久久综合色影院 | 国产精品福利午夜在线观看 | 国产精品一区二区免费 | 波多野结衣视频一区 | 97超碰人人干 | 在线免费观看黄网站 | 中文不卡视频 | 欧美一二三区在线观看 | 亚洲va欧洲va国产va不卡 | 久久在线免费观看视频 | 天天操天天操天天干 | 免费在线观看黄 | 国产激情电影综合在线看 | 亚洲一级特黄 | 国产精品中文字幕在线播放 | 色婷婷综合成人av | 超级碰碰视频 | 超级碰99 | 久久久国产精品网站 | 国产精品99免视看9 国产精品毛片一区视频 | 日韩欧美黄色网址 | 国产中文字幕三区 | 日韩在线视频观看 | 在线超碰av | 午夜婷婷综合 | 亚洲一二三久久 | 亚洲精品免费看 | 人人爽久久久噜噜噜电影 | 国产精品久久久久高潮 | 国产色在线 | 97综合在线 | 欧美大片在线看免费观看 | 丰满少妇在线观看资源站 | 国产亚洲免费观看 | 欧美成人基地 | 免费视频99 | 中文 一区二区 | 中文字幕在线看 | 一区二区欧美在线观看 | 久久成人在线 | 日韩免费视频在线观看 | 免费在线观看污网站 | 日韩欧美精选 | 波多野结衣动态图 | 国产日韩欧美在线观看视频 | 日韩视频一 | 国产一区二区三区久久久 | 色资源网在线观看 | 91精品国产麻豆 | 久久有精品 | 天堂在线一区二区 | 久久久久99精品国产片 | 国产精品久久久久免费 | 日韩精品视频在线免费观看 | 天天草天天爽 | 中文字幕国产在线 | 国产日韩欧美自拍 | 久久无码av一区二区三区电影网 | 嫩草伊人久久精品少妇av | 日韩精品久久久久久久电影99爱 | 超碰人人av | 三级大片网站 | 夜夜摸夜夜爽 | 手机av观看 | 亚洲女人av | 国内精品久久久久影院男同志 | 成人精品一区二区三区电影免费 | 有码一区二区三区 | 亚洲年轻女教师毛茸茸 | 国产精品成人一区二区三区吃奶 | 伊人影院99 | 蜜臀精品久久久久久蜜臀 | 精品在线免费视频 | 久久久久免费视频 | 亚洲精品国产电影 | 九九热99视频 | 在线看国产日韩 | 99久久精品视频免费 | 91你懂的 | 黄色av成人在线观看 | 久久久久久久影院 | 99久久久国产精品 | 婷婷色狠狠 | 999成人 | 欧美爽爽爽 | 综合网中文字幕 | 中文字幕中文中文字幕 | 国产欧美日韩精品一区二区免费 | 欧美激情第十页 | 九九久久久久久久久激情 | 欧美日韩午夜爽爽 | 久久艹影院 | 成人av免费在线观看 | 亚洲另类视频在线观看 | 激情欧美丁香 | 亚洲精品国产精品久久99热 | 麻豆国产视频下载 | 国产精品手机在线观看 | 午夜999| 日韩久久精品一区 | 手机看片中文字幕 | 国内偷拍精品视频 | 免费黄色网址大全 | 天堂av在线| 国内精品久久久久久久久久久 | 国产视频18 | 亚洲国产精品久久久久 | 黄色软件网站在线观看 | 中文字幕在线观看一区二区 | 色a4yy| 亚洲精品国偷自产在线99热 | 久久久国产精品电影 | 91精品福利在线 | 婷婷在线综合 | 日日骑 | av色综合| 亚洲午夜久久久久久久久久久 | 91免费观看国产 | 欧美激情精品久久 | 国产精品久久久久av福利动漫 | 亚洲成年片 | 日日噜噜噜噜夜夜爽亚洲精品 | 精品国产乱码一区二区三区在线 | 成年人在线观看 | 成人久久18免费网站麻豆 | 国产成人免费av电影 | 99re国产| 夜添久久精品亚洲国产精品 | 国产剧情在线一区 | av免费观看在线 | 国产不卡在线看 | 在线观看成年人 | 亚a在线 | 久久精品视频国产 | 国产第一二区 | 国产高清久久久 | 日韩一区二区三区在线看 | 激情大尺度视频 | 四虎永久网站 | 麻豆精品在线视频 | www天天操 | 2017狠狠干 | 最新av网址大全 | 亚洲 欧美 综合 在线 精品 | 精品久久国产一区 | 狠狠狠狠狠狠天天爱 | 综合色站 | 最近中文字幕高清字幕免费mv | 日日夜夜爱 | 日本成人黄色片 | 国产va在线| 亚洲精品美女久久久久网站 | 韩国av不卡| 色婷婷激情| 国产一区二区三区 在线 | 亚洲精品久久久久久国 | 久久精品在线视频 | 亚洲国产人午在线一二区 | 青青网视频 | se视频网址| 国产真实在线 | 中文字幕a∨在线乱码免费看 | 日本韩国中文字幕 | 国产专区一 | 婷婷六月激情 | 中文字幕一区二区在线观看 | 在线日本看片免费人成视久网 | 美国av片在线观看 | 91精品夜夜| 国产一区视频在线播放 | 在线观看黄色小视频 | 久久这里只有精品视频99 | 四虎在线观看视频 | 久久精品视频在线 | 69国产盗摄一区二区三区五区 | 国产亚洲激情视频在线 | 日日日日| 久久免费精彩视频 | 国产婷婷色| 免费在线观看成人小视频 | 五月婷丁香网 | 曰韩在线 | 日韩激情免费视频 | 国产一区二区三精品久久久无广告 | 久久久久久久久久久影院 | 国产一区二区电影在线观看 | 国产精品日韩在线观看 | 国产大片黄色 | 中文国产成人精品久久一 | 亚洲片在线资源 | 中文字幕亚洲字幕 | 免费一级特黄录像 | 亚洲一区天堂 | 亚洲精品美女在线观看 | 久久久精品 一区二区三区 国产99视频在线观看 | 一区二区三区视频在线 | 深爱激情婷婷网 | 高清中文字幕av | 亚洲成人午夜av | 国产成人精品免高潮在线观看 | 成人在线视频论坛 | a√资源在线 | 91在线视频观看 | 超碰免费观看 | 亚洲精品国偷自产在线91正片 | 久久这里只有精品首页 | av黄色在线观看 | 亚洲成人av在线播放 | 久草在线最新视频 | 久久国产精品免费一区 | 看国产黄色片 | 国产精品网站一区二区三区 | 五月天伊人网 | 成人av地址 | 免费看黄的 | 免费无遮挡动漫网站 | 天天操天天添 | 久久草草影视免费网 | 日韩欧美91| 国产黄色免费在线观看 | 日韩欧美综合精品 | 在线看一级片 | 日韩乱色精品一区二区 | 成人禁用看黄a在线 | 国产打女人屁股调教97 | 久久毛片网站 | 久久影视精品 | 香蕉久久久久久久 | 国产免费观看高清完整版 | 四虎影院在线观看av | 成人毛片在线观看视频 | 久久男人影院 | 国产精品不卡视频 | 国产91成人在在线播放 | 久久久精品99 | 国产人成看黄久久久久久久久 | 国产国产人免费人成免费视频 | 欧美性生活免费看 | 在线国产福利 | 黄色av一区 | 久久三级毛片 | 91精品国自产在线 | 亚洲精品美女 | 国产成人在线观看免费 | 久久久精品一区二区三区 | 国产色婷婷精品综合在线手机播放 | 伊人宗合网 | 婷婷丁香综合 | 亚洲日本va午夜在线电影 | 久久免费a | 国产成人一二三 | 天堂网在线视频 | 国产理伦在线 | 91av成人| 在线免费av电影 | 欧美日韩精品久久久 | 国产精品久久久毛片 | 免费试看一区 | 一区二区三区日韩精品 | 国产精品日韩在线播放 | 日韩欧美xxxx | 人人超碰人人 | 亚洲每日更新 | 国产精品免费久久久 | 亚洲砖区区免费 | 日韩理论在线 | 久久精品国产亚洲 | 久久国产精品免费视频 | 亚洲视频h | 成人小视频在线观看免费 | 99国内精品久久久久久久 | 五月天.com| 91污污视频在线观看 | 日韩精品电影在线播放 | 在线国产日韩 | 成人午夜电影在线 | 波多野结依在线观看 | 97国产精品 | 午夜精品久久久久久久99水蜜桃 | 久久精品免费播放 | 91 在线视频 | 久久人人97超碰精品888 | 91av电影在线观看 | 久久精品成人热国产成 | 中文字幕在线播放一区 | 久久久久免费精品视频 | 日韩一级片网址 | 欧美在线一级片 | 99热播精品 | 亚洲一级久久 | 99视频精品免费观看, | 国产人成在线视频 | 日韩免费av网址 | 欧美激情精品久久久久久变态 | 亚洲精品乱码久久久久久按摩 | 色天天综合久久久久综合片 | 最新午夜 | 五月婷婷毛片 | 天天操天天色天天射 | 激情五月***国产精品 | 免费在线h| 91精品一区二区三区久久久久久 | 天天在线操 | 亚洲视频久久久久 | 天天操夜夜操 | 福利视频一区二区 | 久草精品视频 | 国产精品ssss在线亚洲 | 香蕉97视频观看在线观看 | 91福利视频久久久久 | 亚洲狠狠干| 久久夜色精品国产欧美乱 | 日韩精品一区电影 | 亚洲综合小说 | 天干啦夜天干天干在线线 | 成人午夜网址 | 色偷偷网站视频 | 日韩a级黄色片 | 亚洲视频1 | 一区二区三区高清在线观看 | 色偷偷88888欧美精品久久久 | 国产精品热视频 | 中文字幕在线观看完整版电影 | 国产1区2| 久久综合久久综合久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美日韩中文在线视频 | 欧美日韩中文视频 | 精品久久一区 | 男女免费视频观看 | 成人在线观看av | 国内精品久久久久影院优 | 成人欧美日韩国产 | 久久久久免费精品视频 | 色婷婷福利 | 综合国产在线 | 欧美一二在线 | 九九九九九九精品任你躁 | 成人电影毛片 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 国产最新视频在线观看 | 日本免费一二三区 | 麻花豆传媒mv在线观看 | 亚洲爱爱视频 | 五月天免费网站 | 在线影院av | 亚洲国产成人精品在线观看 | 丁香六月久久综合狠狠色 | 天天干天天碰 | 91成人免费视频 | 久久国产精品99精国产 | 亚洲91av| 91在线国内视频 | 中文字幕在线视频一区二区 | 日韩 | 国产一级在线免费观看 | 亚洲综合欧美激情 | www在线观看视频 | 西西4444www大胆艺术 | 天天射天天舔天天干 | 人人看人人草 | 国产精品成人自产拍在线观看 | 色丁香综合 | 超碰97网站 | 91亚洲精品久久久蜜桃 | 欧美日韩另类在线 | 国产精品欧美在线 | 亚洲永久av| 国产精品久久久久久av | 9ⅰ精品久久久久久久久中文字幕 | 午夜成人免费影院 | 色综合久久综合中文综合网 | av黄色亚洲 | 中文字幕日本特黄aa毛片 | 天堂av官网 | 天天夜操 | 亚洲一区精品人人爽人人躁 | 欧美一区二区三区在线 | 国产成人精品综合 | 日韩久久精品一区 | 亚洲精品久久久久58 | 97人人爽 | www.五月天激情 | 国产黄色精品在线观看 | 黄色av成人在线观看 | 91av欧美 | 成人久久综合 | av高清在线观看 | 中文字幕 成人 | 日韩免费一区二区在线观看 | 国产福利中文字幕 | 又黄又爽又湿又无遮挡的在线视频 | av在线专区| 2022中文字幕在线观看 | 久久伊99综合婷婷久久伊 | 亚洲视频99 | 亚洲国产精品电影 | 久久激情小说 | 久久精品女人毛片国产 | 色七七亚洲影院 | 国产精品一区二区av影院萌芽 | 黄色免费在线视频 | 亚洲黄色片| 国产精品一区在线观看你懂的 | 黄色高清视频在线观看 | 色99之美女主播在线视频 | 久久免费精品视频 | 免费成人av在线看 | 欧美激情综合五月 | 久久天天躁狠狠躁亚洲综合公司 | 国产成人久久精品一区二区三区 | 免费看日韩 | 国产视频一区二区在线观看 | 中日韩三级视频 | 久久成人亚洲欧美电影 | 久久久99久久 | 亚洲一区二区三区精品在线观看 | 免费看国产精品 | 久草精品网| 中文字幕在线国产精品 | 成人网看片 | 日韩一区二区三区在线看 | 亚洲精品www久久久 www国产精品com | 丁香婷婷色 | 中文字幕亚洲在线观看 | 国产成人亚洲在线观看 | 99久久精品免费看国产麻豆 | 国产黄影院色大全免费 | 欧洲一区二区在线观看 | 日韩精品一区二区不卡 | 狠狠操电影网 | 久艹在线播放 | 久久亚洲日本 | 日韩亚洲欧美中文字幕 | 日本精品一区二区 | 91丨porny丨九色 | 国产成人久久av | 狠狠色噜噜狠狠狠狠2021天天 | 久久一区精品 | 日韩国产欧美在线播放 | 深夜免费福利在线 | 日本中文乱码卡一卡二新区 | 天天操天天草 | 人人干人人上 | 四虎在线观看视频 | 日韩毛片在线播放 | 一区二区三区手机在线观看 | 视频一区二区精品 | 国内精品福利视频 | 国产综合婷婷 | 91久久精品一区 | 久久久久9999亚洲精品 | 91丨九色丨勾搭 | 在线观看国产区 | 波多野结衣电影一区二区三区 | 五月婷婷在线视频观看 | 五月婷婷色综合 | 欧美亚洲xxx | 精品1区2区 | 五月婷婷六月丁香 | 激情视频91 | 91免费版成人| 日韩欧美电影在线观看 | 成人a视频在线观看 | 国产精品97 | 黄色软件视频大全免费下载 | 免费精品久久久 | 一级黄色大片在线观看 | 黄av资源 | 欧美在线视频a | 99在线热播精品免费99热 | 国产精品久久婷婷六月丁香 | 午夜免费福利视频 | 国产视频一二三 | 久草网视频在线观看 | 久久人人精 | 六月丁香激情网 | 91精品国产99久久久久 | 91在线超碰|