GloryAdmin是一個以springboot2.1.9.RELEASE 和vue-admin-template建構的後台框架;
GloryAdmin使用基於角色的權限管理。角色樹是一個以「系統管理員」為根節點的樹,權限樹是由多個子權限樹組成。 「系統管理員」擁有所有權限;非系統管理員角色可以查看當前角色和直屬下級角色的信息,但只能增刪改直屬下級的角色的信息(直屬下級:A是B的直屬下級,則A必須為B的孩子節點)。
Glory-Admin
專案 | 科技 |
---|---|
後端項目 | springboot |
前端專案 | Element UI & Vue.js |
資料庫 | MySQL |
快取 | Redis |
本專案使用mysql資料庫,可以使用資料庫腳本建立2個資料庫multi_module_db multi_module_db_01
後台啟動,使用28081埠
前端啟動,使用9523端口
開啟瀏覽器造訪http://localhost:9523 admin a123456
分庫分錶或sharding 的本質是摩爾定律的失效,將資料集中儲存至單一資料節點的解決方案,在效能、可用性和維運成本這三方面已經難於滿足互聯網的海量資料場景。
單一資料庫無法支撐現有的業務,因此出現了分庫分錶,使用多個資料庫進行資料儲存。分庫分錶簡單理解就是一個籃子裡面裝的東西有限,影響了找效率和容量,把籃子裡面的東西分成N份,裝到不同的籃子裡面。從而打破容量限制,提高查詢效率。
然後我們說一下分散式資料庫,國內比較流行的有騰訊的TDSQL、阿里的OceanBase,PolarDB、華為的GaussDB等。基本上都是自主研發,強一致高可用、全球部署架構、分散式無限水平擴展、高效能,千億條記錄、數百TB數據上的跨行跨表事務(為祖國點讚) 。分散式資料庫隱藏了資料庫分庫分錶的策略,智慧的進行資料的分庫分錶,使用起來就像操作一個資料庫一樣。
由於記憶體操作和磁碟操作根本不是一個量級的,所以在大的專案中都需要對磁碟型的資料庫做記憶體型的緩衝層,將磁碟資料快取到記憶體中。資料快取層用於快取整個資料層的數據,加速網站存取速度。本專案使用AOP技術、 Redis記憶體資料庫做資料快取層。詳細請自行查看程式碼com/spring/common/aop/CacheDaoAspect.java
本專案使用sharding JDBC處理資料庫的分庫分錶。根據業務場景,自行拆分資料。
通常專案都只有一個資料庫,國內用的比較多的是阿里雲的druid做資料庫的連結池。本專案使用mysql,druid,sharding JDBC。資料分庫分片的原理,在程式裡面維護多個資料庫連線池,每個資料庫連線池對應一個資料庫。分庫分錶使用基於XA 協定的兩階段事務處理。配置路徑com.spring.common.config.shardingJDBC
垂直拆分:依照業務拆分的方式稱為垂直分片,又稱為縱向拆分。依照業務將表格分佈到不同的資料庫中,將壓力分散至不同的資料庫。
水平拆分:不關心業務邏輯分類,而是透過某張表的某個欄位(或某幾個欄位),依照某種規則將資料分散至多個庫或表中。這裡的規則,涉及的演算法,我們稱為分片演算法。
(以下內容取自shardingJDBC文件)
對應PreciseShardingAlgorithm,用於處理使用單一鍵作為分片鍵的=
與IN
進行分片的場景。需配合StandardShardingStrategy 使用。
對應RangeShardingAlgorithm,用於處理使用單一鍵作為分片鍵的BETWEEN AND
、 >
、 <
、 >=
、 <=
進行分片的場景。需配合StandardShardingStrategy 使用。
對應ComplexKeysShardingAlgorithm,用於處理使用多鍵作為分片鍵進行分片的場景,包含多個分片鍵的邏輯較複雜,需要應用開發者自行處理其中的複雜度。需配合ComplexShardingStrategy 使用。
對應HintShardingAlgorithm,用於處理使用Hint
行分片的場景。需配合HintShardingStrategy 使用。
使用者登陸取得token,儲存到本地(adminLogin)
使用者發送token取得使用者資訊和權限訊息,儲存到store裡面。由於F5會導致store遺失,因此前端請求新增了攔截器,如果沒有使用者資訊和權限資訊就重新取得使用者資訊和權限(getAdminInfo)
這裡回傳的是使用者所有的權限而不是角色,使用者動態產生前端路由
asyncRoutes為動態產生的權限,如果使用者的權限和路由的權限對應,則顯示;
common:資料操作,資料緩存,事務操作
admin只做controller,用於處理使用者請求和後台業務之間的轉送。 (why這樣設計呢?)because有些中間件系統需要用RPC框架做請求轉發,because有些機密系統不屑於用springMVC而是選擇vertx自主開發請求層。
使用Maven繼承管理專案依賴。 Modules裡面透過dependencyManagement引入依賴並指定版本,子項目繼承Modules,引入依賴不需要指定版本
全域日誌處理
使用者操作日誌,採用註解的方法。如果此方法需要記錄操作日誌,只需在方法名稱上面新增**@OperateLog**註解即可。
@ OperateLog
@ ApiOperation ( value = "登出" , notes = "登出" )
@ GetMapping ( Route . Admin . adminLogout )
public ResponseDate adminLogout ( HttpServletRequest httpServletRequest ) {
AdminInfoDTO adminInfoDTO = AdminTool . getAdminUser ( httpServletRequest );
AdminUser adminUser = adminUserMapper . selectByPrimaryKey ( adminInfoDTO . getAdminUk ());
adminUser . setNowToken ( "log-out" );
int result = adminUserService . updateAdminToken ( adminUser );
return ResponseDate . builder ()
. success ( result == 1 )
. build ();
}