Files
siyu-admin/src/views/sylive/activity/components/activity-item.vue
T
2022-09-29 14:41:29 +08:00

242 lines
6.3 KiB
Vue

<!-- 用户编辑弹窗 -->
<template>
<ele-modal
width="750px"
:visible="visible"
:append-to-body="true"
:close-on-click-modal="true"
custom-class="ele-dialog-form"
title="商品信息"
@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="price">
<el-input
clearable
:maxlength="60"
v-model="form.price"
placeholder="请输入商品价格"
/>
</el-form-item>
<el-form-item label="商品图片:" prop="itemImg">
<ele-image-upload
v-model="form.itemImg"
:limit="10"
:drag="true"
:multiple="true"
:upload-handler="itemImgHandler"
@upload="onUpload"
/>
<div class="ele-text-secondary">建议尺寸750X680</div>
</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="商品简介:" prop="introduction">
<el-input
v-model="form.introduction"
placeholder="请输入商品简介"
:rows="5"
type="textarea"
/>
</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 EleImageUpload from 'ele-admin/es/ele-image-upload';
import request from '@/utils/request';
import { updateActivityItem } from '@/api/sylive/activity';
export default {
components: { EleImageUpload },
props: {
// 弹窗是否打开
visible: Boolean,
// 修改回显的数据
data: Object
},
data() {
const defaultForm = {
activityId: null,
title: '',
price: '',
itemImg: [],
dateRange: '',
introduction: ''
};
return {
defaultForm,
// 表单数据
form: { ...defaultForm },
// 表单验证规则
rules: {
title: [
{
required: true,
message: '请输入商品标题',
trigger: 'blur'
}
],
price: [
{
required: true,
message: '请输入商品价格',
trigger: 'blur'
}
],
itemImg: [
{
required: true,
message: '请上传商品图',
trigger: 'blur'
}
],
dateRange: [
{
required: true,
message: '请选择抢购时间',
trigger: 'blur'
}
]
},
// 提交状态
loading: false,
// 是否是修改
isUpdate: false
};
},
computed: {
// 是否开启响应式布局
styleResponsive() {
return this.$store.state.theme.styleResponsive;
}
},
methods: {
/* 保存编辑 */
save() {
this.$refs.form.validate((valid) => {
if (!valid) {
return false;
}
this.loading = true;
const data = {
...this.form
};
const saveOrUpdate = updateActivityItem;
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);
},
/* 上传事件 */
itemImgHandler(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.itemImg.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) {
if (visible) {
if (this.data) {
this.$util.assignObject(this.form, {
...this.data
});
this.isUpdate = true;
} else {
this.form.itemImg = [];
this.isUpdate = false;
}
} else {
this.$refs.form.clearValidate();
this.form = { ...this.defaultForm };
}
}
}
};
</script>
<style>
.ele-image-upload-list .ele-image-upload-item {
margin-top: 5px;
margin-bottom: 5px;
}
</style>