我們藉助於Django開發了許多的內部管理系統,例如之前介紹過的ProbiusKerriganProxy等等,這些系統看起來長的都一樣,但實際實現的功能確是千差萬別,這些不同的系統為什麼會長的一樣呢?這不僅僅是因為它們使用了同一套前端模板,更為重要的是我們將很多大多系統都要用到的基礎功能給集中在了一起,封裝成了一個基礎的Django應用,例如前端頁面及常用外掛、後端使用者及許可權管理等等,任何一個Django專案只要集成了這個應用就能快速擁有這些功能,不僅省去了大把的基礎功能開發時間,而且對於後續的更新也是非常的友好

設計思路

因為各種各樣的原因,我們沒有辦法把所有的功能都集中在一個系統裡,必然會有多個系統的存在,而對於每個系統都有一些基礎的功能要實現,例如使用者管理、許可權管理、日誌記錄等等,最初的時候我會copy已開發完成專案的基礎程式碼到新專案使用,這樣最為簡單方便,但若有bug修復或功能更新,我就必須同時修改多個專案的程式碼,這不僅繁瑣還容易出錯,為了優化體驗,我決定把所有的基礎功能從專案中抽離出來,打包成公共應用供專案引用,這個公共應用我們就叫sadmin

打包主要藉助setuptools來完成,打包完成後上傳至私有倉庫,應用伺服器中直接通過pip來安裝即可,簡單方便

主要功能

Sadmin具體包含的功能主要有:

1.集成了基於adminLTE的前端模板,以及常用的前端元件,例如select2、datatables等

2.網站的標題、Title、主題等可後臺配置

3.OpenId、LDAP等多種認證方式

4.後臺配置選單,並可根據不同許可權顯示不同選單

5.使用者、組、部門管理,使用者的登入登出

6.自動記錄操作日誌

7.封裝了對於資料庫的增刪改查

系統開發中會有大量關於資料庫的增刪改查操作,Django自帶的Admin系統很好的實現了這塊的功能,但admin後臺不僅醜,對於很多稍微複雜點的需求都不好實現,所以我們直接放棄了自帶的admin系統,為了方便的進行CRUD,我參考Django的ViewSet封裝了兩個方法ListCreateView RetrieveUpdateDestroyView來處理

以對Product表的增刪改查為例,後端只需要短短的幾行程式碼就行了

class ProductList(ListCreateView):
model = Product
template = 'workflow/product.index.html'
permission = {'get': 'loginuser', 'post': 'workflow.product_change'} class ProductDetail(RetrieveUpdateDestroyView):
model = Product
permission = {'get': 'workflow.product_select', 'put': 'workflow.product_change',
'delete': 'workflow.product_delete'}

幾行程式碼便可以讓後端處理對資料庫的增刪改查,同時返回固定格式的json資料,而對於前端頁面就沒有太多的規範了,按照喜好怎麼設計都可以

除了以上這些主要功能外,還集成了一些例如全站水印、通知傳送、資料校驗等等其他小功能

使用效果

有了Sadmin,我們在開發的過程中就不需要再來考慮這些基礎的功能,更加專注於業務本身,效率提升明顯,內部已有將近10個專案使用了Sadmin,執行穩定