Преглед изворни кода

feat(photography): 支持模特选择弹窗默认标签页功能

- 添加 default-active-tab 属性传递给 ModelGenerationDialog 组件
- 新增 modelDialogDefaultTab 响应式变量控制默认标签页
- 修改 openModelDialog 函数支持传递默认标签页参数
- 实现根据模特选择状态智能跳转对应标签页逻辑
- 更新必填验证逻辑支持男女模特分别校验
- 注释掉模特选择完成提示信息
panqiuyao пре 13 часа
родитељ
комит
2b4e8262e5

+ 11 - 3
frontend/src/components/ModelGeneration/index.vue

@@ -75,6 +75,7 @@ interface Props {
     female?: any
     male?: any
   }
+  defaultActiveTab?: 'female' | 'male'
 }
 
 const props = defineProps<Props>()
@@ -275,14 +276,21 @@ const preloadImages = (models: ModelData[]) => {
 watch(dialogVisible, (newValue) => {
   if (newValue) {
     fetchModelList()
-    
+
+    // 设置默认激活的标签页
+    if (props.defaultActiveTab) {
+      activeTab.value = props.defaultActiveTab
+    } else {
+      activeTab.value = 'female' // 默认女模特
+    }
+
     // 初始化时接收父组件传递的模特数据
     if (props.initialModels) {
-      
+
       if (props.initialModels.female) {
         selectedFemaleModel.value = props.initialModels.female
       }
-      
+
       if (props.initialModels.male) {
         selectedMaleModel.value = props.initialModels.male
       }

+ 40 - 8
frontend/src/views/Photography/detail.vue

@@ -498,6 +498,7 @@
   <ModelGenerationDialog
     v-model="modelDialogVisible"
     :initial-models="selectedModels"
+    :default-active-tab="modelDialogDefaultTab"
     @confirm="handleModelSelection"
     @cancel="modelDialogVisible = false"
   />
@@ -910,6 +911,7 @@ const onlineStoreTempList = ref<any[]>([]) // 国内电商平台列表
 const onlineStoreTempListForeign = ref<any[]>([]) // 国外电商平台列表
 // 模特与场景弹窗
 const modelDialogVisible = ref(false)
+const modelDialogDefaultTab = ref<'female' | 'male'>('female')
 const scenePromptDialogVisible = ref(false)
 const selectedModels = ref<{ female: any; male: any } | null>(null)
 const scenePrompt = ref('')
@@ -1052,8 +1054,21 @@ const loadTemplateFromCache = () => {
   ensureDefaultTemplateSelection({ ensureVisible: true })
 }
 
-const openModelDialog = () => {
+const openModelDialog = (eventOrDefaultTab?: MouseEvent | 'female' | 'male') => {
   modelDialogVisible.value = true
+  let defaultTab: 'female' | 'male' | undefined
+
+  if (typeof eventOrDefaultTab === 'string') {
+    defaultTab = eventOrDefaultTab
+  }
+
+  if (defaultTab) {
+    // 传递给子组件的默认标签页
+    modelDialogDefaultTab.value = defaultTab
+  } else {
+    // 重置为默认值
+    modelDialogDefaultTab.value = 'female'
+  }
 }
 const openScenePromptDialog = () => {
   scenePromptDialogVisible.value = true
@@ -1065,7 +1080,7 @@ const handleModelSelection = (models: { female: any; male: any }) => {
   selectedModels.value = models
   saveModelsToCache(models)
   modelDialogVisible.value = false
-  ElMessage.success('模特选择完成!')
+  // ElMessage.success('模特选择完成!')
 }
 const handleScenePromptConfirm = (prompt: string) => {
   scenePrompt.value = prompt
@@ -1322,12 +1337,29 @@ const generate = async function () {
   }
 
   // 必填验证
-  if (form.services.includes('is_upper_footer') && !( selectedModels.value && selectedModels.value.male?.id  &&  selectedModels.value.female?.id)) {
-    openModelDialog();
-    setTimeout(()=>{
-      ElMessage.error('请选择模特')
-    },200)
-    return
+  if (form.services.includes('is_upper_footer')) {
+    const hasMale = selectedModels.value?.male?.id
+    const hasFemale = selectedModels.value?.female?.id
+
+    if (!hasMale && !hasFemale) {
+      openModelDialog();
+      setTimeout(()=>{
+        ElMessage.error('请选择男模特和女模特')
+      },200)
+      return
+    } else if (!hasMale) {
+      openModelDialog('male');
+      setTimeout(()=>{
+        ElMessage.error('请选择男模特')
+      },200)
+      return
+    } else if (!hasFemale) {
+      openModelDialog('female');
+      setTimeout(()=>{
+        ElMessage.error('请选择女模特')
+      },200)
+      return
+    }
   }
 
   if (form.services.includes('is_product_scene') && !scenePrompt.value) {