2025-04-01 15:25:15 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="poseTransfer">
|
|
|
|
|
<div class="configuratioBox" :class="{active:button.left}">
|
|
|
|
|
<div class="configuratio">
|
2025-04-09 14:09:19 +08:00
|
|
|
<!-- <div class="title">Give pose for them to select</div> -->
|
2025-04-01 15:25:15 +08:00
|
|
|
<div class="content">
|
|
|
|
|
<!-- <selectList @selectImgItem="selectImgItem" level1Type="Printboard" type="print"></selectList> -->
|
|
|
|
|
<div class="selectImg">
|
|
|
|
|
<div class="head">
|
2025-06-26 15:41:08 +08:00
|
|
|
<div class="text">{{ $t('poseTransfer.SelectDesign') }}</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
2025-04-09 14:09:19 +08:00
|
|
|
<div class="imgBox" v-mousewheel>
|
2025-06-18 11:05:23 +08:00
|
|
|
<!-- <div class="item" :class="{active:item.id == selectImg.id}" v-for="item in currentList" @click="selectImgItem(item)">
|
2025-04-01 15:25:15 +08:00
|
|
|
<img :src="item.imgUrl || item.url" alt="">
|
2025-04-09 14:09:19 +08:00
|
|
|
<a-checkbox v-model:checked="item.isChecked"></a-checkbox>
|
2025-06-18 11:05:23 +08:00
|
|
|
</div> -->
|
|
|
|
|
<div class="item" :class="{active:item.id == selectImg.id}" v-for="item,index in fileList" @click="selectImgItem(item)">
|
|
|
|
|
<div class="" v-if="item.status == 'uploading'" style="display: flex;align-items: center;">
|
|
|
|
|
<a-spin size="large" />
|
|
|
|
|
</div>
|
2025-06-22 13:52:28 +08:00
|
|
|
<img v-show="item.status != 'uploading'" :src="item.designOutfitUrl || item.imgUrl || item.url" alt="">
|
2025-06-18 11:05:23 +08:00
|
|
|
<div v-show="item.status != 'uploading'" class="btnBox">
|
|
|
|
|
<div :class="{active:item.isChecked}">
|
|
|
|
|
<i class="fi fi-br-check"></i>
|
|
|
|
|
</div>
|
|
|
|
|
<div @click.stop="setUploadDelete(item,index)">
|
|
|
|
|
<i class="fi fi-rr-trash icon_delete"></i>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
2025-06-20 11:36:44 +08:00
|
|
|
<div class="upload_item item" v-show="!isDesignPage">
|
2025-04-01 15:25:15 +08:00
|
|
|
<div class="upload_file_item">
|
|
|
|
|
<a-upload
|
|
|
|
|
:action="getUploadUrl() + '/api/history/toProductImageElementUpload'"
|
|
|
|
|
list-type="picture-card"
|
|
|
|
|
:capture="null"
|
|
|
|
|
:data="{
|
|
|
|
|
...upload,
|
|
|
|
|
}"
|
|
|
|
|
:headers="{ Authorization: token }"
|
|
|
|
|
:before-upload="beforeUpload"
|
|
|
|
|
v-model:file-list="fileList"
|
|
|
|
|
:multiple="true"
|
|
|
|
|
accept=".jpg,.png,.jpeg,.bmp"
|
|
|
|
|
@change="(file) => fileUploadChange(file)"
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
class="upload_tip_block"
|
|
|
|
|
>
|
|
|
|
|
<i class="fi fi-br-upload"></i>
|
|
|
|
|
<!-- <img class="upload_img_icon" src="@/assets/images/homePage/add_file.png"> -->
|
|
|
|
|
</div>
|
|
|
|
|
</a-upload>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="poses">
|
|
|
|
|
<div class="head">
|
2025-06-26 15:41:08 +08:00
|
|
|
<div class="text">{{$t('poseTransfer.Selectpose')}}</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
2025-04-09 14:09:19 +08:00
|
|
|
<div class="imgBox" v-mousewheel>
|
|
|
|
|
<div class="item" v-for="item in poseList" @click="selectPose(item)">
|
|
|
|
|
<img :src="item.firstFrame"
|
|
|
|
|
alt=""
|
|
|
|
|
@mouseenter.stop="gifPlay($event,item)"
|
|
|
|
|
@mouseleave.stop="gifPause($event,item)"
|
|
|
|
|
>
|
2025-06-26 15:41:08 +08:00
|
|
|
<div class="btnBox">
|
|
|
|
|
<div :class="{active:item.isChecked}">
|
|
|
|
|
<i class="fi fi-br-check"></i>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-06-11 15:08:17 +08:00
|
|
|
<div class="generage_btn_box" style="margin-left: auto;">
|
2025-06-09 10:25:54 +08:00
|
|
|
<!-- <div class="generage_btn started_btn" v-show="!isGenerate" @click="getgenerate">
|
2025-04-01 15:25:15 +08:00
|
|
|
{{ $t('Generate.Generate') }}
|
2025-06-09 10:25:54 +08:00
|
|
|
</div> -->
|
|
|
|
|
<div class="generage_btn started_btn" v-show="!isGenerate">
|
|
|
|
|
<i class="fi fi-bs-magic-wand" style="background-color: #000; font-size: 2.3rem; flex: 1;margin: 0;" @click="getgenerate()"></i>
|
|
|
|
|
<div class="icon iconfont icon-xiala" :class="{active:speedState}" @click.stop="openSpeed"></div>
|
|
|
|
|
<div class="content" v-show="speedState">
|
2025-06-22 13:52:28 +08:00
|
|
|
<div v-for="item in speedList" :key="item.value" :class="{active:item.value == speedData.value}" @click.stop="setSpeed(item)" :title="item.title">{{ item.label }}</div>
|
2025-06-09 10:25:54 +08:00
|
|
|
</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
2025-04-09 14:09:19 +08:00
|
|
|
<div v-show="isGenerate && !remGenerate" class="generage_btn started_btn">
|
2025-04-01 15:25:15 +08:00
|
|
|
<i class="fi fi-br-loading"></i>
|
|
|
|
|
</div>
|
2025-04-09 14:09:19 +08:00
|
|
|
<div v-show="remGenerate" @click="removeGenerate" class="generage_btn started_btn">
|
2025-04-01 15:25:15 +08:00
|
|
|
{{$t('Generate.Close')}}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="likeBox">
|
|
|
|
|
<div class="element">
|
2025-06-26 15:41:08 +08:00
|
|
|
<div class="title"><i class="fi fi-rs-comments"></i><span>{{$t('poseTransfer.InputVideo')}}</span></div>
|
2025-04-01 15:25:15 +08:00
|
|
|
<div class="content">
|
2025-06-03 14:57:18 +08:00
|
|
|
<generalDrag ref="generalDragLeft" :list="likeList" :isLike="true" :isVideo="true" @setBtn="likeSetBtn"></generalDrag>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
2025-04-09 14:09:19 +08:00
|
|
|
<!-- <div class="btnLeft" @click="setSize('left')" :class="{'active':button.left}">
|
|
|
|
|
<span class="icon iconfont icon-xiala"></span>
|
|
|
|
|
</div> -->
|
|
|
|
|
<div class="btnRight" @click="setSize('right')" :class="{'active':button.right}">
|
|
|
|
|
<span class="icon iconfont icon-xiala"></span>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-06-26 15:41:08 +08:00
|
|
|
<div class="noLikeBox" :class="{active:button.right,designPage:isDesignPage}">
|
2025-04-01 15:25:15 +08:00
|
|
|
<div class="element">
|
2025-06-26 15:41:08 +08:00
|
|
|
<div class="title"><i class="fi fi-rs-comments"></i><span>{{$t('poseTransfer.InputVideo')}}</span></div>
|
2025-04-01 15:25:15 +08:00
|
|
|
<div class="content">
|
2025-06-03 14:57:18 +08:00
|
|
|
<generalDrag ref="generalDragRight" :list="noLikeList" :isVideo="true" @setBtn="noLikeSetBtn"></generalDrag>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script lang="ts">
|
2025-06-18 11:05:23 +08:00
|
|
|
import { defineComponent,computed,ref,inject,nextTick,watch,createVNode,toRefs, reactive, onMounted} from 'vue'
|
2025-04-01 15:25:15 +08:00
|
|
|
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
|
|
|
|
|
import { Https } from "@/tool/https";
|
|
|
|
|
import { useStore } from "vuex";
|
|
|
|
|
import { Upload,message,Modal } from 'ant-design-vue';
|
|
|
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
|
import generalDrag from '@/component/modules/generalDrag.vue';
|
|
|
|
|
import { getUploadUrl,isMoible,getMinioUrl } from "@/tool/util";
|
|
|
|
|
import { getCookie,setCookie } from "@/tool/cookie";
|
|
|
|
|
import showViewVideo from "@/tool/mount";
|
|
|
|
|
|
|
|
|
|
// import selectList from '@/component/DetailCopy/module/selectList.vue';
|
|
|
|
|
export default defineComponent({
|
|
|
|
|
components:{
|
|
|
|
|
generalDrag,
|
|
|
|
|
// selectList,
|
|
|
|
|
},
|
|
|
|
|
props:{
|
2025-06-20 11:36:44 +08:00
|
|
|
isDesignPage:{
|
|
|
|
|
type:Boolean,
|
|
|
|
|
default:false,
|
|
|
|
|
},
|
2025-04-01 15:25:15 +08:00
|
|
|
},
|
|
|
|
|
emits:[],
|
|
|
|
|
setup(props,{emit}) {
|
|
|
|
|
const {t} = useI18n()
|
|
|
|
|
const store = useStore();
|
|
|
|
|
const data:any = reactive({
|
|
|
|
|
button:{
|
|
|
|
|
left:false,
|
|
|
|
|
right:false,
|
|
|
|
|
},
|
|
|
|
|
currentList:[],
|
|
|
|
|
fileList:[],
|
|
|
|
|
selectImg:{},
|
|
|
|
|
token:getCookie('token'),
|
|
|
|
|
upload:{
|
2025-06-20 11:36:44 +08:00
|
|
|
projectId:computed(()=>store.state.Workspace.probjects.id),
|
|
|
|
|
CollectionType:'PoseTransfer',
|
2025-04-01 15:25:15 +08:00
|
|
|
},
|
|
|
|
|
waitList:[],
|
2025-06-18 11:05:23 +08:00
|
|
|
likeList:computed(()=>store.state.HomeStoreModule.poseTransfer.likedList),
|
|
|
|
|
noLikeList:computed(()=>store.state.HomeStoreModule.poseTransfer.list),
|
2025-04-01 15:25:15 +08:00
|
|
|
isGenerate:false,//判断是否正在进行generate
|
|
|
|
|
remGenerate:false,
|
|
|
|
|
removeGenerate:false,
|
2025-04-09 14:09:19 +08:00
|
|
|
generateTime:null as any,
|
|
|
|
|
poseList:[],
|
|
|
|
|
selectPose:null as any,
|
2025-04-01 15:25:15 +08:00
|
|
|
})
|
2025-06-09 10:25:54 +08:00
|
|
|
let speed = reactive({
|
|
|
|
|
speedList:[
|
|
|
|
|
{
|
|
|
|
|
title:'Generate high-quality content',
|
|
|
|
|
label:'High',
|
|
|
|
|
value:'',
|
|
|
|
|
},{
|
|
|
|
|
title:'Generate using Wanxiang',
|
|
|
|
|
label:'WX',
|
|
|
|
|
value:'wx',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
speedState:false,
|
|
|
|
|
speedData:{
|
|
|
|
|
title:'Generate high-quality content',
|
|
|
|
|
label:'High',
|
|
|
|
|
value:'',
|
|
|
|
|
},
|
|
|
|
|
})
|
2025-04-01 15:25:15 +08:00
|
|
|
const setIsShowMark:any = inject('setIsShowMark')
|
2025-06-20 11:36:44 +08:00
|
|
|
const createProbject:any = inject('createProbject',()=>{})
|
2025-04-01 15:25:15 +08:00
|
|
|
const dataDom = reactive({
|
|
|
|
|
generalDragLeft:null as any,
|
|
|
|
|
generalDragRight:null as any,
|
|
|
|
|
scaleVideo:null as any,
|
|
|
|
|
})
|
2025-04-09 14:09:19 +08:00
|
|
|
const selectImgItem = (item:any,)=>{
|
2025-06-18 11:05:23 +08:00
|
|
|
if(item.isChecked){
|
|
|
|
|
item.isChecked = !item.isChecked
|
|
|
|
|
return
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
data.selectImg = item
|
2025-04-09 14:09:19 +08:00
|
|
|
data.fileList.forEach((listItem:any)=>listItem.isChecked = false)
|
|
|
|
|
data.currentList.forEach((listItem:any)=>listItem.isChecked = false)
|
|
|
|
|
item.isChecked = true
|
|
|
|
|
if(item.url || item.imgUrl)data.selectImg.minioUrl = getMinioUrl(item.url || item.imgUrl)
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
2025-06-20 11:36:44 +08:00
|
|
|
const openSetData = (designList:any)=>{
|
2025-06-22 13:52:28 +08:00
|
|
|
if(props.isDesignPage){//标识design页面打开的tools
|
2025-06-20 11:36:44 +08:00
|
|
|
data.fileList = designList
|
2025-06-22 13:52:28 +08:00
|
|
|
}else{
|
|
|
|
|
data.currentList = store.state.UploadFilesModule.modularData.toProduct
|
|
|
|
|
data.currentList = data.currentList?data.currentList:[]
|
|
|
|
|
setIsShowMark(false)
|
2025-06-20 11:36:44 +08:00
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
// dataDom.generalDrag.openSetData()
|
2025-04-09 14:09:19 +08:00
|
|
|
if(data.poseList.length == 0){
|
|
|
|
|
getPoseList()
|
|
|
|
|
}
|
2025-06-18 11:05:23 +08:00
|
|
|
// setCloudImg()
|
2025-04-09 14:09:19 +08:00
|
|
|
}
|
2025-06-18 11:05:23 +08:00
|
|
|
// const setCloudImg = ()=>{
|
|
|
|
|
// let arr = store.state.UploadFilesModule.cloudList
|
|
|
|
|
// let list = JSON.parse(JSON.stringify(arr.poseTransfer)) || []
|
|
|
|
|
// list.forEach((item:any)=>{
|
|
|
|
|
// item.url = item.firstFrameUrl
|
|
|
|
|
// data.noLikeList.unshift(item)
|
|
|
|
|
// })
|
|
|
|
|
// store.commit('clearCloudList','poseTransfer')
|
|
|
|
|
// }
|
2025-04-09 14:09:19 +08:00
|
|
|
const gifPlay = (e:any,item:any)=>{
|
|
|
|
|
e.target.src = item.gif//使用gif图片
|
|
|
|
|
}
|
|
|
|
|
const gifPause = (e:any,item:any)=>{
|
|
|
|
|
e.target.src = item.firstFrame//静态图片
|
|
|
|
|
}
|
|
|
|
|
const getPoseList = ()=>{
|
|
|
|
|
Https.axiosGet(Https.httpUrls.getAllPose).then((rv)=>{
|
|
|
|
|
rv[0].isChecked = true
|
|
|
|
|
data.selectPose = rv[0]?.id || 1
|
|
|
|
|
data.poseList = rv
|
|
|
|
|
})
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
const setSize = (str:any)=>{
|
|
|
|
|
data.button[str] = !data.button[str]
|
|
|
|
|
setItemPosition()
|
|
|
|
|
}
|
|
|
|
|
const setItemPosition = ()=>{
|
|
|
|
|
setTimeout(()=>{
|
|
|
|
|
dataDom.generalDragLeft.setItemPosition()
|
|
|
|
|
dataDom.generalDragRight.setItemPosition()
|
|
|
|
|
},200)
|
|
|
|
|
}
|
|
|
|
|
const getgenerate = ()=>{
|
|
|
|
|
if(!data.selectImg.minioUrl)return
|
|
|
|
|
if(data.isGenerate)return
|
|
|
|
|
|
|
|
|
|
data.isGenerate = true
|
2025-06-18 11:05:23 +08:00
|
|
|
// data.remGenerateTime = setTimeout(()=>{
|
|
|
|
|
// },10000)
|
2025-04-01 15:25:15 +08:00
|
|
|
let value = {
|
2025-04-09 14:09:19 +08:00
|
|
|
poseId:data.selectPose,
|
2025-04-01 15:25:15 +08:00
|
|
|
projectId:store.state.Workspace.probjects.id,
|
|
|
|
|
productImage:data.selectImg.minioUrl,
|
2025-06-09 10:25:54 +08:00
|
|
|
modelName:speed.speedData.value,
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
2025-06-09 10:25:54 +08:00
|
|
|
Https.axiosPost(Https.httpUrls.poseTransform,value).then((rv)=>{
|
2025-06-18 11:05:23 +08:00
|
|
|
data.remGenerate = true
|
2025-06-22 13:52:28 +08:00
|
|
|
data.noLikeList.unshift({taskId:rv,parentId:data.selectImg.parentId})
|
|
|
|
|
console.log(data.noLikeList)
|
2025-04-01 15:25:15 +08:00
|
|
|
setGenerate(rv)
|
|
|
|
|
}).catch((res:any)=>{
|
|
|
|
|
data.isGenerate = false
|
|
|
|
|
clearInterval(data.remGenerateTime)
|
|
|
|
|
data.remGenerate = false
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
const setGenerate = (dataList:any)=>{
|
2025-04-09 14:09:19 +08:00
|
|
|
let list:any = dataList
|
2025-06-18 11:05:23 +08:00
|
|
|
data.waitList = list
|
2025-04-01 15:25:15 +08:00
|
|
|
let state = true
|
|
|
|
|
data.generateTime = setInterval(()=>{
|
2025-04-09 14:09:19 +08:00
|
|
|
if(!data.isGenerate || !data.remGenerate)return
|
2025-04-01 15:25:15 +08:00
|
|
|
if(!state)return
|
|
|
|
|
state = false
|
2025-06-09 10:25:54 +08:00
|
|
|
Https.axiosPost(Https.httpUrls.poseTransformResult,{taskId:list}).then(
|
2025-04-01 15:25:15 +08:00
|
|
|
(rv) => {
|
|
|
|
|
rv=[rv]
|
|
|
|
|
state = true
|
|
|
|
|
if(data.isGenerate){//防止取消后有正在执行的获取状态
|
|
|
|
|
// data.waitList = rv.filter((item:any)=>item.status != 'Success' && item.status != 'Fail' && item.status != 'Invalid')
|
|
|
|
|
rv.forEach((element:any) => {
|
|
|
|
|
if(element.status == 'Success'){
|
|
|
|
|
element.url = element.firstFrameUrl
|
|
|
|
|
let index = data.noLikeList.findIndex((obj:any) => obj.taskId === element.taskId);
|
|
|
|
|
data.noLikeList[index] = element
|
2025-04-09 14:09:19 +08:00
|
|
|
list = ''
|
|
|
|
|
// if(list?.filter)list = list?.filter((item:any) => item !== element.taskId);
|
2025-06-18 11:05:23 +08:00
|
|
|
store.dispatch('getCredits')
|
2025-04-09 14:09:19 +08:00
|
|
|
}else if(element.status == 'Fail'){
|
2025-06-18 11:05:23 +08:00
|
|
|
let index = data.noLikeList.findIndex((obj:any) => obj.taskId === element.taskId);
|
2025-06-26 15:41:08 +08:00
|
|
|
message.info(t('ProductImg.jsContent3'))
|
2025-06-18 11:05:23 +08:00
|
|
|
data.noLikeList.splice(index,1)
|
|
|
|
|
clearInterval(data.generateTime)
|
|
|
|
|
clearInterval(data.remGenerateTime)
|
|
|
|
|
data.remGenerate = false
|
|
|
|
|
data.isGenerate = false
|
|
|
|
|
store.dispatch('getCredits')
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
).catch(res=>{
|
2025-06-18 11:05:23 +08:00
|
|
|
let index = data.noLikeList.findIndex((obj:any) => obj.taskId === list);
|
|
|
|
|
data.noLikeList.splice(index,1)
|
2025-04-01 15:25:15 +08:00
|
|
|
clearInterval(data.generateTime)
|
|
|
|
|
clearInterval(data.remGenerateTime)
|
|
|
|
|
data.isGenerate = false
|
|
|
|
|
data.remGenerate = false
|
|
|
|
|
});
|
2025-06-09 10:25:54 +08:00
|
|
|
},20000)
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
const removeGenerate = ()=>{
|
|
|
|
|
//取消操作
|
|
|
|
|
data.isGenerate = false
|
|
|
|
|
data.remGenerate = false
|
|
|
|
|
clearInterval(data.generateTime)
|
|
|
|
|
if(data.waitList){
|
|
|
|
|
// let str = data.waitList.map((obj:any) => obj.taskId).join(',');
|
|
|
|
|
let value = {
|
|
|
|
|
uniqueId:data.waitList,
|
|
|
|
|
userId:store.state.UserHabit.userDetail.userId,
|
|
|
|
|
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
|
|
|
type: 'PoseTransferation'
|
|
|
|
|
}
|
|
|
|
|
Https.axiosGet(Https.httpUrls.generateStopWaiting, {params:value}).then(
|
|
|
|
|
(rv) => {
|
|
|
|
|
data.waitList = []
|
2025-06-26 15:41:08 +08:00
|
|
|
const indexes = data.noLikeList
|
|
|
|
|
.map((item, index) => item?.status !== 'Success' ? index : -1)
|
|
|
|
|
.filter(index => index !== -1);
|
|
|
|
|
indexes.forEach((itemIndex:number)=>{
|
|
|
|
|
data.noLikeList.splice(itemIndex,1)
|
|
|
|
|
})
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
).catch(res=>{
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-20 11:36:44 +08:00
|
|
|
let isSelectObject = false
|
2025-06-03 14:57:18 +08:00
|
|
|
let beforeUpload = async (file: any)=>{
|
2025-04-01 15:25:15 +08:00
|
|
|
const isJpgOrPng =
|
|
|
|
|
file.type === "image/jpeg" ||
|
|
|
|
|
file.type === "image/png" ||
|
|
|
|
|
file.type === "image/jpg" ||
|
|
|
|
|
file.type === "image/bmp";
|
|
|
|
|
if (!isJpgOrPng) {
|
|
|
|
|
message.info(useI18n().t('MoodboardUpload.jsContent3'));
|
|
|
|
|
}
|
|
|
|
|
const isLt2M = file.size / 1024 / 1024 < 5;
|
|
|
|
|
if (!isLt2M) {
|
|
|
|
|
message.info(useI18n().t('MoodboardUpload.jsContent4'));
|
|
|
|
|
}
|
2025-06-22 13:52:28 +08:00
|
|
|
if(!data?.upload?.projectId && !isSelectObject){
|
2025-06-20 11:36:44 +08:00
|
|
|
isSelectObject = true
|
2025-06-03 14:57:18 +08:00
|
|
|
await createProbject()
|
|
|
|
|
}
|
|
|
|
|
return (isJpgOrPng && isLt2M && data.upload.projectId) || Upload.LIST_IGNORE;
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
const fileUploadChange = (value: any)=> {
|
|
|
|
|
let file = value.file;
|
|
|
|
|
let bor = true
|
|
|
|
|
if (file.status === "done") {
|
|
|
|
|
let res = JSON.parse(file.xhr.response);
|
|
|
|
|
if(res.errCode == 0){
|
|
|
|
|
file.imgUrl = res.data.url;
|
|
|
|
|
file.id = res.data.id
|
2025-04-09 14:09:19 +08:00
|
|
|
data.fileList.forEach((listItem:any)=>listItem.isChecked = false)
|
|
|
|
|
data.currentList.forEach((listItem:any)=>listItem.isChecked = false)
|
2025-04-01 15:25:15 +08:00
|
|
|
file.isChecked = true
|
|
|
|
|
file.type = 'ProductElement'
|
|
|
|
|
// if(props.productimgMenu.value == 'Relight'){
|
|
|
|
|
// file.type = "ToProductImage"
|
|
|
|
|
// }
|
|
|
|
|
data.selectImg = res.data
|
|
|
|
|
data.fileList.filter((v: any) => v.status === "done");
|
|
|
|
|
}else{
|
|
|
|
|
bor = false
|
|
|
|
|
}
|
|
|
|
|
// this.showFileList = productImgData.fileList
|
|
|
|
|
} else if (file.status === "error") {
|
|
|
|
|
bor = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const likeSetBtn = (id:any,str:string)=>{
|
|
|
|
|
data.likeList.forEach((item:any,index:any)=>{
|
2025-04-23 09:39:24 +08:00
|
|
|
if(item.id == id && id){
|
2025-04-01 15:25:15 +08:00
|
|
|
if(str == 'zoom'){
|
|
|
|
|
showViewVideo({url:item.videoUrl})
|
|
|
|
|
}else if(str == 'like'){
|
|
|
|
|
likeFile(item,'noLike',index)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
const noLikeSetBtn = (id:any,str:string)=>{
|
2025-04-23 09:39:24 +08:00
|
|
|
if(str == 'delete'){
|
|
|
|
|
data.noLikeList = data.noLikeList.filter((v:any) => v.id != id);
|
|
|
|
|
}else{
|
|
|
|
|
data.noLikeList.forEach((item:any,index:any)=>{
|
|
|
|
|
if(item.id == id && id){
|
|
|
|
|
if(str == 'zoom'){
|
|
|
|
|
showViewVideo({url:item.videoUrl})
|
|
|
|
|
|
|
|
|
|
}else if(str == 'like'){
|
|
|
|
|
likeFile(item,'like',index)
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
2025-04-23 09:39:24 +08:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
let likeFile = (item:any,str:any,index:any) =>{
|
|
|
|
|
let url
|
|
|
|
|
let value = {
|
|
|
|
|
}
|
|
|
|
|
if(str == 'like'){
|
|
|
|
|
value = {
|
|
|
|
|
likeOrDislike:'like',
|
|
|
|
|
transformedId:item.id,
|
2025-06-09 10:25:54 +08:00
|
|
|
projectId:store.state.Workspace.probjects.id,
|
2025-06-20 11:36:44 +08:00
|
|
|
collectionSortParentId:props.isDesignPage?item.parentId:'',
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
value = {
|
|
|
|
|
likeOrDislike:'dislike',
|
|
|
|
|
transformedId:item.id,
|
2025-06-09 10:25:54 +08:00
|
|
|
projectId:store.state.Workspace.probjects.id,
|
2025-06-20 11:36:44 +08:00
|
|
|
collectionSortParentId:props.isDesignPage?item.parentId:'',
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Https.axiosPost(Https.httpUrls.poselikeOrDisike, {},{params:value}).then(
|
|
|
|
|
(rv) => {
|
|
|
|
|
if(str == 'like'){
|
|
|
|
|
let value = {
|
2025-06-18 11:05:23 +08:00
|
|
|
likedList:[item],
|
2025-04-01 15:25:15 +08:00
|
|
|
str:'add',
|
|
|
|
|
index:-1,
|
|
|
|
|
}
|
|
|
|
|
store.commit("setPoseTransfer", value);
|
|
|
|
|
data.noLikeList.splice(index,1)
|
|
|
|
|
}else{
|
|
|
|
|
let value = {
|
2025-06-18 11:05:23 +08:00
|
|
|
likedList:[item],
|
2025-04-01 15:25:15 +08:00
|
|
|
str:'splice',
|
|
|
|
|
index:index,
|
|
|
|
|
}
|
|
|
|
|
data.noLikeList.push(item)
|
|
|
|
|
store.commit("setPoseTransfer", value);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
).catch(res=>{
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-04-09 14:09:19 +08:00
|
|
|
const selectPose = (item:any)=>{
|
2025-06-20 11:36:44 +08:00
|
|
|
data.poseList.forEach((listItem:any)=>listItem.isChecked = false)
|
2025-04-09 14:09:19 +08:00
|
|
|
item.isChecked = true
|
|
|
|
|
data.selectPose = item?.id || 1
|
|
|
|
|
}
|
2025-06-09 10:25:54 +08:00
|
|
|
const openSpeed = ()=>{
|
|
|
|
|
speed.speedState = !speed.speedState
|
|
|
|
|
if(speed.speedState){
|
|
|
|
|
document.addEventListener('click',openSpeed)
|
|
|
|
|
}else{
|
|
|
|
|
document.removeEventListener('click',openSpeed)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const setSpeed = (item:any)=>{
|
|
|
|
|
speed.speedData = item
|
2025-06-18 11:05:23 +08:00
|
|
|
speed.speedState = false
|
|
|
|
|
}
|
|
|
|
|
const setUploadDelete = (item:any,index:any)=>{
|
|
|
|
|
let value = {
|
|
|
|
|
id:item.id
|
|
|
|
|
}
|
|
|
|
|
Https.axiosPost(Https.httpUrls.toProductImageElementDelete,{},{params:value}).then((rv)=>{
|
|
|
|
|
let storeData = {
|
|
|
|
|
str:'delete',
|
|
|
|
|
index,
|
|
|
|
|
}
|
|
|
|
|
store.commit('setUploadElement',storeData)
|
|
|
|
|
})
|
2025-06-09 10:25:54 +08:00
|
|
|
}
|
2025-06-22 13:52:28 +08:00
|
|
|
watch(()=>store.state.Workspace.probjects.id,(newVal,oldVal)=>{
|
|
|
|
|
nextTick(()=>{
|
|
|
|
|
data.fileList = store.state.HomeStoreModule.uploadElement
|
|
|
|
|
let list = store.state.HomeStoreModule.poseTransfer.list
|
|
|
|
|
let taskIdList = list.filter((item:any)=>!item.id)
|
|
|
|
|
if(taskIdList.length > 0){
|
|
|
|
|
data.isGenerate = true
|
|
|
|
|
data.remGenerate = true
|
|
|
|
|
console.log(taskIdList)
|
|
|
|
|
setGenerate(taskIdList[0].taskId)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
},{immediate: true })
|
2025-04-01 15:25:15 +08:00
|
|
|
return{
|
2025-06-09 10:25:54 +08:00
|
|
|
...toRefs(speed),
|
2025-04-01 15:25:15 +08:00
|
|
|
...toRefs(dataDom),
|
|
|
|
|
...toRefs(data),
|
|
|
|
|
openSetData,
|
|
|
|
|
selectImgItem,
|
|
|
|
|
setSize,
|
|
|
|
|
setItemPosition,
|
2025-04-09 14:09:19 +08:00
|
|
|
gifPlay,
|
|
|
|
|
gifPause,
|
2025-04-01 15:25:15 +08:00
|
|
|
getgenerate,
|
|
|
|
|
getUploadUrl,
|
|
|
|
|
beforeUpload,
|
|
|
|
|
fileUploadChange,
|
|
|
|
|
removeGenerate,
|
|
|
|
|
likeSetBtn,
|
|
|
|
|
noLikeSetBtn,
|
2025-04-09 14:09:19 +08:00
|
|
|
selectPose,
|
2025-06-09 10:25:54 +08:00
|
|
|
openSpeed,
|
|
|
|
|
setSpeed,
|
2025-06-18 11:05:23 +08:00
|
|
|
setUploadDelete,
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
},
|
2025-04-09 14:09:19 +08:00
|
|
|
directives:{
|
|
|
|
|
mousewheel:{
|
|
|
|
|
mounted (el) {
|
|
|
|
|
el.addEventListener('wheel',(e:WheelEvent)=>{
|
|
|
|
|
let num = 0
|
|
|
|
|
if(e.deltaY > 0){
|
|
|
|
|
num = 25
|
|
|
|
|
}else{
|
|
|
|
|
num = -25
|
|
|
|
|
}
|
|
|
|
|
el.scrollBy(num, 0);
|
|
|
|
|
},{ passive: true })
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
},
|
2025-04-01 15:25:15 +08:00
|
|
|
provide() {
|
|
|
|
|
return {
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
.poseTransfer{
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
position: relative;
|
|
|
|
|
font-size: 2rem;
|
|
|
|
|
font-weight: 900;
|
|
|
|
|
display: flex;
|
|
|
|
|
> .configuratioBox{
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
align-items: center;
|
2025-04-09 14:09:19 +08:00
|
|
|
padding-right: 3.8rem;
|
2025-06-18 11:05:23 +08:00
|
|
|
width: 39rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
&.active{
|
|
|
|
|
width: 0;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
> .generate{
|
2025-04-09 14:09:19 +08:00
|
|
|
margin-left: auto;
|
|
|
|
|
> .started_btn{
|
|
|
|
|
font-weight: 300;
|
|
|
|
|
}
|
2025-06-09 10:25:54 +08:00
|
|
|
.generage_btn{
|
|
|
|
|
width: 10rem;
|
|
|
|
|
position: relative;
|
|
|
|
|
}
|
|
|
|
|
.icon-xiala{
|
|
|
|
|
margin-left: 1rem;
|
|
|
|
|
transition: all .3s;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
&.active{
|
|
|
|
|
transform: rotate(180deg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.content{
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 100%;
|
|
|
|
|
width: 100%;
|
|
|
|
|
left: 0rem;
|
|
|
|
|
text-align: center;
|
|
|
|
|
border-radius: calc(1rem* 1.2);
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
z-index: 3;
|
|
|
|
|
margin-top: .2rem;
|
|
|
|
|
>div{
|
|
|
|
|
background: #cccccc;
|
|
|
|
|
line-height: 2;
|
|
|
|
|
font-size: 1.8rem;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
&.active{
|
|
|
|
|
background-color: #616161;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>div:hover{
|
|
|
|
|
background: #999999;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .configuratioBox > .configuratio{
|
2025-06-18 11:05:23 +08:00
|
|
|
width: 100%;
|
2025-04-09 14:09:19 +08:00
|
|
|
padding-bottom: 1rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
> .title{
|
|
|
|
|
// font-size: 2.6rem;
|
|
|
|
|
}
|
|
|
|
|
> .content{
|
2025-04-09 14:09:19 +08:00
|
|
|
// margin-top: 4rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
> .selectImg,> .poses{
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
> .imgBox{
|
|
|
|
|
flex: 1;
|
|
|
|
|
max-height: 45rem;
|
|
|
|
|
margin-top: 2rem;
|
|
|
|
|
display: flex;
|
2025-04-09 14:09:19 +08:00
|
|
|
flex-direction: row;
|
|
|
|
|
flex-wrap: nowrap;
|
2025-04-01 15:25:15 +08:00
|
|
|
justify-content: space-between;
|
|
|
|
|
width: 100%;
|
|
|
|
|
overflow: hidden;
|
2025-04-09 14:09:19 +08:00
|
|
|
overflow-x: auto;
|
2025-04-01 15:25:15 +08:00
|
|
|
> .item{
|
2025-04-09 14:09:19 +08:00
|
|
|
margin-right: 1rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
width: calc(100% / 2 - .5rem);
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
height: 25rem;
|
2025-04-09 14:09:19 +08:00
|
|
|
position: relative;
|
|
|
|
|
// &.active{
|
|
|
|
|
// border: 2px solid;
|
|
|
|
|
// }
|
|
|
|
|
:deep(.ant-checkbox-wrapper){
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 2rem;
|
|
|
|
|
right: 2rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
2025-06-18 11:05:23 +08:00
|
|
|
> .btnBox{
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: 1rem;
|
|
|
|
|
top: 1rem;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
> div{
|
|
|
|
|
width: 2rem;
|
|
|
|
|
height: 2rem;
|
|
|
|
|
display: flex;
|
|
|
|
|
border: 1px solid;
|
|
|
|
|
align-items: center;
|
|
|
|
|
border-radius: .5rem;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
margin-bottom: 1rem;
|
|
|
|
|
> i{
|
|
|
|
|
display: flex;
|
|
|
|
|
}
|
|
|
|
|
>.fi-br-check{
|
|
|
|
|
color: #fff;
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
&.active{
|
|
|
|
|
background: #000;
|
|
|
|
|
> i{
|
|
|
|
|
display: flex;
|
|
|
|
|
color: #fff;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-26 15:41:08 +08:00
|
|
|
> .btnBox{
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: 1rem;
|
|
|
|
|
top: 1rem;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
> div{
|
|
|
|
|
width: 2rem;
|
|
|
|
|
height: 2rem;
|
|
|
|
|
display: flex;
|
|
|
|
|
border: 1px solid;
|
|
|
|
|
align-items: center;
|
|
|
|
|
border-radius: .5rem;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
margin-bottom: 1rem;
|
|
|
|
|
> i{
|
|
|
|
|
display: flex;
|
|
|
|
|
}
|
|
|
|
|
>.fi-br-check{
|
|
|
|
|
color: #fff;
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
&.active{
|
|
|
|
|
background: #000;
|
|
|
|
|
> i{
|
|
|
|
|
display: flex;
|
|
|
|
|
color: #fff;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
> img{
|
|
|
|
|
width: 100%;
|
|
|
|
|
object-fit: contain;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .upload_item{
|
|
|
|
|
border: none;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .head{
|
|
|
|
|
color: #000;
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
> .text{
|
|
|
|
|
display: inline-block;
|
2025-04-09 14:09:19 +08:00
|
|
|
font-size: 1.6rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-09 14:09:19 +08:00
|
|
|
|
2025-04-01 15:25:15 +08:00
|
|
|
> .poses{
|
|
|
|
|
margin-top: 3rem;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .likeBox ,> .noLikeBox{
|
|
|
|
|
flex: 1;
|
|
|
|
|
position: relative;
|
|
|
|
|
> .element{
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
> .btnLeft,> .btnRight{
|
|
|
|
|
position: absolute;
|
2025-06-26 15:41:08 +08:00
|
|
|
width: 3rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
height: 7rem;
|
|
|
|
|
background: #fff;
|
|
|
|
|
border: 2px solid;
|
|
|
|
|
border-right: none;
|
|
|
|
|
border-radius: 2rem 0 0 2rem;
|
|
|
|
|
top: 50%;
|
|
|
|
|
transform: translate(-100%,-50%);
|
|
|
|
|
left: 0;
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
z-index: 2;
|
|
|
|
|
cursor: pointer;
|
2025-06-26 15:41:08 +08:00
|
|
|
transition: all .3s;
|
2025-04-01 15:25:15 +08:00
|
|
|
>span{
|
|
|
|
|
transition: all .3s;
|
|
|
|
|
transform: rotate(90deg);
|
2025-04-09 14:09:19 +08:00
|
|
|
|
|
|
|
|
}
|
2025-06-26 15:41:08 +08:00
|
|
|
|
2025-04-09 14:09:19 +08:00
|
|
|
&.active{
|
|
|
|
|
>span{
|
2025-04-01 15:25:15 +08:00
|
|
|
transform: rotate(270deg);
|
2025-04-09 14:09:19 +08:00
|
|
|
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .btnRight{
|
2025-06-26 15:41:08 +08:00
|
|
|
left: calc(100% + 3rem);
|
2025-04-01 15:25:15 +08:00
|
|
|
transform: translate(-100%,-50%) rotate(180deg);
|
2025-06-26 15:41:08 +08:00
|
|
|
&:hover{
|
|
|
|
|
width: 4rem;
|
|
|
|
|
left: calc(100% + 4rem);
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
> .content{
|
|
|
|
|
flex: 1;
|
|
|
|
|
padding: 1.7rem 2rem;
|
|
|
|
|
border-radius: 3rem;
|
|
|
|
|
background: #f7f8fa;
|
|
|
|
|
}
|
|
|
|
|
> .title{
|
|
|
|
|
margin-bottom: 2rem;
|
2025-04-09 14:09:19 +08:00
|
|
|
font-size: 1.6rem;
|
|
|
|
|
font-weight: 900;
|
|
|
|
|
> span{
|
|
|
|
|
margin-left: 1rem;
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2025-06-26 15:41:08 +08:00
|
|
|
|
|
|
|
|
> .designPage{
|
|
|
|
|
padding-left: 4rem;
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
> .noLikeBox{
|
|
|
|
|
padding-left: 2.3rem;
|
|
|
|
|
&.active{
|
|
|
|
|
flex: 0;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|