SpringBoot前后端分离后台管理系统分析,真香

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

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

荐过这个项目。

后台首页

开源工具库

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

MapStruct

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

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

OSHI

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

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

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

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

Hutool

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

小技巧

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

优化表命名

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

巧用 AOP 简化代码

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

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

日志记录

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

@Log("新增用户")@PostMapping(value ="/users")public ResponseEntity create(@Validated@RequestBodyUser resources){checkLevel(resources);returnnewResponseEntity(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() {returnATOMIC_INTEGER.incrementAndGet();}

基于 RBAC 的权限模块设计

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

什么是 RBAC 呢?

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

RBAC

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

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

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

自定义权限验证方式

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

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

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

源码:

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

使用方式:

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

对应的数据库内容如下:


审计功能

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

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

@CreationTimestamp : 创建对象的时候自动生成时间戳。

@UpdateTimestamp:创建对象的时候自动生成时间戳。

@CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候会设置值,@LastModifiedBy同理。

审计功能对应的配置类:

可优化点

可以考虑使用阿里开源的 easyexcel 来做 Excel 的导入导出,避免 OOM。

可以参考 《实际项目中我们是这样做异常处理的》[7] 对项目全局异常处理部分进行优化。

一些重复代码可以抽取出来,比如eladmin-common 模块中的 BaseDTO.java和 BaseEntity.java的toString()方法。

项目的 json 解析库用到了 fastjson。实际上,我更推荐使用 Spring 默认的 JSON 解析库 Jackson。这两者中, Fastjson 的代码质量以及设计更差,并且,经常被爆出有安全漏洞(设计问题)。虽然 Fastjson 在速度方面稍稍取胜,但是,速度方面的优势不太明显,影响不大。

可以使用 Caffeine 来做本地缓存。

后记

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354