|
|
@@ -0,0 +1,461 @@
|
|
|
+<template>
|
|
|
+ <div class="edit-view">
|
|
|
+ <page-title>
|
|
|
+ <el-button @click="$router.go(-1)" :disabled="saving"> 取消 </el-button>
|
|
|
+ <el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id"> 删除 </el-button>
|
|
|
+ <el-button @click="onSave" :loading="saving" type="primary"> 保存 </el-button>
|
|
|
+ </page-title>
|
|
|
+ <div class="edit-view__content-wrapper">
|
|
|
+ <div class="edit-view__content-section">
|
|
|
+ <el-form
|
|
|
+ :model="formData"
|
|
|
+ :rules="rules"
|
|
|
+ ref="form"
|
|
|
+ label-width="108px"
|
|
|
+ label-position="right"
|
|
|
+ size="small"
|
|
|
+ style="max-width: 500px"
|
|
|
+ >
|
|
|
+ <el-form-item prop="gameName" label="游戏">
|
|
|
+ <el-select v-model="formData.gameName" clearable filterable placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in gameNameOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="gameCopyType" label="副本">
|
|
|
+ <el-select v-model="formData.gameCopyType" clearable filterable placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in gameCopyTypeOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="entryModeType" label="入场方式">
|
|
|
+ <el-select v-model="formData.entryModeType" clearable filterable placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in entryModeTypeOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="goldNum" label="所需金币数量" v-if="formData.entryModeType === '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="audit" label="是否需要审核" v-if="formData.entryModeType === '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="formData.entryModeType === '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="formData.entryModeType === '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"> × 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="formData.entryModeType === 'NFT'">
|
|
|
+ <el-input-number
|
|
|
+ type="number"
|
|
|
+ v-model="formData.num"
|
|
|
+ :disabled="!canEdit"
|
|
|
+ :step="1"
|
|
|
+ :min="0"
|
|
|
+ class="width1"
|
|
|
+ >
|
|
|
+ </el-input-number>
|
|
|
+ <div class="tip">0表示不限</div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="detail" label="规则详情" style="width: calc(100vw - 450px)">
|
|
|
+ <el-input
|
|
|
+ v-model="formData.detail"
|
|
|
+ type="textarea"
|
|
|
+ :autosize="{ minRows: 3, maxRows: 20 }"
|
|
|
+ placeholder="请输入规则详情"
|
|
|
+ >
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="僵尸配置" prop="metaZombieIds">
|
|
|
+ <el-select v-model="formData.metaZombieIds" multiple placeholder="请选择" style="width: 100%">
|
|
|
+ <el-option v-for="item in metaZombie" :key="item.id" :label="item.name" :value="item.id">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="metaGameAwards" label="奖励配置" style="width: calc(100vw - 450px)" size="mini">
|
|
|
+ <el-table :data="formData.metaGameAwards">
|
|
|
+ <el-table-column prop="awardType" label="奖励类型">
|
|
|
+ <template v-slot="{ row }">
|
|
|
+ <el-select
|
|
|
+ v-model="row.awardType"
|
|
|
+ clearable
|
|
|
+ filterable
|
|
|
+ placeholder="请选择"
|
|
|
+ @change="changeAwardType(row)"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in entryModeTypeOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="config" label="配置值(金币-数量/NFT-NFT图片)">
|
|
|
+ <template v-slot="{ row }">
|
|
|
+ <template v-if="row && row.awardType === 'GOLD'">
|
|
|
+ <el-input-number v-model="row.config" :step="1" :min="1"> </el-input-number>
|
|
|
+ <div class="tip">规则:正整数,最小为1且小数部分将会被截取</div>
|
|
|
+ </template>
|
|
|
+ <template v-if="row && row.awardType === 'NFT'">
|
|
|
+ <single-upload v-model="row.config"> </single-upload>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="probability" label="概率(%)">
|
|
|
+ <template v-slot="{ row }">
|
|
|
+ <el-input-number v-model="row.probability" :step="1" :min="1" :max="100">
|
|
|
+ </el-input-number>
|
|
|
+ <div class="tip">输入规则:正整数,最小为1,最大为100</div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column width="80" align="center">
|
|
|
+ <template v-slot="{ row, $index }">
|
|
|
+ <el-button type="danger" plain size="mini" @click="delAward($index)">
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button size="mini" @click="addAward"> 添加配置 </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="publish" label="是否发布">
|
|
|
+ <el-switch v-model="formData.publish"> </el-switch>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item class="form-submit">
|
|
|
+ <el-button @click="onSave" :loading="saving" type="primary"> 保存 </el-button>
|
|
|
+ <el-button @click="onDelete" :disabled="saving" type="danger" v-if="formData.id">
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="$router.go(-1)" :disabled="saving"> 取消 </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+export default {
|
|
|
+ name: 'MetaGameCopyEdit',
|
|
|
+ created() {
|
|
|
+ if (this.$route.query.id) {
|
|
|
+ this.$http
|
|
|
+ .get('metaGameCopy/get/' + this.$route.query.id)
|
|
|
+ .then(res => {
|
|
|
+ res.metaGameAwards = res.metaGameAwards || [];
|
|
|
+ this.formData = res;
|
|
|
+ })
|
|
|
+ .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.post('/metaZombie/all', { size: 10000 }, { body: 'json' }).then(res => {
|
|
|
+ this.metaZombie = res.content;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ reg: /^[1-9]\d*$/,
|
|
|
+ awardType: [],
|
|
|
+ metaZombie: [],
|
|
|
+ tags: [],
|
|
|
+ saving: false,
|
|
|
+ formData: {
|
|
|
+ metaGameAwards: []
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ detail: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请输入规则详情',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ gameName: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择游戏',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ gameCopyType: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择副本',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ entryModeType: [
|
|
|
+ {
|
|
|
+ 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].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' }],
|
|
|
+ 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: {
|
|
|
+ changeAwardType(row) {
|
|
|
+ row.config = '';
|
|
|
+ },
|
|
|
+ onSave() {
|
|
|
+ this.$refs.form.validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ this.submit();
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ submit() {
|
|
|
+ let data = { ...this.formData };
|
|
|
+ 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;
|
|
|
+}
|
|
|
+
|
|
|
+.rule-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 10px;
|
|
|
+
|
|
|
+ .icon-del {
|
|
|
+ color: #f56c6c;
|
|
|
+ cursor: pointer;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|