GloryAdmin是一個基於springboot2.1.9.RELEASE 和vue-admin-template搭建的後臺框架;html
GloryAdmin使用基於角色的權限管理。角色樹是一個以「系統管理員」爲根節點的樹,權限樹是由多個子權限樹組成。「系統管理員」擁有全部權限;非系統管理員角色能夠查看當前角色和直屬下級角色的信息,但只能增刪改直屬下級的角色的信息(直屬下級:A是B的直屬下級,則A必須爲B的孩子節點)。前端
Glory-Adminvue
項目 | 技術 |
---|---|
後端項目 | 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數據上的跨行跨表事務(爲祖國點贊)。分佈式數據庫隱藏了數據庫分庫分表的策略,智能的進行數據的分庫分表,使用起來就像操做一個數據庫同樣。
因爲內存操做和磁盤操做根本不是一個量級的,因此在大的項目中都須要對 磁盤型的數據庫 作 內存型的緩衝層,將磁盤數據緩存到內存中。數據緩存層用於緩存整個數據層的數據,加速站點訪問速度。本項目使用 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 使用。
asyncRoutes爲動態生成的權限,若是用戶的權限和路由的權限對應,則顯示;
使用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(); }