写在前面:
工作原因需要找现成的框架进行二次开发,在网上找了许多对比,最终选择了若依框架的前后端分离版本,除了更符合开发需要以外,若依基于注解权限控制的功能也是非常实用,本文将介绍的重点放在后端上面,若有不足之处欢迎指正。
目录
一、后端梳理
1、使用介绍
后端主要使用SpringBoot作为项目的基本框架,SpringSecurity作为项目安全控制框架,控制用户的登录和权限认证。整体来说项目精简上手比较快,且SpringBoot内嵌tomcat,可以直接打成jar包通过java -jar的方式运行项目,但相对shiro来说,该安全框架可能较为复杂,但内容更为丰富完善。
2、项目包介绍
com.ruoyi
├── common // 工具类
│ └── annotation // 自定义注解
│ └── config // 全局配置
│ └── constant // 通用常量
│ └── core // 核心控制
│ └── enums // 通用枚举
│ └── exception // 通用异常
│ └── filter // 过滤器处理
│ └── utils // 通用类处理
├── framework // 框架核心
│ └── aspectj // 注解实现
│ └── config // 系统配置
│ └── datasource // 数据权限
│ └── interceptor // 拦截器
│ └── manager // 异步处理
│ └── security // 权限控制
│ └── web // 前端控制
├── ruoyi-generator // 代码生成(可移除)
├── ruoyi-quartz // 定时任务(可移除)
├── ruoyi-system // 系统代码
├── ruoyi-admin // 后台服务
├── ruoyi-xxxxxx // 其他模块
以上是官网给出的后端包的分布,业务代码主要是放在admin中的controller中,根据实际需要可以移除自动代码生成包和定时任务包,如果只是简单项目二次开发的话可以保留原有的数据处理流程方法,只需要对权限进行自定义控制。
3、权限控制
在若依框架中,权限是通过前端注解+后端注解+角色权限字符同时控制的,通过@PreAuthorize注解去匹配新增角色时的权限字符从而判断是否展示按钮或菜单栏。
4、用户信息获取
用户登录成功后,将用户基本信息cookies存放在header中,后端通过SpringSecurity框架去获取cookies解析用户信息,避免实际业务中重复去返回用户信息。只需要直接调用getLoginUser()方法即可获取。
//获取缓存中的用户信息
LoginUser loginUser = getLoginUser();
SysUser sysUser = loginUser.getUser();
5、分页实现
后端分页实现逻辑简单,只需要调用startPage()方法,紧跟着数据查询语句返回list后,放入getDataTable()方法return给前端即可配合前端实现数据分页。
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(User user)
{
startPage(); // 此方法配合前端完成自动分页
List<User> list = userService.selectUserList(user);
return getDataTable(list);
6、导出实现
通过给实体类或者自定义vo添加@Excel注解来指定需要导出文件的中文名和类型格式,再通过创建ExcelUtil工具类,调用exportExcel方法,传入需要导出的list并指定文件名称返回给前端即可实现导出功能。
@PostMapping("/export")
@ResponseBody
public AjaxResult export(User user)
{
List<User> list = userService.selectUserList(user);
ExcelUtil<User> util = new ExcelUtil<User>(User.class);
return util.exportExcel(list, "用户数据");
}
7、事务管理
若依框架的事务回滚是我个人最喜欢的,不需要进行额外的配置,官网中是这样描述的:
新建的Spring Boot
项目中,一般都会引用spring-boot-starter
或者spring-boot-starter-web
,而这两个起步依赖中都已经包含了对于spring-boot-starter-jdbc
或spring-boot-starter-data-jpa
的依赖。 当我们使用了这两个依赖的时候,框架会自动默认分别注入DataSourceTransactionManager
或JpaTransactionManager
。 所以我们不需要任何额外配置就可以用@Transactional
注解进行事务的使用。
我们只需要将@Transactional注解添加再可见度为public的方法上即可,就能实现遇见异常实现事务自动回滚。
@Transactional
public int insertUser(User user)
{
// 新增用户信息
int rows = userMapper.insertUser(user);
// 新增用户岗位关联
insertUserPost(user);
// 新增用户与角色管理
insertUserRole(user);
return rows;
}
值得注意的是,spring中的默认事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚,简单来说如果是sql异常导致的某条更新或者删除失败,而其他修改又成功了的话是不会回滚事务的,处理方法也很简单,想针对检查异常进行事务回滚,可以在@Transactional注解中使用rollbackFor属性指定异常。
@Transactional(rollbackFor = Exception.class)
public int insertUser(User user) throws Exception
{
// 新增用户信息
int rows = userMapper.insertUser(user);
// 新增用户岗位关联
insertUserPost(user);
// 新增用户与角色管理
insertUserRole(user);
// 模拟抛出SQLException异常
boolean flag = true;
if (flag)
{
throw new SQLException("发生异常了..");
}
return rows;
}
8、防止重复提交
对于增删改接口需要设置防重复提交,避免脏数据影响项目正常运行,只需要在接口上添加@RepeatSubmit注解,设定interval间隔时间和message提示时间即可实现防重复代码提交。
@RepeatSubmit(interval = 1000, message = "请求过于频繁")
public AjaxResult addSave(...)
{
return success(...);
}
9、感想
使用该框架开发已经快有4个月了,从一年前的开始了解到现在的上手做,并没有想象中的那么难以开头,反而给我一种水到渠成的感觉,现在网上的框架五花八门,不一定若依是最好的,但却是目前最适合我的,未来随着深入还会不间断更新。
以上。