sunkean před 3 roky
rodič
revize
4669eb76f6
56 změnil soubory, kde provedl 6786 přidání a 6250 odebrání
  1. 2 0
      src/main/java/com/izouma/nineth/config/Constants.java
  2. 4 0
      src/main/java/com/izouma/nineth/domain/MetaSpatialInfo.java
  3. 51 0
      src/main/java/com/izouma/nineth/domain/MetaSpatialWharf.java
  4. 17 0
      src/main/java/com/izouma/nineth/dto/MetaBoatDTO.java
  5. 5 1
      src/main/java/com/izouma/nineth/repo/AssetRepo.java
  6. 3 0
      src/main/java/com/izouma/nineth/repo/MetaAccessoriesPurchaseRecordRepo.java
  7. 3 0
      src/main/java/com/izouma/nineth/repo/MetaSpatialInfoRepo.java
  8. 25 0
      src/main/java/com/izouma/nineth/repo/MetaSpatialWharfRepo.java
  9. 27 11
      src/main/java/com/izouma/nineth/service/MetaAccessoriesService.java
  10. 2 0
      src/main/java/com/izouma/nineth/service/MetaGameBoxPointsService.java
  11. 111 0
      src/main/java/com/izouma/nineth/service/MetaSpatialWharfService.java
  12. 16 0
      src/main/java/com/izouma/nineth/utils/MathUtils.java
  13. 2 5
      src/main/java/com/izouma/nineth/web/MetaAccessoriesController.java
  14. 11 0
      src/main/java/com/izouma/nineth/web/MetaSpatialInfoController.java
  15. 76 0
      src/main/java/com/izouma/nineth/web/MetaSpatialWharfController.java
  16. 1 0
      src/main/resources/genjson/MetaSpatialWharf.json
  17. 9 1
      src/main/vue/src/router.js
  18. 175 175
      src/main/vue/src/views/MetaAccessoriesEdit.vue
  19. 173 173
      src/main/vue/src/views/MetaAccessoriesList.vue
  20. 125 125
      src/main/vue/src/views/MetaAdvertRecordEdit.vue
  21. 156 156
      src/main/vue/src/views/MetaAdvertRecordList.vue
  22. 89 88
      src/main/vue/src/views/MetaBonusSceneList.vue
  23. 231 231
      src/main/vue/src/views/MetaDestroyActivityEdit.vue
  24. 188 188
      src/main/vue/src/views/MetaDestroyActivityList.vue
  25. 138 136
      src/main/vue/src/views/MetaDestroyRecordList.vue
  26. 102 102
      src/main/vue/src/views/MetaGameBoxPointsList.vue
  27. 487 471
      src/main/vue/src/views/MetaGameCopyEdit.vue
  28. 221 219
      src/main/vue/src/views/MetaGameCopyList.vue
  29. 188 188
      src/main/vue/src/views/MetaGameProcessList.vue
  30. 144 144
      src/main/vue/src/views/MetaGameStageAwardEdit.vue
  31. 178 178
      src/main/vue/src/views/MetaGameStageAwardList.vue
  32. 125 125
      src/main/vue/src/views/MetaItemEdit.vue
  33. 170 170
      src/main/vue/src/views/MetaItemList.vue
  34. 120 120
      src/main/vue/src/views/MetaMMOLoginInfoList.vue
  35. 181 177
      src/main/vue/src/views/MetaPlayerRoleClassifyEdit.vue
  36. 164 164
      src/main/vue/src/views/MetaPlayerRoleClassifyList.vue
  37. 154 153
      src/main/vue/src/views/MetaPlayerWearEdit.vue
  38. 175 174
      src/main/vue/src/views/MetaPlayerWearList.vue
  39. 113 113
      src/main/vue/src/views/MetaResourceVersionEdit.vue
  40. 159 159
      src/main/vue/src/views/MetaResourceVersionList.vue
  41. 106 106
      src/main/vue/src/views/MetaShowRoomAssetList.vue
  42. 22 0
      src/main/vue/src/views/MetaSpatialInfoEdit.vue
  43. 189 188
      src/main/vue/src/views/MetaSpatialInfoList.vue
  44. 139 0
      src/main/vue/src/views/MetaSpatialWharfList.vue
  45. 136 136
      src/main/vue/src/views/MetaTaskActivityEdit.vue
  46. 176 176
      src/main/vue/src/views/MetaTaskActivityList.vue
  47. 265 265
      src/main/vue/src/views/MetaTaskEdit.vue
  48. 238 238
      src/main/vue/src/views/MetaTaskList.vue
  49. 145 145
      src/main/vue/src/views/MetaTaskToUserList.vue
  50. 101 100
      src/main/vue/src/views/MetaUserEdit.vue
  51. 195 195
      src/main/vue/src/views/MetaUserGoldList.vue
  52. 150 150
      src/main/vue/src/views/MetaUserGoldRecordList.vue
  53. 156 155
      src/main/vue/src/views/MetaUserList.vue
  54. 118 118
      src/main/vue/src/views/MetaUserTaskProgressList.vue
  55. 144 144
      src/main/vue/src/views/MetaZombieEdit.vue
  56. 185 187
      src/main/vue/src/views/MetaZombieList.vue

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

@@ -63,11 +63,13 @@ public interface Constants {
         String SR  = "SR";
         String U   = "U";
         String R   = "R";
+        String UR  = "UR";
 
         String SSR_LIKE = "%SSR #%";
         String SR_LIKE  = "%SR #%";
         String U_LIKE   = "%U #%";
         String R_LIKE   = "%R #%";
+        String UR_LIKE  = "%UR #%";
 
         String ACTIVITY_RANK_ID = "activity_rank_id";
     }

+ 4 - 0
src/main/java/com/izouma/nineth/domain/MetaSpatialInfo.java

@@ -56,4 +56,8 @@ public class MetaSpatialInfo extends BaseEntity {
     @Searchable
     private String hcTxHash;
 
+    @ApiModelProperty("类型")
+    @ExcelProperty("类型")
+    private int type;
+
 }

+ 51 - 0
src/main/java/com/izouma/nineth/domain/MetaSpatialWharf.java

@@ -0,0 +1,51 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.converter.CoordinateConverter;
+import com.izouma.nineth.dto.CoordinateDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙空间码头列表")
+public class MetaSpatialWharf extends BaseEntity {
+
+    @ApiModelProperty("岛屿id 对应元宇宙空间id")
+    @ExcelProperty("岛屿id 对应元宇宙空间id")
+    private Long isLandId;
+
+    @ApiModelProperty("船只id 对应NFT资产id")
+    @ExcelProperty("船只id 对应NFT资产id")
+    private Long boatId;
+
+    @ApiModelProperty("船只图片 NFT图片")
+    @ExcelProperty("船只图片 NFT图片")
+    private String boatImg;
+
+    @ApiModelProperty("所属用户")
+    @ExcelProperty("所属用户")
+    private Long userId;
+
+    @ApiModelProperty("船只类型 NFT稀有度")
+    @ExcelProperty("船只类型 NFT稀有度")
+    private String boatType;
+
+    @ApiModelProperty("位置信息")
+    @ExcelProperty("位置信息")
+    @Convert(converter = CoordinateConverter.class)
+    private CoordinateDTO boatPos;
+
+    @ApiModelProperty("旋转值")
+    @ExcelProperty("旋转值")
+    @Convert(converter = CoordinateConverter.class)
+    private CoordinateDTO boatRot;
+}

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

@@ -0,0 +1,17 @@
+package com.izouma.nineth.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class MetaBoatDTO {
+
+    private Long boatId;
+
+    private String boatImg;
+
+    private String boatType;
+}

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

@@ -10,7 +10,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
-import javax.transaction.Status;
 import javax.transaction.Transactional;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -21,6 +20,8 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     @Transactional
     void softDelete(Long id);
 
+    Asset findByIdAndUserIdAndDel(Long id, Long userId, boolean del);
+
     long countByIpfsUrlAndStatusNot(String ipfsUrl, AssetStatus status);
 
     List<Asset> findByCollectionId(Long collectionId);
@@ -135,4 +136,7 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
 
     @Query("select count(id) from Asset where name like ?1 and status = 'NORMAL' and ownerId <> 1435297")
     Long countNameLikeNotDestroyed(String name);
+
+    @Query(value = "select * from asset where name like ?1 and status in ?2 and id not in ?3 and del = false", nativeQuery = true)
+    List<Asset> findAllBoats(String name, List<AssetStatus> status, List<Long> boatIds);
 }

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

@@ -4,9 +4,12 @@ import com.izouma.nineth.domain.MetaAccessoriesPurchaseRecord;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
+import java.util.List;
+
 
 public interface MetaAccessoriesPurchaseRecordRepo extends JpaRepository<MetaAccessoriesPurchaseRecord, Long>, JpaSpecificationExecutor<MetaAccessoriesPurchaseRecord> {
 
     MetaAccessoriesPurchaseRecord findByUserIdAndMetaAccessoriesId(Long userId, Long metaAccessories);
 
+    List<MetaAccessoriesPurchaseRecord> findByUserIdAndMetaAccessoriesIdIn(Long userId, List<Long> metaAccessories);
 }

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

@@ -28,4 +28,7 @@ public interface MetaSpatialInfoRepo extends JpaRepository<MetaSpatialInfo, Long
 
     MetaSpatialInfo findByHcTxHashAndDel(String hcTxHash, boolean del);
 
+    @Query(value = "select * from meta_spatial_info where type = ?1 and del = false and user_id <> ?2", nativeQuery = true)
+    List<MetaSpatialInfo> findByTypeAndUserIdNot(int type, Long userId);
+
 }

+ 25 - 0
src/main/java/com/izouma/nineth/repo/MetaSpatialWharfRepo.java

@@ -0,0 +1,25 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.MetaSpatialWharf;
+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 MetaSpatialWharfRepo extends JpaRepository<MetaSpatialWharf, Long>, JpaSpecificationExecutor<MetaSpatialWharf> {
+
+    MetaSpatialWharf findByBoatIdAndUserIdAndDel(Long boatId, Long userId, boolean del);
+
+    @Query(value = "delete from meta_spatial_wharf where boat_id = ?1", nativeQuery = true)
+    @Modifying
+    @Transactional
+    int back(Long boatId);
+
+    MetaSpatialWharf findByBoatIdAndDel(Long boatId, boolean del);
+
+    @Query(value = "select id from meta_spatial_wharf where user_id = ?1 and del = false", nativeQuery = true)
+    List<Long> findParkingBoatIds(Long userId);
+}

+ 27 - 11
src/main/java/com/izouma/nineth/service/MetaAccessoriesService.java

@@ -12,6 +12,7 @@ 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 com.izouma.nineth.web.MetaUserGoldController;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
@@ -31,6 +32,8 @@ public class MetaAccessoriesService {
 
     private MetaUserGoldService metaUserGoldService;
 
+    private MetaUserGoldController metaUserGoldController;
+
     private AssetRepo assetRepo;
 
     public Page<MetaAccessories> all(PageQuery pageQuery) {
@@ -38,23 +41,36 @@ public class MetaAccessoriesService {
     }
 
     @Transactional
-    public MetaRestResult<Integer> purchase(Long userId, Long metaAccessoriesId) {
-        MetaAccessoriesPurchaseRecord exist = metaAccessoriesPurchaseRecordRepo.findByUserIdAndMetaAccessoriesId(userId, metaAccessoriesId);
-        if (Objects.nonNull(exist)) {
-            return MetaRestResult.returnError("当前配饰已经购买过!");
+    public MetaRestResult<Integer> purchase(Long userId, List<Long> metaAccessoriesIds) {
+        List<MetaAccessoriesPurchaseRecord> exist = metaAccessoriesPurchaseRecordRepo.findByUserIdAndMetaAccessoriesIdIn(userId, metaAccessoriesIds);
+        if (CollectionUtils.isNotEmpty(exist)) {
+            return MetaRestResult.returnError("部分配饰已经购买过,请重新选择配饰!");
         }
-        MetaAccessories metaAccessories = metaAccessoriesRepo.findByIdAndDel(metaAccessoriesId, false);
-        if (Objects.isNull(metaAccessories)) {
-            return MetaRestResult.returnError("当前配饰信息不存在!");
+        int total = 0;
+        for (Long id : metaAccessoriesIds) {
+            MetaAccessories metaAccessories = metaAccessoriesRepo.findByIdAndDel(id, false);
+            if (Objects.isNull(metaAccessories)) {
+                return MetaRestResult.returnError(String.format("id:[%S]的配饰信息不存在!", id));
+            }
+            if (!EntryModeType.GOLD.equals(metaAccessories.getPurchaseMethod())) {
+                return MetaRestResult.returnError(String.format("当前配饰[%S]不允许金币购买!", id));
+            }
+            total = total + metaAccessories.getPrice();
         }
-        if (!EntryModeType.GOLD.equals(metaAccessories.getPurchaseMethod())) {
-            return MetaRestResult.returnError("当前配置不允许金币购买!");
+        MetaRestResult<Integer> restResultForNum = metaUserGoldController.queryGoldNum(userId);
+        if (Constants.MetaRestCode.success != restResultForNum.getCode()) {
+            return MetaRestResult.returnError(restResultForNum.getMessage());
         }
-        MetaRestResult<MetaUserGold> restResult = metaUserGoldService.changeNum(userId, -metaAccessories.getPrice());
+        if (total > restResultForNum.getData()) {
+            return MetaRestResult.returnError(String.format("金币不足:当前配饰总共需要金币[%S]个,当前用户剩余金币[%S]个", total, restResultForNum.getData()));
+        }
+        MetaRestResult<MetaUserGold> restResult = metaUserGoldService.changeNum(userId, -total);
         if (Constants.MetaRestCode.success != restResult.getCode()) {
             return MetaRestResult.returnError(restResult.getMessage());
         }
-        metaAccessoriesPurchaseRecordRepo.save(new MetaAccessoriesPurchaseRecord(userId, metaAccessoriesId));
+        metaAccessoriesIds.forEach(id -> {
+            metaAccessoriesPurchaseRecordRepo.save(new MetaAccessoriesPurchaseRecord(userId, id));
+        });
         return MetaRestResult.returnSuccess("购买成功", restResult.getData().getNum());
     }
 

+ 2 - 0
src/main/java/com/izouma/nineth/service/MetaGameBoxPointsService.java

@@ -13,6 +13,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -50,6 +51,7 @@ public class MetaGameBoxPointsService {
         return MetaRestResult.returnSuccess(metaGameBoxPointsDTO);
     }
 
+    @Transactional
     public MetaRestResult<MetaGameBoxPoints> update(MetaGameBoxPoints record) {
         if (Objects.isNull(record)) {
             return MetaRestResult.returnError("Illegal parameter : parameter can not be null");

+ 111 - 0
src/main/java/com/izouma/nineth/service/MetaSpatialWharfService.java

@@ -0,0 +1,111 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.MetaSpatialWharf;
+import com.izouma.nineth.dto.MetaBoatDTO;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.MetaSpatialWharfRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+public class MetaSpatialWharfService {
+
+    private MetaSpatialWharfRepo metaSpatialWharfRepo;
+
+    private AssetRepo assetRepo;
+
+    public Page<MetaSpatialWharf> all(PageQuery pageQuery) {
+        return metaSpatialWharfRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaSpatialWharf.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public MetaRestResult<MetaSpatialWharf> park(MetaSpatialWharf metaSpatialWharf) {
+        if (Objects.isNull(metaSpatialWharf)) {
+            return MetaRestResult.returnError("Illegal parameter : parameter can not be null");
+        }
+        if (Objects.isNull(metaSpatialWharf.getUserId())) {
+            return MetaRestResult.returnError("Illegal parameter : userId can not be null");
+        }
+        if (!metaSpatialWharf.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
+            return MetaRestResult.returnError("当前船只不属于你!");
+        }
+        if (Objects.isNull(metaSpatialWharf.getBoatId())) {
+            return MetaRestResult.returnError("Illegal parameter : boatId can not be null");
+        }
+        if (Objects.isNull(metaSpatialWharf.getIsLandId())) {
+            return MetaRestResult.returnError("Illegal parameter : isLandId can not be null");
+        }
+        if (StringUtils.isBlank(metaSpatialWharf.getBoatType())) {
+            return MetaRestResult.returnError("Illegal parameter : boatType can not be null");
+        }
+        if (Objects.isNull(metaSpatialWharf.getBoatPos())) {
+            return MetaRestResult.returnError("Illegal parameter : boatPos can not be null");
+        }
+        if (Objects.isNull(metaSpatialWharf.getBoatRot())) {
+            return MetaRestResult.returnError("Illegal parameter : boatRot can not be null");
+        }
+        MetaSpatialWharf dbMetaSpatialWharf = metaSpatialWharfRepo.findByBoatIdAndUserIdAndDel(metaSpatialWharf.getBoatId(), metaSpatialWharf.getUserId(), false);
+        if (Objects.nonNull(dbMetaSpatialWharf)) {
+            return MetaRestResult.returnError(String.format("该船只已经停靠在岛屿[%S]", dbMetaSpatialWharf.getIsLandId()));
+        }
+        Asset asset = assetRepo.findByIdAndUserIdAndDel(metaSpatialWharf.getBoatId(), metaSpatialWharf.getUserId(), false);
+        if (Objects.isNull(asset)) {
+            return MetaRestResult.returnError(String.format("藏品[%S]不存在", metaSpatialWharf.getBoatId()));
+        }
+        metaSpatialWharf.setBoatImg(asset.getPic().get(0).getUrl());
+        return MetaRestResult.returnSuccess("", metaSpatialWharfRepo.save(metaSpatialWharf));
+    }
+
+    private String getRarityType(String name) {
+        if (StringUtils.isBlank(name)) {
+            return null;
+        }
+        if (name.contains(Constants.Rarity.U) && !name.contains(Constants.Rarity.UR)) {
+            return Constants.Rarity.U;
+        }
+        if (name.contains(Constants.Rarity.R) && !name.contains(Constants.Rarity.SR)) {
+            return Constants.Rarity.R;
+        }
+        if (name.contains(Constants.Rarity.SR) && !name.contains(Constants.Rarity.SSR)) {
+            return Constants.Rarity.SR;
+        }
+        if (name.contains(Constants.Rarity.SSR)) {
+            return Constants.Rarity.SSR;
+        }
+        if (name.contains(Constants.Rarity.UR)) {
+            return Constants.Rarity.UR;
+        }
+        return null;
+    }
+
+    public MetaRestResult<List<MetaBoatDTO>> queryBoats() {
+        List<Long> parkingBoatIds = metaSpatialWharfRepo.findParkingBoatIds(SecurityUtils.getAuthenticatedUser().getId());
+        List<Asset> assets = assetRepo.findAllBoats("僵尸动物园", Constants.META_NORMAL_STATUS, parkingBoatIds);
+        List<MetaBoatDTO> metaBoatDTOS = new ArrayList<>();
+        try {
+            assets.forEach(asset -> {
+                String rarityType = getRarityType(asset.getName());
+                if (StringUtils.isBlank(rarityType)) {
+                    throw new BusinessException("船只类型查询失败!");
+                }
+                metaBoatDTOS.add(new MetaBoatDTO(asset.getId(), asset.getPic().get(0).getUrl(), rarityType));
+            });
+        } catch (Exception e) {
+            return MetaRestResult.returnError(e.getMessage());
+        }
+        return MetaRestResult.returnSuccess(metaBoatDTOS);
+    }
+}

+ 16 - 0
src/main/java/com/izouma/nineth/utils/MathUtils.java

@@ -0,0 +1,16 @@
+package com.izouma.nineth.utils;
+
+
+public class MathUtils {
+
+    /**
+     * 返回范围内内随机数
+     *
+     * @param min 最小值
+     * @param max 最大值
+     * @return 随机数
+     */
+    public static int random(int min, int max) {
+        return (int) (min + Math.random() * (max - min + 1));
+    }
+}

+ 2 - 5
src/main/java/com/izouma/nineth/web/MetaAccessoriesController.java

@@ -5,7 +5,6 @@ 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;
@@ -26,8 +25,6 @@ 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) {
@@ -74,8 +71,8 @@ public class MetaAccessoriesController extends BaseController {
     }
 
     @PostMapping("/purchase")
-    public MetaRestResult<Integer> purchase(Long userId, Long metaAccessoriesId) {
-        return metaAccessoriesService.purchase(userId, metaAccessoriesId);
+    public MetaRestResult<Integer> purchase(@RequestParam Long userId, @RequestParam List<Long> metaAccessoriesIds) {
+        return metaAccessoriesService.purchase(userId, metaAccessoriesIds);
     }
 
     @GetMapping("/{userId}/hold")

+ 11 - 0
src/main/java/com/izouma/nineth/web/MetaSpatialInfoController.java

@@ -6,8 +6,10 @@ import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.MetaSpatialInfoRepo;
 import com.izouma.nineth.service.MetaSpatialInfoService;
+import com.izouma.nineth.utils.MathUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
@@ -72,5 +74,14 @@ public class MetaSpatialInfoController extends BaseController {
         }
         return MetaRestResult.returnSuccess(metaSpatialInfo);
     }
+
+    @GetMapping("/{userId}/{type}/random")
+    public MetaRestResult<MetaSpatialInfo> random(@PathVariable Long userId, @PathVariable int type) {
+        List<MetaSpatialInfo> metaSpatialInfos = metaSpatialInfoRepo.findByTypeAndUserIdNot(type, userId);
+        if (CollectionUtils.isEmpty(metaSpatialInfos)) {
+            return MetaRestResult.returnError("当前没有符合的空间");
+        }
+        return MetaRestResult.returnSuccess(metaSpatialInfos.get(MathUtils.random(0, metaSpatialInfos.size()-1)));
+    }
 }
 

+ 76 - 0
src/main/java/com/izouma/nineth/web/MetaSpatialWharfController.java

@@ -0,0 +1,76 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaSpatialWharf;
+import com.izouma.nineth.dto.MetaBoatDTO;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.repo.MetaSpatialWharfRepo;
+import com.izouma.nineth.service.MetaSpatialWharfService;
+import com.izouma.nineth.utils.SecurityUtils;
+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("/metaSpatialWharf")
+@AllArgsConstructor
+public class MetaSpatialWharfController extends BaseController {
+    private MetaSpatialWharfService metaSpatialWharfService;
+
+    private MetaSpatialWharfRepo metaSpatialWharfRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaSpatialWharf> all(@RequestBody PageQuery pageQuery) {
+        return metaSpatialWharfService.all(pageQuery);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaSpatialWharf> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @PostMapping("/park")
+    public MetaRestResult<MetaSpatialWharf> park(@RequestBody MetaSpatialWharf metaSpatialWharf) {
+        return metaSpatialWharfService.park(metaSpatialWharf);
+    }
+
+    @PostMapping("/back")
+    public MetaRestResult<Void> back(Long boatId) {
+        MetaSpatialWharf metaSpatialWharf = metaSpatialWharfRepo.findByBoatIdAndDel(boatId, false);
+        if (Objects.isNull(metaSpatialWharf)) {
+            return MetaRestResult.returnError("当前船只停靠信息为空!");
+        }
+        if (!metaSpatialWharf.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
+            return MetaRestResult.returnError("当前船只不属于你!");
+        }
+        metaSpatialWharfRepo.back(boatId);
+        return MetaRestResult.returnSuccess("收回船只成功!");
+    }
+
+    @GetMapping("/{boatId}/myself")
+    public MetaRestResult<Boolean> myself(@PathVariable Long boatId) {
+        MetaSpatialWharf metaSpatialWharf = metaSpatialWharfRepo.findByBoatIdAndDel(boatId, false);
+        if (Objects.isNull(metaSpatialWharf)) {
+            return MetaRestResult.returnError("当前船只停靠信息为空!");
+        }
+        if (metaSpatialWharf.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
+            return MetaRestResult.returnSuccess(Boolean.TRUE);
+        }
+        return MetaRestResult.returnSuccess(Boolean.FALSE);
+    }
+
+    @GetMapping("/queryBoats")
+    public MetaRestResult<List<MetaBoatDTO>> queryBoatsNotParking() {
+        return metaSpatialWharfService.queryBoats();
+    }
+}
+

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

@@ -0,0 +1 @@
+{"tableName":"MetaSpatialWharf","className":"MetaSpatialWharf","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":"isLandId","modelName":"isLandId","remark":"岛屿ID","showInList":true,"showInForm":true,"formType":"number"},{"name":"boatId","modelName":"boatId","remark":"船只ID","showInList":true,"showInForm":true,"formType":"number"},{"name":"boatImg","modelName":"boatImg","remark":"船只图片","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"boatType","modelName":"boatType","remark":"船只类型","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"U\",\"value\":\"U\"},{\"label\":\"R\",\"value\":\"R\"},{\"label\":\"SR\",\"value\":\"SR\"},{\"label\":\"SSR\",\"value\":\"SSR\"},{\"label\":\"UR\",\"value\":\"UR\"}]"},{"name":"boatPos","modelName":"boatPos","remark":"位置信息","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"boatRot","modelName":"boatRot","remark":"旋转值","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.nineth","tablePackage":"com.izouma.nineth.domain.MetaSpatialWharf"}

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

@@ -1435,7 +1435,15 @@ const router = new Router({
                     meta: {
                         title: '易拍邀请',
                     },
-                }
+                },
+                {
+                    path: '/metaSpatialWharfList',
+                    name: 'MetaSpatialWharfList',
+                    component: () => import(/* webpackChunkName: "metaSpatialWharfList" */ '@/views/MetaSpatialWharfList.vue'),
+                    meta: {
+                       title: '船只停靠列表',
+                    },
+               }
                 /**INSERT_LOCATION**/
             ]
         },

+ 175 - 175
src/main/vue/src/views/MetaAccessoriesEdit.vue

@@ -1,183 +1,183 @@
 <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>
+    <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 };
+    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 || '删除失败');
-					}
-				});
-		}
-	}
+            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>

+ 173 - 173
src/main/vue/src/views/MetaAccessoriesList.vue

@@ -1,63 +1,63 @@
 <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">
+    <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>
@@ -65,126 +65,126 @@
                     <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>
+            <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);
-					}
-				});
-		}
-	}
+    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, query: { del: false } }
+                })
+                .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>

+ 125 - 125
src/main/vue/src/views/MetaAdvertRecordEdit.vue

@@ -1,134 +1,134 @@
 <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="82px"
-					label-position="right"
-					size="small"
-					style="max-width: 500px"
-				>
-					<el-form-item prop="pic" label="图片">
-						<single-upload v-model="formData.pic"> </single-upload>
-					</el-form-item>
-					<el-form-item prop="link" label="地址">
-						<el-input v-model="formData.link"> </el-input>
-					</el-form-item>
-					<el-form-item prop="application" label="用途">
-						<el-input-number type="application" v-model="formData.application"> </el-input-number>
-					</el-form-item>
-					<el-form-item prop="publish" label="是否发布">
-						<el-switch v-model="formData.publish"> </el-switch>
-					</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>
+    <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="82px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px"
+                >
+                    <el-form-item prop="pic" label="图片">
+                        <single-upload v-model="formData.pic"> </single-upload>
+                    </el-form-item>
+                    <el-form-item prop="link" label="地址">
+                        <el-input v-model="formData.link"> </el-input>
+                    </el-form-item>
+                    <el-form-item prop="application" label="用途">
+                        <el-input-number type="application" v-model="formData.application"> </el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="publish" label="是否发布">
+                        <el-switch v-model="formData.publish"> </el-switch>
+                    </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: 'MetaAdvertRecordEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaAdvertRecord/get/' + this.$route.query.id)
-				.then(res => {
-					this.formData = res;
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-	},
-	data() {
-		return {
-			saving: false,
-			formData: {},
-			rules: {
-				pic: [
-					{
-						required: true,
-						message: '请输入图片',
-						trigger: 'blur'
-					}
-				],
-				link: [
-					{
-						required: true,
-						message: '请输入地址',
-						trigger: 'blur'
-					}
-				],
+    name: 'MetaAdvertRecordEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaAdvertRecord/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {
+                pic: [
+                    {
+                        required: true,
+                        message: '请输入图片',
+                        trigger: 'blur'
+                    }
+                ],
+                link: [
+                    {
+                        required: true,
+                        message: '请输入地址',
+                        trigger: 'blur'
+                    }
+                ],
                 application: [
-					{
-						required: true,
-						message: '请输入用途',
-						trigger: 'blur'
-					}
-				]
-			}
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
+                    {
+                        required: true,
+                        message: '请输入用途',
+                        trigger: 'blur'
+                    }
+                ]
+            }
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
 
-			this.saving = true;
-			this.$http
-				.post('/metaAdvertRecord/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(`/metaAdvertRecord/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 || '删除失败');
-					}
-				});
-		}
-	}
+            this.saving = true;
+            this.$http
+                .post('/metaAdvertRecord/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(`/metaAdvertRecord/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>

+ 156 - 156
src/main/vue/src/views/MetaAdvertRecordList.vue

@@ -1,167 +1,167 @@
 <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>
-		</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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="createdAt" label="时间"> </el-table-column>
-			<el-table-column prop="pic" label="图片">
-				<template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.pic"
-						fit="cover"
-						:preview-src-list="[row.pic]"
-					>
-					</el-image>
-				</template>
-			</el-table-column>
-			<el-table-column prop="link" label="链接地址"> </el-table-column>
+    <div class="list-view">
+        <page-title>
+            <el-button
+                @click="addRow"
+                type="primary"
+                icon="el-icon-plus"
+                :disabled="fetchingData || downloading"
+                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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="createdAt" label="时间"> </el-table-column>
+            <el-table-column prop="pic" label="图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.pic"
+                        fit="cover"
+                        :preview-src-list="[row.pic]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="link" label="链接地址"> </el-table-column>
             <el-table-column prop="application" label="用途"> </el-table-column>
-			<el-table-column prop="publish" label="是否发布">
-				<template slot-scope="{ row }">
-					<el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
-				</template>
-			</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">
-			<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>
+            <el-table-column prop="publish" label="是否发布">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
+                </template>
+            </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">
+            <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: 'MetaAdvertRecordList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaAdvertRecord/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaAdvertRecordEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaAdvertRecordEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaAdvertRecord/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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);
-				});
-		},
-		deleteRow(row) {
-			this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-				.then(() => {
-					return this.$http.post(`/metaAdvertRecord/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaAdvertRecordList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaAdvertRecord/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaAdvertRecordEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaAdvertRecordEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaAdvertRecord/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/metaAdvertRecord/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 89 - 88
src/main/vue/src/views/MetaBonusSceneList.vue

@@ -1,99 +1,100 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<el-button
-				@click="download"
-				icon="el-icon-upload2"
-				:loading="downloading"
-				:disabled="fetchingData"
-				class="filter-item"
-			>
-				导出
-			</el-button>
-		</page-title>
-		<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="userId" label="userId"> </el-table-column>
-			<el-table-column prop="num" label="触发彩蛋个数"> </el-table-column>
-			<el-table-column prop="createdAt" label="触发时间"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+    <div class="list-view">
+        <page-title>
+            <el-button
+                @click="download"
+                icon="el-icon-upload2"
+                :loading="downloading"
+                :disabled="fetchingData"
+                class="filter-item"
+            >
+                导出
+            </el-button>
+        </page-title>
+        <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="userId" label="userId"> </el-table-column>
+            <el-table-column prop="num" label="触发彩蛋个数"> </el-table-column>
+            <el-table-column prop="createdAt" label="触发时间"> </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaBonusSceneList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			url: '/metaBonusScene/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaBonusScene/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);
-				});
-		}
-	}
+    name: 'MetaBonusSceneList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            url: '/metaBonusScene/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaBonusScene/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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>
+
 </style>

+ 231 - 231
src/main/vue/src/views/MetaDestroyActivityEdit.vue

@@ -1,246 +1,246 @@
 <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="120px"
-                    label-position="right"
-                    size="small"
-                    style="max-width: 500px"
-                >
-                    <el-form-item prop="audit" label="是否需要审核">
-                        <el-radio-group v-model="formData.audit">
-                            <el-radio :label="true"> 人工审核 </el-radio>
-                            <el-radio :label="false"> 自动匹配 </el-radio>
-                        </el-radio-group>
-                    </el-form-item>
-                    <el-form-item prop="collectionName" label="藏品名称" v-if="formData.audit === true">
-                        <el-input v-model="formData.collectionName" :disabled="!canEdit" class="width"> </el-input>
-                    </el-form-item>
-                    <el-form-item prop="rule" label="匹配规则设置" v-if="formData.audit === false">
-                        <template v-if="formData.rule && formData.rule.and">
-                            <div v-for="(item, i) in formData.rule.and" class="rule-item">
-                                <el-select v-model="item.detail.tag" value-key="id" size="mini">
-                                    <el-option v-for="item in tags" :key="item.id" :value="item" :label="item.name">
-                                    </el-option>
-                                </el-select>
-                                <span style="padding: 0 10px; color: #606266; font-weight: bold"> ×&nbsp;1 </span>
-                                <i @click="delRule(i)" class="el-icon-delete icon-del"> </i>
-                            </div>
-                        </template>
-                        <el-button size="mini" @click="addRule"> 添加 </el-button>
-                    </el-form-item>
-                    <el-form-item prop="num" label="藏品数量">
-                        <el-input-number
-                            type="number"
-                            v-model="formData.num"
-                            :disabled="!canEdit"
-                            :step="1"
-                            :min="0"
-                            class="width1"
-                        >
-                        </el-input-number>
-                        <div class="tip">0表示不限</div>
-                    </el-form-item>
-                    <el-form-item prop="detail" label="详情" style="width: calc(100vw - 450px)">
-                        <el-input
-                            v-model="formData.detail"
-                            type="textarea"
-                            :autosize="{ minRows: 3, maxRows: 20 }"
-                            placeholder="请输入详情"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item prop="awardPic" label="奖励图片">
-                        <single-upload v-model="formData.awardPic"> </single-upload>
-                    </el-form-item>
-                    <el-form-item prop="application" label="用途">
-                        <el-input-number type="application" v-model="formData.application"> </el-input-number>
-                    </el-form-item>
-                    <el-form-item prop="publish" label="是否发布">
-                        <el-switch v-model="formData.publish"> </el-switch>
-                    </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>
+	<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="120px"
+					label-position="right"
+					size="small"
+					style="max-width: 500px"
+				>
+					<el-form-item prop="audit" label="是否需要审核">
+						<el-radio-group v-model="formData.audit">
+							<el-radio :label="true"> 人工审核 </el-radio>
+							<el-radio :label="false"> 自动匹配 </el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item prop="collectionName" label="藏品名称" v-if="formData.audit === true">
+						<el-input v-model="formData.collectionName" :disabled="!canEdit" class="width"> </el-input>
+					</el-form-item>
+					<el-form-item prop="rule" label="匹配规则设置" v-if="formData.audit === false">
+						<template v-if="formData.rule && formData.rule.and">
+							<div v-for="(item, i) in formData.rule.and" class="rule-item">
+								<el-select v-model="item.detail.tag" value-key="id" size="mini">
+									<el-option v-for="item in tags" :key="item.id" :value="item" :label="item.name">
+									</el-option>
+								</el-select>
+								<span style="padding: 0 10px; color: #606266; font-weight: bold"> ×&nbsp;1 </span>
+								<i @click="delRule(i)" class="el-icon-delete icon-del"> </i>
+							</div>
+						</template>
+						<el-button size="mini" @click="addRule"> 添加 </el-button>
+					</el-form-item>
+					<el-form-item prop="num" label="藏品数量">
+						<el-input-number
+							type="number"
+							v-model="formData.num"
+							:disabled="!canEdit"
+							:step="1"
+							:min="0"
+							class="width1"
+						>
+						</el-input-number>
+						<div class="tip">0表示不限</div>
+					</el-form-item>
+					<el-form-item prop="detail" label="详情" style="width: calc(100vw - 450px)">
+						<el-input
+							v-model="formData.detail"
+							type="textarea"
+							:autosize="{ minRows: 3, maxRows: 20 }"
+							placeholder="请输入详情"
+						>
+						</el-input>
+					</el-form-item>
+					<el-form-item prop="awardPic" label="奖励图片">
+						<single-upload v-model="formData.awardPic"> </single-upload>
+					</el-form-item>
+					<el-form-item prop="application" label="用途">
+						<el-input-number type="application" v-model="formData.application"> </el-input-number>
+					</el-form-item>
+					<el-form-item prop="publish" label="是否发布">
+						<el-switch v-model="formData.publish"> </el-switch>
+					</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: 'MetaDestroyActivityEdit',
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get('metaDestroyActivity/get/' + this.$route.query.id)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-        this.$http.post('/tag/all', { size: 10000 }, { body: 'json' }).then(res => {
-            this.tags = res.content;
-        });
-    },
-    data() {
-        return {
-            tags: [],
-            saving: false,
-            formData: {},
-            rules: {
-                detail: [
-                    {
-                        required: true,
-                        message: '请输入详情',
-                        trigger: 'blur'
-                    }
-                ],
-                application: [
-                    {
-                        required: true,
-                        message: '请输入用途',
-                        trigger: 'blur'
-                    }
-                ],
-                num: [
-                    {
-                        required: true,
-                        message: '请输入数量配置',
-                        trigger: 'blur'
-                    }
-                ],
-                audit: [
-                    {
-                        required: true,
-                        message: '请选择是否需要审核',
-                        trigger: 'blur'
-                    }
-                ],
-                rule: [
-                    { required: true, message: '请选择规则', trigger: 'blur' },
-                    {
-                        validator: (rule, value, callback) => {
-                            if (!this.formData.audit) {
-                                if (!this.formData.rule) {
-                                    callback(new Error('请填写规则'));
-                                } else if (!this.formData.rule.and) {
-                                    callback(new Error('请填写规则'));
-                                } else if (!this.formData.rule.and.length) {
-                                    callback(new Error('请填写规则'));
-                                } else {
-                                    for (let i = 0; i < this.formData.rule.and.length; i++) {
-                                        if (
-                                            !(this.formData.rule.and[i].detail && this.formData.rule.and[i].detail.tag)
-                                        ) {
-                                            callback(new Error('请选择'));
-                                            callback = null;
-                                            break;
-                                        }
-                                    }
-                                    if (callback) {
-                                        callback();
-                                    }
-                                }
-                            } else {
-                                callback();
-                            }
-                        }
-                    }
-                ]
-            }
-        };
-    },
-    computed: {
-        canEdit() {
-            return !!!this.$route.query.id;
-        }
-    },
-    methods: {
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit() {
-            let data = { ...this.formData };
+	name: 'MetaDestroyActivityEdit',
+	created() {
+		if (this.$route.query.id) {
+			this.$http
+				.get('metaDestroyActivity/get/' + this.$route.query.id)
+				.then(res => {
+					this.formData = res;
+				})
+				.catch(e => {
+					console.log(e);
+					this.$message.error(e.error);
+				});
+		}
+		this.$http.post('/tag/all', { size: 10000 }, { body: 'json' }).then(res => {
+			this.tags = res.content;
+		});
+	},
+	data() {
+		return {
+			tags: [],
+			saving: false,
+			formData: {},
+			rules: {
+				detail: [
+					{
+						required: true,
+						message: '请输入详情',
+						trigger: 'blur'
+					}
+				],
+				application: [
+					{
+						required: true,
+						message: '请输入用途',
+						trigger: 'blur'
+					}
+				],
+				num: [
+					{
+						required: true,
+						message: '请输入数量配置',
+						trigger: 'blur'
+					}
+				],
+				audit: [
+					{
+						required: true,
+						message: '请选择是否需要审核',
+						trigger: 'blur'
+					}
+				],
+				rule: [
+					{ required: true, message: '请选择规则', trigger: 'blur' },
+					{
+						validator: (rule, value, callback) => {
+							if (!this.formData.audit) {
+								if (!this.formData.rule) {
+									callback(new Error('请填写规则'));
+								} else if (!this.formData.rule.and) {
+									callback(new Error('请填写规则'));
+								} else if (!this.formData.rule.and.length) {
+									callback(new Error('请填写规则'));
+								} else {
+									for (let i = 0; i < this.formData.rule.and.length; i++) {
+										if (
+											!(this.formData.rule.and[i].detail && this.formData.rule.and[i].detail.tag)
+										) {
+											callback(new Error('请选择'));
+											callback = null;
+											break;
+										}
+									}
+									if (callback) {
+										callback();
+									}
+								}
+							} else {
+								callback();
+							}
+						}
+					}
+				]
+			}
+		};
+	},
+	computed: {
+		canEdit() {
+			return !!!this.$route.query.id;
+		}
+	},
+	methods: {
+		onSave() {
+			this.$refs.form.validate(valid => {
+				if (valid) {
+					this.submit();
+				} else {
+					return false;
+				}
+			});
+		},
+		submit() {
+			let data = { ...this.formData };
 
-            this.saving = true;
-            this.$http
-                .post('/metaDestroyActivity/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(`/metaDestroyActivity/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 || '删除失败');
-                    }
-                });
-        },
-        addRule() {
-            if (!(this.formData.rule && this.formData.rule.and)) {
-                this.$set(this.formData, 'rule', { and: [] });
-            }
-            this.formData.rule.and.push({ detail: { tag: null, num: 1 } });
-        },
-        delRule(i) {
-            this.formData.rule.and.splice(i, 1);
-        }
-    }
+			this.saving = true;
+			this.$http
+				.post('/metaDestroyActivity/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(`/metaDestroyActivity/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 || '删除失败');
+					}
+				});
+		},
+		addRule() {
+			if (!(this.formData.rule && this.formData.rule.and)) {
+				this.$set(this.formData, 'rule', { and: [] });
+			}
+			this.formData.rule.and.push({ detail: { tag: null, num: 1 } });
+		},
+		delRule(i) {
+			this.formData.rule.and.splice(i, 1);
+		}
+	}
 };
 </script>
 <style lang="less" scoped>
 .width1 {
-	width: 150px;
+    width: 150px;
 }
 
 .rule-item {
-	display: flex;
-	align-items: center;
-	margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
 
-	.icon-del {
-		color: #f56c6c;
-		cursor: pointer;
-		font-size: 18px;
-	}
+    .icon-del {
+        color: #f56c6c;
+        cursor: pointer;
+        font-size: 18px;
+    }
 }
 </style>

+ 188 - 188
src/main/vue/src/views/MetaDestroyActivityList.vue

@@ -1,93 +1,93 @@
 <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" label="ID" width="100"> </el-table-column>	
-			<el-table-column prop="detail" label="详情"> </el-table-column>
-			<el-table-column prop="awardPic" label="奖励图片">
-				<template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.awardPic"
-						fit="cover"
-						:preview-src-list="[row.awardPic]"
-					>
-					</el-image>
-				</template>
-			</el-table-column>
-			<el-table-column prop="audit" label="审核" width="80" align="center">
+    <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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="detail" label="详情"> </el-table-column>
+            <el-table-column prop="awardPic" label="奖励图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.awardPic"
+                        fit="cover"
+                        :preview-src-list="[row.awardPic]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="audit" label="审核" width="80" align="center">
+                <template v-slot="{ row }">
+                    <el-tag type="warning" v-if="row.audit"> 人工 </el-tag>
+                    <el-tag type="success" v-else> 自动 </el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="collectionName" label="藏品名称"> </el-table-column>
+            <el-table-column prop="rule" label="藏品规则">
                 <template v-slot="{ row }">
-                    <el-tag type="warning" v-if="row.audit">人工</el-tag>
-                    <el-tag type="success" v-else>自动</el-tag>
+                    <template v-if="row.rule">
+                        <div v-for="item in row.rule.tags" :key="item.id">
+                            {{ item.name }}
+                        </div>
+                    </template>
                 </template>
             </el-table-column>
-			<el-table-column prop="collectionName" label="藏品名称"> </el-table-column>
-			<el-table-column prop="rule" label="藏品规则">
-				<template v-slot="{ row }">
-					<template v-if="row.rule">
-						<div v-for="item in row.rule.tags" :key="item.id">
-							{{ item.name }}
-						</div>
-					</template>
-				</template>
-			</el-table-column>
-			<el-table-column prop="num" label="藏品数量" width="80" align="center"> </el-table-column>
+            <el-table-column prop="num" label="藏品数量" width="80" align="center"> </el-table-column>
             <el-table-column prop="application" label="用途"> </el-table-column>
-			<el-table-column prop="publish" label="是否发布">
-				<template slot-scope="{ row }">
-					<el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
-				</template>
-			</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-table-column prop="publish" label="是否发布">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
+                </template>
+            </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>
@@ -95,115 +95,115 @@
                     <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>
+            <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: 'MetaDestroyActivityList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaDestroyActivity/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaDestroyActivityEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaDestroyActivityEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaDestroyActivity/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaDestroyActivity/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaDestroyActivityList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaDestroyActivity/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaDestroyActivityEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaDestroyActivityEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaDestroyActivity/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaDestroyActivity/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 138 - 136
src/main/vue/src/views/MetaDestroyRecordList.vue

@@ -1,150 +1,152 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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="userId" align="center" label="userId"> </el-table-column>
-			<el-table-column prop="assetId" align="center" label="assetId"> </el-table-column>
-			<el-table-column prop="record" align="center" label="record"> </el-table-column>
-			<el-table-column prop="name" align="center" label="name" width="300"> </el-table-column>
-			<el-table-column prop="pic" align="center" label="pic">
+    <div class="list-view">
+        <page-title>
+            <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="userId" align="center" label="userId"> </el-table-column>
+            <el-table-column prop="assetId" align="center" label="assetId"> </el-table-column>
+            <el-table-column prop="record" align="center" label="record"> </el-table-column>
+            <el-table-column prop="name" align="center" label="name" width="300"> </el-table-column>
+            <el-table-column prop="pic" align="center" label="pic">
                 <template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.pic"
-						fit="cover"
-						:preview-src-list="[row.pic]"
-					>
-					</el-image>
-				</template> </el-table-column>
-			<el-table-column prop="type" align="center" label="type" :formatter="typeFormatter"> </el-table-column>
-            <el-table-column prop="source" align="center" label="source" :formatter="sourceFormatter"> </el-table-column>
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.pic"
+                        fit="cover"
+                        :preview-src-list="[row.pic]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="type" align="center" label="type" :formatter="typeFormatter"> </el-table-column>
+            <el-table-column prop="source" align="center" label="source" :formatter="sourceFormatter">
+            </el-table-column>
             <el-table-column prop="remark" align="center" label="remark" width="300"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaDestroyRecordList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/destroyRecord/all',
-			downloading: false,
-			typeOptions: [
-				{ label: 'OBTAIN', value: 'OBTAIN' },
-				{ label: 'CONSUME', value: 'CONSUME' }
-			],
+    name: 'MetaDestroyRecordList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/destroyRecord/all',
+            downloading: false,
+            typeOptions: [
+                { label: 'OBTAIN', value: 'OBTAIN' },
+                { label: 'CONSUME', value: 'CONSUME' }
+            ],
             sourceOptions: [
-				{ label: '元宇宙', value: 'META' },
-				{ label: '绿洲', value: 'RAEX' }
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		typeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.typeOptions.find(i => i.value === cellValue);
-			if (selectedOption) {
-				return selectedOption.label;
-			}
-			return '';
-		},
+                { label: '元宇宙', value: 'META' },
+                { label: '绿洲', value: 'RAEX' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
         sourceFormatter(row, column, cellValue, index) {
-			let selectedOption = this.sourceOptions.find(i => i.value === cellValue);
-			if (selectedOption) {
-				return selectedOption.label;
-			}
-			return '';
-		},
-		beforeGetData() {
-			return { search: this.search, query: { del: false, source: 'META' } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/destroyRecord/excel', {
-					responseType: 'blob',
-					params: { size: 10000, query: { del: false, source: 'META' } }
-				})
-				.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);
-				});
-		}
-	}
+            let selectedOption = this.sourceOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search, query: { del: false, source: 'META' } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/destroyRecord/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false, source: 'META' } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 102 - 102
src/main/vue/src/views/MetaGameBoxPointsList.vue

@@ -1,112 +1,112 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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="userId" align="center" label="用户ID"> </el-table-column>
-			<el-table-column prop="score" align="center" label="当前最高积分"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+    <div class="list-view">
+        <page-title>
+            <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="userId" align="center" label="用户ID"> </el-table-column>
+            <el-table-column prop="score" align="center" label="当前最高积分"> </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaGameBoxPointsList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaGameBoxPoints/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false }, sort:'score,desc' };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaGameBoxPoints/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);
-				});
-		}
-	}
+    name: 'MetaGameBoxPointsList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaGameBoxPoints/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false }, sort: 'score,desc' };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaGameBoxPoints/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 487 - 471
src/main/vue/src/views/MetaGameCopyEdit.vue

@@ -1,486 +1,502 @@
 <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="108px"
-					label-position="right"
-					size="small"
-					style="max-width: 500px"
-				>
-					<el-form-item prop="gameName" label="游戏">
-						<el-select v-model="formData.gameName" clearable filterable placeholder="请选择">
-							<el-option
-								v-for="item in gameNameOptions"
-								:key="item.value"
-								:label="item.label"
-								:value="item.value"
-							>
-							</el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item prop="gameCopyType" label="副本">
-						<el-select v-model="formData.gameCopyType" clearable filterable placeholder="请选择">
-							<el-option
-								v-for="item in gameCopyTypeOptions"
-								:key="item.value"
-								:label="item.label"
-								:value="item.value"
-							>
-							</el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item label="金币入场配置">
-						<el-checkbox v-model="gold" @change="goldChange"> </el-checkbox>
-					</el-form-item>
-					<el-form-item prop="goldNum" label="所需金币数量" v-if="gold">
-						<el-input-number type="goldNum" v-model="formData.goldNum" :step="1" :min="1">
-						</el-input-number>
-						<div class="tip">输入规则:正整数,最小为1</div>
-					</el-form-item>
-					<el-form-item label="NFT入场配置">
-						<el-checkbox v-model="nft" @change="nftChange"> </el-checkbox>
-					</el-form-item>
-					<el-form-item prop="audit" label="是否需要审核" v-if="nft">
-						<el-radio-group v-model="formData.audit">
-							<el-radio :label="true"> 人工审核 </el-radio>
-							<el-radio :label="false"> 自动匹配 </el-radio>
-						</el-radio-group>
-					</el-form-item>
-					<el-form-item prop="collectionName" label="藏品名称" v-if="nft && formData.audit === true">
-						<el-input v-model="formData.collectionName" :disabled="!canEdit" class="width"> </el-input>
-					</el-form-item>
-					<el-form-item prop="rule" label="匹配规则设置" v-if="nft && formData.audit === false">
-						<template v-if="formData.rule && formData.rule.and">
-							<div v-for="(item, i) in formData.rule.and" class="rule-item">
-								<el-select v-model="item.detail.tag" value-key="id" size="mini">
-									<el-option v-for="item in tags" :key="item.id" :value="item" :label="item.name">
-									</el-option>
-								</el-select>
-								<span style="padding: 0 10px; color: #606266; font-weight: bold"> ×&nbsp;1 </span>
-								<i @click="delRule(i)" class="el-icon-delete icon-del"> </i>
-							</div>
-						</template>
-						<el-button size="mini" @click="addRule"> 添加 </el-button>
-					</el-form-item>
-					<el-form-item prop="num" label="所需nft数量" v-if="nft">
-						<el-input-number
-							type="number"
-							v-model="formData.num"
-							:disabled="!canEdit"
-							:step="1"
-							:min="0"
-							class="width1"
-						>
-						</el-input-number>
-						<div class="tip">0表示不限</div>
-					</el-form-item>
-					<el-form-item prop="detail" label="规则详情" style="width: calc(100vw - 450px)">
-						<el-input
-							v-model="formData.detail"
-							type="textarea"
-							:autosize="{ minRows: 3, maxRows: 20 }"
-							placeholder="请输入规则详情"
-						>
-						</el-input>
-					</el-form-item>
-					<el-form-item label="僵尸配置" prop="metaZombieIds">
-						<el-select v-model="formData.metaZombieIds" multiple placeholder="请选择" style="width: 100%">
-							<el-option v-for="item in metaZombie" :key="item.id" :label="item.name" :value="item.id">
-							</el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item prop="metaGameAwards" label="奖励配置" style="width: calc(100vw - 450px)" size="mini">
-						<el-table :data="formData.metaGameAwards">
-							<el-table-column prop="name" label="奖励名称">
-								<template v-slot="{ row }">
-									<el-input v-model="row.name" style="width: 250px" placeholder="请输入奖励名称">
-									</el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="awardType" label="奖励类型">
-								<template v-slot="{ row }">
-									<el-select
-										v-model="row.awardType"
-										clearable
-										filterable
-										placeholder="请选择"
-										@change="changeAwardType(row)"
-									>
-										<el-option
-											v-for="item in entryModeTypeOptions"
-											:key="item.value"
-											:label="item.label"
-											:value="item.value"
-										>
-										</el-option>
-									</el-select>
-								</template>
-							</el-table-column>
-							<el-table-column prop="config" label="配置值(金币-数量/NFT-NFT图片)">
-								<template v-slot="{ row }">
-									<template v-if="row && row.awardType === 'GOLD'">
-										<el-input-number v-model="row.config" :step="1" :min="1"> </el-input-number>
-										<div class="tip">输入规则:正整数,最小为1</div>
-									</template>
-									<template v-if="row && row.awardType === 'NFT'">
-										<single-upload v-model="row.config"> </single-upload>
-									</template>
-								</template>
-							</el-table-column>
-							<el-table-column prop="probability" label="概率(%)">
-								<template v-slot="{ row }">
-									<el-input-number v-model="row.probability" :step="1" :min="1" :max="100">
-									</el-input-number>
-									<div class="tip">输入规则:正整数,最小为1,最大为100</div>
-								</template>
-							</el-table-column>
-							<el-table-column width="80" align="center">
-								<template v-slot="{ row, $index }">
-									<el-button type="danger" plain size="mini" @click="delAward($index)">
-										删除
-									</el-button>
-								</template>
-							</el-table-column>
-						</el-table>
-					</el-form-item>
-					<el-form-item>
-						<el-button size="mini" @click="addAward"> 添加配置 </el-button>
-					</el-form-item>
-					<el-form-item prop="publish" label="是否发布">
-						<el-switch v-model="formData.publish"> </el-switch>
-					</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>
+    <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="108px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px"
+                >
+                    <el-form-item prop="gameName" label="游戏">
+                        <el-select
+                            v-model="formData.gameName"
+                            clearable
+                            filterable
+                            placeholder="请选择"
+                            @change="changeGameName()"
+                        >
+                            <el-option
+                                v-for="item in gameNameOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="gameCopyType" label="副本">
+                        <el-select v-model="formData.gameCopyType" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in gameCopyTypeOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="金币入场配置">
+                        <el-checkbox v-model="gold" @change="goldChange"> </el-checkbox>
+                    </el-form-item>
+                    <el-form-item prop="goldNum" label="所需金币数量" v-if="gold">
+                        <el-input-number type="goldNum" v-model="formData.goldNum" :step="1" :min="1">
+                        </el-input-number>
+                        <div class="tip">输入规则:正整数,最小为1</div>
+                    </el-form-item>
+                    <el-form-item label="NFT入场配置">
+                        <el-checkbox v-model="nft" @change="nftChange"> </el-checkbox>
+                    </el-form-item>
+                    <el-form-item prop="audit" label="是否需要审核" v-if="nft">
+                        <el-radio-group v-model="formData.audit">
+                            <el-radio :label="true"> 人工审核 </el-radio>
+                            <el-radio :label="false"> 自动匹配 </el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item prop="collectionName" label="藏品名称" v-if="nft && formData.audit === true">
+                        <el-input v-model="formData.collectionName" :disabled="!canEdit" class="width"> </el-input>
+                    </el-form-item>
+                    <el-form-item prop="rule" label="匹配规则设置" v-if="nft && formData.audit === false">
+                        <template v-if="formData.rule && formData.rule.and">
+                            <div v-for="(item, i) in formData.rule.and" class="rule-item">
+                                <el-select v-model="item.detail.tag" value-key="id" size="mini">
+                                    <el-option v-for="item in tags" :key="item.id" :value="item" :label="item.name">
+                                    </el-option>
+                                </el-select>
+                                <span style="padding: 0 10px; color: #606266; font-weight: bold"> ×&nbsp;1 </span>
+                                <i @click="delRule(i)" class="el-icon-delete icon-del"> </i>
+                            </div>
+                        </template>
+                        <el-button size="mini" @click="addRule"> 添加 </el-button>
+                    </el-form-item>
+                    <el-form-item prop="num" label="所需nft数量" v-if="nft">
+                        <el-input-number
+                            type="number"
+                            v-model="formData.num"
+                            :disabled="!canEdit"
+                            :step="1"
+                            :min="0"
+                            class="width1"
+                        >
+                        </el-input-number>
+                        <div class="tip">0表示不限</div>
+                    </el-form-item>
+                    <el-form-item prop="detail" label="规则详情" style="width: calc(100vw - 450px)">
+                        <el-input
+                            v-model="formData.detail"
+                            type="textarea"
+                            :autosize="{ minRows: 3, maxRows: 20 }"
+                            placeholder="请输入规则详情"
+                        >
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item
+                        label="僵尸配置"
+                        prop="metaZombieIds"
+                        v-if="formData.gameName && formData.gameName == 'ZOMBIE'"
+                    >
+                        <el-select v-model="formData.metaZombieIds" multiple placeholder="请选择" style="width: 100%">
+                            <el-option v-for="item in metaZombie" :key="item.id" :label="item.name" :value="item.id">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="metaGameAwards" label="奖励配置" style="width: calc(100vw - 450px)" size="mini">
+                        <el-table :data="formData.metaGameAwards">
+                            <el-table-column prop="name" label="奖励名称">
+                                <template v-slot="{ row }">
+                                    <el-input v-model="row.name" style="width: 250px" placeholder="请输入奖励名称">
+                                    </el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="awardType" label="奖励类型">
+                                <template v-slot="{ row }">
+                                    <el-select
+                                        v-model="row.awardType"
+                                        clearable
+                                        filterable
+                                        placeholder="请选择"
+                                        @change="changeAwardType(row)"
+                                    >
+                                        <el-option
+                                            v-for="item in entryModeTypeOptions"
+                                            :key="item.value"
+                                            :label="item.label"
+                                            :value="item.value"
+                                        >
+                                        </el-option>
+                                    </el-select>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="config" label="配置值(金币-数量/NFT-NFT图片)">
+                                <template v-slot="{ row }">
+                                    <template v-if="row && row.awardType === 'GOLD'">
+                                        <el-input-number v-model="row.config" :step="1" :min="1"> </el-input-number>
+                                        <div class="tip">输入规则:正整数,最小为1</div>
+                                    </template>
+                                    <template v-if="row && row.awardType === 'NFT'">
+                                        <single-upload v-model="row.config"> </single-upload>
+                                    </template>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="probability" label="概率(%)">
+                                <template v-slot="{ row }">
+                                    <el-input-number v-model="row.probability" :step="1" :min="1" :max="100">
+                                    </el-input-number>
+                                    <div class="tip">输入规则:正整数,最小为1,最大为100</div>
+                                </template>
+                            </el-table-column>
+                            <el-table-column width="80" align="center">
+                                <template v-slot="{ row, $index }">
+                                    <el-button type="danger" plain size="mini" @click="delAward($index)">
+                                        删除
+                                    </el-button>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button size="mini" @click="addAward"> 添加配置 </el-button>
+                    </el-form-item>
+                    <el-form-item prop="publish" label="是否发布">
+                        <el-switch v-model="formData.publish"> </el-switch>
+                    </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: 'MetaGameCopyEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaGameCopy/get/' + this.$route.query.id)
-				.then(res => {
-					res.metaGameAwards = res.metaGameAwards || [];
-					this.formData = res;
-					if (res.entryModeType === 'GOLD') {
-						this.gold = true;
-						this.nft = false;
-					} else if (res.entryModeType === 'NFT') {
-						this.gold = false;
-						this.nft = true;
-					} else if (res.entryModeType === 'GOLD_OR_NFT') {
-						this.gold = true;
-						this.nft = true;
-					}
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-		this.$http.post('/tag/all', { size: 10000 }, { body: 'json' }).then(res => {
-			this.tags = res.content;
-		});
-		this.$http.get('/metaZombie/findAll').then(res => {
-			this.metaZombie = res;
-		});
-	},
-	data() {
-		return {
-			nft: false,
-			gold: false,
-			reg: /^[1-9]\d*$/,
-			awardType: [],
-			metaZombie: [],
-			tags: [],
-			saving: false,
-			formData: {
-				metaGameAwards: []
-			},
-			rules: {
-				detail: [
-					{
-						required: true,
-						message: '请输入规则详情',
-						trigger: 'blur'
-					}
-				],
-				gameName: [
-					{
-						required: true,
-						message: '请选择游戏',
-						trigger: 'blur'
-					}
-				],
-				gameCopyType: [
-					{
-						required: true,
-						message: '请选择副本',
-						trigger: 'blur'
-					}
-				],
-				goldNum: [
-					{
-						required: true,
-						message: '请输入所需金币数量',
-						trigger: 'blur'
-					},
-					{
-						validator: (rule, value, callback) => {
-							if (!this.reg.test(value)) {
-								callback(new Error('所需金币数量必须为大于1的整数'));
-								return;
-							} else {
-								callback();
-							}
-						}
-					}
-				],
-				rule: [
-					{ required: true, message: '请选择规则', trigger: 'blur' },
-					{
-						validator: (rule, value, callback) => {
-							if (!this.formData.audit) {
-								if (!this.formData.rule) {
-									callback(new Error('请填写规则'));
-								} else if (!this.formData.rule.and) {
-									callback(new Error('请填写规则'));
-								} else if (!this.formData.rule.and.length) {
-									callback(new Error('请填写规则'));
-								} else {
-									for (let i = 0; i < this.formData.rule.and.length; i++) {
-										if (
-											!(this.formData.rule.and[i].detail && this.formData.rule.and[i].detail.tag)
-										) {
-											callback(new Error('请选择'));
-											callback = null;
-											break;
-										}
-									}
-									if (callback) {
-										callback();
-									}
-								}
-							} else {
-								callback();
-							}
-						}
-					}
-				],
-				metaGameAwards: [
-					{
-						validator: (rule, value, callback) => {
-							if (value) {
-								if (!(value instanceof Array)) {
-									callback(new Error('metaGameAwards must be array!'));
-									return;
-								} else {
-									for (let i = 0; i < value.length; i++) {
-										if (
-											value[i].name === '' ||
-											value[i].name === undefined ||
-											value[i].name === null
-										) {
-											callback(new Error('请填写奖励名称'));
-											return;
-										}
-										if (
-											value[i].awardType === '' ||
-											value[i].awardType === undefined ||
-											value[i].awardType === null
-										) {
-											callback(new Error('请选择奖励类型'));
-											return;
-										}
-										if (
-											value[i].config === '' ||
-											value[i].config === undefined ||
-											value[i].config === null
-										) {
-											callback(new Error('请填写奖励配置'));
-											return;
-										}
-										if (value[i].awardType === 'GOLD' && !this.reg.test(value[i].config)) {
-											callback(new Error('奖励金币数量必须为大于1的整数'));
-											return;
-										}
-										if (
-											value[i].probability === '' ||
-											value[i].probability === undefined ||
-											value[i].probability === null
-										) {
-											callback(new Error('请填写奖励概率'));
-											return;
-										}
-										if (!this.reg.test(value[i].probability)) {
-											callback(new Error('奖励概率必须为大于1的整数'));
-											return;
-										}
-									}
-								}
-							}
-							callback();
-						},
-						trigger: 'blur'
-					}
-				],
-				audit: [
-					{
-						required: true,
-						message: '请选择是否审核',
-						trigger: 'blur'
-					}
-				],
-				collectionName: [
-					{
-						required: true,
-						message: '请输入藏品名称',
-						trigger: 'blur'
-					}
-				],
-				num: [
-					{
-						required: true,
-						message: '请输入所需nft数量',
-						trigger: 'blur'
-					}
-				]
-			},
-			gameNameOptions: [{ label: '僵尸', value: 'ZOMBIE' },{ label: '钓鱼', value: 'FISHING' }],
-			gameCopyTypeOptions: [
-				{ label: '青铜', value: 'BRONZE' },
-				{ label: '白银', value: 'SILVER' },
-				{ label: '黄金', value: 'GOLD' }
-			],
-			entryModeTypeOptions: [
-				{ label: 'NFT', value: 'NFT' },
-				{ label: '金币', value: 'GOLD' }
-			]
-		};
-	},
-	computed: {
-		canEdit() {
-			return !!!this.$route.query.id;
-		}
-	},
-	methods: {
-		goldChange() {
-			this.$delete(this.formData, 'goldNum');
-		},
-		nftChange() {
-			this.$delete(this.formData, 'audit');
-			this.$delete(this.formData, 'collectionName');
-			this.$delete(this.formData, 'rule');
-			this.$delete(this.formData, 'num');
-		},
-		changeAwardType(row) {
-			row.config = '';
-		},
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
-			if (this.gold && !this.nft) {
-				data.entryModeType = 'GOLD';
-			} else if (!this.gold && this.nft) {
-				data.entryModeType = 'NFT';
-			} else if (this.gold && this.nft) {
-				data.entryModeType = 'GOLD_OR_NFT';
-			} else if (!this.gold && !this.nft) {
-				this.$message.error('请最少配置一个入场方式');
+    name: 'MetaGameCopyEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaGameCopy/get/' + this.$route.query.id)
+                .then(res => {
+                    res.metaGameAwards = res.metaGameAwards || [];
+                    this.formData = res;
+                    if (res.entryModeType === 'GOLD') {
+                        this.gold = true;
+                        this.nft = false;
+                    } else if (res.entryModeType === 'NFT') {
+                        this.gold = false;
+                        this.nft = true;
+                    } else if (res.entryModeType === 'GOLD_OR_NFT') {
+                        this.gold = true;
+                        this.nft = true;
+                    }
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        this.$http.post('/tag/all', { size: 10000 }, { body: 'json' }).then(res => {
+            this.tags = res.content;
+        });
+        this.$http.get('/metaZombie/findAll').then(res => {
+            this.metaZombie = res;
+        });
+    },
+    data() {
+        return {
+            nft: false,
+            gold: false,
+            reg: /^[1-9]\d*$/,
+            awardType: [],
+            metaZombie: [],
+            tags: [],
+            saving: false,
+            formData: {
+                metaGameAwards: []
+            },
+            rules: {
+                detail: [
+                    {
+                        required: true,
+                        message: '请输入规则详情',
+                        trigger: 'blur'
+                    }
+                ],
+                gameName: [
+                    {
+                        required: true,
+                        message: '请选择游戏',
+                        trigger: 'blur'
+                    }
+                ],
+                gameCopyType: [
+                    {
+                        required: true,
+                        message: '请选择副本',
+                        trigger: 'blur'
+                    }
+                ],
+                goldNum: [
+                    {
+                        required: true,
+                        message: '请输入所需金币数量',
+                        trigger: 'blur'
+                    },
+                    {
+                        validator: (rule, value, callback) => {
+                            if (!this.reg.test(value)) {
+                                callback(new Error('所需金币数量必须为大于1的整数'));
+                                return;
+                            } else {
+                                callback();
+                            }
+                        }
+                    }
+                ],
+                rule: [
+                    { required: true, message: '请选择规则', trigger: 'blur' },
+                    {
+                        validator: (rule, value, callback) => {
+                            if (!this.formData.audit) {
+                                if (!this.formData.rule) {
+                                    callback(new Error('请填写规则'));
+                                } else if (!this.formData.rule.and) {
+                                    callback(new Error('请填写规则'));
+                                } else if (!this.formData.rule.and.length) {
+                                    callback(new Error('请填写规则'));
+                                } else {
+                                    for (let i = 0; i < this.formData.rule.and.length; i++) {
+                                        if (
+                                            !(this.formData.rule.and[i].detail && this.formData.rule.and[i].detail.tag)
+                                        ) {
+                                            callback(new Error('请选择'));
+                                            callback = null;
+                                            break;
+                                        }
+                                    }
+                                    if (callback) {
+                                        callback();
+                                    }
+                                }
+                            } else {
+                                callback();
+                            }
+                        }
+                    }
+                ],
+                metaGameAwards: [
+                    {
+                        validator: (rule, value, callback) => {
+                            if (value) {
+                                if (!(value instanceof Array)) {
+                                    callback(new Error('metaGameAwards must be array!'));
+                                    return;
+                                } else {
+                                    for (let i = 0; i < value.length; i++) {
+                                        if (
+                                            value[i].name === '' ||
+                                            value[i].name === undefined ||
+                                            value[i].name === null
+                                        ) {
+                                            callback(new Error('请填写奖励名称'));
+                                            return;
+                                        }
+                                        if (
+                                            value[i].awardType === '' ||
+                                            value[i].awardType === undefined ||
+                                            value[i].awardType === null
+                                        ) {
+                                            callback(new Error('请选择奖励类型'));
+                                            return;
+                                        }
+                                        if (
+                                            value[i].config === '' ||
+                                            value[i].config === undefined ||
+                                            value[i].config === null
+                                        ) {
+                                            callback(new Error('请填写奖励配置'));
+                                            return;
+                                        }
+                                        if (value[i].awardType === 'GOLD' && !this.reg.test(value[i].config)) {
+                                            callback(new Error('奖励金币数量必须为大于1的整数'));
+                                            return;
+                                        }
+                                        if (
+                                            value[i].probability === '' ||
+                                            value[i].probability === undefined ||
+                                            value[i].probability === null
+                                        ) {
+                                            callback(new Error('请填写奖励概率'));
+                                            return;
+                                        }
+                                        if (!this.reg.test(value[i].probability)) {
+                                            callback(new Error('奖励概率必须为大于1的整数'));
+                                            return;
+                                        }
+                                    }
+                                }
+                            }
+                            callback();
+                        },
+                        trigger: 'blur'
+                    }
+                ],
+                audit: [
+                    {
+                        required: true,
+                        message: '请选择是否审核',
+                        trigger: 'blur'
+                    }
+                ],
+                collectionName: [
+                    {
+                        required: true,
+                        message: '请输入藏品名称',
+                        trigger: 'blur'
+                    }
+                ],
+                num: [
+                    {
+                        required: true,
+                        message: '请输入所需nft数量',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            gameNameOptions: [
+                { label: '僵尸', value: 'ZOMBIE' },
+                { label: '钓鱼', value: 'FISHING' }
+            ],
+            gameCopyTypeOptions: [
+                { label: '青铜', value: 'BRONZE' },
+                { label: '白银', value: 'SILVER' },
+                { label: '黄金', value: 'GOLD' }
+            ],
+            entryModeTypeOptions: [
+                { label: 'NFT', value: 'NFT' },
+                { label: '金币', value: 'GOLD' }
+            ]
+        };
+    },
+    computed: {
+        canEdit() {
+            return !!!this.$route.query.id;
+        }
+    },
+    methods: {
+        changeGameName() {
+            this.$delete(this.formData, 'metaZombieIds');
+        },
+        goldChange() {
+            this.$delete(this.formData, 'goldNum');
+        },
+        nftChange() {
+            this.$delete(this.formData, 'audit');
+            this.$delete(this.formData, 'collectionName');
+            this.$delete(this.formData, 'rule');
+            this.$delete(this.formData, 'num');
+        },
+        changeAwardType(row) {
+            row.config = '';
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            if (this.gold && !this.nft) {
+                data.entryModeType = 'GOLD';
+            } else if (!this.gold && this.nft) {
+                data.entryModeType = 'NFT';
+            } else if (this.gold && this.nft) {
+                data.entryModeType = 'GOLD_OR_NFT';
+            } else if (!this.gold && !this.nft) {
+                this.$message.error('请最少配置一个入场方式');
                 return;
-			}
-			this.saving = true;
-			this.$http
-				.post('/metaGameCopy/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(`/metaGameCopy/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 || '删除失败');
-					}
-				});
-		},
-		addRule() {
-			if (!(this.formData.rule && this.formData.rule.and)) {
-				this.$set(this.formData, 'rule', { and: [] });
-			}
-			this.formData.rule.and.push({ detail: { tag: null, num: 1 } });
-		},
-		delRule(i) {
-			this.formData.rule.and.splice(i, 1);
-		},
-		addAward() {
-			this.formData.metaGameAwards.push({
-				awardType: '',
-				config: '',
-				probability: ''
-			});
-		},
-		delAward(i) {
-			this.formData.metaGameAwards.splice(i, 1);
-		}
-	}
+            }
+            this.saving = true;
+            this.$http
+                .post('/metaGameCopy/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(`/metaGameCopy/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 || '删除失败');
+                    }
+                });
+        },
+        addRule() {
+            if (!(this.formData.rule && this.formData.rule.and)) {
+                this.$set(this.formData, 'rule', { and: [] });
+            }
+            this.formData.rule.and.push({ detail: { tag: null, num: 1 } });
+        },
+        delRule(i) {
+            this.formData.rule.and.splice(i, 1);
+        },
+        addAward() {
+            this.formData.metaGameAwards.push({
+                awardType: '',
+                config: '',
+                probability: ''
+            });
+        },
+        delAward(i) {
+            this.formData.metaGameAwards.splice(i, 1);
+        }
+    }
 };
 </script>
 <style lang="less" scoped>
 .width1 {
-    width: 150px;
+	width: 150px;
 }
 
 .rule-item {
-    display: flex;
-    align-items: center;
-    margin-bottom: 10px;
+	display: flex;
+	align-items: center;
+	margin-bottom: 10px;
 
-    .icon-del {
-        color: #f56c6c;
-        cursor: pointer;
-        font-size: 18px;
-    }
+	.icon-del {
+		color: #f56c6c;
+		cursor: pointer;
+		font-size: 18px;
+	}
 }
 </style>

+ 221 - 219
src/main/vue/src/views/MetaGameCopyList.vue

@@ -1,231 +1,233 @@
 <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="gameName" align="center" label="名称" :formatter="gameNameFormatter"> </el-table-column>
-			<el-table-column prop="gameCopyType" align="center" label="副本" :formatter="gameCopyTypeFormatter"> </el-table-column>
-			<el-table-column prop="entryModeType" align="center" label="入场方式" :formatter="entryModeTypeFormatter">
-			</el-table-column>
-			<el-table-column prop="goldNum" align="center" label="所需金币数量"> </el-table-column>
-			<el-table-column prop="rule" label="藏品规则">
-				<template v-slot="{ row }">
-					<template v-if="row.rule">
-						<div v-for="item in row.rule.tags" :key="item.id">
-							{{ item.name }}
-						</div>
-					</template>
-				</template>
-			</el-table-column>
-			<el-table-column prop="audit" label="审核" width="80" align="center">
-				<template v-slot="{ row }">
-					<template v-if="row.entryModeType === 'NFT'">
-						<el-tag type="warning" v-if="row.audit"> 人工 </el-tag>
-						<el-tag type="success" v-else> 自动 </el-tag>
-					</template>
-				</template>
-			</el-table-column>
-			<el-table-column prop="collectionName" align="center" label="藏品名称"> </el-table-column>
-			<el-table-column prop="num" align="center" label="所需nft数量"> </el-table-column>
+    <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="gameName" align="center" label="名称" :formatter="gameNameFormatter">
+            </el-table-column>
+            <el-table-column prop="gameCopyType" align="center" label="副本" :formatter="gameCopyTypeFormatter">
+            </el-table-column>
+            <el-table-column prop="entryModeType" align="center" label="入场方式" :formatter="entryModeTypeFormatter">
+            </el-table-column>
+            <el-table-column prop="goldNum" align="center" label="所需金币数量"> </el-table-column>
+            <el-table-column prop="rule" label="藏品规则">
+                <template v-slot="{ row }">
+                    <template v-if="row.rule">
+                        <div v-for="item in row.rule.tags" :key="item.id">
+                            {{ item.name }}
+                        </div>
+                    </template>
+                </template>
+            </el-table-column>
+            <el-table-column prop="audit" label="审核" width="80" align="center">
+                <template v-slot="{ row }">
+                    <template v-if="row.entryModeType === 'NFT'">
+                        <el-tag type="warning" v-if="row.audit"> 人工 </el-tag>
+                        <el-tag type="success" v-else> 自动 </el-tag>
+                    </template>
+                </template>
+            </el-table-column>
+            <el-table-column prop="collectionName" align="center" label="藏品名称"> </el-table-column>
+            <el-table-column prop="num" align="center" label="所需nft数量"> </el-table-column>
             <el-table-column prop="detail" align="center" label="规则详情"> </el-table-column>
             <el-table-column prop="publish" align="center" label="是否发布">
-				<template slot-scope="{ row }">
-					<el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
-				</template>
-			</el-table-column>
-			<el-table-column label="操作" align="center" fixed="right" width="350">
-				<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">
-			<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 slot-scope="{ row }">
+                    <el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" width="350">
+                <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">
+            <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: 'MetaGameCopyList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaGameCopy/all',
-			downloading: false,
-			gameNameOptions: [
-				{ label: '僵尸游戏', value: 'ZOMBIE' },
-				{ label: '钓鱼游戏', value: 'FISHING' }
-			],
-			gameCopyTypeOptions: [
-				{ label: '青铜', value: 'BRONZE' },
-				{ label: '白银', value: 'SILVER' },
-				{ label: '黄金', value: 'GOLD' }
-			],
-			entryModeTypeOptions: [
-				{ label: 'NFT', value: 'NFT' },
-				{ label: '金币', value: 'GOLD' },
-				{ label: '金币或NFT', value: 'GOLD_OR_NFT' },
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		gameNameFormatter(row, column, cellValue, index) {
-			let selectedOption = this.gameNameOptions.find(i => i.value === cellValue);
-			if (selectedOption) {
-				return selectedOption.label;
-			}
-			return '';
-		},
-		gameCopyTypeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.gameCopyTypeOptions.find(i => i.value === cellValue);
-			if (selectedOption) {
-				return selectedOption.label;
-			}
-			return '';
-		},
-		entryModeTypeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.entryModeTypeOptions.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: '/metaGameCopyEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaGameCopyEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaGameCopy/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaGameCopy/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaGameCopyList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaGameCopy/all',
+            downloading: false,
+            gameNameOptions: [
+                { label: '僵尸游戏', value: 'ZOMBIE' },
+                { label: '钓鱼游戏', value: 'FISHING' }
+            ],
+            gameCopyTypeOptions: [
+                { label: '青铜', value: 'BRONZE' },
+                { label: '白银', value: 'SILVER' },
+                { label: '黄金', value: 'GOLD' }
+            ],
+            entryModeTypeOptions: [
+                { label: 'NFT', value: 'NFT' },
+                { label: '金币', value: 'GOLD' },
+                { label: '金币或NFT', value: 'GOLD_OR_NFT' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        gameNameFormatter(row, column, cellValue, index) {
+            let selectedOption = this.gameNameOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        gameCopyTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.gameCopyTypeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        entryModeTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.entryModeTypeOptions.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: '/metaGameCopyEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaGameCopyEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaGameCopy/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaGameCopy/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 188 - 188
src/main/vue/src/views/MetaGameProcessList.vue

@@ -1,200 +1,200 @@
 <template>
-    <div class="list-view">
-        <page-title>
-            <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="createdAt" align="center" label="进度更新时间" width="200"></el-table-column>
-            <el-table-column prop="userId" align="center" label="玩家id"> </el-table-column>
+	<div class="list-view">
+		<page-title>
+			<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="createdAt" align="center" label="进度更新时间" width="200"> </el-table-column>
+			<el-table-column prop="userId" align="center" label="玩家id"> </el-table-column>
 			<el-table-column prop="phone" align="center" label="手机号" width="200"> </el-table-column>
-            <el-table-column prop="metaGameCopyId" align="center" label="游戏副本id"> </el-table-column>
-            <el-table-column prop="playerPos" align="center" label="玩家坐标" width="300">
-                <template slot-scope="{ row }">
-                    {{ 'x=' + row.playerPos.x + ' , ' + 'y=' + row.playerPos.y + ' , ' + 'z=' + row.playerPos.z }}
-                </template>
-            </el-table-column>
-            <el-table-column prop="point" align="center" label="当前积分"> </el-table-column>
-            <el-table-column prop="bulletCount" align="center" label="剩余子弹数"> </el-table-column>
-            <el-table-column prop="timeLeft" align="center" label="剩余时间(秒)"> </el-table-column>
-            <el-table-column prop="remainingHP" align="center" label="玩家剩余血量"> </el-table-column>
-            <el-table-column prop="hurt" align="center" label="是否收到伤害">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.hurt ? '' : 'info'"> {{ row.hurt }} </el-tag>
-                </template>
-            </el-table-column>
-            <el-table-column prop="disconnected" align="center" label="是否断线">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.disconnected ? '' : 'info'"> {{ row.disconnected }} </el-tag>
-                </template>
-            </el-table-column>
+			<el-table-column prop="metaGameCopyId" align="center" label="游戏副本id"> </el-table-column>
+			<el-table-column prop="playerPos" align="center" label="玩家坐标" width="300">
+				<template slot-scope="{ row }">
+					{{ 'x=' + row.playerPos.x + ' , ' + 'y=' + row.playerPos.y + ' , ' + 'z=' + row.playerPos.z }}
+				</template>
+			</el-table-column>
+			<el-table-column prop="point" align="center" label="当前积分"> </el-table-column>
+			<el-table-column prop="bulletCount" align="center" label="剩余子弹数"> </el-table-column>
+			<el-table-column prop="timeLeft" align="center" label="剩余时间(秒)"> </el-table-column>
+			<el-table-column prop="remainingHP" align="center" label="玩家剩余血量"> </el-table-column>
+			<el-table-column prop="hurt" align="center" label="是否收到伤害">
+				<template slot-scope="{ row }">
+					<el-tag :type="row.hurt ? '' : 'info'"> {{ row.hurt }} </el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column prop="disconnected" align="center" label="是否断线">
+				<template slot-scope="{ row }">
+					<el-tag :type="row.disconnected ? '' : 'info'"> {{ row.disconnected }} </el-tag>
+				</template>
+			</el-table-column>
 			<el-table-column prop="forceQuit" align="center" label="是否强制退出">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.forceQuit ? '' : 'info'"> {{ row.forceQuit }} </el-tag>
-                </template>
-            </el-table-column>
-            <el-table-column prop="completed" align="center" label="是否完成">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.completed ? '' : 'info'"> {{ row.completed }} </el-tag>
-                </template>
-            </el-table-column>
-            <el-table-column prop="metaGameAward" align="center" label="获得奖励">
-                <template slot-scope="{ row }">
-                    <template v-if="row.metaGameAward && row.metaGameAward.awardType === 'NFT'">
-                        <el-image
-                            style="width: 30px; height: 30px"
-                            :src="row.metaGameAward.config"
-                            fit="cover"
-                            :preview-src-list="[row.metaGameAward.config]"
-                        >
-                        </el-image>
-                    </template>
-                    <template v-if="row.metaGameAward && row.metaGameAward.awardType === 'GOLD'">
-                        {{ '金币:' + row.metaGameAward.config }}
-                    </template>
-                </template>
-            </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" width="150">
-                <template slot-scope="{ row }">
-                    <el-button @click="zombie(row)" type="primary" size="mini" plain> 查看僵尸信息 </el-button>
-                </template>
-            </el-table-column>
-        </el-table>
-        <div class="pagination-wrapper">
-            <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>
-        <el-dialog :visible.sync="showZombieDialog" title="僵尸信息" width="1000px">
-            <el-table :data="zombieList" height="calc(100vh - 500px)">
-                <el-table-column prop="id" align="center" label="id" width="100"> </el-table-column>
-                <el-table-column prop="metaZombieId" align="center" label="僵尸配置id"> </el-table-column>
-                <el-table-column prop="createIndex" align="center" label="生成点id"> </el-table-column>
-                <el-table-column prop="type" align="center" label="类型" :formatter="typeFormatter"> </el-table-column>
-                <el-table-column prop="hp" align="center" label="剩余血量"> </el-table-column>
-                <el-table-column prop="killed" align="center" label="是否击杀">
-                    <template slot-scope="{ row }">
-                        <el-tag :type="row.killed ? '' : 'info'"> {{ row.killed }} </el-tag>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="pos" align="center" label="坐标" width="350">
-                    <template slot-scope="{ row }">
-                        {{ 'x=' + row.pos.x + ' , ' + 'y=' + row.pos.y + ' , ' + 'z=' + row.pos.z }}
-                    </template>
-                </el-table-column>
-            </el-table>
-        </el-dialog>
-    </div>
+				<template slot-scope="{ row }">
+					<el-tag :type="row.forceQuit ? '' : 'info'"> {{ row.forceQuit }} </el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column prop="completed" align="center" label="是否完成">
+				<template slot-scope="{ row }">
+					<el-tag :type="row.completed ? '' : 'info'"> {{ row.completed }} </el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column prop="metaGameAward" align="center" label="获得奖励">
+				<template slot-scope="{ row }">
+					<template v-if="row.metaGameAward && row.metaGameAward.awardType === 'NFT'">
+						<el-image
+							style="width: 30px; height: 30px"
+							:src="row.metaGameAward.config"
+							fit="cover"
+							:preview-src-list="[row.metaGameAward.config]"
+						>
+						</el-image>
+					</template>
+					<template v-if="row.metaGameAward && row.metaGameAward.awardType === 'GOLD'">
+						{{ '金币:' + row.metaGameAward.config }}
+					</template>
+				</template>
+			</el-table-column>
+			<el-table-column label="操作" align="center" fixed="right" width="150">
+				<template slot-scope="{ row }">
+					<el-button @click="zombie(row)" type="primary" size="mini" plain> 查看僵尸信息 </el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		<div class="pagination-wrapper">
+			<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>
+		<el-dialog :visible.sync="showZombieDialog" title="僵尸信息" width="1000px">
+			<el-table :data="zombieList" height="calc(100vh - 500px)">
+				<el-table-column prop="id" align="center" label="id" width="100"> </el-table-column>
+				<el-table-column prop="metaZombieId" align="center" label="僵尸配置id"> </el-table-column>
+				<el-table-column prop="createIndex" align="center" label="生成点id"> </el-table-column>
+				<el-table-column prop="type" align="center" label="类型" :formatter="typeFormatter"> </el-table-column>
+				<el-table-column prop="hp" align="center" label="剩余血量"> </el-table-column>
+				<el-table-column prop="killed" align="center" label="是否击杀">
+					<template slot-scope="{ row }">
+						<el-tag :type="row.killed ? '' : 'info'"> {{ row.killed }} </el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="pos" align="center" label="坐标" width="350">
+					<template slot-scope="{ row }">
+						{{ 'x=' + row.pos.x + ' , ' + 'y=' + row.pos.y + ' , ' + 'z=' + row.pos.z }}
+					</template>
+				</el-table-column>
+			</el-table>
+		</el-dialog>
+	</div>
 </template>
 <script>
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 
 export default {
-    name: 'MetaGameProcessList',
-    mixins: [pageableTable],
-    data() {
-        return {
-            typeOptions: [
-                { label: '普通僵尸', value: 'COMMON' },
-                { label: '特殊僵尸', value: 'SPECIAL' }
-            ],
-            zombieList: [],
-            showZombieDialog: false,
-            multipleMode: false,
-            search: '',
-            url: '/metaGameProcess/all',
-            downloading: false
-        };
-    },
-    computed: {
-        selection() {
-            return this.$refs.table.selection.map(i => i.id);
-        }
-    },
-    methods: {
-        typeFormatter(row, column, cellValue, index) {
-            let selectedOption = this.typeOptions.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();
-            }
-        },
-        zombie(row) {
-            this.zombieList = row.metaZombieDTOS;
-            this.showZombieDialog = true;
-        },
-        download() {
-            this.downloading = true;
-            this.$axios
-                .get('/metaGameProcess/excel', {
-                    responseType: 'blob',
-                    params: { size: 10000, query: { del: false } }
-                })
-                .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);
-                });
-        }
-    }
+	name: 'MetaGameProcessList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			typeOptions: [
+				{ label: '普通僵尸', value: 'COMMON' },
+				{ label: '特殊僵尸', value: 'SPECIAL' }
+			],
+			zombieList: [],
+			showZombieDialog: false,
+			multipleMode: false,
+			search: '',
+			url: '/metaGameProcess/all',
+			downloading: false
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		typeFormatter(row, column, cellValue, index) {
+			let selectedOption = this.typeOptions.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();
+			}
+		},
+		zombie(row) {
+			this.zombieList = row.metaZombieDTOS;
+			this.showZombieDialog = true;
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaGameProcess/excel', {
+					responseType: 'blob',
+					params: { size: 10000, query: { del: false } }
+				})
+				.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);
+				});
+		}
+	}
 };
 </script>
 <style lang="less" scoped>

+ 144 - 144
src/main/vue/src/views/MetaGameStageAwardEdit.vue

@@ -1,152 +1,152 @@
 <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="gameName" label="游戏">
-						<el-select v-model="formData.gameName" clearable filterable placeholder="请选择">
-							<el-option
-								v-for="item in gameNameOptions"
-								:key="item.value"
-								:label="item.label"
-								:value="item.value"
-							>
-							</el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item prop="point" label="积分">
-						<el-input-number type="number" v-model="formData.point" :step="1" :min="1"> </el-input-number>
-						<div class="tip">输入规则:正整数,最小为1</div>
-					</el-form-item>
-					<el-form-item prop="awardPic" label="奖励图片">
-						<single-upload v-model="formData.awardPic"> </single-upload>
-					</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>
+    <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="gameName" label="游戏">
+                        <el-select v-model="formData.gameName" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in gameNameOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="point" label="积分">
+                        <el-input-number type="number" v-model="formData.point" :step="1" :min="1"> </el-input-number>
+                        <div class="tip">输入规则:正整数,最小为1</div>
+                    </el-form-item>
+                    <el-form-item prop="awardPic" label="奖励图片">
+                        <single-upload v-model="formData.awardPic"> </single-upload>
+                    </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: 'MetaGameStageAwardEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaGameStageAward/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: {
-				gameName: [
-					{
-						required: true,
-						message: '请选择游戏',
-						trigger: 'blur'
-					}
-				],
-				point: [
-					{
-						required: true,
-						message: '请输入积分',
-						trigger: 'blur'
-					},
-					{
-						validator: (rule, value, callback) => {
-							if (!this.reg.test(value)) {
-								callback(new Error('积分必须为大于1的整数'));
-								return;
-							} else {
-								callback();
-							}
-						}
-					}
-				],
-				awardPic: [
-					{
-						required: true,
-						message: '请输入奖励图片',
-						trigger: 'blur'
-					}
-				]
-			},
-			gameNameOptions: [{ label: '僵尸游戏', value: 'ZOMBIE' }]
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
+    name: 'MetaGameStageAwardEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaGameStageAward/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: {
+                gameName: [
+                    {
+                        required: true,
+                        message: '请选择游戏',
+                        trigger: 'blur'
+                    }
+                ],
+                point: [
+                    {
+                        required: true,
+                        message: '请输入积分',
+                        trigger: 'blur'
+                    },
+                    {
+                        validator: (rule, value, callback) => {
+                            if (!this.reg.test(value)) {
+                                callback(new Error('积分必须为大于1的整数'));
+                                return;
+                            } else {
+                                callback();
+                            }
+                        }
+                    }
+                ],
+                awardPic: [
+                    {
+                        required: true,
+                        message: '请输入奖励图片',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            gameNameOptions: [{ label: '僵尸游戏', value: 'ZOMBIE' }]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
 
-			this.saving = true;
-			this.$http
-				.post('/metaGameStageAward/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(`/metaGameStageAward/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 || '删除失败');
-					}
-				});
-		}
-	}
+            this.saving = true;
+            this.$http
+                .post('/metaGameStageAward/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(`/metaGameStageAward/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>

+ 178 - 178
src/main/vue/src/views/MetaGameStageAwardList.vue

@@ -1,71 +1,71 @@
 <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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="gameName" label="游戏" :formatter="gameNameFormatter"> </el-table-column>
-			<el-table-column prop="point" label="积分"> </el-table-column>
-			<el-table-column prop="awardPic" label="奖励图片">
-				<template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.awardPic"
-						fit="cover"
-						:preview-src-list="[row.awardPic]"
-					>
-					</el-image>
-				</template>
-			</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">
+    <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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="gameName" label="游戏" :formatter="gameNameFormatter"> </el-table-column>
+            <el-table-column prop="point" label="积分"> </el-table-column>
+            <el-table-column prop="awardPic" label="奖励图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.awardPic"
+                        fit="cover"
+                        :preview-src-list="[row.awardPic]"
+                    >
+                    </el-image>
+                </template>
+            </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>
@@ -73,123 +73,123 @@
                     <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>
+            <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: 'MetaGameStageAwardList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaGameStageAward/all',
-			downloading: false,
-			gameNameOptions: [{ label: '僵尸游戏', value: 'ZOMBIE' }]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		gameNameFormatter(row, column, cellValue, index) {
-			let selectedOption = this.gameNameOptions.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: '/metaGameStageAwardEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaGameStageAwardEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaGameStageAward/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaGameStageAward/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaGameStageAwardList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaGameStageAward/all',
+            downloading: false,
+            gameNameOptions: [{ label: '僵尸游戏', value: 'ZOMBIE' }]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        gameNameFormatter(row, column, cellValue, index) {
+            let selectedOption = this.gameNameOptions.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: '/metaGameStageAwardEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaGameStageAwardEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaGameStageAward/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaGameStageAward/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 125 - 125
src/main/vue/src/views/MetaItemEdit.vue

@@ -1,133 +1,133 @@
 <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="type" label="物品类型">
-                        <el-select v-model="formData.type" clearable filterable placeholder="请选择">
-                            <el-option
-                                v-for="item in typeOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            >
-                            </el-option>
-                        </el-select>
-                    </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>
+	<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="type" label="物品类型">
+						<el-select v-model="formData.type" clearable filterable placeholder="请选择">
+							<el-option
+								v-for="item in typeOptions"
+								:key="item.value"
+								:label="item.label"
+								:value="item.value"
+							>
+							</el-option>
+						</el-select>
+					</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: 'MetaItemEdit',
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get('metaItem/get/' + this.$route.query.id)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-    },
-    data() {
-        return {
-            saving: false,
-            formData: {},
-            rules: {
-                name: [
-                    {
-                        required: true,
-                        message: '请输入物品名称',
-                        trigger: 'blur'
-                    }
-                ],
-                type: [
-                    {
-                        required: true,
-                        message: '请输入物品类型',
-                        trigger: 'blur'
-                    }
-                ]
-            },
-            typeOptions: [
-                { label: '元宇宙展厅', value: 'META_SHOW_ROOM' },
-                { label: '建筑', value: 'BUILDING' }
-            ]
-        };
-    },
-    methods: {
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit() {
-            let data = { ...this.formData };
+	name: 'MetaItemEdit',
+	created() {
+		if (this.$route.query.id) {
+			this.$http
+				.get('metaItem/get/' + this.$route.query.id)
+				.then(res => {
+					this.formData = res;
+				})
+				.catch(e => {
+					console.log(e);
+					this.$message.error(e.error);
+				});
+		}
+	},
+	data() {
+		return {
+			saving: false,
+			formData: {},
+			rules: {
+				name: [
+					{
+						required: true,
+						message: '请输入物品名称',
+						trigger: 'blur'
+					}
+				],
+				type: [
+					{
+						required: true,
+						message: '请输入物品类型',
+						trigger: 'blur'
+					}
+				]
+			},
+			typeOptions: [
+				{ label: '元宇宙展厅', value: 'META_SHOW_ROOM' },
+				{ label: '建筑', value: 'BUILDING' }
+			]
+		};
+	},
+	methods: {
+		onSave() {
+			this.$refs.form.validate(valid => {
+				if (valid) {
+					this.submit();
+				} else {
+					return false;
+				}
+			});
+		},
+		submit() {
+			let data = { ...this.formData };
 
-            this.saving = true;
-            this.$http
-                .post('/metaItem/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(`/metaItem/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 || '删除失败');
-                    }
-                });
-        }
-    }
+			this.saving = true;
+			this.$http
+				.post('/metaItem/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(`/metaItem/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>

+ 170 - 170
src/main/vue/src/views/MetaItemList.vue

@@ -1,60 +1,60 @@
 <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="type" align="center" label="物品类型" :formatter="typeFormatter"> </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">
+    <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="type" align="center" label="物品类型" :formatter="typeFormatter"> </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>
@@ -62,126 +62,126 @@
                     <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>
+            <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: 'MetaItemList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaItem/all',
-			downloading: false,
-			typeOptions: [
-				{ label: '元宇宙展厅', value: 'META_SHOW_ROOM' },
-				{ label: '建筑', value: 'BUILDING' }
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		typeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.typeOptions.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: '/metaItemEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaItemEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaItem/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaItem/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaItemList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaItem/all',
+            downloading: false,
+            typeOptions: [
+                { label: '元宇宙展厅', value: 'META_SHOW_ROOM' },
+                { label: '建筑', value: 'BUILDING' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.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: '/metaItemEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaItemEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaItem/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaItem/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 120 - 120
src/main/vue/src/views/MetaMMOLoginInfoList.vue

@@ -1,130 +1,130 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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="nickname" label="昵称"> </el-table-column>
-			<el-table-column prop="userId" label="用户id"> </el-table-column>
-			<el-table-column prop="regionId" label="区域id"> </el-table-column>
-			<el-table-column prop="cityId" label="城市id"> </el-table-column>
-			<el-table-column prop="onLineTime" label="上线时间" width="150"> </el-table-column>
-			<el-table-column prop="offLineTime" label="离线时间" width="150"> </el-table-column>
-			<el-table-column prop="sessionId" label="sessionId"> </el-table-column>
-			<el-table-column prop="role" label="角色"> </el-table-column>
-			<el-table-column prop="axisX" label="axisX"> </el-table-column>
-			<el-table-column prop="axisY" label="axisY"> </el-table-column>
-			<el-table-column prop="axisZ" label="axisZ"> </el-table-column>
-			<el-table-column prop="eulerX" label="eulerX"> </el-table-column>
-			<el-table-column prop="eulerY" label="eulerY"> </el-table-column>
-			<el-table-column prop="eulerZ" label="eulerZ"> </el-table-column>
-			<el-table-column prop="top" label="top"> </el-table-column>
-			<el-table-column prop="hat" label="hat"> </el-table-column>
-			<el-table-column prop="down" label="down"> </el-table-column>
-			<el-table-column prop="shoes" label="shoes"> </el-table-column>
-			<el-table-column prop="anim" label="anim"> </el-table-column>
-			<el-table-column prop="emoji" label="emoji"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+    <div class="list-view">
+        <page-title>
+            <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="nickname" label="昵称"> </el-table-column>
+            <el-table-column prop="userId" label="用户id"> </el-table-column>
+            <el-table-column prop="regionId" label="区域id"> </el-table-column>
+            <el-table-column prop="cityId" label="城市id"> </el-table-column>
+            <el-table-column prop="onLineTime" label="上线时间" width="150"> </el-table-column>
+            <el-table-column prop="offLineTime" label="离线时间" width="150"> </el-table-column>
+            <el-table-column prop="sessionId" label="sessionId"> </el-table-column>
+            <el-table-column prop="role" label="角色"> </el-table-column>
+            <el-table-column prop="axisX" label="axisX"> </el-table-column>
+            <el-table-column prop="axisY" label="axisY"> </el-table-column>
+            <el-table-column prop="axisZ" label="axisZ"> </el-table-column>
+            <el-table-column prop="eulerX" label="eulerX"> </el-table-column>
+            <el-table-column prop="eulerY" label="eulerY"> </el-table-column>
+            <el-table-column prop="eulerZ" label="eulerZ"> </el-table-column>
+            <el-table-column prop="top" label="top"> </el-table-column>
+            <el-table-column prop="hat" label="hat"> </el-table-column>
+            <el-table-column prop="down" label="down"> </el-table-column>
+            <el-table-column prop="shoes" label="shoes"> </el-table-column>
+            <el-table-column prop="anim" label="anim"> </el-table-column>
+            <el-table-column prop="emoji" label="emoji"> </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaMMOLoginInfoList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaMMOLoginInfo/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaMMOLoginInfo/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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);
-				});
-		}
-	}
+    name: 'MetaMMOLoginInfoList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaMMOLoginInfo/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaMMOLoginInfo/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 181 - 177
src/main/vue/src/views/MetaPlayerRoleClassifyEdit.vue

@@ -1,184 +1,188 @@
 <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="120px"
-					label-position="right"
-					size="small"
-					style="max-width: 500px"
-				>
-					<el-form-item prop="classify" label="角色分类名称">
-						<el-input v-model="formData.classify"> </el-input>
-					</el-form-item>
-					<el-form-item
-						prop="metaPlayerRoleList"
-						label="角色列表"
-						style="width: calc(100vw - 450px)"
-						size="mini"
-					>
-						<el-table :data="formData.metaPlayerRoleList">
-							<el-table-column prop="id" label="角色id">
-								<template v-slot="{ row }">
-									<el-input v-model="row.id" style="width: 250px" placeholder="请输入角色id">
-									</el-input>
-								</template>
-							</el-table-column>
-							<el-table-column prop="name" label="角色名称">
-								<template v-slot="{ row }">
-									<el-input v-model="row.name" style="width: 250px" placeholder="请输入角色名称">
-									</el-input>
-								</template>
-							</el-table-column>
-							<el-table-column width="80" align="center">
-								<template v-slot="{ row, $index }">
-									<el-button type="danger" plain size="mini" @click="delRole($index)">
-										删除
-									</el-button>
-								</template>
-							</el-table-column>
-						</el-table>
-					</el-form-item>
-					<el-form-item>
-						<el-button size="mini" @click="addRole"> 添加配置 </el-button>
-						<div class="tip">请最少输入一个角色</div>
-					</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>
+    <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="120px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px"
+                >
+                    <el-form-item prop="classify" label="角色分类名称">
+                        <el-input v-model="formData.classify"> </el-input>
+                    </el-form-item>
+                    <el-form-item
+                        prop="metaPlayerRoleList"
+                        label="角色列表"
+                        style="width: calc(100vw - 450px)"
+                        size="mini"
+                    >
+                        <el-table :data="formData.metaPlayerRoleList">
+                            <el-table-column prop="id" label="角色id">
+                                <template v-slot="{ row }">
+                                    <el-input v-model="row.id" style="width: 250px" placeholder="请输入角色id">
+                                    </el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="name" label="角色名称">
+                                <template v-slot="{ row }">
+                                    <el-input v-model="row.name" style="width: 250px" placeholder="请输入角色名称">
+                                    </el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column width="80" align="center">
+                                <template v-slot="{ row, $index }">
+                                    <el-button type="danger" plain size="mini" @click="delRole($index)">
+                                        删除
+                                    </el-button>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button size="mini" @click="addRole"> 添加配置 </el-button>
+                        <div class="tip">请最少输入一个角色</div>
+                    </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: 'MetaPlayerRoleClassifyEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaPlayerRoleClassify/get/' + this.$route.query.id)
-				.then(res => {
-					this.formData = res;
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-	},
-	data() {
-		return {
-			saving: false,
-			formData: { metaPlayerRoleList: [{ id: '', name: '' }] },
-			rules: {
-				classify: [
-					{
-						required: true,
-						message: '请输入角色分类',
-						trigger: 'blur'
-					}
-				],
-				metaPlayerRoleList: [
-					{
-						validator: (rule, value, callback) => {
-							if (value) {
-								if (!(value instanceof Array)) {
-									callback(new Error('metaPlayerRoleList must be array!'));
-									return;
-								} else {
-									for (let i = 0; i < value.length; i++) {
-										if (value[i].id === '' || value[i].id === undefined || value[i].id === null) {
-											callback(new Error('请输入角色id'));
-											return;
-										}
-										if (
-											value[i].name === '' ||
-											value[i].name === undefined ||
-											value[i].name === null
-										) {
-											callback(new Error('请输入角色名称'));
-											return;
-										}
-									}
-								}
-							}
-							callback();
-						},
-						trigger: 'blur'
-					}
-				]
-			}
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
-			if (data.metaPlayerRoleList.length == 0 || data.metaPlayerRoleList === null || data.metaPlayerRoleList === undefined) {
-				this.$message.error('请最少输入一个角色');
-			} else {
-				this.saving = true;
-				this.$http
-					.post('/metaPlayerRoleClassify/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(`/metaPlayerRoleClassify/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 || '删除失败');
-					}
-				});
-		},
-		addRole() {
-			this.formData.metaPlayerRoleList.push({
-				id: '',
-				name: ''
-			});
-		},
-		delRole(i) {
-			this.formData.metaPlayerRoleList.splice(i, 1);
-		}
-	}
+    name: 'MetaPlayerRoleClassifyEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaPlayerRoleClassify/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: { metaPlayerRoleList: [{ id: '', name: '' }] },
+            rules: {
+                classify: [
+                    {
+                        required: true,
+                        message: '请输入角色分类',
+                        trigger: 'blur'
+                    }
+                ],
+                metaPlayerRoleList: [
+                    {
+                        validator: (rule, value, callback) => {
+                            if (value) {
+                                if (!(value instanceof Array)) {
+                                    callback(new Error('metaPlayerRoleList must be array!'));
+                                    return;
+                                } else {
+                                    for (let i = 0; i < value.length; i++) {
+                                        if (value[i].id === '' || value[i].id === undefined || value[i].id === null) {
+                                            callback(new Error('请输入角色id'));
+                                            return;
+                                        }
+                                        if (
+                                            value[i].name === '' ||
+                                            value[i].name === undefined ||
+                                            value[i].name === null
+                                        ) {
+                                            callback(new Error('请输入角色名称'));
+                                            return;
+                                        }
+                                    }
+                                }
+                            }
+                            callback();
+                        },
+                        trigger: 'blur'
+                    }
+                ]
+            }
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            if (
+                data.metaPlayerRoleList.length == 0 ||
+                data.metaPlayerRoleList === null ||
+                data.metaPlayerRoleList === undefined
+            ) {
+                this.$message.error('请最少输入一个角色');
+            } else {
+                this.saving = true;
+                this.$http
+                    .post('/metaPlayerRoleClassify/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(`/metaPlayerRoleClassify/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 || '删除失败');
+                    }
+                });
+        },
+        addRole() {
+            this.formData.metaPlayerRoleList.push({
+                id: '',
+                name: ''
+            });
+        },
+        delRole(i) {
+            this.formData.metaPlayerRoleList.splice(i, 1);
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 164 - 164
src/main/vue/src/views/MetaPlayerRoleClassifyList.vue

@@ -1,68 +1,68 @@
 <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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="classify" label="角色分类"> </el-table-column>
+    <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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="classify" label="角色分类"> </el-table-column>
             <el-table-column prop="metaPlayerRoleList" label="角色列表">
                 <template v-slot="{ row }">
-					<template v-if="row.metaPlayerRoleList">
-						<div v-for="item in row.metaPlayerRoleList" :key="item.id">
-							{{ item.name }}
-						</div>
-					</template>
-				</template>
+                    <template v-if="row.metaPlayerRoleList">
+                        <div v-for="item in row.metaPlayerRoleList" :key="item.id">
+                            {{ item.name }}
+                        </div>
+                    </template>
+                </template>
             </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-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>
@@ -70,115 +70,115 @@
                     <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>
+            <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: 'MetaPlayerRoleClassifyList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaPlayerRoleClassify/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaPlayerRoleClassifyEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaPlayerRoleClassifyEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaPlayerRoleClassify/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(`/metaPlayerRoleClassify/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaPlayerRoleClassifyList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaPlayerRoleClassify/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaPlayerRoleClassifyEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaPlayerRoleClassifyEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaPlayerRoleClassify/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaPlayerRoleClassify/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 154 - 153
src/main/vue/src/views/MetaPlayerWearEdit.vue

@@ -1,64 +1,64 @@
 <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="94px"
-					label-position="right"
-					size="small"
-					style="max-width: 500px"
-				>
-					<el-form-item prop="userId" label="用户id">
-						<el-input-number type="number" v-model="formData.userId"> </el-input-number>
-					</el-form-item>
+    <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="94px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px"
+                >
+                    <el-form-item prop="userId" label="用户id">
+                        <el-input-number type="number" v-model="formData.userId"> </el-input-number>
+                    </el-form-item>
                     <el-form-item prop="model" label="模型">
-						<model-upload
-							:limit="1"
-							v-model="formData.model"
-							:customUrl="customUrl"
-							accept="application/zip"
-							format="json"
-							single
-						>
-						</model-upload>
-						<div class="tip">请将FBX文件与贴图打包成zip压缩包上传</div>
-					</el-form-item>
-					<el-form-item label="相机距离" v-if="formData.model">
-						<el-input-number v-model="scale" :min="0.1" :step="0.1"> </el-input-number>
-					</el-form-item>
-					<el-form-item label="Y轴偏移" v-if="formData.model">
-						<el-input-number v-model="yOffset"> </el-input-number>
-					</el-form-item>
-					<el-form-item prop="type" label="类型">
-						<el-select v-model="formData.type" clearable filterable placeholder="请选择">
-							<el-option
-								v-for="item in typeOptions"
-								:key="item.value"
-								:label="item.label"
-								:value="item.value"
-							>
-							</el-option>
-						</el-select>
-					</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>
+                        <model-upload
+                            :limit="1"
+                            v-model="formData.model"
+                            :customUrl="customUrl"
+                            accept="application/zip"
+                            format="json"
+                            single
+                        >
+                        </model-upload>
+                        <div class="tip">请将FBX文件与贴图打包成zip压缩包上传</div>
+                    </el-form-item>
+                    <el-form-item label="相机距离" v-if="formData.model">
+                        <el-input-number v-model="scale" :min="0.1" :step="0.1"> </el-input-number>
+                    </el-form-item>
+                    <el-form-item label="Y轴偏移" v-if="formData.model">
+                        <el-input-number v-model="yOffset"> </el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="type" label="类型">
+                        <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in typeOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </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>
 import resolveUrl from 'resolve-url';
@@ -66,113 +66,114 @@ import ModelUpload from '../components/ModelUpload.vue';
 import SingleUpload from '../components/SingleUpload.vue';
 import TagSelect from '../components/TagSelect.vue';
 export default {
-	name: 'MetaPlayerWearEdit',
+    name: 'MetaPlayerWearEdit',
     components: { ModelUpload, SingleUpload, TagSelect },
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaPlayerWear/get/' + this.$route.query.id)
-				.then(res => {
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaPlayerWear/get/' + this.$route.query.id)
+                .then(res => {
                     if (res.model) {
                         let url = new URL(res.model.url);
                         this.scale = Number(url.searchParams.get('scale')) || 1;
                         this.yOffset = Number(url.searchParams.get('yOffset')) || 0;
                         res.model.url = url.origin + url.pathname;
                     }
-					this.formData = res;
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-	},
-	data() {
-		return {
-			saving: false,
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
             scale: 1,
-			yOffset: 0,
+            yOffset: 0,
             customUrl: resolveUrl(this.$baseUrl, 'upload/3dModel'),
-			formData: {},
-			rules: {
-				userId: [
-					{
-						required: true,
-						message: '请输入用户id',
-						trigger: 'blur'
-					}
-				],
-				model: [
-					{
-						required: true,
-						message: '请上传模型',
-						trigger: 'blur'
-					}
-				],
-				type: [
-					{
-						required: true,
-						message: '请输入类型',
-						trigger: 'blur'
-					}
-				]
-			},
-			typeOptions: [
-				{ label: '头饰', value: 'HEADDRESS' },
-				{ label: '衣服', value: 'CLOTHES' },
-				{ label: '裤子', value: 'TROUSERS' },
-				{ label: '鞋子', value: 'SHOES' },
-				{ label: '动作', value: 'ACTION' }
-			]
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
+            formData: {},
+            rules: {
+                userId: [
+                    {
+                        required: true,
+                        message: '请输入用户id',
+                        trigger: 'blur'
+                    }
+                ],
+                model: [
+                    {
+                        required: true,
+                        message: '请上传模型',
+                        trigger: 'blur'
+                    }
+                ],
+                type: [
+                    {
+                        required: true,
+                        message: '请输入类型',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            typeOptions: [
+                { label: '头饰', value: 'HEADDRESS' },
+                { label: '衣服', value: 'CLOTHES' },
+                { label: '裤子', value: 'TROUSERS' },
+                { label: '鞋子', value: 'SHOES' },
+                { label: '动作', value: 'ACTION' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
             if (data.model) {
                 data.model.url = data.model.url + '?scale=' + this.scale + '&yOffset=' + this.yOffset;
             }
-			this.saving = true;
-			this.$http
-				.post('/metaPlayerWear/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(`/metaPlayerWear/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 || '删除失败');
-					}
-				});
-		}
-	}
+            this.saving = true;
+            this.$http
+                .post('/metaPlayerWear/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(`/metaPlayerWear/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>

+ 175 - 174
src/main/vue/src/views/MetaPlayerWearList.vue

@@ -1,61 +1,61 @@
 <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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="userId" label="用户id"> </el-table-column>
-			<el-table-column prop="model.name" label="模型"> </el-table-column>
-			<el-table-column prop="type" label="类型" :formatter="typeFormatter"> </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">
+    <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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="userId" label="用户id"> </el-table-column>
+            <el-table-column prop="model.name" label="模型"> </el-table-column>
+            <el-table-column prop="type" label="类型" :formatter="typeFormatter"> </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>
@@ -63,130 +63,131 @@
                     <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>
+            <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: 'MetaPlayerWearList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaPlayerWear/all',
-			downloading: false,
-			typeOptions: [
-				{ label: '头饰', value: 'HEADDRESS' },
-				{ label: '衣服', value: 'CLOTHES' },
-				{ label: '裤子', value: 'TROUSERS' },
-				{ label: '鞋子', value: 'SHOES' },
-				{ label: '动作', value: 'ACTION' }
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		typeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.typeOptions.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: '/metaPlayerWearEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaPlayerWearEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaPlayerWear/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaPlayerWear/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaPlayerWearList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaPlayerWear/all',
+            downloading: false,
+            typeOptions: [
+                { label: '头饰', value: 'HEADDRESS' },
+                { label: '衣服', value: 'CLOTHES' },
+                { label: '裤子', value: 'TROUSERS' },
+                { label: '鞋子', value: 'SHOES' },
+                { label: '动作', value: 'ACTION' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.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: '/metaPlayerWearEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaPlayerWearEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaPlayerWear/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaPlayerWear/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>

+ 113 - 113
src/main/vue/src/views/MetaResourceVersionEdit.vue

@@ -1,120 +1,120 @@
 <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="108px"
-					label-position="right"
-					size="small"
-					style="max-width: 800px"
-				>
-					<el-form-item prop="downloadUrl" label="资源下载链接">
-						<el-input v-model="formData.downloadUrl"> </el-input>
-					</el-form-item>
-					<el-form-item prop="version" label="版本编号">
-						<el-input v-model="formData.version"> </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>
+    <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="108px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 800px"
+                >
+                    <el-form-item prop="downloadUrl" label="资源下载链接">
+                        <el-input v-model="formData.downloadUrl"> </el-input>
+                    </el-form-item>
+                    <el-form-item prop="version" label="版本编号">
+                        <el-input v-model="formData.version"> </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: 'MetaResourceVersionEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaResourceVersion/get/' + this.$route.query.id)
-				.then(res => {
-					this.formData = res;
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-	},
-	data() {
-		return {
-			saving: false,
-			formData: {},
-			rules: {
-				downloadUrl: [
-					{
-						required: true,
-						message: '请输入下载链接',
-						trigger: 'blur'
-					}
-				],
-				version: [
-					{
-						required: true,
-						message: '请输入版本编号',
-						trigger: 'blur'
-					}
-				]
-			}
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
-			this.saving = true;
-			this.$http
-				.post('/metaResourceVersion/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(`/metaResourceVersion/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 || '删除失败');
-					}
-				});
-		}
-	}
+    name: 'MetaResourceVersionEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaResourceVersion/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {
+                downloadUrl: [
+                    {
+                        required: true,
+                        message: '请输入下载链接',
+                        trigger: 'blur'
+                    }
+                ],
+                version: [
+                    {
+                        required: true,
+                        message: '请输入版本编号',
+                        trigger: 'blur'
+                    }
+                ]
+            }
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            this.saving = true;
+            this.$http
+                .post('/metaResourceVersion/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(`/metaResourceVersion/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>

+ 159 - 159
src/main/vue/src/views/MetaResourceVersionList.vue

@@ -1,61 +1,61 @@
 <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" label="ID" width="100"> </el-table-column>
+    <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" label="ID" width="100"> </el-table-column>
             <el-table-column prop="createdAt" label="创建时间"> </el-table-column>
-			<el-table-column prop="downloadUrl" label="资源下载链接"> </el-table-column>
-			<el-table-column prop="version" label="资源版本"> </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-table-column prop="downloadUrl" label="资源下载链接"> </el-table-column>
+            <el-table-column prop="version" label="资源版本"> </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>
@@ -63,115 +63,115 @@
                     <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>
+            <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: 'MetaResourceVersionList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaResourceVersion/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaResourceVersionEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaResourceVersionEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaResourceVersion/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaResourceVersion/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaResourceVersionList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaResourceVersion/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaResourceVersionEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaResourceVersionEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaResourceVersion/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaResourceVersion/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 106 - 106
src/main/vue/src/views/MetaShowRoomAssetList.vue

@@ -1,119 +1,119 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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="userId" align="center" label="所属用户Id"> </el-table-column>
-			<el-table-column prop="showRoomId" align="center" label="展厅id"> </el-table-column>
-			<el-table-column prop="spaceId" align="center" label="空间id"> </el-table-column>
-			<el-table-column prop="assetId" align="center" label="资产id"> </el-table-column>
+    <div class="list-view">
+        <page-title>
+            <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="userId" align="center" label="所属用户Id"> </el-table-column>
+            <el-table-column prop="showRoomId" align="center" label="展厅id"> </el-table-column>
+            <el-table-column prop="spaceId" align="center" label="空间id"> </el-table-column>
+            <el-table-column prop="assetId" align="center" label="资产id"> </el-table-column>
             <el-table-column prop="coordinate" align="center" label="展厅内坐标">
                 <template slot-scope="{ row }">
-					{{ 'x=' + row.coordinate.x + ' , ' + 'y=' + row.coordinate.y + ' , ' + 'z=' + row.coordinate.z }} 
-				</template>
+                    {{ 'x=' + row.coordinate.x + ' , ' + 'y=' + row.coordinate.y + ' , ' + 'z=' + row.coordinate.z }}
+                </template>
             </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaShowRoomAssetList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaShowRoomAsset/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaShowRoomAsset/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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);
-				});
-		}
-	}
+    name: 'MetaShowRoomAssetList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaShowRoomAsset/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaShowRoomAsset/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 22 - 0
src/main/vue/src/views/MetaSpatialInfoEdit.vue

@@ -51,6 +51,10 @@
                     <el-form-item prop="sale" label="挂售">
                         <el-switch v-model="formData.sale"> </el-switch>
                     </el-form-item>
+                    <el-form-item prop="type" label="空间类型">
+                        <el-input-number type="type" v-model="formData.type" :step="1" :min="1"> </el-input-number>
+                        <div class="tip">输入规则:正整数,最小为1</div>
+                    </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">
@@ -88,7 +92,25 @@ export default {
         return {
             saving: false,
             formData: {},
+            reg: /^[1-9]\d*$/,
             rules: {
+                type: [
+                    {
+                        required: true,
+                        message: '请输入空间类型',
+                        trigger: 'blur'
+                    },
+                    {
+                        validator: (rule, value, callback) => {
+                            if (!this.reg.test(value)) {
+                                callback(new Error('空间类型必须为大于1的整数'));
+                                return;
+                            } else {
+                                callback();
+                            }
+                        }
+                    }
+                ],
                 region: [
                     {
                         required: true,

+ 189 - 188
src/main/vue/src/views/MetaSpatialInfoList.vue

@@ -1,73 +1,73 @@
 <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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="region" label="所属区域" :formatter="regionFormatter"> </el-table-column>
-			<el-table-column prop="coordinate" label="区域内坐标">
+    <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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="region" label="所属区域" :formatter="regionFormatter"> </el-table-column>
+            <el-table-column prop="coordinate" label="区域内坐标">
                 <template slot-scope="{ row }">
-					{{ 'x=' + row.coordinate.x + ' , ' + 'y=' + row.coordinate.y + ' , ' + 'z=' + row.coordinate.z }} 
-				</template>
+                    {{ 'x=' + row.coordinate.x + ' , ' + 'y=' + row.coordinate.y + ' , ' + 'z=' + row.coordinate.z }}
+                </template>
             </el-table-column>
-			<el-table-column prop="sale" label="状态">
-				<template slot-scope="{ row }">
-					{{ row.sale ? '可售' : '未售' }} 
-				</template>
-			</el-table-column>
-			<el-table-column prop="userId" label="所属用户id"> </el-table-column>
-			<el-table-column prop="size" label="空间大小"> </el-table-column>
-			<el-table-column prop="assetId" label="资产id"> </el-table-column>
-			<el-table-column prop="hcTxHash" label="hash" width="550"> </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-table-column prop="sale" label="状态">
+                <template slot-scope="{ row }">
+                    {{ row.sale ? '可售' : '未售' }}
+                </template>
+            </el-table-column>
+            <el-table-column prop="userId" label="所属用户id"> </el-table-column>
+            <el-table-column prop="size" label="空间大小"> </el-table-column>
+            <el-table-column prop="assetId" label="资产id"> </el-table-column>
+            <el-table-column prop="hcTxHash" label="hash" width="550"> </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>
@@ -75,134 +75,135 @@
                     <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>
+            <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: 'MetaSpatialInfoList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaSpatialInfo/all',
-			downloading: false,
-			regionOptions: [
-				{ label: '1区', value: 'ONE' },
-				{ label: '2区', value: 'TWO' },
-				{ label: '3区', value: 'THREE' },
-				{ label: '4区', value: 'FOUR' },
-				{ label: '5区', value: 'FIVE' },
-				{ label: '6区', value: 'SIX' },
-				{ label: '7区', value: 'SEVEN' },
-				{ label: '8区', value: 'EIGHT' },
-				{ label: '9区', value: 'NINE' }
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		regionFormatter(row, column, cellValue, index) {
-			let selectedOption = this.regionOptions.find(i => i.value === cellValue);
-			if (selectedOption) {
-				return selectedOption.label;
-			}
-			return '';
-		},
-		beforeGetData() {
-			return { search: this.search, query: { del: false }, sort:'id,asc' };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaSpatialInfoEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaSpatialInfoEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaSpatialInfo/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaSpatialInfo/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaSpatialInfoList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaSpatialInfo/all',
+            downloading: false,
+            regionOptions: [
+                { label: '1区', value: 'ONE' },
+                { label: '2区', value: 'TWO' },
+                { label: '3区', value: 'THREE' },
+                { label: '4区', value: 'FOUR' },
+                { label: '5区', value: 'FIVE' },
+                { label: '6区', value: 'SIX' },
+                { label: '7区', value: 'SEVEN' },
+                { label: '8区', value: 'EIGHT' },
+                { label: '9区', value: 'NINE' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        regionFormatter(row, column, cellValue, index) {
+            let selectedOption = this.regionOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search, query: { del: false }, sort: 'id,asc' };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaSpatialInfoEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaSpatialInfoEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaSpatialInfo/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaSpatialInfo/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>

+ 139 - 0
src/main/vue/src/views/MetaSpatialWharfList.vue

@@ -0,0 +1,139 @@
+<template>
+    <div class="list-view">
+        <page-title>
+            <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="isLandId" align="center" label="岛屿ID"> </el-table-column>
+            <el-table-column prop="boatId" align="center" label="船只ID"> </el-table-column>
+			<el-table-column prop="userId" align="center" label="所属用户"> </el-table-column>
+            <el-table-column prop="boatImg" align="center" label="船只图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.boatImg"
+                        fit="cover"
+                        :preview-src-list="[row.boatImg]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="boatType" align="center" label="船只类型">
+            </el-table-column>
+            <el-table-column prop="boatPos" align="center" label="位置信息">
+                <template slot-scope="{ row }">
+                    {{ 'x=' + row.boatPos.x + ' , ' + 'y=' + row.boatPos.y + ' , ' + 'z=' + row.boatPos.z }}
+                </template>
+            </el-table-column>
+            <el-table-column prop="boatRot" align="center" label="旋转值">
+                <template slot-scope="{ row }">
+                    {{ 'x=' + row.boatRot.x + ' , ' + 'y=' + row.boatRot.y + ' , ' + 'z=' + row.boatRot.z }}
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaSpatialWharfList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaSpatialWharf/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaSpatialWharf/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+
+</style>

+ 136 - 136
src/main/vue/src/views/MetaTaskActivityEdit.vue

@@ -1,144 +1,144 @@
 <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="title" label="标题">
-                        <el-input v-model="formData.title"> </el-input>
-                    </el-form-item>
-                    <el-form-item prop="word" label="文字">
-                        <el-input v-model="formData.word" type="textarea"> </el-input>
-                    </el-form-item>
-                    <el-form-item prop="picture" label="图片">
-                        <single-upload v-model="formData.picture"> </single-upload>
-                    </el-form-item>
-                    <el-form-item prop="link" label="链接地址">
-                        <el-input v-model="formData.link"> </el-input>
-                    </el-form-item>
-                    <el-form-item prop="publish" label="是否发布">
-                        <el-switch v-model="formData.publish"> </el-switch>
-                    </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>
+	<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="title" label="标题">
+						<el-input v-model="formData.title"> </el-input>
+					</el-form-item>
+					<el-form-item prop="word" label="文字">
+						<el-input v-model="formData.word" type="textarea"> </el-input>
+					</el-form-item>
+					<el-form-item prop="picture" label="图片">
+						<single-upload v-model="formData.picture"> </single-upload>
+					</el-form-item>
+					<el-form-item prop="link" label="链接地址">
+						<el-input v-model="formData.link"> </el-input>
+					</el-form-item>
+					<el-form-item prop="publish" label="是否发布">
+						<el-switch v-model="formData.publish"> </el-switch>
+					</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: 'MetaTaskActivityEdit',
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get('metaTaskActivity/get/' + this.$route.query.id)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-    },
-    data() {
-        return {
-            saving: false,
-            formData: {},
-            rules: {
-                title: [
-                    {
-                        required: true,
-                        message: '请输入标题',
-                        trigger: 'blur'
-                    }
-                ],
-                word: [
-                    {
-                        required: true,
-                        message: '请输入文字',
-                        trigger: 'blur'
-                    }
-                ],
-                picture: [
-                    {
-                        required: true,
-                        message: '请输入图片',
-                        trigger: 'blur'
-                    }
-                ],
-                link: [
-                    {
-                        required: true,
-                        message: '请输入链接地址',
-                        trigger: 'blur'
-                    }
-                ]
-            }
-        };
-    },
-    methods: {
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit() {
-            let data = { ...this.formData };
+	name: 'MetaTaskActivityEdit',
+	created() {
+		if (this.$route.query.id) {
+			this.$http
+				.get('metaTaskActivity/get/' + this.$route.query.id)
+				.then(res => {
+					this.formData = res;
+				})
+				.catch(e => {
+					console.log(e);
+					this.$message.error(e.error);
+				});
+		}
+	},
+	data() {
+		return {
+			saving: false,
+			formData: {},
+			rules: {
+				title: [
+					{
+						required: true,
+						message: '请输入标题',
+						trigger: 'blur'
+					}
+				],
+				word: [
+					{
+						required: true,
+						message: '请输入文字',
+						trigger: 'blur'
+					}
+				],
+				picture: [
+					{
+						required: true,
+						message: '请输入图片',
+						trigger: 'blur'
+					}
+				],
+				link: [
+					{
+						required: true,
+						message: '请输入链接地址',
+						trigger: 'blur'
+					}
+				]
+			}
+		};
+	},
+	methods: {
+		onSave() {
+			this.$refs.form.validate(valid => {
+				if (valid) {
+					this.submit();
+				} else {
+					return false;
+				}
+			});
+		},
+		submit() {
+			let data = { ...this.formData };
 
-            this.saving = true;
-            this.$http
-                .post('/metaTaskActivity/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(`/metaTaskActivity/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 || '删除失败');
-                    }
-                });
-        }
-    }
+			this.saving = true;
+			this.$http
+				.post('/metaTaskActivity/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(`/metaTaskActivity/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>

+ 176 - 176
src/main/vue/src/views/MetaTaskActivityList.vue

@@ -1,77 +1,77 @@
 <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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="title" label="标题"> </el-table-column>
-			<el-table-column prop="word" label="文字"> </el-table-column>
-			<el-table-column prop="picture" label="图片">
-				<template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.picture"
-						fit="cover"
-						:preview-src-list="[row.picture]"
-					>
-					</el-image>
-				</template>
-			</el-table-column>
-			<el-table-column prop="link" label="链接地址"> </el-table-column>
-			<el-table-column prop="publish" label="是否发布">
-				<template slot-scope="{ row }">
-					<el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
-				</template>
-			</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">
+    <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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="title" label="标题"> </el-table-column>
+            <el-table-column prop="word" label="文字"> </el-table-column>
+            <el-table-column prop="picture" label="图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.picture"
+                        fit="cover"
+                        :preview-src-list="[row.picture]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="link" label="链接地址"> </el-table-column>
+            <el-table-column prop="publish" label="是否发布">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
+                </template>
+            </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>
@@ -79,115 +79,115 @@
                     <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>
+            <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: 'MetaTaskActivityList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaTaskActivity/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaTaskActivityEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaTaskActivityEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaTaskActivity/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaTaskActivity/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaTaskActivityList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaTaskActivity/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaTaskActivityEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaTaskActivityEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaTaskActivity/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaTaskActivity/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 265 - 265
src/main/vue/src/views/MetaTaskEdit.vue

@@ -1,273 +1,273 @@
 <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="130px"
-					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="detail" label="详情" style="width: calc(100vw - 450px)">
-						<el-input
-							v-model="formData.detail"
-							type="textarea"
-							:autosize="{ minRows: 3, maxRows: 20 }"
-							placeholder="请输入任务详情"
-						>
-						</el-input>
-					</el-form-item>
-					<el-form-item prop="awardType" label="奖励类型">
-						<el-select
-							v-model="formData.awardType"
-							clearable
-							filterable
-							placeholder="请选择"
-							@change="changeAwardType"
-						>
-							<el-option
-								v-for="item in awardTypeOptions"
-								:key="item.value"
-								:label="item.label"
-								:value="item.value"
-							>
-							</el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item
-						prop="awardPic"
-						label="奖励图片"
-						v-if="formData.awardType && formData.awardType === 'NFT'"
-					>
-						<single-upload v-model="formData.awardPic"> </single-upload>
-					</el-form-item>
-					<el-form-item
-						prop="goldNum"
-						label="奖励金币数量"
-						v-if="formData.awardType && formData.awardType === 'GOLD'"
-					>
-						<el-input-number type="goldNum" v-model="formData.goldNum" :step="1" :min="1">
-						</el-input-number>
-						<div class="tip">输入规则:正整数,最小为1</div>
-					</el-form-item>
-					<el-form-item prop="type" label="任务类型">
-						<el-select v-model="formData.type" clearable filterable placeholder="请选择" @change="change">
-							<el-option
-								v-for="item in typeOptions"
-								:key="item.value"
-								:label="item.label"
-								:value="item.value"
-							>
-							</el-option>
-						</el-select>
-					</el-form-item>
-					<template v-if="formData.type">
-						<el-form-item v-if="formData.type === 'SIGN_IN_SINGLE_DAY'" prop="value" label="签到日期">
-							<el-date-picker
-								v-model="formData.value"
-								type="date"
-								value-format="yyyy-MM-dd"
-								placeholder="指定签到日期"
-							>
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item v-if="formData.type === 'SIGN_IN_CONTINUOUS'" prop="value" label="开始日期">
-							<el-date-picker
-								v-model="formData.value"
-								type="date"
-								value-format="yyyy-MM-dd"
-								placeholder="指定开始日期"
-							>
-							</el-date-picker>
-						</el-form-item>
-						<el-form-item prop="value" label="藏品id" v-if="formData.type === 'COLLECT_COLLECTION'">
-							<el-input v-model="formData.value" placeholder="请输入定藏品id"> </el-input>
-							<div class="tip">多个藏品id请用空格隔开 例如 111 222 333</div>
-						</el-form-item>
-						<el-form-item prop="value" label="次数" v-if="formData.type === 'ACCUMULATE'">
-							<el-input-number v-model="formData.value" :min="0"> </el-input-number>
-						</el-form-item>
-						<el-form-item prop="value" label="在线时长(min)" v-if="formData.type === 'ON_LINE_TIME_DAILY'">
-							<el-input-number v-model="formData.value" :min="0"> </el-input-number>
-						</el-form-item>
-					</template>
-					<el-form-item prop="publish" label="是否发布">
-						<el-switch v-model="formData.publish"> </el-switch>
-					</el-form-item>
-					<el-form-item prop="mark" label="是否展示角标">
-						<el-switch v-model="formData.mark"> </el-switch>
-					</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>
+    <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="130px"
+                    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="detail" label="详情" style="width: calc(100vw - 450px)">
+                        <el-input
+                            v-model="formData.detail"
+                            type="textarea"
+                            :autosize="{ minRows: 3, maxRows: 20 }"
+                            placeholder="请输入任务详情"
+                        >
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item prop="awardType" label="奖励类型">
+                        <el-select
+                            v-model="formData.awardType"
+                            clearable
+                            filterable
+                            placeholder="请选择"
+                            @change="changeAwardType"
+                        >
+                            <el-option
+                                v-for="item in awardTypeOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item
+                        prop="awardPic"
+                        label="奖励图片"
+                        v-if="formData.awardType && formData.awardType === 'NFT'"
+                    >
+                        <single-upload v-model="formData.awardPic"> </single-upload>
+                    </el-form-item>
+                    <el-form-item
+                        prop="goldNum"
+                        label="奖励金币数量"
+                        v-if="formData.awardType && formData.awardType === 'GOLD'"
+                    >
+                        <el-input-number type="goldNum" v-model="formData.goldNum" :step="1" :min="1">
+                        </el-input-number>
+                        <div class="tip">输入规则:正整数,最小为1</div>
+                    </el-form-item>
+                    <el-form-item prop="type" label="任务类型">
+                        <el-select v-model="formData.type" clearable filterable placeholder="请选择" @change="change">
+                            <el-option
+                                v-for="item in typeOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <template v-if="formData.type">
+                        <el-form-item v-if="formData.type === 'SIGN_IN_SINGLE_DAY'" prop="value" label="签到日期">
+                            <el-date-picker
+                                v-model="formData.value"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="指定签到日期"
+                            >
+                            </el-date-picker>
+                        </el-form-item>
+                        <el-form-item v-if="formData.type === 'SIGN_IN_CONTINUOUS'" prop="value" label="开始日期">
+                            <el-date-picker
+                                v-model="formData.value"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="指定开始日期"
+                            >
+                            </el-date-picker>
+                        </el-form-item>
+                        <el-form-item prop="value" label="藏品id" v-if="formData.type === 'COLLECT_COLLECTION'">
+                            <el-input v-model="formData.value" placeholder="请输入定藏品id"> </el-input>
+                            <div class="tip">多个藏品id请用空格隔开 例如 111 222 333</div>
+                        </el-form-item>
+                        <el-form-item prop="value" label="次数" v-if="formData.type === 'ACCUMULATE'">
+                            <el-input-number v-model="formData.value" :min="0"> </el-input-number>
+                        </el-form-item>
+                        <el-form-item prop="value" label="在线时长(min)" v-if="formData.type === 'ON_LINE_TIME_DAILY'">
+                            <el-input-number v-model="formData.value" :min="0"> </el-input-number>
+                        </el-form-item>
+                    </template>
+                    <el-form-item prop="publish" label="是否发布">
+                        <el-switch v-model="formData.publish"> </el-switch>
+                    </el-form-item>
+                    <el-form-item prop="mark" label="是否展示角标">
+                        <el-switch v-model="formData.mark"> </el-switch>
+                    </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: 'MetaTaskEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaTask/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'
-					}
-				],
-				detail: [
-					{
-						required: true,
-						message: '请输入任务详情',
-						trigger: 'blur'
-					}
-				],
-				type: [
-					{
-						required: true,
-						message: '请输入任务类型',
-						trigger: 'blur'
-					}
-				],
-				value: [
-					{
-						required: true,
-						message: '请指定参数配置',
-						trigger: 'blur'
-					}
-				],
-				goldNum: [
-					{
-						required: true,
-						message: '请输入奖励金币数量',
-						trigger: 'blur'
-					},
-					{
-						validator: (rule, value, callback) => {
-							if (!this.reg.test(value)) {
-								callback(new Error('奖励金币数量必须为大于1的整数'));
-								return;
-							} else {
-								callback();
-							}
-						}
-					}
-				],
-				awardType: [
-					{
-						required: true,
-						message: '请选择奖励类型',
-						trigger: 'blur'
-					}
-				],
-				awardPic: [
-					{
-						required: true,
-						message: '请上传奖励图片',
-						trigger: 'blur'
-					}
-				]
-			},
-			typeOptions: [
-				{ label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
-				{ label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
-				{ label: '收集藏品', value: 'COLLECT_COLLECTION' },
-				{ label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
-				{ label: '累计', value: 'ACCUMULATE' }
-			],
-			awardTypeOptions: [
-				{ label: 'NFT', value: 'NFT' },
-				{ label: '金币', value: 'GOLD' }
-			]
-		};
-	},
-	methods: {
-		changeAwardType(row) {
-			this.$delete(this.formData, 'awardPic');
-			this.$delete(this.formData, 'goldNum');
-		},
-		change() {
-			if (this.formData.value) {
-				this.$delete(this.formData, 'value');
-			}
-		},
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
+    name: 'MetaTaskEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaTask/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'
+                    }
+                ],
+                detail: [
+                    {
+                        required: true,
+                        message: '请输入任务详情',
+                        trigger: 'blur'
+                    }
+                ],
+                type: [
+                    {
+                        required: true,
+                        message: '请输入任务类型',
+                        trigger: 'blur'
+                    }
+                ],
+                value: [
+                    {
+                        required: true,
+                        message: '请指定参数配置',
+                        trigger: 'blur'
+                    }
+                ],
+                goldNum: [
+                    {
+                        required: true,
+                        message: '请输入奖励金币数量',
+                        trigger: 'blur'
+                    },
+                    {
+                        validator: (rule, value, callback) => {
+                            if (!this.reg.test(value)) {
+                                callback(new Error('奖励金币数量必须为大于1的整数'));
+                                return;
+                            } else {
+                                callback();
+                            }
+                        }
+                    }
+                ],
+                awardType: [
+                    {
+                        required: true,
+                        message: '请选择奖励类型',
+                        trigger: 'blur'
+                    }
+                ],
+                awardPic: [
+                    {
+                        required: true,
+                        message: '请上传奖励图片',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            typeOptions: [
+                { label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
+                { label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
+                { label: '收集藏品', value: 'COLLECT_COLLECTION' },
+                { label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
+                { label: '累计', value: 'ACCUMULATE' }
+            ],
+            awardTypeOptions: [
+                { label: 'NFT', value: 'NFT' },
+                { label: '金币', value: 'GOLD' }
+            ]
+        };
+    },
+    methods: {
+        changeAwardType(row) {
+            this.$delete(this.formData, 'awardPic');
+            this.$delete(this.formData, 'goldNum');
+        },
+        change() {
+            if (this.formData.value) {
+                this.$delete(this.formData, 'value');
+            }
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
 
-			this.saving = true;
-			this.$http
-				.post('/metaTask/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(`/metaTask/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 || '删除失败');
-					}
-				});
-		}
-	}
+            this.saving = true;
+            this.$http
+                .post('/metaTask/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(`/metaTask/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>

+ 238 - 238
src/main/vue/src/views/MetaTaskList.vue

@@ -1,248 +1,248 @@
 <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" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="createdAt" label="创建时间"> </el-table-column>
-            <el-table-column prop="name" label="任务名称"> </el-table-column>
-            <el-table-column prop="type" label="任务类型" :formatter="typeFormatter"> </el-table-column>
-            <el-table-column prop="value" label="配置值"> </el-table-column>
-            <el-table-column prop="detail" label="详情"> </el-table-column>
-            <el-table-column prop="awardType" label="奖励类型" :formatter="awardTypeFormatter"> </el-table-column>
-            <el-table-column prop="awardPic" label="奖励图片">
-                <template slot-scope="{ row }">
-                    <el-image
-                        style="width: 30px; height: 30px"
-                        :src="row.awardPic"
-                        fit="cover"
-                        :preview-src-list="[row.awardPic]"
-                    >
-                    </el-image>
-                </template>
-            </el-table-column>
-            <el-table-column prop="goldNum" label="奖励金币数量"> </el-table-column>
-            <el-table-column prop="publish" label="是否发布">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
-                </template>
-            </el-table-column>
-            <el-table-column prop="mark" label="是否展示角标">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.mark ? '' : 'info'"> {{ row.mark }} </el-tag>
-                </template>
-            </el-table-column>
-            <el-table-column prop="finish" label="是否结束">
-                <template slot-scope="{ row }">
-                    <el-tag :type="row.finish ? '' : 'info'"> {{ row.finish }} </el-tag>
-                </template>
-            </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" width="250">
-                <template slot-scope="{ row }">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain v-if="!row.finish">
-                        编辑
-                    </el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain> 删除 </el-button>
-                    <el-button @click="finish(row)" type="danger" size="mini" plain v-if="!row.finish">
-                        结束任务
-                    </el-button>
-                </template>
-            </el-table-column>
-        </el-table>
-        <div class="pagination-wrapper">
-            <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>
+	<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" label="ID" width="100"> </el-table-column>
+			<el-table-column prop="createdAt" label="创建时间"> </el-table-column>
+			<el-table-column prop="name" label="任务名称"> </el-table-column>
+			<el-table-column prop="type" label="任务类型" :formatter="typeFormatter"> </el-table-column>
+			<el-table-column prop="value" label="配置值"> </el-table-column>
+			<el-table-column prop="detail" label="详情"> </el-table-column>
+			<el-table-column prop="awardType" label="奖励类型" :formatter="awardTypeFormatter"> </el-table-column>
+			<el-table-column prop="awardPic" label="奖励图片">
+				<template slot-scope="{ row }">
+					<el-image
+						style="width: 30px; height: 30px"
+						:src="row.awardPic"
+						fit="cover"
+						:preview-src-list="[row.awardPic]"
+					>
+					</el-image>
+				</template>
+			</el-table-column>
+			<el-table-column prop="goldNum" label="奖励金币数量"> </el-table-column>
+			<el-table-column prop="publish" label="是否发布">
+				<template slot-scope="{ row }">
+					<el-tag :type="row.publish ? '' : 'info'"> {{ row.publish }} </el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column prop="mark" label="是否展示角标">
+				<template slot-scope="{ row }">
+					<el-tag :type="row.mark ? '' : 'info'"> {{ row.mark }} </el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column prop="finish" label="是否结束">
+				<template slot-scope="{ row }">
+					<el-tag :type="row.finish ? '' : 'info'"> {{ row.finish }} </el-tag>
+				</template>
+			</el-table-column>
+			<el-table-column label="操作" align="center" fixed="right" width="250">
+				<template slot-scope="{ row }">
+					<el-button @click="editRow(row)" type="primary" size="mini" plain v-if="!row.finish">
+						编辑
+					</el-button>
+					<el-button @click="deleteRow(row)" type="danger" size="mini" plain> 删除 </el-button>
+					<el-button @click="finish(row)" type="danger" size="mini" plain v-if="!row.finish">
+						结束任务
+					</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		<div class="pagination-wrapper">
+			<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: 'MetaTaskList',
-    mixins: [pageableTable],
-    data() {
-        return {
-            multipleMode: false,
-            search: '',
-            url: '/metaTask/all',
-            downloading: false,
-            typeOptions: [
-                { label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
-                { label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
-                { label: '收集藏品', value: 'COLLECT_COLLECTION' },
-                { label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
-                { label: '累计', value: 'ACCUMULATE' }
-            ],
-            awardTypeOptions: [
-                { label: 'NFT', value: 'NFT' },
-                { label: '金币', value: 'GOLD' }
-            ]
-        };
-    },
-    computed: {
-        selection() {
-            return this.$refs.table.selection.map(i => i.id);
-        }
-    },
-    methods: {
-        typeFormatter(row, column, cellValue, index) {
-            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
-            if (selectedOption) {
-                return selectedOption.label;
-            }
-            return '';
-        },
-        awardTypeFormatter(row, column, cellValue, index) {
-            let selectedOption = this.awardTypeOptions.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: '/metaTaskEdit',
-                query: {
-                    ...this.$route.query
-                }
-            });
-        },
-        editRow(row) {
-            this.$router.push({
-                path: '/metaTaskEdit',
-                query: {
-                    id: row.id
-                }
-            });
-        },
-        download() {
-            this.downloading = true;
-            this.$axios
-                .get('/metaTask/excel', {
-                    responseType: 'blob',
-                    params: { size: 10000, query: { del: false } }
-                })
-                .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) {
-            if (!row.finish) {
-                this.$alert('请先结束任务!', '警告', { type: 'error' });
-                return;
-            }
-            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post(`/metaTask/del/${row.id}`);
-                })
-                .then(() => {
-                    this.$message.success('删除成功');
-                    this.getData();
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        this.$message.error(e.error);
-                    }
-                });
-        },
-        finish(row) {
-            this.$alert('任务结束后在不能再被领取,确定要结束任务吗?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post(`/metaTask/${row.id}/finish`);
-                })
-                .then(() => {
-                    this.$message.success('结束成功');
-                    this.getData();
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        this.$message.error(e.error);
-                    }
-                });
-        }
-    }
+	name: 'MetaTaskList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			multipleMode: false,
+			search: '',
+			url: '/metaTask/all',
+			downloading: false,
+			typeOptions: [
+				{ label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
+				{ label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
+				{ label: '收集藏品', value: 'COLLECT_COLLECTION' },
+				{ label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
+				{ label: '累计', value: 'ACCUMULATE' }
+			],
+			awardTypeOptions: [
+				{ label: 'NFT', value: 'NFT' },
+				{ label: '金币', value: 'GOLD' }
+			]
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		typeFormatter(row, column, cellValue, index) {
+			let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+			if (selectedOption) {
+				return selectedOption.label;
+			}
+			return '';
+		},
+		awardTypeFormatter(row, column, cellValue, index) {
+			let selectedOption = this.awardTypeOptions.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: '/metaTaskEdit',
+				query: {
+					...this.$route.query
+				}
+			});
+		},
+		editRow(row) {
+			this.$router.push({
+				path: '/metaTaskEdit',
+				query: {
+					id: row.id
+				}
+			});
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaTask/excel', {
+					responseType: 'blob',
+					params: { size: 10000, query: { del: false } }
+				})
+				.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) {
+			if (!row.finish) {
+				this.$alert('请先结束任务!', '警告', { type: 'error' });
+				return;
+			}
+			this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaTask/del/${row.id}`);
+				})
+				.then(() => {
+					this.$message.success('删除成功');
+					this.getData();
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						this.$message.error(e.error);
+					}
+				});
+		},
+		finish(row) {
+			this.$alert('任务结束后在不能再被领取,确定要结束任务吗?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaTask/${row.id}/finish`);
+				})
+				.then(() => {
+					this.$message.success('结束成功');
+					this.getData();
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						this.$message.error(e.error);
+					}
+				});
+		}
+	}
 };
 </script>
 <style lang="less" scoped>

+ 145 - 145
src/main/vue/src/views/MetaTaskToUserList.vue

@@ -1,157 +1,157 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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" label="ID"> </el-table-column>
+    <div class="list-view">
+        <page-title>
+            <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" label="ID"> </el-table-column>
             <el-table-column prop="userId" label="用户id"> </el-table-column>
             <el-table-column prop="getTime" label="领取时间"> </el-table-column>
-			<el-table-column prop="finishTime" label="完成时间"> </el-table-column>
-			<el-table-column prop="taskId" label="任务id"> </el-table-column>
-			<el-table-column prop="taskName" label="任务名称"> </el-table-column>
-			<el-table-column prop="detail" label="详情"> </el-table-column>
-			<el-table-column prop="taskType" label="任务类型" :formatter="taskTypeFormatter"> </el-table-column>
-			<el-table-column prop="status" label="当前状态" :formatter="taskStatusFormatter"> </el-table-column>
-			<el-table-column prop="awardPic" label="奖励图片">
-				<template slot-scope="{ row }">
-					<el-image
-						style="width: 30px; height: 30px"
-						:src="row.awardPic"
-						fit="cover"
-						:preview-src-list="[row.awardPic]"
-					>
-					</el-image>
-				</template>
-			</el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+            <el-table-column prop="finishTime" label="完成时间"> </el-table-column>
+            <el-table-column prop="taskId" label="任务id"> </el-table-column>
+            <el-table-column prop="taskName" label="任务名称"> </el-table-column>
+            <el-table-column prop="detail" label="详情"> </el-table-column>
+            <el-table-column prop="taskType" label="任务类型" :formatter="taskTypeFormatter"> </el-table-column>
+            <el-table-column prop="status" label="当前状态" :formatter="taskStatusFormatter"> </el-table-column>
+            <el-table-column prop="awardPic" label="奖励图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.awardPic"
+                        fit="cover"
+                        :preview-src-list="[row.awardPic]"
+                    >
+                    </el-image>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaTaskToUserList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaTaskToUser/all',
-			downloading: false,
-			taskTypeOptions: [
-				{ label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
-				{ label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
-				{ label: '收集藏品', value: 'COLLECT_COLLECTION' },
-				{ label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
-				{ label: '累计', value: 'ACCUMULATE' }
-			],
-			taskStatusOptions: [
-				{ label: '领取', value: 'GET' },
-				{ label: '进行中', value: 'PROGRESS' },
-				{ label: '已完成', value: 'COMPLETION' },
-				{ label: '已结束', value: 'FINISH' }
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		taskTypeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.taskTypeOptions.find(i => i.value === cellValue);
-			if (selectedOption) {
-				return selectedOption.label;
-			}
-			return '';
-		},
-		taskStatusFormatter(row, column, cellValue, index) {
-			let selectedOption = this.taskStatusOptions.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();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaTaskToUser/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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);
-				});
-		}
-	}
+    name: 'MetaTaskToUserList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaTaskToUser/all',
+            downloading: false,
+            taskTypeOptions: [
+                { label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
+                { label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
+                { label: '收集藏品', value: 'COLLECT_COLLECTION' },
+                { label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
+                { label: '累计', value: 'ACCUMULATE' }
+            ],
+            taskStatusOptions: [
+                { label: '领取', value: 'GET' },
+                { label: '进行中', value: 'PROGRESS' },
+                { label: '已完成', value: 'COMPLETION' },
+                { label: '已结束', value: 'FINISH' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        taskTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.taskTypeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        taskStatusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.taskStatusOptions.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();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaTaskToUser/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 101 - 100
src/main/vue/src/views/MetaUserEdit.vue

@@ -1,61 +1,61 @@
 <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="108px"
-					label-position="right"
-					size="small"
-					style="max-width: 500px"
-				>
-					<el-form-item prop="phone" label="用户手机号">
-						<el-input type="number" v-model="formData.phone"> </el-input>
-					</el-form-item>
-					<el-form-item prop="allowLogin" label="是否允许登陆">
-						<el-switch v-model="formData.allowLogin"> </el-switch>
-					</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>
+    <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="108px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px"
+                >
+                    <el-form-item prop="phone" label="用户手机号">
+                        <el-input type="number" v-model="formData.phone"> </el-input>
+                    </el-form-item>
+                    <el-form-item prop="allowLogin" label="是否允许登陆">
+                        <el-switch v-model="formData.allowLogin"> </el-switch>
+                    </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: 'MetaUserEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaUser/get/' + this.$route.query.id)
-				.then(res => {
-					this.formData = res;
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-	},
-	data() {
-		return {
-			saving: false,
-			formData: {},
-			rules: {
-				phone: [
+    name: 'MetaUserEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaUser/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {
+                phone: [
                     {
                         required: true,
                         message: '请输入手机号',
@@ -67,54 +67,55 @@ export default {
                         trigger: 'blur'
                     }
                 ]
-			}
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
+            }
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
 
-			this.saving = true;
-			this.$http
-				.post('/metaUser/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(`/metaUser/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 || '删除失败');
-					}
-				});
-		}
-	}
+            this.saving = true;
+            this.$http
+                .post('/metaUser/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(`/metaUser/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>

+ 195 - 195
src/main/vue/src/views/MetaUserGoldList.vue

@@ -1,207 +1,207 @@
 <template>
-    <div class="list-view">
-        <page-title>
-            <el-button @click="addUserIds" type="primary" 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 prop="id" align="center" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="userId" align="center" label="玩家id"> </el-table-column>
-            <el-table-column prop="num" align="center" label="当前金币数量"> </el-table-column>
-        </el-table>
-        <el-dialog :visible.sync="showUserIdDialog" title="添加用户id" width="600px" :close-on-click-modal="false">
-            <el-form ref="userIdForm">
-                <el-form-item :rules="[{ required: true, message: '请输入用户id' }]">
-                    <el-input
-                        v-model="userIds"
-                        type="textarea"
-                        :autosize="{ minRows: 3, maxRows: 20 }"
-                        placeholder="可输入多个用户id,用空格分隔"
-                    >
-                    </el-input>
-                </el-form-item>
-            </el-form>
-            <div slot="footer">
-                <el-button @click="showUserIdDialog = false" size="mini"> 取消 </el-button>
-                <el-button @click="initUserGold" size="mini" :loading="loading" type="primary"> 确定 </el-button>
-            </div>
-        </el-dialog>
-        <div class="pagination-wrapper">
-            <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>
+	<div class="list-view">
+		<page-title>
+			<el-button @click="addUserIds" type="primary" 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 prop="id" align="center" label="ID" width="100"> </el-table-column>
+			<el-table-column prop="userId" align="center" label="玩家id"> </el-table-column>
+			<el-table-column prop="num" align="center" label="当前金币数量"> </el-table-column>
+		</el-table>
+		<el-dialog :visible.sync="showUserIdDialog" title="添加用户id" width="600px" :close-on-click-modal="false">
+			<el-form ref="userIdForm">
+				<el-form-item :rules="[{ required: true, message: '请输入用户id' }]">
+					<el-input
+						v-model="userIds"
+						type="textarea"
+						:autosize="{ minRows: 3, maxRows: 20 }"
+						placeholder="可输入多个用户id,用空格分隔"
+					>
+					</el-input>
+				</el-form-item>
+			</el-form>
+			<div slot="footer">
+				<el-button @click="showUserIdDialog = false" size="mini"> 取消 </el-button>
+				<el-button @click="initUserGold" size="mini" :loading="loading" type="primary"> 确定 </el-button>
+			</div>
+		</el-dialog>
+		<div class="pagination-wrapper">
+			<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: 'MetaUserGoldList',
-    mixins: [pageableTable],
-    data() {
-        return {
-            loading: false,
-            showUserIdDialog: false,
-            userIds: '',
-            multipleMode: false,
-            search: '',
-            url: '/metaUserGold/all',
-            downloading: false
-        };
-    },
-    computed: {
-        selection() {
-            return this.$refs.table.selection.map(i => i.id);
-        }
-    },
-    methods: {
-        beforeGetData() {
-            return { search: this.search, query: { del: false } };
-        },
-        toggleMultipleMode(multipleMode) {
-            this.multipleMode = multipleMode;
-            if (!multipleMode) {
-                this.$refs.table.clearSelection();
-            }
-        },
-        addRow() {
-            this.$router.push({
-                path: '/metaUserGoldEdit',
-                query: {
-                    ...this.$route.query
-                }
-            });
-        },
-        editRow(row) {
-            this.$router.push({
-                path: '/metaUserGoldEdit',
-                query: {
-                    id: row.id
-                }
-            });
-        },
-        download() {
-            this.downloading = true;
-            this.$axios
-                .get('/metaUserGold/excel', {
-                    responseType: 'blob',
-                    params: { size: 10000 ,query: { del: false }},
-                })
-                .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);
-                });
-        },
-        addUserIds() {
-            this.userIds = '';
-            this.showUserIdDialog = true;
-            if (this.$refs.userIdForm) {
-                this.$nextTick(() => {
-                    this.$refs.userIdForm.clearValidate();
-                });
-            }
-        },
-        initUserGold() {
-            this.loading = true;
-            this.$http
-                .get(`/metaUserGold/${this.userIds}/check`)
-                .then(res => {
-                    this.$alert('确定要初始化这些用户的金币数量吗?', '提示', { type: 'info' })
-                        .then(() => {
-                            return this.$http.post(`/metaUserGold/${this.userIds}/init`);
-                        })
-                        .then(() => {
-                            this.loading = false;
-                            this.showUserIdDialog = false;
-                            this.$message.success('初始化成功');
-                            this.getData();
-                        })
-                        .catch(e => {
+	name: 'MetaUserGoldList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			loading: false,
+			showUserIdDialog: false,
+			userIds: '',
+			multipleMode: false,
+			search: '',
+			url: '/metaUserGold/all',
+			downloading: false
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		beforeGetData() {
+			return { search: this.search, query: { del: false } };
+		},
+		toggleMultipleMode(multipleMode) {
+			this.multipleMode = multipleMode;
+			if (!multipleMode) {
+				this.$refs.table.clearSelection();
+			}
+		},
+		addRow() {
+			this.$router.push({
+				path: '/metaUserGoldEdit',
+				query: {
+					...this.$route.query
+				}
+			});
+		},
+		editRow(row) {
+			this.$router.push({
+				path: '/metaUserGoldEdit',
+				query: {
+					id: row.id
+				}
+			});
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaUserGold/excel', {
+					responseType: 'blob',
+					params: { size: 10000, query: { del: false } }
+				})
+				.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);
+				});
+		},
+		addUserIds() {
+			this.userIds = '';
+			this.showUserIdDialog = true;
+			if (this.$refs.userIdForm) {
+				this.$nextTick(() => {
+					this.$refs.userIdForm.clearValidate();
+				});
+			}
+		},
+		initUserGold() {
+			this.loading = true;
+			this.$http
+				.get(`/metaUserGold/${this.userIds}/check`)
+				.then(res => {
+					this.$alert('确定要初始化这些用户的金币数量吗?', '提示', { type: 'info' })
+						.then(() => {
+							return this.$http.post(`/metaUserGold/${this.userIds}/init`);
+						})
+						.then(() => {
+							this.loading = false;
+							this.showUserIdDialog = false;
+							this.$message.success('初始化成功');
+							this.getData();
+						})
+						.catch(e => {
 							this.$message.error(e.error);
-                            this.loading = false;
-                        });
-                })
-                .catch(e => {
+							this.loading = false;
+						});
+				})
+				.catch(e => {
 					this.$message.error(e.error);
-                    this.loading = false;
-                });
-        },
-        operation1() {
-            this.$notify({
-                title: '提示',
-                message: this.selection
-            });
-        },
-        operation2() {
-            this.$message('操作2');
-        },
-        deleteRow(row) {
-            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post(`/metaUserGold/del/${row.id}`);
-                })
-                .then(() => {
-                    this.$message.success('删除成功');
-                    this.getData();
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        this.$message.error(e.error);
-                    }
-                });
-        }
-    }
+					this.loading = false;
+				});
+		},
+		operation1() {
+			this.$notify({
+				title: '提示',
+				message: this.selection
+			});
+		},
+		operation2() {
+			this.$message('操作2');
+		},
+		deleteRow(row) {
+			this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaUserGold/del/${row.id}`);
+				})
+				.then(() => {
+					this.$message.success('删除成功');
+					this.getData();
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						this.$message.error(e.error);
+					}
+				});
+		}
+	}
 };
 </script>
 <style lang="less" scoped>

+ 150 - 150
src/main/vue/src/views/MetaUserGoldRecordList.vue

@@ -1,42 +1,42 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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 prop="id" align="center" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="userId" align="center" label="用户id"> </el-table-column>
-			<el-table-column prop="createdAt" align="center" label="操作时间"> </el-table-column>
-			<el-table-column prop="beforeNum" align="center" label="操作前金币数量"> </el-table-column>
+    <div class="list-view">
+        <page-title>
+            <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 prop="id" align="center" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="userId" align="center" label="用户id"> </el-table-column>
+            <el-table-column prop="createdAt" align="center" label="操作时间"> </el-table-column>
+            <el-table-column prop="beforeNum" align="center" label="操作前金币数量"> </el-table-column>
             <el-table-column prop="operationNum" align="center" label="本次操作金币数量">
                 <template v-slot="{ row }">
                     <span :style="{ color: row.operationNum >= 0 ? '#f56c6c' : '#67c23a' }">
@@ -46,126 +46,126 @@
             </el-table-column>
             <el-table-column prop="operationNum" align="center" label="操作类型">
                 <template v-slot="{ row }">
-					<template v-if="row.beforeNum === 0 && row.operationNum === 0 && row.afterNum === 0">
-						{{ '初始化' }}
-					</template>
-					<template v-else>
-						{{ row.operationNum >= 0 ? '收入' : '支出' }}
-					</template>
+                    <template v-if="row.beforeNum === 0 && row.operationNum === 0 && row.afterNum === 0">
+                        {{ '初始化' }}
+                    </template>
+                    <template v-else>
+                        {{ row.operationNum >= 0 ? '收入' : '支出' }}
+                    </template>
                 </template>
             </el-table-column>
-			<el-table-column prop="afterNum" align="center" label="操作后金币数量"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+            <el-table-column prop="afterNum" align="center" label="操作后金币数量"> </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaUserGoldRecordList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaUserGoldRecord/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaUserGoldRecordEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaUserGoldRecordEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaUserGoldRecord/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaUserGoldRecord/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaUserGoldRecordList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaUserGoldRecord/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaUserGoldRecordEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaUserGoldRecordEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaUserGoldRecord/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaUserGoldRecord/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 156 - 155
src/main/vue/src/views/MetaUserList.vue

@@ -1,58 +1,58 @@
 <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">
+    <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" label="ID" width="100"> </el-table-column>
-			<el-table-column prop="phone" label="用户手机号"> </el-table-column>
-			<el-table-column prop="allowLogin" label="是否允许登陆">
-				<template slot-scope="{ row }">
-					<el-tag :type="row.allowLogin ? '' : 'info'"> {{ row.allowLogin }} </el-tag>
-				</template>
-			</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">
+        </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" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="phone" label="用户手机号"> </el-table-column>
+            <el-table-column prop="allowLogin" label="是否允许登陆">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.allowLogin ? '' : 'info'"> {{ row.allowLogin }} </el-tag>
+                </template>
+            </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>
@@ -60,116 +60,117 @@
                     <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>
+            <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: 'MetaUserList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaUser/all',
-			downloading: false
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		beforeGetData() {
-			return { search: this.search, query: { del: false } };
-		},
-		toggleMultipleMode(multipleMode) {
-			this.multipleMode = multipleMode;
-			if (!multipleMode) {
-				this.$refs.table.clearSelection();
-			}
-		},
-		addRow() {
-			this.$router.push({
-				path: '/metaUserEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaUserEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaUser/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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(`/metaUser/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaUserList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaUser/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search, query: { del: false } };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/metaUserEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaUserEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaUser/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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(`/metaUser/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>

+ 118 - 118
src/main/vue/src/views/MetaUserTaskProgressList.vue

@@ -1,130 +1,130 @@
 <template>
-	<div class="list-view">
-		<page-title>
-			<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>
+    <div class="list-view">
+        <page-title>
+            <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="userId" label="用户id"> </el-table-column>
             <el-table-column prop="createdAt" label="操作时间"> </el-table-column>
-			<el-table-column prop="metaTaskToUserId" label="玩家领取任务记录id"> </el-table-column>
-			<el-table-column prop="taskId" label="任务id"> </el-table-column>
-			<el-table-column prop="taskType" label="任务类型" :formatter="taskTypeFormatter"> </el-table-column>
-			<el-table-column prop="remark" label="备注"> </el-table-column>
-		</el-table>
-		<div class="pagination-wrapper">
-			<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>
+            <el-table-column prop="metaTaskToUserId" label="玩家领取任务记录id"> </el-table-column>
+            <el-table-column prop="taskId" label="任务id"> </el-table-column>
+            <el-table-column prop="taskType" label="任务类型" :formatter="taskTypeFormatter"> </el-table-column>
+            <el-table-column prop="remark" label="备注"> </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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: 'MetaUserTaskProgressList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaUserTaskProgress/all',
-			downloading: false,
-			taskTypeOptions: [
-				{ label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
-				{ label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
-				{ label: '收集藏品', value: 'COLLECT_COLLECTION' },
-				{ label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
-				{ label: '累计', value: 'ACCUMULATE' }
-			]
-		};
-	},
-	computed: {
-		selection() {
-			return this.$refs.table.selection.map(i => i.id);
-		}
-	},
-	methods: {
-		taskTypeFormatter(row, column, cellValue, index) {
-			let selectedOption = this.taskTypeOptions.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();
-			}
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaUserTaskProgress/excel', {
-					responseType: 'blob',
-					params: { size: 10000 ,query: { del: false }},
-				})
-				.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);
-				});
-		}
-	}
+    name: 'MetaUserTaskProgressList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaUserTaskProgress/all',
+            downloading: false,
+            taskTypeOptions: [
+                { label: '单日签到', value: 'SIGN_IN_SINGLE_DAY' },
+                { label: '连续多日签到', value: 'SIGN_IN_CONTINUOUS' },
+                { label: '收集藏品', value: 'COLLECT_COLLECTION' },
+                { label: '每日在线时长', value: 'ON_LINE_TIME_DAILY' },
+                { label: '累计', value: 'ACCUMULATE' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        taskTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.taskTypeOptions.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();
+            }
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaUserTaskProgress/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000, query: { del: false } }
+                })
+                .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);
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>

+ 144 - 144
src/main/vue/src/views/MetaZombieEdit.vue

@@ -1,26 +1,26 @@
 <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="178px"
-					label-position="right"
-					size="small"
-					style="max-width: 500px"
-				>
-					<el-form-item prop="name" label="配置名称">
-						<el-input v-model="formData.name"> </el-input>
+    <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="178px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px"
+                >
+                    <el-form-item prop="name" label="配置名称">
+                        <el-input v-model="formData.name"> </el-input>
                         <div class="tip">配置名称不可重复</div>
-					</el-form-item>
-					<el-form-item prop="type" label="僵尸类型">
+                    </el-form-item>
+                    <el-form-item prop="type" label="僵尸类型">
                         <el-select v-model="formData.type" clearable filterable placeholder="请选择">
                             <el-option
                                 v-for="item in typeOptions"
@@ -31,134 +31,134 @@
                             </el-option>
                         </el-select>
                     </el-form-item>
-					<el-form-item prop="zombieIntegral" label="僵尸积分">
-						<el-input-number type="number" v-model="formData.zombieIntegral"> </el-input-number>
-					</el-form-item>
-					<el-form-item prop="zombieAttackDamage" label="僵尸攻击伤害">
-						<el-input-number type="number" v-model="formData.zombieAttackDamage"> </el-input-number>
-					</el-form-item>
-					<el-form-item prop="zombieBlood" label="僵尸血量">
-						<el-input-number type="number" v-model="formData.zombieBlood"> </el-input-number>
-					</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>
+                    <el-form-item prop="zombieIntegral" label="僵尸积分">
+                        <el-input-number type="number" v-model="formData.zombieIntegral"> </el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="zombieAttackDamage" label="僵尸攻击伤害">
+                        <el-input-number type="number" v-model="formData.zombieAttackDamage"> </el-input-number>
+                    </el-form-item>
+                    <el-form-item prop="zombieBlood" label="僵尸血量">
+                        <el-input-number type="number" v-model="formData.zombieBlood"> </el-input-number>
+                    </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: 'MetaZombieEdit',
-	created() {
-		if (this.$route.query.id) {
-			this.$http
-				.get('metaZombie/get/' + this.$route.query.id)
-				.then(res => {
-					this.formData = res;
-				})
-				.catch(e => {
-					console.log(e);
-					this.$message.error(e.error);
-				});
-		}
-	},
-	data() {
-		return {
-			typeOptions: [
-				{ label: '普通僵尸', value: 'COMMON' },
+    name: 'MetaZombieEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('metaZombie/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            typeOptions: [
+                { label: '普通僵尸', value: 'COMMON' },
                 { label: '特殊僵尸', value: 'SPECIAL' }
-			],
-			saving: false,
-			formData: {},
-			rules: {
-				name: [
-					{
-						required: true,
-						message: '请输入配置名称',
-						trigger: 'blur'
-					}
-				],
-				zombieIntegral: [
-					{
-						required: true,
-						message: '请输入僵尸积分',
-						trigger: 'blur'
-					}
-				],
-				zombieAttackDamage: [
-					{
-						required: true,
-						message: '请输入僵尸攻击伤害',
-						trigger: 'blur'
-					}
-				],
-				zombieBlood: [
-					{
-						required: true,
-						message: '请输入僵尸血量',
-						trigger: 'blur'
-					}
-				],
-				type: [
-					{
-						required: true,
-						message: '请选择僵尸类型',
-						trigger: 'blur'
-					}
-				]
-			}
-		};
-	},
-	methods: {
-		onSave() {
-			this.$refs.form.validate(valid => {
-				if (valid) {
-					this.submit();
-				} else {
-					return false;
-				}
-			});
-		},
-		submit() {
-			let data = { ...this.formData };
+            ],
+            saving: false,
+            formData: {},
+            rules: {
+                name: [
+                    {
+                        required: true,
+                        message: '请输入配置名称',
+                        trigger: 'blur'
+                    }
+                ],
+                zombieIntegral: [
+                    {
+                        required: true,
+                        message: '请输入僵尸积分',
+                        trigger: 'blur'
+                    }
+                ],
+                zombieAttackDamage: [
+                    {
+                        required: true,
+                        message: '请输入僵尸攻击伤害',
+                        trigger: 'blur'
+                    }
+                ],
+                zombieBlood: [
+                    {
+                        required: true,
+                        message: '请输入僵尸血量',
+                        trigger: 'blur'
+                    }
+                ],
+                type: [
+                    {
+                        required: true,
+                        message: '请选择僵尸类型',
+                        trigger: 'blur'
+                    }
+                ]
+            }
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
 
-			this.saving = true;
-			this.$http
-				.post('/metaZombie/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(`/metaZombie/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 || '删除失败');
-					}
-				});
-		}
-	}
+            this.saving = true;
+            this.$http
+                .post('/metaZombie/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(`/metaZombie/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>

+ 185 - 187
src/main/vue/src/views/MetaZombieList.vue

@@ -1,64 +1,63 @@
 <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="type" align="center" label="僵尸类型" :formatter="typeFormatter"> </el-table-column>
-            <el-table-column prop="zombieIntegral" align="center" label="僵尸积分" > </el-table-column>
-            <el-table-column prop="zombieAttackDamage" align="center" label="僵尸攻击伤害" >
-            </el-table-column>
-            <el-table-column prop="zombieBlood" align="center" label="僵尸血量" > </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right">
-                <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">
+	<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="type" align="center" label="僵尸类型" :formatter="typeFormatter"> </el-table-column>
+			<el-table-column prop="zombieIntegral" align="center" label="僵尸积分"> </el-table-column>
+			<el-table-column prop="zombieAttackDamage" align="center" label="僵尸攻击伤害"> </el-table-column>
+			<el-table-column prop="zombieBlood" align="center" label="僵尸血量"> </el-table-column>
+			<el-table-column label="操作" align="center" fixed="right">
+				<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>
@@ -66,147 +65,146 @@
                     <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>
+			<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: 'MetaZombieList',
-    mixins: [pageableTable],
-    data() {
-        return {
-            typeOptions: [
+	name: 'MetaZombieList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			typeOptions: [
 				{ label: '普通僵尸', value: 'COMMON' },
-                { label: '特殊僵尸', value: 'SPECIAL' }
+				{ label: '特殊僵尸', value: 'SPECIAL' }
 			],
-            multipleMode: false,
-            search: '',
-            url: '/metaZombie/all',
-            downloading: false
-        };
-    },
-    computed: {
-        selection() {
-            return this.$refs.table.selection.map(i => i.id);
-        }
-    },
-    methods: {
-        typeFormatter(row, column, cellValue, index) {
+			multipleMode: false,
+			search: '',
+			url: '/metaZombie/all',
+			downloading: false
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		typeFormatter(row, column, cellValue, index) {
 			let selectedOption = this.typeOptions.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: '/metaZombieEdit',
-                query: {
-                    ...this.$route.query
-                }
-            });
-        },
-        editRow(row) {
-            this.$router.push({
-                path: '/metaZombieEdit',
-                query: {
-                    id: row.id
-                }
-            });
-        },
-        download() {
-            this.downloading = true;
-            this.$axios
-                .get('/metaZombie/excel', {
-                    responseType: 'blob',
-                    params: { size: 10000 ,query: { del: false }},
-                })
-                .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.$http
-                .get(`/metaZombie/checkApplication/${row.id}`)
-                .then(() => {
-                    this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-                        .then(() => {
-                            return this.$http.post(`/metaZombie/del/${row.id}`);
-                        })
-                        .then(() => {
-                            this.$message.success('删除成功');
-                            this.getData();
-                        })
-                        .catch(e => {
-                            if (e !== 'cancel') {
-                                this.$message.error(e.error);
-                            }
-                        });
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        this.$alert(e.error, '提示', { type: 'info', confirmButtonText: '删除应用数据' })
-                            .then(() => {
-                                return this.$http.post(`/metaGameCopy/${row.id}/delMetaZombieId`);
-                            })
-                            .then(() => {
-                                this.$message.success('删除应用数据成功,当前您可以删除该配置');
-                                
-                            })
-                            .catch(e => {
-                                if (e !== 'cancel') {
-                                    this.$message.error(e.error);
-                                }
-                            });
-                    }
-                });
-        }
-    }
+		beforeGetData() {
+			return { search: this.search, query: { del: false } };
+		},
+		toggleMultipleMode(multipleMode) {
+			this.multipleMode = multipleMode;
+			if (!multipleMode) {
+				this.$refs.table.clearSelection();
+			}
+		},
+		addRow() {
+			this.$router.push({
+				path: '/metaZombieEdit',
+				query: {
+					...this.$route.query
+				}
+			});
+		},
+		editRow(row) {
+			this.$router.push({
+				path: '/metaZombieEdit',
+				query: {
+					id: row.id
+				}
+			});
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaZombie/excel', {
+					responseType: 'blob',
+					params: { size: 10000, query: { del: false } }
+				})
+				.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.$http
+				.get(`/metaZombie/checkApplication/${row.id}`)
+				.then(() => {
+					this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+						.then(() => {
+							return this.$http.post(`/metaZombie/del/${row.id}`);
+						})
+						.then(() => {
+							this.$message.success('删除成功');
+							this.getData();
+						})
+						.catch(e => {
+							if (e !== 'cancel') {
+								this.$message.error(e.error);
+							}
+						});
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						this.$alert(e.error, '提示', { type: 'info', confirmButtonText: '删除应用数据' })
+							.then(() => {
+								return this.$http.post(`/metaGameCopy/${row.id}/delMetaZombieId`);
+							})
+							.then(() => {
+								this.$message.success('删除应用数据成功,当前您可以删除该配置');
+							})
+							.catch(e => {
+								if (e !== 'cancel') {
+									this.$message.error(e.error);
+								}
+							});
+					}
+				});
+		}
+	}
 };
 </script>
 <style lang="less" scoped>