|
|
@@ -11,37 +11,37 @@
|
|
|
勾选服务内容(多选):
|
|
|
</div>
|
|
|
<div class="service-cards">
|
|
|
- <div class="service-card" :class="{ active: form.services.includes('scene') }" @click="toggleService('scene')" v-log="{ describe: { action: '点击服务卡片', service: '场景图生成' } }">
|
|
|
+ <div class="service-card" :class="{ active: form.services.includes('is_product_scene') }" @click="toggleService('is_product_scene')" v-log="{ describe: { action: '点击服务卡片', service: '场景图生成' } }">
|
|
|
<div class="service-checkbox" @click.stop>
|
|
|
- <el-checkbox size="large" :model-value="form.services.includes('scene')" @change="toggleService('scene')" />
|
|
|
+ <el-checkbox size="large" :model-value="form.services.includes('is_product_scene')" @change="toggleService('is_product_scene')" />
|
|
|
</div>
|
|
|
<div class="service-content">
|
|
|
<div class="service-image">
|
|
|
<img src="@/assets/images/Photography/cj.png" alt="场景图生成" />
|
|
|
- <div class="service-icon">
|
|
|
+ <div class="service-icon" @click.stop="openScenePromptDialog" v-log="{ describe: { action: '点击服务卡片图标', service: '场景图生成-弹窗' } }">
|
|
|
<el-icon><EditPen /></el-icon>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="service-name">场景图生成</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="service-card" :class="{ active: form.services.includes('model') }" @click="toggleService('model')" v-log="{ describe: { action: '点击服务卡片', service: '模特图生成' } }">
|
|
|
+ <div class="service-card" :class="{ active: form.services.includes('is_upper_footer') }" @click="toggleService('is_upper_footer')" v-log="{ describe: { action: '点击服务卡片', service: '模特图生成' } }">
|
|
|
<div class="service-checkbox" @click.stop>
|
|
|
- <el-checkbox size="large" :model-value="form.services.includes('model')" @change="toggleService('model')" />
|
|
|
+ <el-checkbox size="large" :model-value="form.services.includes('is_upper_footer')" @change="toggleService('is_upper_footer')" />
|
|
|
</div>
|
|
|
<div class="service-content">
|
|
|
<div class="service-image">
|
|
|
<img src="@/assets/images/Photography/mt.png" alt="模特图生成" />
|
|
|
- <div class="service-icon">
|
|
|
+ <div class="service-icon" @click.stop="openModelDialog" v-log="{ describe: { action: '点击服务卡片图标', service: '模特图生成-弹窗' } }">
|
|
|
<el-icon><EditPen /></el-icon>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="service-name">模特图生成</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="service-card" :class="{ active: form.services.includes('detail') }" @click="toggleService('detail')" v-log="{ describe: { action: '点击服务卡片', service: '详情页生成' } }">
|
|
|
+ <div class="service-card" :class="{ active: form.services.includes('is_detail') }" @click="toggleService('is_detail')" v-log="{ describe: { action: '点击服务卡片', service: '详情页生成' } }">
|
|
|
<div class="service-checkbox" @click.stop>
|
|
|
- <el-checkbox size="large" :model-value="form.services.includes('detail')" @change="toggleService('detail')" />
|
|
|
+ <el-checkbox size="large" :model-value="form.services.includes('is_detail')" @change="toggleService('is_detail')" />
|
|
|
</div>
|
|
|
<div class="service-content">
|
|
|
<div class="service-image">
|
|
|
@@ -310,6 +310,21 @@
|
|
|
<img style="width: 100%;" :src="dialogImageUrl" alt="Preview Image" />
|
|
|
</el-dialog>
|
|
|
|
|
|
+ <!-- 模特生成弹窗 -->
|
|
|
+ <ModelGenerationDialog
|
|
|
+ v-model="modelDialogVisible"
|
|
|
+ :initial-models="selectedModels"
|
|
|
+ @confirm="handleModelSelection"
|
|
|
+ @cancel="modelDialogVisible = false"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 场景提示词弹窗 -->
|
|
|
+ <ScenePromptDialog
|
|
|
+ v-model="scenePromptDialogVisible"
|
|
|
+ :initial-prompt="scenePrompt"
|
|
|
+ @confirm="handleScenePromptConfirm"
|
|
|
+ @cancel="scenePromptDialogVisible = false"
|
|
|
+ />
|
|
|
|
|
|
|
|
|
</template>
|
|
|
@@ -336,6 +351,8 @@ import { getRouterUrl } from '@/utils/appfun'
|
|
|
import { useUuidStore } from '@/stores/modules/uuid'
|
|
|
import socket from "@/stores/modules/socket";
|
|
|
const socketStore = socket();
|
|
|
+import ModelGenerationDialog from '@/components/ModelGeneration/index.vue'
|
|
|
+import ScenePromptDialog from '@/components/ScenePromptDialog/index.vue'
|
|
|
|
|
|
import { Close, Warning } from '@element-plus/icons-vue'
|
|
|
import LoadingDialog from '@/views/Photography/components/LoadingDialog.vue'
|
|
|
@@ -407,7 +424,7 @@ const form = reactive({
|
|
|
dataType: '1', // 1: 选择excel文件 2: 系统对接
|
|
|
logo_path: '', // 主图LOGO
|
|
|
excel_path: '', // 商品基础资料EXCEL文件选择
|
|
|
- services: ['detail'], // 勾选服务内容(多选)默认包含详情页生成
|
|
|
+ services: ['is_detail'], // 勾选服务内容(多选)默认包含详情页生成
|
|
|
})
|
|
|
onMounted(() => {
|
|
|
// 页面访问埋点
|
|
|
@@ -483,6 +500,27 @@ const publishToPlatforms = () => {
|
|
|
// 具体上架逻辑按后续接口对接
|
|
|
}
|
|
|
|
|
|
+// 模特与场景弹窗
|
|
|
+const modelDialogVisible = ref(false)
|
|
|
+const scenePromptDialogVisible = ref(false)
|
|
|
+const selectedModels = ref<{ female: any; male: any } | null>(null)
|
|
|
+const scenePrompt = ref('')
|
|
|
+
|
|
|
+const openModelDialog = () => {
|
|
|
+ modelDialogVisible.value = true
|
|
|
+}
|
|
|
+const openScenePromptDialog = () => {
|
|
|
+ scenePromptDialogVisible.value = true
|
|
|
+}
|
|
|
+const handleModelSelection = (models: { female: any; male: any }) => {
|
|
|
+ selectedModels.value = models
|
|
|
+ modelDialogVisible.value = false
|
|
|
+ ElMessage.success('模特选择完成!')
|
|
|
+}
|
|
|
+const handleScenePromptConfirm = (prompt: string) => {
|
|
|
+ scenePrompt.value = prompt
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
@@ -540,6 +578,11 @@ const handleSegmentProgressMessage = (data: any) => {
|
|
|
|
|
|
// 开始生成操作
|
|
|
const generate = async function () {
|
|
|
+
|
|
|
+ if(form.services.length == 0){
|
|
|
+ ElMessage.error('请选择服务内容')
|
|
|
+ return
|
|
|
+ }
|
|
|
// 埋点:开始生成详情页
|
|
|
clickLog({
|
|
|
describe: {
|
|
|
@@ -552,10 +595,23 @@ const generate = async function () {
|
|
|
}
|
|
|
}, route);
|
|
|
|
|
|
- if ( form.dataType == '1' && !form.excel_path) {
|
|
|
- ElMessage.error('请上传商品基础资料')
|
|
|
+ // 必填验证
|
|
|
+ if (form.services.includes('is_upper_footer') && !selectedModels.value) {
|
|
|
+ ElMessage.error('请选择模特')
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+ if (form.services.includes('is_product_scene') && !scenePrompt.value) {
|
|
|
+ ElMessage.error('请设置场景提示词')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if(form.services.includes('is_detail')){
|
|
|
+ if ( form.dataType == '1' && !form.excel_path) {
|
|
|
+ ElMessage.error('请上传商品基础资料')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
const tokenInfoStore = tokenInfo();
|
|
|
const token = tokenInfoStore.getToken; // 使用 getToken() 获取 token
|
|
|
let temp_list = []
|
|
|
@@ -565,6 +621,11 @@ const generate = async function () {
|
|
|
template_local_classes: item.template_local_classes,
|
|
|
})
|
|
|
})
|
|
|
+ // 根据选择的服务内容设置参数
|
|
|
+ const isDetail = form.services.includes('is_detail') ? 1 : 0
|
|
|
+ const isProductScene = form.services.includes('is_product_scene') ? 1 : 0
|
|
|
+ const isUpperFooter = form.services.includes('is_upper_footer') ? 1 : 0
|
|
|
+
|
|
|
const params = {
|
|
|
goods_art_no: JSON.parse(JSON.stringify(goods_art_nos.value)),
|
|
|
logo_path: form.logo_path || '',
|
|
|
@@ -573,9 +634,19 @@ const generate = async function () {
|
|
|
template_image_order: form.selectTemplate.template_image_order,
|
|
|
temp_list,
|
|
|
token,
|
|
|
- uuid: uuidStore.getUuid || ''
|
|
|
+ uuid: uuidStore.getUuid || '',
|
|
|
+ // 新增服务参数
|
|
|
+ online_stores: Object.values(domesticPlatforms.value || {}),
|
|
|
+ is_detail: isDetail,
|
|
|
+ is_product_scene: isProductScene,
|
|
|
+ is_upper_footer: isUpperFooter,
|
|
|
+ upper_footer_params: selectedModels.value ? {
|
|
|
+ man_id: selectedModels.value.male?.id || "",
|
|
|
+ women_id: selectedModels.value.female?.id || ""
|
|
|
+ } : "",
|
|
|
+ product_scene_prompt: scenePrompt.value || ''
|
|
|
}
|
|
|
- console.log(params);
|
|
|
+
|
|
|
// 开启进度弹窗
|
|
|
requesting.value = false
|
|
|
partErrList.value = []
|
|
|
@@ -943,9 +1014,16 @@ const selectFolder = () => {
|
|
|
|
|
|
.service-name {
|
|
|
font-size: 14px;
|
|
|
- color: #333;
|
|
|
font-weight: 500;
|
|
|
text-align: center;
|
|
|
+ position: absolute;
|
|
|
+ background: rgba(0,0,0,.5);
|
|
|
+ height: 30px;
|
|
|
+ line-height: 30px;
|
|
|
+ color: #fff;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom:0px
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -960,7 +1038,7 @@ const selectFolder = () => {
|
|
|
display: flex;
|
|
|
gap: 24px;
|
|
|
align-items: flex-start;
|
|
|
- .logo-col { flex: 1; min-width: 300px; }
|
|
|
+ .logo-col { flex: 2; min-width: 300px; }
|
|
|
.template-col { flex: 3; }
|
|
|
}
|
|
|
|