【開源.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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...