Compare commits
3 Commits
e06bdeba1e
...
24b7b4093a
Author | SHA1 | Date | |
---|---|---|---|
24b7b4093a | |||
94a97f3568 | |||
5f19ddef7e |
5
pom.xml
5
pom.xml
@ -36,6 +36,11 @@
|
|||||||
<!-- <groupId>org.springframework.boot</groupId>-->
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
<!-- <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
|
<!-- <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-aop</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||||
|
@ -31,7 +31,7 @@ public class TreeUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将树打平成tree
|
* 将树打平成list
|
||||||
*
|
*
|
||||||
* @param tree 需要打平的树
|
* @param tree 需要打平的树
|
||||||
* @param getSubChildren 设置下级数据方法,如:Menu::getSubMenus,x->x.setSubMenus(null)
|
* @param getSubChildren 设置下级数据方法,如:Menu::getSubMenus,x->x.setSubMenus(null)
|
||||||
@ -125,6 +125,9 @@ public class TreeUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static <E> List<E> makeChildren(E parent, List<E> allData, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> children) {
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,25 @@
|
|||||||
|
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";
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,129 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,9 @@ package com.zsc.edu.gateway.framework.mybatisplus;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
|
import org.apache.ibatis.plugin.Interceptor;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
@ -13,18 +15,15 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
@MapperScan(basePackages = "com.zsc.edu.gateway.modules.**.repo")
|
@MapperScan(basePackages = "com.zsc.edu.gateway.modules.**.repo")
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MybatisPlusConfig {
|
public class MybatisPlusConfig {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||||
|
// 添加数据权限插件
|
||||||
|
DataPermissionInterceptor dataPermissionInterceptor = new DataPermissionInterceptor(new DataScopeHandler());
|
||||||
|
// 添加自定义的数据权限处理器
|
||||||
|
interceptor.addInnerInterceptor(dataPermissionInterceptor);
|
||||||
|
// 添加分页插件
|
||||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
|
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
|
||||||
// // 添加数据权限插件
|
|
||||||
// MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor();
|
|
||||||
// // 添加自定义的数据权限处理器
|
|
||||||
// dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
|
|
||||||
// interceptor.addInnerInterceptor(dataPermissionInterceptor);
|
|
||||||
return interceptor;
|
return interceptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.zsc.edu.gateway.framework.security;
|
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.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.Menu;
|
||||||
import com.zsc.edu.gateway.modules.system.entity.RoleAuthority;
|
import com.zsc.edu.gateway.modules.system.entity.RoleAuthority;
|
||||||
import com.zsc.edu.gateway.modules.system.entity.User;
|
import com.zsc.edu.gateway.modules.system.entity.User;
|
||||||
@ -8,6 +10,7 @@ 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.MenuRepository;
|
||||||
import com.zsc.edu.gateway.modules.system.repo.RoleAuthoritiesRepository;
|
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.repo.UserRepository;
|
||||||
|
import com.zsc.edu.gateway.modules.system.service.DeptService;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
@ -27,9 +30,9 @@ import java.util.stream.Collectors;
|
|||||||
public class JpaUserDetailsServiceImpl implements UserDetailsService {
|
public class JpaUserDetailsServiceImpl implements UserDetailsService {
|
||||||
|
|
||||||
private final UserRepository userRepo;
|
private final UserRepository userRepo;
|
||||||
// private final RoleAuthoritiesRepository roleAuthoritiesRepository;
|
|
||||||
private final AuthorityRepository authorityRepository;
|
private final AuthorityRepository authorityRepository;
|
||||||
private final MenuRepository menuRepository;
|
private final MenuRepository menuRepository;
|
||||||
|
private final DeptService deptService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@ -38,7 +41,10 @@ public class JpaUserDetailsServiceImpl implements UserDetailsService {
|
|||||||
if (!user.getEnableState()) {
|
if (!user.getEnableState()) {
|
||||||
throw new StateException("用户 '" + username + "' 已被禁用!请联系管理员");
|
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());
|
// List<RoleAuthority> roleAuthorities= roleAuthoritiesRepository.selectByRoleId(user.getRoleId());
|
||||||
// user.role.authorities = authorityRepository.selectAuthoritiesByRoleId(user.getRoleId());
|
// user.role.authorities = authorityRepository.selectAuthoritiesByRoleId(user.getRoleId());
|
||||||
List<Menu> menus = menuRepository.selectByRoleId(user.getRoleId());
|
List<Menu> menus = menuRepository.selectByRoleId(user.getRoleId());
|
||||||
|
@ -34,14 +34,16 @@ public class UserDetailsImpl implements UserDetails {
|
|||||||
public Role role;
|
public Role role;
|
||||||
public Set<Authority> authorities;
|
public Set<Authority> authorities;
|
||||||
public Set<String> permissions;
|
public Set<String> permissions;
|
||||||
|
public Set<Long> dataScopeDeptIds;
|
||||||
|
|
||||||
public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Role role, Set<Authority> authorities, Set<String> permissions) {
|
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) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.enableState = enableState;
|
this.enableState = enableState;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.dept = dept;
|
this.dept = dept;
|
||||||
|
this.dataScopeDeptIds = dataScopeDeptIds;
|
||||||
this.role = role;
|
this.role = role;
|
||||||
this.authorities = authorities;
|
this.authorities = authorities;
|
||||||
this.permissions = permissions;
|
this.permissions = permissions;
|
||||||
@ -55,6 +57,7 @@ public class UserDetailsImpl implements UserDetails {
|
|||||||
user.name,
|
user.name,
|
||||||
user.enableState,
|
user.enableState,
|
||||||
user.dept,
|
user.dept,
|
||||||
|
user.dataScopeDeptIds,
|
||||||
user.role,
|
user.role,
|
||||||
user.role.authorities,
|
user.role.authorities,
|
||||||
permissions
|
permissions
|
||||||
|
@ -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) {
|
||||||
|
@ -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, "已锁定"),
|
||||||
|
@ -2,6 +2,7 @@ package com.zsc.edu.gateway.modules.iot.product.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.modules.iot.product.dto.ProductDto;
|
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.entity.Product;
|
||||||
import com.zsc.edu.gateway.modules.iot.product.query.ProductQuery;
|
import com.zsc.edu.gateway.modules.iot.product.query.ProductQuery;
|
||||||
@ -26,8 +27,6 @@ public class ProductController {
|
|||||||
|
|
||||||
private final ProductService service;
|
private final ProductService service;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建产品
|
* 创建产品
|
||||||
*
|
*
|
||||||
@ -60,6 +59,7 @@ public class ProductController {
|
|||||||
* @param page 分页参数
|
* @param page 分页参数
|
||||||
* @return Page<Device> 产品分页数据
|
* @return Page<Device> 产品分页数据
|
||||||
*/
|
*/
|
||||||
|
@DataPermission
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@PreAuthorize("hasAuthority('iot:product:query')")
|
@PreAuthorize("hasAuthority('iot:product:query')")
|
||||||
public Page<Product> page(Page<Product> page, ProductQuery query) {
|
public Page<Product> page(Page<Product> page, ProductQuery query) {
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
package com.zsc.edu.gateway.modules.iot.product.repo;
|
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.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 com.zsc.edu.gateway.modules.iot.product.entity.Product;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.apache.ibatis.annotations.Select;
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Yao
|
* @author Yao
|
||||||
|
@ -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());
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -28,6 +28,11 @@ public class BaseEntity implements Serializable {
|
|||||||
*/
|
*/
|
||||||
public String remark;
|
public String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建者ID
|
||||||
|
*/
|
||||||
|
public Long createId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
@ -2,6 +2,7 @@ package com.zsc.edu.gateway.modules.system.entity;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.zsc.edu.gateway.framework.mybatisplus.DataScopeType;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@ -23,6 +24,10 @@ public class Role extends BaseEntity {
|
|||||||
* 名称,唯一
|
* 名称,唯一
|
||||||
*/
|
*/
|
||||||
public String name;
|
public String name;
|
||||||
|
/**
|
||||||
|
* 数据权限
|
||||||
|
*/
|
||||||
|
public DataScopeType dataScope;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启用状态
|
* 启用状态
|
||||||
|
@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户
|
* 用户
|
||||||
*
|
*
|
||||||
@ -59,6 +61,11 @@ public class User extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
public Dept dept;
|
public Dept dept;
|
||||||
|
/**
|
||||||
|
* 所属部门及子部门ID
|
||||||
|
*/
|
||||||
|
@TableField(exist = false)
|
||||||
|
public Set<Long> dataScopeDeptIds;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色ID
|
* 角色ID
|
||||||
|
@ -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"/>
|
||||||
|
@ -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>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!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">
|
<mapper namespace="com.zsc.edu.gateway.modules.system.repo.UserRepository">
|
||||||
<resultMap id="BaseResultMap" type="com.zsc.edu.gateway.modules.system.entity.User">
|
<resultMap id="UserMap" type="com.zsc.edu.gateway.modules.system.entity.User">
|
||||||
<id column="id" jdbcType="BIGINT" property="id"/>
|
<id column="id" jdbcType="BIGINT" property="id"/>
|
||||||
<result column="username" jdbcType="VARCHAR" property="username"/>
|
<result column="username" jdbcType="VARCHAR" property="username"/>
|
||||||
<result column="password" jdbcType="VARCHAR" property="password"/>
|
<result column="password" jdbcType="VARCHAR" property="password"/>
|
||||||
@ -14,14 +14,19 @@
|
|||||||
<result column="address" jdbcType="VARCHAR" property="address"/>
|
<result column="address" jdbcType="VARCHAR" property="address"/>
|
||||||
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
|
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
|
||||||
<result column="enable_state" jdbcType="BIT" property="enableState"/>
|
<result column="enable_state" jdbcType="BIT" property="enableState"/>
|
||||||
<collection property="role" ofType="com.zsc.edu.gateway.modules.system.entity.Role">
|
<association property="role" javaType="com.zsc.edu.gateway.modules.system.entity.Role">
|
||||||
<id column="id" jdbcType="BIGINT" property="id"/>
|
<id column="role_id" jdbcType="BIGINT" property="id"/>
|
||||||
<result column="name" jdbcType="VARCHAR" property="name"/>
|
<result column="role_name" jdbcType="VARCHAR" property="name"/>
|
||||||
</collection>
|
<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>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="BaseResultMap1" type="com.zsc.edu.gateway.modules.system.vo.UserVo">
|
<resultMap id="UserVoMap" type="com.zsc.edu.gateway.modules.system.vo.UserVo">
|
||||||
<id column="id" jdbcType="BIGINT" property="id"/>
|
<id column="id" jdbcType="BIGINT" property="userId"/>
|
||||||
<result column="username" jdbcType="VARCHAR" property="username"/>
|
<result column="username" jdbcType="VARCHAR" property="username"/>
|
||||||
<result column="role_id" jdbcType="BIGINT" property="roleId"/>
|
<result column="role_id" jdbcType="BIGINT" property="roleId"/>
|
||||||
<result column="dept_id" jdbcType="BIGINT" property="deptId"/>
|
<result column="dept_id" jdbcType="BIGINT" property="deptId"/>
|
||||||
@ -36,21 +41,20 @@
|
|||||||
id, username, password, email, phone, create_time
|
id, username, password, email, phone, create_time
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
|
<select id="selectByUsername" parameterType="java.lang.String" resultMap="UserMap">
|
||||||
select
|
select su.*, sr.name as role_name, sr.data_scope, sd.name as dept_name from sys_user su
|
||||||
*
|
left join sys_role sr on su.role_id = sr.id
|
||||||
from sys_user su
|
left join sys_dept sd on su.dept_id = sd.id
|
||||||
left join sys_role sr on su.role_id = sr.id
|
|
||||||
where su.username = #{username,jdbcType=VARCHAR}
|
where su.username = #{username,jdbcType=VARCHAR}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="page" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="BaseResultMap1">
|
<select id="page" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="UserVoMap">
|
||||||
select
|
select
|
||||||
*
|
*
|
||||||
from sys_user
|
from sys_user
|
||||||
${ew.customSqlSegment}
|
${ew.customSqlSegment}
|
||||||
</select>
|
</select>
|
||||||
<select id="detail" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="BaseResultMap1">
|
<select id="detail" resultType="com.zsc.edu.gateway.modules.system.vo.UserVo" resultMap="UserVoMap">
|
||||||
select
|
select
|
||||||
*
|
*
|
||||||
from sys_user
|
from sys_user
|
||||||
|
@ -49,20 +49,20 @@ public class UserServiceTest {
|
|||||||
private User user2;
|
private User user2;
|
||||||
private User user3;
|
private User user3;
|
||||||
|
|
||||||
@BeforeEach
|
// @BeforeEach
|
||||||
void setUp() {
|
// void setUp() {
|
||||||
user1 = UserBuilder.anUser().username("A张三").password("123456").enable(true).build();
|
// user1 = UserBuilder.anUser().username("A张三").password("123456").enable(true).build();
|
||||||
repo.insert(user1);
|
// repo.insert(user1);
|
||||||
user2 = UserBuilder.anUser().username("A李四").password("123456").enable(true).build();
|
// user2 = UserBuilder.anUser().username("A李四").password("123456").enable(true).build();
|
||||||
repo.insert(user2);
|
// repo.insert(user2);
|
||||||
user3 = UserBuilder.anUser().username("A王五").password("123456").enable(true).build();
|
// user3 = UserBuilder.anUser().username("A王五").password("123456").enable(true).build();
|
||||||
repo.insert(user3);
|
// repo.insert(user3);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@AfterEach
|
// @AfterEach
|
||||||
void tearDown() {
|
// void tearDown() {
|
||||||
repo.delete(new LambdaQueryWrapper<User>().in(User::getUsername, "A张三", "A李四", "A王五", "A赵六", "A陈七", "A刘八"));
|
// repo.delete(new LambdaQueryWrapper<User>().in(User::getId, user1.getId(), user2.getId(), user3.getId()));
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void list() {
|
void list() {
|
||||||
@ -107,6 +107,12 @@ public class UserServiceTest {
|
|||||||
void updatePassword() {
|
void updatePassword() {
|
||||||
assertTrue(service.updatePassword("777777", user3.id));
|
assertTrue(service.updatePassword("777777", user3.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getOne() {
|
||||||
|
User byId = repo.selectByUsername("admin");
|
||||||
|
assertNotNull(byId.role.dataScope);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
BIN
storage/attachment/e9fcf034c24b9e51ee8ca0430c26378de42b6f78
Normal file
BIN
storage/attachment/e9fcf034c24b9e51ee8ca0430c26378de42b6f78
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
Loading…
Reference in New Issue
Block a user