天天看點

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

部落格做到這裡 基本功能已經粗糙的完成了。注冊、登入、釋出、評論、部落格遷移該有的都有了。這段時間内,差不多都是一個功能一個星期。說是一個星期,其實就周末兩天而已。鬼還沒天亮 就起來折騰,一做就是兩天 不動。說實話,真心累。不過欣慰的是,基本功能都出來了

前言 

這次開發的部落客要功能或特點:

第一:可以相容各終端,特别是手機端。

第二:到時會用到大量html5,炫啊。

第三:導入部落格園的精華文章,并做分類。(不要封我)

第四:做個插件,任何網站上的技術文章都可以轉發收藏 到本部落格。

是以打算寫個系類:《一步步搭建自己的部落格》

  • 一步步開發自己的部落格  .NET版(1、頁面布局、blog遷移、資料加載)
  • 一步步開發自己的部落格  .NET版(2、評論功能)
  • 一步步開發自己的部落格  .NET版(3、注冊登入功能)
  • 一步步開發自己的部落格  .NET版(4、文章釋出功能)
  • 一步步開發自己的部落格  .NET版(5、搜尋功能)
  • 一步步開發自己的部落格  .NET版(6、手機端的相容)

示範位址:http://blog.haojima.net/      群内共享源碼:469075305 

部落格做到這裡 基本功能已經粗糙的完成了。注冊、登入、釋出、評論、部落格遷移該有的都有了。這段時間内,差不多都是一個功能一個星期。說是一個星期,其實就周末兩天而已。鬼還沒天亮 就起來折騰,一做就是兩天 不動。說實話,真心累。不過欣慰的是,基本功能都出來了。

今天記錄下 文章釋出功能的實作過程。

釋出,首先得有個富文本編輯器。其它的編輯器 我沒了解過。聽說 百度的還不錯,就 稍微的研究了下。

百度編輯器

 官網:http://ueditor.baidu.com/website/ 下載下傳位址:http://ueditor.baidu.com/website/download.html 

我這裡用的是 開發版 

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

使用到自己的項目裡面還是非常的簡單,不過這裡需要注意的幾點。以下是問題記錄。

1.問題:

首先 我用的.net 4.5,把UBuilder直接放項目裡面,運作報錯。沒細看報的什麼錯。

解決方法:我直接把 目錄net->Bin檔案夾   删了。(可能是版本問題)

2.問題:

我們從http://ueditor.baidu.com/website/umeditor.html 官網示範位址可以看到 有如下 API。

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

我們通過 getContent()獲得 UBuilder 裡的html内容 毫無問題。 通過setContent 加載内容時提示編輯器為空。

解決方法:當頁面加載完成時 指派。

//頁面加載完成時
    $(function () {
        var html = $(".hidden_data").val();
        // 自定義的編輯器配置項,此處定義的配置項将覆寫editor_config.js中的同名配置
        var editorOption = {       
            autoClearinitialContent: true,
            elementPathEnabled: true
        };
        var editor_a = new baidu.editor.ui.Editor(editorOption);
        editor_a.render('editor');
        editor_a.ready(function () {
            editor_a.setContent(html,false);  //指派給UEditor
        });
    });      

3.問題:

釋出後的代碼樣式  無高亮。

解決方法:頁面加載完成是 執行高亮插件。

$(function () {
        SyntaxHighlighter.highlight();
    });      

4.問題:

圖檔上傳顯示失敗。(原因是改變了路徑)

解決方法:目錄net->config.json 打開配置檔案。 "imageUrlPrefix": "/ueditor/net/", /* 圖檔通路路徑字首 */  改為UBuilder 放到項目的絕對路徑 如我的是放到了 檔案夾Plug下 "imageUrlPrefix": "/Plug/ueditor/net/", /* 圖檔通路路徑字首 */ 

5.問題:

這也不算問題,就是 我們不是專業的視訊網站,一般不允許傳視屏。

解決方法:可以配置 上傳檔案的 格式 和大小。

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器
一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

      基本上 我就做了這些處理。 這裡還有個存在的問題 :就是我們在UBuilder 裡面 複制過去的代碼 會自動給我去除div和樣式。是以,像我直接遷移的部落格園文章内容,如果用UBuilder 打開 在儲存的話  代碼就沒有了高亮 格式和亂了。(這點比較坑)。

标簽

我們在釋出文章的時候,經常是需要 标簽和分類的。所在 這裡最基本的功能  不能省。 

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

以圖為例。輸入标簽有兩種方式。第一:直接在文本框内輸入 以逗号 分割。第二種:勾選 複選框。

看似簡單的功能,其實不簡單。

首先 我們可以通過 勾選 複選框 來選擇 标簽,那麼 我們就可以通過 取消 複選框 來 删除 已經選好的标簽。那怎麼實作呢?

選中的時候,先判斷 文本框内的最好一個字元是不是 , 如果不是    我們在 選中的時候 先 添加 逗号 然後 累加 我們選中的 複選框額值。

取消選中的時候,我們先 用逗号 分割 文本框 内的字元串,然後 如果有 我們要取消的 标簽 則删除。

說了這麼大堆  其實代碼實作也不多。

//點選tag标簽時
function clik_tag(obj) {
    if ($(obj).is(":checked")) { //如果選中
        var texttag = $(".text_tag");
        if (texttag.val().length > 1 && texttag.val()[texttag.val().length - 1] != ",") {
            texttag.val(texttag.val() + ",");
        }
        var text_tag = texttag.val() + $(obj).val();
        texttag.val(text_tag + ",");
    }
    else { //如果取消選中
        var text_taglist = $(".text_tag").val().split(",");
        $(".text_tag").val("");
        text_taglist.forEach(function (value, index) {
            if ($(obj).val() != value && value)
                $(".text_tag").val($(".text_tag").val() + value + ",");
        });
    }
}      

這裡還僅僅隻是 前台頁面的顯示。  我們在背景也要判斷。 如果 這個标簽 已經存在 這直接查詢到 标簽id  如果不存在 先建立 标簽 然後去标簽id 和blog 關聯。

我們在前台 做點小的動作,分割 文本框内的所有标簽,如果存在 下面的 可選 标簽 則為舊的标簽 否則 是新的标簽。我們在傳入背景的時候 先進行下分類。這樣就免去了 我們在背景處理。(我的原則是,非安全性問題,能在前台處理 就在前台處理。)     

//選擇的标簽
var oldtag = "", newtag = "";
var text_taglist = $(".text_tag").val().split(",");

var chk_taglsit = new Array();
$(".chk_tag").each(function () {
    chk_taglsit[chk_taglsit.length] = $(this).val();
});

text_taglist.forEach(function (value, index) {
    if ($.inArray(value, chk_taglsit) >= 0) {
        oldtag += value + ",";
    }
    else {
        newtag += value + ",";
    }
});      

文章分類   

文章分類 我們就沒有做 标簽那麼靈活了。标簽  可以随意貼上去。但是 分類 一般都是先 固定好。就像 分類:我們都是中國人。标簽:我們是程式員 ,明天可能又是測試員 大後天又能是美工、、沒辦法 是以  貼标簽  就要靈活多了。

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

邏輯不複雜 操作當然也要簡單。不就 是修改個值嘛,幹嘛搞的那麼 複雜。有的   實作方式需要幾個頁面 跳來跳去的。 我的實作是 點選 修改 分類 直接變成 可編輯狀态。編輯完成後 光标點選任意地方 就可以修改完成。 這樣   是不是 友善多了。

首先,我們點選編輯的時候  用一個 input 的 text 控件 替換原來的 a标簽 ,并把值也傳過來。當 text 失去交點時   直接背景儲存。并還原 為 a 标簽狀态。

這裡 需要注意 重複點選 編輯 不能 讓 再次替換。需要判斷下。   

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器
一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器
//新增類型
function addnewtype(obj) {
    var strhtml = "<div class='newtype'><input type='text' class='text_newtype' onblur='newtype_onblur(this);'/></div>";
    var chi = $(obj).parents(".divtitle_chi");
    if (chi.find(".newtype").length <= 0) {
        chi.append(strhtml).find(".text_newtype").focus();
    }
}
function newtype_onblur(obj) {
    var value = $(obj).val();
    if (!value) {
        $(obj).parents(".newtype").remove();
        return;
    }
    $.post("@Url.RouteUrl("ControllerAction", new { controller = "Admin", action = "NewAddType" })",
        { "newtypename": value }, function (data) {
            if (ShowAjaxResult(data)) {

            }
        });
    var newhtml = "<a>" + value + "</a>";
    $(obj).parents(".newtype").removeClass("newtype").addClass("divtitle_chi").html(newhtml);
}

//修改 文章 類型
function edittype(obj) {
    $(obj).parents(".divtitle_chi").find(".text_newtype").unbind("blur");
    if (!$(obj).next().hasClass("newtype")) {
        var value = $(obj).next().html().trim();//取得 文章類型 名稱
        var typeid = $(obj).find(".hid_typeid").val();  //取得 文章類型id  onblur='edittype_onblur(this);'
        var strhtml = "<div style='float:left' class='newtype'><input type='text' class='text_newtype' value='" + value + "' keyvalue='" + value + "' keyid='" + typeid + "' /></div>";
        $(obj).next().css("display", "none"); // 隐藏原來顯示的文章類型
        $(obj).after(strhtml).next().find(".text_newtype").focus().bind("blur", function () {
            edittype_onblur($(obj).parents(".divtitle_chi").find(".text_newtype"));
        });  //把 修改的文本元素添加 并獲得焦點
    }
    else {
        edittype_onblur($(obj).after(strhtml).next().find(".text_newtype"));
    }
}
//滑鼠移到目标的上方
function editover(obj) {
    $(obj).parents(".divtitle_chi").find(".text_newtype").unbind("blur");
    //$(".testmess").html("unbind");
}
//滑鼠在目标的上方移動
function editmove(obj) {
    $(obj).parents(".divtitle_chi").find(".text_newtype").unbind("blur");
}
//滑鼠移出目标的上方
function editout(obj) {
    //$(".testmess").html("bind");
    $(obj).parents(".divtitle_chi").find(".text_newtype").unbind("blur");
    $(obj).parents(".divtitle_chi").find(".text_newtype").bind("blur", function () {
        // $(".testmess").html("bind");
        edittype_onblur($(obj).parents(".divtitle_chi").find(".text_newtype"));
    });
}

function edittype_onblur(obj) {
    var value = $(obj).val().trim(); //新的文章類型
    var typeid = $(obj).attr("keyid").trim();//類型ID
    var oldvalue = $(obj).attr("keyvalue").trim();//舊的文章類型
    if (!value || !typeid || value == oldvalue) { //1.如果值為空 2.如果類型id為空 3.如果沒有修改 則直接傳回
        $(obj).parents(".newtype").next().css("display", "");
        $(obj).parents(".newtype").remove();
        return;
    }
    $.post("@Url.RouteUrl("ControllerAction", new { controller = "Admin", action = "EditType" })",
    { "typename": value, "typeid": typeid }, function (data) {
        if (ShowAjaxResult(data)) {
            $(obj).parents(".newtype").next().remove();
            var newhtml = "<a>" + value + "</a>";
            var newtype = $(obj).parents(".newtype")
            newtype.after(newhtml);
            newtype.remove();
        }
        else {
            $(obj).parents(".newtype").next().css("display", "");
            $(obj).parents(".newtype").remove();
        }
    });      

View Code

最後看看效果圖:

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

總結

關于釋出,其實要說的東西也不多。無非就是 用個富文本編輯器   編寫好内容   然後 更新到資料庫。然後 在更新的 時候  需要填寫 标簽  和 選擇分類。

這裡還有一點 需要主要。asp.net 預設  是不允許 送出 标簽文本到伺服器的。是以  我們這裡  需要關閉 預設的 安全 驗證。

1.背景 通路的 action 方法上  打上   [ValidateInput(false)] 的特性标簽。

2.在配置檔案 配置(我用的是MVC是4.0 貌似必須要在配置檔案配置)

<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >               

示範位址:http://blog.haojima.net/Admin/Release/7  (需要登入狀态 才能釋出)

如果您對本篇文章感興趣,那就麻煩您點個贊,您的鼓勵将是我的動力。 當然您還可以加入QQ群:

一步步開發自己的部落格 .NET版(4、文章釋出功能)百度編輯器

讨論。

如果您有更好的處理方式,希望不要吝啬賜教。

一步步開發自己的部落格 .NET版系列:http://www.cnblogs.com/zhaopei/tag/Hi-Blogs/

本文連結:http://www.cnblogs.com/zhaopei/p/4783814.html

開源位址:http://git.oschina.net/zhaopeiym/Hi-Blogs

  • 學習本是一個不斷抄襲、模仿、練習、創新的過程。
  • 雖然,園中已有本人無法超越的同主題博文,為什麼還是要寫。
  • 對于自己,博文隻是總結。在總結的過程發現問題,解決問題。
  • 對于他人,在此過程如果還能附帶幫助他人,那就再好不過了。
  • 由于部落客能力有限,文中可能存在描述不正确,歡迎指正、補充!
  • 感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。
  • 工控物聯Q群:995475200

繼續閱讀