Files
aida_front/src/component/home/newProject/workspace.vue

548 lines
15 KiB
Vue
Raw Normal View History

2025-05-20 16:47:27 +08:00
<template>
<div class="workspace">
<div class="workspaceBox">
2025-08-22 10:27:48 +08:00
<div class="title marginBottom">
<div class="titleText">{{$t('Habit.generationSetting')}}</div>
</div>
2025-05-20 16:47:27 +08:00
<div class="projectName marginBottom" v-if="show.title">
2025-09-17 14:01:58 +08:00
<div class="text">{{$t('Habit.ProjectName')}}: </div>
2025-05-20 16:47:27 +08:00
<div class="input">
<input type="text" v-model="selectObject.name">
</div>
</div>
<div class="gender marginBottom" v-if="show.age">
2025-07-19 14:04:48 +08:00
<div class="text">{{$t('Habit.Role')}}:</div>
2025-05-20 16:47:27 +08:00
<div class="radio">
<label>
2025-07-19 14:04:48 +08:00
<input type="radio" :disabled="status == 'edit'" name="ageGroup" v-model="selectObject.ageGroup" value="Adult">
2025-06-26 15:41:08 +08:00
<span>{{$t('Habit.Adult')}}</span>
2025-05-20 16:47:27 +08:00
</label>
<label>
2025-07-19 14:04:48 +08:00
<input type="radio" :disabled="status == 'edit'" name="ageGroup" v-model="selectObject.ageGroup" value="Child">
2025-06-26 15:41:08 +08:00
<span>{{$t('Habit.Child')}}</span>
2025-05-20 16:47:27 +08:00
</label>
</div>
</div>
<div class="gender marginBottom">
2025-07-19 14:04:48 +08:00
<div class="text">{{$t('Habit.Gender')}}:</div>
2025-05-20 16:47:27 +08:00
<div class="radio">
<label>
2025-09-23 16:03:08 +08:00
<input type="radio" name="gender" v-model="selectObject.sex" value="Female">
2025-06-26 15:41:08 +08:00
<span>{{$t('Habit.Female')}}</span>
2025-05-20 16:47:27 +08:00
</label>
<label>
2025-09-23 16:03:08 +08:00
<input type="radio" name="gender" v-model="selectObject.sex" value="Male">
2025-06-26 15:41:08 +08:00
<span>{{$t('Habit.Male')}}</span>
2025-05-20 16:47:27 +08:00
</label>
</div>
</div>
<div class="style marginBottom" v-if="show.style">
2025-06-26 15:41:08 +08:00
<div class="text">{{$t('Habit.Style')}}</div>
2025-08-22 10:27:48 +08:00
<div class="center">{{ selectObject?.styleName?selectObject?.styleName:'All' }}</div>
<div class="gallery_btn" @click="setStyle">{{ $t('Habit.Select') }}</div>
2025-05-20 16:47:27 +08:00
</div>
<div class="style brand marginBottom">
2025-07-19 14:04:48 +08:00
<div class="text">{{$t('Habit.Brand')}}:</div>
2025-08-22 10:27:48 +08:00
<div class="gallery_btn" @click="setBrandDNA">{{ $t('Habit.Select') }}</div>
2025-05-28 10:28:07 +08:00
</div>
2025-08-22 10:27:48 +08:00
<div class="brandImg" v-if="selectObject.userBrandDna"><img :src="selectObject.userBrandDnaImg"></div>
2025-06-03 14:57:18 +08:00
<div class="brandDNAStrenght marginBottom" v-if="selectObject.userBrandDna">
2025-08-22 10:27:48 +08:00
<div class="text" style="font-size: 1.6rem;">
{{$t('Habit.BrandStrength')}}: ({{ `${selectObject.brandPercentage || 0}%` }})
2025-06-03 14:57:18 +08:00
</div>
2025-05-28 10:28:07 +08:00
<a-slider class="system_silder"
v-model:value="selectObject.brandPercentage"
:tip-formatter="formatterBrandDNA"
>
</a-slider>
</div>
2025-08-22 10:27:48 +08:00
<div class="position marginBottom" v-show="show.position" v-if="httpWorkflowType == 'SINGLE_DESIGN'">
<div class="text">
{{$t('Habit.Category')}}:
</div>
<generalMenu style="width:100%;" :ulStyle="{background: '#fff'}" :selectWidth="'100%'" :dataList="selectObject.positionList" @setprintModel="setprintModel" :item="selectObject.position"></generalMenu>
</div>
2025-05-20 16:47:27 +08:00
<div class="systemDesigner marginBottom" v-if="show.systemDesigner">
2025-08-22 10:27:48 +08:00
<div class="text" style="margin-bottom: 1rem;">
{{$t('Habit.GenerationParameters')}}:
</div>
2025-05-20 16:47:27 +08:00
<a-slider class="system_silder"
v-model:value="selectObject.systemDesignerPercentage"
:tip-formatter="formatter"
:tooltipVisible="false"
>
</a-slider>
2025-08-22 10:27:48 +08:00
<div class="text" style="margin-top: 1rem; font-size: 1.6rem;">
2025-05-20 16:47:27 +08:00
<div class="left">
{{ $t('Habit.System') }}<span>({{systemDesigner.designer}}%)</span>
</div>
<div class="right">
{{ $t('Habit.Designer') }}<span>({{systemDesigner.system}}%)</span>
</div>
</div>
</div>
<div class="complete">
2025-11-20 10:58:16 +08:00
<div class="gallery_btn" style="padding: 0rem 2.2rem; line-height: 4.5rem;font-weight: 500;" @click="complete(sourceType)">{{ sourceType == 'edit' ? $t('HomeView.Save') : $t('HomeView.Start')}}</div>
2025-05-20 16:47:27 +08:00
</div>
</div>
<habitSetStyle ref="habitSetStyle" @setWorkspaceStyle="setWorkspaceStyle" :mannequinStyle="mannequinStyle"></habitSetStyle>
2025-05-28 10:28:07 +08:00
<setBrandDNA ref="brandDNA" @setWorkspaceBrandDNA="setWorkspaceBrandDNA"></setBrandDNA>
2025-05-20 16:47:27 +08:00
</div>
</template>
<script lang="ts">
import { defineComponent,computed,watch,nextTick,onBeforeUnmount,toRefs, reactive, onMounted, inject} from 'vue'
// import setDesignItem from '@/component/Detail/setDesignItem2.vue'
import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'
// import workspace from './model/workspace.vue'
import router from '@/router';
2025-05-28 10:28:07 +08:00
import habitSetStyle from "@/component/modules/habitSetStyle.vue";
import setBrandDNA from "@/component/modules/setBrandDNA.vue";
2025-05-20 16:47:27 +08:00
import generalMenu from "@/component/HomePage/generalMenu.vue";
import { Https } from '@/tool/https';
import { position } from 'html2canvas/dist/types/css/property-descriptors/position';
import { id } from 'element-plus/es/locale';
import { message } from 'ant-design-vue';
import {projectList} from '@/tool/listData'
export default defineComponent({
components:{
2025-05-28 10:28:07 +08:00
habitSetStyle,generalMenu,setBrandDNA
2025-05-20 16:47:27 +08:00
},
props:{
workflowType:{
type:String,
default:''
},
httpWorkflowType:{
type:String,
default:''
},
workflowTitle:{
type:String,
default:''
},
firstTime:{
type:Boolean,
default:false
2025-07-19 14:04:48 +08:00
},
status:{
type:String,
default:''
},
sourceType:{
type:String,
default:''
2025-05-20 16:47:27 +08:00
}
},
emits:['setProject'],
setup(props,{emit}) {
const { t } = useI18n();
const store = useStore();
const data = reactive({
selectObject_:computed(()=>store.state.Workspace.probjects),//选择的项目
selectObject:{} as any,
femalePosition:computed(()=>store.state.UserHabit.FemalePosition),//男性衣服位置
malePosition:computed(()=>store.state.UserHabit.MalePosition),//女性衣服位置
mannequinStyle:computed(()=>store.state.UserHabit.mannequinStyle),//
show:{
title:true,
gender:true,
style:true,
age:true,
systemDesigner:true,
position:true,
},
systemDesigner:{
system:0,
designer:0,
},
setIsShowMark:inject('setIsShowMark') as any,
})
2025-05-21 20:05:08 +08:00
// watch(()=>data.selectObject_,(newVal)=>{
// data.selectObject = JSON.parse(JSON.stringify(newVal))
// })
const init = (storeData:any)=>{
2025-11-04 10:44:11 +08:00
// if(props.status == 'edit'){
data.selectObject = JSON.parse(JSON.stringify(storeData))
// }
2025-05-21 20:05:08 +08:00
}
2025-05-20 16:47:27 +08:00
const dataDom = reactive({
habitSetStyle:null as any,
2025-05-28 10:28:07 +08:00
brandDNA:null as any,
2025-05-20 16:47:27 +08:00
})
const setStyle = ()=>{
dataDom.habitSetStyle.init(data.selectObject);
}
2025-05-28 10:28:07 +08:00
const setBrandDNA = ()=>{
dataDom.brandDNA.init(data.selectObject);
}
2025-05-20 16:47:27 +08:00
const setWorkspaceStyle = (value:any)=>{
data.selectObject.styleName = value.name
data.selectObject.style = value.value
data.selectObject.styleId = value.id
// store.commit('setProbject',data)
}
2025-05-28 10:28:07 +08:00
const setWorkspaceBrandDNA = (value:any)=>{
data.selectObject.userBrandDnaName = value.name
data.selectObject.userBrandDna = value.id
data.selectObject.userBrandDnaImg = value.img
}
2025-05-20 16:47:27 +08:00
const setprintModel = (value:any)=>{
data.selectObject.position = value
}
const formatter = (value: number)=>{
data.systemDesigner.system = 100 - value
data.systemDesigner.designer = value
let num = Math.abs((value-50)*2)
return `${num}%`;
}
2025-05-28 10:28:07 +08:00
const formatterBrandDNA = (value: number)=>{
2025-06-03 14:57:18 +08:00
return `${value}%`;
2025-05-28 10:28:07 +08:00
}
2025-11-20 10:58:16 +08:00
const complete = (sourceType)=>{
2025-09-17 14:01:58 +08:00
// if(!data.selectObject.name){
// message.info(t('PrintboardUpload.jsContent7'))
// return
// }
2025-05-20 16:47:27 +08:00
let value = {
name:data.selectObject.name,
2025-05-20 16:47:27 +08:00
process:props.httpWorkflowType,
styleId:data.show.style?data.selectObject.styleId:null,
2025-07-19 14:04:48 +08:00
id:data.selectObject.id == -1?'':data.selectObject.id,
2025-05-20 16:47:27 +08:00
workspace:{
2025-09-03 16:36:06 +08:00
id:data.selectObject?.workspaceId == -1?'':data.selectObject?.workspaceId,
2025-05-20 16:47:27 +08:00
sex:data.selectObject.sex,
// sex:data.show.gender?data.selectObject.sex:null,
systemDesignerPercentage:data.show.systemDesigner?data.selectObject.systemDesignerPercentage:null,
2025-11-04 10:44:11 +08:00
position:data.show.position?data.selectObject.position?.value:'Overall',
2025-05-20 16:47:27 +08:00
ageGroup:data.show.style?data.selectObject.ageGroup:null,
2025-05-28 10:28:07 +08:00
userBrandDna:data.selectObject.userBrandDna,
brandPercentage:data.selectObject.brandPercentage,
2025-05-20 16:47:27 +08:00
// position:data.selectObject,
} as any,
}
2025-05-28 10:28:07 +08:00
Https.axiosPost(Https.httpUrls.projectSaveOrUpdate,value).then((rv)=>{
2025-05-20 16:47:27 +08:00
if(rv){
2025-11-20 10:58:16 +08:00
if((sourceType == 'edit' && data.selectObject.id == rv.id) || sourceType != 'edit'){
store.state.Workspace.cachedRoutes = [];
store.commit('setProjectPath','')
}
2025-05-20 16:47:27 +08:00
data.selectObject.id = rv.id
2025-06-09 10:25:54 +08:00
let storeData = {
name:rv.name,
id:rv.id,
2025-09-08 14:50:59 +08:00
// type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
// httpType:rv.process,//项目类型
2025-06-09 10:25:54 +08:00
ageGroup:rv.workspaceVO?.ageGroup,
style:rv.workspaceVO?.style,
styleId:rv.workspaceVO?.styleId,
styleName:rv.workspaceVO?.styleName,
sex:rv.workspaceVO?.sex,
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
brandPercentage:rv.workspaceVO?.brandPercentage,
userBrandDna:rv.workspaceVO?.userBrandDna,
systemDesignerPercentage:rv.workspaceVO?.systemDesignerPercentage,
position:{
label:rv.workspaceVO?.positionEnum?.value,
value:rv.workspaceVO?.positionEnum?.name
},
2025-06-30 10:53:25 +08:00
workspaceId:rv.workspaceVO?.id,
2025-06-09 10:25:54 +08:00
positionList:[],
publishData:{
id:rv.portfolioDTO?.id?rv.portfolioDTO?.id:'',
portfolioDes:rv.portfolioDTO?.portfolioDes?rv.portfolioDTO?.portfolioDes:'',
portfolioName:rv.portfolioDTO?.portfolioName?rv.portfolioDTO?.portfolioName:'',
tagsDTO:rv.portfolioDTO?.tagsDTO?rv.portfolioDTO?.tagsDTO:[],
},
2025-09-08 14:50:59 +08:00
// model:[]
}
if(rv.process){
storeData.type = rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign'
storeData.httpType = rv.process
2025-06-09 10:25:54 +08:00
}
let position = []
if(storeData.sex == "Female"){
position = store.state.UserHabit.FemalePosition
}else{
position = store.state.UserHabit.MalePosition
}
// storeData.model = model
data.selectObject.positionList = position
storeData.positionList = position
store.commit('setProbject',storeData)
2025-05-20 16:47:27 +08:00
emit('setProject',data.selectObject)
}
})
}
const openSetData = ()=>{
}
onMounted(()=>{
2025-08-22 10:27:48 +08:00
if(props.status != 'edit'){
store.commit('createProbject')
2025-11-04 10:44:11 +08:00
data.selectObject = {
name: '',
id: '',
type: '',
httpType: '',
styleName: '', //项目风格
styleId: null, //项目风格
style: '',
sex: 'Female',
ageGroup: 'Adult', //年龄组
positionList: [],
position: {}, //衣服位置
userBrandDna: '', //用户品牌
userBrandDnaImg: '', //用户品牌图片
userBrandDnaName: '', //用户品牌名字
workspaceId: -1, //worspaceId
publishData: {
id: '',
portfolioDes: '',
portfolioName: '',
tagsDTO: []
}, //发布的作品数据
systemDesignerPercentage: 30,
model: [] //模特
}
}else{
data.selectObject = JSON.parse(JSON.stringify(data.selectObject_))
2025-08-22 10:27:48 +08:00
}
2025-07-19 14:04:48 +08:00
data.selectObject.style = store.state.UserHabit?.mannequinStyle?.[0]?.value
data.selectObject.styleName = store.state.UserHabit?.mannequinStyle?.[0]?.name
data.selectObject.styleId = store.state.UserHabit?.mannequinStyle?.[0]?.id
2025-05-28 10:28:07 +08:00
})
onBeforeUnmount(()=>{
2025-05-20 16:47:27 +08:00
})
watch(()=>data.selectObject.sex,(newVal)=>{
if(newVal == 'Male'){
data.selectObject.positionList = data.malePosition
}else{
data.selectObject.positionList = data.femalePosition
}
data.selectObject.position = data.selectObject.positionList[0]
})
return{
projectList,
...toRefs(dataDom),
...toRefs(data),
2025-05-21 20:05:08 +08:00
init,
2025-05-20 16:47:27 +08:00
setStyle,
2025-05-28 10:28:07 +08:00
setBrandDNA,
2025-05-20 16:47:27 +08:00
setWorkspaceStyle,
2025-05-28 10:28:07 +08:00
setWorkspaceBrandDNA,
2025-05-20 16:47:27 +08:00
setprintModel,
formatter,
2025-05-28 10:28:07 +08:00
formatterBrandDNA,
2025-05-20 16:47:27 +08:00
complete,
openSetData,
}
},
provide() {
return {
}
},
})
</script>
<style lang="less" scoped>
.workspace{
width: 100%;
height: 100%;
position: relative;
display: flex;
justify-content: center;
align-items: center;
font-weight: 600;
font-size: 1.8rem;
padding: 1.2rem;
> .workspaceBox{
2025-08-22 10:27:48 +08:00
width: 52rem;
height: 100%;
2025-05-20 16:47:27 +08:00
padding: 0 5rem;
2025-08-22 10:27:48 +08:00
// width: 100%;
2025-05-20 16:47:27 +08:00
padding: 0;
2025-07-19 14:04:48 +08:00
overflow-y: auto;
2025-08-22 10:27:48 +08:00
display: flex;
flex-direction: column;
2025-05-20 16:47:27 +08:00
// display: flex;
// flex-wrap: wrap;
// justify-content: space-between;
// align-content: flex-start;
2025-08-22 10:27:48 +08:00
> div{
// padding: 0 5rem;
}
> .title{
display: flex;
font-weight: 500;
align-items: flex-end;
// height: 2.4rem;
> div{
font-size: 2.4rem;
margin-right: 1.2rem;
}
> span{
font-size: 1.4rem;
color: #999999;
}
}
2025-05-20 16:47:27 +08:00
> .marginBottom{
2025-08-22 10:27:48 +08:00
margin-bottom: 2rem;
2025-05-20 16:47:27 +08:00
// width: 44%;
}
2025-05-28 10:28:07 +08:00
> .brand{
> .text{
> img{
width: 10rem;
height: 6rem;
object-fit: contain;
}
}
}
2025-08-22 10:27:48 +08:00
> .brandImg{
width: 10rem;
height: 10rem;
margin: 1rem 0;
> img{
width: 100%;
height: 100%;
object-fit: contain;
}
}
2025-05-20 16:47:27 +08:00
> .title{
font-size: 2.7rem;
> span{
color: #999999;
font-size: 1.4rem;
}
}
> .projectName{
display: flex;
2025-08-22 10:27:48 +08:00
flex-direction: column;
2025-05-20 16:47:27 +08:00
> .text{
margin-right: 1rem;
2025-08-22 10:27:48 +08:00
margin-bottom: 1rem;
2025-05-20 16:47:27 +08:00
}
> .input{
// flex: 1;
2025-08-22 10:27:48 +08:00
width: 100%;
2025-10-03 16:31:42 +08:00
padding: calc(1.7rem - 2px * 2) 1rem;
2025-05-20 16:47:27 +08:00
// padding: 2rem 2.7rem;
2025-08-22 10:27:48 +08:00
font-size: 1.8rem;
2025-05-20 16:47:27 +08:00
border-radius: 1.6rem;
border: 2px solid #D0D0D0;
display: flex;
> input{
flex: 1;
border: none;
}
> i{
display: flex;
color: #999999;
align-items: center;
font-size: 2.4rem;
}
}
}
2025-08-22 10:27:48 +08:00
.text{
font-size: 1.8rem;
font-weight: 500;
}
2025-05-20 16:47:27 +08:00
> .gender{
display: flex;
align-items: center;
> .text{
2025-08-22 10:27:48 +08:00
// width: 8rem;
2025-05-20 16:47:27 +08:00
}
> .radio{
display: flex;
2025-08-22 10:27:48 +08:00
margin-left: 4.2rem;
2025-05-20 16:47:27 +08:00
> label{
display: flex;
margin-right: 4rem;
>input{
margin-right: 1.5rem;
2025-08-22 10:27:48 +08:00
transform: scale(1.2);
}
> span{
font-weight: 500;
font-size: 1.6rem;
2025-05-20 16:47:27 +08:00
}
}
}
}
2025-05-28 10:28:07 +08:00
2025-05-20 16:47:27 +08:00
> .style{
display: flex;
align-items: center;
justify-content: space-between;
2025-08-22 10:27:48 +08:00
.gallery_btn{
line-height: 3.6rem;
font-size: 1.4rem;
font-weight: 500;
border-radius: .8rem;
}
> .center{
margin-right: auto;
margin-left: 3rem;
min-width: 10rem;
font-size: 1.4rem;
border-radius: .8rem;
line-height: 3.6rem;
background-color: #ebebeb;
text-align: center;
}
2025-05-20 16:47:27 +08:00
}
> .systemDesigner{
> .text{
margin-right: 1rem;
display: flex;
justify-content: space-between;
}
}
2025-06-03 14:57:18 +08:00
> .brandDNAStrenght{
display: flex;
align-items: center;
> .text{
margin-right: 3rem;
display: flex;
justify-content: space-between;
}
> .system_silder{
flex: 1;
}
}
2025-05-20 16:47:27 +08:00
> .position{
2025-08-22 10:27:48 +08:00
display: flex;
flex-direction: column;
2025-05-20 16:47:27 +08:00
> .text{
2025-08-22 10:27:48 +08:00
margin-bottom: 1rem;
2025-05-20 16:47:27 +08:00
}
:deep(.generalMenu_printModel){
position: relative;
margin: 0;
2025-08-22 10:27:48 +08:00
height: 6rem;
font-weight: 500;
2025-05-20 16:47:27 +08:00
> div,> ul{
width: 100%;
border-radius: 1.6rem;
border: 2px solid #D0D0D0;
}
}
}
> .complete{
width: 100%;
2025-08-22 10:27:48 +08:00
margin-top: auto;
2025-05-20 16:47:27 +08:00
text-align: right;
> div{
}
}
}
}
</style>