licailing 5 年 前
コミット
d787e7f3a0

+ 6 - 2
src/main/java/com/izouma/dingdong/domain/backstage/Email.java

@@ -9,6 +9,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Entity;
+import java.time.LocalDate;
 
 @Data
 @Entity
@@ -17,12 +18,15 @@ import javax.persistence.Entity;
 @Builder
 @ApiModel(value = "系统邮件", description = "系统邮件")
 public class Email extends BaseEntity {
-    @ApiModelProperty(value = "发件人",name = "sendUserId")
+    @ApiModelProperty(value = "发件人", name = "sendUserId")
     private Long sendUserId;
 
-    @ApiModelProperty(value = "收件人",name = "receiveUserId")
+    @ApiModelProperty(value = "收件人", name = "receiveUserId")
     private Long receiveUserId;
 
+    @ApiModelProperty(value = "发送时间", name = "sendTime")
+    private LocalDate sendTime;
+
     @ApiModelProperty(value = "标题", name = "title")
     private String title;
 

+ 22 - 3
src/main/java/com/izouma/dingdong/domain/backstage/WithdrawApply.java

@@ -2,6 +2,8 @@ package com.izouma.dingdong.domain.backstage;
 
 import com.izouma.dingdong.annotations.Searchable;
 import com.izouma.dingdong.domain.BaseEntity;
+import com.izouma.dingdong.enums.PayMethod;
+import com.izouma.dingdong.enums.WithdrawalsStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -10,10 +12,14 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
-//@Entity
+@Entity
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
@@ -22,8 +28,8 @@ public class WithdrawApply extends BaseEntity {
     @ApiModelProperty(value = "用户ID", name = "userId")
     private Long userId;
 
-    @ApiModelProperty(value = "工号", name = "jobNumber")
-    private String jobNumber;
+//    @ApiModelProperty(value = "工号", name = "jobNumber")
+//    private String jobNumber;
 
     @ApiModelProperty(value = "金额",name = "amount")
     private BigDecimal amount;
@@ -39,4 +45,17 @@ public class WithdrawApply extends BaseEntity {
     @ApiModelProperty(value = "是否成功", name = "consent")
     @Column(nullable = false)
     private Boolean consent;
+
+
+    @ApiModelProperty(value = "提现时间", name = "settleTime")
+    private LocalDateTime withdrawTime;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "提现方式", name = "payMethod")
+    private PayMethod payMethod;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "提现状态", name = "status")
+    private WithdrawalsStatus status;
+
 }

+ 16 - 0
src/main/java/com/izouma/dingdong/enums/WithdrawalsStatus.java

@@ -0,0 +1,16 @@
+package com.izouma.dingdong.enums;
+
+public enum WithdrawalsStatus {
+    SUCCESS("提现成功"),
+    FAIL("提现失败"),
+    PENDING("待处理");
+    private final String description;
+
+    WithdrawalsStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 9 - 0
src/main/java/com/izouma/dingdong/repo/UserRepo.java

@@ -29,4 +29,13 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     List<User> findAllByIdentityAndAuthoritiesContains(Identity identity, Authority authority);
 
     List<User> findAllByIdentity(Identity identity);
+
+    /**
+     * 按身份查找,且不在黑名单
+     * @param identity 身份
+     * @return 用户列表
+     */
+    List<User> findAllByIdentityAndBlacklistFalse(Identity identity);
+
+
 }

+ 4 - 0
src/main/java/com/izouma/dingdong/repo/backstage/EmailRepo.java

@@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.List;
 
 public interface EmailRepo extends JpaRepository<Email, Long>, JpaSpecificationExecutor<Email> {
 
@@ -14,4 +15,7 @@ public interface EmailRepo extends JpaRepository<Email, Long>, JpaSpecificationE
     @Modifying
     @Transactional
     void deleteById(Long id);
+
+    //按收件人查找邮件
+    List<Email> findAllByReceiveUserId(Long userId);
 }

+ 1 - 0
src/main/java/com/izouma/dingdong/security/WebSecurityConfig.java

@@ -62,6 +62,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 //swagger-ui放行路径
                 .antMatchers("/v2/api-docs", "/swagger-ui.html", "/swagger-resources/**", "/webjars/**").permitAll()
                 .antMatchers("/category/all").permitAll()
+                .antMatchers("/category/tree").permitAll()
                 .antMatchers("/merchantNature/all").permitAll()
                 .antMatchers("/user/register").permitAll()
                 .antMatchers("/upload/**").permitAll()

+ 169 - 0
src/main/java/com/izouma/dingdong/service/BaseService.java

@@ -0,0 +1,169 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.annotations.Searchable;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.utils.DateTimeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+
+import javax.persistence.criteria.Predicate;
+import java.lang.reflect.Field;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.regex.Pattern;
+
+public class BaseService {
+    public static PageRequest toPageRequest(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 pageRequest;
+    }
+
+    public static <T> Specification<T> toSpecification(PageQuery pageQuery, Class<T> queryClass) {
+        return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = new ArrayList<>();
+            pageQuery.getQuery().forEach((property, value) -> {
+                if (value == null) {
+                    return;
+                }
+                if (String.class.equals(value.getClass())) {
+                    if (StringUtils.isEmpty((String) value)) {
+                        return;
+                    }
+                    if ("true".equals(value) || "false".equals(value)) {
+                        and.add(criteriaBuilder
+                                .and(criteriaBuilder.equal(root.get(property), Boolean.valueOf((String) value))));
+                        return;
+                    }
+                }
+                if (property.equals("createdAt") && !StringUtils.isEmpty(value.toString())) {
+                    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    and.add(criteriaBuilder.between(root.get(property), LocalDateTime
+                            .parse(value.toString().split(",")[0], df), LocalDateTime
+                            .parse(value.toString().split(",")[1], df)));
+                } else {
+                    try {
+                        Field field = queryClass.getDeclaredField(property);
+                        Class fieldType = field.getType();
+                        if (Enum.class.isAssignableFrom(fieldType)) {
+                            if (value instanceof Collection) {
+                                if (!((Collection) value).isEmpty()) {
+                                    List list = new ArrayList();
+                                    for (Object o : ((Collection) value)) {
+                                        list.add(Enum.valueOf(fieldType, String.valueOf(o)));
+                                    }
+                                    and.add(root.get(property).in(list));
+                                }
+                            } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
+                                if (((String) value).contains(",")) {
+                                    String[] arr = ((String) value).split(",");
+                                    List list = new ArrayList();
+                                    for (String s : arr) {
+                                        list.add(Enum.valueOf(fieldType, s));
+                                    }
+                                    and.add(root.get(property).in(list));
+                                } else {
+                                    and.add(criteriaBuilder.and(criteriaBuilder
+                                            .equal(root.get(property), Enum
+                                                    .valueOf(fieldType, String.valueOf(value)))));
+                                }
+                            }
+                        } else if (LocalDateTime.class == fieldType) {
+                            if (value instanceof List) {
+                                List list = (List) value;
+                                if (list.size() == 1) {
+                                    LocalDateTime start = DateTimeUtils
+                                            .toLocalDateTime((String) list.get(0), "yyyy-MM-dd HH:mm:ss");
+                                    and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                } else if (list.size() == 2) {
+                                    LocalDateTime end = DateTimeUtils
+                                            .toLocalDateTime((String) list.get(1), "yyyy-MM-dd HH:mm:ss");
+                                    and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                                }
+                            } else if (value instanceof String && Pattern
+                                    .matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", (String) value)) {
+                                String[] arr = ((String) value).split(",");
+                                LocalDateTime start = DateTimeUtils.toLocalDateTime(arr[0], "yyyy-MM-dd HH:mm:ss");
+                                and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                LocalDateTime end = DateTimeUtils.toLocalDateTime(arr[1], "yyyy-MM-dd HH:mm:ss");
+                                and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                            } else {
+                                and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                                        .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss"))));
+                            }
+                        } else if (LocalDate.class == fieldType) {
+                            if (value instanceof List) {
+                                List list = (List) value;
+                                if (list.size() == 1) {
+                                    LocalDate start = DateTimeUtils
+                                            .toLocalDate((String) list.get(0), "yyyy-MM-dd");
+                                    and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                } else if (list.size() == 2) {
+                                    LocalDate end = DateTimeUtils
+                                            .toLocalDate((String) list.get(1), "yyyy-MM-dd");
+                                    and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                                }
+                            } else if (value instanceof String && Pattern
+                                    .matches("^\\d{4}-\\d{2}-\\d{2},\\d{4}-\\d{2}-\\d{2}$", (String) value)) {
+                                String[] arr = ((String) value).split(",");
+                                LocalDate start = DateTimeUtils.toLocalDate(arr[0], "yyyy-MM-dd");
+                                and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                LocalDate end = DateTimeUtils.toLocalDate(arr[1], "yyyy-MM-dd");
+                                and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                            } else {
+                                and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                                        .toLocalDateTime((String) value, "yyyy-MM-dd"))));
+                            }
+                        } else {
+                            and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                }
+            });
+            if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
+                Field[] fields = queryClass.getDeclaredFields();
+                List<Predicate> or = new ArrayList<>();
+                try {
+                    or.add(criteriaBuilder.equal(root.get("id"), pageQuery.getSearch()));
+                } catch (Exception ignored) {
+                }
+                for (Field field : fields) {
+                    Searchable annotation = field.getAnnotation(Searchable.class);
+                    if (annotation == null) {
+                        continue;
+                    }
+                    if (!annotation.value()) {
+                        continue;
+                    }
+
+                    or.add(criteriaBuilder.like(root.get(field.getName()), "%" + pageQuery.getSearch() + "%"));
+                }
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        };
+    }
+}

+ 12 - 1
src/main/java/com/izouma/dingdong/service/OrderInfoService.java

@@ -8,6 +8,7 @@ import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.ShoppingCart;
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.merchant.Goods;
+import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
 import com.izouma.dingdong.domain.user.Address;
 import com.izouma.dingdong.domain.user.Coupon;
@@ -54,6 +55,7 @@ public class OrderInfoService {
     private UserRepo userRepo;
     private MerchantService merchantService;
     private SalesService salesService;
+    private MerchantRepo merchantRepo;
 
     /*
     用户下单
@@ -232,9 +234,18 @@ public class OrderInfoService {
                         orderInfo.setRiderStatus(RiderStatus.CARRY_OUT);
                         orderInfo.setUserReceivedTime(LocalDateTime.now());
                         orderInfo.setStatus(OrderStatus.COMPLETED);
-
                         //添加销量数据
                         salesService.addSale(orderInfo);
+
+                        //扣除金额
+
+                        //商家
+                        Merchant merchant = merchantRepo.findById(orderInfo.getMerchantId()).orElseThrow(new BusinessException("商家不存在"));
+                        merchant.setMoney(merchant.getMoney().add(orderInfo.getRealAmount().subtract(orderInfo.getDeliveryAmount())));
+
+                        //骑手
+
+
                         break;
                 }
                 orderInfoRepo.save(orderInfo);

+ 11 - 8
src/main/java/com/izouma/dingdong/service/UserService.java

@@ -6,6 +6,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.dingdong.config.Constants;
 import com.izouma.dingdong.domain.User;
+import com.izouma.dingdong.enums.Identity;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.security.Authority;
@@ -30,18 +31,18 @@ import java.util.*;
 @Slf4j
 @AllArgsConstructor
 public class UserService {
-    private UserRepo       userRepo;
-    private WxMaService    wxMaService;
-    private WxMpService    wxMpService;
-    private SmsService     smsService;
+    private UserRepo userRepo;
+    private WxMaService wxMaService;
+    private WxMpService wxMpService;
+    private SmsService smsService;
     private StorageService storageService;
-    private JwtTokenUtil   jwtTokenUtil;
+    private JwtTokenUtil jwtTokenUtil;
 
 
     /*
     创建User
      */
-    public User register(String phone, String password) {
+    public User register(String phone, String password, Identity identity) {
         //用于商家登录
         User user = userRepo.findByPhone(phone);
         if (ObjectUtil.isNull(user)) {
@@ -51,11 +52,13 @@ public class UserService {
                     .enabled(true)
                     .phone(phone)
                     .authorities(Collections.singleton(Authority.getInstance(Authority.NAMES.ROLE_USER)))
+                    .identity(identity)
                     .build();
-            userRepo.save(user);
+        } else {
+            user.setPassword(new BCryptPasswordEncoder().encode(password));
         }
 
-        return user;
+        return userRepo.save(user);
     }
 
     public User loginByPhone(String phone) {

+ 4 - 2
src/main/java/com/izouma/dingdong/service/backstage/BlackListService.java

@@ -4,12 +4,14 @@ import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.backstage.BlackList;
 import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.rider.Rider;
+import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.backstage.BlackListRepo;
 import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import com.izouma.dingdong.repo.rider.RiderRepo;
 import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
@@ -38,13 +40,13 @@ public class BlackListService {
                 .build();
 
         switch (user.getIdentity()) {
-            case RIDER:
+            case MERCHANT:
                 Merchant merchant = merchantRepo.findByUserId(userId).orElseThrow(new BusinessException("商家不存在"));
                 merchant.setBlacklist(true);
                 merchantRepo.save(merchant);
                 build.setOtherId(merchant.getId());
                 break;
-            case MERCHANT:
+            case RIDER:
                 Rider rider = riderRepo.findByUserId(userId).orElseThrow(new BusinessException("骑手不存在"));
                 rider.setBlacklist(true);
                 riderRepo.save(rider);

+ 13 - 30
src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java

@@ -52,7 +52,9 @@ public class MerchantService {
      */
     public MerchantDTO registerApply(MerchantDTO merchantDTO) {
         //注册商家用户
-        User user = userService.register(merchantDTO.getPhone(), merchantDTO.getPassword());
+       // User user = userService.register(merchantDTO.getPhone(), merchantDTO.getPassword());
+        User user = userRepo.findByPhone(merchantDTO.getPhone());
+
 
         //查看商家是否已存在
         Merchant merchant1 = merchantRepo.findByPhone(merchantDTO.getPhone());
@@ -66,37 +68,16 @@ public class MerchantService {
             }
         }
 
-        user.setPassword(new BCryptPasswordEncoder().encode(merchantDTO.getPassword()));
-        if (ObjectUtil.isNotNull(merchantDTO.getLogo())) {
-            user.setAvatar(merchantDTO.getLogo());
-        }
-        if (ObjectUtil.isNotNull(merchantDTO.getShowName())) {
-            user.setNickname(merchantDTO.getShowName());
-        }
-        user.setIdentity(Identity.MERCHANT);
-        userRepo.save(user);
-
-//        //用于商家登录
-//        User user = userRepo.findByPhone(merchantDTO.getPhone());
-//        if (ObjectUtil.isNull(user)) {
-//            user = User.builder().username(merchantDTO.getPhone())
-//                    .password(new BCryptPasswordEncoder().encode(merchantDTO.getPassword()))
-//                    .blacklist(false)
-//                    .enabled(true)
-//                    .identity(Identity.MERCHANT)
-//                    .phone(merchantDTO.getPhone())
-//                    .nickname(merchantDTO.getShowName())
-//                    .avatar(merchantDTO.getLogo())
-//                    .authorities(Collections.singleton(new Authority(Authority.NAMES.ROLE_USER.name())))
-//                    .build();
-//        } else {
-//            user.setPassword(new BCryptPasswordEncoder().encode(merchantDTO.getPassword()));
+//        user.setPassword(new BCryptPasswordEncoder().encode(merchantDTO.getPassword()));
+//        if (ObjectUtil.isNotNull(merchantDTO.getLogo())) {
+//            user.setAvatar(merchantDTO.getLogo());
 //        }
-//        user = userRepo.save(user);
+//        if (ObjectUtil.isNotNull(merchantDTO.getShowName())) {
+//            user.setNickname(merchantDTO.getShowName());
+//        }
+//    user.setIdentity(Identity.MERCHANT);
+//        userRepo.save(user);
 
-/*        if (ObjectUtil.isEmpty(merchantDTO.getBusinessNature())) {
-            throw new BusinessException("商家性质未填");
-        }*/
 
         //新建商家
         Merchant merchant = new Merchant();
@@ -118,8 +99,10 @@ public class MerchantService {
         merchantSettings.setMerchantId(merchant.getId());
         merchantSettings.setEnabled(true);
         merchantSettings.setIsOpening(true);
+
         merchantSettingsRepo.save(merchantSettings);
 
+
         return merchantDTO;
     }
 

+ 5 - 4
src/main/java/com/izouma/dingdong/web/AuthenticationController.java

@@ -2,6 +2,7 @@ package com.izouma.dingdong.web;
 
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.dto.MerchantDTO;
+import com.izouma.dingdong.enums.Identity;
 import com.izouma.dingdong.exception.AuthenticationException;
 import com.izouma.dingdong.security.JwtTokenUtil;
 import com.izouma.dingdong.security.JwtUserDetailsService;
@@ -102,7 +103,7 @@ public class AuthenticationController {
     @ApiOperation("注册登录")
     public String loginByRegister(String phone, String password) {
         try {
-            User user = userService.register(phone, password);
+            User user = userService.register(phone, password, Identity.USER);
             return jwtTokenUtil.generateToken(JwtUserFactory.create(user));
         } catch (Exception e) {
             log.error("loginByRegister", e);
@@ -112,14 +113,14 @@ public class AuthenticationController {
 
     @PostMapping("/merchantRegister")
     @ApiOperation("注册登录")
-    public String registerMerchant( MerchantDTO merchantDTO) {
+    public String registerMerchant(MerchantDTO merchantDTO) {
         try {
-            User user = userService.register(merchantDTO.getPhone(),merchantDTO.getPassword());
+            User user = userService.register(merchantDTO.getPhone(), merchantDTO.getPassword(), Identity.MERCHANT);
             //商家信息
             merchantService.registerApply(merchantDTO);
             return jwtTokenUtil.generateToken(JwtUserFactory.create(user));
         } catch (Exception e) {
-            log.error("loginByRegister", e);
+            log.error("merchantRegister", e);
             throw new AuthenticationException("登录错误", e);
         }
     }

+ 135 - 2
src/main/java/com/izouma/dingdong/web/BaseController.java

@@ -2,6 +2,7 @@ package com.izouma.dingdong.web;
 
 import com.izouma.dingdong.annotations.Searchable;
 import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.utils.DateTimeUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
@@ -9,9 +10,13 @@ import org.springframework.data.jpa.domain.Specification;
 
 import javax.persistence.criteria.Predicate;
 import java.lang.reflect.Field;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.regex.Pattern;
 
 public class BaseController {
     public PageRequest toPageRequest(PageQuery pageQuery) {
@@ -36,6 +41,134 @@ public class BaseController {
 
     public <T> Specification<T> toSpecification(PageQuery pageQuery, Class queryClass) {
         return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = new ArrayList<>();
+            pageQuery.getQuery().forEach((property, value) -> {
+                if (value == null) {
+                    return;
+                }
+                if (String.class.equals(value.getClass())) {
+                    if (StringUtils.isEmpty((String) value)) {
+                        return;
+                    }
+                    if ("true".equals(value) || "false".equals(value)) {
+                        and.add(criteriaBuilder
+                                .and(criteriaBuilder.equal(root.get(property), Boolean.valueOf((String) value))));
+                        return;
+                    }
+                }
+                if (property.equals("createdAt") && !StringUtils.isEmpty(value.toString())) {
+                    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    and.add(criteriaBuilder.between(root.get(property), LocalDateTime
+                            .parse(value.toString().split(",")[0], df), LocalDateTime
+                            .parse(value.toString().split(",")[1], df)));
+                } else {
+                    try {
+                        Field field = queryClass.getDeclaredField(property);
+                        Class fieldType = field.getType();
+                        if (Enum.class.isAssignableFrom(fieldType)) {
+                            if (value instanceof Collection) {
+                                if (!((Collection) value).isEmpty()) {
+                                    List list = new ArrayList();
+                                    for (Object o : ((Collection) value)) {
+                                        list.add(Enum.valueOf(fieldType, String.valueOf(o)));
+                                    }
+                                    and.add(root.get(property).in(list));
+                                }
+                            } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
+                                if (((String) value).contains(",")) {
+                                    String[] arr = ((String) value).split(",");
+                                    List list = new ArrayList();
+                                    for (String s : arr) {
+                                        list.add(Enum.valueOf(fieldType, s));
+                                    }
+                                    and.add(root.get(property).in(list));
+                                } else {
+                                    and.add(criteriaBuilder.and(criteriaBuilder
+                                            .equal(root.get(property), Enum
+                                                    .valueOf(fieldType, String.valueOf(value)))));
+                                }
+                            }
+                        } else if (LocalDateTime.class == fieldType) {
+                            if (value instanceof List) {
+                                List list = (List) value;
+                                if (list.size() == 1) {
+                                    LocalDateTime start = DateTimeUtils
+                                            .toLocalDateTime((String) list.get(0), "yyyy-MM-dd HH:mm:ss");
+                                    and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                } else if (list.size() == 2) {
+                                    LocalDateTime end = DateTimeUtils
+                                            .toLocalDateTime((String) list.get(1), "yyyy-MM-dd HH:mm:ss");
+                                    and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                                }
+                            } else if (value instanceof String && Pattern
+                                    .matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", (String) value)) {
+                                String[] arr = ((String) value).split(",");
+                                LocalDateTime start = DateTimeUtils.toLocalDateTime(arr[0], "yyyy-MM-dd HH:mm:ss");
+                                and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                LocalDateTime end = DateTimeUtils.toLocalDateTime(arr[1], "yyyy-MM-dd HH:mm:ss");
+                                and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                            } else {
+                                and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                                        .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss"))));
+                            }
+                        } else if (LocalDate.class == fieldType) {
+                            if (value instanceof List) {
+                                List list = (List) value;
+                                if (list.size() == 1) {
+                                    LocalDate start = DateTimeUtils
+                                            .toLocalDate((String) list.get(0), "yyyy-MM-dd");
+                                    and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                } else if (list.size() == 2) {
+                                    LocalDate end = DateTimeUtils
+                                            .toLocalDate((String) list.get(1), "yyyy-MM-dd");
+                                    and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                                }
+                            } else if (value instanceof String && Pattern
+                                    .matches("^\\d{4}-\\d{2}-\\d{2},\\d{4}-\\d{2}-\\d{2}$", (String) value)) {
+                                String[] arr = ((String) value).split(",");
+                                LocalDate start = DateTimeUtils.toLocalDate(arr[0], "yyyy-MM-dd");
+                                and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                                LocalDate end = DateTimeUtils.toLocalDate(arr[1], "yyyy-MM-dd");
+                                and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                            } else {
+                                and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                                        .toLocalDateTime((String) value, "yyyy-MM-dd"))));
+                            }
+                        } else {
+                            and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                }
+            });
+            if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
+                Field[] fields = queryClass.getDeclaredFields();
+                List<Predicate> or = new ArrayList<>();
+                try {
+                    or.add(criteriaBuilder.equal(root.get("id"), pageQuery.getSearch()));
+                } catch (Exception ignored) {
+                }
+                for (Field field : fields) {
+                    Searchable annotation = field.getAnnotation(Searchable.class);
+                    if (annotation == null) {
+                        continue;
+                    }
+                    if (!annotation.value()) {
+                        continue;
+                    }
+
+                    or.add(criteriaBuilder.like(root.get(field.getName()), "%" + pageQuery.getSearch() + "%"));
+                }
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        };
+    }
+
+
+      /*  return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = new ArrayList<>();
             pageQuery.getQuery().forEach((property, value) -> {
                 if (value == null) {
@@ -102,6 +235,6 @@ public class BaseController {
                 and.add(criteriaBuilder.or(or.stream().toArray(Predicate[]::new)));
             }
             return criteriaBuilder.and(and.stream().toArray(Predicate[]::new));
-        };
-    }
+        };*/
+
 }

+ 9 - 3
src/main/java/com/izouma/dingdong/web/UserController.java

@@ -14,6 +14,8 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.web.bind.annotation.*;
@@ -21,7 +23,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @AllArgsConstructor
 @RestController
@@ -101,9 +105,11 @@ public class UserController extends BaseController {
 
     @GetMapping("/allUser")
     public Page<User> allUser(PageQuery pageQuery) {
-        //List<User> users = userRepo.findAllByIdentityAndAuthoritiesContains(Identity.USER, Authority.getInstance(Authority.NAMES.ROLE_USER));
-        List<User> users = userRepo.findAllByIdentity(Identity.USER);
-        return new PageImpl<>(users, toPageRequest(pageQuery), pageQuery.getPage());
+        Map<String, Object> query = pageQuery.getQuery();
+        //只查找身份为user的
+        query.put("identity","USER");
+        pageQuery.setQuery(query);
+        return userRepo.findAll(toSpecification(pageQuery, User.class), toPageRequest(pageQuery));
     }
 
     @GetMapping("/allAdmin")

+ 2 - 2
src/main/java/com/izouma/dingdong/web/backstage/BlackListController.java

@@ -63,8 +63,8 @@ public class BlackListController extends BaseController {
 
     @GetMapping("/move")
     @ApiOperation("移入黑名单")
-    public BlackList move(Long id, String reason) {
-        return blackListService.move(id, reason);
+    public BlackList move(Long userId, String reason) {
+        return blackListService.move(userId, reason);
     }
 
     @GetMapping("/remove")

+ 6 - 0
src/main/java/com/izouma/dingdong/web/backstage/EmailController.java

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.web.backstage;
 
+import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.web.BaseController;
 import com.izouma.dingdong.domain.backstage.Email;
 import com.izouma.dingdong.service.backstage.EmailService;
@@ -10,6 +11,7 @@ import com.izouma.dingdong.utils.ObjUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
 
 import lombok.AllArgsConstructor;
+import org.apache.catalina.security.SecurityUtil;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -59,5 +61,9 @@ public class EmailController extends BaseController {
         List<Email> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    public List<Email> my(){
+        return emailRepo.findAllByReceiveUserId(SecurityUtils.getAuthenticatedUser().getId());
+    }
 }
 

+ 1 - 1
src/main/vue/src/views/UserEdit.vue

@@ -36,7 +36,7 @@
                                       type="danger" v-if="formData.id">删除
                            </el-button>-->
                 <el-button @click="showSetLogistics=true"
-                           type="danger" v-if="formData.id">移入黑名单
+                           type="danger" v-if="formData.id && !formData.blacklist">移入黑名单
                 </el-button>
                 <el-button @click="" :loading="$store.state.fetchingData"
                            type="primary" v-if="formData.id">发送优惠券

+ 2 - 2
src/main/vue/src/views/UserList.vue

@@ -43,8 +43,8 @@
                         :preview-src-list="[row.avatar]"></el-image>
                 </template>
             </el-table-column>
-<!--            <el-table-column prop="consumption" label="累计消费" min-width="100">
-            </el-table-column>-->
+            <el-table-column prop="phone" label="电话" min-width="100">
+            </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="200">
                 <template slot-scope="{row}">
                     <el-button @click="editRow(row)" type="primary" size="mini"

+ 14 - 6
src/main/vue/src/views/backstage/BlackListList.vue

@@ -63,10 +63,10 @@
                     fixed="right"
                     min-width="150">
                 <template slot-scope="{row}">
-                    <!--<el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button>
-                    <el-button @click="remove(row)" type="danger" size="mini" plain>移除</el-button>
+                    <!--<el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>-->
+                    <!--                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
+                    <el-button @click="userRow(row)" type="primary" size="mini" plain>详情</el-button>
+                    <el-button @click="removeRow(row)" type="danger" size="mini" plain v-if="!row.remove">移除</el-button>
                 </template>
             </el-table-column>
         </el-table>
@@ -110,7 +110,7 @@
                     {label: "商家", value: "MERCHANT"},
                     {label: "骑手", value: "RIDER"}],
 
-                identity:'',
+                identity: '',
             }
         },
         computed: {
@@ -216,7 +216,7 @@
                     }
                 })
             },
-            remove(row) {
+            removeRow(row) {
                 this.$alert('移除将无法恢复,确认移除么?', '提示', {type: 'error'}).then(() => {
                     return this.$http.post({
                         url: `/blackList/remove`,
@@ -235,6 +235,14 @@
                     }
                 })
             },
+            userRow(row) {
+                this.$router.push({
+                    path: "/userEdit",
+                    query: {
+                        id: row.userId
+                    }
+                });
+            }
         }
     }
 </script>