ソースを参照

Merge branch 'dev'

# Conflicts:
#	src/main/java/com/izouma/nineth/web/GPTController.java
#	src/main/resources/application.yaml
wangqifan 3 年 前
コミット
ca57dd2323

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

@@ -159,6 +159,12 @@ public class CacheConfig {
         cacheNamesConfigurationMap.put("userTopTen", RedisCacheConfiguration.defaultCacheConfig()
                 .entryTtl(Duration.ofHours(3))
                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+        cacheNamesConfigurationMap.put("domainTop", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofDays(1))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
+        cacheNamesConfigurationMap.put("newestDomain", RedisCacheConfiguration.defaultCacheConfig()
+                .entryTtl(Duration.ofHours(3))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())));
         RedisCacheManager redisCacheManager = RedisCacheManager.builder()
                 .cacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory()))
                 .withInitialCacheConfigurations(cacheNamesConfigurationMap)

+ 18 - 0
src/main/java/com/izouma/nineth/dto/excel/DomainCountDTO.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.dto.excel;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DomainCountDTO {
+    private Long countNum;
+
+    private Long userId;
+
+    private String nickname;
+
+    private String avatar;
+}

+ 3 - 0
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -157,4 +157,7 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     Asset findFirstByCollectionIdAndUserIdAndSource(Long collectionId, Long userId, AssetSource source);
 
     Long countAllByCollectionIdAndUserIdAndSource(Long collectionId, Long userId, AssetSource source);
+
+    @Query(nativeQuery = true, value = "select count(a.id) count,a.owner_id userId,a.owner_avatar avatar,a.`owner` nickname from asset a inner join `user` u on u.id = a.owner_id where a.status = 'NORMAL' and a.type = 'DOMAIN' GROUP BY a.owner_id ORDER BY count(a.id) desc limit 20")
+    List<Map<String,Object>> domainTop20();
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/DomainOrderRepo.java

@@ -23,6 +23,8 @@ public interface DomainOrderRepo extends JpaRepository<DomainOrder, Long>, JpaSp
 
     List<DomainOrder> findAllByUserIdAndOrderStatus(Long userId, OrderStatus status);
 
+    Page<DomainOrder> findAllByOrderStatusOrderByCreatedAtDesc(OrderStatus status, Pageable pageable);
+
     List<DomainOrder> findAllByPicNameInAndOrderStatus(List<String> strings, OrderStatus status);
 
     Integer countAllByDomainNameEqualsAndOrderStatusNot(String name, OrderStatus status);

+ 74 - 46
src/main/java/com/izouma/nineth/service/DomainOrderService.java

@@ -1,16 +1,13 @@
 package com.izouma.nineth.service;
 
 import com.alibaba.excel.util.StringUtils;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.JSONArray;
 import com.google.zxing.WriterException;
-import com.izouma.nineth.config.RedisKeys;
-import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.domain.DomainOrder;
 import com.izouma.nineth.domain.FileObject;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
-import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.dto.excel.DomainCountDTO;
 import com.izouma.nineth.enums.CollectionStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.enums.PayMethod;
@@ -25,12 +22,12 @@ import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.annotation.Transient;
 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.redis.core.BoundValueOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
@@ -46,7 +43,6 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -65,14 +61,20 @@ public class DomainOrderService {
     private RockRecordService             rockRecordService;
     private AssetRepo                     assetRepo;
     private RedisTemplate<String, Object> redisTemplate;
+    private CacheService                  cacheService;
 
     public Page<DomainOrder> all(PageQuery pageQuery) {
         return domainOrderRepo
                 .findAll(JpaUtils.toSpecification(pageQuery, DomainOrder.class), JpaUtils.toPageRequest(pageQuery));
     }
 
-    public boolean isContainChinese(String str) {
+    @Cacheable(value = "newestDomain")
+    public List<DomainOrder> newest() {
+        PageRequest pageRequest = PageRequest.of(0, 50);
+        return domainOrderRepo.findAllByOrderStatusOrderByCreatedAtDesc(OrderStatus.FINISH, pageRequest).getContent();
+    }
 
+    public boolean isContainChinese(String str) {
         if (StringUtils.isEmpty(str)) {
             throw new BusinessException("sms context is empty!");
         }
@@ -88,6 +90,8 @@ public class DomainOrderService {
         AtomicBoolean checkPoint = checkPoint(userId);
         List<DomainOrder> notPaidOrders = domainOrderRepo.findAllByUserIdAndOrderStatus(userId, OrderStatus.NOT_PAID);
         Long superUserId = Long.valueOf(sysConfigService.getString("domain_superUserId"));
+        int min = sysConfigService.getInt("domain_minimum");
+        min = min + 4;
         if (notPaidOrders.size() > 0) {
             throw new BusinessException("已存在未支付订单,不可继续下单");
         }
@@ -99,12 +103,12 @@ public class DomainOrderService {
                 throw new BusinessException("禁止注册中文域名");
             }
             if (!checkPoint.get()) {
-                if (domain.length() < 9 || domain.length() > 20) {
+                if (domain.length() < min || domain.length() > 20) {
                     throw new BusinessException("四位及以下域名只能官方创建。");
                 }
             } else {
                 if (domain.length() < 8 || domain.length() > 20) {
-                    throw new BusinessException("四位以下域名只能官方创建。");
+                    throw new BusinessException("四位以下域名只能官方创建。");
                 }
             }
         }
@@ -151,48 +155,57 @@ public class DomainOrderService {
         return domainOrderRepo.save(domainOrder);
     }
 
-    public void increaseCount(Long userId, Integer count) {
-        BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.DOMAIN_COUNT + userId);
-        if (ops.get() == null) {
-            Boolean success = ops.setIfAbsent(0);
-            log.info("创建redis域名统计:{}", success);
+    public void increaseCount(Long userId, Integer usePoint) {
+        if (usePoint > 0) {
+            // 扣除积分
+            userRepo.addVipPoint(userId, -usePoint);
+            cacheService.clearUserMy(userId);
         }
-        ops.increment(count);
     }
 
-    public void decreaseCount(Long userId) {
-        increaseCount(userId, -1);
+    public void decreaseCount(DomainOrder order) {
+        userRepo.addVipPoint(order.getUserId(), 1);
+        cacheService.clearUserMy(order.getUserId());
+        log.info("取消加积分用户ID:{},订单ID:{},积分:{}", order.getUserId(), order.getId(), 1);
     }
 
     public AtomicBoolean checkPoint(Long userId) {
-        Map<Long, Long> collections = JSONObject.parseObject(sysConfigService
-                .getString("domain_collection"), new TypeReference<HashMap<Long, Long>>() {
-        });
-        if (collections.size() == 0) {
-            return new AtomicBoolean(false);
+        AtomicBoolean atomicBoolean = new AtomicBoolean(false);
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
+        if (user.getVipPoint() > 0) {
+            atomicBoolean.set(true);
         }
-        List<AssetStatus> statuses = new ArrayList<>();
-        statuses.add(AssetStatus.NORMAL);
-        statuses.add(AssetStatus.AUCTIONING);
-        AtomicBoolean vipPoint = new AtomicBoolean(false);
-        collections.forEach((k, v) -> {
-            List<Asset> assets = assetRepo.findAllByCollectionIdAndStatusInAndUserId(k, statuses, userId);
-            if (assets.size() > 0) {
-                BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.DOMAIN_COUNT + userId);
-                Integer count = (Integer) ops.get();
-                if (count != null) {
-                    if (count < v) {
-                        vipPoint.set(true);
-                    }
-                } else {
-                    vipPoint.set(true);
-                }
-            }
-        });
-        return vipPoint;
+        return atomicBoolean;
+//        Map<Long, Long> collections = JSONObject.parseObject(sysConfigService
+//                .getString("domain_collection"), new TypeReference<HashMap<Long, Long>>() {
+//        });
+//        if (collections.size() == 0) {
+//            return new AtomicBoolean(false);
+//        }
+//        List<AssetStatus> statuses = new ArrayList<>();
+//        statuses.add(AssetStatus.NORMAL);
+//        statuses.add(AssetStatus.AUCTIONING);
+//        AtomicBoolean vipPoint = new AtomicBoolean(false);
+//        collections.forEach((k, v) -> {
+//            List<Asset> assets = assetRepo.findAllByCollectionIdAndStatusInAndUserId(k, statuses, userId);
+//            if (assets.size() > 0) {
+//        BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.DOMAIN_COUNT + userId);
+//        Integer count = (Integer) ops.get();
+//        if (count != null) {
+//            if (count > 0) {
+//                vipPoint.set(true);
+//            }
+//        } else {
+//            vipPoint.set(false);
+//        }
+//            }
+//        });
+//        return vipPoint;
     }
 
     public Map<String, Object> check(String domain) {
+        int min = sysConfigService.getInt("domain_minimum");
+        min = min + 4;
         AtomicBoolean checkPoint = checkPoint(SecurityUtils.getAuthenticatedUser().getId());
         Map<String, Object> result = new HashMap<>();
         Long superUserId = Long.valueOf(sysConfigService.getString("domain_superUserId"));
@@ -213,7 +226,7 @@ public class DomainOrderService {
                 return result;
             }
             if (!checkPoint.get()) {
-                if (visibleDomain.length() < 9 || visibleDomain.length() > 20) {
+                if (visibleDomain.length() < min || visibleDomain.length() > 20) {
                     result.put("result", false);
                     result.put("reason", "域名长度不合规");
                     return result;
@@ -317,7 +330,7 @@ public class DomainOrderService {
         domainOrder.setOrderStatus(OrderStatus.CANCELLED);
         domainOrder.setStatus(CollectionStatus.FAIL);
         if (domainOrder.getPicName().length() < 5) {
-            decreaseCount(domainOrder.getUserId());
+            decreaseCount(domainOrder);
         }
         domainOrderRepo.save(domainOrder);
     }
@@ -345,14 +358,22 @@ public class DomainOrderService {
         is2.close();
         int length = domainName.length();
         BufferedImage shareImg;
-        if (length <= 2) {
+        if (length == 1) {
             InputStream is3 = this.getClass().getResourceAsStream("/static/img/png_jing.png");
             shareImg = ImageIO.read(is3);
             is3.close();
-        } else if (length <= 4) {
+        } else if (length == 2) {
             InputStream is3 = this.getClass().getResourceAsStream("/static/img/png_lv.png");
             shareImg = ImageIO.read(is3);
             is3.close();
+        } else if (length == 3) {
+            InputStream is3 = this.getClass().getResourceAsStream("/static/img/png_b.png");
+            shareImg = ImageIO.read(is3);
+            is3.close();
+        } else if (length == 4) {
+            InputStream is3 = this.getClass().getResourceAsStream("/static/img/png_h.png");
+            shareImg = ImageIO.read(is3);
+            is3.close();
         } else {
             InputStream is3 = this.getClass().getResourceAsStream("/static/img/png_zi.png");
             shareImg = ImageIO.read(is3);
@@ -437,4 +458,11 @@ public class DomainOrderService {
         return result;
     }
 
+    public List<DomainCountDTO> top20() {
+        List<Map<String, Object>> map = assetRepo.domainTop20();
+        JSONArray jsonArray = new JSONArray();
+        jsonArray.addAll(map);
+        return jsonArray.toJavaList(DomainCountDTO.class);
+    }
+
 }

+ 2 - 2
src/main/java/com/izouma/nineth/service/netease/TeamService.java

@@ -18,6 +18,7 @@ import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -40,8 +41,7 @@ public class TeamService {
     private NeteaseMessageRepo            neteaseMessageRepo;
     private AssetRepo                     assetRepo;
 
-    public Page<Team> all(PageQuery pageQuery) {
-        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+    public Page<Team> all(Long userId, PageQuery pageQuery) {
         Page<Team> teams = teamRepo
                 .findAll(JpaUtils.toSpecification(pageQuery, Team.class), JpaUtils.toPageRequest(pageQuery));
         List<Team> content = teams.getContent();

+ 13 - 0
src/main/java/com/izouma/nineth/web/DomainOrderController.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.DomainOrder;
+import com.izouma.nineth.dto.excel.DomainCountDTO;
 import com.izouma.nineth.service.DomainOrderService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
@@ -8,7 +9,10 @@ import com.izouma.nineth.repo.DomainOrderRepo;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -40,6 +44,9 @@ public class DomainOrderController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<DomainOrder> all(@RequestBody PageQuery pageQuery) {
+        if (pageQuery.getSize() == 50) {
+            return new PageImpl<>(domainOrderService.newest(), PageRequest.of(0, 50), 50);
+        }
         return domainOrderService.all(pageQuery);
     }
 
@@ -53,6 +60,12 @@ public class DomainOrderController extends BaseController {
         return domainOrderService.search(domain);
     }
 
+    @PostMapping("/topTen")
+    @Cacheable(value = "domainTopTen")
+    public List<DomainCountDTO> topTen() {
+        return domainOrderService.top20();
+    }
+
     @GetMapping("/get/{id}")
     public DomainOrder get(@PathVariable Long id) {
         return domainOrderRepo.findById(id).orElseThrow(new BusinessException("无记录"));

+ 1 - 0
src/main/java/com/izouma/nineth/web/GPTController.java

@@ -7,6 +7,7 @@ import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.service.SysConfigService;
 import lombok.AllArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;

+ 1 - 1
src/main/java/com/izouma/nineth/web/netease/TeamController.java

@@ -91,7 +91,7 @@ public class TeamController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     public Page<Team> all(@RequestBody PageQuery pageQuery) {
-        return teamService.all(pageQuery);
+        return teamService.all(SecurityUtils.getAuthenticatedUser().getId(), pageQuery);
     }
 
     @GetMapping("/get/{id}")

+ 1 - 0
src/main/resources/application.yaml

@@ -94,6 +94,7 @@ spring:
             condition-and-alway-false-allow: true
             condition-and-alway-true-allow: true
             select-where-alway-true-check: false
+
   jpa:
     database: MySQL
     database-platform: org.hibernate.dialect.MySQL8Dialect

BIN
src/main/resources/static/img/png_b.png


BIN
src/main/resources/static/img/png_h.png