Extjs+SpringMVC原型—內容發布

在上篇文章所描述的基礎功能,本章采用MVC實現一個輕量的內容發布。

基本原理

文章發布的三要素如下圖所示:

  • 欄目——也稱網站頻道可以視為一個樹狀的網站內容逐層分類。一個欄目下包含很多文章,通常一個欄目下的文章采用相同的模版發布,以保持相同的展示形式和風格。
  • 文章——包括:題名、內容、作者等元數據的結構化內容。文章可以發布到一個或者多個欄目下。一篇文章綁定一個模版之后會形成一個唯一的URL。如果一篇文章綁定了多個模版,應當會形成多個URL。
  • 模版——負責內容的展示形式,綁定文章(本例中為數據庫表Article中的一條記錄),render出最終的頁面效果。


    內容發布三要素

Model:數據庫表及對應的Entity

  1. article表用于文章;
  2. tag表用于文章分類標簽;
  3. attach表用于上傳圖片或者附件;

View:管理界面提供結構化數據維護,模版實現內容展示

網站欄目的管理

  • 欄目信息非常適合用json樹描述,用json的好處是維護方便,而且可以直接提供給后臺界面用于發布欄目的多選。

  • 用戶選擇發布的欄目之后,直接以簡單的格式分隔存到一個文本字段即完成了文章發布,用戶體驗是不是夠簡單?

  • 當然如果業務要求對發布內容進行審查,默認的狀態可以是預覽,后期也可通過置頂設置調整文章在頻道首頁的位置。

  • 同時json定義也供后臺java邏輯解析,以獲得指定欄目對應的模版。


    網站欄目
  • 如果在該json中通過tpl指定了欄目模版,發布到該欄目的文章將使用指定模版,否則使用默認模版。

網站欄目json可指定欄目模版

模版

模版采用JSP EL或JSTL,只負責將傳入的model在頁面中進行展示,不含其他邏輯。
此處也曾猶豫是否引入模版組件,最終SpringSide作者的見解影響了我,模版引擎怎么說相對jsp來說也是小眾,
JSP完全勝任模版引擎任務,如果不考慮前端工程師的偏好,沒必要再引入其他模版引擎,增加程序員的麻煩和系統復雜度。
以下為模版中顯示文章相關圖片的代碼片段:

<c:forEach items="${robjs}" var="ro">
    <c:choose>
        <c:when test="${ro.suffix =='jpg' || ro.suffix =='png' || ro.suffix =='jpeg' }">
            <figure class="figure">
              ![](/fopen?fp=${ro.path})
              <figcaption style="text-align:center;color:rgb(153, 153, 153);">${ro.title}</figcaption>
            </figure>   
            <p><br></p>
            <p>${ro.content}</p>
        </c:when>
    </c:choose>
</c:forEach>

Controller:三個java類

  1. CMSController用于將發布生成的url 映射為模版+數據;
  2. SecNode.java用于加載json節點到后端;
  3. CMSService.java封裝具體的實現邏輯。

CMSController.java

采用SpringMVC的映射注解可以輕松將上述URL匹配到負責綁定模版和數據的處理邏輯。

    @RequestMapping(value = PATH_ARTICLE + "{id_tpl}", method = RequestMethod.GET)
    public String showDetailByTpl(@PathVariable("id_tpl") String id_tpl, Model model) {
        try {
            String[] prs = id_tpl.split("_");
            long id = Long.parseLong(prs[0]);
            Article obj = cmsService.getArticle(id);
            // TODO 檢查status 狀態, 只允許管理員預覽
            model.addAttribute("obj", obj);
            String tpl;
            if (prs.length == 1) {
                tpl = TPL_DEFAULT;
            } else {
                tpl = prs[1];
            }
            // 根據頻道綁定多個文章模版
            return "tpl" + PATH_ARTICLE + tpl;
        } catch (Exception e) {
            e.printStackTrace();
            return "error/404";
        }
    }

CMSService.java + SecNode.java 實現預覽

java中解析json文件,獲得指定欄目的文章模版。
基本思路如下:

  1. 定義與json節點對應的java類SecNode
  2. 利用ObjectMapper讀取json文件并解析為SecNode[]
  3. 遍歷SecNode[],建立欄目全路徑名稱對應的模版文件名,
    例如:用戶中心#辦理流程-> 1.jsp ; 政策法規->default.jsp
  4. 前臺Ajax請求主鍵值1的文章,發布對應的URL
  5. 后臺根據主鍵值從數據庫提取Article對象,得到其發布欄目為:政策法規;用戶中心#辦理流程 兩個欄目
  6. 根據欄目獲得對應的模版,如果欄目在json節點通過tpl定義了模版,則采用指定模版,否則沿用父節點模版。
  7. 根據模版和文章id 按URL定義規則拼接出URL數組,返回前端
  8. 前端拿到URL數組之后,采用tab窗口打開對應的兩個頁面預覽。

內容管理界面

支持點擊修改附件名
內容管理界面

發布結果

由于模版也符合decorators.xml 定義的layout規則,所以最終呈現的詳細頁包含了網站的header和footer。

發布結果(局部截圖)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,250評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,923評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,041評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,475評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,253評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,801評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,882評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,023評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,530評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,494評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,639評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,177評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,890評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,289評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,552評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,242評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,626評論 2 370

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,775評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,704評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,574評論 25 707
  • 基本概念 有限域(Finite Field) A finite field is a finite set on ...
    FlyingPenguin閱讀 8,499評論 0 1
  • 一個人想要別人的關注,你說他想要收獲的是什么呢?或許是認同感吧!
    穩重的呼吸閱讀 113評論 0 0