Files
siyu-admin/src/views/sylive/activity/components/activity-edit.vue
T
2022-12-07 14:22:47 +08:00

699 lines
21 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- 用户编辑弹窗 -->
<template>
<ele-modal
width="800px"
:visible="visible"
:append-to-body="true"
:close-on-click-modal="true"
custom-class="ele-dialog-form"
:title="isUpdate ? '修改活动' : '添加活动'"
@update:visible="updateVisible"
>
<el-form ref="form" :model="form" :rules="rules" label-width="82px">
<el-form-item label="活动标题:" prop="title">
<el-input
clearable
:maxlength="60"
v-model="form.title"
placeholder="请输入活动标题"
/>
</el-form-item>
<el-form-item label="背景图片:" prop="bgImg">
<ele-image-upload
v-model="form.bgImg"
:limit="1"
:drag="true"
:multiple="false"
:upload-handler="bgImgHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">
建议尺寸1125X2000主题内容建议做在顶部0~1700像素区域
</div>
</el-form-item>
<el-form-item label="所属机构:" prop="organizationId">
<el-select
v-model="form.organizationId"
placeholder="请选择所属机构"
class="ele-fluid"
>
<el-option
v-for="item in organizationList"
:key="item.organizationId"
:label="item.organizationName"
:value="item.organizationId"
/>
</el-select>
</el-form-item>
<el-form-item label="开始时间:" prop="activityStart">
<el-date-picker
type="datetime"
v-model="form.activityStart"
placeholder="请选择活动开始时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
class="ele-fluid"
/>
</el-form-item>
<el-form-item label="直播频道:" prop="channelId">
<el-input
clearable
:maxlength="30"
v-model="form.channelId"
placeholder="请输入直播频道"
/>
</el-form-item>
<el-form-item label="直播时间:" prop="dateRange">
<el-date-picker
v-model="form.dateRange"
type="datetimerange"
unlink-panels
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss"
class="ele-fluid"
/>
</el-form-item>
<el-form-item label="抽奖码:">
<el-input
clearable
:maxlength="30"
v-model="form.drawCode"
placeholder="请输入抽奖码"
/>
</el-form-item>
<el-form-item label="收款账户:" prop="mchId">
<activity-mch-id-select v-model="form.mchId" />
</el-form-item>
<el-form-item label="支付方式:" v-show="false">
<el-select
clearable
v-model="form.pay.way"
placeholder="请选择"
class="ele-fluid"
>
<el-option label="厂商支付" :value="1" />
<el-option label="经销商支付" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="支付价格:" v-show="false">
<el-input
clearable
:maxlength="30"
v-model="form.pay.price"
placeholder="请输入支付价格"
/>
</el-form-item>
<el-form-item label="支付图片:" v-show="false">
<ele-image-upload
v-model="form.pay.img"
:limit="1"
:drag="true"
:multiple="false"
:upload-handler="payImgHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">建议尺寸750X1500</div>
</el-form-item>
<el-form-item label="直播图片:" v-show="false">
<ele-image-upload
v-model="form.channelImg"
:limit="1"
:drag="true"
:multiple="false"
:upload-handler="channelImgHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">建议尺寸690X330</div>
</el-form-item>
<el-form-item label="banner:">
<ele-image-upload
v-model="form.banner"
:limit="1"
:drag="true"
:multiple="false"
:upload-handler="bannerHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">建议尺寸750*340</div>
</el-form-item>
<el-form-item label="分享图片:" prop="sharePhoto">
<ele-image-upload
v-model="form.sharePhoto"
:limit="1"
:drag="true"
:multiple="false"
:upload-handler="sharePhotoHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">建议尺寸200X200</div>
</el-form-item>
<el-form-item label="分享海报:" prop="shareImg">
<ele-image-upload
v-model="form.shareImg"
:limit="10"
:drag="true"
:multiple="true"
:upload-handler="shareImgHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">
尺寸宽度750二维码尺寸160X160二维码位置距离底部80,距离右边40
</div>
</el-form-item>
<el-form-item label="分享文案:" prop="shareTitle">
<div
style="margin: 8px 0"
v-for="(item, index) in form.shareTitle"
:key="index"
>
<el-input
clearable
:maxlength="60"
v-model="form.shareTitle[index]"
placeholder="请输入分享文案"
/>
</div>
<el-button
type="primary"
plain
size="small"
icon="el-icon-plus"
@click="addShareTitle"
>
新增分享文案
</el-button>
</el-form-item>
<el-form-item label="活动底部:">
<el-table :data="form.bottoms" :border="true" style="width: 100%">
<el-table-column label="标题">
<template v-slot="{ row }">
<el-input v-model="row.title" placeholder="标题" />
</template>
</el-table-column>
<el-table-column label="类型" align="center">
<template v-slot="{ row }">
<el-select v-model="row.urlType" class="ele-fluid">
<el-option label="链接" value="link" />
<el-option label="小程序" value="miniProgram" />
</el-select>
</template>
</el-table-column>
<el-table-column label="链接" width="180px" align="center">
<template v-slot="{ row }">
<el-input
v-model="row.url"
placeholder="请输入链接"
:rows="2"
type="textarea"
/>
<el-input
v-if="row.urlType == 'miniProgram'"
v-model="row.miniProgramId"
placeholder="小程序原始id"
style="padding-top: 5px"
:rows="2"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column label="图标" width="120px" align="center">
<template v-slot="{ row, $index }">
<ele-image-upload
v-model="row.icon"
:limit="1"
:drag="true"
:multiple="false"
:upload-handler="$index == 0 ? uploadHandler0 : uploadHandler1"
@upload="onUpload"
/>
</template>
</el-table-column>
<el-table-column
label="操作"
width="70px"
align="center"
:resizable="false"
>
<template v-slot="{ row, $index }">
<span class="ele-action">
<el-popconfirm
title="确定要删除此底部吗?"
@confirm="removeBottoms(row, $index)"
>
<template v-slot:reference>
<el-link
icon="el-icon-delete"
type="danger"
:underline="false"
>
删除
</el-link>
</template>
</el-popconfirm>
</span>
</template>
</el-table-column>
</el-table>
<el-button
icon="el-icon-plus"
style="width: 100%; margin-top: 15px"
@click="addBottoms"
>
新增活动底部菜单
</el-button>
</el-form-item>
<el-form-item label="客服链接:">
<el-input
clearable
:maxlength="60"
v-model="form.serviceLink"
placeholder="请输入客服链接"
/>
</el-form-item>
<el-form-item label="协议标题:">
<el-input
clearable
:maxlength="60"
v-model="form.protocolTitle"
placeholder="请输入活动标题"
/>
</el-form-item>
<el-form-item label="协议内容:">
<!-- 编辑器 -->
<div v-if="editVersion">
<tinymce-editor
:init="editoption"
v-model="form.protocol"
placeholder="请输入活动协议"
/>
</div>
</el-form-item>
</el-form>
<template v-slot:footer>
<el-button @click="updateVisible(false)">取消</el-button>
<el-button type="primary" :loading="loading" @click="save">
保存
</el-button>
</template>
</ele-modal>
</template>
<script>
import TinymceEditor from '@/components/TinymceEditor/index.vue';
import ActivityMchIdSelect from './activity-mch-id-select.vue';
import EleImageUpload from 'ele-admin/es/ele-image-upload';
import request from '@/utils/request';
import { addActivity, updateActivity } from '@/api/sylive/activity';
export default {
components: {
TinymceEditor,
ActivityMchIdSelect,
EleImageUpload
},
props: {
// 弹窗是否打开
visible: Boolean,
// 全部机构
organizationList: Array,
// 修改回显的数据
data: Object
},
data() {
const defaultForm = {
activityId: null,
title: '',
channelId: '',
dateRange: '',
shareTitle: [''],
shareImg: [],
bgImg: [],
channelImg: [],
banner: [],
sharePhoto: [],
organizationId: null,
drawCode: '',
activityStart: '',
mchId: '1604032585',
protocolTitle: '',
protocol: '',
serviceLink: '',
bottoms: [],
pay: { way: 1, price: '', img: [] }
};
return {
editVersion: false,
editoption: {
height: 300,
toolbar: [
'code | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | fontsizeselect | bullist numlist | \
table emoticons hr preview | fullscreen | bdmap indent2em lineheight formatpainter axupimgs| image emoticons hr '
]
},
defaultForm,
// 表单数据
form: { ...defaultForm },
// 表单验证规则
rules: {
title: [
{
required: true,
message: '请输入活动标题',
trigger: 'blur'
}
],
organizationId: [
{
required: true,
message: '请选择所属机构',
trigger: 'blur'
}
],
activityStart: [
{
required: true,
message: '请选择活动开始时间',
trigger: 'blur'
}
],
bgImg: [
{
required: true,
message: '请上传背景图',
trigger: 'blur'
}
],
channelId: [
{
required: true,
message: '请输入直播频道',
trigger: 'blur'
}
],
dateRange: [
{
required: true,
message: '请选择直播时间',
trigger: 'blur'
}
]
},
// 提交状态
loading: false,
// 是否是修改
isUpdate: false
};
},
computed: {
// 是否开启响应式布局
styleResponsive() {
return this.$store.state.theme.styleResponsive;
}
},
methods: {
/* 添加海报描述 */
addShareTitle() {
this.form.shareTitle.push('');
},
/* 保存编辑 */
save() {
this.$refs.form.validate((valid) => {
if (!valid) {
return false;
}
this.form.shareTitle.forEach((item, i) => {
if (item == '') {
this.form.shareTitle.splice(i, 1);
}
});
this.loading = true;
const data = {
...this.form
};
const saveOrUpdate = this.isUpdate ? updateActivity : addActivity;
saveOrUpdate(data)
.then((msg) => {
this.loading = false;
this.$message.success(msg);
this.updateVisible(false);
this.$emit('done');
})
.catch((e) => {
this.loading = false;
this.$message.error(e.message);
});
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
/* 上传事件 */
bgImgHandler(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.bgImg.push(item);
this.onUpload(item);
},
payImgHandler(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.pay.img.push(item);
this.onUpload(item);
},
bannerHandler(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.banner.push(item);
this.onUpload(item);
},
channelImgHandler(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.channelImg.push(item);
this.onUpload(item);
},
sharePhotoHandler(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.sharePhoto.push(item);
this.onUpload(item);
},
shareImgHandler(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.shareImg.push(item);
this.onUpload(item);
},
/* 添加 */
addBottoms() {
if (this.form.bottoms.length >= 2) {
this.$message.error('最多添加2个活动底部菜单');
return;
}
this.form.bottoms.push({
urlType: 'link',
title: '',
url: '',
miniProgramId: '',
icon: []
});
},
/* 删除 */
removeBottoms(_row, index) {
this.form.bottoms.splice(index, 1);
},
uploadHandler0(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.bottoms[0]['icon'].push(item);
this.onUpload(item);
},
uploadHandler1(file) {
const item = {
file,
uid: file.uid,
name: file.name,
progress: 0,
status: null
};
if (!file.type.startsWith('image')) {
this.$message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 2) {
this.$message.error('大小不能超过 2MB');
return;
}
item.url = window.URL.createObjectURL(file);
// 关键就是这里要自己 push 添加数据而不是靠 v-modal 自动更新
this.form.bottoms[1]['icon'].push(item);
this.onUpload(item);
},
/* 上传 item */
onUpload(item) {
item.status = 'uploading';
const formData = new FormData();
formData.append('file', item.file);
request({
url: '/upload',
method: 'post',
data: formData,
onUploadProgress: (e) => {
if (e.lengthComputable) {
item.progress = (e.loaded / e.total) * 100;
}
}
})
.then((res) => {
if (res.data.code === 0) {
item.status = 'done';
item.url = res.data.data.full_url;
item.fileUrl = res.data.data.url;
}
})
.catch(() => {
item.status = 'exception';
});
}
},
watch: {
visible(visible) {
this.editVersion = false;
if (visible) {
this.editVersion = true;
if (this.data) {
this.$util.assignObject(this.form, {
...this.data
});
this.isUpdate = true;
if (this.form.shareTitle.length == 0) {
this.form.shareTitle.push('');
}
} else {
this.form.bottoms = [];
this.form.bgImg = [];
this.form.shareImg = [];
this.isUpdate = false;
}
} else {
this.$refs.form.clearValidate();
this.form = { ...this.defaultForm };
}
}
}
};
</script>
<style>
.ele-image-upload-list .ele-image-upload-item {
margin-top: 2px;
margin-bottom: 2px;
}
</style>