<template> <el-drawer v-model="showDrawer" title="图片详细" @close="handleDrawerClose" custom-class="drawer-class" > <!-- 图片 --> <div class="item"> <div class="body"> <el-image class="image" :src="detail?.picUrl" :preview-src-list="[detail.picUrl]" preview-teleported /> </div> </div> <!-- 时间 --> <div class="item"> <div class="tip">时间</div> <div class="body"> <div>提交时间:{{ formatTime(detail.createTime, 'yyyy-MM-dd HH:mm:ss') }}</div> <div>生成时间:{{ formatTime(detail.finishTime, 'yyyy-MM-dd HH:mm:ss') }}</div> </div> </div> <!-- 模型 --> <div class="item"> <div class="tip">模型</div> <div class="body"> {{ detail.model }}({{ detail.height }}x{{ detail.width }}) </div> </div> <!-- 提示词 --> <div class="item"> <div class="tip">提示词</div> <div class="body"> {{ detail.prompt }} </div> </div> <!-- 地址 --> <div class="item"> <div class="tip">图片地址</div> <div class="body"> {{ detail.picUrl }} </div> </div> <!-- StableDiffusion 专属区域 --> <div class="item" v-if="detail.platform === AiPlatformEnum.STABLE_DIFFUSION && detail?.options?.sampler" > <div class="tip">采样方法</div> <div class="body"> {{ StableDiffusionSamplers.find( (item: ImageModelVO) => item.key === detail?.options?.sampler )?.name }} </div> </div> <div class="item" v-if=" detail.platform === AiPlatformEnum.STABLE_DIFFUSION && detail?.options?.clipGuidancePreset " > <div class="tip">CLIP</div> <div class="body"> {{ StableDiffusionClipGuidancePresets.find( (item: ImageModelVO) => item.key === detail?.options?.clipGuidancePreset )?.name }} </div> </div> <div class="item" v-if="detail.platform === AiPlatformEnum.STABLE_DIFFUSION && detail?.options?.stylePreset" > <div class="tip">风格</div> <div class="body"> {{ StableDiffusionStylePresets.find( (item: ImageModelVO) => item.key === detail?.options?.stylePreset )?.name }} </div> </div> <div class="item" v-if="detail.platform === AiPlatformEnum.STABLE_DIFFUSION && detail?.options?.steps" > <div class="tip">迭代步数</div> <div class="body"> {{ detail?.options?.steps }} </div> </div> <div class="item" v-if="detail.platform === AiPlatformEnum.STABLE_DIFFUSION && detail?.options?.scale" > <div class="tip">引导系数</div> <div class="body"> {{ detail?.options?.scale }} </div> </div> <div class="item" v-if="detail.platform === AiPlatformEnum.STABLE_DIFFUSION && detail?.options?.seed" > <div class="tip">随机因子</div> <div class="body"> {{ detail?.options?.seed }} </div> </div> <!-- Dall3 专属区域 --> <div class="item" v-if="detail.platform === AiPlatformEnum.OPENAI && detail?.options?.style"> <div class="tip">风格选择</div> <div class="body"> {{ Dall3StyleList.find((item: ImageModelVO) => item.key === detail?.options?.style)?.name }} </div> </div> <!-- Midjourney 专属区域 --> <div class="item" v-if="detail.platform === AiPlatformEnum.MIDJOURNEY && detail?.options?.version" > <div class="tip">模型版本</div> <div class="body"> {{ detail?.options?.version }} </div> </div> <div class="item" v-if="detail.platform === AiPlatformEnum.MIDJOURNEY && detail?.options?.referImageUrl" > <div class="tip">参考图</div> <div class="body"> <el-image :src="detail.options.referImageUrl" /> </div> </div> </el-drawer> </template> <script setup lang="ts"> import { ImageApi, ImageVO } from '@/api/ai/image' import { AiPlatformEnum, Dall3StyleList, ImageModelVO, StableDiffusionClipGuidancePresets, StableDiffusionSamplers, StableDiffusionStylePresets } from '@/views/ai/utils/constants' import { formatTime } from '@/utils' const showDrawer = ref<boolean>(false) // 是否显示 const detail = ref<ImageVO>({} as ImageVO) // 图片详细信息 const props = defineProps({ show: { type: Boolean, require: true, default: false }, id: { type: Number, required: true } }) /** 关闭抽屉 */ const handleDrawerClose = async () => { emits('handleDrawerClose') } /** 监听 drawer 是否打开 */ const { show } = toRefs(props) watch(show, async (newValue, oldValue) => { showDrawer.value = newValue as boolean }) /** 获取图片详情 */ const getImageDetail = async (id: number) => { detail.value = await ImageApi.getImageMy(id) } /** 监听 id 变化,加载最新图片详情 */ const { id } = toRefs(props) watch(id, async (newVal, oldVal) => { if (newVal) { await getImageDetail(newVal) } }) const emits = defineEmits(['handleDrawerClose']) </script> <style scoped lang="scss"> .item { margin-bottom: 20px; width: 100%; overflow: hidden; word-wrap: break-word; .header { display: flex; flex-direction: row; justify-content: space-between; } .tip { font-weight: bold; font-size: 16px; } .body { margin-top: 10px; color: #616161; .taskImage { border-radius: 10px; } } } </style>