diff --git a/common/src/main/java/com/canvas/web/annotation/DataPermission.java b/common/src/main/java/com/canvas/web/annotation/DataPermission.java new file mode 100644 index 0000000..1f2a2b9 --- /dev/null +++ b/common/src/main/java/com/canvas/web/annotation/DataPermission.java @@ -0,0 +1,18 @@ +package com.canvas.web.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface DataPermission { + + //Entity 中的字段名称 + String fieldName() default ""; + + //Entity 中与部门关联的字段名称 + String joinName() default ""; +} diff --git a/common/src/main/java/com/canvas/web/utils/EntityNotFoundException.java b/common/src/main/java/com/canvas/web/utils/EntityNotFoundException.java new file mode 100644 index 0000000..82135dc --- /dev/null +++ b/common/src/main/java/com/canvas/web/utils/EntityNotFoundException.java @@ -0,0 +1,15 @@ +package com.canvas.web.utils; + +import org.springframework.util.StringUtils; + +public class EntityNotFoundException extends RuntimeException{ + + public EntityNotFoundException(Class clazz, String field, String val) { + super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), field, val)); + } + + private static String generateMessage(String entity, String field, String val) { + return StringUtils.capitalize(entity) + + " with " + field + " "+ val + " does not exist"; + } +} diff --git a/common/src/main/java/com/canvas/web/utils/QueryHelp.java b/common/src/main/java/com/canvas/web/utils/QueryHelp.java new file mode 100644 index 0000000..be7370e --- /dev/null +++ b/common/src/main/java/com/canvas/web/utils/QueryHelp.java @@ -0,0 +1,190 @@ +package com.canvas.web.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.canvas.web.annotation.DataPermission; +import com.canvas.web.annotation.Query; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import javax.persistence.criteria.*; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +@Slf4j +public class QueryHelp { + + public static Predicate getPredicate(Root root, Q query, CriteriaBuilder cb) { + + List list = new ArrayList<>(); + if (query == null) { + return cb.and(list.toArray(new Predicate[0])); + } + //数据权限验证 + DataPermission permission = query.getClass().getAnnotation(DataPermission.class); + //获取数据权限 + if (permission != null) { + // 获取数据权限 + List dataScopes = SecurityUtils.getCurrentUserDataScope(); + if (CollectionUtil.isNotEmpty(dataScopes)) { + if (org.apache.commons.lang3.StringUtils.isNotBlank(permission.joinName()) && org.apache.commons.lang3.StringUtils.isNotBlank(permission.fieldName())) { + Join join = root.join(permission.joinName(), JoinType.LEFT); + list.add(getExpression(permission.fieldName(), join, root).in(dataScopes)); + } else if (org.apache.commons.lang3.StringUtils.isBlank(permission.joinName()) && StringUtils.isNotBlank(permission.fieldName())) { + list.add(getExpression(permission.fieldName(), null, root).in(dataScopes)); + } + } + } + try { + List fields = getAllFields(query.getClass(), new ArrayList<>()); + for (Field field : fields) { + boolean accessible = field.isAccessible(); + // 设置对象的访问权限,保证对private的属性的访 + field.setAccessible(true); + Query q = field.getAnnotation(Query.class); + if (q != null) { + String propName = q.propName(); + String joinName = q.joinName(); + String blurry = q.blurry(); + String attributeName = isBlank(propName) ? field.getName() : propName; + Class fieldType = field.getType(); + Object val = field.get(query); + if (ObjectUtil.isNull(val) || "".equals(val)) { + continue; + } + Join join = null; + // 模糊多字段 + if (ObjectUtil.isNotEmpty(blurry)) { + String[] blurrys = blurry.split(","); + List orPredicate = new ArrayList<>(); + for (String s : blurrys) { + orPredicate.add(cb.like(root.get(s) + .as(String.class), "%" + val.toString() + "%")); + } + Predicate[] p = new Predicate[orPredicate.size()]; + list.add(cb.or(orPredicate.toArray(p))); + continue; + } + if (ObjectUtil.isNotEmpty(joinName)) { + String[] joinNames = joinName.split(">"); + for (String name : joinNames) { + switch (q.join()) { + case LEFT: + if(ObjectUtil.isNotNull(join) && ObjectUtil.isNotNull(val)){ + join = join.join(name, JoinType.LEFT); + } else { + join = root.join(name, JoinType.LEFT); + } + break; + case RIGHT: + if(ObjectUtil.isNotNull(join) && ObjectUtil.isNotNull(val)){ + join = join.join(name, JoinType.RIGHT); + } else { + join = root.join(name, JoinType.RIGHT); + } + break; + case INNER: + if(ObjectUtil.isNotNull(join) && ObjectUtil.isNotNull(val)){ + join = join.join(name, JoinType.INNER); + } else { + join = root.join(name, JoinType.INNER); + } + break; + default: break; + } + } + } + switch (q.type()) { + case EQUAL: + list.add(cb.equal(getExpression(attributeName,join,root) + .as((Class) fieldType),val)); + break; + case GREATER_THAN: + list.add(cb.greaterThanOrEqualTo(getExpression(attributeName,join,root) + .as((Class) fieldType), (Comparable) val)); + break; + case LESS_THAN: + list.add(cb.lessThanOrEqualTo(getExpression(attributeName,join,root) + .as((Class) fieldType), (Comparable) val)); + break; + case LESS_THAN_NQ: + list.add(cb.lessThan(getExpression(attributeName,join,root) + .as((Class) fieldType), (Comparable) val)); + break; + case INNER_LIKE: + list.add(cb.like(getExpression(attributeName,join,root) + .as(String.class), "%" + val.toString() + "%")); + break; + case LEFT_LIKE: + list.add(cb.like(getExpression(attributeName,join,root) + .as(String.class), "%" + val.toString())); + break; + case RIGHT_LIKE: + list.add(cb.like(getExpression(attributeName,join,root) + .as(String.class), val.toString() + "%")); + break; + case IN: + if (CollUtil.isNotEmpty((Collection)val)) { + list.add(getExpression(attributeName,join,root).in((Collection) val)); + } + break; + case NOT_EQUAL: + list.add(cb.notEqual(getExpression(attributeName,join,root), val)); + break; + case NOT_NULL: + list.add(cb.isNotNull(getExpression(attributeName,join,root))); + break; + case IS_NULL: + list.add(cb.isNull(getExpression(attributeName,join,root))); + break; + case BETWEEN: + List between = new ArrayList<>((List)val); + list.add(cb.between(getExpression(attributeName, join, root).as((Class) between.get(0).getClass()), + (Comparable) between.get(0), (Comparable) between.get(1))); + break; + default: break; + } + } + field.setAccessible(accessible); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + int size = list.size(); + return cb.and(list.toArray(new Predicate[size])); + } + + + private static Expression getExpression(String attributeName, Join join, Root root) { + if (ObjectUtil.isNotEmpty(join)) { + return join.get(attributeName); + } else { + return root.get(attributeName); + } + } + + public static List getAllFields(Class clazz, List fields) { + if (clazz != null) { + fields.addAll(Arrays.asList(clazz.getDeclaredFields())); + getAllFields(clazz.getSuperclass(), fields); + } + return fields; + } + + private static boolean isBlank(final CharSequence cs) { + int strLen; + if (cs == null || (strLen = cs.length()) == 0) { + return true; + } + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(cs.charAt(i))) { + return false; + } + } + return true; + } +} diff --git a/common/src/main/java/com/canvas/web/utils/ValidationUtil.java b/common/src/main/java/com/canvas/web/utils/ValidationUtil.java new file mode 100644 index 0000000..2226ea3 --- /dev/null +++ b/common/src/main/java/com/canvas/web/utils/ValidationUtil.java @@ -0,0 +1,25 @@ +package com.canvas.web.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.canvas.web.exception.BaseException; +import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; + +public class ValidationUtil { + + /** + * @title: 验证空 + * @Author: Liu_Lee + * @Date: 15:17 2020/12/17 + * @Param: + * @return: + **/ + public static void isNull(Object obj, String entity, String paramenter, Object value) { + if (ObjectUtil.isNull(obj)) { + String msg = entity + "不存在:" + paramenter + "is" + value; + throw new BaseException(msg); + } + } + + //验证是否为邮箱 + public static boolean isEmail(String email){return new EmailValidator().isValid(email,null);} +} diff --git a/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java b/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java index 0518c78..f38f7a3 100644 --- a/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java +++ b/system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java @@ -76,17 +76,17 @@ public class AuthorizationController { // 生成令牌 String token = tokenProvider.createToken(authentication); final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal(); - // 保存在线信息 - onlineUserService.save(jwtUserDto, token, request); +// // 保存在线信息 +// onlineUserService.save(jwtUserDto, token, request); // 返回 token 与 用户信息 Map authInfo = new HashMap(2) {{ put("token", properties.getTokenStartWith() + token); put("user", jwtUserDto); }}; - if (loginProperties.isSingleLogin()) { - //踢掉之前已经登录的token - onlineUserService.checkLoginOnUser(authUser.getUsername(), token); - } +// if (loginProperties.isSingleLogin()) { +// //踢掉之前已经登录的token +// onlineUserService.checkLoginOnUser(authUser.getUsername(), token); +// } return ResponseEntity.ok(authInfo); } diff --git a/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java b/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java index 0b6f9b2..dafdde3 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java @@ -18,9 +18,9 @@ public class UserDto extends BaseDTO implements Serializable { private Set roles; - //private Set jobs; - - // private DeptSmallDto dept; +// private Set jobs; +// +// private DeptSmallDto dept; private Long deptId; diff --git a/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java b/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java index 35fd0a6..1b78219 100644 --- a/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java +++ b/system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java @@ -2,14 +2,16 @@ package com.canvas.web.modules.system.service.impl; import com.canvas.web.config.FileProperties; import com.canvas.web.modules.security.service.UserCacheClean; +import com.canvas.web.modules.system.domain.User; import com.canvas.web.modules.system.repository.UserRepository; import com.canvas.web.modules.system.service.UserService; import com.canvas.web.modules.system.service.dto.UserDto; import com.canvas.web.modules.system.service.dto.UserQueryCriteria; import com.canvas.web.modules.system.service.mapstruct.UserMapper; -import com.canvas.web.utils.RedisUtils; +import com.canvas.web.utils.*; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheConfig; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -35,7 +37,9 @@ public class UserServiceImpl implements UserService{ @Override public UserDto findById(long id) { - return null; + User user = userRepository.findById(id).orElseGet(User::new); + ValidationUtil.isNull(user.getId(), "User", "id", id); + return userMapper.toDto(user); } @Override @@ -45,7 +49,12 @@ public class UserServiceImpl implements UserService{ @Override public UserDto findByName(String userName) { - return null; + User user = userRepository.findByUsername(userName); + if (user == null) { + throw new EntityNotFoundException(User.class, "name", userName); + } else { + return userMapper.toDto(user); + } } @Override @@ -65,16 +74,20 @@ public class UserServiceImpl implements UserService{ @Override public Object queryAll(UserQueryCriteria criteria, Pageable pageable) { - return null; + Page page = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable); + return PageUtil.toPage(page.map(userMapper::toDto)); } @Override public List queryAll(UserQueryCriteria criteria) { - return null; + List users = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder)); + return userMapper.toDto(users); } @Override public void download(List queryAll, HttpServletResponse response) throws IOException { } + + }