|
|
@@ -67,6 +67,31 @@
|
|
|
<el-form-item>
|
|
|
<el-button size="mini" @click="addProperty"> 添加特性 </el-button>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="特权" prop="privileges" style="width: calc(100vw - 450px)">
|
|
|
+ <el-table :data="privilegeOptions">
|
|
|
+ <el-table-column prop="name" label="可选特权" width="150"></el-table-column>
|
|
|
+ <el-table-column prop="description"></el-table-column>
|
|
|
+ <el-table-column width="155" align="right">
|
|
|
+ <template v-slot="{ row, $index }">
|
|
|
+ <el-button size="mini" v-if="!row.added" @click="addPrivilege(row, $index)">
|
|
|
+ 添加
|
|
|
+ </el-button>
|
|
|
+ <el-button size="mini" v-if="!!row.added" plain @click="editPrivilege(row, $index)">
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ v-if="!!row.added"
|
|
|
+ type="danger"
|
|
|
+ plain
|
|
|
+ @click="delPrivilege(row, $index)"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-form-item>
|
|
|
<!-- <el-form-item prop="type" label="类型">
|
|
|
<el-select v-model="formData.type" clearable filterable placeholder="请选择">
|
|
|
<el-option
|
|
|
@@ -96,12 +121,9 @@
|
|
|
<el-input-number v-model="formData.total" disabled></el-input-number>
|
|
|
</el-form-item>
|
|
|
<el-form-item prop="items" label="包含作品" style="width: calc(100vw - 450px)">
|
|
|
- <el-table :data="blindBoxItems">
|
|
|
- <el-table-column
|
|
|
- prop="collectionId"
|
|
|
- label="名称"
|
|
|
- :formatter="collectionNameFormatter"
|
|
|
- ></el-table-column>
|
|
|
+ <el-table :data="blindBoxItems" max-height="300px">
|
|
|
+ <el-table-column prop="collectionId" label="ID"></el-table-column>
|
|
|
+ <el-table-column prop="name" label="名称"></el-table-column>
|
|
|
<el-table-column prop="total" label="数量" width="100"></el-table-column>
|
|
|
<el-table-column prop="rare" label="稀有" width="100">
|
|
|
<template v-slot="{ row }">
|
|
|
@@ -129,8 +151,17 @@
|
|
|
<!-- <el-form-item prop="likes" label="点赞">
|
|
|
<el-input-number v-model="formData.likes"></el-input-number>
|
|
|
</el-form-item> -->
|
|
|
+ <el-form-item prop="scanCode" label="仅扫码可见">
|
|
|
+ <el-radio v-model="formData.scanCode" :label="true">是</el-radio>
|
|
|
+ <el-radio v-model="formData.scanCode" :label="false">否</el-radio>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="onShelf" label="上架" v-if="!formData.scanCode">
|
|
|
+ <el-radio v-model="formData.onShelf" :label="true">是</el-radio>
|
|
|
+ <el-radio v-model="formData.onShelf" :label="false">否</el-radio>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item prop="startTime" label="定时发布">
|
|
|
- <el-switch v-model="formData.scheduleSale" active-text="是" inactive-text="否"></el-switch>
|
|
|
+ <el-radio v-model="formData.scheduleSale" :label="true">是</el-radio>
|
|
|
+ <el-radio v-model="formData.scheduleSale" :label="false">否</el-radio>
|
|
|
<div style="margin-top: 10px" v-if="formData.scheduleSale">
|
|
|
<el-date-picker
|
|
|
v-model="formData.startTime"
|
|
|
@@ -140,11 +171,15 @@
|
|
|
></el-date-picker>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item prop="onShelf" label="上架" v-if="!formData.scheduleSale">
|
|
|
- <el-switch v-model="formData.onShelf" active-text="上架" inactive-text="下架"></el-switch>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="salable" label="可售">
|
|
|
- <el-switch v-model="formData.salable" active-text="可销售" inactive-text="仅展示"></el-switch>
|
|
|
+ <el-form-item
|
|
|
+ prop="salable"
|
|
|
+ label="可售"
|
|
|
+ v-if="
|
|
|
+ formData.onShelf === true || (formData.scanCode === true && formData.scheduleSale === false)
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <el-radio v-model="formData.salable" :label="true">是</el-radio>
|
|
|
+ <el-radio v-model="formData.salable" :label="false">仅展示</el-radio>
|
|
|
</el-form-item>
|
|
|
<el-form-item prop="maxCount" label="限购">
|
|
|
<el-input-number v-model="formData.maxCount"></el-input-number>
|
|
|
@@ -175,12 +210,7 @@
|
|
|
:rules="addItemFormRules"
|
|
|
>
|
|
|
<el-form-item prop="collectionId" label="作品">
|
|
|
- <el-select v-model="addItemForm.collectionId">
|
|
|
- <el-option v-for="item in collections" :label="item.name" :value="item.id" :key="item.id">
|
|
|
- <span style="float: left">{{ item.name }}</span>
|
|
|
- <span style="float: right; color: #8492a6; font-size: 13px">#{{ item.id }}</span>
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
+ <collection-search v-model="addItemForm.collectionId" @select="selectItem"> </collection-search>
|
|
|
</el-form-item>
|
|
|
<el-form-item prop="total" label="数量">
|
|
|
<el-input-number v-model="addItemForm.total" :min="1" :max="addItemForm.max || 0"></el-input-number>
|
|
|
@@ -194,44 +224,131 @@
|
|
|
<el-button size="mini" @click="onAddItem" type="primary">确定</el-button>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <el-dialog :visible.sync="showPrivilegeEditDialog" width="600px" :title="privilegeForm.name">
|
|
|
+ <el-form
|
|
|
+ ref="privilegeForm"
|
|
|
+ :model="privilegeForm"
|
|
|
+ label-position="right"
|
|
|
+ label-width="80px"
|
|
|
+ :rules="privelegeRules"
|
|
|
+ >
|
|
|
+ <el-form-item
|
|
|
+ prop="detail"
|
|
|
+ label="详细内容"
|
|
|
+ v-if="privilegeForm.type === 'text' || privilegeForm.type === 'exchange'"
|
|
|
+ >
|
|
|
+ <el-input type="textarea" :autosize="{ minRows: 3 }" v-model="privilegeForm.detail"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="detail" label="二维码" v-if="privilegeForm.type === 'qrcode'">
|
|
|
+ <single-upload v-model="privilegeForm.detail"></single-upload>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item
|
|
|
+ prop="remark"
|
|
|
+ label="说明"
|
|
|
+ v-if="privilegeForm.type === 'qrcode' || privilegeForm.type === 'code'"
|
|
|
+ >
|
|
|
+ <el-input type="textarea" :autosize="{ minRows: 3 }" v-model="privilegeForm.remark"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer">
|
|
|
+ <el-button @click="showPrivilegeEditDialog = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="savePrivilege">保存</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
import resolveUrl from 'resolve-url';
|
|
|
+import ModelUpload from '../components/ModelUpload.vue';
|
|
|
+import { format, parse, isBefore } from 'date-fns';
|
|
|
export default {
|
|
|
name: 'BlindBoxEdit',
|
|
|
created() {
|
|
|
- if (this.$route.query.id) {
|
|
|
- this.$http
|
|
|
- .get('collection/get/' + this.$route.query.id)
|
|
|
- .then(res => {
|
|
|
- res.properties = res.properties || [];
|
|
|
- this.formData = res;
|
|
|
- })
|
|
|
- .catch(e => {
|
|
|
- console.log(e);
|
|
|
- this.$message.error(e.error);
|
|
|
- });
|
|
|
+ // if (this.$route.query.id) {
|
|
|
+ // this.$http
|
|
|
+ // .get('collection/get/' + this.$route.query.id)
|
|
|
+ // .then(res => {
|
|
|
+ // res.properties = res.properties || [];
|
|
|
+ // this.formData = res;
|
|
|
+ // })
|
|
|
+ // .catch(e => {
|
|
|
+ // console.log(e);
|
|
|
+ // this.$message.error(e.error);
|
|
|
+ // });
|
|
|
+ // this.$http
|
|
|
+ // .post(
|
|
|
+ // '/blindBoxItem/all',
|
|
|
+ // { query: { blindBoxId: this.$route.query.id }, size: 10000 },
|
|
|
+ // { body: 'json' }
|
|
|
+ // )
|
|
|
+ // .then(res => {
|
|
|
+ // this.blindBoxItems = res.content;
|
|
|
+ // });
|
|
|
+ // }
|
|
|
+ // this.$http
|
|
|
+ // .post(
|
|
|
+ // '/collection/all',
|
|
|
+ // { query: { del: false, source: 'OFFICIAL' }, size: 10000, sort: 'sort,desc;createdAt,desc' },
|
|
|
+ // { body: 'json' }
|
|
|
+ // )
|
|
|
+ // .then(res => {
|
|
|
+ // this.collections = res.content;
|
|
|
+ // });
|
|
|
+
|
|
|
+ Promise.all([
|
|
|
+ new Promise((resolve, reject) => {
|
|
|
+ if (this.$route.query.id) {
|
|
|
+ return this.$http
|
|
|
+ .get('collection/get/' + this.$route.query.id)
|
|
|
+ .then(res => {
|
|
|
+ res.properties = res.properties || [];
|
|
|
+ res.privileges = res.privileges || [];
|
|
|
+ this.formData = res;
|
|
|
+ resolve();
|
|
|
+ })
|
|
|
+ .catch(e => {
|
|
|
+ console.log(e);
|
|
|
+ this.$message.error(e.error);
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return resolve();
|
|
|
+ }),
|
|
|
this.$http
|
|
|
- .post(
|
|
|
- '/blindBoxItem/all',
|
|
|
- { query: { blindBoxId: this.$route.query.id }, size: 10000 },
|
|
|
- { body: 'json' }
|
|
|
- )
|
|
|
+ .post('/privilegeOption/all', { size: 10000, query: { del: false } }, { body: 'json' })
|
|
|
.then(res => {
|
|
|
- this.blindBoxItems = res.content;
|
|
|
- });
|
|
|
- }
|
|
|
- this.$http
|
|
|
- .post(
|
|
|
- '/collection/all',
|
|
|
- { query: { del: false, source: 'OFFICIAL' }, size: 10000, sort: 'sort,desc;createdAt,desc' },
|
|
|
- { body: 'json' }
|
|
|
- )
|
|
|
- .then(res => {
|
|
|
- this.collections = res.content;
|
|
|
+ this.privilegeOptions = res.content;
|
|
|
+ return Promise.resolve();
|
|
|
+ }),
|
|
|
+ new Promise((resolve, reject) => {
|
|
|
+ if (this.$route.query.id) {
|
|
|
+ this.$http
|
|
|
+ .post(
|
|
|
+ '/blindBoxItem/all',
|
|
|
+ { query: { blindBoxId: this.$route.query.id }, size: 10000 },
|
|
|
+ { body: 'json' }
|
|
|
+ )
|
|
|
+ .then(res => {
|
|
|
+ this.blindBoxItems = res.content;
|
|
|
+ resolve();
|
|
|
+ })
|
|
|
+ .catch(e => {
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ resolve();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ ]).then(() => {
|
|
|
+ console.log(this.formData, this.privilegeOptions);
|
|
|
+ this.formData.privileges.forEach(p => {
|
|
|
+ let idx = this.privilegeOptions.findIndex(i => i.name === p.name);
|
|
|
+ if (idx > -1) {
|
|
|
+ this.$set(this.privilegeOptions[idx], 'added', true);
|
|
|
+ }
|
|
|
});
|
|
|
-
|
|
|
+ });
|
|
|
// this.formData = {
|
|
|
// name: 'OASISPUNK绿洲朋克',
|
|
|
// pic: ['https://awesomeadmin.oss-cn-hangzhou.aliyuncs.com/image/2021-10-21-16-44-52kZqxuwhH.gif'],
|
|
|
@@ -279,7 +396,7 @@ export default {
|
|
|
return {
|
|
|
saving: false,
|
|
|
formData: {
|
|
|
- onShelf: true,
|
|
|
+ onShelf: false,
|
|
|
salable: true,
|
|
|
properties: [],
|
|
|
type: 'BLIND_BOX',
|
|
|
@@ -287,8 +404,10 @@ export default {
|
|
|
pic: [{}],
|
|
|
scheduleSale: true,
|
|
|
privileges: [],
|
|
|
+ sort: 0,
|
|
|
maxCount: 0,
|
|
|
- countId: null
|
|
|
+ countId: null,
|
|
|
+ scanCode: false
|
|
|
},
|
|
|
rules: {
|
|
|
name: [
|
|
|
@@ -412,12 +531,19 @@ export default {
|
|
|
startTime: [
|
|
|
{
|
|
|
validator: (rule, value, callback) => {
|
|
|
- if (this.formData.scheduleSale === true && !value) {
|
|
|
- callback(new Error('请填写开售时间'));
|
|
|
- return;
|
|
|
+ if (this.formData.scheduleSale) {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error('请填写发布时间'));
|
|
|
+ } else if (isBefore(parse(value, 'yyyy-MM-dd HH:mm:ss', new Date()), new Date())) {
|
|
|
+ callback(new Error('发布时间不能小于当前时间'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
}
|
|
|
- callback();
|
|
|
- }
|
|
|
+ },
|
|
|
+ trigger: 'blur'
|
|
|
}
|
|
|
],
|
|
|
items: [
|
|
|
@@ -452,7 +578,14 @@ export default {
|
|
|
total: [{ required: true, message: '请输入数量' }]
|
|
|
},
|
|
|
cateogories: ['勋章', '收藏品', '数字艺术', '门票', '游戏', '音乐', '使用', '其他'],
|
|
|
- customUrl: resolveUrl(this.$baseUrl, 'upload/3dModel')
|
|
|
+ customUrl: resolveUrl(this.$baseUrl, 'upload/3dModel'),
|
|
|
+ privilegeOptions: [],
|
|
|
+ showPrivilegeEditDialog: false,
|
|
|
+ privilegeForm: {},
|
|
|
+ privelegeRules: {
|
|
|
+ detail: [{ required: true, message: '请填写内容' }],
|
|
|
+ remark: [{ required: true, message: '请填写说明' }]
|
|
|
+ }
|
|
|
};
|
|
|
},
|
|
|
methods: {
|
|
|
@@ -546,22 +679,76 @@ export default {
|
|
|
},
|
|
|
removeItem(i) {
|
|
|
this.blindBoxItems.splice(i, 1);
|
|
|
+ },
|
|
|
+ addPrivilege(row, i) {
|
|
|
+ this.privilegeForm = { ...row };
|
|
|
+ this.showPrivilegeEditDialog = true;
|
|
|
+ if (this.$refs.privilegeForm) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.privilegeForm.clearValidate();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ editPrivilege(row, i) {
|
|
|
+ this.privilegeForm = { ...(this.formData.privileges.find(e => e.name === row.name) || {}) };
|
|
|
+ this.showPrivilegeEditDialog = true;
|
|
|
+ if (this.$refs.privilegeForm) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.privilegeForm.clearValidate();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ delPrivilege(row, i) {
|
|
|
+ let idx = this.formData.privileges.findIndex(e => e.name === row.name);
|
|
|
+ if (idx > -1) {
|
|
|
+ this.formData.privileges.splice(idx, 1);
|
|
|
+ }
|
|
|
+ this.$set(this.privilegeOptions[i], 'added', false);
|
|
|
+ },
|
|
|
+ savePrivilege() {
|
|
|
+ this.$refs.privilegeForm
|
|
|
+ .validate()
|
|
|
+ .then(() => {
|
|
|
+ let i = this.formData.privileges.findIndex(e => e.name === this.privilegeForm.name);
|
|
|
+ if (i > -1) {
|
|
|
+ this.$set(this.formData.privileges, i, { ...this.privilegeForm });
|
|
|
+ } else {
|
|
|
+ this.formData.privileges.push({ ...this.privilegeForm });
|
|
|
+ }
|
|
|
+ let ii = this.privilegeOptions.findIndex(i => i.name === this.privilegeForm.name);
|
|
|
+ console.log(ii);
|
|
|
+ this.$set(this.privilegeOptions[ii], 'added', true);
|
|
|
+ this.showPrivilegeEditDialog = false;
|
|
|
+ })
|
|
|
+ .catch(e => {
|
|
|
+ console.log(e);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ selectItem(item) {
|
|
|
+ this.$set(this.addItemForm, 'max', item.stock || 0);
|
|
|
+ this.$set(this.addItemForm, 'name', item.name);
|
|
|
}
|
|
|
},
|
|
|
watch: {
|
|
|
- 'addItemForm.collectionId'(val) {
|
|
|
- if (val) {
|
|
|
- this.$set(this.addItemForm, 'max', (this.collections.find(i => i.id === val) || {}).stock || 0);
|
|
|
- }
|
|
|
- },
|
|
|
blindBoxItems() {
|
|
|
this.$set(
|
|
|
this.formData,
|
|
|
'total',
|
|
|
this.blindBoxItems.map(i => i.total).reduce((a, b) => a + b, 0)
|
|
|
);
|
|
|
+ },
|
|
|
+ 'formData.scanCode'(val) {
|
|
|
+ if (val === true) {
|
|
|
+ this.$set(this.formData, 'onShelf', false);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
-<style lang="less" scoped></style>
|
|
|
+<style lang="less" scoped>
|
|
|
+.inline-wrapper {
|
|
|
+ .el-form-item {
|
|
|
+ display: inline-block;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|