springboot判断有没有库_SpringBoot前后端分离后台管理系统分析,真香

来源:https://mp.weixin.qq.com/s/TJwh1YrUmEDRCwYHcXl3Vg

有很多读者都希望我出一些详细介绍 Java 实战类项目的文章,毕竟项目实战经验还是挺重要的,不论是对于找工作还是提高个人工程能力。我自己也发现很多读者不怎么会学习开源项目,不知道如何把开源项目的一些精华为自己所用。

我们这里分析的是 eladmin[1] 这个基于 Spring Boot + Spring Security +JPA +Vue 的前后端分离的后台管理系统。

荐过这个项目。

20674ff8b64ac7ed1c79993be8aa7087.png

后台首页

开源工具库

这部分简单分析一下项目使用到的一些比较有用的开源工具库:MapStruct(Java 对象映射框架)OSHI(基于 JNA 的操作系统和硬件信息库)Hutool(Java 工具类库)

MapStruct

MapStruct[2] 不仅能够在 bean 之间复制属性,还能够在不同类型之间自动转换。

1db036b61a936c9d8848bc357142cc4a.png

相比于其他常见的映射框架, Dozer、Orika、ModelMapper、JMapper,MapStruct 的性能更好。

OSHI

OSHI[5] 是一款为 Java 语言提供的基于 JNA 的(本机)操作系统和硬件信息库。

通过 OSHI ,我们不需要安装任何其他本机库,就能查看内存和 CPU 使用率、磁盘和分区使用情况、设备、传感器等信息。

OSHI 旨在提供一种跨平台的实现来检索系统信息,支持 Windows、Linux、MacOS、Unix 等主流操作系统。

使用 oshi 你可以轻松制作出项目常用的系统监控功能,如下图所示:

ee7e8be8463e4a38cf5837c0b5ed8082.png

Hutool

Hutool[6] 一个非常实用的 Java 工具类库,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装。

2fc047f86e791a3f9137e46c88ecdfed.png

小技巧

这部分内容会简单分析一下从这个开源项目中看到的一些亮点以及小技巧。

优化表命名

根据项目不同的 Module 作为表名的前缀,这样看起来更加直观。

901f824c8709ae5fb78d47682917fd9d.png

巧用 AOP 简化代码

AOP(Aspect-Oriented Programming:面向切面编程) 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度提高系统可拓展性和可维护性

这个项目中就大量使用了 AOP 思想。简单举两个例子吧!

日志记录

利用 AOP 方式记录日志,只需要在 controller 的方法上使用 @Log("") 注解,就可以将用户操作记录到数据库,源码可查看 eladmin-logging这个 Module。。

@Log("新增用户")@PostMapping(value = "/users")public ResponseEntity create(@Validated @RequestBody User resources){    checkLevel(resources);    return new ResponseEntity(userService.create(resources),HttpStatus.CREATED);}

Redis 限流

利用 AOP 方式对接口进行限流,只需要在 controller 的方法上使用@Limit("") 注解即可,源码可查看 eladmin-common这个 Module。

/** * 测试限流注解,下面配置说明该接口 60秒内最多只能访问 10次,保存到redis的键名为 limit_test, */@AnonymousGetMapping@ApiOperation("测试")@Limit(key = "test", period = 60, count = 10, name = "testLimit", prefix = "limit")public int test() {     return ATOMIC_INTEGER.incrementAndGet();}

基于 RBAC 的权限模块设计

系统权限控制采用 RBAC 基于角色的权限访问控制(Role-Based Access Control) 思想(一种最常见的权限管理思想,在一些对于全权限控制要求比较严格的系统会使用到)。

什么是 RBAC 呢?

简单地说:一个用户可以拥有若干角色,每一个角色有可以被分配若干权限这样,就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系,如下图

686eb76a32b112153ceb58e4a44bad95.png

RBAC

在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

本系统的权限设计相关的表如下(一共 5 张表,2 张用户建立表之间的联系):

d40a282c65fea508c400945c5ec9ecf6.png

通过这个权限模型,我们可以创建不同的角色并为不同的角色分配不同的权限范围(菜单)。

ca854a16a1a242ec18049182d260f19d.png

自定义权限验证方式

Spring Security 提供了Spring EL表达式,允许我们在定义接口的方法上面添加注解来实现权限控制。比如下面的接口表示用户拥有 admin、menu:edit 权限中的任意一个就能能访问update接口。

bcd6d3db5756274d22f197f78a64715f.png

但是,由于每个接口都需要给超级管理员放行,所以单纯使用这种注解的方式每次都需要重复的添加 admin 权限、

因此我们可以加入自定义权限验证方式,在验证的时候默认给拥有 admin 权限的用户放行。

源码:

// eladmin-common -> me.zhengjie.config.ElPermissionConfig@Service(value = "el")public class ElPermissionConfig {    public Boolean check(String ...permissions){        // 获取当前用户的所有权限        List elPermissions = SecurityUtils.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());        // 判断当前用户的所有权限是否包含接口上定义的权限        return elPermissions.contains("admin") || Arrays.stream(permissions).anyMatch(elPermissions::contains);    }}

使用方式:

@ApiOperation("查询任务执行日志")@GetMapping(value = "/logs")@PreAuthorize("@el.check('timing:list')")public ResponseEntity queryJobLog(JobQueryCriteria criteria, Pageable pageable){    return new ResponseEntity<>(quartzJobService.queryAllLog(criteria,pageable), HttpStatus.OK);}

对应的数据库内容如下:

894a09b6034dfbcd4ec41eee09c19f44.png
3ad12f85b41161797abf71bb1be7815f.png

审计功能

在这个项目中,继承了 BaseEntity 的类会自动写入创建时间、修改时间、创建人、更新人这些数据。

f7ee99fc10bd3560a180afeec9524ac1.png

简单介绍一下上面涉及到的一些注解:

  1. @CreationTimestamp : 创建对象的时候自动生成时间戳。
  2. @UpdateTimestamp:创建对象的时候自动生成时间戳。
  3. @CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候会设置值,@LastModifiedBy同理。

审计功能对应的配置类:

8e581e0d1af639bb7d0d4c4dec31871f.png

可优化点

  1. 可以考虑使用阿里开源的 easyexcel 来做 Excel 的导入导出,避免 OOM。
  2. 可以参考 《实际项目中我们是这样做异常处理的》[7] 对项目全局异常处理部分进行优化。
  3. 一些重复代码可以抽取出来,比如eladmin-common 模块中的 BaseDTO.java和 BaseEntity.java的toString()方法。
  4. 项目的 json 解析库用到了 fastjson。实际上,我更推荐使用 Spring 默认的 JSON 解析库 Jackson。这两者中, Fastjson 的代码质量以及设计更差,并且,经常被爆出有安全漏洞(设计问题)。虽然 Fastjson 在速度方面稍稍取胜,但是,速度方面的优势不太明显,影响不大。
  5. 可以使用 Caffeine 来做本地缓存。

后记

我发现很多人对于开源项目的态度就是:克隆下来就简单玩玩功能就算了。

我觉得这样不太好。你把项目克隆下来之后,首先肯定是自己体验一下系统的核心功能。体验了核心功能之后,你可以分析分析项目代码,检查一下有没有 bug,看看有没有可以优化的代码/模块,思考一下有没有需要完善的功能模块......。我在自己分析、调试这个开源项目的时候,就发现了一个小 bug 并提交了相应的 issue (目前已经被采纳)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在写一个前后端分离后台管理系统时,您可以使用 Spring Boot 作为后端框架, Vue.js 作为前端框架,MyBatis 作为数据访问框架。 首先,您需要在 Spring Boot 中配置 MyBatis,连接到数据并编写相应的 SQL 语句。然后,您可以编写后端控制器来处理 HTTP 请求,并使用 MyBatis 执行数据操作。 在前端部分,您可以使用 Vue.js 构建用户界面,并使用 Axios 等与后端进行交互。当用户在前端界面中进行操作时,Vue.js 将调用相应的函数并发送 HTTP 请求到后端。后端控制器将处理请求并返回响应,Vue.js 将使用响应更新前端界面。 总的来说,使用 Spring Boot、Vue.js 和 MyBatis 开发前后端分离后台管理系统是一个不错的选择,它们提供了良好的支持和工具,帮助您快速构建功能丰富、可扩展的后台管理系统。 ### 回答2: 要写一个前后端分离后台管理系统,首先需要明确系统的功能和需求,然后结合Spring Boot、Vue和MyBatis这三个框架进行开发。 1. 后端开发: - 使用Spring Boot搭建后台服务,配置相关依赖和基本的配置。 - 设计数据表结构,并使用MyBatis进行数据操作。 - 创建后端接口,包括用户管理、权限管理、数据查询等功能,并使用MyBatis实现相关的数据操作。 - 配置接口的权限验证,使用Spring Security进行登录认证和权限控制。 2. 前端开发: - 使用Vue框架搭建前端界面,并配置相关依赖和基本的配置。 - 设计后台管理系统的页面布局和样式,使用Vue Router进行前端路由管理。 - 实现用户登录和权限验证功能,与后端接口进行通信,使用Axios进行数据请求和响应处理。 - 开发各个功能模块的前端页面,包括用户管理、权限管理、数据查询等,并与后端接口进行数据交互。 3. 前后端协作: - 前后端的数据交互一般使用JSON格式,后端通过Spring Boot提供的@RestController注解,返回JSON格式的数据给前端。 - 前端通过Axios发送请求给后端接口,获取数据并进行处理展示。 - 前后端对接口的定义和数据格式进行约定,确保数据的有效性和一致性。 - 前后端进行联调和测试,确认系统正常运行并满足需求。 总之,使用Spring Boot、Vue和MyBatis可以很好地实现一个前后端分离后台管理系统。通过后端提供接口和数据服务,前端实现页面展示和用户操作,两者通过数据交互实现系统功能。这种架构可以提高开发效率和可维护性,实现前后端的解耦和灵活性。 ### 回答3: 将SpringBoot与Vue和MyBatis结合起来构建一个前后端分离后台管理系统可以分为以下几个步骤: 1. 创建SpringBoot项目:首先,我们需要创建一个SpringBoot项目作为后端服务。可以使用Spring Initializr快速搭建项目基础结构,并且添加所需的依赖,如Spring Web、Spring Data JPA、MyBatis等。 2. 设计数据结构:根据后台管理系统的需求,设计数据表结构,并使用MyBatis创建对应的实体类和Mapper接口。 3. 编写后端API:在SpringBoot项目中,编写对应的Controller类,实现接口的定义和业务逻辑。通过注解配置路由信息,用于定义API的访问路径和请求方式,同时接收前端传递的参数并返回相应的结果。 4. 创建Vue项目:使用Vue脚手架工具(例如Vue CLI)创建一个新的Vue项目作为前端界面。在项目初始化中选择自己喜欢的UI框架(如ElementUI),并安装需要的插件和依赖。 5. 编写前端页面:根据后台管理系统的需求,设计并编写相应的页面组件。利用Vue的组件化开发,将整个页面划分为不同的组件,并进行组件的构建和样式的设计。 6. 实现前后端数据交互:在Vue项目中,使用axios或者其他HTTP请求与后端建立请求连接,发送API请求,并接收后端返回的数据。可以使用Vue的生命周期钩子函数或者Vuex来处理数据的请求和响应。 7. 页面路由与导航:根据后台管理系统的需求,在Vue项目中设置路由信息,配置页面导航和跳转功能。可以利用Vue Router进行路由的管理和操作。 8. 测试和部署:完成以上步骤后,进行系统的单元测试和集成测试,并进行系统的部署和上线。 通过以上步骤,就可以使用SpringBoot、Vue和MyBatis构建一个前后端分离后台管理系统。前端通过Vue实现了页面的展示和交互逻辑,后端通过SpringBoot提供了API的定义和业务处理,而MyBatis则负责与数据之间的交互操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值