二十9、EFW框架開發的系統支持SaaS模式和實現思路

 回《【開源】EFW框架系列文章索引》       html

 EFW框架源代碼下載V1.3:http://pan.baidu.com/s/1c0dADO0sql

 EFW框架實例源代碼下載:http://pan.baidu.com/s/1eQCc69G數據庫

 

      前言:之前作一個區域性醫院信息系統項目,包括幾十家小醫院都須要上醫院信息系統,之前系統都是單機構版的,就是必需要每一個醫院去安裝,程序和數據庫都是每一個醫院一套,這樣的系統來作這個項目確定不行,維護實施成本過高了,因此這麼多醫院必須統一一套程序和數據庫。並且爲了客戶機免安裝,最好作成Web版系統,只用瀏覽器輸入地址就可使用系統;經過對單機構版的系統進行了一次大的改版,由原來的CS架構改成BS架構,由原來數據庫只支持一個醫院改爲支持多個醫院,並且控制器機構與機構之間業務數據不一樣相互訪問;改版後的系統後就有點相似於SaaS模式;如今EFW框架針對SaaS模式的一些特色,作了一些功能擴展,讓咱們開發系統的起點就是支持多機構的;可是在業務開發的時候又無需考慮多機構,只需單機構的思想編寫代碼,機構的區分框架幫咱們處理;瀏覽器

本文要點緩存

1.SaaS介紹服務器

2.EFW框架中支持Saas的兩個技術實現架構

3.如何開發SaaS模式程序?框架

4.WorkId的值的傳遞原理測試

5.總結編碼

 

1.SaaS介紹

      SaaS是Software-as-a-service(軟件即服務)。

      SaaS是一種經過Internet提供軟件的模式,用戶不用再購買軟件,而改用向提供商租用基於Web的軟件,來管理企業經營活動,且無需對軟件進行維護,服務提供商會全權管理和維護軟件,對於許多小型企業來講,SaaS是採用先進技術的最好途徑,它消除了企業購買、構建和維護基礎設施和應用程序的須要;

      因此咱們開發一個系統要讓它支持SaaS模式,首先它必須是Web程序,這樣客戶不用另外安裝程序,只須要瀏覽器就能夠直接使用;其次系統要支持「按需收費」,不一樣級別的客戶可能使用的系統模塊有區別,那麼咱們的系統必須支持按權限配置系統模塊;還有就是咱們的系統確定只有運行一套在中心服務器,數據庫也只有一套,卻要知足不一樣的客戶使用系統,並且客戶之間的數據又要徹底獨立,這樣須要咱們在系統中有隔離機制能夠按照機構區分業務數據;

 

2.EFW框架中支持Saas的兩個技術實現

1)根據註冊機構的級別,提供不一樣功能模塊,實現按需收費

       不一樣機構的按需收費,能夠利用框架中的權限管理來實現。前面有一章有講EFW框架權限管理,權限控制簡單來講就是,角色配置模塊菜單,用戶綁定角色,用戶登陸後根據上述配置動態生成系統菜單而達到權限的控制;不一樣的機構能夠維護不一樣的角色;若是菜單級別的權限還不能知足,還可使用頁面子權限進行頁面中控件操做、數據顯示均可以控制;

2)一個數據庫隔離不一樣機構的業務數據

       不一樣機構的業務數據隔離,首先框架基礎數據字典中有一張機構表,管理全部機構數據,另外全部業務表都架構機構編碼WorkId字段,產生的業務數據的時候把WorkId寫入,這樣用戶查詢數據的時候根據用戶綁定的WorkId過濾業務表的數據;

另外若是系統不須要支持多機構,就只有一個機構,那每一個業務表加一個WorkId字段比較彆扭,框架提供了SaaS開關,爲false的時候就不須要WorkId字段;

 

3.如何開發SaaS模式程序?

1)添加一個新機構

新增機構後,默認建立一個機構的超級用戶,機構「企業級系統」和「測試系統」的超級用戶分別爲「admin」,「admin2」,兩個用戶分別登陸,打開「書籍管理」功能,如此兩個用戶顯示書籍列表數據不一樣。

  

2)Books表結構及界面數據顯示

 

3)代碼實現

實體Book的配置,與SaaS有關的配置是IsGB,若是IsGB=true實體不區分機構,IsGB=false實體區分機構,這裏Book是業務實體因此要區分機構,而通常只有字典數據配置爲true;

 

實體使用ORM保存數據時候並不須要指定WorkId的值,並且Book實體也沒有WorkId屬性;而插入數據庫中WorkId值是框架中ORM自動處理的,這樣編寫程序的時候不須要關注WorkId,簡化編碼代碼;

 

實體解決不了的複雜數據庫操做,就使用Dao,Dao裏面都是直接使用SQL語句操做數據庫,因此當多機構的時候,Where條件後必須加上WorkId條件;

 

 

4.WorkId的值的傳遞實現

       上面實例中的代碼,在使用frmBook.currBook.save(); 和 strsql = string.Format(strsql, searchChar, flag,WorkId); 中的WorkId值是怎麼來的?

1)用戶登陸後,根據用戶名就能獲得用戶的機構編碼WorkId,並緩存在「RoleUser」,一個用戶只能屬於一個機構;

2)打開界面的時候初始化控制器,同時實例化oleDb對象,oleDb對象有WorkId屬性,值從緩存「RoleUser」取登陸的WorkId綁定給oleDb對象,控制器中的全部代碼以及後臺代碼實現都是使用的此oleDb對象操做數據庫,因此必須將oleDb對象在Controller、ObjectModel、Entity、Dao中傳遞,一樣多機構須要的WorkId值跟着oleDb對象就在各個對象中傳遞;

3)控制器對象將oleDb傳遞給ObjectModel對象,實例化對象必須使用NewObject()方法,經過此方法實現oleDb對象傳遞。因此若是使用new來實例化ObjectModel對象是不能操做數據庫的;

4)oleDb傳遞給Dao對象,實例化對象必須使用NewDao()方法;

5)Dao中的WorkId

 

5.總結

   使用框架開發SaaS模式的程序,只須要注意這幾點:

1)配置文件中的IsSaas=true

2)業務實體的類名自定義屬性IsGB=false

3)數據庫中業務表必須增長WorkId字段

4)後臺代碼能夠直接隨時獲取WorkId的值

相關文章
相關標籤/搜索