Bläddra i källkod

Merge branch 'dev' into 2D展厅

licailing 4 år sedan
förälder
incheckning
f5a2bd8389
33 ändrade filer med 322 tillägg och 834 borttagningar
  1. 9 0
      src/main/java/com/izouma/nineth/config/CacheConfig.java
  2. 2 0
      src/main/java/com/izouma/nineth/config/RedisKeys.java
  3. 2 0
      src/main/java/com/izouma/nineth/dto/UserRegister.java
  4. 1 1
      src/main/java/com/izouma/nineth/exception/BusinessException.java
  5. 1 1
      src/main/java/com/izouma/nineth/repo/TokenHistoryRepo.java
  6. 4 4
      src/main/java/com/izouma/nineth/repo/UserRepo.java
  7. 2 3
      src/main/java/com/izouma/nineth/security/WebSecurityConfig.java
  8. 2 1
      src/main/java/com/izouma/nineth/service/AssetService.java
  9. 7 2
      src/main/java/com/izouma/nineth/service/BannerService.java
  10. 40 0
      src/main/java/com/izouma/nineth/service/CacheService.java
  11. 15 0
      src/main/java/com/izouma/nineth/service/CollectionService.java
  12. 40 34
      src/main/java/com/izouma/nineth/service/IdentityAuthService.java
  13. 17 25
      src/main/java/com/izouma/nineth/service/OrderService.java
  14. 7 2
      src/main/java/com/izouma/nineth/service/PurchaseLevelService.java
  15. 1 3
      src/main/java/com/izouma/nineth/service/StatisticService.java
  16. 12 0
      src/main/java/com/izouma/nineth/service/UserService.java
  17. 4 0
      src/main/java/com/izouma/nineth/utils/TokenUtils.java
  18. 13 14
      src/main/java/com/izouma/nineth/web/AssetController.java
  19. 13 5
      src/main/java/com/izouma/nineth/web/BannerController.java
  20. 30 10
      src/main/java/com/izouma/nineth/web/CollectionController.java
  21. 9 0
      src/main/java/com/izouma/nineth/web/IdentityAuthController.java
  22. 13 20
      src/main/java/com/izouma/nineth/web/OrderController.java
  23. 4 4
      src/main/java/com/izouma/nineth/web/PurchaseLevelController.java
  24. 31 1
      src/main/java/com/izouma/nineth/web/StatisticController.java
  25. 1 2
      src/main/java/com/izouma/nineth/web/UserController.java
  26. 0 2
      src/main/vue/package.json
  27. 1 1
      src/main/vue/src/router.js
  28. 1 1
      src/main/vue/src/views/BlindBoxList.vue
  29. 1 0
      src/main/vue/src/views/MinterEdit.vue
  30. 23 692
      src/main/vue/yarn.lock
  31. 2 2
      src/test/java/com/izouma/nineth/CommonTest.java
  32. 14 3
      src/test/java/com/izouma/nineth/repo/UserRepoTest.java
  33. 0 1
      src/test/java/com/izouma/nineth/service/OrderServiceTest.java

+ 9 - 0
src/main/java/com/izouma/nineth/config/CacheConfig.java

@@ -104,6 +104,15 @@ public class CacheConfig {
                 .entryTtl(Duration.ofSeconds(10))
                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
 
+        cacheNamesConfigurationMap.put("myUserInfo", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofHours(1))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+
+        cacheNamesConfigurationMap.put("userStat", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofHours(1))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+
+
         RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                 .entryTtl(Duration.ofDays(7))
                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));

+ 2 - 0
src/main/java/com/izouma/nineth/config/RedisKeys.java

@@ -24,4 +24,6 @@ public class RedisKeys {
     public static final String UPDATE_SALE = "updateSale";
 
     public static final String UPDATE_STOCK = "updateSale";
+
+    public static final String LIMIT_REQ = "limitReq::";
 }

+ 2 - 0
src/main/java/com/izouma/nineth/dto/UserRegister.java

@@ -51,4 +51,6 @@ public class UserRegister {
     private Long collectionId;
 
     private String intro;
+
+    private boolean minter;
 }

+ 1 - 1
src/main/java/com/izouma/nineth/exception/BusinessException.java

@@ -24,7 +24,7 @@ public class BusinessException extends RuntimeException implements Supplier<Busi
     }
 
     public BusinessException(String error, int code) {
-        super();
+        super(error);
         this.error = error;
         this.code = code;
     }

+ 1 - 1
src/main/java/com/izouma/nineth/repo/TokenHistoryRepo.java

@@ -41,7 +41,7 @@ public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, Jpa
 
     List<TokenHistory> findByOperationAndPriceNull(String oper);
 
-    @Query(nativeQuery = true, value = "select to_user_id , to_user, sum(price) total from token_history " +
+    @Query(nativeQuery = true, value = "select to_user_id , to_user, to_avatar, sum(price) total from token_history " +
             "where created_at between ?1 and ?2 group by to_user_id order by sum(price) desc limit ?3")
     List<Map<String, Object>> sumPrice(LocalDateTime start, LocalDateTime end, int size);
 }

+ 4 - 4
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -181,10 +181,10 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
 
     List<User> findBySettleAccountIdIsNotNull();
 
-//    @Transactional
-//    @Modifying
-//    @Query("update User set vipPoint = vipPoint + ?2 where id = ?1")
-//    void updateVipPoint(Long id, int num);
+    @Transactional
+    @Modifying
+    @Query("update User set vipPoint = vipPoint + ?2 where id = ?1")
+    void addVipPoint(Long id, int num);
 
     @Transactional
     @Modifying

+ 2 - 3
src/main/java/com/izouma/nineth/security/WebSecurityConfig.java

@@ -107,9 +107,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/news/all").permitAll()
                 .antMatchers("/news/get/**").permitAll()
                 .antMatchers("/druid/**").permitAll()
-                .antMatchers("/testmq/**").permitAll()
-                .antMatchers("/teststock/**").permitAll()
-                .antMatchers("/debounce/**").permitAll()
+                .antMatchers("/identityAuth/autoAuth").permitAll()
+                .antMatchers("/statistic/weekTop").permitAll()
                 // all other requests need to be authenticated
                 .anyRequest().authenticated().and()
                 // make sure we use stateless session; session won't be used to

+ 2 - 1
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -23,6 +23,7 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.context.ApplicationContext;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -464,7 +465,7 @@ public class AssetService {
         return "ok";
     }
 
-
+    @Cacheable(value = "userStat", key = "#userId")
     public Map<String, BigDecimal> breakdown(Long userId) {
         List<TokenHistory> page = tokenHistoryRepo.userHistory(userId);
         BigDecimal sale = page.stream()

+ 7 - 2
src/main/java/com/izouma/nineth/service/BannerService.java

@@ -2,9 +2,11 @@ package com.izouma.nineth.service;
 
 import com.izouma.nineth.domain.Banner;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.PageWrapper;
 import com.izouma.nineth.repo.BannerRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
@@ -14,7 +16,10 @@ public class BannerService {
 
     private BannerRepo bannerRepo;
 
-    public Page<Banner> all(PageQuery pageQuery) {
-        return bannerRepo.findAll(JpaUtils.toSpecification(pageQuery, Banner.class), JpaUtils.toPageRequest(pageQuery));
+    @Cacheable(value = "bannerList", key = "#pageQuery.hashCode()")
+    public PageWrapper<Banner> all(PageQuery pageQuery) {
+        Page<Banner> page = bannerRepo.findAll(JpaUtils.toSpecification(pageQuery, Banner.class), JpaUtils.toPageRequest(pageQuery));
+        return new PageWrapper<>(page.getContent(), page.getPageable().getPageNumber(),
+                page.getPageable().getPageSize(), page.getTotalElements());
     }
 }

+ 40 - 0
src/main/java/com/izouma/nineth/service/CacheService.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.service;
 
 import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
 @Service
@@ -33,6 +34,10 @@ public class CacheService {
     public void clearUserInfo(Long id) {
     }
 
+    @CacheEvict(value = "myUserInfo", key = "#id")
+    public void clearUserMy(Long id) {
+    }
+
     @CacheEvict(value = "recommend", allEntries = true)
     public void clearRecommend() {
     }
@@ -40,4 +45,39 @@ public class CacheService {
     @CacheEvict(value = "collectionList", allEntries = true)
     public void clearCollectionList() {
     }
+
+    @Scheduled(cron = "1 0 0 ? * 2")
+    @CacheEvict(value = "weekTop", allEntries = true)
+    public void clearWeekTop() {
+    }
+
+    @CacheEvict(value = "bannerList", allEntries = true)
+    public void clearBannerList() {
+    }
+
+    @Scheduled(fixedRate = 60000)
+    @CacheEvict(value = "total", allEntries = true)
+    public void clearTotal() {
+    }
+
+    @Scheduled(fixedRate = 60000)
+    @CacheEvict(value = "userTrend", allEntries = true)
+    public void clearUserTrend() {
+    }
+
+    @Scheduled(fixedRate = 60000)
+    @CacheEvict(value = "orderNumTrend", allEntries = true)
+    public void clearOrderNumTrend() {
+    }
+
+    @Scheduled(fixedRate = 60000)
+    @CacheEvict(value = "orderPriceTrend", allEntries = true)
+    public void clearOrderPriceTrend() {
+    }
+
+//    @Scheduled(fixedRate = 120000)
+    @CacheEvict(value = "top", key = "#month")
+    public void clearTop(int month) {
+    }
+
 }

+ 15 - 0
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -33,6 +33,7 @@ import org.springframework.data.redis.core.BoundValueOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.TaskScheduler;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.PostConstruct;
 import javax.persistence.criteria.Predicate;
@@ -129,6 +130,7 @@ public class CollectionService {
         record.setOwnerAvatar(minter.getAvatar());
         record.setStock(record.getTotal());
         record.setSale(0);
+        record.setVipQuota(record.getTotalQuota());
         if (record.isScheduleSale()) {
             if (record.getStartTime() == null) {
                 throw new BusinessException("请填写定时发布时间");
@@ -455,4 +457,17 @@ public class CollectionService {
         rocketMQTemplate.convertAndSend(generalProperties.getUpdateQuotaTopic(), id);
         return stock;
     }
+
+    @Cacheable(value = "recommendLegacy", key = "#type")
+    public List<CollectionDTO> recommendLegacy(@RequestParam String type) {
+        return collectionRepo.recommend(type).stream().map(rc -> {
+            if (StringUtils.isNotBlank(rc.getRecommend().getPic())) {
+                rc.getCollection().setPic(Collections.singletonList(new FileObject(null, rc.getRecommend()
+                        .getPic(), null, null)));
+            }
+            CollectionDTO collectionDTO = new CollectionDTO();
+            BeanUtils.copyProperties(rc.getCollection(), collectionDTO);
+            return collectionDTO;
+        }).collect(Collectors.toList());
+    }
 }

+ 40 - 34
src/main/java/com/izouma/nineth/service/IdentityAuthService.java

@@ -23,9 +23,7 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
@@ -205,48 +203,56 @@ public class IdentityAuthService {
         try {
             List<IdentityAuth> list = identityAuthRepo.findByStatusAndAutoValidated(AuthStatus.PENDING, false);
             list.parallelStream().forEach(identityAuth -> {
-                log.info("实名 {}", identityAuth.getRealName());
-                boolean success = false;
-                String reason = null;
-                User user = userRepo.findById(identityAuth.getUserId()).orElseThrow(new BusinessException("用户不存在"));
-                if (user.getAuthStatus() == AuthStatus.SUCCESS) {
-                    audit(identityAuth.getId(), AuthStatus.SUCCESS, null);
-                    return;
-                }
-                if (!Pattern.matches("[1-9]{1}[0-9]{5}(19|20)[0-9]{2}((0[1-9]{1})|(1[0-2]{1}))((0[1-9]{1})|([1-2]{1}[0-9]{1}|(3[0-1]{1})))[0-9]{3}[0-9x]{1}", identityAuth.getIdNo()
-                        .toLowerCase())) {
-                    audit(identityAuth.getId(), AuthStatus.FAIL, "身份证格式错误");
-                    return;
-                } else {
-                    LocalDate birth = DateTimeUtils.toLocalDate(identityAuth.getIdNo().substring(6, 14), "yyyyMMdd");
-                    long age = ChronoUnit.YEARS.between(birth, LocalDate.now());
-                    if (age < 18) {
-                        audit(identityAuth.getId(), AuthStatus.FAIL, "未满18岁");
-                        return;
-                    } else if (age > 60) {
-                        audit(identityAuth.getId(), AuthStatus.FAIL, "超过60岁");
-                        return;
-                    }
-                }
+                Map<String, Object> map = auth(identityAuth);
+                audit(identityAuth.getId(), (AuthStatus) map.get("status"), (String) map.get("reason"));
+            });
+        } catch (Exception e) {
+            log.error("批量自动实名出错", e);
+        }
+    }
 
+    public Map<String, Object> auth(IdentityAuth identityAuth) {
+        log.info("实名 {}", identityAuth.getRealName());
+        Map<String, Object> result = new HashMap<>();
+        String reason = null;
+        User user = userRepo.findById(identityAuth.getUserId()).orElseThrow(new BusinessException("用户不存在"));
+        if (user.getAuthStatus() == AuthStatus.SUCCESS) {
+            result.put("status", AuthStatus.SUCCESS);
+        } else if (!Pattern.matches("[1-9]{1}[0-9]{5}(19|20)[0-9]{2}((0[1-9]{1})|(1[0-2]{1}))((0[1-9]{1})|([1-2]{1}[0-9]{1}|(3[0-1]{1})))[0-9]{3}[0-9x]{1}", identityAuth.getIdNo()
+                .toLowerCase())) {
+            result.put("status", AuthStatus.FAIL);
+            result.put("reason", "身份证格式错误");
+        } else {
+            LocalDate birth = DateTimeUtils.toLocalDate(identityAuth.getIdNo().substring(6, 14), "yyyyMMdd");
+            long age = ChronoUnit.YEARS.between(birth, LocalDate.now());
+            if (age < 18) {
+                result.put("status", AuthStatus.FAIL);
+                result.put("reason", "未满18岁");
+            } else if (age > 60) {
+                result.put("status", AuthStatus.FAIL);
+                result.put("reason", "超过60岁");
+            } else {
                 int count = identityAuthRepo.countByIdNoAndStatus(identityAuth.getIdNo(), AuthStatus.SUCCESS);
 
                 if (count >= 3) {
-                    success = false;
-                    reason = "同一身份证注册超过3个";
+                    result.put("status", AuthStatus.PENDING);
+                    result.put("reason", "同一身份证注册超过3个");
                 } else {
                     try {
                         validate(identityAuth.getRealName(), user.getPhone(), identityAuth.getIdNo());
-                        success = true;
+                        result.put("status", AuthStatus.SUCCESS);
                     } catch (Exception e) {
                         log.error("自动实名出错", e);
-                        reason = e.getMessage();
+                        if ("不匹配".equals(e.getMessage())) {
+                            result.put("status", AuthStatus.FAIL);
+                        } else {
+                            result.put("status", AuthStatus.PENDING);
+                        }
+                        result.put("reason", e.getMessage());
                     }
                 }
-                audit(identityAuth.getId(), success ? AuthStatus.SUCCESS : AuthStatus.PENDING, reason);
-            });
-        } catch (Exception e) {
-            log.error("批量自动实名出错", e);
+            }
         }
+        return result;
     }
 }

+ 17 - 25
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -7,7 +7,6 @@ import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradeWapPayRequest;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
-import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
@@ -57,6 +56,7 @@ import org.springframework.ui.Model;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
@@ -110,10 +110,11 @@ public class OrderService {
             throw new BusinessException("签名已过期");
         }
 
-        Integer stock = collectionService.getStock(collectionId);
-        if (stock == null || stock <= 0) {
-            throw new BusinessException("藏品已售罄", ErrorCode.SOLD_OUT);
-        }
+//        Integer stock = collectionService.getStock(collectionId);
+//        if (stock == null || stock <= 0) {
+//            throw new BusinessException("藏品已售罄", ErrorCode.SOLD_OUT);
+//        }
+        limitReq(collectionId);
 
         Long id = snowflakeIdWorker.nextId();
         SendResult result = rocketMQTemplate.syncSend(generalProperties.getCreateOrderTopic(),
@@ -123,6 +124,15 @@ public class OrderService {
         return String.valueOf(id);
     }
 
+    public void limitReq(Long collectionId) {
+        BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.LIMIT_REQ + collectionId);
+        ops.setIfAbsent(3000, Duration.ofSeconds(30));
+        Long val = ops.decrement();
+        if (val == null || val < 0) {
+            throw new BusinessException("很遗憾,藏品已售罄");
+        }
+    }
+
     public Order create(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor,
                         Long id, boolean vip) {
         long t = System.currentTimeMillis();
@@ -208,11 +218,6 @@ public class OrderService {
                         collectionService.decreaseQuota(collectionId, 1);
                     }
                 } else {
-//                    long count = userRepo.countAllByCollectionIdAndCollectionInvitor(collectionId, userId);
-//                    int sub = collection.getAssignment() - (int) count;
-//                    if (sub > 0) {
-//                        throw new BusinessException("再拉新" + sub + "人即可购买");
-//                    }
                     if (user.getVipPoint() < 1) {
                         throw new BusinessException("没有购买名额");
                     }
@@ -284,7 +289,7 @@ public class OrderService {
 
             if (usePoint > 0) {
                 // 扣除积分
-                userRepo.updateVipPoint(userId, -usePoint);
+                userRepo.addVipPoint(userId, -usePoint);
             }
             rocketMQTemplate.syncSend(generalProperties.getUpdateStockTopic(), collectionId, 10000);
             log.info("订单创建完成, id={}, {}ms", order.getId(), System.currentTimeMillis() - t);
@@ -293,7 +298,7 @@ public class OrderService {
             collectionService.increaseStock(collectionId, qty);
             if (usePoint > 0) {
                 // 扣除积分
-                userRepo.updateVipPoint(userId, usePoint);
+                userRepo.addVipPoint(userId, usePoint);
                 log.info("取消加积分用户ID:{}, 积分:{}", userId, usePoint);
             }
             throw e;
@@ -818,19 +823,6 @@ public class OrderService {
         }
     }
 
-    public void refund(Long id) throws WxPayException {
-        Order order = orderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
-        if (order.getStatus() != OrderStatus.FINISH) {
-            throw new BusinessException("订单未付款");
-        }
-        WxPayRefundRequest request = new WxPayRefundRequest();
-        request.setTransactionId(order.getTransactionId());
-        request.setTotalFee(order.getTotalPrice().multiply(BigDecimal.valueOf(100)).intValue());
-        request.setRefundFee(order.getTotalPrice().multiply(BigDecimal.valueOf(100)).intValue());
-        request.setOutRefundNo(String.valueOf(snowflakeIdWorker.nextId()));
-        wxPayService.refund(request);
-    }
-
     public Object queryCreateOrder(String id) {
         Object res = redisTemplate.opsForValue().get(RedisKeys.CREATE_ORDER + id);
         if (res != null) {

+ 7 - 2
src/main/java/com/izouma/nineth/service/PurchaseLevelService.java

@@ -2,9 +2,11 @@ package com.izouma.nineth.service;
 
 import com.izouma.nineth.domain.PurchaseLevel;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.PageWrapper;
 import com.izouma.nineth.repo.PurchaseLevelRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
@@ -14,7 +16,10 @@ public class PurchaseLevelService {
 
     private PurchaseLevelRepo purchaseLevelRepo;
 
-    public Page<PurchaseLevel> all(PageQuery pageQuery) {
-        return purchaseLevelRepo.findAll(JpaUtils.toSpecification(pageQuery, PurchaseLevel.class), JpaUtils.toPageRequest(pageQuery));
+    @Cacheable(value = "purchaseLevelList", key = "#pageQuery.hashCode()")
+    public PageWrapper<PurchaseLevel> all(PageQuery pageQuery) {
+        Page<PurchaseLevel> page = purchaseLevelRepo.findAll(JpaUtils.toSpecification(pageQuery, PurchaseLevel.class), JpaUtils.toPageRequest(pageQuery));
+        return new PageWrapper<>(page.getContent(), page.getPageable().getPageNumber(),
+                page.getPageable().getPageSize(), page.getTotalElements());
     }
 }

+ 1 - 3
src/main/java/com/izouma/nineth/service/StatisticService.java

@@ -116,9 +116,7 @@ public class StatisticService {
         return trend;
     }
 
-    public String top(int year, int month, int size) {
-        LocalDateTime start = LocalDateTime.of(year, month, 1, 0, 0, 0);
-        LocalDateTime end = start.plusMonths(1).minusSeconds(1);
+    public String top(LocalDateTime start, LocalDateTime end, int size) {
         List<Map<String, Object>> maps = tokenHistoryRepo.sumPrice(start, end, size);
         return JSONObject.toJSONString(maps);
     }

+ 12 - 0
src/main/java/com/izouma/nineth/service/UserService.java

@@ -34,6 +34,7 @@ import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.context.event.EventListener;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -76,6 +77,11 @@ public class UserService {
     private CollectionService     collectionService;
 
     public User update(User user) {
+        if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
+            if (!SecurityUtils.getAuthenticatedUser().getId().equals(user.getId())) {
+                throw new BusinessException("无权限");
+            }
+        }
         User orig = userRepo.findById(user.getId()).orElseThrow(new BusinessException("无记录"));
         ObjUtils.merge(orig, user);
         orig = save(orig);
@@ -87,6 +93,7 @@ public class UserService {
         userRepo.updateHistoryFromUser(orig.getId());
         userRepo.updateHistoryToUser(orig.getId());
         cacheService.clearCollection();
+        cacheService.clearUserMy(user.getId());
         return orig;
     }
 
@@ -658,4 +665,9 @@ public class UserService {
             log.info("checkSettleAccount {}/{}", count.get(), list.size());
         });
     }
+
+    @Cacheable(value = "myUserInfo", key = "#id")
+    public User my(Long id) {
+        return userRepo.findById(id).orElseThrow(new BusinessException("用户不存在"));
+    }
 }

+ 4 - 0
src/main/java/com/izouma/nineth/utils/TokenUtils.java

@@ -20,4 +20,8 @@ public class TokenUtils {
         }
         return null;
     }
+
+    public static void main(String[] args) {
+        System.out.println(TokenUtils.genTokenId());
+    }
 }

+ 13 - 14
src/main/java/com/izouma/nineth/web/AssetController.java

@@ -10,7 +10,6 @@ import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.service.AssetService;
 import com.izouma.nineth.service.GiftOrderService;
-import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
@@ -37,15 +36,15 @@ public class AssetController extends BaseController {
     private OrderRepo        orderRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
-    @PostMapping("/save")
-    public Asset save(@RequestBody Asset record) {
-        if (record.getId() != null) {
-            Asset orig = assetRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
-            ObjUtils.merge(orig, record);
-            return assetRepo.save(orig);
-        }
-        return assetRepo.save(record);
-    }
+//    @PostMapping("/save")
+//    public Asset save(@RequestBody Asset record) {
+//        if (record.getId() != null) {
+//            Asset orig = assetRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+//            ObjUtils.merge(orig, record);
+//            return assetRepo.save(orig);
+//        }
+//        return assetRepo.save(record);
+//    }
 
 
     //@PreAuthorize("hasRole('ADMIN')")
@@ -61,10 +60,10 @@ public class AssetController extends BaseController {
         return asset;
     }
 
-    @PostMapping("/del/{id}")
-    public void del(@PathVariable Long id) {
-        assetRepo.softDelete(id);
-    }
+//    @PostMapping("/del/{id}")
+//    public void del(@PathVariable Long id) {
+//        assetRepo.softDelete(id);
+//    }
 
     @GetMapping("/excel")
     @ResponseBody

+ 13 - 5
src/main/java/com/izouma/nineth/web/BannerController.java

@@ -1,10 +1,11 @@
 package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.Banner;
-import com.izouma.nineth.service.BannerService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.BannerRepo;
+import com.izouma.nineth.service.BannerService;
+import com.izouma.nineth.service.CacheService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
@@ -22,16 +23,21 @@ import java.util.List;
 public class BannerController extends BaseController {
     private BannerService bannerService;
     private BannerRepo    bannerRepo;
+    private CacheService  cacheService;
 
-    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public Banner save(@RequestBody Banner record) {
         if (record.getId() != null) {
             Banner orig = bannerRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, record);
-            return bannerRepo.save(orig);
+            orig = bannerRepo.save(orig);
+            cacheService.clearBannerList();
+            return orig;
         }
-        return bannerRepo.save(record);
+        record = bannerRepo.save(record);
+        cacheService.clearBannerList();
+        return record;
     }
 
 
@@ -39,7 +45,7 @@ public class BannerController extends BaseController {
     @PostMapping("/all")
     public Page<Banner> all(@RequestBody PageQuery pageQuery) {
         pageQuery.getQuery().put("del", false);
-        return bannerService.all(pageQuery);
+        return bannerService.all(pageQuery).toPage();
     }
 
     @GetMapping("/get/{id}")
@@ -47,9 +53,11 @@ public class BannerController extends BaseController {
         return bannerRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
 
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {
         bannerRepo.softDelete(id);
+        cacheService.clearBannerList();
     }
 
     @GetMapping("/excel")

+ 30 - 10
src/main/java/com/izouma/nineth/web/CollectionController.java

@@ -2,7 +2,10 @@ package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.FileObject;
-import com.izouma.nineth.dto.*;
+import com.izouma.nineth.dto.CollectionDTO;
+import com.izouma.nineth.dto.CreateBlindBox;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.RecommendDTO;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.NewsRepo;
@@ -16,16 +19,18 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import java.util.stream.Collectors;
 
-import org.springframework.cache.annotation.Cacheable;
-
 @RestController
 @RequestMapping("/collection")
 @AllArgsConstructor
@@ -36,12 +41,13 @@ public class CollectionController extends BaseController {
     private NewsRepo          newsRepo;
     private CacheService      cacheService;
 
-    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public Collection save(@RequestBody Collection record) {
         return collectionService.update(record);
     }
 
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/create")
     public Collection create(@RequestBody Collection record) {
         return collectionService.create(record);
@@ -59,10 +65,11 @@ public class CollectionController extends BaseController {
                 .orElseThrow(new BusinessException("无记录")), true, true);
     }
 
-    @PostMapping("/del/{id}")
-    public void del(@PathVariable Long id) {
-        collectionRepo.softDelete(id);
-    }
+//    @PreAuthorize("hasRole('ADMIN')")
+//    @PostMapping("/del/{id}")
+//    public void del(@PathVariable Long id) {
+//        collectionRepo.softDelete(id);
+//    }
 
     @GetMapping("/excel")
     @ResponseBody
@@ -91,6 +98,7 @@ public class CollectionController extends BaseController {
         return collectionService.toDTO(collectionRepo.userLikes(SecurityUtils.getAuthenticatedUser().getId()));
     }
 
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/createBlindBox")
     public Collection createBlindBox(@RequestBody CreateBlindBox createBlindBox) {
         return collectionService.createBlindBox(createBlindBox);
@@ -111,13 +119,23 @@ public class CollectionController extends BaseController {
             }
             CollectionDTO collectionDTO = new CollectionDTO();
             BeanUtils.copyProperties(rc.getCollection(), collectionDTO);
+
+            // 减少数据量
+            collectionDTO.setDetail(null);
+            collectionDTO.setPrivileges(null);
+            collectionDTO.setProperties(null);
+
             return collectionDTO;
         }).collect(Collectors.toList());
     }
 
     @GetMapping("/recommend")
     @Cacheable("recommend")
-    public List<RecommendDTO> recommendAll() {
+    public Object recommendAll(@RequestParam(required = false) String type) {
+        if (StringUtils.isNotEmpty(type)) {
+            return collectionService.recommendLegacy(type);
+        }
+
         List<RecommendDTO> recommedDTOS = new ArrayList<>();
 
         List<RecommendDTO> collectionDTOS = collectionRepo.recommend("LIST").stream().map(rc -> {
@@ -143,6 +161,8 @@ public class CollectionController extends BaseController {
         return recommedDTOS;
     }
 
+
+    @PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/clearRecommend")
     public String clearRecommend() {
         cacheService.clearRecommend();

+ 9 - 0
src/main/java/com/izouma/nineth/web/IdentityAuthController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/identityAuth")
@@ -80,5 +81,13 @@ public class IdentityAuthController extends BaseController {
     public void removeDuplicated() {
         identityAuthService.removeDuplicated();
     }
+
+    @PostMapping("/autoAuth")
+    public Object authAuth(@RequestParam Long id) {
+        IdentityAuth identityAuth = identityAuthRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        Map<String, Object> map = identityAuthService.auth(identityAuth);
+        identityAuthService.audit(identityAuth.getId(), (AuthStatus) map.get("status"), (String) map.get("reason"));
+        return map;
+    }
 }
 

+ 13 - 20
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -1,6 +1,5 @@
 package com.izouma.nineth.web;
 
-import com.github.binarywang.wxpay.exception.WxPayException;
 import com.izouma.nineth.domain.Order;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.OrderDTO;
@@ -12,7 +11,6 @@ import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.service.OrderService;
-import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.izouma.nineth.utils.excel.ExcelUtils;
@@ -39,15 +37,15 @@ public class OrderController extends BaseController {
     private UserRepo     userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
-    @PostMapping("/save")
-    public Order save(@RequestBody Order record) {
-        if (record.getId() != null) {
-            Order orig = orderRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
-            ObjUtils.merge(orig, record);
-            return orderRepo.save(orig);
-        }
-        return orderRepo.save(record);
-    }
+//    @PostMapping("/save")
+//    public Order save(@RequestBody Order record) {
+//        if (record.getId() != null) {
+//            Order orig = orderRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+//            ObjUtils.merge(orig, record);
+//            return orderRepo.save(orig);
+//        }
+//        return orderRepo.save(record);
+//    }
 
 
     //@PreAuthorize("hasRole('ADMIN')")
@@ -74,10 +72,10 @@ public class OrderController extends BaseController {
         return orderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
     }
 
-    @PostMapping("/del/{id}")
-    public void del(@PathVariable Long id) {
-        orderRepo.softDelete(id);
-    }
+//    @PostMapping("/del/{id}")
+//    public void del(@PathVariable Long id) {
+//        orderRepo.softDelete(id);
+//    }
 
     @PostMapping("/excel")
     @ResponseBody
@@ -123,11 +121,6 @@ public class OrderController extends BaseController {
         orderRepo.save(order);
     }
 
-    @PostMapping("/refund")
-    public void refund(@RequestParam Long id) throws WxPayException {
-        orderService.refund(id);
-    }
-
     @GetMapping("/{id}/status")
     public Object status(@PathVariable Long id) {
         Order order = orderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));

+ 4 - 4
src/main/java/com/izouma/nineth/web/PurchaseLevelController.java

@@ -1,14 +1,14 @@
 package com.izouma.nineth.web;
+
 import com.izouma.nineth.domain.PurchaseLevel;
-import com.izouma.nineth.service.PurchaseLevelService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.PurchaseLevelRepo;
+import com.izouma.nineth.service.PurchaseLevelService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -20,7 +20,7 @@ import java.util.List;
 @AllArgsConstructor
 public class PurchaseLevelController extends BaseController {
     private PurchaseLevelService purchaseLevelService;
-    private PurchaseLevelRepo purchaseLevelRepo;
+    private PurchaseLevelRepo    purchaseLevelRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -37,7 +37,7 @@ public class PurchaseLevelController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<PurchaseLevel> all(@RequestBody PageQuery pageQuery) {
-        return purchaseLevelService.all(pageQuery);
+        return purchaseLevelService.all(pageQuery).toPage();
     }
 
     @GetMapping("/get/{id}")

+ 31 - 1
src/main/java/com/izouma/nineth/web/StatisticController.java

@@ -1,12 +1,19 @@
 package com.izouma.nineth.web;
 
+import com.izouma.nineth.service.CacheService;
 import com.izouma.nineth.service.StatisticService;
 import lombok.AllArgsConstructor;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Map;
 
 @RestController
@@ -14,29 +21,52 @@ import java.util.Map;
 @AllArgsConstructor
 public class StatisticController {
     private StatisticService statisticService;
+    private CacheService     cacheService;
 
     @GetMapping("/total")
+    @Cacheable("total")
     public Map<String, Object> total() {
         return statisticService.total();
     }
 
     @GetMapping("/userTrend")
+    @Cacheable("userTrend")
     public Map<String, Long> userTrend(int day) {
         return statisticService.userTrend(day);
     }
 
     @GetMapping("/orderNumTrend")
+    @Cacheable("orderNumTrend")
     public Map<String, Map<String, Long>> orderNumTrend(int day) {
         return statisticService.orderNumTrend(day);
     }
 
     @GetMapping("/orderPriceTrend")
+    @Cacheable("orderPriceTrend")
     public Map<String, Map<String, BigDecimal>> orderPriceTrend(int day) {
         return statisticService.orderPriceTrend(day);
     }
 
     @GetMapping("/top")
+    @CachePut(value = "top", key = "#month")
     public String top(int year, int month) {
-        return statisticService.top(year, month, 50);
+        LocalDateTime start = LocalDateTime.of(year, month, 1, 0, 0, 0);
+        LocalDateTime end = start.plusMonths(1).minusSeconds(1);
+        return statisticService.top(start, end, 50);
+    }
+
+    @GetMapping("/weekTop")
+    @Cacheable("weekTop")
+    public String weekTop() {
+        LocalDate now = LocalDate.now();
+        LocalDate endDate = now.minusDays(now.getDayOfWeek().getValue());
+        LocalDateTime start = LocalDateTime.of(endDate.minusDays(6), LocalTime.MIN);
+        return statisticService.top(start, LocalDateTime.of(endDate, LocalTime.MAX), 50);
+    }
+
+    @Scheduled(fixedRate = 120000)
+    public void clearTop() {
+        int monthValue = LocalDate.now().getMonthValue();
+        cacheService.clearTop(monthValue);
     }
 }

+ 1 - 2
src/main/java/com/izouma/nineth/web/UserController.java

@@ -69,8 +69,7 @@ public class UserController extends BaseController {
 
     @GetMapping("/my")
     public User my() {
-        return userRepo.findById(SecurityUtils.getAuthenticatedUser().getId())
-                .orElseThrow(new BusinessException("用户不存在"));
+        return userService.my(SecurityUtils.getAuthenticatedUser().getId());
     }
 
     @GetMapping("/myAdmin")

+ 0 - 2
src/main/vue/package.json

@@ -43,8 +43,6 @@
     "@vue/cli-plugin-vuex": "^4.4.4",
     "@vue/cli-service": "^4.4.4",
     "@vue/eslint-config-prettier": "^6.0.0",
-    "element-theme": "^2.0.1",
-    "element-theme-chalk": "^2.15.1",
     "less": "^3.0.4",
     "less-loader": "^5.0.0",
     "less-vars-loader": "^1.1.0",

+ 1 - 1
src/main/vue/src/router.js

@@ -174,7 +174,7 @@ const router = new Router({
                 {
                     path: '/orderUsedList',
                     name: 'OrderUsedList',
-                    component: () => import(/* webpackChunkName: "orderList" */ '@/views/OrderUsedList.vue'),
+                    component: () => import(/* webpackChunkName: "orderUsedList" */ '@/views/OrderUsedList.vue'),
                     meta: {
                         title: '订单'
                     }

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

@@ -46,7 +46,7 @@
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="name" label="名称"> </el-table-column>
+            <el-table-column prop="name" label="名称" show-overflow-tooltip> </el-table-column>
             <el-table-column prop="pic" label="作品内容">
                 <template slot-scope="{ row }">
                     <el-image

+ 1 - 0
src/main/vue/src/views/MinterEdit.vue

@@ -160,6 +160,7 @@ export default {
         },
         submit() {
             this.saving = true;
+            this.formData.minter = true;
             this.$http
                 .post(this.formData.id ? '/user/save' : '/user/create', this.formData, { body: 'json' })
                 .then(res => {

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 23 - 692
src/main/vue/yarn.lock


+ 2 - 2
src/test/java/com/izouma/nineth/CommonTest.java

@@ -458,8 +458,8 @@ public class CommonTest {
         String body = HttpRequest.post("https://zid.market.alicloudapi.com/idcheck/Post")
                 .header("Authorization", "APPCODE b48bc8f6759345a79ae20a951f03dabe")
                 .contentType(HttpRequest.CONTENT_TYPE_FORM)
-                .form("cardNo", "1")
-                .form("realName", "2")
+                .form("cardNo", "352228198905220012")
+                .form("realName", "吴承培")
                 .body();
         System.out.println(JSON.toJSONString(JSON.parseObject(body), SerializerFeature.PrettyFormat));
     }

+ 14 - 3
src/test/java/com/izouma/nineth/repo/UserRepoTest.java

@@ -9,10 +9,14 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
@@ -54,6 +58,13 @@ public class UserRepoTest {
 
     @Test
     public void test() {
-        System.out.println(userRepo.findById(150843L).orElse(null));
+//        System.out.println(userRepo.findById(150843L).orElse(null));
+        LocalDate now = LocalDate.now();
+        int dayOfWeek = now.getDayOfWeek().getValue();
+        System.out.println(dayOfWeek);
+        LocalDate end = now.minusDays(dayOfWeek);
+        System.out.println(end);
+        LocalDate start = end.minusDays(6);
+        System.out.println(start);
     }
 }

+ 0 - 1
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -74,7 +74,6 @@ public class OrderServiceTest extends ApplicationTests {
 
     @Test
     public void refund() throws WxPayException {
-        orderService.refund(4627L);
     }
 
     @Test

Vissa filer visades inte eftersom för många filer har ändrats