Browse Source

Merge branch 'dev' of http://git.izouma.com/xiongzhu/raex_back into dev

wangqifan 3 years ago
parent
commit
b3857f62f7
38 changed files with 1290 additions and 42 deletions
  1. 43 0
      src/main/java/com/izouma/nineth/domain/MetaAccessories.java
  2. 21 0
      src/main/java/com/izouma/nineth/domain/MetaAccessoriesPurchaseRecord.java
  3. 15 0
      src/main/java/com/izouma/nineth/domain/MetaGameBoxPoints.java
  4. 5 0
      src/main/java/com/izouma/nineth/domain/UserDetail.java
  5. 17 0
      src/main/java/com/izouma/nineth/dto/PublicShowDTO.java
  6. 3 1
      src/main/java/com/izouma/nineth/enums/MetaGame.java
  7. 20 0
      src/main/java/com/izouma/nineth/enums/MetaPointTypeEnum.java
  8. 12 0
      src/main/java/com/izouma/nineth/repo/MetaAccessoriesPurchaseRecordRepo.java
  9. 23 0
      src/main/java/com/izouma/nineth/repo/MetaAccessoriesRepo.java
  10. 6 5
      src/main/java/com/izouma/nineth/repo/MetaGameBoxPointsRepo.java
  11. 3 0
      src/main/java/com/izouma/nineth/repo/MetaResourceVersionRepo.java
  12. 3 0
      src/main/java/com/izouma/nineth/repo/UserAssetSummaryRepo.java
  13. 2 0
      src/main/java/com/izouma/nineth/repo/UserDetailRepo.java
  14. 82 0
      src/main/java/com/izouma/nineth/service/MetaAccessoriesService.java
  15. 11 5
      src/main/java/com/izouma/nineth/service/MetaGameBoxPointsService.java
  16. 2 1
      src/main/java/com/izouma/nineth/service/MetaPlayerRoleClassifyService.java
  17. 1 1
      src/main/java/com/izouma/nineth/service/MetaUserGoldService.java
  18. 37 2
      src/main/java/com/izouma/nineth/service/UserAssetSummaryService.java
  19. 1 0
      src/main/java/com/izouma/nineth/utils/excel/ExcelUtils.java
  20. 42 0
      src/main/java/com/izouma/nineth/utils/excel/MetaPointTypeEnumConverter.java
  21. 30 0
      src/main/java/com/izouma/nineth/web/CacheController.java
  22. 21 0
      src/main/java/com/izouma/nineth/web/ContentAuditController.java
  23. 86 0
      src/main/java/com/izouma/nineth/web/MetaAccessoriesController.java
  24. 4 3
      src/main/java/com/izouma/nineth/web/MetaGameBoxPointsController.java
  25. 11 4
      src/main/java/com/izouma/nineth/web/MetaResourceVersionController.java
  26. 16 0
      src/main/java/com/izouma/nineth/web/UserDetailController.java
  27. 1 0
      src/main/resources/genjson/MetaAccessories.json
  28. 275 0
      src/main/resources/static/Agreement.html
  29. BIN
      src/main/resources/static/img/icon.png
  30. 41 0
      src/main/resources/static/pc.html
  31. 27 11
      src/main/vue/src/router.js
  32. 46 1
      src/main/vue/src/views/Cache.vue
  33. 185 0
      src/main/vue/src/views/MetaAccessoriesEdit.vue
  34. 192 0
      src/main/vue/src/views/MetaAccessoriesList.vue
  35. 1 1
      src/main/vue/src/views/MetaGameCopyEdit.vue
  36. 2 1
      src/main/vue/src/views/MetaGameCopyList.vue
  37. 2 5
      src/main/vue/src/views/MetaResourceVersionEdit.vue
  38. 1 1
      src/main/vue/src/views/RarityLabelEdit.vue

+ 43 - 0
src/main/java/com/izouma/nineth/domain/MetaAccessories.java

@@ -0,0 +1,43 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.enums.EntryModeType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Transient;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙配饰")
+public class MetaAccessories extends BaseEntity {
+
+    @ApiModelProperty("配饰名称")
+    @ExcelProperty("配饰名称")
+    private String name;
+
+    @ApiModelProperty("购买方式")
+    @ExcelProperty("购买方式")
+    @Enumerated(EnumType.STRING)
+    private EntryModeType purchaseMethod;
+
+    @ApiModelProperty("价格/金币数量")
+    @ExcelProperty("价格/金币数量")
+    private int price;
+
+    @ApiModelProperty("NFT名称")
+    @ExcelProperty("NFT名称")
+    private String collectionName;
+
+    @Transient
+    private boolean hold;
+
+}

+ 21 - 0
src/main/java/com/izouma/nineth/domain/MetaAccessoriesPurchaseRecord.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙配饰购买记录")
+public class MetaAccessoriesPurchaseRecord extends BaseEntity {
+
+    private Long userId;
+
+    private Long metaAccessoriesId;
+
+}

+ 15 - 0
src/main/java/com/izouma/nineth/domain/MetaGameBoxPoints.java

@@ -1,6 +1,9 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.MetaPointTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -8,6 +11,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
 import javax.persistence.Entity;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.Transient;
 import javax.persistence.Transient;
 
 
 @Data
 @Data
@@ -18,21 +23,31 @@ import javax.persistence.Transient;
 public class MetaGameBoxPoints extends BaseEntity {
 public class MetaGameBoxPoints extends BaseEntity {
 
 
     @ApiModelProperty("用户ID")
     @ApiModelProperty("用户ID")
+    @ExcelProperty("用户ID")
     @Searchable
     @Searchable
     private Long userId;
     private Long userId;
 
 
+    @ApiModelProperty("类型")
+    @ExcelProperty("类型")
+    @Enumerated(EnumType.STRING)
+    private MetaPointTypeEnum type;
+
     @ApiModelProperty("昵称")
     @ApiModelProperty("昵称")
+    @ExcelIgnore
     @Transient
     @Transient
     private String nickname;
     private String nickname;
 
 
     @ApiModelProperty("头像")
     @ApiModelProperty("头像")
+    @ExcelIgnore
     @Transient
     @Transient
     private String head;
     private String head;
 
 
     @ApiModelProperty("当前最高积分")
     @ApiModelProperty("当前最高积分")
+    @ExcelProperty("当前最高积分")
     private int score;
     private int score;
 
 
     @ApiModelProperty("当前排名")
     @ApiModelProperty("当前排名")
+    @ExcelIgnore
     @Transient
     @Transient
     private int scoreRank;
     private int scoreRank;
 }
 }

+ 5 - 0
src/main/java/com/izouma/nineth/domain/UserDetail.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
+import com.izouma.nineth.dto.PublicShowDTO;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Data;
@@ -8,6 +9,7 @@ import lombok.NoArgsConstructor;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Id;
 import javax.persistence.Transient;
 import javax.persistence.Transient;
+import java.util.List;
 
 
 @Data
 @Data
 @AllArgsConstructor
 @AllArgsConstructor
@@ -83,4 +85,7 @@ public class UserDetail extends BaseEntityNoID {
     @ApiModelProperty("是否点亮")
     @ApiModelProperty("是否点亮")
     private boolean light;
     private boolean light;
 
 
+    @Transient
+    private List<PublicShowDTO> publicShowDTOs;
+
 }
 }

+ 17 - 0
src/main/java/com/izouma/nineth/dto/PublicShowDTO.java

@@ -0,0 +1,17 @@
+package com.izouma.nineth.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PublicShowDTO {
+
+    private String name;
+
+    private String url;
+
+    private int num;
+}

+ 3 - 1
src/main/java/com/izouma/nineth/enums/MetaGame.java

@@ -3,7 +3,9 @@ package com.izouma.nineth.enums;
 
 
 public enum MetaGame {
 public enum MetaGame {
 
 
-    ZOMBIE("僵尸游戏");
+    ZOMBIE("僵尸游戏"),
+
+    FISHING("钓鱼游戏");
 
 
     private final String description;
     private final String description;
 
 

+ 20 - 0
src/main/java/com/izouma/nineth/enums/MetaPointTypeEnum.java

@@ -0,0 +1,20 @@
+package com.izouma.nineth.enums;
+
+
+public enum MetaPointTypeEnum {
+
+    GAME_BOX("GAME_BOX"),
+
+    ZOMBIE("ZOMBIE");
+
+    private final String description;
+
+    MetaPointTypeEnum(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}
+

+ 12 - 0
src/main/java/com/izouma/nineth/repo/MetaAccessoriesPurchaseRecordRepo.java

@@ -0,0 +1,12 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaAccessoriesPurchaseRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+
+public interface MetaAccessoriesPurchaseRecordRepo extends JpaRepository<MetaAccessoriesPurchaseRecord, Long>, JpaSpecificationExecutor<MetaAccessoriesPurchaseRecord> {
+
+    MetaAccessoriesPurchaseRecord findByUserIdAndMetaAccessoriesId(Long userId, Long metaAccessories);
+
+}

+ 23 - 0
src/main/java/com/izouma/nineth/repo/MetaAccessoriesRepo.java

@@ -0,0 +1,23 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaAccessories;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface MetaAccessoriesRepo extends JpaRepository<MetaAccessories, Long>, JpaSpecificationExecutor<MetaAccessories> {
+    @Query("update MetaAccessories t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    MetaAccessories findByNameAndDel(String name, boolean del);
+
+    MetaAccessories findByIdAndDel(Long id, boolean del);
+
+    List<MetaAccessories> findByDel(boolean del);
+}

+ 6 - 5
src/main/java/com/izouma/nineth/repo/MetaGameBoxPointsRepo.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.repo;
 package com.izouma.nineth.repo;
 
 
 import com.izouma.nineth.domain.MetaGameBoxPoints;
 import com.izouma.nineth.domain.MetaGameBoxPoints;
+import com.izouma.nineth.enums.MetaPointTypeEnum;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
@@ -10,12 +11,12 @@ import java.util.Map;
 
 
 public interface MetaGameBoxPointsRepo extends JpaRepository<MetaGameBoxPoints, Long>, JpaSpecificationExecutor<MetaGameBoxPoints> {
 public interface MetaGameBoxPointsRepo extends JpaRepository<MetaGameBoxPoints, Long>, JpaSpecificationExecutor<MetaGameBoxPoints> {
 
 
-    @Query(value = "SELECT m.user_id userId, m.score score, u.nickname nickname, u.avatar head, RANK() OVER(ORDER BY m.score DESC) scoreRank FROM meta_game_box_points m LEFT JOIN user u ON m.user_id = u.id LIMIT 50", nativeQuery = true)
-    List<Map<String, Object>> findTopFifty();
+    @Query(value = "SELECT m.user_id userId, m.score score, m.type type, u.nickname nickname, u.avatar head, RANK() OVER(ORDER BY m.score DESC) scoreRank FROM meta_game_box_points m LEFT JOIN user u ON m.user_id = u.id where m.type = ?1 LIMIT 50", nativeQuery = true)
+    List<Map<String, Object>> findTopFiftyByType(String type);
 
 
-    @Query(value = "SELECT m.score score, a.scoreRank scoreRank FROM meta_game_box_points m LEFT JOIN ( SELECT user_id userId, RANK() OVER ( ORDER BY score DESC ) scoreRank FROM meta_game_box_points ) a ON m.user_id = a.userId  WHERE m.user_id = ?1", nativeQuery = true)
-    Map<String, Object> findInfoByUserId(Long userId);
+    @Query(value = "SELECT m.score score, a.scoreRank scoreRank FROM meta_game_box_points m LEFT JOIN ( SELECT user_id userId, RANK() OVER ( ORDER BY score DESC ) scoreRank FROM meta_game_box_points where type = ?2 ) a ON m.user_id = a.userId  WHERE m.user_id = ?1 and m.type = ?2", nativeQuery = true)
+    Map<String, Object> findInfoByUserIdAndType(Long userId, String type);
 
 
-    MetaGameBoxPoints findByUserId(Long userId);
+    MetaGameBoxPoints findByUserIdAndType(Long userId, MetaPointTypeEnum type);
 
 
 }
 }

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

@@ -21,4 +21,7 @@ public interface MetaResourceVersionRepo extends JpaRepository<MetaResourceVersi
     MetaResourceVersion findByVersionAndDel(String version, boolean del);
     MetaResourceVersion findByVersionAndDel(String version, boolean del);
 
 
     List<MetaResourceVersion> findAllByDel(boolean del);
     List<MetaResourceVersion> findAllByDel(boolean del);
+
+    @Query(value = "select * from meta_resource_version where del = false order by created_at desc limit 1", nativeQuery = true)
+    MetaResourceVersion findVersion();
 }
 }

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

@@ -150,4 +150,7 @@ public interface UserAssetSummaryRepo extends JpaRepository<UserAssetSummary, Lo
             "  AND a.company_id = e.company_id " +
             "  AND a.company_id = e.company_id " +
             "  AND a.prefix_name = e.prefixName", nativeQuery = true)
             "  AND a.prefix_name = e.prefixName", nativeQuery = true)
     List<UserAssetSummary> find(Long userId, Long companyId);
     List<UserAssetSummary> find(Long userId, Long companyId);
+
+    @Query(value = "select * from user_asset_summary where user_id = ?1 and open_show_num > 0 and company_id = 1 ", nativeQuery = true)
+    List<UserAssetSummary> findPublicShowAsset(Long userId);
 }
 }

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

@@ -34,4 +34,6 @@ public interface UserDetailRepo extends JpaRepository<UserDetail, Long>, JpaSpec
 
 
     @Query("select sum(c.likes) from Collection c where c.ownerId = ?1")
     @Query("select sum(c.likes) from Collection c where c.ownerId = ?1")
     Long findPersonalHeatCountById(Long id);
     Long findPersonalHeatCountById(Long id);
+
+
 }
 }

+ 82 - 0
src/main/java/com/izouma/nineth/service/MetaAccessoriesService.java

@@ -0,0 +1,82 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.MetaAccessories;
+import com.izouma.nineth.domain.MetaAccessoriesPurchaseRecord;
+import com.izouma.nineth.domain.MetaUserGold;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.EntryModeType;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.MetaAccessoriesPurchaseRecordRepo;
+import com.izouma.nineth.repo.MetaAccessoriesRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+public class MetaAccessoriesService {
+
+    private MetaAccessoriesRepo metaAccessoriesRepo;
+
+    private MetaAccessoriesPurchaseRecordRepo metaAccessoriesPurchaseRecordRepo;
+
+    private MetaUserGoldService metaUserGoldService;
+
+    private AssetRepo assetRepo;
+
+    public Page<MetaAccessories> all(PageQuery pageQuery) {
+        return metaAccessoriesRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaAccessories.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    @Transactional
+    public MetaRestResult<Integer> purchase(Long userId, Long metaAccessoriesId) {
+        MetaAccessoriesPurchaseRecord exist = metaAccessoriesPurchaseRecordRepo.findByUserIdAndMetaAccessoriesId(userId, metaAccessoriesId);
+        if (Objects.nonNull(exist)) {
+            return MetaRestResult.returnError("当前配饰已经购买过!");
+        }
+        MetaAccessories metaAccessories = metaAccessoriesRepo.findByIdAndDel(metaAccessoriesId, false);
+        if (Objects.isNull(metaAccessories)) {
+            return MetaRestResult.returnError("当前配饰信息不存在!");
+        }
+        if (!EntryModeType.GOLD.equals(metaAccessories.getPurchaseMethod())) {
+            return MetaRestResult.returnError("当前配置不允许金币购买!");
+        }
+        MetaRestResult<MetaUserGold> restResult = metaUserGoldService.changeNum(userId, -metaAccessories.getPrice());
+        if (Constants.MetaRestCode.success != restResult.getCode()) {
+            return MetaRestResult.returnError(restResult.getMessage());
+        }
+        metaAccessoriesPurchaseRecordRepo.save(new MetaAccessoriesPurchaseRecord(userId, metaAccessoriesId));
+        return MetaRestResult.returnSuccess("购买成功", restResult.getData().getNum());
+    }
+
+    public MetaRestResult<List<MetaAccessories>> hold(Long userId) {
+        List<MetaAccessories> list = metaAccessoriesRepo.findByDel(false);
+        if (CollectionUtils.isEmpty(list)) {
+            return MetaRestResult.returnError("当前未配置任何配饰!");
+        }
+        list.forEach(metaAccessories -> {
+            if (EntryModeType.GOLD.equals(metaAccessories.getPurchaseMethod())) {
+                MetaAccessoriesPurchaseRecord metaAccessoriesPurchaseRecord = metaAccessoriesPurchaseRecordRepo.findByUserIdAndMetaAccessoriesId(userId, metaAccessories.getId());
+                if (Objects.nonNull(metaAccessoriesPurchaseRecord)) {
+                    metaAccessories.setHold(true);
+                }
+            }
+            if (EntryModeType.NFT.equals(metaAccessories.getPurchaseMethod())) {
+                List<Asset> assets = assetRepo
+                        .findAllByUserIdAndStatusInAndNameLike(userId, Constants.META_NORMAL_STATUS, "%" + metaAccessories
+                                .getCollectionName() + "%");
+                metaAccessories.setHold(CollectionUtils.isNotEmpty(assets));
+            }
+        });
+        return MetaRestResult.returnSuccess(list);
+    }
+}

+ 11 - 5
src/main/java/com/izouma/nineth/service/MetaGameBoxPointsService.java

@@ -6,6 +6,7 @@ import com.izouma.nineth.domain.MetaGameBoxPoints;
 import com.izouma.nineth.dto.MetaGameBoxPointsDTO;
 import com.izouma.nineth.dto.MetaGameBoxPointsDTO;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaPointTypeEnum;
 import com.izouma.nineth.repo.MetaGameBoxPointsRepo;
 import com.izouma.nineth.repo.MetaGameBoxPointsRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -26,21 +27,22 @@ public class MetaGameBoxPointsService {
         return metaGameBoxPointsRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaGameBoxPoints.class), JpaUtils.toPageRequest(pageQuery));
         return metaGameBoxPointsRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaGameBoxPoints.class), JpaUtils.toPageRequest(pageQuery));
     }
     }
 
 
-    public MetaRestResult<MetaGameBoxPointsDTO> get(Long userId) {
+    public MetaRestResult<MetaGameBoxPointsDTO> get(Long userId, MetaPointTypeEnum type) {
         MetaGameBoxPointsDTO metaGameBoxPointsDTO = new MetaGameBoxPointsDTO();
         MetaGameBoxPointsDTO metaGameBoxPointsDTO = new MetaGameBoxPointsDTO();
-        MetaGameBoxPoints metaGameBoxPoints = metaGameBoxPointsRepo.findByUserId(userId);
+        MetaGameBoxPoints metaGameBoxPoints = metaGameBoxPointsRepo.findByUserIdAndType(userId, type);
         if (Objects.isNull(metaGameBoxPoints)) {
         if (Objects.isNull(metaGameBoxPoints)) {
             metaGameBoxPoints = new MetaGameBoxPoints();
             metaGameBoxPoints = new MetaGameBoxPoints();
             metaGameBoxPoints.setUserId(userId);
             metaGameBoxPoints.setUserId(userId);
+            metaGameBoxPoints.setType(type);
             metaGameBoxPoints.setScore(0);
             metaGameBoxPoints.setScore(0);
             metaGameBoxPointsRepo.save(metaGameBoxPoints);
             metaGameBoxPointsRepo.save(metaGameBoxPoints);
         }
         }
-        Map<String, Object> metaGameBoxPointsMap = metaGameBoxPointsRepo.findInfoByUserId(userId);
+        Map<String, Object> metaGameBoxPointsMap = metaGameBoxPointsRepo.findInfoByUserIdAndType(userId, type.toString());
         String jsonStr = JSONObject.toJSONString(metaGameBoxPointsMap);
         String jsonStr = JSONObject.toJSONString(metaGameBoxPointsMap);
         metaGameBoxPoints = JSONObject.parseObject(jsonStr, MetaGameBoxPoints.class);
         metaGameBoxPoints = JSONObject.parseObject(jsonStr, MetaGameBoxPoints.class);
         metaGameBoxPointsDTO.setSelfHiScore(metaGameBoxPoints.getScore());
         metaGameBoxPointsDTO.setSelfHiScore(metaGameBoxPoints.getScore());
         metaGameBoxPointsDTO.setSelfRank(metaGameBoxPoints.getScoreRank());
         metaGameBoxPointsDTO.setSelfRank(metaGameBoxPoints.getScoreRank());
-        List<Map<String, Object>> map = metaGameBoxPointsRepo.findTopFifty();
+        List<Map<String, Object>> map = metaGameBoxPointsRepo.findTopFiftyByType(type.toString());
         JSONArray jsonArray = new JSONArray();
         JSONArray jsonArray = new JSONArray();
         jsonArray.addAll(map);
         jsonArray.addAll(map);
         List<MetaGameBoxPoints> data = jsonArray.toJavaList(MetaGameBoxPoints.class);
         List<MetaGameBoxPoints> data = jsonArray.toJavaList(MetaGameBoxPoints.class);
@@ -55,9 +57,13 @@ public class MetaGameBoxPointsService {
         if (Objects.isNull(record.getUserId())) {
         if (Objects.isNull(record.getUserId())) {
             return MetaRestResult.returnError("Illegal parameter : userId can not be null");
             return MetaRestResult.returnError("Illegal parameter : userId can not be null");
         }
         }
-        MetaGameBoxPoints metaGameBoxPoints = metaGameBoxPointsRepo.findByUserId(record.getUserId());
+        if (Objects.isNull(record.getType())) {
+            return MetaRestResult.returnError("Illegal parameter : type can not be null");
+        }
+        MetaGameBoxPoints metaGameBoxPoints = metaGameBoxPointsRepo.findByUserIdAndType(record.getUserId(), record.getType());
         if (Objects.isNull(metaGameBoxPoints)) {
         if (Objects.isNull(metaGameBoxPoints)) {
             metaGameBoxPoints = new MetaGameBoxPoints();
             metaGameBoxPoints = new MetaGameBoxPoints();
+            metaGameBoxPoints.setType(record.getType());
             metaGameBoxPoints.setUserId(record.getUserId());
             metaGameBoxPoints.setUserId(record.getUserId());
             metaGameBoxPoints.setScore(record.getScore());
             metaGameBoxPoints.setScore(record.getScore());
             metaGameBoxPointsRepo.save(metaGameBoxPoints);
             metaGameBoxPointsRepo.save(metaGameBoxPoints);

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

@@ -6,6 +6,7 @@ import com.izouma.nineth.domain.MetaPlayerRoleClassify;
 import com.izouma.nineth.dto.MetaPlayerRole;
 import com.izouma.nineth.dto.MetaPlayerRole;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.UserHoldTypeEnum;
 import com.izouma.nineth.enums.UserHoldTypeEnum;
+import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.MetaPlayerRoleClassifyRepo;
 import com.izouma.nineth.repo.MetaPlayerRoleClassifyRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
@@ -30,7 +31,7 @@ public class MetaPlayerRoleClassifyService {
     public List<MetaPlayerRoleClassify> metaPlayerRole(Long userId) {
     public List<MetaPlayerRoleClassify> metaPlayerRole(Long userId) {
         List<MetaPlayerRoleClassify> metaPlayerRoleClassifies = metaPlayerRoleClassifyRepo.findAllByDel(false);
         List<MetaPlayerRoleClassify> metaPlayerRoleClassifies = metaPlayerRoleClassifyRepo.findAllByDel(false);
         if (CollectionUtils.isEmpty(metaPlayerRoleClassifies)) {
         if (CollectionUtils.isEmpty(metaPlayerRoleClassifies)) {
-
+            throw new BusinessException("缺少角色配置");
         }
         }
         metaPlayerRoleClassifies.forEach(metaPlayerRoleClassify -> {
         metaPlayerRoleClassifies.forEach(metaPlayerRoleClassify -> {
             metaPlayerRoleClassify.setMetaPlayerRoleList(build(userId, metaPlayerRoleClassify.getMetaPlayerRoleList()));
             metaPlayerRoleClassify.setMetaPlayerRoleList(build(userId, metaPlayerRoleClassify.getMetaPlayerRoleList()));

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

@@ -82,10 +82,10 @@ public class MetaUserGoldService {
         metaUserGoldRecord.setBeforeNum(nowNum);
         metaUserGoldRecord.setBeforeNum(nowNum);
         metaUserGoldRecord.setAfterNum(nowNum + num);
         metaUserGoldRecord.setAfterNum(nowNum + num);
         metaUserGoldRecord.setOperationNum(num);
         metaUserGoldRecord.setOperationNum(num);
-        metaUserGold.setNum(nowNum + num);
         if (metaUserGoldRecord.getAfterNum() < 0) {
         if (metaUserGoldRecord.getAfterNum() < 0) {
             return MetaRestResult.returnError(String.format("用户[%S] 当前金币剩余[%S] 本次操作需要金币数量为[%S]", userId, nowNum, -num));
             return MetaRestResult.returnError(String.format("用户[%S] 当前金币剩余[%S] 本次操作需要金币数量为[%S]", userId, nowNum, -num));
         }
         }
+        metaUserGold.setNum(nowNum + num);
         metaUserGoldRecordRepo.save(metaUserGoldRecord);
         metaUserGoldRecordRepo.save(metaUserGoldRecord);
         return MetaRestResult.returnSuccess(metaUserGoldRepo.save(metaUserGold));
         return MetaRestResult.returnSuccess(metaUserGoldRepo.save(metaUserGold));
     }
     }

+ 37 - 2
src/main/java/com/izouma/nineth/service/UserAssetSummaryService.java

@@ -15,11 +15,15 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
 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.data.domain.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.persistence.criteria.Predicate;
 import javax.transaction.Transactional;
 import javax.transaction.Transactional;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 
 
 @Service
 @Service
@@ -33,9 +37,40 @@ public class UserAssetSummaryService {
 
 
     private MetaShowRoomAssetRepo metaShowRoomAssetRepo;
     private MetaShowRoomAssetRepo metaShowRoomAssetRepo;
 
 
+    private final String OPEN_SHOW = "OPEN_SHOW";
+
+    private final String AUCTIONING = "AUCTIONING";
+
+    private final String CONSIGNMENT = "CONSIGNMENT";
+
+    private final String CLOSE_SHOW = "CLOSE_SHOW";
+
     public Page<UserAssetSummary> all(PageQuery pageQuery) {
     public Page<UserAssetSummary> all(PageQuery pageQuery) {
-        return userAssetSummaryRepo.findAll(JpaUtils.toSpecification(pageQuery, UserAssetSummary.class), JpaUtils.toPageRequest(pageQuery));
-    }
+        Specification<UserAssetSummary> specification = JpaUtils.toSpecification(pageQuery, UserAssetSummary.class);
+        PageRequest pageRequest = JpaUtils.toPageRequest(pageQuery);
+        Map<String, Object> query = pageQuery.getQuery();
+        if (query.containsKey("assetType")) {
+            String type = String.valueOf(query.get("assetType"));
+            specification = specification
+                    .and((Specification<UserAssetSummary>) (root, criteriaQuery, criteriaBuilder) -> {
+                        List<Predicate> and = new ArrayList<>();
+                        if (OPEN_SHOW.equals(type)) {
+                            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("openShowNum"), 1));
+                        }
+                        if (AUCTIONING.equals(type)) {
+                            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("auctioningNum"), 1));
+                        }
+                        if (CONSIGNMENT.equals(type)) {
+                            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("consignmentNum"), 1));
+                        }
+                        if (CLOSE_SHOW.equals(type)) {
+                            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get("closeShowNum"), 1));
+                        }
+                        return criteriaBuilder.and(and.toArray(new Predicate[0]));
+                    });
+
+        }
+        return userAssetSummaryRepo.findAll(specification, pageRequest);    }
 
 
     @Transactional
     @Transactional
     @RedisLock(value = "#userId", behavior = RedisLock.Behavior.WAIT)
     @RedisLock(value = "#userId", behavior = RedisLock.Behavior.WAIT)

+ 1 - 0
src/main/java/com/izouma/nineth/utils/excel/ExcelUtils.java

@@ -37,6 +37,7 @@ public class ExcelUtils<T> {
                 .registerConverter(new ListConverter())
                 .registerConverter(new ListConverter())
                 .registerConverter(new OperationSourceConverter())
                 .registerConverter(new OperationSourceConverter())
                 .registerConverter(new RecordTypeConverter())
                 .registerConverter(new RecordTypeConverter())
+                .registerConverter(new MetaPointTypeEnumConverter())
                 .doWrite(data);
                 .doWrite(data);
     }
     }
 }
 }

+ 42 - 0
src/main/java/com/izouma/nineth/utils/excel/MetaPointTypeEnumConverter.java

@@ -0,0 +1,42 @@
+package com.izouma.nineth.utils.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.izouma.nineth.enums.MetaPointTypeEnum;
+
+public class MetaPointTypeEnumConverter implements Converter<MetaPointTypeEnum> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return MetaPointTypeEnum.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return null;
+    }
+
+    @Override
+    public MetaPointTypeEnum convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            for (MetaPointTypeEnum value : MetaPointTypeEnum.values()) {
+                if (value.getDescription().equals(cellData.getStringValue())) {
+                    return value;
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    @Override
+    public CellData convertToExcelData(MetaPointTypeEnum value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value != null) {
+            return new CellData(value.getDescription());
+        }
+        return null;
+    }
+}

+ 30 - 0
src/main/java/com/izouma/nineth/web/CacheController.java

@@ -4,6 +4,7 @@ import com.izouma.nineth.enums.OperationType;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.service.CacheService;
 import com.izouma.nineth.service.CacheService;
 import com.izouma.nineth.service.CollectionService;
 import com.izouma.nineth.service.CollectionService;
+import com.izouma.nineth.service.MintActivityService;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -27,6 +28,8 @@ public class CacheController {
 
 
     private final CollectionService collectionService;
     private final CollectionService collectionService;
 
 
+    private final MintActivityService mintActivityService;
+
     @RequestMapping("/clear")
     @RequestMapping("/clear")
     @PreAuthorize("hasRole('ADMIN')")
     @PreAuthorize("hasRole('ADMIN')")
     public void clear(String name, String stringParam, Long longParam) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
     public void clear(String name, String stringParam, Long longParam) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
@@ -78,4 +81,31 @@ public class CacheController {
         }
         }
     }
     }
 
 
+    @PostMapping(value = "/mint/operating/{mintActivityId}/{mintNum}/{mintOperationType}")
+    public void operatingMintStock(@PathVariable Long mintActivityId, @PathVariable int mintNum, @PathVariable OperationType mintOperationType){
+        if (Objects.isNull(mintActivityId)) {
+            throw new BusinessException("mintActivityId参数错误");
+        }
+        if (0 >= mintNum) {
+            throw new BusinessException("num参数错误");
+        }
+        if (Objects.isNull(mintOperationType)) {
+            throw new BusinessException("操作类型不可为空");
+        }
+        switch (mintOperationType) {
+            case INCREASE_STOCK:
+                log.info(String.format("mintActivityId:[%S]  加库存:[%S]", mintActivityId, mintNum));
+                mintActivityService.increaseStock(mintActivityId, mintNum);
+                break;
+            case DECREASE_STOCK:
+                log.info(String.format("mintActivityId:[%S]  减库存:[%S]", mintActivityId, mintNum));
+                mintActivityService.decreaseStock(mintActivityId, mintNum);
+                break;
+            default:
+                String err = String.format("暂不支持的操作类型:[%S]", mintOperationType);
+                log.info(err);
+                throw new BusinessException(err);
+        }
+    }
+
 }
 }

+ 21 - 0
src/main/java/com/izouma/nineth/web/ContentAuditController.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.service.ContentAuditService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/contentAudit")
+@AllArgsConstructor
+public class ContentAuditController {
+
+    private ContentAuditService contentAuditService;
+
+    @PostMapping("/check")
+    public MetaRestResult<Boolean> check(String message){
+        return MetaRestResult.returnSuccess(contentAuditService.auditText(message));
+    }
+}

+ 86 - 0
src/main/java/com/izouma/nineth/web/MetaAccessoriesController.java

@@ -0,0 +1,86 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaAccessories;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.EntryModeType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaAccessoriesPurchaseRecordRepo;
+import com.izouma.nineth.repo.MetaAccessoriesRepo;
+import com.izouma.nineth.service.MetaAccessoriesService;
+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.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/metaAccessories")
+@AllArgsConstructor
+public class MetaAccessoriesController extends BaseController {
+    private MetaAccessoriesService metaAccessoriesService;
+    private MetaAccessoriesRepo metaAccessoriesRepo;
+
+    private MetaAccessoriesPurchaseRecordRepo metaAccessoriesPurchaseRecordRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public MetaAccessories save(@RequestBody MetaAccessories record) {
+        MetaAccessories metaAccessories = metaAccessoriesRepo.findByNameAndDel(record.getName(), false);
+        if (Objects.nonNull(metaAccessories) && !Objects.equals(metaAccessories.getId(), record.getId())) {
+            throw new BusinessException("该配饰名称已经存在!");
+        }
+        if (record.getId() != null) {
+            MetaAccessories orig = metaAccessoriesRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            if (EntryModeType.GOLD.equals(record.getPurchaseMethod())) {
+                orig.setCollectionName(null);
+            }
+            if (EntryModeType.NFT.equals(record.getPurchaseMethod())) {
+                orig.setPrice(0);
+            }
+            return metaAccessoriesRepo.save(orig);
+        }
+        return metaAccessoriesRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaAccessories> all(@RequestBody PageQuery pageQuery) {
+        return metaAccessoriesService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public MetaAccessories get(@PathVariable Long id) {
+        return metaAccessoriesRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        metaAccessoriesRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaAccessories> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @PostMapping("/purchase")
+    public MetaRestResult<Integer> purchase(Long userId, Long metaAccessoriesId) {
+        return metaAccessoriesService.purchase(userId, metaAccessoriesId);
+    }
+
+    @GetMapping("/{userId}/hold")
+    public MetaRestResult<List<MetaAccessories>> hold(@PathVariable Long userId) {
+        return metaAccessoriesService.hold(userId);
+    }
+}
+

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

@@ -4,6 +4,7 @@ import com.izouma.nineth.domain.MetaGameBoxPoints;
 import com.izouma.nineth.dto.MetaGameBoxPointsDTO;
 import com.izouma.nineth.dto.MetaGameBoxPointsDTO;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaPointTypeEnum;
 import com.izouma.nineth.service.MetaGameBoxPointsService;
 import com.izouma.nineth.service.MetaGameBoxPointsService;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -25,9 +26,9 @@ public class MetaGameBoxPointsController extends BaseController {
         return metaGameBoxPointsService.all(pageQuery);
         return metaGameBoxPointsService.all(pageQuery);
     }
     }
 
 
-    @GetMapping("/{userId}/get")
-    public MetaRestResult<MetaGameBoxPointsDTO> get(@PathVariable Long userId) {
-        return metaGameBoxPointsService.get(userId);
+    @GetMapping("/{userId}/{type}/get")
+    public MetaRestResult<MetaGameBoxPointsDTO> get(@PathVariable Long userId, @PathVariable MetaPointTypeEnum type) {
+        return metaGameBoxPointsService.get(userId, type);
     }
     }
 
 
     @PostMapping("/update")
     @PostMapping("/update")

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

@@ -15,8 +15,6 @@ import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 
 
@@ -38,8 +36,8 @@ public class MetaResourceVersionController extends BaseController {
         if (Objects.nonNull(metaResourceVersion) && !Objects.equals(metaResourceVersion.getId(), record.getId())) {
         if (Objects.nonNull(metaResourceVersion) && !Objects.equals(metaResourceVersion.getId(), record.getId())) {
             throw new BusinessException("当前版本编号已经存在");
             throw new BusinessException("当前版本编号已经存在");
         }
         }
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
-        record.setVersion(VERSION_PREFIX.concat(record.getVersion()).concat("-").concat(LocalDateTime.now().format(formatter)));
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+//        record.setVersion(VERSION_PREFIX.concat(record.getVersion()).concat("-").concat(LocalDateTime.now().format(formatter)));
         if (record.getId() != null) {
         if (record.getId() != null) {
             MetaResourceVersion orig = metaResourceVersionRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             MetaResourceVersion orig = metaResourceVersionRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, record);
             ObjUtils.merge(orig, record);
@@ -90,5 +88,14 @@ public class MetaResourceVersionController extends BaseController {
         }
         }
         return MetaRestResult.returnSuccess(metaResourceVersions);
         return MetaRestResult.returnSuccess(metaResourceVersions);
     }
     }
+
+    @GetMapping("/findVersion")
+    public MetaRestResult<MetaResourceVersion> findVersion() {
+        MetaResourceVersion metaResourceVersion = metaResourceVersionRepo.findVersion();
+        if (Objects.isNull(metaResourceVersion)) {
+            return MetaRestResult.returnError("当前无资源版本信息!");
+        }
+        return MetaRestResult.returnSuccess("查询成功", metaResourceVersion);
+    }
 }
 }
 
 

+ 16 - 0
src/main/java/com/izouma/nineth/web/UserDetailController.java

@@ -1,20 +1,25 @@
 package com.izouma.nineth.web;
 package com.izouma.nineth.web;
 
 
+import com.izouma.nineth.domain.UserAssetSummary;
 import com.izouma.nineth.domain.UserDetail;
 import com.izouma.nineth.domain.UserDetail;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.MetaRestResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.PublicShowDTO;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.UserAssetSummaryRepo;
 import com.izouma.nineth.repo.UserDetailRepo;
 import com.izouma.nineth.repo.UserDetailRepo;
 import com.izouma.nineth.service.ContentAuditService;
 import com.izouma.nineth.service.ContentAuditService;
 import com.izouma.nineth.service.UserDetailService;
 import com.izouma.nineth.service.UserDetailService;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 
 
@@ -25,6 +30,7 @@ public class UserDetailController extends BaseController {
     private UserDetailService userDetailService;
     private UserDetailService userDetailService;
     private UserDetailRepo userDetailRepo;
     private UserDetailRepo userDetailRepo;
     private ContentAuditService contentAuditService;
     private ContentAuditService contentAuditService;
+    private UserAssetSummaryRepo userAssetSummaryRepo;
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
@@ -70,6 +76,16 @@ public class UserDetailController extends BaseController {
         userDetail.setReikiCount(userDetailRepo.findReikiCountById(id));
         userDetail.setReikiCount(userDetailRepo.findReikiCountById(id));
         userDetail.setMedalCount(userDetailRepo.findMedalCountById(id));
         userDetail.setMedalCount(userDetailRepo.findMedalCountById(id));
         userDetail.setPersonalheatCount(userDetailRepo.findPersonalHeatCountById(id));
         userDetail.setPersonalheatCount(userDetailRepo.findPersonalHeatCountById(id));
+        List<UserAssetSummary> userAssetSummaries = userAssetSummaryRepo.findPublicShowAsset(id);
+        List<PublicShowDTO> list = new ArrayList<>();
+        if (CollectionUtils.isEmpty(userAssetSummaries)) {
+            userDetail.setPublicShowDTOs(list);
+            return userDetail;
+        }
+        userAssetSummaries.forEach(userAssetSummary -> {
+            list.add(new PublicShowDTO(userAssetSummary.getName(), "video/mp4".equals(userAssetSummary.getPic().get(0).getType()) ? userAssetSummary.getPic().get(0).getThumb() : userAssetSummary.getPic().get(0).getUrl(), userAssetSummary.getOpenShowNum()));
+        });
+        userDetail.setPublicShowDTOs(list);
         return userDetail;
         return userDetail;
     }
     }
 
 

+ 1 - 0
src/main/resources/genjson/MetaAccessories.json

@@ -0,0 +1 @@
+{"tableName":"MetaAccessories","className":"MetaAccessories","remark":"元宇宙配饰","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/java/com/izouma/nineth","viewPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/vue/src/views","routerPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/vue/src","resourcesPath":"/Users/xiaohuoban/IdeaProjects/raex_back/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"配饰名称","showInList":true,"showInForm":true,"formType":"singleLineText","required":true},{"name":"purchaseMethod","modelName":"purchaseMethod","remark":"购买方式","showInList":true,"showInForm":true,"formType":"select","required":true,"apiFlag":"1","optionsValue":"[{\"label\":\"NFT\",\"value\":\"NFT\"},{\"label\":\"金币\",\"value\":\"GOLD\"}]"},{"name":"num","modelName":"num","remark":"金币数量","showInList":true,"showInForm":true,"formType":"number","required":true},{"name":"collectionName","modelName":"collectionName","remark":"NFT名称","showInList":true,"showInForm":true,"formType":"singleLineText","required":true}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.nineth","tablePackage":"com.izouma.nineth.domain.MetaAccessories"}

+ 275 - 0
src/main/resources/static/Agreement.html

@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+<!-- saved from url=(0039)https://crypts.cn/protocol/privacy.html -->
+<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
+  <title>OASISMETA绿洲平台隐私政策</title>
+  <style>
+    html,body{
+      background: #181818;
+      color: white;
+    }
+  </style>
+<style>hcfy-result.__hcfy__result__loaded__.__hcfy__result__both__{border: 1px dotted}</style></head>
+<body>
+  <div class="page-container">
+    <h1 class="align-center">OASISMETA绿洲平台隐私政策</h1>
+    <h4>生效时间【2022-04-11】</h4>
+    <h4>更新时间【2022-04-11】</h4>
+    <p class="text-content">
+      华储艺术品中心(以下称“我们”或“公司”)深知个人信息安全的重要性,我们将按照法律法规要求,采用安全保护措施,保护您的个人信息及隐私安全。因此,我们制定《OASISMETA绿洲平台隐私政策》(以下简称“《隐私政策》”)并提醒您:在使用“OASISMETA绿洲平台”及相关服务(定义同《OASISMETA绿洲平台用户协议》)前,请务必仔细阅读并透彻理解本《隐私政策》,在确认充分理解并同意后,按照指引作出您的适当选择。
+    </p>
+    <p class="strong-text">本隐私政策将帮助您了解:</p>
+    <p class="text-content">
+      我们会遵循隐私政策收集、使用您的信息,但不会仅因您同意本隐私政策而采用强制捆绑的方式一揽子收集个人信息。
+    </p>
+    <p class="text-content">
+      当您使用或开启相关功能或使用服务时,为实现功能、服务所必需,我们会收集、使用相关信息。除非是为实现基本业务功能或根据法律法规要求所必需的必要信息,您均可以拒绝提供且不影响其他功能或服务。我们将在隐私政策中逐项说明哪些是必要信息。
+    </p>
+    <p class="text-content">
+      如果您未登录帐号,我们会通过设备对应的标识符信息来保障信息推送的基本功能。如果您登录了帐号,我们会根据帐号信息实现信息推送。
+    </p>
+    <p class="text-content">
+      <span class="strong-text">APP端 相机、相册(存储)、电话、日历权限,</span>
+      <span>均不会默认开启,只有经过您的明示授权才会在为实现特定功能或服务时使用,您也可以撤回授权。</span>
+      <span class="strong-text">特别需要指出的是,即使经过您的授权,我们获得了这些敏感权限,也不会在相关功能或服务不需要时而收集您的信息。具体权限申请及权限使用情况请见:</span>
+      <span>OASISMETA绿洲平台应用权限申请与使用情况说明</span>
+    </p>
+    <p class="text-content">
+      本隐私政策适用于您通过OASISMETA绿洲平台应用程序、OASISMETA绿洲平台官方网站、供第三方网站和应用程序使用的OASISMETA绿洲平台软件开发工具包(SDK)和应用程序编程接口(API)方式来访问和使用我们的产品和服务。
+    </p>
+    <p class="text-content">
+      下文将帮您详细了解我们如何收集、使用、存储、传输、共享、转让(如适用)与保护个人信息;帮您了解查询、访问、删除、更正、撤回授权个人信息的方式。其中,
+      <span class="strong-text">有关您个人信息权益的条款等重要内容我们已用加粗形式提示,请特别关注。</span>
+    </p>
+    <p class="text-content">一、我们如何收集和使用个人信息</p>
+    <p class="text-content">二、我们对Cookie 和同类技术的使用</p>
+    <p class="text-content">三、我们如何存储个人信息</p>
+    <p class="text-content">四、我们如何共享、转让、公开披露个人信息</p>
+    <p class="text-content">五、我们如何保护个人信息的安全</p>
+    <p class="text-content">六、您的权利</p>
+    <p class="text-content">七、未成年人使用条款</p>
+    <p class="text-content">八、隐私政策的修订和通知</p>
+    <p class="text-content">九、适用范围</p>
+    <p class="text-content">十、其他</p>
+    <h4>一、我们如何收集和使用个人信息</h4>
+    <h5>(一)我们主动收集与使用的个人信息</h5>
+    <p class="text-content">我们会按照如下方式收集你在使用服务时主动提供的,以及通过自动化手段收集您在使用功能或接受服务过程中产生的信息:</p>
+    <h6>1、注册、认证、登录“OASISMETA绿洲平台”和相关服务</h6>
+    <p class="text-content">(1)当您注册、登录“OASISMETA绿洲平台”及相关服务时,你可以通过手机号创建账号,我们将通过发送短信验证码来验证您的身份是否有效,并且您可完善相关的网络身份识别信息(头像、用户名),收集这些信息是为了帮助你完成注册。您还可根据自身需求选择填写个人介绍等信息完善你的个人信息。</p>
+    <p class="text-content">(2)在您使用身份认证的功能或相关服务所需时,根据相关法律法规,
+      <span class="strong-text">您可能需要提供您的真实身份信息(真实姓名、身份证号码以及进行实名认证所需要的其他信息)以完成实名验证。 这些信息属于个人敏感信息,</span>
+      您可以拒绝提供,如果拒绝提供您将可能无法获得相关服务,但不影响其他功能与服务的正常使用。
+    </p>
+    <h6>2、资讯浏览和咨询服务</h6>
+    <p class="text-content">(1)为保障内容的质量并向您提供更好的服务,我们可能会收集必要的日志信息。</p>
+    <p class="text-content">(2)用于信息展示和咨询服务的日志信息包括:
+      您操作、使用的行为信息:点击、关注、收藏、搜索、浏览、分享
+      ,您主动提供的信息:反馈<span class="strong-text">GPS信息、WLAN接入点</span> 、蓝牙和基站等传感器信息</p>
+    <!-- <p class="text-content">
+      (3)<span class="strong-text">地理位置是敏感个人信息</span> ,若你拒绝提供,我们将不会根据GPS信息向你推荐信息,且不会影响OASISMETA绿洲平台其他功能的正常使用。
+    </p> -->
+    <!-- <p class="text-content">(4)我们会基于IP地址对应的城市向您展示、推荐您所在地区的本地相关信息或提供相应的咨询服务。</p> -->
+    <p class="text-content">(3)我们收集、使用的上述信息进行了去标识化处理,数据分析仅对应特定的、无法直接关联您身份的编码,不会与您的真实身份相关联。</p>
+    <h6>3、为你提供信息发布功能或服务</h6>
+    <p class="text-content">
+      您发布内容、评论、评价、提问或回答时,我们将收集您发布的信息,并展示您的昵称、头像、发布内容等。
+    </p>
+    <p class="text-content">(1)您使用上传图片、发布音视频功能时,我们会请求您授权相机、<span class="strong-text">相册(存储)、照片、麦克风权限。您如果拒绝授权提供,将无法使用此功能,但不影响您正常使用“OASISMETA绿洲平台”的其他功能。</span> </p>
+    <p class="text-content">(2)您发布信息并选择显示位置时,我们会请求您授权 <span class="strong-text">地理位置权限,并收集与本服务相关的位置信息。您如果拒绝授权提供,将无法使用此功能,但不影响您正常使用“OASISMETA绿洲平台”的其他功能。</span></p>
+    <h6>4、为您提供互动功能或服务</h6>
+    <p class="text-content">
+      (1)您主动关注您感兴趣的账号、话题并与之进行互动,进行浏览、评论、收藏、点赞或分享内容时,我们会收集您关注的账号,并向您展示您关注账号发布内容。
+    </p>
+    <p class="text-content">(2)为了实现口令分享功能,我们需要访问您的剪切板,读取其中包含的口令、分享码、链接,以实现跳转、分享、活动联动等功能或服务。</p>
+    <h6>5、开展营销活动</h6>
+    <p class="text-content">
+      当您选择参加OASISMETA绿洲平台举办的有关营销活动时,根据活动可能需要您提供<span class="strong-text">姓名、通信地址、联系方式、身份证号、银行账号信息。这些信息可能包括个人敏感信息,如果您拒绝提供这些信息,</span>可能影响您参加相关活动或领取奖品,但不会影响其他功能。
+    </p>
+    <h6>6、支付功能</h6>
+    <p class="text-content">
+      在您下单后,您可以选择与OASISMETA绿洲平台合作的第三方支付机构所提供的支付服务。我们需要将您的订单金额信息和订单支付相关信息与这些支付机构共享以实现其确认您的支付指令并完成支付。为使我们及时获悉并确认您的支付进度及状态,为您提供售后与争议解决服务,您同意我们可自您所选择的流转对象或您选择的其他金融机构处收集与支付进度相关信息。
+    </p>
+    <h6>7、客服</h6>
+    <p class="text-content">(1)当您与我们联系或提出咨询、投诉、争议纠纷处理等申请时,为了保障您的账户及系统安全,<span class="strong-text">我们需要您提供必要的个人信息以核验您的身份、为您提供相关服务。</span></p>
+    <p class="text-content">
+      <span class="strong-text">
+        (2)为便于与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们可能会保存您与我们的通信/通话记录及相关内容(包括账号信息、订单信息、您为了证明相关事实提供的其他信息,或您留下的联系方式信息)。
+      </span>
+    </p>
+    <p class="text-content">(3)为了提供服务及改进服务质量的合理需要,我们还可能使用您的其他信息,包括您与客服联系时您提供的相关信息。</p>
+    <h5>(二)收集、使用个人信息目的变更的处理</h5>
+    <p class="text-content">请您了解,随着我们业务的发展,可能会对“OASISMETA绿洲平台”的功能和提供的服务有所调整变化。原则上,当新功能或服务与我们当前提供的功能或服务相关时,收集与使用的个人信息将与原处理目的具有直接或合理关联。在与原处理目的无直接或合理关联的场景下,我们收集、使用您的个人信息,会再次进行告知,并征得您的同意。</p>
+    <h5>(三)依法豁免征得同意收集和使用的个人信息</h5>
+    <p class="text-content">请您理解,在下列情形中,根据法律法规及相关国家标准,我们收集和使用您的个人信息无需征得您的授权同意:</p>
+    <p class="text-content">1、与国家安全、国防安全直接相关的</p>
+    <p class="text-content">2、与公共安全、公共卫生、重大公共利益直接相关的</p>
+    <p class="text-content">3、与犯罪侦查、起诉、审判和判决执行等直接相关的</p>
+    <p class="text-content">4、出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的</p>
+    <p class="text-content">5、所收集的您的个人信息是您自行向社会公众公开的;</p>
+    <p class="text-content">6、从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道</p>
+    <p class="text-content">7、根据您的要求签订或履行合同所必需的</p>
+    <p class="text-content">8、用于维护“OASISMETA绿洲平台”及相关服务的安全稳定运行所必需的,例如发现、处置“OASISMETA绿洲平台”及相关服务的故障</p>
+    <p class="text-content">9、为合法的新闻报道所必需的</p>
+    <p class="text-content">10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的</p>
+    <p class="text-content">11、法律法规规定的其他情形</p>
+    <p class="text-content"><span class="strong-text">
+      特别提示您注意,如信息无法单独或结合其他信息识别到您的个人身份,其不属于法律意义上您的个人信息;当您的信息可以单独或结合其他信息识别到您的个人身份时或我们将无法与任何特定个人信息建立联系的数据与其他您的个人信息结合使用时,这些信息在结合使用期间,将作为您的个人信息按照本隐私政策处理与保护。
+    </span></p>
+    <h4>二、对Cookie和同类技术的使用</h4>
+    <p class="text-content">Cookie和同类技术是互联网中的通用常用技术。当您使用“OASISMETA绿洲平台”及相关服务时,我们可能会使用相关技术向您的设备发送一个或多个Cookie或匿名标识符,以收集和存储您访问、使用本产品时的信息。我们使用 Cookie 和同类技术主要为了实现以下功能或服务:</p>
+    <h5>(一)保障产品与服务的安全、高效运转</h5>
+    <p class="text-content">我们可能会设置认证与保障安全性的cookie 或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈等不法行为。这些技术还会帮助我们改进服务效率,提升登录和响应速度。</p>
+    <h5>(二)帮助您获得更轻松的访问体验</h5>
+    <p class="text-content">我们可能会设置认证与保障安全性的cookie 或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈等不法行为。这些技术还会帮助我们改进服务效率,提升登录和响应速度。</p>
+    <p class="text-content">我们可能会利用Cookie和同类技术了解您的偏好和使用习惯,进行咨询或数据分析,以改善产品服务。</p>
+    <p class="text-content">在OASISMETA绿洲平台的分享页中,我们可能会使用cookie对浏览活动进行记录,用于排查崩溃、延迟的相关异常情况以及探索更好的服务方式。</p>
+    <p class="text-content">大多数浏览器均为用户提供了清除浏览器缓存数据的功能,您可以在浏览器设置功能中进行相应的数据清除操作。如您进行清除,可能因为这些修改,您可能无法使用依赖于Cookie由公司提供的服务或相应功能。</p>
+    <h4>三、我们如何存储个人信息</h4>
+    <h5>(一)信息存储的地点</h5>
+    <p class="text-content">
+      我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息存储于中华人民共和国境内。目前,我们不会将上述信息传输至境外,如果我们向境外传输,我们将会遵循法律法规的规定,征求您的自主选择同意。
+    </p>
+    <h5>(二)存储期限</h5>
+    <p class="text-content">
+      我们仅在为提供“OASISMETA绿洲平台”及相关服务之目的所必需的期间内保留您的个人信息,您发布的信息、评论、点赞等信息,在您未撤回、删除或未注销账号期间,我们会保留相关信息。超出必要期限后,我们将对您的个人信息进行删除或匿名化处理,但法律法规另有规定的除外。
+    </p>
+    <h4>四、我们如何共享、转让、公开披露个人信息</h4>
+    <h5>(一)个人信息的共享、转让</h5>
+    <p class="text-content"><span class="strong-text">我们不会向第三方共享、转让您的个人信息,除非经过您本人事先授权同意,或者共享、转让的个人信息是去标识化处理后的信息,且共享第三方无法重新识别此类信息的自然人主体。</span></p>
+    <h6>1.在下列情况下,经过您的自主选择同意,我们可能会共享的个人信息</h6>
+    <p class="sub-text">(1)为实现相关功能或服务与关联方及合作方共享</p>
+    <p class="text-content">a.支付功能:支付功能由与我们合作的第三方支付机构向您提供服务。第三方支付机构可能需要收集您的姓名、银行卡类型及卡号、有效期及手机号码。银行卡号、有效期是个人敏感信息,这些信息是支付功能所必需的信息,拒绝提供将导致您无法使用该功能,但不影响其他功能的正常使用。</p>
+    <p class="text-content">b.订单功能:当您使用“我的”--“订单”功能时,我们可能会与下单的相关服务提供方共享您的订单信息,以实现您向其购买商品或服务的需求,并促使其可以完成后续的服务。</p>
+    <p class="text-content">c.当您在使用OASISMETA绿洲平台中由我们的关联方、第三方提供的功能,或者当软件服务提供商、智能设备提供商、系统服务提供商与我们联合为您提供服务时我们会将实现业务所必需的信息与这些关联方、第三方共享。</p>
+    <!-- <p class="text-content">d.地理位置服务:当您使用地理位置相关服务时(例如附近经销商等功能),我们会将您的设备标识信息以及GPS信息与位置服务提供方(高德地图)进行共享,以便向您反馈地理位置结果。如您拒绝提供GPS信息,会影响地理位置服务功能,但不会影响其他功能正常使用。</p> -->
+    <p class="sub-text">(2)帮助您参加营销推广活动</p>
+    <p class="text-content">当您选择参加我们及我们的关联方或第三方举办的有关营销活动时,根据活动可能需要您提供<span class="strong-text">姓名、通信地址、联系方式、银行账号</span>信息。<span class="strong-text">这些信息可能包括个人敏感信息(如个人电话号码)</span>,如果您拒绝提供这些信息,可能影响您参加相关活动或领取奖品,但不会影响其他功能。经过您的明示同意,我们会将上述信息与第三方共享,以保障您在联合活动中获得体验一致的服务,或委托第三方及时向您提供奖品。</p>
+    <p class="sub-text">(3)实现安全与分析统计的共享信息</p>
+    <p class="text-content">a.保障使用安全:我们非常重视账号与服务安全,为保障您和其他用户的账号与财产安全,使您和我们的正当合法权益免受不法侵害,我们和服务提供商可能会共享必要的设备、账号及日志信息。</p>
+    <p class="text-content">b.分析产品使用情况:为分析我们服务的使用情况,提升用户使用的体验,可能会与第三方共享产品使用情况(崩溃、闪退)的统计性数据,这些数据难以与其他信息结合识别您的个人身份。</p>
+    <h6>2. 共享原则</h6>
+    <p class="text-content">
+      <span class="strong-text">(1)授权同意原则:</span>
+      向我们的关联方、第三方共享您的个人信息,需经过您的授权同意,除非共享的个人信息是去标识化处理后的信息,且共享第三方无法重新识别此类信息的自然人主体。如果关联方、第三方使用信息的目的超越原授权同意范围,他们需要重新征得您的同意。
+    </p>
+    <p class="text-content">
+      <span class="strong-text">(2)合法正当与最小必要原则:</span>
+      向关联方、第三方共享的数据必须具有合法正当目的,且共享的数据以达成目的必要为限。
+    </p>
+    <p class="text-content">
+      <span class="strong-text">(3)安全审慎原则:</span>
+      我们将审慎评估关联方、第三方数据使用共享信息的目的,对这些合作方的安全保障能力进行综合评估,并要求其遵循合作法律协议。我们会对合作方获取信息的软件工具开发包(SDK)、应用程序接口(API)进行严格的安全监测,以保护数据安全。接入第三方SDK/API情况:
+    </p>
+    <p class="text-content-no-margin">
+      1) 第三方SDK名称:华为HMS推送SDK:
+    </p>
+    <p class="text-content-no-margin">
+      SDK包名:com.huawei.hms、com.huawei.agconnect
+    </p>
+    <p class="text-content-no-margin">
+      收集个人信息目的/用途::用于实现对华为品牌设备进行消息推送的功能,以及APP扫码功能。
+    </p>
+    <p class="text-content-no-margin">
+      收集个人信息类型:设备识别号等设备信息
+    </p>
+    <p class="text-content-no-margin">
+      收集个人信息类型:设备识别号等设备信息
+    </p>
+    <p class="text-content-no-margin">第三方隐私政策链接:https://consumer.huawei.com/cn/privacy/privacy-policy/</p>
+    <p class="text-content-no-margin">提供方:华为终端有限公司</p>
+    <p class="text-content-no-margin">2)第三方SDK:支付宝 SDK</p>
+    <p class="text-content-no-margin">
+      收集个人信息目的/用途:当您在购买平台商品或服务时,为方便您完成相关支付行为
+      收集个人信息类型:支付宝支付授权信息、Mac地址、IMEI、Android_id、IMSI
+      需要获取的权限:网络状态权限、外置存储存取权限、录音权限
+      第三方隐私政策链接:http://opendocs.alipay.com/open/01g6qm
+    </p>
+    <p class="text-content-no-margin">提供方:支付宝(中国)网络技术有限公司</p>
+    <p class="text-content-no-margin">
+      3)第三方SDK:微信支付 SDK
+    </p>
+    <p class="text-content-no-margin">
+      收集个人信息目的/用途:当您在购买平台商品或服务时,为方便您完成相关支付行为
+      收集个人信息类型:微信支付授权信息、Mac地址、IMEI、Android_id、IMSI
+      需要获取的权限:网络状态权限、外置存储存取权限、录音权限
+      第三方隐私政策链接:https://open.weixin.qq.com/
+    </p>
+    <p class="text-content-no-margin">提供方:深圳市腾讯计算机系统有限公司</p>
+    <p class="text-content-no-margin">4)第三方SDK:阿里云</p>
+    <p class="text-content-no-margin">收集个人信息目的/用途:提供图片、html页面、素材、视频、音频、上传文件的云存储能力、日志上传及分析、域名解析功能,身份证、营业执照等ORC识别和验证功能。</p>
+    <p class="text-content-no-margin">收集个人信息类型:手机图片、网络信息、手机运营商、系统版本,IMSI。</p>
+    <p class="text-content-no-margin">需要获取的权限:读取您的手机状态、网络状态权限、存储权限、相机、录音/视频、闪光灯权限。</p>
+    <p class="text-content-no-margin">第三方隐私政策链接:</p>
+    <p class="text-content-no-margin">https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud201902141711_54837.html?spm=a2c4g.11186623.J_9220772140.90.38eca7d68mm2Y2</p>
+    <p class="text-content-no-margin">提供方:阿里云计算有限公司</p>
+    <h6>3.转让</h6>
+    <p class="text-content">(1)我们不会转让您的个人信息给任何其他第三方,除非征得您的明确同意。</p>
+    <p class="text-content">2)随着我们业务的持续发展,我们将有可能进行合并、收购、资产转让,您的个人信息有可能因此而被转移。在发生前述变更时,我们将按照法律法规及不低于本隐私政策所要求的安全标准继续保护或要求个人信息的继受方继续保护您的个人信息,否则我们将要求继受方重新征得您的授权同意。</p>
+    <h5>(二)个人信息的公开披露</h5>
+    <p class="text-content">1.我们不会公开披露您的信息,除非遵循国家法律法规规定或者获得您的同意。 我们公开披露您的个人信息会采用符合行业内标准的安全保护措施。</p>
+    <p class="text-content"><span class="strong-text">2.对违规账号、欺诈行为进行处罚公告时,我们会披露相关账号的必要信息。</span></p>
+    <p class="text-content">3.您公开发布的作品、关注将会在个人主页中展示。</p>
+    <p class="text-content">4.您参与平台组织的活动时,您的头像、昵称可能会在排行榜、中奖名单等榜单中展示。</p>
+    <h5>(三)依法豁免征得同意共享、转让、公开披露的个人信息</h5>
+    <p class="text-content">请您理解,在下列情形中,根据法律法规及国家标准,我们共享、转让、公开披露您的个人信息无需征得您的授权同意:</p>
+    <p class="text-content">(1)与国家安全、国防安全直接相关的;</p>
+    <p class="text-content">(2)与公共安全、公共卫生、重大公共利益直接相关的</p>
+    <p class="text-content">(3)与犯罪侦查、起诉、审判和判决执行等直接相关的</p>
+    <p class="text-content">(4)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的</p>
+    <p class="text-content">(5)您自行向社会公众公开的个人信息</p>
+    <p class="text-content">(6)从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道</p>
+    <h4>五、我们如何保护个人信息安全</h4>
+    <p class="text-content">(一)我们非常重视您个人信息的安全,将努力采取合理的安全措施(包括技术方面和管理方面)来保护您的个人信息,防止您提供的个人信息被不当使用或未经授权的情况下被访问、公开披露、使用、修改、损坏、丢失或泄漏。</p>
+    <p class="text-content">(二)我们会使用不低于行业同行的加密技术、匿名化处理等合理可行的手段保护您的个人信息,并使用安全保护机制防止您的个人信息遭到恶意攻击。</p>
+    <p class="text-content">(三)我们会建立专门的安全部门、安全管理制度、数据安全流程保障您的个人信息安全。我们采取严格的数据使用和访问制度,确保只有授权人员才可访问您的个人信息,并适时对数据和技术进行安全审计。</p>
+    <p class="text-content"><span class="strong-text">(四)尽管已经采取了上述合理有效措施,并已经遵守了相关法律规定要求的标准,但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全,我们将尽力确保您提供给我们的个人信息的安全性。您知悉并理解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。因此,我们强烈建议您采取积极措施保护个人信息的安全,包括但不限于使用复杂密码、定期修改密码、不将自己的账号密码、短信验证码等个人信息透露给他人。</span></p>
+    <p class="text-content">(五)我们会制定应急处理预案,并在发生用户信息安全事件时立即启动应急预案,努力阻止该等安全事件的影响和后果扩大。一旦发生用户信息安全事件(泄露、丢失等)后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已经采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以推送通知、邮件、信函、短信等形式告知您,难以逐一告知时,我们会采取合理、有效的方式发布公告。同时,我们还将按照相关监管部门要求,上报用户信息安全事件的处置情况。</p>
+    <p class="text-content"><span class="strong-text">(六)我们谨此特别提醒您,本《隐私政策》提供的个人信息保护措施仅适用于“OASISMETA绿洲平台”及相关服务。一旦您离开“OASISMETA绿洲平台”及相关服务,浏览或使用其他网站、服务及内容资源,我们即没有能力及义务保护您在“OASISMETA绿洲平台”及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用上述软件、网站是否基于“OASISMETA绿洲平台”的链接或引导。</span></p>
+    <h4>六、您的权利</h4>
+    <p class="text-content">我们非常重视您对个人信息的管理,并尽全力保护您对于您个人信息的查询、访问、修改、删除、撤回同意授权、注销账号、投诉举报以及设置隐私功能等权利,以使您拥有充分的能力保障您的隐私和安全。</p>
+    <h5>(一)访问、删除、更正您的个人信息</h5>
+    <p class="text-content">您可以通过以下方式管理您的信息:</p>
+    <h6>1.访问个人账号信息:</h6>
+    <p class="text-content">您可以查询、访问、更正您的头像、用户名、简介等基本信息,您可以在OASISMETA绿洲平台的“我的”-“个人信息”-“详情”中进行查询、编辑。</p>
+    <h6>2 加密商品存放</h6>
+    <p class="text-content"><span class="strong-text">您可通过“柜子”查询我发布的、我持有的、我上架的加密商品。</span></p>
+    <h5>(二)消息提醒</h5>
+    <p class="text-content"><span class="strong-text">平台内会推送特定消息,包括流转、赠送、获得加密商品,用户信息更新等有限提醒。</span></p>
+    <h5>(三)改变您授权同意范围或撤销授权</h5>
+    <p class="text-content">您可以在设备本身操作系统中关闭相关权限改变同意范围或撤回您的授权。撤回授权后我们将不再收集与这些权限相关信息。</p>
+    <p class="text-content"><span class="strong-text">请您理解,特定的业务功能和服务将需要您的信息才能得以完成,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的功能和服务,也不再处理您相应的个人信息。但您撤回同意或授权的决定,不会影响公司此前基于您的授权而开展的个人信息处理。</span></p>
+    <h5>(四)注销您的账号</h5>
+    <p class="text-content">您可以在“OASISMETA绿洲平台”客户端“点击“我的”-“设置”-“账号注销”申请注销账号。有关注销的流程和内容,请参见《账号注销须知》。在您注销账号前,我们将验证您的个人身份、安全状态、设备信息等。您知悉并理解,注销账号的行为是不可逆的行为,当您注销账号后,我们将删除有关您的相关信息或进行匿名化处理,但法律法规另有规定的除外。</p>
+    <h5>(五)投诉举报</h5>
+    <p class="text-content">如果您认为您的个人信息权利可能受到侵害,或者发现侵害个人信息权利的线索(例如:认为我们收集您的个人信息违反法律规定或者双方约定),您可以通过“我的”-“用户反馈”页面与我们联系。我们核查后会及时反馈您的投诉与举报。</p>
+    <h5>(六)访问隐私政策</h5>
+    <p class="text-content">您可以在注册页面,或者在登录个人账号“我的-设置”页面查看本《隐私政策》的全部内容或通过OASISMETA绿洲平台网页端首页查看本《隐私政策》全部内容。</p>
+    <h5>(七)停止运营向您告知</h5>
+    <p class="text-content"><span class="strong-text">如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。</span></p>
+    <h4>七、未成年人条款</h4>
+    <p class="text-content">若您是未满18周岁的未成年人,在使用“OASISMETA绿洲平台”及相关服务前,应在您的父母或其他监护人监护、指导下共同阅读并同意本《隐私政策》。我们根据国家相关法律法规的规定保护未成年人的个人信息,只会在法律允许、父母或其他监护人明确同意或保护未成年人所必要的情况下收集、使用、储存、共享、转让或披露未成年人的个人信息;如果我们发现在未事先获得可证实的父母同意的情况下收集了未成年人的个人信息,则会设法尽快删除相关信息。若您是未成年人的监护人,当您对您所监护的未成年人的个人信息有相关疑问时,请通过本《隐私政策》公示的联系方式与我们联系。</p>
+    <h4>八、隐私政策的修订和通知</h4>
+    <p class="text-content">(一)为给您提供更好的服务,“OASISMETA绿洲平台”及相关服务将不时更新与变化,我们会适时对本《隐私政策》进行修订,这些修订构成本《隐私政策》的一部分并具有等同于本《隐私政策》的效力,未经您明确同意,我们不会削减您依据当前生效的《隐私政策》所应享受的权利。</p>
+    <p class="text-content">(二)本《隐私政策》更新后,我们会在“OASISMETA绿洲平台”发出更新版本,并在更新后的条款生效前通过官方网站公告或其他适当的方式提醒您更新的内容,以便您及时了解本《隐私政策》的最新版本。</p>
+    <h4>九、适用范围</h4>
+    <p class="text-content">
+      本《隐私政策》适用于由OASISMETA绿洲平台运营主体提供的所有服务,除本《隐私政策》另有规定外,本《隐私政策》所用词语与《OASISMETA绿洲平台用户协议》所定义的词语具有相同的涵义。<span class="strong-text">本《隐私政策》不适用于:</span>
+    </p>
+    <p class="text-content">
+      1.其他第三方产品或服务
+    </p>
+    <p class="text-content">2.为“OASISMETA绿洲平台”服务进行广告宣传的其他第三方</p>
+    <p class="text-content">
+      <span class="strong-text">您使用这些第三方服务(包括您向这些第三方提供的任何个人信息),将受这些第三方的服务条款及隐私政策约束(而非本《隐私政策》),具体规定请您仔细阅读第三方的条款。请您妥善保护自己的个人信息,仅在必要的情况下向第三方提供。</span>
+    </p>
+    <p class="text-content">
+      <span class="strong-text">3.请您了解,本《隐私政策》中所述的“OASISMETA绿洲平台”及相关服务可能会根据您所使用的手机型号、系统版本、软件应用程序版本、移动客户端等因素而有所不同。最终的产品和服务以您所使用的“OASISMETA绿洲平台”及相关服务为准。</span>
+    </p>
+    <h4>十、其他</h4>
+    <p class="text-content">1.如果您对个人信息保护问题有投诉、建议、疑问,您可以将问题发送至(assistant@raex.vip)</p>
+    <p class="text-content">我们将尽快审核所涉问题,并在验证您的用户身份后的十五个工作日内回复。</p>
+  </div>
+
+</body><div style="all: initial;"><div id="__hcfy__" style="all: initial;"></div></div><div style="all: initial;"><div style="all: initial;"></div></div></html>

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


+ 41 - 0
src/main/resources/static/pc.html

@@ -77,6 +77,32 @@
         border-radius: 20px;
         border-radius: 20px;
         overflow: hidden;
         overflow: hidden;
       }
       }
+
+      .tips-content {
+        position: fixed;
+        z-index: 2;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        display: flex;
+        align-items: center;
+        background-color: #000;
+        justify-content: center;
+        color: #fff;
+        font-size: 12px;
+        padding: 10px;
+      }
+
+      .tips2 {
+        display: flex;
+        align-items: center;
+        color: #fff;
+        margin-left: 10px;
+      }
+
+      .tips2 p {
+        margin: 0 0;
+      }
     </style>
     </style>
   </head>
   </head>
 
 
@@ -87,6 +113,21 @@
         <div class="bg-color"></div>
         <div class="bg-color"></div>
         <iframe src="https://www.raex.vip/9th/home" frameborder="0"></iframe>
         <iframe src="https://www.raex.vip/9th/home" frameborder="0"></iframe>
       </div>
       </div>
+
+      <div class="tips-content">
+        <div class="tips">【华储艺术品中心(深圳)有限公司】</div>
+        <div class="tips1">
+          <span>粤ICP备2021166549号-1</span>
+        </div>
+        <a
+          class="tips2"
+          target="_blank"
+          href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=44030302002216"
+        >
+          <img src="img/icon.png" alt="" />
+          <p>粤公网安备 44030302002216号</p></a
+        >
+      </div>
     </div>
     </div>
   </body>
   </body>
 </html>
 </html>

+ 27 - 11
src/main/vue/src/router.js

@@ -605,7 +605,7 @@ const router = new Router({
                     component: () =>
                     component: () =>
                         import(
                         import(
                             /* webpackChunkName: "collectionPendingList" */ '@/views/company/CollectionPendingList.vue'
                             /* webpackChunkName: "collectionPendingList" */ '@/views/company/CollectionPendingList.vue'
-                        ),
+                            ),
                     meta: {
                     meta: {
                         title: '申请中藏品'
                         title: '申请中藏品'
                     }
                     }
@@ -634,7 +634,7 @@ const router = new Router({
                     component: () =>
                     component: () =>
                         import(
                         import(
                             /* webpackChunkName: "companyCollectionEdit" */ '@/views/company/CompanyCollectionEdit.vue'
                             /* webpackChunkName: "companyCollectionEdit" */ '@/views/company/CompanyCollectionEdit.vue'
-                        ),
+                            ),
                     meta: {
                     meta: {
                         title: '企业藏品编辑'
                         title: '企业藏品编辑'
                     }
                     }
@@ -645,7 +645,7 @@ const router = new Router({
                     component: () =>
                     component: () =>
                         import(
                         import(
                             /* webpackChunkName: "companyCollectionShelf" */ '@/views/company/CompanyCollectionShelf.vue'
                             /* webpackChunkName: "companyCollectionShelf" */ '@/views/company/CompanyCollectionShelf.vue'
-                        ),
+                            ),
                     meta: {
                     meta: {
                         title: '企业藏品查看'
                         title: '企业藏品查看'
                     }
                     }
@@ -1180,7 +1180,7 @@ const router = new Router({
                     component: () =>
                     component: () =>
                         import(
                         import(
                             /* webpackChunkName: "metaUserTaskProgressList" */ '@/views/MetaUserTaskProgressList.vue'
                             /* webpackChunkName: "metaUserTaskProgressList" */ '@/views/MetaUserTaskProgressList.vue'
-                        ),
+                            ),
                     meta: {
                     meta: {
                         title: '元宇宙任务进度'
                         title: '元宇宙任务进度'
                     }
                     }
@@ -1355,7 +1355,7 @@ const router = new Router({
                     component: () =>
                     component: () =>
                         import(
                         import(
                             /* webpackChunkName: "metaPlayerRoleClassifyEdit" */ '@/views/MetaPlayerRoleClassifyEdit.vue'
                             /* webpackChunkName: "metaPlayerRoleClassifyEdit" */ '@/views/MetaPlayerRoleClassifyEdit.vue'
-                        ),
+                            ),
                     meta: {
                     meta: {
                         title: '元宇宙角色配置编辑'
                         title: '元宇宙角色配置编辑'
                     }
                     }
@@ -1366,7 +1366,7 @@ const router = new Router({
                     component: () =>
                     component: () =>
                         import(
                         import(
                             /* webpackChunkName: "metaPlayerRoleClassifyList" */ '@/views/MetaPlayerRoleClassifyList.vue'
                             /* webpackChunkName: "metaPlayerRoleClassifyList" */ '@/views/MetaPlayerRoleClassifyList.vue'
-                        ),
+                            ),
                     meta: {
                     meta: {
                         title: '元宇宙角色配置'
                         title: '元宇宙角色配置'
                     }
                     }
@@ -1393,15 +1393,31 @@ const router = new Router({
                     name: 'DomainOrderList',
                     name: 'DomainOrderList',
                     component: () => import(/* webpackChunkName: "domainOrderList" */ '@/views/DomainOrderList.vue'),
                     component: () => import(/* webpackChunkName: "domainOrderList" */ '@/views/DomainOrderList.vue'),
                     meta: {
                     meta: {
-                       title: '元域名',
+                        title: '元域名',
                     },
                     },
-               },
+                },
+                {
+                    path: '/metaAccessoriesEdit',
+                    name: 'MetaAccessoriesEdit',
+                    component: () => import(/* webpackChunkName: "metaAccessoriesEdit" */ '@/views/MetaAccessoriesEdit.vue'),
+                    meta: {
+                        title: '元宇宙配饰编辑',
+                    },
+                },
+                {
+                    path: '/metaAccessoriesList',
+                    name: 'MetaAccessoriesList',
+                    component: () => import(/* webpackChunkName: "metaAccessoriesList" */ '@/views/MetaAccessoriesList.vue'),
+                    meta: {
+                        title: '元宇宙配饰',
+                    },
+                },
                 {
                 {
                     path: '/tradeAuctionEdit',
                     path: '/tradeAuctionEdit',
                     name: 'TradeAuctionEdit',
                     name: 'TradeAuctionEdit',
                     component: () => import(/* webpackChunkName: "tradeAuctionEdit" */ '@/views/TradeAuctionEdit.vue'),
                     component: () => import(/* webpackChunkName: "tradeAuctionEdit" */ '@/views/TradeAuctionEdit.vue'),
                     meta: {
                     meta: {
-                       title: '绿洲易拍编辑',
+                        title: '绿洲易拍编辑',
                     },
                     },
                 },
                 },
                 {
                 {
@@ -1409,9 +1425,9 @@ const router = new Router({
                     name: 'TradeAuctionList',
                     name: 'TradeAuctionList',
                     component: () => import(/* webpackChunkName: "tradeAuctionList" */ '@/views/TradeAuctionList.vue'),
                     component: () => import(/* webpackChunkName: "tradeAuctionList" */ '@/views/TradeAuctionList.vue'),
                     meta: {
                     meta: {
-                       title: '绿洲易拍',
+                        title: '绿洲易拍',
                     },
                     },
-               },
+                },
                 {
                 {
                     path: '/auctionInviteList',
                     path: '/auctionInviteList',
                     name: 'AuctionInviteList',
                     name: 'AuctionInviteList',

+ 46 - 1
src/main/vue/src/views/Cache.vue

@@ -24,6 +24,11 @@
                 <el-button @click="operatingStockOrSale('DECREASE_STOCK')">减库存</el-button>
                 <el-button @click="operatingStockOrSale('DECREASE_STOCK')">减库存</el-button>
                 <el-button @click="operatingStockOrSale('INCREASE_SALE')">加销量</el-button>
                 <el-button @click="operatingStockOrSale('INCREASE_SALE')">加销量</el-button>
                 <el-button @click="operatingStockOrSale('DECREASE_SALE')">减销量</el-button>
                 <el-button @click="operatingStockOrSale('DECREASE_SALE')">减销量</el-button>
+                <el-divider>库存</el-divider>
+                <el-input v-model="mintActivityId" placeholder="输入mintActivityId"></el-input>
+                <el-input v-model="mintNum" placeholder="输入num"></el-input>
+                <el-button @click="operatingMintStockOrSale('INCREASE_STOCK')">加库存</el-button>
+                <el-button @click="operatingMintStockOrSale('DECREASE_STOCK')">减库存</el-button>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>
@@ -36,7 +41,9 @@ export default {
             loading: false,
             loading: false,
             param: null,
             param: null,
             collectionId: '',
             collectionId: '',
-            num: ''
+            num: '',
+            mintActivityId: '',
+            mintNum: ''
         };
         };
     },
     },
     methods: {
     methods: {
@@ -91,6 +98,44 @@ export default {
                     this.$message.error(e.error || '失败');
                     this.$message.error(e.error || '失败');
                 });
                 });
         },
         },
+        operatingMintStockOrSale(operationType) {
+            let mintActivityId = this.mintActivityId.replace(/\s*/g, '');
+            let mintNum = this.mintNum.replace(/\s*/g, '');
+            var reg = /^[0-9]*$/;
+            if (mintActivityId == null || mintActivityId === undefined || mintActivityId === '') {
+                this.$message.error('请输入mintActivityId');
+                return;
+            }
+            if (mintNum == null || mintNum === undefined || mintNum === '') {
+                this.$message.error('请输入mintNum');
+                return;
+            }
+            if (!reg.test(this.mintActivityId)) {
+                this.$message.error('请正确输入mintActivityId,只允许输入数字');
+                return;
+            }
+            if (!reg.test(this.mintNum)) {
+                this.$message.error('请正确输入mintNum,只允许输入数字且必须大于0');
+                return;
+            }
+            if (this.mintNum <= 0) {
+                this.$message.error('mintNum必须大于0');
+                return;
+            }
+            this.loading = true;
+            this.$http
+                .post('/cache/mint/operating/' + this.mintActivityId + '/' + this.mintNum + '/' + operationType)
+                .then(res => {
+                    this.loading = false;
+                    this.$message.success('成功');
+                    this.mintNum = null;
+                    this.mintActivityId = null;
+                })
+                .catch(e => {
+                    this.loading = false;
+                    this.$message.error(e.error || '失败');
+                });
+        },
         clearUserProperty() {
         clearUserProperty() {
             this.loading = true;
             this.loading = true;
             this.$http
             this.$http

+ 185 - 0
src/main/vue/src/views/MetaAccessoriesEdit.vue

@@ -0,0 +1,185 @@
+<template>
+	<div class="edit-view">
+		<page-title>
+			<el-button @click="$router.go(-1)" :disabled="saving"> 取消 </el-button>
+			<el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id"> 删除 </el-button>
+			<el-button @click="onSave" :loading="saving" type="primary"> 保存 </el-button>
+		</page-title>
+		<div class="edit-view__content-wrapper">
+			<div class="edit-view__content-section">
+				<el-form
+					:model="formData"
+					:rules="rules"
+					ref="form"
+					label-width="80px"
+					label-position="right"
+					size="small"
+					style="max-width: 500px"
+				>
+					<el-form-item prop="name" label="配饰名称">
+						<el-input v-model="formData.name"> </el-input>
+					</el-form-item>
+					<el-form-item prop="purchaseMethod" label="购买方式">
+						<el-select
+							v-model="formData.purchaseMethod"
+							clearable
+							filterable
+							placeholder="请选择"
+							@change="changePurchaseMethod()"
+						>
+							<el-option
+								v-for="item in purchaseMethodOptions"
+								:key="item.value"
+								:label="item.label"
+								:value="item.value"
+							>
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item
+						prop="price"
+						label="金币数量"
+						v-if="formData.purchaseMethod && formData.purchaseMethod === 'GOLD'"
+					>
+						<el-input-number type="price" v-model="formData.price" :step="1" :min="1"> </el-input-number>
+						<div class="tip">输入规则:正整数,最小为1</div>
+					</el-form-item>
+					<el-form-item
+						prop="collectionName"
+						label="NFT名称"
+						v-if="formData.purchaseMethod && formData.purchaseMethod === 'NFT'"
+					>
+						<el-input v-model="formData.collectionName"> </el-input>
+					</el-form-item>
+					<el-form-item class="form-submit">
+						<el-button @click="onSave" :loading="saving" type="primary"> 保存 </el-button>
+						<el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id">
+							删除
+						</el-button>
+						<el-button @click="$router.go(-1)" :disabled="saving"> 取消 </el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+export default {
+	name: 'MetaAccessoriesEdit',
+	created() {
+		if (this.$route.query.id) {
+			this.$http
+				.get('metaAccessories/get/' + this.$route.query.id)
+				.then(res => {
+					this.formData = res;
+				})
+				.catch(e => {
+					console.log(e);
+					this.$message.error(e.error);
+				});
+		}
+	},
+	data() {
+		return {
+			reg: /^[1-9]\d*$/,
+			saving: false,
+			formData: {},
+			rules: {
+				name: [
+					{
+						required: true,
+						message: '请输入配饰名称',
+						trigger: 'blur'
+					}
+				],
+				purchaseMethod: [
+					{
+						required: true,
+						message: '请输入购买方式',
+						trigger: 'blur'
+					}
+				],
+				price: [
+					{
+						required: true,
+						message: '请输入所需金币数量',
+						trigger: 'blur'
+					},
+					{
+						validator: (rule, value, callback) => {
+							if (!this.reg.test(value)) {
+								callback(new Error('金币数量必须为大于1的整数'));
+								return;
+							} else {
+								callback();
+							}
+						}
+					}
+				],
+				collectionName: [
+					{
+						required: true,
+						message: '请输入NFT名称',
+						trigger: 'blur'
+					}
+				]
+			},
+			purchaseMethodOptions: [
+				{ label: 'NFT', value: 'NFT' },
+				{ label: '金币', value: 'GOLD' }
+			]
+		};
+	},
+	methods: {
+		changePurchaseMethod() {
+			this.$delete(this.formData, 'price');
+			this.$delete(this.formData, 'collectionName');
+		},
+		onSave() {
+			this.$refs.form.validate(valid => {
+				if (valid) {
+					this.submit();
+				} else {
+					return false;
+				}
+			});
+		},
+		submit() {
+			let data = { ...this.formData };
+
+			this.saving = true;
+			this.$http
+				.post('/metaAccessories/save', data, { body: 'json' })
+				.then(res => {
+					this.saving = false;
+					this.$message.success('成功');
+					this.$router.go(-1);
+				})
+				.catch(e => {
+					console.log(e);
+					this.saving = false;
+					this.$message.error(e.error);
+				});
+		},
+		onDelete() {
+			this.$confirm('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaAccessories/del/${this.formData.id}`);
+				})
+				.then(() => {
+					this.$message.success('删除成功');
+					this.$router.go(-1);
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						console.log(e);
+						this.$message.error((e || {}).error || '删除失败');
+					}
+				});
+		}
+	}
+};
+</script>
+<style lang="less" scoped>
+
+</style>

+ 192 - 0
src/main/vue/src/views/MetaAccessoriesList.vue

@@ -0,0 +1,192 @@
+<template>
+	<div class="list-view">
+		<page-title>
+			<el-button
+				@click="addRow"
+				type="primary"
+				icon="el-icon-plus"
+				:disabled="fetchingData || downloading"
+				class="filter-item"
+			>
+				新增
+			</el-button>
+			<el-button
+				@click="download"
+				icon="el-icon-upload2"
+				:loading="downloading"
+				:disabled="fetchingData"
+				class="filter-item"
+			>
+				导出
+			</el-button>
+		</page-title>
+		<div class="filters-container">
+			<el-input
+				placeholder="搜索..."
+				v-model="search"
+				clearable
+				class="filter-item search"
+				@keyup.enter.native="getData"
+			>
+				<el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+			</el-input>
+		</div>
+		<el-table
+			:data="tableData"
+			row-key="id"
+			ref="table"
+			header-row-class-name="table-header-row"
+			header-cell-class-name="table-header-cell"
+			row-class-name="table-row"
+			cell-class-name="table-cell"
+			:height="tableHeight"
+			v-loading="fetchingData"
+		>
+			<el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+			<el-table-column prop="id" align="center" label="ID" width="100"> </el-table-column>
+			<el-table-column prop="name" align="center" label="配饰名称"> </el-table-column>
+			<el-table-column prop="purchaseMethod" align="center" label="购买方式" :formatter="purchaseMethodFormatter">
+			</el-table-column>
+			<el-table-column prop="price" align="center" label="金币数量"> </el-table-column>
+			<el-table-column prop="collectionName" align="center" label="NFT名称"> </el-table-column>
+			<el-table-column label="操作" align="center" fixed="right" 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>
+				</template>
+			</el-table-column>
+		</el-table>
+		<div class="pagination-wrapper">
+			<!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)"> 批量编辑 </el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1"> 批量操作1 </el-button>
+                    <el-button @click="operation2"> 批量操作2 </el-button>
+                    <el-button @click="toggleMultipleMode(false)"> 取消 </el-button>
+                </el-button-group>
+            </div> -->
+			<el-pagination
+				background
+				@size-change="onSizeChange"
+				@current-change="onCurrentChange"
+				:current-page="page"
+				:page-sizes="[10, 20, 30, 40, 50]"
+				:page-size="pageSize"
+				layout="total, sizes, prev, pager, next, jumper"
+				:total="totalElements"
+			>
+			</el-pagination>
+		</div>
+	</div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+	name: 'MetaAccessoriesList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			multipleMode: false,
+			search: '',
+			url: '/metaAccessories/all',
+			downloading: false,
+			purchaseMethodOptions: [
+				{ label: 'NFT', value: 'NFT' },
+				{ label: '金币', value: 'GOLD' }
+			]
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		purchaseMethodFormatter(row, column, cellValue, index) {
+			let selectedOption = this.purchaseMethodOptions.find(i => i.value === cellValue);
+			if (selectedOption) {
+				return selectedOption.label;
+			}
+			return '';
+		},
+		beforeGetData() {
+			return { search: this.search, query: { del: false } };
+		},
+		toggleMultipleMode(multipleMode) {
+			this.multipleMode = multipleMode;
+			if (!multipleMode) {
+				this.$refs.table.clearSelection();
+			}
+		},
+		addRow() {
+			this.$router.push({
+				path: '/metaAccessoriesEdit',
+				query: {
+					...this.$route.query
+				}
+			});
+		},
+		editRow(row) {
+			this.$router.push({
+				path: '/metaAccessoriesEdit',
+				query: {
+					id: row.id
+				}
+			});
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaAccessories/excel', {
+					responseType: 'blob',
+					params: { size: 10000 }
+				})
+				.then(res => {
+					console.log(res);
+					this.downloading = false;
+					const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+					const link = document.createElement('a');
+					link.href = downloadUrl;
+					link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+					document.body.appendChild(link);
+					link.click();
+					link.remove();
+				})
+				.catch(e => {
+					console.log(e);
+					this.downloading = false;
+					this.$message.error(e.error);
+				});
+		},
+		operation1() {
+			this.$notify({
+				title: '提示',
+				message: this.selection
+			});
+		},
+		operation2() {
+			this.$message('操作2');
+		},
+		deleteRow(row) {
+			this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaAccessories/del/${row.id}`);
+				})
+				.then(() => {
+					this.$message.success('删除成功');
+					this.getData();
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						this.$message.error(e.error);
+					}
+				});
+		}
+	}
+};
+</script>
+<style lang="less" scoped>
+
+</style>

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

@@ -364,7 +364,7 @@ export default {
 					}
 					}
 				]
 				]
 			},
 			},
-			gameNameOptions: [{ label: '僵尸', value: 'ZOMBIE' }],
+			gameNameOptions: [{ label: '僵尸', value: 'ZOMBIE' },{ label: '钓鱼', value: 'FISHING' }],
 			gameCopyTypeOptions: [
 			gameCopyTypeOptions: [
 				{ label: '青铜', value: 'BRONZE' },
 				{ label: '青铜', value: 'BRONZE' },
 				{ label: '白银', value: 'SILVER' },
 				{ label: '白银', value: 'SILVER' },

+ 2 - 1
src/main/vue/src/views/MetaGameCopyList.vue

@@ -110,7 +110,8 @@ export default {
 			url: '/metaGameCopy/all',
 			url: '/metaGameCopy/all',
 			downloading: false,
 			downloading: false,
 			gameNameOptions: [
 			gameNameOptions: [
-				{ label: '僵尸游戏', value: 'ZOMBIE' }
+				{ label: '僵尸游戏', value: 'ZOMBIE' },
+				{ label: '钓鱼游戏', value: 'FISHING' }
 			],
 			],
 			gameCopyTypeOptions: [
 			gameCopyTypeOptions: [
 				{ label: '青铜', value: 'BRONZE' },
 				{ label: '青铜', value: 'BRONZE' },

+ 2 - 5
src/main/vue/src/views/MetaResourceVersionEdit.vue

@@ -20,8 +20,7 @@
 						<el-input v-model="formData.downloadUrl"> </el-input>
 						<el-input v-model="formData.downloadUrl"> </el-input>
 					</el-form-item>
 					</el-form-item>
 					<el-form-item prop="version" label="版本编号">
 					<el-form-item prop="version" label="版本编号">
-						<el-input-number v-model="formData.version" :min="0.1" :precision="1" :step="0.1"> </el-input-number>
-                        <div class="tip">版本编号只允许输入一位小数,如遇整数会补齐一位小数。版本生成规则为:V + 版本编号 + 时间戳 ,例如:V1.0-20220922173351</div>
+						<el-input v-model="formData.version"> </el-input>
 					</el-form-item>
 					</el-form-item>
 					<el-form-item class="form-submit">
 					<el-form-item class="form-submit">
 						<el-button @click="onSave" :loading="saving" type="primary"> 保存 </el-button>
 						<el-button @click="onSave" :loading="saving" type="primary"> 保存 </el-button>
@@ -44,7 +43,6 @@ export default {
 				.get('metaResourceVersion/get/' + this.$route.query.id)
 				.get('metaResourceVersion/get/' + this.$route.query.id)
 				.then(res => {
 				.then(res => {
 					this.formData = res;
 					this.formData = res;
-                    this.formData.version = res.version.substring(1,4)
 				})
 				})
 				.catch(e => {
 				.catch(e => {
 					console.log(e);
 					console.log(e);
@@ -67,7 +65,7 @@ export default {
 				version: [
 				version: [
 					{
 					{
 						required: true,
 						required: true,
-						message: '请输入版本编号 如1.0',
+						message: '请输入版本编号',
 						trigger: 'blur'
 						trigger: 'blur'
 					}
 					}
 				]
 				]
@@ -86,7 +84,6 @@ export default {
 		},
 		},
 		submit() {
 		submit() {
 			let data = { ...this.formData };
 			let data = { ...this.formData };
-            data.version = data.version.toFixed(1)
 			this.saving = true;
 			this.saving = true;
 			this.$http
 			this.$http
 				.post('/metaResourceVersion/save', data, { body: 'json' })
 				.post('/metaResourceVersion/save', data, { body: 'json' })

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

@@ -88,7 +88,7 @@
                         },
                         },
                     ],
                     ],
                 },
                 },
-                labelOptions: [{"name":"SSR","value":"SSR"},{"name":"SR","value":"SR"},{"name":"R","value":"R"},{"name":"U","value":"U"}],
+                labelOptions: [{"name":"UR","value":"UR"},{"name":"SSR","value":"SSR"},{"name":"SR","value":"SR"},{"name":"R","value":"R"},{"name":"U","value":"U"}],
             }
             }
         },
         },
         methods: {
         methods: {