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