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