Browse Source

登录部分功能,新增验证,实体异常等工具类

master
刘力 3 years ago
parent
commit
f8497890e8
  1. 18
      common/src/main/java/com/canvas/web/annotation/DataPermission.java
  2. 15
      common/src/main/java/com/canvas/web/utils/EntityNotFoundException.java
  3. 190
      common/src/main/java/com/canvas/web/utils/QueryHelp.java
  4. 25
      common/src/main/java/com/canvas/web/utils/ValidationUtil.java
  5. 12
      system/src/main/java/com/canvas/web/modules/security/controller/AuthorizationController.java
  6. 6
      system/src/main/java/com/canvas/web/modules/system/service/dto/UserDto.java
  7. 23
      system/src/main/java/com/canvas/web/modules/system/service/impl/UserServiceImpl.java

18
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 "";
}

15
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";
}
}

190
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 <R,Q> Predicate getPredicate(Root<R> root, Q query, CriteriaBuilder cb) {
List<Predicate> 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<Long> 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<Field> 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<Predicate> 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<? extends Comparable>) fieldType),val));
break;
case GREATER_THAN:
list.add(cb.greaterThanOrEqualTo(getExpression(attributeName,join,root)
.as((Class<? extends Comparable>) fieldType), (Comparable) val));
break;
case LESS_THAN:
list.add(cb.lessThanOrEqualTo(getExpression(attributeName,join,root)
.as((Class<? extends Comparable>) fieldType), (Comparable) val));
break;
case LESS_THAN_NQ:
list.add(cb.lessThan(getExpression(attributeName,join,root)
.as((Class<? extends Comparable>) 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<Long>)val)) {
list.add(getExpression(attributeName,join,root).in((Collection<Long>) 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<Object> between = new ArrayList<>((List<Object>)val);
list.add(cb.between(getExpression(attributeName, join, root).as((Class<? extends Comparable>) 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 <T, R> Expression<T> getExpression(String attributeName, Join join, Root<R> root) {
if (ObjectUtil.isNotEmpty(join)) {
return join.get(attributeName);
} else {
return root.get(attributeName);
}
}
public static List<Field> getAllFields(Class clazz, List<Field> 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;
}
}

25
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);}
}

12
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<String, Object> authInfo = new HashMap<String, Object>(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);
}

6
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<RoleSmallDto> roles;
//private Set<JobSmallDto> jobs;
// private DeptSmallDto dept;
// private Set<JobSmallDto> jobs;
//
// private DeptSmallDto dept;
private Long deptId;

23
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<User> page = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
return PageUtil.toPage(page.map(userMapper::toDto));
}
@Override
public List<UserDto> queryAll(UserQueryCriteria criteria) {
return null;
List<User> users = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder));
return userMapper.toDto(users);
}
@Override
public void download(List<UserDto> queryAll, HttpServletResponse response) throws IOException {
}
}
Loading…
Cancel
Save