若依权限分类
菜单权限
用户登录系统后能看到哪些菜单
在创建角色的时候可以设定该角色能看到哪些菜单
按钮权限
用户在一个页面上能看到哪些按钮
接口权限
用户带着认证信息请求后端接口,是否有权限访问,该接口和前端页面上的按钮一一对应
前端将按钮隐藏后如果后端不做限制直接通过接口访问也会出问题故也应加上接口权限
数据权限
用户有权限访问后端某个接口,但是不同的用户相同的接口相同的入参,根据权限大小不同,返回的结果应当不一样;权限大的能够看到的数据更多;比如不同部门登录进来只能看到本部门的相关内容
权限有:
①全部数据权限(admin账户)后面不拼接SQL
②部门数据权限,后面拼上【d.dept_id =user.getDeptId() 】、
③部门及以下数据权限,后面拼上【d.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = user.getDeptId() or find_in_set( {} , ancestors ) )】、
④仅本人数据权限,后面拼上【u.user_id =user.getUserId()】、
⑤自定义数据权限,后面拼上【d.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = role.getRoleId() )】
实现方式:在service层代码中加上注解@DataScope(deptAlias = "d", userAlias = "u")并在对应的sql语句后面加上 ${params.dataScope}即可实现;其中@DataScope为一自定义AOP相关注解具体实现在通知里。
AOP
若依框架中对于AOP的使用
Ⅰ、数据权限
定义了DataScopeAspect切面
自定义了@DataScope注解使得打上该注解后在注解的方法执行之前都会执行下面代码
@Before("@annotation(controllerDataScope)")
public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable
{
clearDataScope(point);
handleDataScope(point, controllerDataScope);
}
Ⅱ、登录日志
定义了LogAspect切面
自定义了@Log注解使得打上该注解后在注解的方法执行后都会执行下面代码
/**
* 处理完请求后执行
*
* @param joinPoint 切点
*/
@AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
{
handleLog(joinPoint, controllerLog, null, jsonResult);
}
等等这里不过多赘述。
Controller层统一继承BaseController
Ⅰ、对于分页查询统一返回 TableDataInfo
1、在startPage() 方法中完成对前端传来的分页参数进行获取,默认当前页为第1页,页大小为10;之后利用 PageHelper.startPage() 方法进行分页操作。
2、查询数据库得到相应的结果集
3、在 getDataTable() 方法中完成参数的封装
Ⅱ、对于增删改操作统一返回 AjaxResult
这样在返回前会对影响的行数进行判断,只有影响的行数大于零才表示成功否则失败
实体类统一继承BaseEntity
BaseEntity中有创建时间、创建者、更新时间、更新者、remark(备注)、params(数据范围过滤参数)、以及searchValue(搜索值)
1、params属性在项目中的应用
Ⅰ、路径请求参数
这样在查询所有时加上查询条件通过 params.字段就可以传给后端 目前所知用在日期筛选上
%5B==>[
%5D==>]
后端接收到后在xml文件中进行判断并拼接SQL
用postman等工具测试时也应该像上面的URL一样例如:
Ⅱ、数据范围过滤
具体为