翻译模型

This commit is contained in:
ZLI263
2025-10-12 20:48:29 +08:00
parent 13b71ad1fc
commit 0a8a3ad297
6 changed files with 136 additions and 68 deletions

View File

@@ -254,6 +254,40 @@ export const constantRoutes = [
name: 'AvatarSynthesis', name: 'AvatarSynthesis',
component: () => import('@/views/video/avatar-synthesis'), component: () => import('@/views/video/avatar-synthesis'),
meta: { title: '特写视频生成', icon: 'el-icon-user-solid' } meta: { title: '特写视频生成', icon: 'el-icon-user-solid' }
},
{
path: 'dance-video-generation',
name: 'DanceVideoGeneration',
component: () => import('@/views/video/dance-video-generation'),
meta: { title: '舞动视频生成', icon: 'el-icon-video-camera' }
},
{
path: 'image-video-analysis',
name: 'ImageVideoAnalysis',
component: () => import('@/views/video/image-video-analysis'),
meta: { title: '图片视频分析列表', icon: 'el-icon-picture' }
}
]
},
{
path: '/text-model',
component: Layout,
redirect: '/text-model/index',
name: 'TextModelRoot',
meta: { title: '文本模型', icon: 'el-icon-document' },
children: [
{
path: 'index',
name: 'TextModel',
component: () => import('@/views/text-model/index'),
meta: { title: '文本模型', icon: 'el-icon-document' }
},
{
path: 'translation',
name: 'Translation',
component: () => import('@/views/text-model/translation'),
meta: { title: '翻译模型', icon: 'el-icon-translation' }
} }
] ]
}, },

View File

@@ -40,9 +40,10 @@ service.interceptors.response.use(
if (res.success === true) { if (res.success === true) {
// 后端成功响应,转换为前端期望格式,保留分页信息 // 后端成功响应,转换为前端期望格式,保留分页信息
// 检查是否有data字段标准API如果没有则使用整个res作为data翻译API等
return { return {
code: 20000, code: 20000,
data: res.data, data: res.data || res, // 如果没有data字段使用整个res作为data
message: res.message || 'Success', message: res.message || 'Success',
total: res.total, total: res.total,
current: res.current, current: res.current,

View File

@@ -227,6 +227,8 @@ export default {
videoFps: 30, videoFps: 30,
mouthMoveStrength: 1.0, mouthMoveStrength: 1.0,
pasteBack: true, pasteBack: true,
extBbox: null, // 扩展边界框
faceBbox: null, // 人脸边界框
headMoveStrength: 0.7 headMoveStrength: 0.7
}, },
rules: { rules: {
@@ -258,6 +260,10 @@ export default {
return [ return [
{ label: 'emo-v1', value: 'emo-v1' } { label: 'emo-v1', value: 'emo-v1' }
] ]
} else if (this.selectedImageModel === 'emoji' || this.selectedImageModel === 'emoji-detect-v1') {
return [
{ label: 'emoji-v1', value: 'emoji-v1' }
]
} else if (this.selectedImageModel === 'liveportrait-detect') { } else if (this.selectedImageModel === 'liveportrait-detect') {
return [ return [
{ label: 'liveportrait', value: 'liveportrait' } { label: 'liveportrait', value: 'liveportrait' }
@@ -298,38 +304,22 @@ export default {
avatarName: item.avatarName, avatarName: item.avatarName,
ownerName: item.ownerName, ownerName: item.ownerName,
ownerPhone: item.ownerPhone, ownerPhone: item.ownerPhone,
modelName: item.modelName || item.model || '' // 获取模型名信息 modelName: item.modelName || item.model || '', // 获取模型名信息
extBbox: item.extBbox || null, // 扩展边界框
faceBbox: item.faceBbox || null // 人脸边界框
})) }))
console.log('Image options set:', this.imageOptions) console.log('Image options set:', this.imageOptions)
} else if (response && response.success === false) { } else if (response && response.success === false) {
console.error('Face Detect API response error:', response) console.error('Face Detect API response error:', response)
this.$message.error(`获取头像列表失败: ${response.message || '未知错误'}`) this.$message.error(`获取头像列表失败: ${response.message || '未知错误'}`)
// 使用模拟数据
this.imageOptions = [
{ id: 'img-001', name: '头像1', url: 'http://example.com/images/avatar1.jpg', ownerName: '张三', ownerPhone: '13800138000', modelName: 'emo-detect-v1' },
{ id: 'img-002', name: '头像2', url: 'http://example.com/images/avatar2.jpg', ownerName: '李四', ownerPhone: '13900139000', modelName: 'liveportrait-detect' },
{ id: 'img-003', name: '头像3', url: 'http://example.com/images/avatar3.jpg', ownerName: '王五', ownerPhone: '13700137000', modelName: 'other-model' }
]
} else { } else {
console.error('Unexpected face detect response format:', response) console.error('Unexpected face detect response format:', response)
this.$message.error('获取头像列表失败: 响应数据格式不正确') this.$message.error('获取头像列表失败: 响应数据格式不正确')
// 使用模拟数据
this.imageOptions = [
{ id: 'img-001', name: '头像1', url: 'http://example.com/images/avatar1.jpg', ownerName: '张三', ownerPhone: '13800138000', modelName: 'emo-detect-v1' },
{ id: 'img-002', name: '头像2', url: 'http://example.com/images/avatar2.jpg', ownerName: '李四', ownerPhone: '13900139000', modelName: 'liveportrait-detect' },
{ id: 'img-003', name: '头像3', url: 'http://example.com/images/avatar3.jpg', ownerName: '王五', ownerPhone: '13700137000', modelName: 'other-model' }
]
} }
}).catch(error => { }).catch(error => {
this.imageLoading = false this.imageLoading = false
console.error('获取头像列表失败:', error) console.error('获取头像列表失败:', error)
this.$message.error(`网络请求失败: ${error.message || '请检查网络连接'}`) this.$message.error(`网络请求失败: ${error.message || '请检查网络连接'}`)
// 开发环境使用模拟数据
this.imageOptions = [
{ id: 'img-001', name: '头像1', url: 'http://example.com/images/avatar1.jpg', ownerName: '张三', ownerPhone: '13800138000', modelName: 'emo-detect-v1' },
{ id: 'img-002', name: '头像2', url: 'http://example.com/images/avatar2.jpg', ownerName: '李四', ownerPhone: '13900139000', modelName: 'liveportrait-detect' },
{ id: 'img-003', name: '头像3', url: 'http://example.com/images/avatar3.jpg', ownerName: '王五', ownerPhone: '13700137000', modelName: 'other-model' }
]
}) })
}, },
@@ -368,23 +358,12 @@ export default {
} else { } else {
console.error('Unexpected response format:', response) console.error('Unexpected response format:', response)
this.$message.error('获取音频列表失败: 响应数据格式不正确') this.$message.error('获取音频列表失败: 响应数据格式不正确')
// 使用模拟数据
this.audioOptions = [
{ id: 'audio-001', name: 'tts_20251004_185457_1368662043.mp3', url: 'http://example.com/audio/audio1.mp3' },
{ id: 'audio-002', name: 'tts_20251004_185500_1368662044.mp3', url: 'http://example.com/audio/audio2.mp3' },
{ id: 'audio-003', name: 'tts_20251004_185503_1368662045.mp3', url: 'http://example.com/audio/audio3.mp3' }
]
} }
}).catch(error => { }).catch(error => {
this.audioLoading = false this.audioLoading = false
console.error('获取音频列表失败:', error) console.error('获取音频列表失败:', error)
this.$message.error(`网络请求失败: ${error.message || '请检查网络连接'}`) this.$message.error(`网络请求失败: ${error.message || '请检查网络连接'}`)
// 开发环境使用模拟数据 // 开发环境使用模拟数据
this.audioOptions = [
{ id: 'audio-001', name: 'tts_20251004_185457_1368662043.mp3', url: 'http://example.com/audio/audio1.mp3' },
{ id: 'audio-002', name: 'tts_20251004_185500_1368662044.mp3', url: 'http://example.com/audio/audio2.mp3' },
{ id: 'audio-003', name: 'tts_20251004_185503_1368662045.mp3', url: 'http://example.com/audio/audio3.mp3' }
]
}) })
}, },
@@ -403,16 +382,29 @@ export default {
// 获取头像的模型名信息 // 获取头像的模型名信息
this.selectedImageModel = selectedImage.modelName || '' this.selectedImageModel = selectedImage.modelName || ''
console.log('Selected image model:', this.selectedImageModel)
console.log('Selected image data:', selectedImage)
// 保存边界框信息
this.form.extBbox = selectedImage.extBbox
this.form.faceBbox = selectedImage.faceBbox
// 根据模型名自动设置模型供应商 // 根据模型名自动设置模型供应商
if (this.selectedImageModel === 'emo-detect-v1') { if (this.selectedImageModel === 'emo-detect-v1') {
this.form.modelProvider = 'emo-v1' this.form.modelProvider = 'emo-v1'
this.form.model = 'emo-v1'
} else if (this.selectedImageModel === 'emoji' || this.selectedImageModel === 'emoji-detect-v1') {
this.form.modelProvider = 'emoji-v1'
this.form.model = 'emoji-v1'
} else if (this.selectedImageModel === 'liveportrait-detect') { } else if (this.selectedImageModel === 'liveportrait-detect') {
this.form.modelProvider = 'liveportrait' this.form.modelProvider = 'liveportrait'
this.form.model = 'liveportrait'
} else { } else {
// 默认设置 // 默认设置
this.form.modelProvider = 'dashscope' this.form.modelProvider = 'dashscope'
this.form.model = 'liveportrait'
} }
console.log('Set model provider to:', this.form.modelProvider)
} }
}, },
@@ -443,7 +435,20 @@ export default {
this.$refs.form.validate((valid) => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
this.loading = true this.loading = true
synthesizeVideo(this.form).then(response => {
// 构建提交数据
const submitData = { ...this.form }
// 当模型为emoji-v1时包含边界框信息
if (this.form.modelProvider === 'emoji-v1') {
if (this.form.extBbox) {
submitData.extBbox = this.form.extBbox
}
if (this.form.faceBbox) {
submitData.faceBbox = this.form.faceBbox
}
}
synthesizeVideo(submitData).then(response => {
this.loading = false this.loading = false
if (response.code === 20000 || response.success) { if (response.code === 20000 || response.success) {
this.$message.success('视频合成任务已提交,请稍后查看结果') this.$message.success('视频合成任务已提交,请稍后查看结果')

View File

@@ -28,10 +28,10 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="头像名称"> <el-form-item label="模板名称">
<el-input <el-input
v-model="queryParams.avatarName" v-model="queryParams.templateName"
placeholder="请输入头像名称" placeholder="请输入模板名称"
clearable clearable
style="width: 200px" style="width: 200px"
/> />
@@ -72,8 +72,10 @@
> >
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="请求ID" prop="requestId" min-width="200" show-overflow-tooltip /> <el-table-column label="任务ID" prop="taskId" min-width="200" show-overflow-tooltip />
<el-table-column label="模" prop="model" width="150" /> <el-table-column label="模板名称" prop="templateName" width="120" show-overflow-tooltip />
<el-table-column label="所属人姓名" prop="ownerName" width="120" show-overflow-tooltip />
<el-table-column label="所属人电话" prop="ownerPhone" width="130" show-overflow-tooltip />
<el-table-column label="视频URL" prop="videoUrl" min-width="200" show-overflow-tooltip> <el-table-column label="视频URL" prop="videoUrl" min-width="200" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
<el-link v-if="scope.row.videoUrl" :href="scope.row.videoUrl" target="_blank" type="primary"> <el-link v-if="scope.row.videoUrl" :href="scope.row.videoUrl" target="_blank" type="primary">
@@ -82,10 +84,6 @@
<span v-else>-</span> <span v-else>-</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="所属人姓名" prop="ownerName" width="120" show-overflow-tooltip />
<el-table-column label="所属人电话" prop="ownerPhone" width="130" show-overflow-tooltip />
<el-table-column label="头像名称" prop="avatarName" width="120" show-overflow-tooltip />
<el-table-column label="模板ID" prop="templateId" width="150" show-overflow-tooltip />
<el-table-column label="状态" prop="success" width="80" align="center"> <el-table-column label="状态" prop="success" width="80" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag <el-tag
@@ -97,9 +95,12 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="请求时间" prop="requestTime" width="160" />
<el-table-column label="请求ID" prop="requestId" min-width="200" show-overflow-tooltip />
<el-table-column label="模型" prop="model" width="150" />
<el-table-column label="模板ID" prop="templateId" width="150" show-overflow-tooltip />
<el-table-column label="状态码" prop="statusCode" width="100" align="center" /> <el-table-column label="状态码" prop="statusCode" width="100" align="center" />
<el-table-column label="处理时间(ms)" prop="processingTimeMs" width="120" align="center" /> <el-table-column label="处理时间(ms)" prop="processingTimeMs" width="120" align="center" />
<el-table-column label="请求时间" prop="requestTime" width="160" />
<el-table-column label="响应时间" prop="responseTime" width="160" /> <el-table-column label="响应时间" prop="responseTime" width="160" />
<el-table-column label="创建时间" prop="createdAt" width="160" /> <el-table-column label="创建时间" prop="createdAt" width="160" />
<el-table-column label="操作" width="200" fixed="right"> <el-table-column label="操作" width="200" fixed="right">
@@ -139,12 +140,18 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<div class="detail-item"> <div class="detail-item">
<label>模板ID:</label> <label>任务ID:</label>
<span>{{ currentRecord.templateId }}</span> <span>{{ currentRecord.taskId }}</span>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12">
<div class="detail-item">
<label>模板ID:</label>
<span>{{ currentRecord.templateId }}</span>
</div>
</el-col>
<el-col :span="12"> <el-col :span="12">
<div class="detail-item"> <div class="detail-item">
<label>状态:</label> <label>状态:</label>
@@ -153,12 +160,20 @@
</el-tag> </el-tag>
</div> </div>
</el-col> </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<div class="detail-item"> <div class="detail-item">
<label>状态码:</label> <label>状态码:</label>
<span>{{ currentRecord.statusCode }}</span> <span>{{ currentRecord.statusCode }}</span>
</div> </div>
</el-col> </el-col>
<el-col :span="12">
<div class="detail-item">
<label>处理时间:</label>
<span>{{ currentRecord.processingTimeMs }}ms</span>
</div>
</el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
@@ -202,8 +217,8 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<div class="detail-item"> <div class="detail-item">
<label>头像名称:</label> <label>模板名称:</label>
<span>{{ currentRecord.avatarName }}</span> <span>{{ currentRecord.templateName }}</span>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@@ -305,9 +320,9 @@
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item label="模板名称" prop="avatarName"> <el-form-item label="模板名称" prop="templateName">
<el-input <el-input
v-model="uploadForm.avatarName" v-model="uploadForm.templateName"
placeholder="请输入模板名称" placeholder="请输入模板名称"
clearable clearable
/> />
@@ -346,7 +361,7 @@ export default {
model: 'animate-anyone-template-gen2', model: 'animate-anyone-template-gen2',
ownerName: '', ownerName: '',
ownerPhone: '', ownerPhone: '',
avatarName: '' templateName: ''
}, },
uploadLoading: false, uploadLoading: false,
detecting: false, detecting: false,
@@ -360,13 +375,13 @@ export default {
success: '', success: '',
ownerName: '', ownerName: '',
ownerPhone: '', ownerPhone: '',
avatarName: '', templateName: '',
createdAtRange: [] createdAtRange: []
} }
} }
}, },
computed: { computed: {
...mapGetters(['name', 'avatar', 'phone']) ...mapGetters(['name', 'templateName', 'phone'])
}, },
created() { created() {
// 设置默认查询参数为当前登录用户信息 // 设置默认查询参数为当前登录用户信息
@@ -426,12 +441,13 @@ export default {
{ {
id: 'weffg', id: 'weffg',
requestId: 'kjklkl;', requestId: 'kjklkl;',
taskId: 'task-12345',
model: 'aaa', model: 'aaa',
videoUrl: 'http://example.com/video/test.mp4', videoUrl: 'http://example.com/video/test.mp4',
ownerName: 'dddd', ownerName: 'dddd',
ownerPhone: '158212583', ownerPhone: '158212583',
avatarName: 'qw222', templateName: 'qw222',
templateId: '3334sss', templateName: '3334sss',
success: false, success: false,
requestTime: '2025-10-09T14:48:38', requestTime: '2025-10-09T14:48:38',
responseTime: '2025-10-09T14:48:45', responseTime: '2025-10-09T14:48:45',
@@ -463,7 +479,7 @@ export default {
success: '', success: '',
ownerName: '', ownerName: '',
ownerPhone: '', ownerPhone: '',
avatarName: '', templateName: '',
createdAtRange: [] createdAtRange: []
} }
// 重置后重新设置默认用户信息 // 重置后重新设置默认用户信息
@@ -594,7 +610,7 @@ export default {
model: 'animate-anyone-template-gen2', model: 'animate-anyone-template-gen2',
ownerName: '', ownerName: '',
ownerPhone: '', ownerPhone: '',
avatarName: '' templateName: ''
} }
this.uploadTemplateDialogVisible = true this.uploadTemplateDialogVisible = true
this.$nextTick(() => { this.$nextTick(() => {
@@ -661,7 +677,7 @@ export default {
const formData = new FormData() const formData = new FormData()
formData.append('file', file) formData.append('file', file)
formData.append('model', this.uploadForm.model || 'animate-anyone-template-gen2') formData.append('model', this.uploadForm.model || 'animate-anyone-template-gen2')
formData.append('avatarName', this.uploadForm.avatarName || '') formData.append('templateName', this.uploadForm.templateName || '')
formData.append('ownerName', this.uploadForm.ownerName || '') formData.append('ownerName', this.uploadForm.ownerName || '')
formData.append('ownerPhone', this.uploadForm.ownerPhone || '') formData.append('ownerPhone', this.uploadForm.ownerPhone || '')
formData.append('userId', this.$store.getters.userId || '') formData.append('userId', this.$store.getters.userId || '')
@@ -671,7 +687,7 @@ export default {
file: file.name, file: file.name,
type: 'template', type: 'template',
model: this.uploadForm.model, model: this.uploadForm.model,
avatarName: this.uploadForm.avatarName, templateName: this.uploadForm.templateName,
ownerName: this.uploadForm.ownerName, ownerName: this.uploadForm.ownerName,
ownerPhone: this.uploadForm.ownerPhone ownerPhone: this.uploadForm.ownerPhone
}) })

View File

@@ -83,19 +83,10 @@
> >
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="请求ID" prop="requestId" min-width="200" show-overflow-tooltip /> <el-table-column label="图像名称" prop="avatarName" width="120" show-overflow-tooltip />
<el-table-column label="模型" prop="model" width="150" /> <el-table-column label="模型" prop="model" width="150" />
<el-table-column label="所属人姓名" prop="ownerName" width="120" show-overflow-tooltip /> <el-table-column label="所属人姓名" prop="ownerName" width="120" show-overflow-tooltip />
<el-table-column label="所属人电话" prop="ownerPhone" width="130" show-overflow-tooltip /> <el-table-column label="所属人电话" prop="ownerPhone" width="130" show-overflow-tooltip />
<el-table-column label="图像名称" prop="avatarName" width="120" show-overflow-tooltip />
<el-table-column label="图像URL" prop="imageUrl" min-width="200" show-overflow-tooltip>
<template slot-scope="scope">
<el-link v-if="scope.row.imageUrl" :href="scope.row.imageUrl" target="_blank" type="primary">
查看图像
</el-link>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="检测数量" prop="faceCount" width="100" align="center" /> <el-table-column label="检测数量" prop="faceCount" width="100" align="center" />
<el-table-column label="状态" prop="success" width="80" align="center"> <el-table-column label="状态" prop="success" width="80" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
@@ -112,10 +103,11 @@
<el-table-column label="请求时间" prop="requestTime" width="160" /> <el-table-column label="请求时间" prop="requestTime" width="160" />
<el-table-column label="响应时间" prop="responseTime" width="160" /> <el-table-column label="响应时间" prop="responseTime" width="160" />
<el-table-column label="创建时间" prop="createdAt" width="160" /> <el-table-column label="创建时间" prop="createdAt" width="160" />
<el-table-column label="操作" width="200" fixed="right"> <el-table-column label="操作" width="250" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click="handleView(scope.row)">查看</el-button> <el-button type="text" @click="handleView(scope.row)">查看</el-button>
<el-button type="text" @click="handleDelete(scope.row)">删除</el-button> <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
<el-button v-if="scope.row.imageUrl" type="text" @click="viewImage(scope.row.imageUrl)">查看图像</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -151,6 +143,7 @@
</el-form-item> </el-form-item>
<el-form-item label="模型" prop="model"> <el-form-item label="模型" prop="model">
<el-select v-model="detectForm.model" placeholder="请选择模型" style="width: 100%"> <el-select v-model="detectForm.model" placeholder="请选择模型" style="width: 100%">
<el-option label="emoji模型" value="emoji-detect-v1" />
<el-option label="画像检查模型" value="liveportrait-detect" /> <el-option label="画像检查模型" value="liveportrait-detect" />
<el-option label="肖像检测模型" value="emo-detect-v1" /> <el-option label="肖像检测模型" value="emo-detect-v1" />
<el-option label="舞动图像模型" value="animate-anyone-detect-gen2" /> <el-option label="舞动图像模型" value="animate-anyone-detect-gen2" />
@@ -229,6 +222,7 @@
</el-form-item> </el-form-item>
<el-form-item label="模型" prop="model"> <el-form-item label="模型" prop="model">
<el-select v-model="uploadForm.model" placeholder="请选择模型" style="width: 100%"> <el-select v-model="uploadForm.model" placeholder="请选择模型" style="width: 100%">
<el-option label="emoji模型" value="emoji-detect-v1" />
<el-option label="画像检查模型" value="liveportrait-detect" /> <el-option label="画像检查模型" value="liveportrait-detect" />
<el-option label="肖像检测模型" value="emo-detect-v1" /> <el-option label="肖像检测模型" value="emo-detect-v1" />
<el-option label="舞动图像模型" value="animate-anyone-detect-gen2" /> <el-option label="舞动图像模型" value="animate-anyone-detect-gen2" />
@@ -1042,6 +1036,13 @@ export default {
this.failureDialogVisible = false this.failureDialogVisible = false
this.currentFailureRecord = null this.currentFailureRecord = null
this.failureReason = '' this.failureReason = ''
},
// 查看图像
viewImage(imageUrl) {
if (imageUrl) {
window.open(imageUrl, '_blank')
}
} }
} }
} }

View File

@@ -214,6 +214,17 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20">
<el-col :span="24">
<div class="detail-item">
<label>视频模板URL:</label>
<el-link v-if="currentRecord.videoTemplateUrl" :href="currentRecord.videoTemplateUrl" target="_blank" type="primary">
{{ currentRecord.videoTemplateUrl }}
</el-link>
<span v-else>-</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<div class="detail-item"> <div class="detail-item">