From e7fbf453476e31d7d9cf15b64acb6052fca6d78d Mon Sep 17 00:00:00 2001
From: shenrongliang <1328040932@qq.com>
Date: 星期一, 07 四月 2025 14:54:00 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 easegen-front/src/views/chooseTemplate/index.vue                              |   99 ++++++++-----
 easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue |  271 ++++++++++++++++++++++++++++++++++++++
 easegen-front/src/views/digitalcourse/digitalhumans/index.vue                 |   16 +
 easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue     |    8 -
 4 files changed, 342 insertions(+), 52 deletions(-)

diff --git a/easegen-front/src/views/chooseTemplate/index.vue b/easegen-front/src/views/chooseTemplate/index.vue
index 9fa14cf..ed64afd 100644
--- a/easegen-front/src/views/chooseTemplate/index.vue
+++ b/easegen-front/src/views/chooseTemplate/index.vue
@@ -175,7 +175,7 @@
           <div class="list">
             <div
               class="main-image-box"
-              :style="{ width: viewSize.width + 'px', height: viewSize.height + 'px' }"
+              :style="{ width: viewSize.width + 'px', height: viewSize.height + 'px',position: 'relative' }"
             >
               <!-- 鑳屾櫙(蹇呮樉绀�) -->
               <el-image
@@ -183,6 +183,7 @@
                 class="background"
                 :src="selectPPT.pictureUrl"
               />
+
               <!-- 鐢讳腑鐢� -->
               <Vue3DraggableResizable
                 v-if="selectPPT.innerPicture && selectPPT.innerPicture.src"
@@ -217,43 +218,48 @@
                   <Delete />
                 </el-icon>
               </Vue3DraggableResizable>
-              <Vue3DraggableResizable
-                v-if="selectPPT.showDigitalHuman"
-                :parent="false"
-                :initW="PPTpositon.w"
-                :initH="PPTpositon.h"
-                @drag-move="onDragMove"
-                v-model:x="PPTpositon.x"
-                v-model:y="PPTpositon.y"
-                v-model:w="PPTpositon.w"
-                v-model:h="PPTpositon.h"
-                v-model:active="PPTpositon.active"
-                :draggable="true"
-                :resizable="true"
-                @activated="print('activated')"
-                @deactivated="print('deactivated')"
-                @drag-start="print('drag-start')"
-                @resize-start="print('resize-start')"
-                @dragging="print('dragging')"
-                @resizing="print('resizing')"
-                @drag-end="print('drag-end')"
-                @resize-end="print('resize-end')"
-                style="z-index: 2"
-              >
-                <el-image
-                  class="minddle-host-image"
-                  :src="selectHost ? selectHost.pictureUrl : ''"
-                />
-                <el-icon
-                  v-if="PPTpositon.active"
-                  size="20"
-                  color="#409eff"
-                  style="position: absolute; top: 5px; right: 5px; z-index: 4"
-                  @click.stop="deleteDigitalHuman"
+              <div style="width: 160%;height: 100%;position: absolute;top: 0;left: -30%">
+                <Vue3DraggableResizable
+                  v-if="selectPPT.showDigitalHuman"
+                  :parent="true"
+                  :initW="PPTpositon.w"
+                  :initH="PPTpositon.h"
+                  @drag-move="onDragMove"
+                  v-model:x="PPTpositon.x"
+                  v-model:y="PPTpositon.y"
+                  v-model:w="PPTpositon.w"
+                  v-model:h="PPTpositon.h"
+                  v-model:active="PPTpositon.active"
+                  :draggable="true"
+                  :resizable="true"
+                  @activated="print('activated')"
+                  @deactivated="print('deactivated')"
+                  @drag-start="print('drag-start')"
+                  @resize-start="print('resize-start')"
+                  @dragging="print('dragging')"
+                  @resizing="print('resizing')"
+                  @drag-end="print('drag-end')"
+                  @resize-end="print('resize-end')"
+                  style="z-index: 4"
                 >
-                  <Delete />
-                </el-icon>
-              </Vue3DraggableResizable>
+                  <!--                {{PPTpositon.w}}{{PPTpositon.h}}-->
+                  <el-image
+                    class="minddle-host-image"
+                    :src="selectHost ? selectHost.pictureUrl : ''"
+                  />
+
+                  <el-icon
+                    v-if="PPTpositon.active"
+                    size="20"
+                    color="#409eff"
+                    style="position: absolute; top: 5px; right: 5px; z-index: 4"
+                    @click.stop="deleteDigitalHuman"
+                  >
+                    <Delete />
+                  </el-icon>
+                </Vue3DraggableResizable>
+              </div>
+
             </div>
           </div>
           <el-card
@@ -1956,8 +1962,8 @@
   const template = selectTemplate.value
   const pptList = applyAllTemplate.value ? PPTArr.value : [selectPPT.value]
 
-  //鏁板瓧浜烘槸缁熶竴鐢熸晥鐨勶紝鍏堝鐞�
-
+  // 鏁板瓧浜烘槸缁熶竴鐢熸晥鐨勶紝鍏堝鐞�
+  console.log(template)
   pptList.forEach((item) => {
     // 淇濆瓨鍘熷ppt鍥剧墖
     const originalPPT = item.innerPicture?.src || item.pictureUrl
@@ -1979,7 +1985,8 @@
           entityType: 1,
           originHeight: courseInfo.value.height,
           originWidth: courseInfo.value.width,
-          entityId: 1
+          entityId: 1,
+          templateId: template.id,
         }
       }
     } else {
@@ -1988,7 +1995,17 @@
     }
 
     item.showDigitalHuman = template.showDigitalHuman
+    // 娣诲姞鍚屾瀹介珮鐨勯�昏緫
+    const targetTemplate = selectTemplate.value
+    console.log(PPTArr)
+    PPTArr.value.forEach((otherItem) => {
+      if (otherItem.templateId === item.templateId) {
+        otherItem.width = item.width
+        otherItem.height = item.height
+      }
+    })
   })
+
   // 鏁板瓧浜轰綅缃篃闇�瑕佺缉鏀�
   PPTpositon.w = selectTemplate.value.humanW
   PPTpositon.h = selectTemplate.value.humanH
@@ -2059,7 +2076,7 @@
 }
 
 .minddle-host-image {
-  z-index: 3;
+  z-index: 5;
   width: 100%;
   height: 100%;
 }
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue b/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue
index 848ea7d..142f6f2 100644
--- a/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/DigitalHumansForm.vue
@@ -47,13 +47,6 @@
       <el-form-item v-if="formData.useModel == 2" :label="t('digitalhumans.video')" prop="videoUrl">
         <!-- 鍘熸湰鑷甫鐨勮棰戜笂浼� -->
         <UploadFile v-if="!(formData.videoUrl || formData.fixVideoUrl)" v-model="formData.videoUrl" :fileType="['mp4','mov']" :limit="1" @on-success="handleFileSuccess('videoUrl', $event)"/>
-        <!-- 鍚庢湡娣诲姞鐨勫幓闄ょ豢骞曠殑 -->
-        <!-- <div v-if="!(formData.videoUrl || formData.fixVideoUrl)" >
-          <CES2 @start="StartCes" @Thnd="End" msg="Welcome to Your Vue.js App"/>
-          <div style="color: red;" v-show="isUploading"  >
-              褰撳墠姝e湪澶勭悊骞朵笂浼犱腑锛岃鑰愬績绛夊緟...
-          </div>
-        </div> -->
         <!-- 鍘熻棰戞挱鏀惧櫒 -->
         <!-- <video-player v-if="formData.videoUrl || formData.fixVideoUrl" :property="videoProperty"/> -->
          <!-- 鏂扮殑瑙嗛鎾斁鍣� -->
@@ -105,7 +98,6 @@
 import {VideoPlayerProperty} from "@/components/DiyEditor/components/mobile/VideoPlayer/config";
 import { useUpload } from '@/components/UploadFile/src/useUpload'
 import { el } from 'element-plus/es/locale';
-import CES2 from './CES2.vue'
 import { any } from 'vue-types';
 
 const { t } = useI18n() // 鍥介檯鍖�
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue b/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
new file mode 100644
index 0000000..8064faf
--- /dev/null
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
@@ -0,0 +1,271 @@
+<template>
+    <Dialog :title="dialogTitle" v-model="dialogVisible">
+      <el-form
+        ref="formRef"
+        :model="formData"
+        :rules="formRules"
+        label-width="120px"
+        v-loading="formLoading"
+      >
+        <el-form-item :label="t('digitalhumans.name')" prop="name">
+          <el-input v-model="formData.name" :placeholder="t('common.inputText') + t('digitalhumans.name')" />
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.code')" prop="code" v-if="false" > // 褰撳墠鏁板瓧浜鸿棰戠殑缂栫爜绫诲瀷
+          <el-input v-model="formData.code" :placeholder="t('common.inputText') + t('digitalhumans.code')" />
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.gender')" prop="gender">
+          <el-select v-model="formData.gender" :placeholder="t('common.selectText')+t('digitalhumans.gender')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.useModel')" prop="useModel" v-if="false" > //鏁板瓧浜烘ā寮忛�夋嫨妗�
+          <el-select v-model="formData.useModel" :placeholder="t('common.selectText')+t('digitalhumans.useModel')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.USE_MODEL)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="Number(dict.value)"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑳屾櫙鏍峰紡" prop="isTransparent">
+          <el-select v-model="formData.isTransparent" placeholder="璇烽�夋嫨鏄惁鍘婚櫎鑳屾櫙">
+            <el-option value="1" label="閫忔槑鑳屾櫙"/>
+            <el-option value="2" label="缁垮箷鑳屾櫙"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="formData.useModel == 1" :label="t('digitalhumans.picture')" prop="pictureUrl">
+          <UploadImg v-if="formData" v-model="formData.fixPictureUrl" />
+          <UploadImg v-else v-model="formData.pictureUrl" />
+        </el-form-item>
+  
+        <!-- <el-form-item v-if="formData.useModel == 2" :label="t('digitalhumans.video')" prop="videoUrl"> -->
+        <el-form-item v-if="false" :label="t('digitalhumans.video')" prop="videoUrl">
+          <!-- 鍘熸湰鑷甫鐨勮棰戜笂浼� -->
+          <UploadFile v-if="!(formData.videoUrl || formData.fixVideoUrl)" v-model="formData.videoUrl" :fileType="['mp4','mov']" :limit="1" @on-success="handleFileSuccess('videoUrl', $event)"/>
+          <!-- 鍘熻棰戞挱鏀惧櫒 -->
+          <!-- <video-player v-if="formData.videoUrl || formData.fixVideoUrl" :property="videoProperty"/> -->
+           <!-- 鏂扮殑瑙嗛鎾斁鍣� -->
+          <VideoPlayerMov  v-if="formData.videoUrl || formData.fixVideoUrl" :property="videoProperty"/>
+        </el-form-item>
+  <!--      <el-form-item :label="鎶犲浘鏍囪瘑" prop="matting">
+          <el-select v-model="formData.matting" :placeholder="璇烽�夋嫨鎶犲浘鏍囪瘑">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.DIGITALCOURSE_DIGITALHUMAN_MATTING)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>-->
+        <el-form-item :label="t('digitalhumans.posture')" prop="posture">
+          <el-select v-model="formData.posture" :placeholder="t('common.selectText') + t('digitalhumans.posture')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.DIGITALCOURSE_DIGITALHUMAN_POSTURE)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item :label="t('digitalhumans.type')" prop="type">
+          <el-select v-model="formData.type" :placeholder="t('common.selectText') + t('digitalhumans.type')">
+            <el-option
+              v-for="dict in getIntDictOptions(DICT_TYPE.DIGITALCOURSE_DIGITALHUMAN_TYPE)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="submitForm" type="primary" :disabled="formLoading" :loading="isUploading" >{{t('common.ok')}}</el-button>
+        <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      </template>
+    </Dialog>
+  </template>
+  <script setup lang="ts">
+  import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+  import * as DigitalHumansApi from '@/api/digitalcourse/digitalhumans'
+  import VideoPlayer from "@/components/DiyEditor/components/mobile/VideoPlayer/index.vue";
+  import VideoPlayerMov from "@/components/DiyEditor/components/mobile/VideoPlayer_mov/index.vue";
+  import {DiyComponent} from "@/components/DiyEditor/util";
+  import {VideoPlayerProperty} from "@/components/DiyEditor/components/mobile/VideoPlayer/config";
+  import { useUpload } from '@/components/UploadFile/src/useUpload'
+  import { el } from 'element-plus/es/locale';
+  import { any } from 'vue-types';
+  
+  const { t } = useI18n() // 鍥介檯鍖�
+  const message = useMessage() // 娑堟伅寮圭獥
+  
+  const { uploadUrl, httpRequest } = useUpload() //涓婁紶鏂规硶
+  const dialogVisible = ref(false) // 寮圭獥鐨勬槸鍚﹀睍绀�
+  const dialogTitle = ref('') // 寮圭獥鐨勬爣棰�
+  const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛�1锛変慨鏀规椂鐨勬暟鎹姞杞斤紱2锛夋彁浜ょ殑鎸夐挳绂佺敤
+  const formType = ref('') // 琛ㄥ崟鐨勭被鍨嬶細create - 鏂板锛泆pdate - 淇敼
+  const formData = ref({
+    id: undefined,
+    expireStatus: undefined,
+    finishTime: undefined,
+    gender: undefined,
+    matting: undefined,
+    name: undefined,
+    code: undefined,
+    pictureUrl: undefined,
+    posture: undefined,
+    snapshotHeight: undefined,
+    snapshotUrl: undefined,
+    snapshotWidth: undefined,
+    type: undefined,
+    useGeneralModel: undefined,
+    useModel: undefined,
+    status: undefined,
+    isTransparent: undefined,
+  })
+  
+  // 褰撳墠鏄惁姝e湪涓婁紶瑙嗛
+  const isUploading = ref(false)
+  
+  const videoProperty = {
+    videoUrl: '',
+    posterUrl: '',
+    autoplay: false,
+    style: {
+      bgType: 'color',
+      bgColor: '#fff',
+      marginBottom: 8,
+      height: 300
+    }
+  } as DiyComponent<VideoPlayerProperty>
+  
+  watch(()=> formData.value.videoUrl,(newVal,oldValue)=>{
+    if (newVal && newVal.length > 0){
+      videoProperty.videoUrl = formData.value.fixVideoUrl || newVal
+    }
+  })
+  const formRules = reactive({
+    gender: [{ required: true, message: '鎬у埆涓嶈兘涓虹┖', trigger: 'change' }],
+    name: [{ required: true, message: '鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }],
+    pictureUrl: [{ required: true, message: '鍥剧墖URL涓嶈兘涓虹┖', trigger: 'blur' }],
+    posture: [{ required: true, message: '濮垮娍涓嶈兘涓虹┖', trigger: 'change' }],
+    snapshotHeight: [{ required: true, message: '蹇収楂樺害涓嶈兘涓虹┖', trigger: 'blur' }],
+    snapshotUrl: [{ required: true, message: '蹇収URL涓嶈兘涓虹┖', trigger: 'blur' }],
+    snapshotWidth: [{ required: true, message: '蹇収瀹藉害涓嶈兘涓虹┖', trigger: 'blur' }],
+    type: [{ required: true, message: '绫诲瀷涓嶈兘涓虹┖', trigger: 'change' }],
+    useGeneralModel: [{ required: true, message: '浣跨敤閫氱敤妯″瀷涓嶈兘涓虹┖', trigger: 'change' }],
+    isTransparent: [{ required: true, message: '鏄惁鍘婚櫎鑳屾櫙涓嶈兘涓虹┖', trigger: 'change' }],
+    status: [{ required: true, message: '鐘舵�佷笉鑳戒负绌�', trigger: 'change' }],
+    videoUrl: [{ required: true, message: '瑙嗛涓嶈兘涓虹┖', trigger: 'blur' }]
+  })
+  const formRef = ref() // 琛ㄥ崟 Ref
+  
+  const StartCes = () => {
+    console.log( " ----- 寮�濮� ----- " )
+    isUploading.value = true
+  }
+  
+  const End = (res)=>{
+    const FileObject = {
+      file:res
+    }
+    httpRequest( FileObject ).then( response =>{
+      console.log(response)
+      formData.value.videoUrl = response.data;
+    } ).finally( res => {
+      isUploading.value = false
+    } )
+  
+  }
+  
+  /** 鎵撳紑寮圭獥 */
+  const open = async (type: string, id?: number) => {
+    dialogVisible.value = true
+    dialogTitle.value = t('action.' + type)
+    formType.value = type
+    resetForm()
+    // 淇敼鏃讹紝璁剧疆鏁版嵁
+    if (id) {
+      formLoading.value = true
+      try {
+        formData.value = await DigitalHumansApi.getDigitalHumans(id)
+      } finally {
+        formLoading.value = false
+      }
+    }else{
+      InitHumMODEL()
+    }
+  }
+  defineExpose({ open }) // 鎻愪緵 open 鏂规硶锛岀敤浜庢墦寮�寮圭獥
+  
+  /** 鎻愪氦琛ㄥ崟 */
+  const emit = defineEmits(['success']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
+  const submitForm = async () => {
+    // 鏍¢獙琛ㄥ崟
+    await formRef.value.validate()
+    // 鎻愪氦璇锋眰
+    formLoading.value = true
+    try {
+      const data = formData.value as unknown as DigitalHumansApi.DigitalHumansVO
+      if (formType.value === 'create') {
+        await DigitalHumansApi.createDigitalHumans(data)
+        message.success(t('common.createSuccess'))
+      } else {
+        await DigitalHumansApi.updateDigitalHumans(data)
+        message.success(t('common.updateSuccess'))
+      }
+      dialogVisible.value = false
+      // 鍙戦�佹搷浣滄垚鍔熺殑浜嬩欢
+      emit('success')
+    } finally {
+      formLoading.value = false
+    }
+  }
+  
+  /** 閲嶇疆琛ㄥ崟 */
+  const resetForm = () => {
+    formData.value = {
+      id: undefined,
+      expireStatus: undefined,
+      finishTime: undefined,
+      gender: undefined,
+      matting: undefined,
+      name: undefined,
+      code: undefined,
+      pictureUrl: undefined,
+      posture: undefined,
+      snapshotHeight: undefined,
+      snapshotUrl: undefined,
+      snapshotWidth: undefined,
+      type: undefined,
+      useGeneralModel: undefined,
+      useModel: undefined,
+      status: undefined,
+    }
+    formRef.value?.resetFields()
+  }
+  const handleFileSuccess = (fileType,response) => {
+    if (fileType === 'videoUrl') {
+      formData.value.videoUrl = response.data;
+    }
+  };
+  
+  // 淇敼榛樿鐨勬暟瀛椾汉瑙嗛妯″紡涓鸿棰�
+  
+  const InitHumMODEL = ()=>{
+    let ModelList = getIntDictOptions( DICT_TYPE.USE_MODEL )
+    for (let index = 0; index < ModelList.length; index++) {
+      const element = ModelList[index];
+      if( element.label === "瑙嗛" ){
+        formData.value.useModel = Number( element.value )
+      }
+    }
+  }
+  
+  </script>
+  
\ No newline at end of file
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/index.vue b/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
index 3b6167f..e0ecd01 100644
--- a/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
@@ -173,7 +173,7 @@
           <el-button
             link
             type="primary"
-            @click="openForm('detail', scope.row.id)"
+            @click="OpenLookformRef('detail', scope.row.id)"
             v-hasPermi="['digitalcourse:digital-humans:delete']"
           >
             {{t('digitalhumans.view')}}
@@ -190,8 +190,10 @@
     />
   </ContentWrap>
 
-  <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
+  <!-- 琛ㄥ崟寮圭獥锛氭坊鍔� -->
   <DigitalHumansForm ref="formRef" @success="getList" />
+  <!-- 琛ㄥ崟寮圭獥锛氫慨鏀� -->
+  <LookDigitalHumansForm ref="LookformRef" @success="getList" />
   <!-- 澶勭悊 -->
   <AuditForm ref="auditFormRef" @success="getList" />
 </template>
@@ -203,6 +205,7 @@
 import download from '@/utils/download'
 import * as DigitalHumansApi from '@/api/digitalcourse/digitalhumans'
 import DigitalHumansForm from './DigitalHumansForm.vue'
+import LookDigitalHumansForm from './LookDigitalHumansForm.vue'
 import AuditForm from './AuditForm.vue'
 import { useUserStoreWithOut } from '@/store/modules/user'
 const userStore = useUserStoreWithOut() // 鐢ㄦ埛淇℃伅缂撳瓨
@@ -260,13 +263,20 @@
   handleQuery()
 }
 
-/** 娣诲姞/淇敼鎿嶄綔 */
+/** 娣诲姞鎿嶄綔 */
 const formRef = ref()
 const auditFormRef = ref()
 const openForm = (type: string, id?: number) => {
   formRef.value.open(type, id)
 }
 
+/* 淇敼鎿嶄綔 */
+const LookformRef = ref()
+const OpenLookformRef = ( type: string, id?:number ) => {
+  LookformRef.value.open( type, id )
+}
+
+
 const openAuditForm = (type: string, id?: number) => {
   auditFormRef.value.open(type, id)
 }

--
Gitblit v1.9.3