.NET做品集:linux下的.net mvc cms

cms程序架構

本程序是主要是用於企業網站開發的,也能夠作博客程序,程序是從以前上一篇的.net 博客程序改進過來的,主要技術由webform轉成.net mvc了,因爲是很早以前的項目,12年仍是mvc3版本,固然仍是跑在linux下的。php

技術棧

  • .net framework 4.0
  • sqlite 數據庫
  • mono linux 運行環境以及mono下的sqlite庫
  • razor 模板引擎
  • dapper 輕量級orm框架
  • vs2017 社區版本

此次的開發工具比較新了吧,上次用vs2010發的,跨度比較大,這個項目以前也是在10下開發出來的,雖然用2017,其實沒什麼影響的。java

razor引擎比nvelocity的易用性高不少,並且跟後端集合的比較好。mysql

並且此次的項目徹底使用dapper orm,整個數據庫訪問層操做看起來也清爽不少了。linux

代碼結構

代碼結構
左側主要分爲三個文件夾,Jqpress.web是存放web路由入口、模板皮膚、靜態文件,上傳文件夾,後臺管理程序經過Areas域管理來實現的,整個項目結構仍是比較清晰的。nginx

路由設計

路由入口爲HomeController這個文件,包括首頁、產品列表,文章列表,文章內容等待,都是經過這個Controller來路由的,雖然功能比較多,可是代碼量不到300行,業務邏輯處理基本都在service層。git

以下爲一個列表界面的Action邏輯才20幾行github

public ActionResult Category(string pagename) 
        {
            var model = new PostListModel();
            CategoryInfo cate = _categoryService.GetCategory(pagename);
            model.Category = cate;
            if (cate != null)
            {
                int categoryId = cate.CategoryId;
                model.MetaKeywords = cate.CateName;
                model.MetaDescription = cate.Description;
                ViewBag.Title = cate.CateName;
                model.Url = ConfigHelper.SiteUrl + "category/" + Jqpress.Framework.Utils.StringHelper.SqlEncode(pagename) + "/page/{0}";

                const int pageSize = 10;
                int count = 0;
                int pageIndex = PressRequest.GetInt("page", 1);
                int cateid = PressRequest.GetQueryInt("cateid", -1);
                int tagid = PressRequest.GetQueryInt("tagid", -1);
                if (cateid > 0)
                    pageIndex = pageIndex + 1;
                var cateids =categoryId+","+ _categoryService.GetCategoryList().FindAll(c => c.ParentId == categoryId).Aggregate(string.Empty, (current, t) => current + (t.CategoryId + ",")).TrimEnd(',');
                var postlist = _postService.GetPostPageList(pageSize, pageIndex, out count, cateids.TrimEnd(','), tagid, -1, -1, -1, -1, -1,-1, "", "", "");
                model.PageList.LoadPagedList(postlist);
                model.PostList = (List<PostInfo>)postlist;
            }
            model.IsDefault = 0;
            

            return View(model.Category.ViewName,model);
        }

模板引擎設計

模板引擎採用razor,不一樣的cms風格模板以文件夾的形式存放在Themes文件夾下,經過後端設置能夠隨意切換模板(此功能還在完善當中)。web

數據存儲設計

做爲輕量級的cms,固然不會用mysql或者sqlserver,依然堅決的使用sqlite,以上是經過dapper進行數據庫操做,雖然沒有微軟增長的orm強大,可是可讀性和操控性都是很是好的。sql

由於要支持linux,因此sqlite的操做類須要using Mono.Data.Sqlite;
,固然能夠在windows下切換過來,上面我寫的切換方式太粗暴了,學過設計模式的同窗應該分分鐘可以重構出來,切換windows和linux簡直不要太方便。數據庫

數據庫結構

  • jq_category 分類及標籤表
  • jq_comments 評論表
  • jq_links 友鏈及導航設置
  • jq_posts 文章表
  • jq_sites 站點訪問統計數字及文章、分類、數量統計表
  • jq_users 帳戶表

數據庫結構跟以前的 博客程序沒差異,只是部分表結構字段有所差異

運行

vs2017調試模式預覽

cms首頁

後臺登陸,默認用戶名admin,密碼123456

後臺首頁

文章列表

文章編輯

linux下的部署方式

mono

mono
上圖爲我服務器上的mono安裝信息。

jexus

linux下須要安裝mono和jexus就能夠運行起來,mono做爲.net framework的linux運行環境,jexus做爲web服務器。

jexus配置,由於個人服務器上還有其餘語言的站點,因此沒有直接採用jexus對外服務。

nginx

nginx代理了jexus的81端口,此地方不是必選,可是Nginx做爲常規的代理軟件,能夠在服務器上跑.net、php、java等,各司其職,百花齊放。

bin文件夾說明


.net mvc3在 linux下的部署須要注意的是須要將項目下引用的dll都須要上傳到bin目錄下。而且還須要上傳Microsoft.web.Infrastructure.dll,這個是發佈mvc項目須要用的。能夠對比下我webform下的Linux博客程序站點bin下只要引入Mono和Nvelocity這2個第三方dll,其餘都是本身的業務程序,這個.net cms要的東西還挺多,下圖是個人博客站點下的bin文件夾內容。

linux服務器上的的.net 程序問題

  • jexus不支持中文,因此文件上傳的路徑必須重寫成字母加數字符號形式,
  • jexus web服務器是默認對大小寫敏感的,因此部署的時候必定要
    只須要把 jws這個腳本文件中的 「export MONO_IOMAP=...」這一句前邊的「#」去掉,就能夠不區分大小寫了

源碼獲取

https://github.com/robotbird/jqpress.cms

爲了防止部分同窗沒法訪問Github,因此放oschina的gitee上了

https://gitee.com/robotbird/jqpress.cms

後記

在開發這個cms的時候那時候.net core還沒誕生,做爲linux下的.net mvc項目還仍是比較新穎的,只惋惜沒能好好的寫代碼,跑去作項目作產品去了,在這裏開源出來緬懷寫代碼的歲月,若是對你們有用那最好不過了。 若是對源碼感興趣能夠聯繫qq:330296409

相關文章
相關標籤/搜索