xiongzhu 4 лет назад
Родитель
Сommit
18e5b6155a

+ 30 - 5
src/main/java/com/izouma/nineth/config/WebMvcConfig.java

@@ -1,9 +1,15 @@
 package com.izouma.nineth.config;
 package com.izouma.nineth.config;
 
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@@ -13,12 +19,17 @@ import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.spring.web.plugins.Docket;
 
 
+import java.util.List;
+
 @Configuration
 @Configuration
 @EnableConfigurationProperties(GeneralProperties.class)
 @EnableConfigurationProperties(GeneralProperties.class)
 public class WebMvcConfig implements WebMvcConfigurer {
 public class WebMvcConfig implements WebMvcConfigurer {
     @Value("${storage.local_path}")
     @Value("${storage.local_path}")
     private String localPath;
     private String localPath;
 
 
+    @Autowired
+    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;
+
     @Override
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
         // registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
         // registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
@@ -33,17 +44,31 @@ public class WebMvcConfig implements WebMvcConfigurer {
     public Docket createApi() {
     public Docket createApi() {
         return new Docket(DocumentationType.SWAGGER_2)
         return new Docket(DocumentationType.SWAGGER_2)
                 .apiInfo(new ApiInfoBuilder()
                 .apiInfo(new ApiInfoBuilder()
-                                 .title("接口文档")
-                                 .version("1.0.0")
-                                 .termsOfServiceUrl("#")
-                                 .description("接口文档")
-                                 .build())
+                        .title("接口文档")
+                        .version("1.0.0")
+                        .termsOfServiceUrl("#")
+                        .description("接口文档")
+                        .build())
                 .select()
                 .select()
                 .apis(RequestHandlerSelectors.basePackage("com.izouma.nineth.web"))
                 .apis(RequestHandlerSelectors.basePackage("com.izouma.nineth.web"))
                 .paths(PathSelectors.any())
                 .paths(PathSelectors.any())
                 .build();
                 .build();
     }
     }
 
 
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        converters.stream().filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
+                .forEach(converter -> {
+                    ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
+                    SimpleModule simpleModule = new SimpleModule();
+                    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+                    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+                    objectMapper.registerModule(simpleModule);
+                    ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper);
+                });
+        System.out.println(converters);
+    }
+
     // @Bean
     // @Bean
     // public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
     // public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
     //     MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
     //     MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();

+ 6 - 0
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -12,6 +12,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Formula;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
@@ -127,4 +128,9 @@ public class Collection extends BaseEntity {
     private BigDecimal originalPrice;
     private BigDecimal originalPrice;
 
 
     private Integer currentNumber;
     private Integer currentNumber;
+
+    @Formula(value = "if(stock = 0, 1, 0)")
+    private int soldOut;
+
+    private int maxCount;
 }
 }

+ 38 - 1
src/main/java/com/izouma/nineth/domain/Order.java

@@ -1,5 +1,8 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.converter.FileObjectListConverter;
 import com.izouma.nineth.converter.FileObjectListConverter;
 import com.izouma.nineth.converter.PrivilegeListConverter;
 import com.izouma.nineth.converter.PrivilegeListConverter;
@@ -13,6 +16,13 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.envers.Audited;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
@@ -26,8 +36,35 @@ import java.util.List;
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
+@Audited
+@EntityListeners(AuditingEntityListener.class)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
 @ApiModel("订单")
 @ApiModel("订单")
-public class Order extends BaseEntity {
+public class Order {
+
+    @Id
+    @GenericGenerator(name = "custom-id", strategy = "com.izouma.nineth.utils.SnowflakeIdGenerator")
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-id")
+    private Long id;
+
+    @JsonIgnore
+    @CreatedBy
+    private String createdBy;
+
+    @JsonIgnore
+    @CreatedDate
+    private LocalDateTime createdAt;
+
+    @JsonIgnore
+    @LastModifiedBy
+    private String modifiedBy;
+
+    @JsonIgnore
+    @LastModifiedDate
+    private LocalDateTime modifiedAt;
+
+    private boolean del;
 
 
     @ApiModelProperty("用户ID")
     @ApiModelProperty("用户ID")
     @Searchable
     @Searchable

+ 1 - 0
src/main/java/com/izouma/nineth/domain/User.java

@@ -85,6 +85,7 @@ public class User extends BaseEntity implements Serializable {
 
 
     private int sales;
     private int sales;
 
 
+    @Column(columnDefinition = "TEXT")
     private String intro;
     private String intro;
 
 
     private String bg;
     private String bg;

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

@@ -29,4 +29,8 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
     int countByCollectionIdAndStatusIn(Long collectionId, Iterable<OrderStatus> orderStatuses);
     int countByCollectionIdAndStatusIn(Long collectionId, Iterable<OrderStatus> orderStatuses);
 
 
     List<Order> findByStatus(OrderStatus orderStatus);
     List<Order> findByStatus(OrderStatus orderStatus);
+
+    @Query("select count(o) from Order o join Collection c on o.collectionId = c.id " +
+            "where c.minterId = ?1 and c.source = 'OFFICIAL' and o.status <> 'NOT_PAID' and o.status <> 'CANCELLED'")
+    long countSales(Long userId);
 }
 }

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

@@ -151,4 +151,11 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     @Modifying
     @Modifying
     @Transactional
     @Transactional
     void updateHistoryToUser(Long userId);
     void updateHistoryToUser(Long userId);
+
+    @Transactional
+    @Modifying
+    @Query("update User u set u.sales = ?2 where u.id = ?1")
+    void setSales(Long userId, int sales);
+
+    List<User> findByAuthoritiesContains(Authority authority);
 }
 }

+ 4 - 10
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -27,6 +27,7 @@ import com.izouma.nineth.event.CreateAssetEvent;
 import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.repo.*;
+import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -49,7 +50,6 @@ import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
@@ -518,17 +518,11 @@ public class OrderService {
     }
     }
 
 
 
 
+    @Scheduled(fixedRate = 120000)
     public void setSales() {
     public void setSales() {
-        List<Collection> collections = collectionRepo.findAll();
-        List<User> minters = userRepo.findAllById(collections.stream().map(Collection::getMinterId)
-                .collect(Collectors.toSet()));
+        List<User> minters = userRepo.findByAuthoritiesContains(Authority.get(AuthorityName.ROLE_MINTER));
         for (User minter : minters) {
         for (User minter : minters) {
-            List<Collection> list = collections.stream().filter(c -> minter.getId().equals(c.getMinterId()))
-                    .collect(Collectors.toList());
-            minter.setSales((int) orderRepo.findByCollectionIdIn(list.stream().map(Collection::getId)
-                            .collect(Collectors.toSet())).stream()
-                    .filter(o -> o.getStatus() != OrderStatus.CANCELLED).count());
-            userRepo.save(minter);
+            userRepo.setSales(minter.getId(), (int) orderRepo.countSales(minter.getId()));
         }
         }
     }
     }
 
 

+ 43 - 1
src/main/java/com/izouma/nineth/service/UserService.java

@@ -44,6 +44,7 @@ import org.springframework.stereotype.Service;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Service
 @Service
@@ -394,7 +395,7 @@ public class UserService {
 
 
     public Map<String, Object> searchByPhoneAdmin(String phoneStr) {
     public Map<String, Object> searchByPhoneAdmin(String phoneStr) {
         List<String> phone = Arrays.stream(phoneStr.replaceAll("\n", " ")
         List<String> phone = Arrays.stream(phoneStr.replaceAll("\n", " ")
-                        .replaceAll("\r\n", "")
+                        .replaceAll("\r\n", " ")
                         .split(" "))
                         .split(" "))
                 .map(String::trim)
                 .map(String::trim)
                 .filter(s -> !StringUtils.isEmpty(s))
                 .filter(s -> !StringUtils.isEmpty(s))
@@ -454,4 +455,45 @@ public class UserService {
             throw new BusinessException("未绑定");
             throw new BusinessException("未绑定");
         }
         }
     }
     }
+
+    public Map<String, Object> batchRegister(String phones, String defaultPassword) {
+        List<String> exist = new ArrayList<>();
+        List<String> err = new ArrayList<>();
+        List<String> success = new ArrayList<>();
+        Arrays.stream(phones.replaceAll(",", " ")
+                .replaceAll(",", " ")
+                .replaceAll("\n", " ")
+                .replaceAll("\r\n", " ")
+                .split(" ")).forEach(phone -> {
+
+            if (userRepo.findByPhoneAndDelFalse(phone).isPresent()) {
+                exist.add(phone);
+            } else {
+                if (!Pattern.matches("^1[3-9]\\d{9}]$", phone)) {
+                    err.add(phone);
+                } else {
+                    try {
+                        String name = "9th_" + RandomStringUtils.randomAlphabetic(8);
+                        User user = create(UserRegister.builder()
+                                .authorities(Collections.singleton(Authority.get(AuthorityName.ROLE_USER)))
+                                .username(name)
+                                .nickname(name)
+                                .password(defaultPassword)
+                                .avatar(Constants.DEFAULT_AVATAR)
+                                .phone(phone)
+                                .build());
+                        success.add(phone);
+                    } catch (Exception e) {
+                        log.error("注册失败", e);
+                        err.add(phone);
+                    }
+                }
+            }
+        });
+        Map<String, Object> map = new HashMap<>();
+        map.put("exist", exist);
+        map.put("error", err);
+        map.put("success", success);
+        return map;
+    }
 }
 }

+ 21 - 0
src/main/java/com/izouma/nineth/utils/SnowflakeIdGenerator.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.utils;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.id.IdentifierGenerator;
+
+import java.io.Serializable;
+
+public class SnowflakeIdGenerator implements IdentifierGenerator {
+
+    private final SnowflakeIdWorker snowflakeIdWorker;
+
+    public SnowflakeIdGenerator() {
+        this.snowflakeIdWorker = new SnowflakeIdWorker(0, 0);
+    }
+
+    @Override
+    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
+        return snowflakeIdWorker.nextId();
+    }
+}

+ 8 - 0
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -16,6 +16,7 @@ import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
@@ -102,5 +103,12 @@ public class OrderController extends BaseController {
             put("status", order.getStatus());
             put("status", order.getStatus());
         }};
         }};
     }
     }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/setSales")
+    public String setSales() {
+        orderService.setSales();
+        return "OK";
+    }
 }
 }
 
 

+ 6 - 0
src/main/java/com/izouma/nineth/web/UserController.java

@@ -225,6 +225,12 @@ public class UserController extends BaseController {
     public void removeBankCard() throws BaseAdaPayException {
     public void removeBankCard() throws BaseAdaPayException {
         userService.removeBankCard(SecurityUtils.getAuthenticatedUser().getId());
         userService.removeBankCard(SecurityUtils.getAuthenticatedUser().getId());
     }
     }
+
+    @PreAuthorize("hasAnyRole('ADMIN')")
+    @PostMapping("/batchRegister")
+    public Map<String, Object> batchRegister(@RequestParam String phones, @RequestParam String defaultPassword) {
+        return userService.batchRegister(phones, defaultPassword);
+    }
 }
 }
 
 
 
 

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

@@ -424,7 +424,7 @@ export default {
                 id: [{ required: true, message: '请选择作品' }],
                 id: [{ required: true, message: '请选择作品' }],
                 total: [{ required: true, message: '请输入数量' }]
                 total: [{ required: true, message: '请输入数量' }]
             },
             },
-            cateogories: ['收藏品', '数字艺术', '门票', '游戏', '音乐', '使用', '其他']
+            cateogories: ['勋章', '收藏品', '数字艺术', '门票', '游戏', '音乐', '使用', '其他']
         };
         };
     },
     },
     methods: {
     methods: {

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

@@ -411,7 +411,7 @@ export default {
                 { label: '用户铸造', value: 'USER' },
                 { label: '用户铸造', value: 'USER' },
                 { label: '转让', value: 'TRANSFER' }
                 { label: '转让', value: 'TRANSFER' }
             ],
             ],
-            cateogories: ['收藏品', '数字艺术', '门票', '游戏', '音乐', '使用', '其他'],
+            cateogories: ['勋章', '收藏品', '数字艺术', '门票', '游戏', '音乐', '使用', '其他'],
             privilegeOptions: [],
             privilegeOptions: [],
             showPrivilegeEditDialog: false,
             showPrivilegeEditDialog: false,
             privilegeForm: {},
             privilegeForm: {},

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

@@ -5,6 +5,7 @@ import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.BlindBoxItem;
 import com.izouma.nineth.domain.BlindBoxItem;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.izouma.nineth.web.BaseController;
 import com.izouma.nineth.web.BaseController;
 import io.ipfs.api.IPFS;
 import io.ipfs.api.IPFS;
 import io.ipfs.api.MerkleNode;
 import io.ipfs.api.MerkleNode;
@@ -57,7 +58,6 @@ import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.List;
 import java.util.*;
 import java.util.*;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 
 
 import static java.nio.file.StandardOpenOption.CREATE;
 import static java.nio.file.StandardOpenOption.CREATE;
@@ -375,11 +375,6 @@ public class CommonTest {
 
 
     @Test
     @Test
     public void sdfsdf() {
     public void sdfsdf() {
-        Matcher matcher = Pattern.compile(".*- \\[(.*)\\((\\d+)\\)\\]")
-                .matcher("binding parameter [2] as [VARCHAR] - [第一批NFT韭菜大队(2888)]");
-        if (matcher.matches()) {
-            System.out.println(matcher.group(2));
-        }
-
+        System.out.println(new SnowflakeIdWorker(0, 0).nextId());
     }
     }
 }
 }