開源後臺框架、GloryAdmin、SpringBoot、vue-admin-template、角色、分佈式

Glory-Admin

GloryAdmin是一個基於springboot2.1.9.RELEASE 和vue-admin-template搭建的後臺框架;html

GloryAdmin使用基於角色的權限管理。角色樹是一個以「系統管理員」爲根節點的樹,權限樹是由多個子權限樹組成。「系統管理員」擁有全部權限;非系統管理員角色能夠查看當前角色和直屬下級角色的信息,但只能增刪改直屬下級的角色的信息(直屬下級:A是B的直屬下級,則A必須爲B的孩子節點)。前端

技術說明

項目 技術
後端項目 springboot
前端項目 Element UI & Vue.js
數據庫 MySQL
緩存 Redis

演示

演示地址github

系統架構

項目啓動

數據庫安裝

本項目使用mysql數據庫,可使用數據庫腳本建立2個數據庫 multi_module_db multi_module_db_01算法

項目啓動

後臺啓動,使用28081端口spring

前端啓動,使用9523端口sql

打開瀏覽器訪問 http://localhost:9523 admin a123456

數據庫

爲何要數據拆分?什麼是分庫分表?什麼是分佈式數據庫?

分庫分表或者 sharding 的本質是摩爾定律的失效,將數據集中存儲至單一數據節點的解決方案,在性能、可用性和運維成本這三方面已經難於知足互聯網的海量數據場景。

單數據庫不能支撐現有的業務,所以出現了分庫分表,使用多個數據庫進行數據存儲。分庫分表簡單理解就是一個籃子裏面裝的東西有限,影響了查找效率和容量,把籃子裏面的東西分紅N份,裝到不一樣的籃子裏面。從而打破容量限制,提升查詢效率。

而後咱們說一下分佈式數據庫,國內比較流行的有騰訊的TDSQL、阿里的OceanBase,PolarDB、華爲的GaussDB等。基本上都是自主研發,強一致高可用、全球部署架構、分佈式無限水平擴展、高性能,千億條記錄、數百TB數據上的跨行跨表事務(爲祖國點贊)。分佈式數據庫隱藏了數據庫分庫分表的策略,智能的進行數據的分庫分表,使用起來就像操做一個數據庫同樣。

Flyway數據庫的版本控制

數據庫緩存層cacheDao

因爲內存操做和磁盤操做根本不是一個量級的,因此在大的項目中都須要對 磁盤型的數據庫內存型的緩衝層,將磁盤數據緩存到內存中。數據緩存層用於緩存整個數據層的數據,加速站點訪問速度。本項目使用 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 使用。

  • Hint分片算法

對應 HintShardingAlgorithm,用於處理使用 Hint 行分片的場景。須要配合 HintShardingStrategy 使用。

後端

權限設計

  1. 用戶登錄獲取token,存儲到本地(adminLogin)
  2. 用戶發送token獲取用戶信息和權限信息,存儲到store裏面。因爲F5會致使store丟失,所以前端請求添加了攔截器,若是沒有用戶信息和權限信息就從新獲取用戶信息和權限(getAdminInfo)


  1. 這裏返回的是用戶全部的權限而不是角色,用戶動態生成前端路由

    asyncRoutes爲動態生成的權限,若是用戶的權限和路由的權限對應,則顯示;

項目結構

  1. common:數據操做,數據緩存,事務操做
  2. admin只作controller,用於處理用戶請求和後臺業務之間的轉發。(why這樣設計呢?)because有些中間件系統須要用RPC框架作請求轉發,because有些機密系統不屑於用springMVC而是選擇vertx自主開發請求層。

Maven使用BOM管理

使用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();
}

前端

相關文章
相關標籤/搜索