Compare commits

..

No commits in common. "24b7b4093a759d2f36fc03851f7478ea6112a008" and "e06bdeba1e9f186143d28f37fa5c001be02aefeb" have entirely different histories.

30 changed files with 75 additions and 376 deletions

View File

@ -36,11 +36,6 @@
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>

View File

@ -31,7 +31,7 @@ public class TreeUtil {
}
/**
* 将树打平成list
* 将树打平成tree
*
* @param tree 需要打平的树
* @param getSubChildren 设置下级数据方法Menu::getSubMenus,x->x.setSubMenus(null)
@ -125,9 +125,6 @@ public class TreeUtil {
}
private static <E> List<E> makeChildren(E parent, List<E> allData, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> children) {
return allData.stream()
.filter(x -> parentCheck.apply(parent, x))
.peek(x -> children.accept(x, makeChildren(x, allData, parentCheck, children)))
.collect(Collectors.toList());
return allData.stream().filter(x -> parentCheck.apply(parent, x)).peek(x -> children.accept(x, makeChildren(x, allData, parentCheck, children))).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,25 @@
package com.zsc.edu.gateway.framework.jackson;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.text.SimpleDateFormat;
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder.serializationInclusion(JsonInclude.Include.NON_NULL)
.serializationInclusion(JsonInclude.Include.NON_EMPTY);
}
}

View File

@ -1,25 +0,0 @@
package com.zsc.edu.gateway.framework.mybatisplus;
import java.lang.annotation.*;
/**
* @author vertoryao
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataPermission {
/**
* 目标表的别名
*/
String tableAlias() default "";
/**
* 部门表的别名
*/
String deptAlias() default "dept_id";
/**
* 用户表的别名
*/
String userAlias() default "create_id";
}

View File

@ -1,18 +0,0 @@
package com.zsc.edu.gateway.framework.mybatisplus;
public class DataPermissionContext {
private static final ThreadLocal<DataPermission> contextHolder = new ThreadLocal<>();
public static void set(DataPermission dataPermission) {
contextHolder.set(dataPermission);
}
public static DataPermission get() {
return contextHolder.get();
}
public static void clear() {
contextHolder.remove();
}
}

View File

@ -1,44 +0,0 @@
package com.zsc.edu.gateway.framework.mybatisplus;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 数据权限注解切面
*/
@Aspect
@Component
public class DataScopeAspect {
/**
* 环绕通知拦截带有 @DataPermission 注解的方法
* @param joinPoint
* @throws Throwable
*/
@Around("@annotation(DataPermission)()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 获取方法上的 @DataPermission 注解
DataPermission dataPermission = method.getAnnotation(DataPermission.class);
if (dataPermission != null) {
// 将注解信息存储在上下文中 MyBatis 拦截器使用
DataPermissionContext.set(dataPermission);
}
try {
// 执行目标方法
return joinPoint.proceed();
} finally {
// 方法执行完毕清除数据权限上下文避免内存泄露
DataPermissionContext.clear();
}
}
}

View File

@ -1,129 +0,0 @@
package com.zsc.edu.gateway.framework.mybatisplus;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
import com.zsc.edu.gateway.framework.security.SecurityUtil;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import java.lang.reflect.Method;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 数据权限拼装逻辑处理
*
*/
@Slf4j
public class DataScopeHandler implements MultiDataPermissionHandler {
/**
* 获取数据权限 SQL 片段
* <p> {@link MultiDataPermissionHandler#getSqlSegment(Table, Expression, String)} 方法不能覆盖原有的 where 数据如果 return null 则表示不追加任何 where 条件</p>
*
* @param table 所执行的数据库表信息可以通过此参数获取表名和表别名
* @param where 原有的 where 条件信息
* @param mappedStatementId Mybatis MappedStatementId 根据该参数可以判断具体执行方法
* @return JSqlParser 条件表达式返回的条件表达式会拼接在原有的表达式后面不会覆盖原有的表达式
*/
@Override
public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {
// try {
// 获取当前线程中的数据权限信息
DataPermission dataPermission = DataPermissionContext.get();
if (Objects.isNull(dataPermission)) {
return null;
}
return buildDataScopeByAnnotation(dataPermission);
}
/**
* DataScope注解方式拼装数据权限
* @param dataScope
* @return
*/
private Expression buildDataScopeByAnnotation(DataPermission dataScope) {
UserDetailsImpl userInfo = SecurityUtil.getUserInfo();
if (userInfo == null) {
return null;
}
Set<Long> dataScopeDeptIds = userInfo.getDataScopeDeptIds();
DataScopeType dataScopeType = userInfo.getRole().getDataScope();
// 本人ID
Long dataScopeCreateId = userInfo.getId();
// 本人部门ID
Long deptId = userInfo.getDept().getId();
// 表别名
String tableAlias = dataScope.tableAlias();
// 部门限制范围的字段名称
String deptAlias = dataScope.deptAlias();
// 本人限制范围的字段名称
String userAlias = dataScope.userAlias();
// 拼装数据权限
return switch (dataScopeType) {
// 全部数据权限
case DATA_SCOPE_ALL -> null;
// 本部门数据权限, 构建部门eq表达式
case DATA_SCOPE_DEPT -> equalsTo(tableAlias, deptAlias, deptId);
// 本部门及以下数据权限构建部门in表达式
case DATA_SCOPE_DEPT_AND_CHILD -> inExpression(tableAlias, deptAlias, dataScopeDeptIds);
// 本人数据权限构建本人eq表达式
case DATA_SCOPE_SELF -> equalsTo(tableAlias, userAlias, dataScopeCreateId);
};
}
/**
* 构建eq表达式
* @param tableAlias 表别名
* @param itemAlias 字段别名
* @param itemId id
* @return
*/
private EqualsTo equalsTo(String tableAlias, String itemAlias, Long itemId) {
if (Objects.nonNull(itemId)) {
EqualsTo equalsTo = new EqualsTo();
equalsTo.withLeftExpression(buildColumn(tableAlias, itemAlias));
equalsTo.setRightExpression(new LongValue(itemId));
return equalsTo;
} else {
return null;
}
}
private InExpression inExpression(String tableAlias, String itemAlias, Set<Long> itemIds) {
if (!itemIds.isEmpty()) {
InExpression deptIdInExpression = new InExpression();
ParenthesedExpressionList<LongValue> deptIds = new ParenthesedExpressionList<>(itemIds.stream().map(LongValue::new).collect(Collectors.toList()));
deptIdInExpression.withLeftExpression(buildColumn(tableAlias, itemAlias));
deptIdInExpression.setRightExpression(deptIds);
return deptIdInExpression;
} else {
return null;
}
}
/**
* 构建Column
*
* @param tableAlias 表别名
* @param columnName 字段名称
* @return 带表别名字段
*/
public static Column buildColumn(String tableAlias, String columnName) {
if (StringUtils.isNotEmpty(tableAlias)) {
columnName = tableAlias + "." + columnName;
}
return new Column(columnName);
}
}

View File

@ -1,35 +0,0 @@
package com.zsc.edu.gateway.framework.mybatisplus;
import com.baomidou.mybatisplus.annotation.IEnum;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum DataScopeType implements IEnum<Integer> {
/**
* 全部数据权限
*/
DATA_SCOPE_ALL(1),
/**
* 部门数据权限
*/
DATA_SCOPE_DEPT(2),
/**
* 部门及以下数据权限
*/
DATA_SCOPE_DEPT_AND_CHILD(3),
/**
* 仅个人数据权限
*/
DATA_SCOPE_SELF(4);
/**
* 自定义数据权限
*/
// DATA_SCOPE_CUSTOM(5);
private final int value;
@Override
public Integer getValue() {
return this.value;
}
}

View File

@ -2,9 +2,7 @@ package com.zsc.edu.gateway.framework.mybatisplus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -15,15 +13,18 @@ import org.springframework.context.annotation.Configuration;
@MapperScan(basePackages = "com.zsc.edu.gateway.modules.**.repo")
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加数据权限插件
DataPermissionInterceptor dataPermissionInterceptor = new DataPermissionInterceptor(new DataScopeHandler());
// 添加自定义的数据权限处理器
interceptor.addInnerInterceptor(dataPermissionInterceptor);
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
// // 添加数据权限插件
// MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor();
// // 添加自定义的数据权限处理器
// dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
// interceptor.addInnerInterceptor(dataPermissionInterceptor);
return interceptor;
}
}

View File

@ -1,8 +1,6 @@
package com.zsc.edu.gateway.framework.security;
import com.zsc.edu.gateway.common.util.TreeUtil;
import com.zsc.edu.gateway.exception.StateException;
import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.Menu;
import com.zsc.edu.gateway.modules.system.entity.RoleAuthority;
import com.zsc.edu.gateway.modules.system.entity.User;
@ -10,7 +8,6 @@ import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository;
import com.zsc.edu.gateway.modules.system.repo.MenuRepository;
import com.zsc.edu.gateway.modules.system.repo.RoleAuthoritiesRepository;
import com.zsc.edu.gateway.modules.system.repo.UserRepository;
import com.zsc.edu.gateway.modules.system.service.DeptService;
import lombok.AllArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
@ -30,9 +27,9 @@ import java.util.stream.Collectors;
public class JpaUserDetailsServiceImpl implements UserDetailsService {
private final UserRepository userRepo;
// private final RoleAuthoritiesRepository roleAuthoritiesRepository;
private final AuthorityRepository authorityRepository;
private final MenuRepository menuRepository;
private final DeptService deptService;
@Override
@Transactional(rollbackFor = Exception.class)
@ -41,10 +38,7 @@ public class JpaUserDetailsServiceImpl implements UserDetailsService {
if (!user.getEnableState()) {
throw new StateException("用户 '" + username + "' 已被禁用!请联系管理员");
}
List<Dept> depts = deptService.listTree(user.deptId);
List<Dept> flat = TreeUtil.flat(depts, Dept::getChildren, d -> d.setChildren(null));
Set<Long> dataScopeDeptIds = flat.stream().map(Dept::getId).collect(Collectors.toSet());
user.setDataScopeDeptIds(dataScopeDeptIds);
// List<RoleAuthority> roleAuthorities= roleAuthoritiesRepository.selectByRoleId(user.getRoleId());
// user.role.authorities = authorityRepository.selectAuthoritiesByRoleId(user.getRoleId());
List<Menu> menus = menuRepository.selectByRoleId(user.getRoleId());

View File

@ -34,16 +34,14 @@ public class UserDetailsImpl implements UserDetails {
public Role role;
public Set<Authority> authorities;
public Set<String> permissions;
public Set<Long> dataScopeDeptIds;
public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Set<Long> dataScopeDeptIds, Role role, Set<Authority> authorities, Set<String> permissions) {
public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Role role, Set<Authority> authorities, Set<String> permissions) {
this.id = id;
this.username = username;
this.password = password;
this.enableState = enableState;
this.name = name;
this.dept = dept;
this.dataScopeDeptIds = dataScopeDeptIds;
this.role = role;
this.authorities = authorities;
this.permissions = permissions;
@ -57,7 +55,6 @@ public class UserDetailsImpl implements UserDetails {
user.name,
user.enableState,
user.dept,
user.dataScopeDeptIds,
user.role,
user.role.authorities,
permissions

View File

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

View File

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

View File

@ -2,7 +2,6 @@ package com.zsc.edu.gateway.modules.iot.product.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.modules.iot.product.dto.ProductDto;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
import com.zsc.edu.gateway.modules.iot.product.query.ProductQuery;
@ -27,6 +26,8 @@ public class ProductController {
private final ProductService service;
/**
* 创建产品
*
@ -59,7 +60,6 @@ public class ProductController {
* @param page 分页参数
* @return Page<Device> 产品分页数据
*/
@DataPermission
@GetMapping
@PreAuthorize("hasAuthority('iot:product:query')")
public Page<Product> page(Page<Product> page, ProductQuery query) {

View File

@ -1,16 +1,10 @@
package com.zsc.edu.gateway.modules.iot.product.repo;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.zsc.edu.gateway.framework.mybatisplus.DataPermission;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author Yao

View File

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

View File

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

View File

@ -1,15 +1,11 @@
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.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* @author zhuang
@ -39,5 +35,4 @@ public class AdminNoticeQuery {
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime createAtEnd;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,6 @@ package com.zsc.edu.gateway.modules.system.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zsc.edu.gateway.framework.mybatisplus.DataScopeType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@ -24,10 +23,6 @@ public class Role extends BaseEntity {
* 名称唯一
*/
public String name;
/**
* 数据权限
*/
public DataScopeType dataScope;
/**
* 启用状态

View File

@ -5,8 +5,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;
import java.util.Set;
/**
* 用户
*
@ -61,11 +59,6 @@ public class User extends BaseEntity {
*/
@TableField(exist = false)
public Dept dept;
/**
* 所属部门及子部门ID
*/
@TableField(exist = false)
public Set<Long> dataScopeDeptIds;
/**
* 角色ID

View File

@ -15,7 +15,6 @@
<result column="create_time" jdbcType="DATE" property="createTime"/>
<result column="update_time" jdbcType="DATE" property="updateTime"/>
<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"
columnPrefix="param_">
<id column="id" property="id"/>

View File

@ -49,12 +49,9 @@
<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
FROM
sys_user su
LEFT JOIN
sys_user_notice sun ON sun.user_id = su.id
LEFT JOIN
sys_notice sn ON sn.id = sun.notice_id
from sys_user_notice sun
left join sys_user su on sun.user_id = su.id
left join sys_notice sn on sn.id = sun.notice_id
<where>
<if test="query.userId != null">
AND sun.user_id = #{query.userId}
@ -88,9 +85,9 @@
COUNT(DISTINCT sun.user_id) AS user_count, -- 统计用户的关联数量
SUM(CASE WHEN sun.is_read = true THEN 1 ELSE 0 END) AS read_count -- 统计已读数量
FROM
sys_user su
sys_user_notice sun
LEFT JOIN
sys_user_notice sun ON sun.user_id = su.id
sys_user su ON sun.user_id = su.id
LEFT JOIN
sys_notice sn ON sn.id = sun.notice_id
<where>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsc.edu.gateway.modules.system.repo.UserRepository">
<resultMap id="UserMap" type="com.zsc.edu.gateway.modules.system.entity.User">
<resultMap id="BaseResultMap" type="com.zsc.edu.gateway.modules.system.entity.User">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="password" jdbcType="VARCHAR" property="password"/>
@ -14,19 +14,14 @@
<result column="address" jdbcType="VARCHAR" property="address"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="enable_state" jdbcType="BIT" property="enableState"/>
<association property="role" javaType="com.zsc.edu.gateway.modules.system.entity.Role">
<id column="role_id" jdbcType="BIGINT" property="id"/>
<result column="role_name" jdbcType="VARCHAR" property="name"/>
<result column="data_scope" jdbcType="INTEGER" property="dataScope" />
</association>
<association property="dept" javaType="com.zsc.edu.gateway.modules.system.entity.Dept">
<id column="dept_id" jdbcType="BIGINT" property="id"/>
<result column="dept_name" jdbcType="VARCHAR" property="name"/>
</association>
<collection property="role" ofType="com.zsc.edu.gateway.modules.system.entity.Role">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
</collection>
</resultMap>
<resultMap id="UserVoMap" type="com.zsc.edu.gateway.modules.system.vo.UserVo">
<id column="id" jdbcType="BIGINT" property="userId"/>
<resultMap id="BaseResultMap1" type="com.zsc.edu.gateway.modules.system.vo.UserVo">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="role_id" jdbcType="BIGINT" property="roleId"/>
<result column="dept_id" jdbcType="BIGINT" property="deptId"/>
@ -41,20 +36,21 @@
id, username, password, email, phone, create_time
</sql>
<select id="selectByUsername" parameterType="java.lang.String" resultMap="UserMap">
select su.*, sr.name as role_name, sr.data_scope, sd.name as dept_name from sys_user su
<select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
select
*
from sys_user su
left join sys_role sr on su.role_id = sr.id
left join sys_dept sd on su.dept_id = sd.id
where su.username = #{username,jdbcType=VARCHAR}
</select>
<select id="page" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="UserVoMap">
<select id="page" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="BaseResultMap1">
select
*
from sys_user
${ew.customSqlSegment}
</select>
<select id="detail" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="UserVoMap">
<select id="detail" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="BaseResultMap1">
select
*
from sys_user

View File

@ -49,20 +49,20 @@ public class UserServiceTest {
private User user2;
private User user3;
// @BeforeEach
// void setUp() {
// user1 = UserBuilder.anUser().username("A张三").password("123456").enable(true).build();
// repo.insert(user1);
// user2 = UserBuilder.anUser().username("A李四").password("123456").enable(true).build();
// repo.insert(user2);
// user3 = UserBuilder.anUser().username("A王五").password("123456").enable(true).build();
// repo.insert(user3);
// }
//
// @AfterEach
// void tearDown() {
// repo.delete(new LambdaQueryWrapper<User>().in(User::getId, user1.getId(), user2.getId(), user3.getId()));
// }
@BeforeEach
void setUp() {
user1 = UserBuilder.anUser().username("A张三").password("123456").enable(true).build();
repo.insert(user1);
user2 = UserBuilder.anUser().username("A李四").password("123456").enable(true).build();
repo.insert(user2);
user3 = UserBuilder.anUser().username("A王五").password("123456").enable(true).build();
repo.insert(user3);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<User>().in(User::getUsername, "A张三", "A李四", "A王五", "A赵六", "A陈七", "A刘八"));
}
@Test
void list() {
@ -108,11 +108,5 @@ public class UserServiceTest {
assertTrue(service.updatePassword("777777", user3.id));
}
@Test
void getOne() {
User byId = repo.selectByUsername("admin");
assertNotNull(byId.role.dataScope);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB