feat(framework): 添加数据权限注解并优化相关功能

- 新增 @DataPermission 注解用于方法级别数据权限控制
- 在多个控制器中添加 @DataPermission 注解以启用数据权限
- 优化部分实体类和 Mapper XML 文件以支持数据权限
- 重构部分查询方法以适应数据权限控制
This commit is contained in:
zhuangtianxiang 2025-01-21 18:19:53 +08:00
parent 94a97f3568
commit 24b7b4093a
16 changed files with 41 additions and 9 deletions

View File

@ -2,6 +2,9 @@ package com.zsc.edu.gateway.framework.mybatisplus;
import java.lang.annotation.*; import java.lang.annotation.*;
/**
* @author vertoryao
*/
@Target(ElementType.METHOD) @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Documented @Documented

View File

@ -7,7 +7,6 @@ import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression; import net.sf.jsqlparser.expression.operators.relational.InExpression;

View File

@ -2,7 +2,6 @@ package com.zsc.edu.gateway.framework.mybatisplus;
import com.baomidou.mybatisplus.annotation.IEnum; import com.baomidou.mybatisplus.annotation.IEnum;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum DataScopeType implements IEnum<Integer> { public enum DataScopeType implements IEnum<Integer> {

View File

@ -1,6 +1,7 @@
package com.zsc.edu.gateway.modules.iot.device.controller; package com.zsc.edu.gateway.modules.iot.device.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.modules.iot.device.dto.BatchDeviceDto; import com.zsc.edu.gateway.modules.iot.device.dto.BatchDeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto; import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceServeDto; import com.zsc.edu.gateway.modules.iot.device.dto.DeviceServeDto;
@ -63,6 +64,7 @@ public class DeviceController {
/** /**
* 分页查询设备 * 分页查询设备
*/ */
@DataPermission
@GetMapping @GetMapping
@PreAuthorize("hasAuthority('iot:device:query')") @PreAuthorize("hasAuthority('iot:device:query')")
public Page<Device> query(Page<Device> page, DeviceQuery query) { public Page<Device> query(Page<Device> page, DeviceQuery query) {

View File

@ -90,6 +90,7 @@ public class Device extends BaseEntity {
@TableField(exist = false) @TableField(exist = false)
public Product product; public Product product;
public enum Status implements IEnum<Integer>, IState<Status> { public enum Status implements IEnum<Integer>, IState<Status> {
UNACTIVATED(0, "未激活"), UNACTIVATED(0, "未激活"),
LOCKED(1, "已锁定"), LOCKED(1, "已锁定"),

View File

@ -1,6 +1,7 @@
package com.zsc.edu.gateway.modules.message.controller; package com.zsc.edu.gateway.modules.message.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.message.dto.BulletinDto; import com.zsc.edu.gateway.modules.message.dto.BulletinDto;
import com.zsc.edu.gateway.modules.message.entity.Bulletin; import com.zsc.edu.gateway.modules.message.entity.Bulletin;
@ -42,6 +43,7 @@ public class BulletinController {
* @param query 查询表单 * @param query 查询表单
* @return 分页数据 * @return 分页数据
*/ */
@DataPermission
@GetMapping("/self") @GetMapping("/self")
public Page<Bulletin> getBulletins(Page<Bulletin> page, BulletinQuery query) { public Page<Bulletin> getBulletins(Page<Bulletin> page, BulletinQuery query) {
query.setState(Bulletin.State.publish); query.setState(Bulletin.State.publish);
@ -66,7 +68,8 @@ public class BulletinController {
* @param query 查询参数 * @param query 查询参数
* @return 分页数据 * @return 分页数据
*/ */
@GetMapping() @DataPermission
@GetMapping
@PreAuthorize("hasAuthority('message:bulletin:query')") @PreAuthorize("hasAuthority('message:bulletin:query')")
public Page<Bulletin> query(Page<Bulletin> page, BulletinQuery query) { public Page<Bulletin> query(Page<Bulletin> page, BulletinQuery query) {
return service.page(page, query.wrapper()); return service.page(page, query.wrapper());

View File

@ -2,6 +2,7 @@ package com.zsc.edu.gateway.modules.message.controller;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.message.dto.UserNoticeDto; import com.zsc.edu.gateway.modules.message.dto.UserNoticeDto;
import com.zsc.edu.gateway.modules.message.query.AdminNoticeQuery; import com.zsc.edu.gateway.modules.message.query.AdminNoticeQuery;
@ -47,6 +48,7 @@ public class UserNoticeController {
* @param query 查询参数 * @param query 查询参数
* @return 分页数据 * @return 分页数据
*/ */
@DataPermission(tableAlias = "su")
@GetMapping("/self") @GetMapping("/self")
public IPage<UserNoticeVo> selfPage(Page<UserNoticeVo> pageParam, @AuthenticationPrincipal UserDetailsImpl userDetails, UserNoticeQuery query) { public IPage<UserNoticeVo> selfPage(Page<UserNoticeVo> pageParam, @AuthenticationPrincipal UserDetailsImpl userDetails, UserNoticeQuery query) {
query.userId = userDetails.id; query.userId = userDetails.id;
@ -106,6 +108,7 @@ public class UserNoticeController {
* @param query 查询参数 * @param query 查询参数
* @return 分页数据 * @return 分页数据
*/ */
@DataPermission(tableAlias = "su")
@GetMapping @GetMapping
@PreAuthorize("hasAuthority('message:notice:query')") @PreAuthorize("hasAuthority('message:notice:query')")
public IPage<AdminNoticeVo> page(Page<AdminNoticeVo> page, AdminNoticeQuery query) { public IPage<AdminNoticeVo> page(Page<AdminNoticeVo> page, AdminNoticeQuery query) {

View File

@ -1,11 +1,15 @@
package com.zsc.edu.gateway.modules.message.query; package com.zsc.edu.gateway.modules.message.query;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.modules.message.entity.Bulletin;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Objects;
/** /**
* @author zhuang * @author zhuang
@ -35,4 +39,5 @@ public class AdminNoticeQuery {
*/ */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime createAtEnd; public LocalDateTime createAtEnd;
} }

View File

@ -3,6 +3,7 @@ package com.zsc.edu.gateway.modules.system.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.exception.ConstraintException; import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.dto.DeptDto;
import com.zsc.edu.gateway.modules.system.entity.Dept; import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.User; import com.zsc.edu.gateway.modules.system.entity.User;
@ -29,11 +30,12 @@ public class DeptController {
private final UserService userService; private final UserService userService;
/** /**
* 返回管理部门列表 hasAuthority('SYSTEM:DEPT:QUERY') * 返回管理部门分页 hasAuthority('SYSTEM:DEPT:QUERY')
* *
* @param query 查询表单 * @param query 查询表单
* @return 部门列表 * @return 部门列表
*/ */
@DataPermission
@GetMapping @GetMapping
@PreAuthorize("hasAuthority('system:dept:query')") @PreAuthorize("hasAuthority('system:dept:query')")
public Page<Dept> query(DeptQuery query, Page<Dept> page) { public Page<Dept> query(DeptQuery query, Page<Dept> page) {

View File

@ -1,5 +1,6 @@
package com.zsc.edu.gateway.modules.system.controller; package com.zsc.edu.gateway.modules.system.controller;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.system.dto.MenuDto; import com.zsc.edu.gateway.modules.system.dto.MenuDto;
import com.zsc.edu.gateway.modules.system.entity.Menu; import com.zsc.edu.gateway.modules.system.entity.Menu;
@ -52,6 +53,7 @@ public class MenuController {
/** /**
* 根据名字返回树 * 根据名字返回树
*/ */
@DataPermission
@GetMapping("/tree") @GetMapping("/tree")
@PreAuthorize("hasAuthority('system:menu:query')") @PreAuthorize("hasAuthority('system:menu:query')")
public List<MenuVo> tree(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestParam String name) { public List<MenuVo> tree(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestParam String name) {

View File

@ -1,6 +1,7 @@
package com.zsc.edu.gateway.modules.system.controller; package com.zsc.edu.gateway.modules.system.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.modules.system.dto.AuthorityCreateDto; import com.zsc.edu.gateway.modules.system.dto.AuthorityCreateDto;
//import com.zsc.edu.gateway.modules.system.dto.RoleAuthCreateDto; //import com.zsc.edu.gateway.modules.system.dto.RoleAuthCreateDto;
import com.zsc.edu.gateway.modules.system.dto.RoleDto; import com.zsc.edu.gateway.modules.system.dto.RoleDto;
@ -33,6 +34,7 @@ public class RoleController {
* *
* @return 所有角色列表 * @return 所有角色列表
*/ */
@DataPermission
@GetMapping @GetMapping
@PreAuthorize("hasAuthority('system:role:query')") @PreAuthorize("hasAuthority('system:role:query')")
public Page<Role> query(RoleQuery query, Page<Role> page) { public Page<Role> query(RoleQuery query, Page<Role> page) {

View File

@ -3,6 +3,7 @@ package com.zsc.edu.gateway.modules.system.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.system.dto.UserCreateDto; import com.zsc.edu.gateway.modules.system.dto.UserCreateDto;
import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdateDto; import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdateDto;
@ -110,6 +111,7 @@ public class UserController {
* @param page 分页 * @param page 分页
* @return 分页用户信息 * @return 分页用户信息
*/ */
@DataPermission
@GetMapping @GetMapping
@PreAuthorize("hasAuthority('system:user:query')") @PreAuthorize("hasAuthority('system:user:query')")
public Page<User> query(UserQuery query, Page<User> page) { public Page<User> query(UserQuery query, Page<User> page) {

View File

@ -28,6 +28,11 @@ public class BaseEntity implements Serializable {
*/ */
public String remark; public String remark;
/**
* 创建者ID
*/
public Long createId;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@ -15,6 +15,7 @@
<result column="create_time" jdbcType="DATE" property="createTime"/> <result column="create_time" jdbcType="DATE" property="createTime"/>
<result column="update_time" jdbcType="DATE" property="updateTime"/> <result column="update_time" jdbcType="DATE" property="updateTime"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/> <result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="create_id" jdbcType="BIGINT" property="createId"/>
<collection property="params" ofType="com.zsc.edu.gateway.modules.iot.tsl.entity.Param" autoMapping="true" <collection property="params" ofType="com.zsc.edu.gateway.modules.iot.tsl.entity.Param" autoMapping="true"
columnPrefix="param_"> columnPrefix="param_">
<id column="id" property="id"/> <id column="id" property="id"/>

View File

@ -49,9 +49,12 @@
<select id="page" resultType="com.zsc.edu.gateway.modules.message.vo.UserNoticeVo" resultMap="userNoticeMap"> <select id="page" resultType="com.zsc.edu.gateway.modules.message.vo.UserNoticeVo" resultMap="userNoticeMap">
select sun.*,sn.*,su.username,su.address,su.avatar,su.name select sun.*,sn.*,su.username,su.address,su.avatar,su.name
from sys_user_notice sun FROM
left join sys_user su on sun.user_id = su.id sys_user su
left join sys_notice sn on sn.id = sun.notice_id LEFT JOIN
sys_user_notice sun ON sun.user_id = su.id
LEFT JOIN
sys_notice sn ON sn.id = sun.notice_id
<where> <where>
<if test="query.userId != null"> <if test="query.userId != null">
AND sun.user_id = #{query.userId} AND sun.user_id = #{query.userId}
@ -85,9 +88,9 @@
COUNT(DISTINCT sun.user_id) AS user_count, -- 统计用户的关联数量 COUNT(DISTINCT sun.user_id) AS user_count, -- 统计用户的关联数量
SUM(CASE WHEN sun.is_read = true THEN 1 ELSE 0 END) AS read_count -- 统计已读数量 SUM(CASE WHEN sun.is_read = true THEN 1 ELSE 0 END) AS read_count -- 统计已读数量
FROM FROM
sys_user_notice sun sys_user su
LEFT JOIN LEFT JOIN
sys_user su ON sun.user_id = su.id sys_user_notice sun ON sun.user_id = su.id
LEFT JOIN LEFT JOIN
sys_notice sn ON sn.id = sun.notice_id sys_notice sn ON sn.id = sun.notice_id
<where> <where>

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB