0955d5e2创建于 2025年9月22日历史提交
<template>
    <div class="rendering-area w h">
        <div class="form-group w h" :style="common_store.layout_style + layout_style">
            <form-title v-if="!isCustom" :value="props.value" :style="title_style"></form-title>
            <div class="content w h flex-1">
                <div class="re oh" :style="video_style">
                    <video v-show="is_video_play" ref="videoPlayer" :src="form.video[0]?.url || ''" controls class="w h"></video>
                    <template v-if="!is_video_play">
                        <template v-if="isEmpty(form.video) && isEmpty(form.video_img)">
                            <image-empty v-model="form.video_img" fit="contain" error-img-style="width:60px;height:60px;"></image-empty>
                        </template>
                        <template v-else>
                            <template v-if="!isEmpty(form.video)">
                                <video :src="form.video[0].url" controls class="w h"></video>
                            </template>
                            <template v-if="!isEmpty(form.video_img)">
                                <div class="middle w h">
                                    <image-empty v-model="form.video_img[0]" fit="contain" error-img-style="width:60px;height:60px;"></image-empty>
                                </div>
                            </template>
                        </template>
                        <img :src="video_src" class="middle box-shadow-sm round" width="60" height="60" @click="video_change" />
                    </template>
                </div>
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
import { commonStore } from "@/store";
const common_store = commonStore();
import { isEmpty } from "lodash";
const props = defineProps({
    value: {
        type: Object,
        default: () => ({}),
    },
    isCustom: {
        type: Boolean,
        default: false,
    }
});
const form = computed(() => props.value);
const video_src = ref(common_store.common.config.attachment_host + `/static/diy/images/components/model-video/video.png`);
const layout_style = computed(() => common_store.form_layout?.computer?.flex_direction == 'row'  ? 'align-items:flex-start;' : '');
const title_style = computed(() => common_store.form_layout?.computer?.flex_direction == 'row' ? 'margin-top:4px;' : '');

const video_style = computed(() => {
    if (!props.isCustom) {
        const { video_width, video_scale_type } = form.value;
        const height = video_scale_type === '1' ? video_width : video_scale_type == '0' ? (video_width * 9) / 16 : (video_width * 3) / 4;
        return {
            width: `${video_width}px`,
            height: `${ height }px`,
        };
    } else {
        return {
            width: '100%',
            height: '100%',
        };
    }
});
const videoPlayer = ref<HTMLVideoElement | null>(null);
const is_video_play = ref(false);
const video_change = () => { 
    if (!isEmpty(form.value.video[0].url)) {
        const videoEl = videoPlayer.value;
        if (videoEl) {
            is_video_play.value = true;
            videoEl.play();
        }
    }
};
</script>
<style lang="scss" scoped>
</style>