Files
ylst-pc/src/views/Creative/components/Create3D.vue
2022-12-20 11:34:56 +08:00

173 lines
5.1 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>
<a-modal v-model:visible="visible" :title="title" width="800px" @ok="ok">
<a-steps v-if="formData.type==CREATIVE_TYPE.THREE_D" :current="step" size="small" style="margin: 0 auto; width: 80%;">
<a-step title="素材信息" />
<a-step title="选择环境" />
<a-step title="选择货架" />
<a-step title="选择商品" />
</a-steps>
<a-steps v-else :current="step" size="small" style="margin: 0 auto; width: 60%;">
<a-step title="素材信息" />
<a-step title="选择素材" />
</a-steps>
<a-form v-if="step==0" :label-col="{ span: 6 }" :wrapper-col="{ span: 14 }" style="margin: 40px 0;">
<a-form-item label="素材名称">
<a-input v-model:value="formData.title" placeholder="请输入素材名称" />
</a-form-item>
</a-form>
<div v-if="formData.type==CREATIVE_TYPE.THREE_D" style="margin: 20px 0;">
<div v-if="step==1">
<ChooseMarerial :type="THREE_D_TYPE.PANORAMA" @change="val => formData.data.panorama = val"/>
</div>
<div v-if="step==2">
<ChooseMarerial :type="THREE_D_TYPE.SHELF" @change="val => formData.data.shelves = val"/>
</div>
<div v-if="step==3">
<ChooseMarerial :type="THREE_D_TYPE.WARE" @change="val => formData.data.wares = val"/>
</div>
</div>
<div v-if="formData.type==CREATIVE_TYPE.MODEL_3D" style="margin: 20px 0;">
<div v-if="step==1">
<ChooseMarerial :type="THREE_D_TYPE.CHARTLET" @change="val => formData.data.panorama = val"/>
</div>
</div>
<div v-if="formData.type==CREATIVE_TYPE.RING_360" style="margin: 20px 0;">
<a-form v-if="step==1" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" style="margin: 20px 0;">
<a-form-item label="上传图片" style="padding-right: 10%;">
<a-upload :customRequest="onCustomRequest" multiple v-model:file-list="formData.data.fileList" :showUploadList="false">
<a-button>
<upload-outlined></upload-outlined>
上传
</a-button>
</a-upload>
<p class="ant-upload-hint">
图片格式大小数量要求jpgpng格式分辨率需保持一致单个环物素材包最大支持上传500M不多于40张建议上传30~40张图片单个环物素材包50M效果更佳图片命名图片名称后缀按照字母/数字升序命名010203以此类推单反拍摄素材名可自动识别
</p>
<div class="image-list">
<div class="image-list-item" v-for="(file, index) in formData.data.fileList" :key="index">
<img :src="file.response?.url" alt="">
<MinusCircleFilled class="del" @click="formData.data.fileList=formData.data.fileList.filter(x=>x!=file)"/>
</div>
</div>
</a-form-item>
</a-form>
</div>
</a-modal>
</template>
<script setup>
import { UploadOutlined, InboxOutlined, MinusCircleFilled } from '@ant-design/icons-vue';
import { CREATIVE_TYPE_S, CREATIVE_TYPE, buildData } from "./Create3D.constant";
import { THREE_D_TYPE } from "./CreateMaterial.constant";
import ChooseMarerial from "./ChooseMarerial.vue"
const { ref, reactive }=require("@vue/reactivity");
import common from "@/api/common.js";
import { createMaterialCenter } from "../api";
const emit = defineEmits(["complete"]);
const title = ref("");
const visible = ref(false);
const step = ref(0);
const formData = ref({
type: 1,
title: '',
cover: '',
data: {
panorama: [],
shelves: [],
wares: [],
fileList: [],
}
});
const onCustomRequest = async (upload) => {
const data = await common.cosUpload3D(upload.file);
upload.onSuccess(data);
}
const show = (type) => {
const obj = CREATIVE_TYPE_S.find(x => x.type == type);
if(!obj) return;
title.value = obj.name;
var target = JSON.parse(JSON.stringify(obj));
target.title = "";
target.cover = "";
target.data = {
panorama: [],
shelves: [],
wares: [],
fileList: [],
};
target.version = new Date().getTime();
formData.value = target;
step.value = 0;
visible.value = true;
}
const ok = async () => {
step.value++;
if(formData.value.type == CREATIVE_TYPE.THREE_D) {
if(step.value >= 4) {
formData.value.data = buildData(formData.value);
await createMaterialCenter(formData.value);
visible.value = false;
emit("complete");
}
}
else {
if(step.value >= 2) {
formData.value.data = buildData(formData.value)
await createMaterialCenter(formData.value);
visible.value = false;
emit("complete");
}
}
}
defineExpose({
show
})
</script>
<style scoped lang="scss">
.back{
cursor: pointer;
}
.ant-upload-drag-icon{
:deep(svg){
font-size: 50px!important;
}
}
.image-list{
.image-list-item{
width: 100px;
height: 100px;
display: inline-block;
margin-right: 10px;
position: relative;
font-size: 40px;
img{
max-width: 100%;
max-height: 100%;
}
.del{
color: red;
position: absolute;
right: -10px;
top: -10px;
:deep(*){
font-size: 20px;
}
}
}
}
</style>