最近在准備做一個開源項目 Portal-Builder 門戶/B2B通用系統 還沒有給自己團隊說因為框架還在設想階段,以下框架解釋肯定有不足之處,還望各位多多指教:
設計理念:
1、爭取做到最完善的開源,但是開源的東西未必好用,所以Portal-Builder 應該有一套簡單易用的API/SDK,方便各種開發者直接獲取相關信息 迅速投入開發;
2、最終網站管理者並不需要一個大而全的門戶/B2B系統;由於各用戶使用系統功能、模塊不盡相同,因此需要有一套機制能夠允許用戶自行定義系統應該包含哪些模塊、怎樣運作,這樣管理起來也更加簡潔、方便;
3、目前市面流行的都是采用基於模板開發的系統,但是模板又無法完全與后台代碼剝離,所以對於模板開發者還是有一定的技術要求;Portal-Builder 應該有一套完全不需要前台網頁設計師懂得PHP/.NET 等編程語言就能夠理解的機制,使網站的模板開發最大與后台代碼脫離
4、Portal-Builder需要有一套類似於插件管理的功能,但是要更加強大(我稱之為應用管理平台);也就是說,最好能夠實現把CMS、分類信息、商城這些復雜的功能模塊完全獨立出來以應用程序的形式來安裝,這樣Portal-Builder其自身就只需要管理好自己的框架、基礎數據並對安裝的應用程序進行監管、驗證就可以了
5、做到用戶權限設定的動態設定,對每項操作不再像市面的網站系統一樣預定義,允許開發者自行根據某種機制來動態更新可以進行設定的權限(我在自己的技術文檔里把這稱作PortalBuilderAction,即通過XML或某種形式對框架、各種應用進行操作/Action的預定義,從而實現動態權限讀取、設定)
6、系統能夠自動連接到Portal-Builder開源服務中心,進行系統自動更新
對上面理念的一些實現方面的簡單介紹:
框架:門戶整站框架后台與前台實現完全剝離,前台互動通過訪問服務使用JSON+Javascript來完成;
功能模塊:門戶的功能按照AppStore方式的應用安裝模式來完成,在系統的文件下按照Portal-Builder定義的文件格式來進行安裝、管理和卸載;Portal-Builder框架通過定義一系列Interfaces來與這些相對獨立的應用進行溝通和數據處理
重點介紹一下我對前台模板概念的闡述(與市面上見到的CMS、門戶站之類的模板開發模式幾乎完全不同,希望大家品嘗和評論!)
前台模板:
模板可以是任意格式的文件,只需要是按照HTML格式編寫就可以,(我們采用ASP.NET開發,因此如果使用ASPX保存模板,還可以通過.NET對ASPX進行服務端編譯);
系統通過編寫的模板標簽語法定義表XML (PBTemplateSyntxDefinition.XML)來自動識別系統可以進行編譯的標簽, 目前我定下來的XML格式如下:(3月15日草稿)
估計有XML和Reflection經驗的朋友們看后就知道我要做些什么了 呵呵
<?xml version="1.0" encoding="utf-8" ?>
<WebCiderSyntax_PortalBuilder>
<PBTemplateParser>
<!--
<SysParams> 用來獲取系統自定義的一些參數,這些參數必須通過一個類調用方法來實現,比如在FakeClass.GetCurrentPageNumber("page")里面調用 HttpContext.Current.Request["page"] 來
調用當前頁碼 等等
SysParams里面的代碼完全有萬賽達商務科技PortalBuilder開發組定義,請勿自行刪改
<SysParams>里面的Param必須在{webcider: } 標簽內進行使用,使用時需要加前綴$
比如: {webcider:文庫文檔 頁碼=$當前頁碼 ....}
-->
<SysParams>
<param Name="當前頁碼" DefaultValue="1" ClassName="WebCider.FakeNamespace.FakeClass" AssemblyName="WebCider.FakeNamespace" MethodParamValue="page" MethodName="GetCurrentPageNumber" />
</SysParams>
<!--
<Commands> 用於用戶進行自定義開發自己的編譯語言
每一個<Command>代表可以在前台進行調用的一個標簽名,比如下方例子編譯設置
<Commands>
<Command Name="文庫文檔" Formatter="WebCider.PortalBuilder.Templates.PBTemplateFormatter">
<Parameters>
<param Name="創建者" DefaultValue="Null" ValueType="System.String" />
<param Name="最早時間" DefaultValue="2010-12-26" ValueType="System.DateTime" />
<param Name="最晚時間" DefaultValue="2015-12-26" ValueType="System.DateTime" />
</Parameters>
<Manager ClassName="WebCider.PortalBuilder.Docs.DocManager" AssemblyName="WebCider.PortalBuilder" MethodName="FindDocs" />
<Result ClassName="WebCider.PortalBuilder.Docs.DocCollection" AssemblyName="WebCider.PortalBuilder" />
</Command>
</Commands>
在前台可以最終實現這樣子的調用:
<div>
<div>您的查詢結果如下:</div>
<div class="myClassName">
{ webcider:文庫文檔 創建者="mleader1" 頁碼=$當前頁碼 返回數量="10" }
</div>
</div>
您可以在標簽外面嵌套其他html標簽並進行CSS定義,從而實現對標簽編譯出的HTML的樣式更改
-->
<Commands>
<Command Name="文庫文檔" Formatter="WebCider.PortalBuilder.Templates.PBTemplateFormatter">
<Parameters>
<param Name="創建者" DefaultValue="Null" ValueType="System.String" />
<param Name="最早時間" DefaultValue="2010-12-26" ValueType="System.DateTime" />
<param Name="最晚時間" DefaultValue="2015-12-26" ValueType="System.DateTime" />
</Parameters>
<Manager ClassName="WebCider.PortalBuilder.Docs.DocManager" AssemblyName="WebCider.PortalBuilder" MethodName="FindDocs" />
<Result ClassName="WebCider.PortalBuilder.Docs.DocCollection" AssemblyName="WebCider.PortalBuilder" />
</Command>
</Commands>
</PBTemplateParser>
</WebCiderSyntax_PortalBuilder>
這里面有一點技術難度的就是 如果方法里面涉及到 out params 可能反射方面要寫的代碼就需要多一些
在這個XML的基礎上,我們通過寫一個PBTemplateParser.cs 就可以完全的實現HTML標簽的識別、解析和編譯,然后通過PBFormatter.cs 來進行二次格式化 (具體代碼暫時不公開,不過其實很簡單的)
那么在這種設想下,前台需要寫的 比如 index.html 模板也的代碼可能是這樣子的:
<div id="docList">
{webcider:文庫文檔 創建者="mleader1" 頁碼=$當前頁 數量="10" cssClass="abcClass"}
</div>
然后在具體調用PBTemplateParser 和PBFormatter 完畢后,他的最終代碼應該是這種結果:
<div id="docList">
<div class="abcClass">
<!---注:下面代碼僅供參考,個人比較憎恨Table的,不過為方便解釋我這里暫時寫成table-->
<table class="webcider_table">
<tr>
<td>文檔ID</td>
<td>文檔標題</td>
<td>創建時間</td>
<td>創建者</td>
</tr>
<tr>
<td>101</td>
<td>asdf</td>
<td>2012/12/12</td>
<td>mleader1</td>
</tr>
<tr>
<td>101</td>
<td>asdf</td>
<td>2012/12/12</td>
<td>mleader1</td>
</tr>
...
</table>
<table class="webcider_pagination">
<tr>
<td>當前頁:2/11</td>
<td>每頁數量: 10</td>
...
</tr>
</table>
</div>
</div>
也就是說,也就是說這樣子我們也就實現了傳統意義上的頁面模板重寫,甚至連標簽語言也是用戶自己定義的一套自己的語法。 至於樣式,只要PBFormatter編譯的時候全部使用 div &css 格式,我們便能夠輕易重定義樣式和布局。 —— 前台工作就能夠全部交給前台網頁設計師了。 (注:互動性的比如登錄驗證、表單提交等都可以通過JSON數據、AJAX提交到Web服務來實現)
最后:由於每個應用程序開發都有自己的不同點,框架寫一個TemplateParser哪怕功能再強也有可能不包含開發者自己想做的事情,所以Portal-Builder應該同時提供ITemplateParser 和ITempalteFormatter 來方便開發者來進行自己的模板編譯器的開發
模板和URL的編譯應用: 模板編譯一旦實現,就要看怎么調用了,模板調用的具體實現方式目前暫時保密,但是理念很簡單:Url重寫定義了,那么每個Url肯定需要有一個頁面落腳點,我們的概念就是網站、子站肯定有至少一個Url,每個Url必須指定一個模板編譯頁,每個網站、子站應該至少有一個模板編譯頁。 例如網站首頁 {abc}.localhost/ 我們就可以指定他的訪問地址模板是 root/Templates/System/index.html 那么至於這個 index.html 如何頁面鏈接是什么樣子的、怎么跳轉,就完全是前台頁面開發者的責任了,只要他做這張模板的時候頁面Url是根據Poral-Builder的Url編譯規則來的就可以了
系統站點管理和Url重寫模塊今天就來不及闡述我的概念了 上面的實現方式基本上大家可以看出來我打算讓團隊去做的Portal-Builder 系統的基本框架會是什么樣子,歡迎大家討論! 我把開源Wiki建立起來了,放在 http://www.portal-builder.com 這個地址,但是內容還沒有 一旦項目正式開始,相信大家會一起把內容填充起來了的,呵呵 ...
這兩個星期會確定是否去做這一塊兒 如果去做了,那么歡迎各位踴躍參與共同開發和討論.