Browse Source

抽奖活动自动领取奖励

sunkean 3 years ago
parent
commit
8549332611

+ 8 - 0
src/main/java/com/izouma/nineth/domain/MetaLuckyDraw.java

@@ -67,4 +67,12 @@ public class MetaLuckyDraw extends BaseEntity {
     @ApiModelProperty("是否发布")
     @ExcelProperty("是否发布")
     private boolean publish;
+
+    @ApiModelProperty("道具id")
+    @ExcelProperty("道具id")
+    private Long metaPropId;
+
+    @ApiModelProperty("道具数量")
+    @ExcelProperty("道具数量")
+    private int metaPropNum;
 }

+ 10 - 5
src/main/java/com/izouma/nineth/enums/EntryModeType.java

@@ -1,15 +1,20 @@
 package com.izouma.nineth.enums;
 
-import io.swagger.annotations.ApiModel;
-
-@ApiModel("元宇宙游戏入场方式枚举")
 public enum EntryModeType {
 
+    GOLD("金币"),
+
     NFT("NFT"),
 
-    GOLD("金币"),
+    META_PROP("元宇宙道具"),
+
+    GOLD_OR_NFT("金币或NFT"),
+
+    GOLD_OR_META_PROP("金币或道具"),
+
+    NFT_OR_META_PROP("NFT或道具"),
 
-    GOLD_OR_NFT("金币或NFT");
+    GOLD_OR_NFT_OR_META_PROP("金币或NFT或道具");
 
     private final String description;
 

+ 56 - 7
src/main/java/com/izouma/nineth/service/MetaLuckyDrawAwardReceiveRecordService.java

@@ -1,12 +1,13 @@
 package com.izouma.nineth.service;
 
 import com.izouma.nineth.annotations.RedisLock;
-import com.izouma.nineth.domain.MetaLuckyDraw;
-import com.izouma.nineth.domain.MetaLuckyDrawAwardModel;
-import com.izouma.nineth.domain.MetaLuckyDrawAwardReceiveRecord;
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.MetaServiceResult;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.MetaAwardTypeEnum;
+import com.izouma.nineth.enums.MetaPropOperationType;
 import com.izouma.nineth.repo.MetaLuckyDrawAwardReceiveRecordRepo;
 import com.izouma.nineth.repo.MetaLuckyDrawRepo;
 import com.izouma.nineth.utils.JpaUtils;
@@ -14,9 +15,11 @@ import com.izouma.nineth.utils.LotteryUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
@@ -30,15 +33,17 @@ public class MetaLuckyDrawAwardReceiveRecordService {
 
     private MetaLuckyDrawRepo metaLuckyDrawRepo;
 
+    private MetaUserGoldService metaUserGoldService;
+
+    private MetaUserPropService metaUserPropService;
+
     public Page<MetaLuckyDrawAwardReceiveRecord> all(PageQuery pageQuery) {
         return metaLuckyDrawAwardReceiveRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaLuckyDrawAwardReceiveRecord.class), JpaUtils.toPageRequest(pageQuery));
     }
 
     @RedisLock("#metaLuckyDrawId")
+    @Transactional
     public MetaRestResult<MetaLuckyDrawAwardReceiveRecord> save(Long metaLuckyDrawId) {
-        if (Objects.isNull(metaLuckyDrawId)) {
-            return MetaRestResult.returnError("Illegal parameter : metaLuckyDrawId must be null");
-        }
         Long userId = SecurityUtils.getAuthenticatedUser().getId();
         MetaLuckyDraw metaLuckyDraw = metaLuckyDrawRepo.findById(metaLuckyDrawId).orElse(null);
         if (Objects.isNull(metaLuckyDraw)) {
@@ -50,7 +55,7 @@ public class MetaLuckyDrawAwardReceiveRecordService {
         }
         List<MetaLuckyDrawAwardModel> newMetaLuckDrawAwards = new ArrayList<>();
         metaLuckDrawAwards.forEach(metaLuckyDrawAwardModel -> {
-            if (metaLuckyDrawAwardModel.getAwardType().equals(MetaAwardTypeEnum.NFT) && metaLuckyDrawAwardModel.isLimitNum()) {
+            if ((metaLuckyDrawAwardModel.getAwardType().equals(MetaAwardTypeEnum.NFT) || metaLuckyDrawAwardModel.getAwardType().equals(MetaAwardTypeEnum.META_PROP)) && metaLuckyDrawAwardModel.isLimitNum()) {
                 int count = metaLuckyDrawAwardReceiveRecordRepo.countByMetaLuckyDrawIdAndMetaLuckDrawAwardName(metaLuckyDrawId, metaLuckyDrawAwardModel.getName());
                 if (count < metaLuckyDrawAwardModel.getMaxNum()) {
                     newMetaLuckDrawAwards.add(metaLuckyDrawAwardModel);
@@ -69,7 +74,51 @@ public class MetaLuckyDrawAwardReceiveRecordService {
         metaLuckyDrawAwardReceiveRecord.setFinishTime(LocalDateTime.now());
         metaLuckyDrawAwardReceiveRecord.setMetaLuckDrawAward(metaLuckyDrawAwardModel);
         metaLuckyDrawAwardReceiveRecord.setMetaLuckDrawAwardName(metaLuckyDrawAwardModel.getName());
+        // 自动领取奖励
+        MetaServiceResult receive = receive(userId, metaLuckyDrawAwardModel);
+        if (!receive.isSuccess()) {
+            // 抽奖记录正常保存,返回自动领奖错误信息!
+            metaLuckyDrawAwardReceiveRecordRepo.save(metaLuckyDrawAwardReceiveRecord);
+            return MetaRestResult.returnError(receive.getMessage());
+        }
         return MetaRestResult.returnSuccess(metaLuckyDrawAwardReceiveRecordRepo.save(metaLuckyDrawAwardReceiveRecord));
     }
 
+    @Transactional
+    public MetaServiceResult receive(Long userId, MetaLuckyDrawAwardModel metaLuckyDrawAwardModel) {
+        switch (metaLuckyDrawAwardModel.getAwardType()) {
+            case NULL:
+                return MetaServiceResult.returnSuccess("奖励类型为空");
+            case GOLD:
+                MetaRestResult<MetaUserGold> restResult;
+                try {
+                    restResult = metaUserGoldService.changeNum(userId, Integer.parseInt(metaLuckyDrawAwardModel.getConfig()));
+                } catch (Exception e) {
+                    return MetaServiceResult.returnError(String.format("金币奖励领取发生异常[%S]", e.getMessage()));
+                }
+                if (Constants.MetaRestCode.success != restResult.getCode()) {
+                    return MetaServiceResult.returnError(restResult.getMessage());
+                }
+                return MetaServiceResult.returnSuccess("金币奖励领取成功,已自动加入金币余额");
+            case META_PROP:
+                if (StringUtils.isBlank(metaLuckyDrawAwardModel.getConfig())) {
+                    return MetaServiceResult.returnError("道具id不能为空");
+                }
+                Long metaPropId = Long.parseLong(metaLuckyDrawAwardModel.getConfig());
+                MetaRestResult<MetaUserProp> operate;
+                try {
+                    operate = metaUserPropService.operate(userId, metaPropId, MetaPropOperationType.RECEIVE);
+                } catch (Exception e) {
+                    return MetaServiceResult.returnError(String.format("道具奖励领取发生异常[%S]", e.getMessage()));
+                }
+                if (Constants.MetaRestCode.success != operate.getCode()) {
+                    return MetaServiceResult.returnError(operate.getMessage());
+                }
+                return MetaServiceResult.returnSuccess("道具奖励领取成功,已放入玩家背包中");
+            case NFT:
+                return MetaServiceResult.returnSuccess("NFT奖励领取成功,将在指定时间统一发放给用户");
+            default:
+                return MetaServiceResult.returnError("不存在的奖励类型");
+        }
+    }
 }

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

@@ -30,6 +30,7 @@ public class MetaUserPropService {
         return metaUserPropRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaUserProp.class), JpaUtils.toPageRequest(pageQuery));
     }
 
+    @Transactional
     public MetaRestResult<MetaUserProp> operate(Long userId, Long metaPropId, MetaPropOperationType operationType) {
         if (Objects.isNull(metaPropId)) {
             return MetaRestResult.returnError("Illegal parameter : metaPropId can not be null");

+ 0 - 32
src/main/java/com/izouma/nineth/web/MetaLuckyDrawController.java

@@ -3,7 +3,6 @@ package com.izouma.nineth.web;
 import com.izouma.nineth.domain.MetaLuckyDraw;
 import com.izouma.nineth.domain.MetaLuckyDrawAwardModel;
 import com.izouma.nineth.dto.PageQuery;
-import com.izouma.nineth.enums.EntryModeType;
 import com.izouma.nineth.enums.MetaAwardTypeEnum;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.MetaLuckyDrawRepo;
@@ -65,37 +64,6 @@ public class MetaLuckyDrawController extends BaseController {
         if (record.getId() != null) {
             MetaLuckyDraw orig = metaLuckyDrawRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, record);
-            // 奖励配置为空重置奖励配置
-            if (CollectionUtils.isEmpty(metaLuckDrawAwards)) {
-                orig.setMetaLuckDrawAwards(null);
-            }
-            // NFT入场,重置金币入场数据
-            if (record.getEntryModeType().equals(EntryModeType.NFT)) {
-                record.setGoldNum(0);
-                // NFT入场 人工审核 重置自动匹配规则
-                if (record.isAudit()) {
-                    orig.setRule(null);
-                } else {
-                    // NFT入场 自动匹配 重置人工审核
-                    orig.setCollectionName(null);
-                }
-            }
-            // 金币入场 重置NFT入场规则
-            if (record.getEntryModeType().equals(EntryModeType.GOLD)) {
-                orig.setRule(null);
-                orig.setCollectionName(null);
-                orig.setNum(0);
-            }
-            // 金币或NFT入场
-            if (record.getEntryModeType().equals(EntryModeType.GOLD_OR_NFT)) {
-                // 人工审核 重置自动匹配规则
-                if (record.isAudit()) {
-                    orig.setRule(null);
-                } else {
-                    // 自动匹配 重置人工审核
-                    orig.setCollectionName(null);
-                }
-            }
             return metaLuckyDrawRepo.save(orig);
         }
         return metaLuckyDrawRepo.save(record);

+ 6 - 9
src/main/vue/src/views/MetaGameCopyEdit.vue

@@ -57,12 +57,12 @@
 					</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 :label="true"  @change="auditChange"> 人工审核 </el-radio>
+							<el-radio :label="false"  @change="auditChange"> 自动匹配 </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-input v-model="formData.collectionName" 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">
@@ -81,7 +81,6 @@
 						<el-input-number
 							type="number"
 							v-model="formData.num"
-							:disabled="!canEdit"
 							:step="1"
 							:min="0"
 							class="width1"
@@ -406,11 +405,6 @@ export default {
 			]
 		};
 	},
-	computed: {
-		canEdit() {
-			return !!!this.$route.query.id;
-		}
-	},
 	methods: {
 		changeGameName() {
 			this.$delete(this.formData, 'metaZombieIds');
@@ -420,6 +414,9 @@ export default {
 		},
 		nftChange() {
 			this.$delete(this.formData, 'audit');
+			this.auditChange()
+		},
+        auditChange() {
 			this.$delete(this.formData, 'collectionName');
 			this.$delete(this.formData, 'rule');
 			this.$delete(this.formData, 'num');

+ 616 - 473
src/main/vue/src/views/MetaLuckyDrawEdit.vue

@@ -1,491 +1,634 @@
 <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="name" label="活动名称">
-                        <el-input v-model="formData.name"> </el-input>
-                    </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" 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"
-                            :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="metaLuckDrawAwards"
-                        label="奖励配置"
-                        style="width: calc(100vw - 450px)"
-                        size="mini"
-                    >
-                        <el-table :data="formData.metaLuckDrawAwards">
-                            <el-table-column prop="name" label="奖励名称" align="center">
-                                <template v-slot="{ row }">
-                                    <el-input v-model="row.name" style="width: 150px" placeholder="请输入奖励名称">
-                                    </el-input>
-                                    <div class="tip">奖励名称不可重复</div>
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="awardType" label="奖励类型" align="center">
-                                <template v-slot="{ row }">
-                                    <el-select
-                                        v-model="row.awardType"
-                                        clearable
-                                        filterable
-                                        placeholder="请选择"
-                                        style="width: 150px"
-                                        @change="changeAwardType(row)"
-                                    >
-                                        <el-option
-                                            v-for="item in entryModeTypeOptions"
-                                            :key="item.value"
-                                            :label="item.label"
-                                            :value="item.value"
-                                        >
-                                        </el-option>
-                                    </el-select>
-                                    <div class="tip">请选择奖励类型</div>
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="config" label="配置值(金币-数量/NFT-NFT图片)" align="center">
-                                <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="limitNum" label="是否限制数量" align="center">
-                                <template v-slot="{ row }">
-                                    <template v-if="row && row.awardType === 'NFT'">
-                                        <el-switch v-model="row.limitNum" @change="changeLimitNum(row)"> </el-switch>
-                                        <div class="tip">仅限NFT奖励</div>
-                                    </template>
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="maxNum" label="最大领取数量" align="center">
-                                <template v-slot="{ row }">
-                                    <template v-if="row && row.awardType === 'NFT' && row.limitNum">
-                                        <el-input-number v-model="row.maxNum" style="width: 150px" :step="1" :min="1">
-                                        </el-input-number>
-                                        <div class="tip">输入规则:正整数,最小为1</div>
-                                    </template>
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="probability" label="概率(%)" align="center">
-                                <template v-slot="{ row }">
-                                    <el-input-number
-                                        v-model="row.probability"
-                                        :step="1"
-                                        :min="1"
-                                        :max="100"
-                                        style="width: 150px"
-                                    >
-                                    </el-input-number>
-                                    <div class="tip">输入规则:正整数,最小为1,最大为100</div>
-                                </template>
-                            </el-table-column>
-                            <el-table-column width="100" 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="name" label="活动名称">
+						<el-input v-model="formData.name"> </el-input>
+					</el-form-item>
+					<el-form-item label="金币入场配置">
+						<el-checkbox v-model="gold" @change="goldChange" :disabled="!canEdit"> </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"
+							:disabled="!canEdit"
+						>
+						</el-input-number>
+						<div class="tip">输入规则:正整数,最小为1</div>
+					</el-form-item>
+					<el-form-item label="NFT入场配置">
+						<el-checkbox v-model="nft" @change="nftChange" :disabled="!canEdit"> </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" @change="auditChange" :disabled="!canEdit"> 人工审核 </el-radio>
+							<el-radio :label="false" @change="auditChange" :disabled="!canEdit"> 自动匹配 </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" class="width" :disabled="!canEdit"> </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" :disabled="!canEdit">
+									<el-option v-for="item in tags" :key="item.id" :value="item" :label="item.name">
+									</el-option>
+								</el-select>
+								<template v-if="canEdit">
+									<span style="padding: 0 10px; color: #606266; font-weight: bold"> ×&nbsp;1 </span>
+									<i @click="delRule(i)" class="el-icon-delete icon-del"> </i>
+								</template>
+							</div>
+						</template>
+						<el-button size="mini" @click="addRule" :disabled="!canEdit"> 添加 </el-button>
+					</el-form-item>
+					<el-form-item prop="num" label="所需nft数量" v-if="nft">
+						<el-input-number
+							type="number"
+							v-model="formData.num"
+							:step="1"
+							:min="0"
+							class="width1"
+							:disabled="!canEdit"
+						>
+						</el-input-number>
+						<div class="tip">0表示不限</div>
+					</el-form-item>
+					<el-form-item label="道具入场配置">
+						<el-checkbox v-model="metaProp" @change="metaPropChange" :disabled="!canEdit"> </el-checkbox>
+					</el-form-item>
+					<el-form-item prop="metaPropId" label="道具" v-if="metaProp">
+						<el-select
+							v-model="formData.metaPropId"
+							placeholder="请选择"
+							filterable
+							style="width: 150px"
+							:disabled="!canEdit"
+						>
+							<el-option v-for="item in metaProps" :key="item.id" :label="item.name" :value="item.id">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item prop="metaPropNum" label="所需道具数量" v-if="formData && formData.metaPropId">
+						<el-input-number
+							type="metaPropNum"
+							v-model="formData.metaPropNum"
+							:step="1"
+							:min="1"
+							class="width1"
+							:disabled="!canEdit"
+						>
+						</el-input-number>
+						<div class="tip">输入规则:正整数,最小为1</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="metaLuckDrawAwards"
+						label="奖励配置"
+						style="width: calc(100vw - 450px)"
+						size="mini"
+					>
+						<el-table :data="formData.metaLuckDrawAwards">
+							<el-table-column prop="name" label="奖励名称" align="center">
+								<template v-slot="{ row }">
+									<el-input
+										v-model="row.name"
+										style="width: 150px"
+										placeholder="请输入奖励名称"
+										:disabled="!canEdit"
+									>
+									</el-input>
+									<div class="tip">奖励名称不可重复</div>
+								</template>
+							</el-table-column>
+							<el-table-column prop="awardType" label="奖励类型" align="center">
+								<template v-slot="{ row }">
+									<el-select
+										:disabled="!canEdit"
+										v-model="row.awardType"
+										clearable
+										filterable
+										placeholder="请选择"
+										style="width: 150px"
+										@change="changeAwardType(row)"
+									>
+										<el-option
+											v-for="item in awardTypeOptions"
+											:key="item.value"
+											:label="item.label"
+											:value="item.value"
+										>
+										</el-option>
+									</el-select>
+									<div class="tip">请选择奖励类型</div>
+								</template>
+							</el-table-column>
+							<el-table-column prop="config" label="配置值(金币-数量/NFT-NFT图片)" align="center">
+								<template v-slot="{ row }">
+									<template v-if="row && row.awardType === 'GOLD'">
+										<el-input-number v-model="row.config" :step="1" :min="1" :disabled="!canEdit">
+										</el-input-number>
+										<div class="tip">输入规则:正整数,最小为1</div>
+									</template>
+									<template v-if="row && row.awardType === 'NFT'">
+										<single-upload v-model="row.config" :disabled="!canEdit"> </single-upload>
+									</template>
+									<template v-if="row && row.awardType === 'META_PROP'">
+										<el-select
+											:disabled="!canEdit"
+											v-model="row.config"
+											placeholder="请选择"
+											filterable
+											style="width: 150px"
+										>
+											<el-option
+												v-for="item in metaProps"
+												:key="item.id"
+												:label="item.name"
+												:value="item.id"
+											>
+											</el-option>
+										</el-select>
+										<div class="tip">请选择道具</div>
+									</template>
+								</template>
+							</el-table-column>
+							<el-table-column prop="limitNum" label="是否限制数量" align="center">
+								<template v-slot="{ row }">
+									<template v-if="row && (row.awardType === 'NFT' || row.awardType === 'META_PROP')">
+										<el-switch
+											v-model="row.limitNum"
+											@change="changeLimitNum(row)"
+											:disabled="!canEdit"
+										>
+										</el-switch>
+										<div class="tip">仅限NFT和道具奖励</div>
+									</template>
+								</template>
+							</el-table-column>
+							<el-table-column prop="maxNum" label="最大领取数量" align="center">
+								<template v-slot="{ row }">
+									<template
+										v-if="
+										    row &&
+										    (row.awardType === 'NFT' || row.awardType === 'META_PROP') &&
+										    row.limitNum
+										"
+									>
+										<el-input-number
+											v-model="row.maxNum"
+											style="width: 150px"
+											:step="1"
+											:min="1"
+											:disabled="!canEdit"
+										>
+										</el-input-number>
+										<div class="tip">输入规则:正整数,最小为1</div>
+									</template>
+								</template>
+							</el-table-column>
+							<el-table-column prop="probability" label="概率(%)" align="center">
+								<template v-slot="{ row }">
+									<el-input-number
+										v-model="row.probability"
+										:step="1"
+										:min="1"
+										:max="100"
+										style="width: 150px"
+									>
+									</el-input-number>
+									<div class="tip">输入规则:正整数,最小为1,最大为100</div>
+								</template>
+							</el-table-column>
+							<el-table-column width="100" align="center">
+								<template v-slot="{ row, $index }">
+									<el-button
+										type="danger"
+										plain
+										size="mini"
+										@click="delAward($index)"
+										:disabled="!canEdit"
+									>
+										删除
+									</el-button>
+								</template>
+							</el-table-column>
+						</el-table>
+					</el-form-item>
+					<el-form-item>
+						<el-button size="mini" @click="addAward" :disabled="!canEdit"> 添加配置 </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>
 import { reg } from '../util/regRules';
 export default {
-    name: 'MetaLuckyDrawEdit',
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get('metaLuckyDraw/get/' + this.$route.query.id)
-                .then(res => {
-                    res.metaLuckDrawAwards = res.metaLuckDrawAwards || [];
-                    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;
-        });
-    },
-    data() {
-        return {
-            nft: false,
-            gold: false,
-            reg,
-            awardType: [],
-            tags: [],
-            saving: false,
-            formData: {
-                metaLuckDrawAwards: []
-            },
-            rules: {
-                name: [
-                    {
-                        required: true,
-                        message: '请输入活动名称',
-                        trigger: 'blur'
-                    }
-                ],
-                detail: [
-                    {
-                        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();
-                            }
-                        }
-                    }
-                ],
-                metaLuckDrawAwards: [
-                    {
-                        validator: (rule, value, callback) => {
-                            if (value) {
-                                if (!(value instanceof Array)) {
-                                    callback(new Error('metaLuckDrawAwards 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].awardType === 'NFT' && value[i].limitNum) {
-                                            if (
-                                                value[i].maxNum === '' ||
-                                                value[i].maxNum === undefined ||
-                                                value[i].maxNum === null
-                                            ) {
-                                                callback(new Error('请填写NFT奖励最大领取数量'));
-                                                return;
-                                            }
+	name: 'MetaLuckyDrawEdit',
+	created() {
+		if (this.$route.query.id) {
+			this.$http
+				.get('metaLuckyDraw/get/' + this.$route.query.id)
+				.then(res => {
+					res.metaLuckDrawAwards = res.metaLuckDrawAwards || [];
+					this.formData = res;
+					if (res.entryModeType === 'GOLD') {
+						this.gold = true;
+						this.nft = false;
+						this.metaProp = false;
+					} else if (res.entryModeType === 'NFT') {
+						this.nft = true;
+						this.gold = false;
+						this.metaProp = false;
+					} else if (res.entryModeType === 'META_PROP') {
+						this.metaProp = true;
+						this.gold = false;
+						this.nft = false;
+					} else if (res.entryModeType === 'GOLD_OR_NFT') {
+						this.gold = true;
+						this.nft = true;
+						this.metaProp = false;
+					} else if (res.entryModeType === 'GOLD_OR_META_PROP') {
+						this.gold = true;
+						this.metaProp = true;
+						this.nft = false;
+					} else if (res.entryModeType === 'NFT_OR_META_PROP') {
+						this.nft = true;
+						this.metaProp = true;
+						this.gold = false;
+					} else if (res.entryModeType === 'GOLD_OR_NFT_OR_META_PROP') {
+						this.nft = true;
+						this.metaProp = true;
+						this.gold = 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('/metaProp/findAll').then(res => {
+			this.metaProps = res;
+		});
+	},
+	data() {
+		return {
+			metaProps: [],
+			nft: false,
+			gold: false,
+			metaProp: false,
+			reg,
+			awardType: [],
+			tags: [],
+			saving: false,
+			formData: {
+				metaLuckDrawAwards: []
+			},
+			rules: {
+				name: [
+					{
+						required: true,
+						message: '请输入活动名称',
+						trigger: 'blur'
+					}
+				],
+				detail: [
+					{
+						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();
+							}
+						}
+					}
+				],
+				metaLuckDrawAwards: [
+					{
+						validator: (rule, value, callback) => {
+							if (value) {
+								if (!(value instanceof Array)) {
+									callback(new Error('metaLuckDrawAwards 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].awardType === 'NFT' && value[i].limitNum) {
+											if (
+												value[i].maxNum === '' ||
+												value[i].maxNum === undefined ||
+												value[i].maxNum === null
+											) {
+												callback(new Error('请填写NFT奖励最大领取数量'));
+												return;
+											}
 
-                                            if (!this.reg.test(value[i].maxNum)) {
-                                                callback(new Error('NFT奖励最大领取数量必须为大于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'
-                    }
-                ]
-            },
-            entryModeTypeOptions: [
-                { label: 'NFT', value: 'NFT' },
-                { label: '金币', value: 'GOLD' }
-            ]
-        };
-    },
-    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 = '';
+											if (!this.reg.test(value[i].maxNum)) {
+												callback(new Error('NFT奖励最大领取数量必须为大于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'
+					}
+				],
+				metaPropId: [
+					{
+						required: true,
+						message: '请选择道具',
+						trigger: 'blur'
+					}
+				],
+				metaPropNum: [
+					{
+						required: true,
+						message: '请输入道具数量',
+						trigger: 'blur'
+					}
+				],
+				num: [
+					{
+						required: true,
+						message: '请输入所需nft数量',
+						trigger: 'blur'
+					}
+				]
+			},
+			awardTypeOptions: [
+				{ label: '金币', value: 'GOLD' },
+				{ label: 'NFT', value: 'NFT' },
+				{ label: '元宇宙道具', value: 'META_PROP' }
+			]
+		};
+	},
+	computed: {
+		canEdit() {
+			return !!!this.$route.query.id;
+		}
+	},
+	methods: {
+		goldChange() {
+			this.$delete(this.formData, 'goldNum');
+		},
+		metaPropChange() {
+			this.$delete(this.formData, 'metaPropId');
+			this.$delete(this.formData, 'metaPropNum');
+		},
+		nftChange() {
+			this.$delete(this.formData, 'audit');
+			this.auditChange();
+		},
+		auditChange() {
+			this.$delete(this.formData, 'collectionName');
+			this.$delete(this.formData, 'rule');
+			this.$delete(this.formData, 'num');
+		},
+		changeAwardType(row) {
+			row.config = '';
 			row.limitNum = false;
-        },
+		},
 		changeLimitNum(row) {
-            row.maxNum = '';
-        },
-        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('/metaLuckyDraw/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(`/metaLuckyDraw/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.metaLuckDrawAwards.push({
-                awardType: '',
-                config: '',
-                probability: '',
-				limitNum:'',
-				maxNum:''
-            });
-        },
-        delAward(i) {
-            this.formData.metaLuckDrawAwards.splice(i, 1);
-        }
-    }
+			row.maxNum = '';
+		},
+		onSave() {
+			this.$refs.form.validate(valid => {
+				if (valid) {
+					this.submit();
+				} else {
+					return false;
+				}
+			});
+		},
+		submit() {
+			let data = { ...this.formData };
+			if (this.gold && !this.nft && !this.metaProp) {
+				data.entryModeType = 'GOLD';
+			} else if (this.nft && !this.gold && !this.metaProp) {
+				data.entryModeType = 'NFT';
+			} else if (this.metaProp && !this.gold && !this.nft) {
+				data.entryModeType = 'META_PROP';
+			} else if (this.gold && this.nft && !this.metaProp) {
+				data.entryModeType = 'GOLD_OR_NFT';
+			} else if (this.gold && this.metaProp && !this.nft) {
+				data.entryModeType = 'GOLD_OR_META_PROP';
+			} else if (this.nft && this.metaProp && !this.gold) {
+				data.entryModeType = 'NFT_OR_META_PROP';
+			} else if (this.metaProp && this.gold && this.nft) {
+				data.entryModeType = 'GOLD_OR_NFT_OR_META_PROP';
+			} else if (!this.gold && !this.nft && !this.metaProp) {
+				this.$message.error('请最少配置一个入场方式');
+				return;
+			}
+			this.saving = true;
+			this.$http
+				.post('/metaLuckyDraw/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(`/metaLuckyDraw/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.metaLuckDrawAwards.push({
+				awardType: '',
+				config: '',
+				probability: '',
+				limitNum: '',
+				maxNum: ''
+			});
+		},
+		delAward(i) {
+			this.formData.metaLuckDrawAwards.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>

+ 176 - 163
src/main/vue/src/views/MetaLuckyDrawList.vue

@@ -1,50 +1,50 @@
 <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>
+    <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="entryModeType" align="center" label="入场方式" :formatter="entryModeTypeFormatter">
             </el-table-column>
             <el-table-column prop="goldNum" align="center" label="所需金币数量"> </el-table-column>
@@ -59,7 +59,14 @@
             </el-table-column>
             <el-table-column prop="audit" label="审核" width="80" align="center">
                 <template v-slot="{ row }">
-                    <template v-if="row.entryModeType != 'GOLD'">
+                    <template
+                        v-if="
+                        	row.entryModeType === 'NFT' ||
+                        	row.entryModeType === 'GOLD_OR_NFT' ||
+                        	row.entryModeType === 'NFT_OR_META_PROP' ||
+                        	row.entryModeType === 'GOLD_OR_NFT_OR_META_PROP'
+                        "
+                    >
                         <el-tag type="warning" v-if="row.audit"> 人工 </el-tag>
                         <el-tag type="success" v-else> 自动 </el-tag>
                     </template>
@@ -67,6 +74,8 @@
             </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="metaPropId" align="center" label="道具"> </el-table-column>
+            <el-table-column prop="metaPropNum" align="center" label="道具数量"> </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 }">
@@ -80,128 +89,132 @@
                 </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="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: 'MetaLuckyDrawList',
-	mixins: [pageableTable],
-	data() {
-		return {
-			multipleMode: false,
-			search: '',
-			url: '/metaLuckyDraw/all',
-			downloading: false,
-			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: {
-		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: '/metaLuckyDrawEdit',
-				query: {
-					...this.$route.query
-				}
-			});
-		},
-		editRow(row) {
-			this.$router.push({
-				path: '/metaLuckyDrawEdit',
-				query: {
-					id: row.id
-				}
-			});
-		},
-		download() {
-			this.downloading = true;
-			this.$axios
-				.get('/metaLuckyDraw/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(`/metaLuckyDraw/del/${row.id}`);
-				})
-				.then(() => {
-					this.$message.success('删除成功');
-					this.getData();
-				})
-				.catch(e => {
-					if (e !== 'cancel') {
-						this.$message.error(e.error);
-					}
-				});
-		}
-	}
+    name: 'MetaLuckyDrawList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/metaLuckyDraw/all',
+            downloading: false,
+            entryModeTypeOptions: [
+                { label: 'NFT', value: 'NFT' },
+                { label: '金币', value: 'GOLD' },
+                { label: '元宇宙道具', value: 'META_PROP' },
+                { label: '金币或NFT', value: 'GOLD_OR_NFT' },
+                { label: '金币或道具', value: 'GOLD_OR_META_PROP' },
+                { label: 'NFT或道具', value: 'NFT_OR_META_PROP' },
+                { label: '金币或NFT或道具', value: 'GOLD_OR_NFT_OR_META_PROP' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        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: '/metaLuckyDrawEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/metaLuckyDrawEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/metaLuckyDraw/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(`/metaLuckyDraw/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 <style lang="less" scoped>