基於Metronic的Bootstrap開發框架經驗總結(17)-- 使用 summernote插件實現HTML文檔的編輯和圖片插入操作

来源:http://www.cnblogs.com/wuhuacong/archive/2017/09/02/7466772.html
-Advertisement-
Play Games

在很多場合,我們需要線上編輯HTML內容,然後在頁面上或者其他終端上(如小程式、APP應用等)顯示,編輯HTML內容的插件有很多,本篇介紹基於Bootstrap的 summernote插件實現HTML文檔的編輯和圖片插入操作,這個控制項的使用非常方便,並且用戶群也很大。 ...


在很多場合,我們需要線上編輯HTML內容,然後在頁面上或者其他終端上(如小程式、APP應用等)顯示,編輯HTML內容的插件有很多,本篇介紹基於Bootstrap的 summernote插件實現HTML文檔的編輯和圖片插入操作,這個控制項的使用非常方便,並且用戶群也很大。

Summernote 是一個簡單靈活,所見即所得(WYSIWYG)的編輯器,Summernote是一個輕量級、靈活基於Bootstrap和jQuery的HTML文本編輯器,擁有強大的API配置功能,多國語言支持支持Bootstrap2.x和3.0,支持視頻和圖片上傳以及代碼的高亮顯示,多種
後臺語言版本示例以及多主體支持,在瀏覽器相容方面,支持IE9+以及現代的瀏覽器Chrome,Firefox,Safari等,在移動端應該有不錯的表現,還是很不錯的,值得使用。

該插件是開源的,官網地址:http://summernote.org/,GitHub地址:https://github.com/summernote/summernote/、安裝調整都很方便。

1、Summernote的簡單使用

使用方法: 1)、載入JS和CSS
<!-- include libraries(jQuery, bootstrap) -->
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css" rel="stylesheet">
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script> 
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.js"></script> 

<!-- include summernote css/js-->
<link href="http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.7/summernote.css" rel="stylesheet">
<script src="http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.7/summernote.js"></script>

基於MVC的Asp.net應用程式中,我們一般在BundleConfig.cs裡面初始化我們的引入JS文件,如下所示。

            //添加對bootstrap-summernote的支持
            css_metronic.Include("~/Content/metronic/assets/global/plugins/bootstrap-summernote/summernote.css");
            js_metronic.Include("~/Content/metronic/assets/global/plugins/bootstrap-summernote/summernote.min.js");
            js_metronic.Include("~/Content/metronic/assets/global/plugins/bootstrap-summernote/lang/summernote-zh-CN.min.js");
            bundles.Add(css_metronic);
            bundles.Add(js_metronic);

 

2)、編寫HTML內容

在HTML頁面代碼增加下麵的標記。

<div id="summernote">Hello Summernote</div>

 

3)、初始化調用

簡單的初始化代碼如下所示。

$(document).ready(function() {
  $('#summernote').summernote();
});

如果增加控制項高度的定義,則如下所示。

$('#summernote').summernote({
  height: 300,   
  focus: true    
});

而詳細的初始化界面,一般還包括語言國際化、圖片上傳等處理代碼,如下所示

function initEditor() {
    $('#Note').summernote({
        lang: 'zh-CN',       // default: 'en-US'
        height: 600,         // set editor height                
        minHeight: null,    // set minimum height of editor
        maxHeight: null,    // set maximum height of editor
        focus: true,         // set focus to editable area after initializing summe
        callbacks: {
            onImageUpload: function (files) { //the onImageUpload API  
                img = sendFile(files[0]);
            }
        }
    });
}

4)、獲取內容

var markupStr = $('#summernote').summernote('code');

 

5)、設置內容

設置內容和獲取內容類似,在code後面增加需要寫入的HTML內容即可。

var markupStr = 'hello world';
$('#summernote').summernote('code', markupStr);

 

2、 summernote插件在實際項目中的使用

上面介紹了常規 summernote插件的使用過程,一般情況下,我們使用它除了編輯HTML內容外,還需要對圖片上傳進行處理,以確保我們可以直接把文件上傳到後臺文件系統裡面去,而不是把它們轉換為Base64的編碼放在頁面內。

一般的初始化代碼如下所示。

        function initEditor() {
            $('#Note').summernote({
                lang: 'zh-CN',       // default: 'en-US'
                height: 600,         // set editor height                
                minHeight: null,    // set minimum height of editor
                maxHeight: null,    // set maximum height of editor
                focus: true,         // set focus to editable area after initializing summe
                callbacks: {
                    onImageUpload: function (files) { //the onImageUpload API  
                        img = sendFile(files[0]);
                    }
                }
            });
        }

其中的sendFile的函數如下所示,主要是調用附件管理模塊進行文件的存儲。

        //提交文件到伺服器處理
        function sendFile(file) {
            data = new FormData();
            data.append("file", file);
            //增加額外的參數
            data.append("folder", '商品信息');
            data.append("guid", $("#ID").val());

            $.ajax({
                data: data,
                type: "POST",
                url: "/FileUpload/Upload",
                cache: false,
                contentType: false,
                processData: false,
                success: function (json) {
                    var data = $.parseJSON(json);
                    var url = data.urls[0];
                    $("#Note").summernote('insertImage', url, 'image name'); // the insertImage API  
                }
            });
        }

一般來說,我們的文件為了在多個應用之間共用處理,一般建議以FTP方式進行處理,這方面可以參考隨筆《在附件管理模塊中增加對FTP 上傳和預覽的支持》,FTP上傳文件可以使用FluentFTP這個組件(GitHub地址:https://github.com/hgupta9/FluentFTP ),這個是一個應用很廣,功能很強大的FTP組件。

上傳附件到伺服器上的後臺控制器代碼如下所示,主要是構建文件信息,上傳後返回對應的URL,然後就可以在 summernote插件上顯示圖片了。

        /// <summary>
        /// 上傳附件到伺服器上
        /// </summary>
        /// <param name="fileData">附件信息</param>
        /// <param name="guid">附件組GUID</param>
        /// <param name="folder">指定的上傳目錄</param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Upload(string guid, string folder)
        {
            //如果需要修改欄位顯示,則參考下麵代碼處理
            dynamic obj = new ExpandoObject();
            List<string> urls = new List<string>();
            var result = new CommonResult();

            HttpFileCollectionBase files = HttpContext.Request.Files;
            if (files != null)
            {
                foreach (string key in files.Keys)
                {
                    try
                    {
                        #region MyRegion
                        HttpPostedFileBase fileData = files[key];
                        if (fileData != null)
                        {
                            HttpContext.Request.ContentEncoding = Encoding.GetEncoding("UTF-8");
                            HttpContext.Response.ContentEncoding = Encoding.GetEncoding("UTF-8");
                            HttpContext.Response.Charset = "UTF-8";

                            string fileName = Path.GetFileName(fileData.FileName);      //原始文件名稱
                            string fileExtension = Path.GetExtension(fileName);         //文件擴展名

                            FileUploadInfo info = new FileUploadInfo();
                            info.FileData = ReadFileBytes(fileData);
                            if (info.FileData != null)
                            {
                                info.FileSize = info.FileData.Length;
                            }
                            info.Category = folder;
                            info.FileName = fileName;
                            info.FileExtend = fileExtension;
                            info.AttachmentGUID = guid;

                            info.AddTime = DateTime.Now;
                            info.Editor = CurrentUser.Name;//登錄人
                            //info.Owner_ID = OwerId;//所屬主表記錄ID

                            result = BLLFactory<FileUpload>.Instance.Upload(info);
                            if (!result.Success)
                            {
                                LogTextHelper.Error("上傳文件失敗:" + result.ErrorMessage);
                            }
                            else
                            {
                                //返回具體路徑地址
                                string serverRealPath = info.BasePath.UriCombine(info.SavePath);
                                if (!Path.IsPathRooted(info.BasePath) &&
                                    !info.BasePath.StartsWith("http://") &&
                                    !info.BasePath.StartsWith("https://"))
                                {
                                    //如果是相對目錄,加上當前程式的目錄才能定位文件地址
                                    var url = HttpContext.Request.Url;
                                    var baseurl = url.AbsoluteUri.Replace(url.PathAndQuery, "");
                                    serverRealPath = baseurl.UriCombine(serverRealPath).Replace('\\', '/');
                                }
                                urls.Add(serverRealPath);
                            }
                        }
                        #endregion
                    }
                    catch (Exception ex)
                    {
                        result.ErrorMessage = ex.Message;
                        LogTextHelper.Error(ex);
                    }
                }
                obj.urls = urls;
            }
            else
            {
                result.ErrorMessage = "fileData對象為空";
            }

            var newResult = new { Success = result.Success, ErrorMessage = result.ErrorMessage, urls = urls };
            return ToJsonContent(newResult);
        }

界面效果如我在隨筆介紹的一樣《微信小程式結合後臺數據管理實現商品數據的動態展示、維護》。

案例對商品的詳細信息的富文本進行編輯,來進行圖片文字的編輯處理,如下界面所示。

當我們插入圖片的時候,彈出一個對話框界面,選擇文件上傳後返回URL顯示在SummerNote插件上。

 

上傳文件成功後,通過下麵的代碼插入一個圖片,如下代碼。

    $.ajax({
        data: data,
        type: "POST",
        url: "/FileUpload/Upload",
        cache: false,
        contentType: false,
        processData: false,
        success: function (json) {
            var data = $.parseJSON(json);
            var url = data.urls[0];
            $("#Note").summernote('insertImage', url, 'image name'); // the insertImage API  
        }
    });

 以上就是我在實際的Bootstrap框架項目中使用 summernote插件實現HTML文檔的編輯和圖片插入操作,整體性還是比較容易上手的,經驗供大家借鑒。

 其他相關隨筆可以參考閱讀下:

結合bootstrap fileinput插件和Bootstrap-table表格插件,實現文件上傳、預覽、提交的導入Excel數據操作流程

基於Metronic的Bootstrap開發框架經驗總結(16)-- 使用插件bootstrap-table實現表格記錄的查詢、分頁、排序等處理

基於Metronic的Bootstrap開發框架經驗總結(15)-- 更新使用Metronic 4.75版本

從開發框架提高開發效率說起 

基於Metronic的Bootstrap開發框架經驗總結(14)--條碼和二維碼的生成及列印處理

基於Metronic的Bootstrap開發框架經驗總結(13)--頁面鏈接收藏夾功能的實現2

基於Metronic的Bootstrap開發框架經驗總結(12)--頁面鏈接收藏夾功能的實現

基於Metronic的Bootstrap開發框架經驗總結(11)--頁面菜單的幾種呈現方式 

基於Metronic的Bootstrap開發框架經驗總結(10)--優化Bootstrap圖標管理 

在MVC控制器裡面使用dynamic和ExpandoObject,實現數據轉義的輸出

基於Metronic的Bootstrap開發框架經驗總結(9)--實現Web頁面內容的列印預覽和保存操作

基於Metronic的Bootstrap開發框架經驗總結(8)--框架功能總體界面介紹

基於Metronic的Bootstrap開發框架經驗總結(7)--數據的導入、導出及附件的查看處理 

基於Metronic的Bootstrap開發框架經驗總結(6)--對話框及提示框的處理和優化

基於Metronic的Bootstrap開發框架經驗總結(5)--Bootstrap文件上傳插件File Input的使用

基於Metronic的Bootstrap開發框架經驗總結(4)--Bootstrap圖標的提取和利用

基於Metronic的Bootstrap開發框架經驗總結(3)--下拉列表Select2插件的使用 

基於Metronic的Bootstrap開發框架經驗總結(2)--列表分頁處理和插件JSTree的使用

基於Metronic的Bootstrap開發框架經驗總結(1)-框架總覽及菜單模塊的處理 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習Linux,就算是像小編我這樣的小萌新,也知道OSI模型。什麼?!你不知道!!! 好吧,這篇秘籍拿走,不謝~~~ 一、兩個協議 (1)OSI 協議模型(7層)國際協議 PDU:協議數據單元對等層次之間傳遞的數據單位 OSI協議(7層) 國際協議 PDU 單位 功能 實例 7 應用層 applic ...
  • Socket():創建套接字 Bind():綁定套接字。將一個本地協議地址賦予一個套接字 Listen():監聽套接字 Connect():建立與伺服器之間的連接。 accept():接收連接, Send():發送函數 recv():接收函數 close():關閉連接 伺服器端順序: Socket( ...
  • 版本: 主機:Windows 7 64位旗艦版 虛擬機: VMWare 12 + Windows 7 64位旗艦版 VMWare pro 12 + Ubuntu16.04LTS 64位 註:由於VMWare 10 跟 Ubuntu 16.04LTS版本不相容,會出現VMWare Tools 安裝過程 ...
  • 在 ASP.NET 中,我們知道,它有一個面向切麵的請求管道,有19個主要的事件構成,能夠讓我們進行靈活的擴展。通常是在 web.config 中通過註冊 HttpModule 來實現對請求管道事件監聽,並通過 HttpHandler 進入到我們的應用程式中。而在 ASP.NET Core 中,對請 ...
  • 有時候,我們運營的公眾號,可能因為某些原因而需要更換公眾號,比如,公司被收購,公眾號轉讓等。 那原有公眾號的粉絲,我們自然也想讓其遷移到新的公眾號上,一般做法是通過微信自帶的粉絲轉移功能。 但流程也不少,還要交300元的審核費用。最要命的是,如果你的公眾號平臺提供了一些系統,那麼用戶在系統上的資料是 ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp這一節內容可能會用到的庫文件有 Measurement 和 TestCase,同樣在 Github 上可以找到。善用 Ctrl + F... ...
  • 平常經常用到虛擬機,每次從gho轉換為vmdk時都要輸入cmd代碼,覺得麻煩,自己動手做了個gho2vmdk轉換工具,集成ghost32.exe文件,可以一鍵轉換,省時省事。運行時會將ghost32.exe保存到Program FIles文件夾里,運行完自動刪除ghost32.exe。覺得還不錯,在 ...
  • 今天又到了搶火車票的時候,反正是每次搶票都是傻眼。於是寫個小工具幫助自己查詢火車票,如果有票的話給自己發個郵件提示購買。 一、準備工作 利用firebug等工具,我們可以獲取到當我們單擊查詢時調用的Get請求。 請求地址: https://kyfw.12306.cn/otn/leftTicket/q ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...