CMS系統模版引擎設計(1):基礎型別
阿新 • • 發佈:2019-01-25
/// <summary> /// 模版類 /// </summary> public class Template { /// <summary> /// 模版ID /// </summary> public Guid TemplateId { get; set; } /// <summary> /// 模版名稱 /// </summary> public string Name { get; set; } /// <summary> /// 模版內容 /// </summary> public string Content { get; set; } /// <summary> /// 是否為部分檢視 /// </summary> public bool IsPartial { get; set; } }
初步設計就是如此,增加了一個IsPartial屬性,因為我們的模版或許會作為部分檢視在其他模版裡呼叫,就像UserControl一樣。
那麼Page類的設計就略顯複雜了。我們想訪問一個Page起碼要有訪問路徑吧,所以就要有一個UrlPattern屬性,也就是訪問規則,因為像詳細頁一般只是引數的變化,所以URL不能寫死,只能是一個規則。既然有規則,也會有一些引數,而且引數不一定是?name=value形式,可能是/value/value1形式,所以我們還得設計一個UrlPattern類。
/// <summary> /// Url訪問規則 /// </summary> public class UrlPattern { /// <summary> /// 具體規則 /// </summary> public string Pattern { get; set; } /// <summary> /// 正則引擎 /// </summary> public Regex Regex { get; set; } /// <summary> /// 引數列表 /// </summary> public string[] Parameters { get; set; } /// <summary> /// 獲取某個引數的值 /// </summary> /// <param name="rawurl">當前訪問的URL</param> /// <param name="name">引數名</param> /// <returns></returns> public string GetValue(string rawurl, string name) { throw new System.NotImplementedException(); } }
是的,你沒看錯,我們要用正則表示式,這可能是對製作人員難度最大的部分。:)不過可以教他們初級的寫法,可以應付絕大多數需求。
比如我寫一個規則如下 /details/(?<articleid>\d+),這個表明引數名為articleid,訪問規則就是 “/details/數字”
Page除了訪問URL外還要有快取的概念,不然我們如何提升效能,你說是不?!快取可能還會用標籤裡去,因為如果Page不快取只是快取了某個標籤,所以Label也要有快取,那麼我們是否需要設計一個快取類呢?
/// <summary> /// Page/Template/Label的快取 /// </summary> public class Cache { /// <summary> /// 快取名 /// </summary> public string Key { get; set; } /// <summary> /// 快取秒數 /// </summary> public int CacheSeconds { get; set; } /// <summary> /// 獲取快取資料 /// </summary> /// <returns></returns> public object GetData() { throw new System.NotImplementedException(); } /// <summary> /// 移除快取 /// </summary> public void Remove() { throw new System.NotImplementedException(); } /// <summary> /// 更新快取 /// </summary> /// <param name="data"></param> public void SetData(object data) { throw new System.NotImplementedException(); } }
那麼Page類還應該有什麼?Labels!是的,我們不可能每次都去解釋模版來獲取所有的Label,而是Page被快取後我們只需要訪問他的LabelCollection即可。那麼我們來看下Page的設計雛形吧。
/// <summary>
/// Page類
/// </summary>
public class Page
{
/// <summary>
/// ID
/// </summary>
public Guid PageId { get; set; }
/// <summary>
/// 名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 標題
/// </summary>
public string Title { get; set; }
/// <summary>
/// 關鍵字
/// </summary>
public string Keywords { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 模版
/// </summary>
public Template Template { get; set; }
/// <summary>
/// 訪問路徑規則
/// </summary>
public UrlPattern UrlPattern { get; set; }
/// <summary>
/// 標籤
/// </summary>
public Label[] Labels { get; set; }
/// <summary>
/// 快取
/// </summary>
public Cache Cache { get; set; }
/// <summary>
/// 顯示HTML程式碼
/// </summary>
public void Render()
{
throw new System.NotImplementedException();
}
}
不錯哦,襖喲,不錯哦。
其實對於大型的站點,子站的概念是不可缺少的。或者我們的CMS需要支援多站點,那麼還需要一個Site類。
/// <summary>
/// 站點
/// </summary>
public class Site
{
/// <summary>
/// 站點ID
/// </summary>
public Guid SiteId { get; set; }
/// <summary>
/// 站點名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 站點備註
/// </summary>
public string Note { get; set; }
/// <summary>
/// 站點域名
/// </summary>
public string[] Domains { get; set; }
/// <summary>
/// 站點狀態
/// </summary>
public Status Status { get; set; }
/// <summary>
/// 站點的頁面
/// </summary>
public Page[] Pages { get; set; }
}
站點一般包含多個可訪問的域名,所以有個Domains。當然站點包含N個Page。
好啦,初步的設計就到這了,下節我們講怎麼讓這些類運作起來。