本项目是使用SpringBoot2构建的一套基于RBAC权限模型的后台管理系统,前端是微信小程序。
项目地址:
https://github.com/fuyunwang/DrivingAgency
项目的缘由
最近接了个外包,主要是针对于驾校开发一个代理小程序。目的是为了方便驾校的管理来招揽学员,同时方便维护学员和代理信息。
项目介绍
项目业务功能介绍
本项目的业务需求比较少,是一个传统项目,核心的业务点是权限管理,这里我就采用比较规范的RBAC权限模型来开发。由于项目比较小,这里我就没有采用Shiro或SpringSecurity等权限管理框架,而是自己使用过滤器开发了一套。我认为这可以算是权限管理的雏形,如果有更复杂的权限管理需求,可以很方便的基于此扩展。
- 管理员角色为最高权限,账户为admin,初始密码为123456。
- 管理员可以创建一级代理、添加学员。
- 一级代理可以创建二级代理、添加学员。但是一级代理创建的代理和学员初始为未审核状态,只有超管才能审核
- 二级代理只有在审核通过后才能添加学员且二级代理不能创建代理。
- 针对每个代理获取其下的所有学员,如果是超管或一级代理获取其添加学员的同时获取其下子代理的学员。
- 排行榜系统。根据每个代理所添加的代理或学员数(包括子代理的学员数)来确定代理的业绩。获得日业绩排行和总业绩排行
- 针对排行榜中的代理进行点赞和评论。
技术实现
- 首先认证方面,我这里仍然采用jwt token的认证方式。这里我默认实现了记住密码的功能。即用户第一次登陆成功之后返回一个token在response header中,该token的有效期为2小时,服务器端我保存一个有效期为1周的refresh token。用户在2个小时之内登录不会返回token,2个小时和一周之内第一次携带过期token我会返回新的token在response header。一周之外refresh token失效,这里需要用户重新登录。 这里我也是借鉴了别人的思路:https://segmentfault.com/a/1190000013151506
- 权限管理方面,我这里共用了4张表,其实基准的RBAC权限模型最少要5张表。这里比较简单,所以我主要是用户表、角色表、权限表以及权限角色表。用户和角色是一对一的关联关系、角色和权限是一对多的关系。表结构如下:
![e1ad148af08e41bb2d4af935dd0b5dd1.png](https://i-blog.csdnimg.cn/blog_migrate/40a160c76567d54e627d845af41b9b26.jpeg)
![3e35e98f6171642effd8880c10d293ac.png](https://i-blog.csdnimg.cn/blog_migrate/fe226bff5f1e082e2d0b92fe545f4940.jpeg)
- Filter实现权限过滤。这里比较简单,但是记录一个比较鸡肋的事。就是在SpringBoot中使用Filter时,SpringBoot提供了 @ServletComponentScan(basePackages="com.beautifulsoup.driving")和 @WebFilter及 @Order注解,但是这里的 @Order并不能实现多个Filter的顺序性,无奈我只能采用 FilterRegistrationBean来注入Filter,同时请求第一步进入的是Filter且其不被Spring管理,故而不能通过 @Autowired注解只能构造方法注入。Filter内部用ThreadLocal保存用户信息,校验用户的权限,ThreadLocal作为线程级别对象,对于SpringSecurity中的用户信息保存也是基于此的。
- 数据访问层,这里我使用的Spring Data。包括Spring Data Jpa和Spring Data Mongodb。传统项目没必要针对SQL做太多优化,这里我就纯ORM。
- 排行榜系统,仍然是记录用户添加代理和学员之后记录入Redis。ZSET记录用户的日业绩和总业绩,然后将前10名从Hash中返回,提升效率。
- 点赞仍然使用Redis维护代理的点赞数、评论数据入Redis。
- 导出Excel,方便管理员维护代理和学员数据,这里采用Apache POI
小程序界面展示:
![c9b6fee5c3390c1265075075e7442cda.png](https://i-blog.csdnimg.cn/blog_migrate/22e928547118f1e04b7f2e136ef542d9.jpeg)
![c8f7aff3a6bc6f26eaef8a7f7de76dcc.png](https://i-blog.csdnimg.cn/blog_migrate/28b102f1c18a6fb68015ba410d4a9090.jpeg)
![9f18c8567ebbd848fd8968172cbca3b6.png](https://i-blog.csdnimg.cn/blog_migrate/807c2b201d0431b7ea99fc911f1a3c11.jpeg)
![2aae25b4ec1bcf090e045304d05a1f8d.png](https://i-blog.csdnimg.cn/blog_migrate/0289894c27129531ae4900f13ef1f455.jpeg)
![59374d398acdaaac9966e089ae8a9a29.png](https://i-blog.csdnimg.cn/blog_migrate/ce005a728c3ec6b4116c4f8f4d8f11bd.jpeg)
接口文档:
文档地址:
https://github.com/fuyunwang/DrivingAgency/wiki/%E9%A9%BE%E6%A0%A1%E4%BB%A3%E7%90%86%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%90%8E%E7%AB%AFAPI%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3#25%E7%BB%99%E6%8C%87%E5%AE%9A%E4%BB%A3%E7%90%86%E8%AF%84%E8%AE%BA
例子:
![8264669f1089214d4e3640b8cd3b5527.png](https://i-blog.csdnimg.cn/blog_migrate/c1644060a4aaf7a9872c3f23dbe3002e.jpeg)
技术包括
- Spring Boot 2.1.3
- Spring Data Jpa
- Spring Data Redis
- Spring Data Mongodb
- Spring Boot Mail
- Swagger
- Quartz
- JWT Token
- FastDFS
- apache poi
要点
- 热点数据入Redis,提高SQL的查询性能
- 认证采用Jwt Token+Refresh Token+黑名单策略,提高用户体验
- 权限管理采用规范的RBAC权限模型
- 点赞、排行等数据入Redis,每天进行一次Quartz任务调度,Redis中数据落库
- 评论、发布公告等信息入Mongodb,便于存储、操作
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注
作者:城风
地址:https://juejin.im/post/5ca1b08fe51d455201119177