【開源.NET】 分享一個前後端分離的輕量級內容管理框架

来源:http://www.cnblogs.com/grissom007/archive/2017/01/25/6349750.html
-Advertisement-
Play Games

開發框架要考慮的面太多了:安全、穩定、性能、效率、擴展、整潔,還要經得起實踐的考驗,從零開發一個可用的框架,是很耗時費神的工作。網上很多開源的框架,為何還要自己開發?我是基於以下兩點: 1. 沒找到合適的:安全、穩定、簡單、易用、高效、免費; 2. 想成為架構師; 於是就自己動手,參考網上開源的項目 ...


開發框架要考慮的面太多了:安全、穩定、性能、效率、擴展、整潔,還要經得起實踐的考驗,從零開發一個可用的框架,是很耗時費神的工作。網上很多開源的框架,為何還要自己開發?我是基於以下兩點:

  1. 沒找到合適的:安全、穩定、簡單、易用、高效、免費;
  2. 想成為架構師;

於是就自己動手,參考網上開源的項目和借鑒網友的設計思路(特別是蕭秦系列博文),結合自己的實踐,開發了一個簡單、易用、高效的的框架,雖然不完善,但也能解決現實中的問題。不過隨著見識增廣,發現沒負責過千萬級別的項目難以成為架構師,也不可能開發出一個完美的框架。那就先開源出來,後面慢慢維護和完善。

一、框架結構圖

二、分層

從框架圖看出,按代碼結構業務來分為 5 層:

  1. Web: 展示層
  2. WebApi: Http 接收與響應
  3. Service: 業務邏輯和數據處理
  4. EasyCore: 半ORM(Easy.DataProxy, Easy.Office, Easy.SqlConfiguration)
  5. Model: 實體

對應解決方案的項目結構:

按功能角度分為 3 層:

  1. 淺藍色的: 展示層
  2. 深藍色的: Http接收與響應層
  3. 淺橙色的: 業務邏輯和數據處理層

按業務分為 2 層:

  1. 淺藍色的: 展示層
  2. 淺橙色的: 業務邏輯和數據處理層

也就是經典的 3 層架構, 我只是把後面的業務邏輯層和數據處理層合拼為 1 層。理論上把業務邏輯和數據處理分離是很合理的,但現實是數據處理往往就是寫 Sql, 而 Sql 不只是簡單獲取數據,很多時候會耦合有大量的業務邏輯在裡面, 導致程式員去處理業務時,把一個業務需求拆分到 2 層去處理,這樣不能享受分層的好處,反而帶來以下副作用:

  1. 破壞單一業務的內聚性;
  2. 分散程式員的註意力:一條很合理的線性思路,分離到 2 個項目去實現;
  3. 增加程式複雜度:看懂一個業務代碼的實現,要同時看兩個層的代碼;

當然把業務和數據處理分層對規範化多人協作的大型項目是很好的方式,幫助解耦、降低複雜度,不過對沒有嚴格規範分層代碼的三少項目(錢少、人少、時間少),這就不是好事了;分層是一種技術工具而不是規則,要根據實際情況找到適合當前項目和團隊的分層方式。對於中小型、註重寫sql的項目,更適合把業務和數據處理放到同一層。

三、技術棧

前端用 mvvm 模式把頁面呈現和js業務代碼分離:

引用庫:

  1. Easyui 1.4.0: 展示UI, 有做微小修改以適應框架;
  2. knockoutjs: 實現mvvm;
  3. profoundgrid: 頁面佈局;

工具:

  1. sass: 好爽的 css 語言;
  2. grunt: 前端構建工具, 結合compass 動態編譯 sass 到 css, 合併以及壓縮 css, js;

後端實現 RESTful Api:

引用庫:

  1. Asp.net WebApi: 實現RESTful api;
  2. autofac: 依賴註入;
  3. JWT: 實現Oauth2, 用 token 授權,實現跨域;
  4. fluentData: 支持多資料庫的數據持久,有改動以適應框架;
  5. log4net: 日誌組件;

工具:

  1. .net4.5;
  2. vs2015;
  3. mariadb: mysql 資料庫的一個分支;
  4. T4模板:代碼生成器;

四、項目說明

後端

Grissom.CMS
│      
├─1-Model -- 實體類
│  ├─generation -- T4模板生成
│          
├─2-Services -- 業務邏輯和數據處理層
│  │          
│  ├─custom -- 業務代碼寫在這裡
│  │          
│  ├─generation -- T4模板生成
│          
├─3-WebAPI -- 
│  │  
│  ├─AOP -- 橫向切入:異常日誌記錄
│  │      
│  ├─APIs -- 公開的 API 寫這裡
│  │          
│  ├─App_Data
│  │      inital.sql -- 資料庫腳本
│  │      
│  ├─Auth -- 實現跨域和Token授權
│  │      
│  ├─Log -- 日誌
│  └─SqlConfigs -- 配置增刪改查的 sql xml
│          SysRole.xmlSysUser.xmlVideoMain.xml
│          
├─Core -- EasyCore 自動化增刪改查
│  ├─Easy.DataProxy -- sql配置 解析器
│  │              
│  ├─Easy.Office -- 導入導出 excel 
│  │          
│  ├─Easy.SqlConfig -- sql配置模型 
│  
│                  
├─Libs -- dll 庫
│  

其中,Model, Service 都用 T4 模板實現代碼自動生成, 前面說了 Service 就是業務和數據處理的核心項目。

前端

├─1-content -- js, css 系統通用文件
│  │  comData.js -- 公用庫: 配置 api 伺服器 
│  │  config.rb -- compass 配置文件
│  │  Gruntfile.js -- grunt 配置文件
│  │  package.json -- nodejs 初始化配置文件
│  │  
│  ├─asset -- 資源
│  │  ├─css
│  │  │              
│  │  └─js
│  │    │              
│  │    └──core
│  │                  
│  ├─icons -- easyui icons
│  │      
│  ├─images -- 圖片
│  │      
│  └─node_modules -- nodejs 引用庫
├─home -- 主頁
│      index.htmlindex.js
│      
├─sys -- 系統模塊
│  ├─role -- 角色管理
│  │  │  edit.html -- 編輯頁面
│  │  │  index.html -- 列表頁面
│  │  │  
│  │  └─viewModel -- 模型
│  │          edit.js
│  │          index.js
│  │          
│  └─user -- 用戶管理
│              
└─video -- 視頻模塊

home 是容器,sys, video 是對應系統的業務模塊,role, user 對應系統表:SysRole, SysUser。前端核心庫是 1-content/asset/js/core 下麵的js, 其實就實現的通用的數據綁定和也後臺數據交互功能。
1-content 中只需修改 comData.js 的 api 伺服器配置 com.apiDomain = "http://localhost:2717"; 其它都是通用的,所以我用grunt 把通用的庫和css 分別合併成 all.js,all.css。當然要做修改,可安裝 nodejs, grunt, 參考grunt

五、簡單應用:

具體實現參考底部的 demo, 流程如下:

1) 修改資料庫伺服器: 有 4 個地方要改的, 其中 3 個是 T4 模板, 1-Model/generation/ModelTemplate.tt, 2-Services/generation/ModelTemplate.tt, 2-Services/custom/ModelTemplate.tt,3-WebAPI/web.config;
2) 重新執行 T4 代碼生成器:修改或添加新表後,打開T4模板文件,然後保存一遍,就會自動生成了,有 3 個 T4 模板文件: 1-Model/generation/ModelTemplate.tt, 2-Services/generation/ModelTemplate.tt, 2-Services/custom/ModelTemplate.tt;

3) 添加API: 在 3-WebAPI 項目下添加對應的 api controller;
4) 添加sql 配置: 在 3-WebAPI 項目下的 SqlConfigs 文件夾添加對應表名的 sql xml 文件;

5) 轉到前端: 在根目錄下添加模塊文件夾和對應的表文件夾,並添加 index.html 列表頁面 和 edit.html 編輯頁面, viewModel 文件夾添加模型js文件;

6) 運行 WebApi, 再瀏覽頁面;

六、預覽:

七、總結:

該框架有 3 個核心點,以後單獨 blog 來詳細展開描述,不然你看不到框架的強悍所在:

  1. 後端 EasyCore(Easy.SqlConfiguration, Easy.DataProxy, Easy.Office): 直接通過一個簡潔的 xml 文件配出對錶進行增刪改查功能;
  2. 前端 viewModel.common, viewModel.search,viewMode.edit:結合 knockoutjs 和 jeasyui 實現 mvvm;
  3. 前後端交互的數據結構: {master:{inserted:[{data:{},children:{c1:{inserted:[],updated:[],deleted:[]}}}]}}, 該結構能標識出單表、多表、主從表的混合批量新增、修改、刪除狀態, 後臺分析該json格式的數據結構,結合 sql 配置,就能實現自動化資料庫操作;

框架並不完善,也不一定適用於你,但歡迎提意見,後續完善。PS: 該框架已經用到生產環境了。

八、源碼 https://github.com/grissomlau/Grissom.CMS

初始化登錄名:admin, 密碼: 123



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 首先下載apache-maven-3.3.9-bin.zip,並解壓; 2. 添加系統變數MAVEN_HOME,值為apache-maven-3.3.9-bin.zip的解壓路徑: 再在path變數中添加: 3. 輸入命令mvn -version檢測安裝是否成功: 4. 編輯%MAVEN_HO ...
  • 首先,在applicationContext.xml文件中加一行: 加上這一行以後,將自動掃描路徑下麵的包,如果一個類帶了@Service註解,將自動註冊到Spring容器,不需要再在applicationContext.xml文件定義bean了,類似的還包括@Component、@Reposito ...
  • FunDA的設計目標就是把後臺資料庫中的數據搬到記憶體里,然後進行包括並行運算的數據處理,最後可能再對後臺資料庫進行更新。如果需要把數據搬到記憶體的話,那我們就必須考慮記憶體是否能一次性容納所有的數據,有必要配合數據處理分部逐步讀入,這就是Reactive Stream規範主要目的之一。所以在設計FunD ...
  • 前段時間,聽了一堂C語言的課,那老師說:“數組名就是一個指向數組首地址的常量指針”。 我上百度查了一些,有好多教程、書籍等,都持相同的觀點。 但我一直感覺——數組名不等於指針。 實踐是檢驗真理的唯一標準,於此,有了以下內容。 首先,聲明一個數組和一個常量指針並指向那個數組。 設問:一個整型指針的長度 ...
  • 閱讀目錄 前言 解決數據一致性的方案 回到DDD 設計 實現 結語 一、前言 之前的十一篇把用戶購買商品並提交訂單整個流程上的中間環節都過了一遍。現在來到了這最後一個環節,提交訂單。單從業務上看,這個動作的背後包含了多個業務操作,根據用戶填寫的訂單信息生成訂單、扣除使用的餘額和積分、使用選擇的禮券等 ...
  • 不要誤會,我不是針對python,也不是針對nodejs,我是說除了.NET之外,玩爬蟲的都是垃圾 ...
  • ddd小白,一篇章節便能激起了心中漣漪,感慨之初,記於筆下。 第1章 消化知識 用醍醐灌頂、茅塞頓開來形容此章短短的文字,實不為過。 簡單介紹背景:旅游互聯網,B2B,初創公司。產品設計-代碼開發的銜接有過兩種明顯形式: 1. 項目的推進由產品部起頭,收集、分析、過濾需求,形成原型文檔(word,e ...
  • 代理模式在java中的使用,包括靜態代理和動態代理,對retrofit進行模擬 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...