Просмотр исходного кода

任务奖励添加道具类型

sunkean 3 лет назад
Родитель
Сommit
495a658736

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

@@ -70,4 +70,8 @@ public class MetaTask extends BaseEntity{
     @ApiModelProperty("是否自动领取")
     @ExcelProperty("是否自动领取")
     private boolean autoReceive;
+
+    @ApiModelProperty("道具id")
+    @ExcelProperty("道具id")
+    private Long metaPropId;
 }

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

@@ -191,5 +191,6 @@ public class MetaUserTaskProgressService {
         metaTaskToUser.setFinishTime(LocalDateTime.now());
         metaTaskToUser.setStatus(MetaTaskStatus.COMPLETION);
         metaTaskToUserRepo.save(metaTaskToUser);
+        // TODO 是否做自动领取
     }
 }

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

@@ -46,9 +46,15 @@ public class MetaTaskController extends BaseController {
             ObjUtils.merge(orig, record);
             if (MetaAwardTypeEnum.GOLD.equals(record.getAwardType())) {
                 orig.setAwardPic(null);
+                orig.setMetaPropId(null);
             }
             if (MetaAwardTypeEnum.NFT.equals(record.getAwardType())) {
                 orig.setGoldNum(0);
+                orig.setMetaPropId(null);
+            }
+            if (MetaAwardTypeEnum.META_PROP.equals(record.getAwardType())) {
+                orig.setGoldNum(0);
+                orig.setAwardPic(null);
             }
             return metaTaskRepo.save(orig);
         }

+ 504 - 488
src/main/vue/src/views/MetaGameCopyEdit.vue

@@ -1,503 +1,519 @@
 <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="请选择"
-                            @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>
+	<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 awardTypeOptions"
+											: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 v-if="row && row.awardType === 'META_PROP'">
+										<el-select v-model="row.config" placeholder="请选择" filterable>
+											<el-option
+												v-for="item in metaProps"
+												:key="item.id"
+												:label="item.name"
+												:value="item.id"
+											>
+											</el-option>
+										</el-select>
+									</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>
 import { reg } from '../util/regRules';
 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,
-            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);
-        }
-    }
+	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;
+		});
+		this.$http.get('/metaProp/findAll').then(res => {
+			this.metaProps = res;
+		});
+	},
+	data() {
+		return {
+			metaProps: [],
+			nft: false,
+			gold: false,
+			reg,
+			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' }
+			],
+            awardTypeOptions: [
+				{ label: '金币', value: 'GOLD' },
+				{ label: 'NFT', value: 'NFT' },
+				{ label: '元宇宙道具', value: 'META_PROP' }
+			]
+		};
+	},
+	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);
+		}
+	}
 };
 </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>

+ 291 - 268
src/main/vue/src/views/MetaTaskEdit.vue

@@ -1,278 +1,301 @@
 <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>
+    <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="metaPropId"
+                        label="道具"
+                        v-if="formData.awardType && formData.awardType === 'META_PROP'"
+                    >
+                        <el-select v-model="formData.metaPropId" placeholder="请选择" filterable>
+                            <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="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="autoReceive" label="是否自动领取">
-						<el-switch v-model="formData.autoReceive"> </el-switch>
-					</el-form-item>
-					<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>
+                        <el-switch v-model="formData.autoReceive"> </el-switch>
+                    </el-form-item>
+                    <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>
 import { reg } from '../util/regRules';
 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,
-			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: '空', value: 'NULL' },
-				{ 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);
+                });
+        }
+        this.$http.get('/metaProp/findAll').then(res => {
+            this.metaProps = res;
+        });
+    },
+    data() {
+        return {
+            metaProps: [],
+            reg,
+            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'
+                    }
+                ],
+                metaPropId: [
+                    {
+                        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: '空', value: 'NULL' },
+                { label: '金币', value: 'GOLD' },
+                { label: 'NFT', value: 'NFT' },
+                { label: '元宇宙道具', value: 'META_PROP' }
+            ]
+        };
+    },
+    methods: {
+        changeAwardType(row) {
+            this.$delete(this.formData, 'metaPropId');
+            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>

+ 4 - 2
src/main/vue/src/views/MetaTaskList.vue

@@ -50,6 +50,7 @@
             <el-table-column prop="value" align="center" label="配置值" width="80"> </el-table-column>
             <el-table-column prop="detail" align="center" label="详情"> </el-table-column>
             <el-table-column prop="awardType" align="center" label="奖励类型" :formatter="awardTypeFormatter" width="100"> </el-table-column>
+            <el-table-column prop="goldNum" align="center" label="奖励金币数量" width="100"> </el-table-column>
             <el-table-column prop="awardPic" align="center" label="奖励图片" width="100">
                 <template slot-scope="{ row }">
                     <el-image
@@ -61,7 +62,7 @@
                     </el-image>
                 </template>
             </el-table-column>
-            <el-table-column prop="goldNum" align="center" label="奖励金币数量" width="100"> </el-table-column>
+            <el-table-column prop="metaPropId" align="center" label="道具"> </el-table-column>
 			<el-table-column prop="autoReceive" align="center" label="自动领取" width="80">
                 <template slot-scope="{ row }">
                     <el-tag :type="row.autoReceive ? '' : 'info'"> {{ row.autoReceive }} </el-tag>
@@ -131,8 +132,9 @@ export default {
             ],
             awardTypeOptions: [
                 { label: '空', value: 'NULL' },
+                { label: '金币', value: 'GOLD' },
                 { label: 'NFT', value: 'NFT' },
-                { label: '金币', value: 'GOLD' }
+                { label: '元宇宙道具', value: 'META_PROP' }
             ]
         };
     },