|
|
@@ -1,33 +1,36 @@
|
|
|
package com.izouma.zhumj.web;
|
|
|
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
import com.izouma.zhumj.annotations.Searchable;
|
|
|
import com.izouma.zhumj.domain.User;
|
|
|
import com.izouma.zhumj.dto.PageQuery;
|
|
|
-import com.izouma.zhumj.exception.AuthenticationException;
|
|
|
import com.izouma.zhumj.exception.BusinessException;
|
|
|
import com.izouma.zhumj.repo.UserRepo;
|
|
|
import com.izouma.zhumj.security.Authority;
|
|
|
+import com.izouma.zhumj.utils.ObjectUtils;
|
|
|
import com.izouma.zhumj.utils.SecurityUtils;
|
|
|
-import lombok.RequiredArgsConstructor;
|
|
|
-import org.apache.commons.beanutils.Converter;
|
|
|
-import org.apache.commons.beanutils.converters.StringConverter;
|
|
|
+import com.izouma.zhumj.utils.excel.LocalDateConverter;
|
|
|
+import com.izouma.zhumj.utils.excel.LocalDateTimeConverter;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
-import org.springframework.data.domain.Pageable;
|
|
|
+import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
|
-import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
import javax.persistence.criteria.Predicate;
|
|
|
-import javax.validation.Valid;
|
|
|
-import javax.validation.constraints.Size;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.IOException;
|
|
|
import java.lang.annotation.Annotation;
|
|
|
import java.lang.reflect.Field;
|
|
|
-import java.util.*;
|
|
|
-import java.util.function.BiConsumer;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.function.IntFunction;
|
|
|
|
|
|
@RestController
|
|
|
@RequestMapping("/user")
|
|
|
@@ -36,8 +39,9 @@ public class UserController {
|
|
|
private UserRepo userRepo;
|
|
|
|
|
|
@PostMapping("/register")
|
|
|
- public User register(@RequestParam String username, @RequestParam @Valid @Size(min = 8, max = 18) String password) {
|
|
|
- Set<Authority> authorities = new HashSet<>();
|
|
|
+ public User register(@RequestParam String username,
|
|
|
+ @RequestParam String password) {
|
|
|
+ List<Authority> authorities = new ArrayList<>();
|
|
|
authorities.add(new Authority(Authority.NAMES.ROLE_USER.name()));
|
|
|
User user = User.builder()
|
|
|
.username(username)
|
|
|
@@ -46,8 +50,18 @@ public class UserController {
|
|
|
.enabled(true)
|
|
|
.authorities(authorities)
|
|
|
.build();
|
|
|
- userRepo.save(user);
|
|
|
- return user;
|
|
|
+ return userRepo.save(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ @PreAuthorize("hasRole('ADMIN')")
|
|
|
+ @PostMapping("/save")
|
|
|
+ public User save(@RequestBody User user) {
|
|
|
+ if (user.getId() != null) {
|
|
|
+ User orig = userRepo.findById(user.getId()).orElseThrow(new BusinessException("无记录"));
|
|
|
+ ObjectUtils.merge(orig, user);
|
|
|
+ return userRepo.save(user);
|
|
|
+ }
|
|
|
+ return userRepo.save(user);
|
|
|
}
|
|
|
|
|
|
@GetMapping("/my")
|
|
|
@@ -55,9 +69,27 @@ public class UserController {
|
|
|
return userRepo.findById(SecurityUtils.getAuthenticatedUser().getId()).orElseThrow(new BusinessException("用户不存在"));
|
|
|
}
|
|
|
|
|
|
+ @PreAuthorize("hasRole('ADMIN')")
|
|
|
@GetMapping("/all")
|
|
|
public Page<User> all(PageQuery pageQuery) {
|
|
|
+ PageRequest pageRequest;
|
|
|
+ if (StringUtils.isNotEmpty(pageQuery.getSort())) {
|
|
|
+ List<Sort.Order> orders = new ArrayList<>();
|
|
|
+ for (String sortStr : pageQuery.getSort().split(";")) {
|
|
|
+ String direction = "asc";
|
|
|
+ String prop = sortStr;
|
|
|
+ if (sortStr.contains(",asc") || sortStr.contains(",desc")) {
|
|
|
+ prop = sortStr.split(",")[0];
|
|
|
+ direction = sortStr.split(",")[1];
|
|
|
+ }
|
|
|
+ orders.add("asc".equals(direction) ? Sort.Order.asc(prop) : Sort.Order.desc(prop));
|
|
|
+ }
|
|
|
+ pageRequest = PageRequest.of(pageQuery.getPage(), pageQuery.getSize(), Sort.by(orders));
|
|
|
+ } else {
|
|
|
+ pageRequest = PageRequest.of(pageQuery.getPage(), pageQuery.getSize());
|
|
|
+ }
|
|
|
return userRepo.findAll((Specification<User>) (root, criteriaQuery, criteriaBuilder) -> {
|
|
|
+ List<Predicate> and = new ArrayList<>();
|
|
|
pageQuery.getQuery().forEach((property, value) -> {
|
|
|
if (value == null) {
|
|
|
return;
|
|
|
@@ -67,27 +99,43 @@ public class UserController {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
- criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value));
|
|
|
+ and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
|
|
|
});
|
|
|
if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
|
|
|
Field[] fields = User.class.getDeclaredFields();
|
|
|
List<Predicate> or = new ArrayList<>();
|
|
|
+ or.add(criteriaBuilder.equal(root.get("id"), pageQuery.getSearch()));
|
|
|
for (Field field : fields) {
|
|
|
- Annotation[] annotations = field.getDeclaredAnnotations();
|
|
|
- for (Annotation annotation : annotations) {
|
|
|
- if (!annotation.annotationType().equals(Searchable.class)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!((Searchable) annotation).value()) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- or.add(criteriaBuilder.equal(root.get(field.getName()), pageQuery.getSearch()));
|
|
|
+ Searchable annotation = field.getAnnotation(Searchable.class);
|
|
|
+ if (annotation == null) {
|
|
|
+ continue;
|
|
|
}
|
|
|
+ if (!annotation.value()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ or.add(criteriaBuilder.like(root.get(field.getName()), "%" + pageQuery.getSearch() + "%"));
|
|
|
}
|
|
|
- criteriaBuilder.and(or.toArray(new Predicate[or.size()]));
|
|
|
+ and.add(criteriaBuilder.or(or.stream().toArray(Predicate[]::new)));
|
|
|
}
|
|
|
+ return criteriaBuilder.and(and.stream().toArray(Predicate[]::new));
|
|
|
+ }, pageRequest);
|
|
|
+ }
|
|
|
+
|
|
|
+ @GetMapping("/get/{id}")
|
|
|
+ public User get(@PathVariable Long id) {
|
|
|
+ return userRepo.findById(id).orElseThrow(new BusinessException("无记录"));
|
|
|
+ }
|
|
|
|
|
|
- return criteriaBuilder.and();
|
|
|
- }, PageRequest.of(pageQuery.getPage(), pageQuery.getSize()));
|
|
|
+ @GetMapping("/excel")
|
|
|
+ @ResponseBody
|
|
|
+ public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
|
|
|
+ response.setContentType("application/vnd.ms-excel");
|
|
|
+ response.setCharacterEncoding("utf-8");
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=User.xlsx");
|
|
|
+ List<User> data = all(pageQuery).getContent();
|
|
|
+ EasyExcel.write(response.getOutputStream(), User.class).sheet("User")
|
|
|
+ .registerConverter(new LocalDateConverter())
|
|
|
+ .registerConverter(new LocalDateTimeConverter())
|
|
|
+ .doWrite(data);
|
|
|
}
|
|
|
}
|