cms程式架構
本程式是主要是用於企業網站開發的,也可以做部落格程式,程式是從之前上一篇的.net 部落格程式改進過來的,主要技術由webform轉成.net mvc了,由於是很早之前的專案,12年還是mvc3版本,當然還是跑在linux下的。
技術棧
- .net framework 4.0
- sqlite 資料庫
- mono linux 執行環境以及mono下的sqlite庫
- razor 模板引擎
- dapper 輕量級orm框架
- vs2017 社群版本
這次的開發工具比較新了吧,上次用vs2010發的,跨度比較大,這個專案之前也是在10下開發出來的,雖然用2017,其實沒什麼影響的。
razor引擎比nvelocity的易用性高很多,而且跟後端集合的比較好。
而且這次的專案完全使用dapper orm,整個資料庫訪問層操作看起來也清爽很多了。
程式碼結構
左側主要分為三個資料夾,Jqpress.web是存放web路由入口、模板皮膚、靜態檔案,上傳資料夾,後臺管理程式通過Areas域管理來實現的,整個專案結構還是比較清晰的。
路由設計
路由入口為HomeController這個檔案,包括首頁、產品列表,文章列表,文章內容等待,都是通過這個Controller來路由的,雖然功能比較多,但是程式碼量不到300行,業務邏輯處理基本都在service層。
如下為一個列表介面的Action邏輯才20幾行
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資料夾下,通過後端設定可以隨意切換模板(此功能還在完善當中)。
資料儲存設計
作為輕量級的cms,當然不會用mysql或者sqlserver,依然堅定的使用sqlite,以上是通過dapper進行資料庫操作,雖然沒有微軟增加的orm強大,但是可讀性和操控性都是非常好的。
因為要支援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安裝資訊。
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