修复了课程管理的图片显示问题
This commit is contained in:
parent
775f4d1e91
commit
a80b379d45
@ -189,6 +189,65 @@ const formRules = {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从URL中提取文件名
|
||||||
|
const getFileNameFromUrl = (url) => {
|
||||||
|
if (!url) return ''
|
||||||
|
|
||||||
|
// 移除重复的路径部分
|
||||||
|
const cleanUrl = url.replace(/uploads\/courses\/(images|videos)\/uploads\/courses\/(images|videos)\//, 'uploads/courses/$1/')
|
||||||
|
|
||||||
|
// 如果是完整URL,提取文件名
|
||||||
|
if (cleanUrl.startsWith('http://') || cleanUrl.startsWith('https://')) {
|
||||||
|
// 移除域名和路径前缀,只保留文件名
|
||||||
|
const matches = cleanUrl.match(/\/([^/]+)$/)
|
||||||
|
return matches ? matches[1] : cleanUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果包含域名但不是以http开头
|
||||||
|
if (cleanUrl.includes('localhost:3000')) {
|
||||||
|
const matches = cleanUrl.match(/([^/]+)$/)
|
||||||
|
return matches ? matches[1] : cleanUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果已经是文件名,直接返回
|
||||||
|
if (!cleanUrl.includes('/')) {
|
||||||
|
return cleanUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其他情况,尝试获取最后一个斜杠后的内容
|
||||||
|
return cleanUrl.split('/').pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理图片URL
|
||||||
|
const processImageUrl = (url) => {
|
||||||
|
if (!url) return ''
|
||||||
|
|
||||||
|
// 如果已经是完整的正确URL,直接返回
|
||||||
|
if (url.match(/^http:\/\/localhost:3000\/uploads\/courses\/images\/[^/]+$/)) {
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件名
|
||||||
|
const fileName = getFileNameFromUrl(url)
|
||||||
|
// 构建完整URL
|
||||||
|
return `http://localhost:3000/uploads/courses/images/${fileName}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理视频URL
|
||||||
|
const processVideoUrl = (url) => {
|
||||||
|
if (!url) return ''
|
||||||
|
|
||||||
|
// 如果已经是完整的正确URL,直接返回
|
||||||
|
if (url.match(/^http:\/\/localhost:3000\/uploads\/courses\/videos\/[^/]+$/)) {
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件名
|
||||||
|
const fileName = getFileNameFromUrl(url)
|
||||||
|
// 构建完整URL
|
||||||
|
return `http://localhost:3000/uploads/courses/videos/${fileName}`
|
||||||
|
}
|
||||||
|
|
||||||
// 图片上传相关
|
// 图片上传相关
|
||||||
const handleCoverError = (error) => {
|
const handleCoverError = (error) => {
|
||||||
console.error('上传图片错误:', error)
|
console.error('上传图片错误:', error)
|
||||||
@ -261,22 +320,78 @@ const handleAdd = () => {
|
|||||||
const handleEdit = (row) => {
|
const handleEdit = (row) => {
|
||||||
formMode.value = 'edit'
|
formMode.value = 'edit'
|
||||||
dialogTitle.value = '编辑课程'
|
dialogTitle.value = '编辑课程'
|
||||||
|
|
||||||
|
// 从URL中提取文件名
|
||||||
|
const getFileNameFromUrl = (url) => {
|
||||||
|
if (!url) return ''
|
||||||
|
|
||||||
|
// 移除重复的路径部分
|
||||||
|
const cleanUrl = url.replace(/uploads\/courses\/(images|videos)\/uploads\/courses\/(images|videos)\//, 'uploads/courses/$1/')
|
||||||
|
|
||||||
|
// 如果是完整URL,提取文件名
|
||||||
|
if (cleanUrl.startsWith('http://') || cleanUrl.startsWith('https://')) {
|
||||||
|
// 移除域名和路径前缀,只保留文件名
|
||||||
|
const matches = cleanUrl.match(/\/([^/]+)$/)
|
||||||
|
return matches ? matches[1] : cleanUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果包含域名但不是以http开头
|
||||||
|
if (cleanUrl.includes('localhost:3000')) {
|
||||||
|
const matches = cleanUrl.match(/([^/]+)$/)
|
||||||
|
return matches ? matches[1] : cleanUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果已经是文件名,直接返回
|
||||||
|
if (!cleanUrl.includes('/')) {
|
||||||
|
return cleanUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其他情况,尝试获取最后一个斜杠后的内容
|
||||||
|
return cleanUrl.split('/').pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理图片URL
|
||||||
|
const processImageUrl = (url) => {
|
||||||
|
if (!url) return ''
|
||||||
|
|
||||||
|
// 如果已经是完整的正确URL,直接返回
|
||||||
|
if (url.match(/^http:\/\/localhost:3000\/uploads\/courses\/images\/[^/]+$/)) {
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件名
|
||||||
|
const fileName = getFileNameFromUrl(url)
|
||||||
|
// 构建完整URL
|
||||||
|
return `http://localhost:3000/uploads/courses/images/${fileName}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理视频URL
|
||||||
|
const processVideoUrl = (url) => {
|
||||||
|
if (!url) return ''
|
||||||
|
|
||||||
|
// 如果已经是完整的正确URL,直接返回
|
||||||
|
if (url.match(/^http:\/\/localhost:3000\/uploads\/courses\/videos\/[^/]+$/)) {
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取文件名
|
||||||
|
const fileName = getFileNameFromUrl(url)
|
||||||
|
// 构建完整URL
|
||||||
|
return `http://localhost:3000/uploads/courses/videos/${fileName}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置表单数据
|
||||||
|
const fileName = getFileNameFromUrl(row.cover_image)
|
||||||
|
const videoFileName = getFileNameFromUrl(row.video)
|
||||||
|
|
||||||
form.value = {
|
form.value = {
|
||||||
id: row.id,
|
id: row.id,
|
||||||
title: row.title,
|
title: row.title,
|
||||||
category: row.category,
|
category: row.category,
|
||||||
cover_image: row.cover_image,
|
cover_image: fileName, // 只保存文件名
|
||||||
cover_image_url: row.cover_image ? (
|
cover_image_url: `http://localhost:3000/uploads/courses/images/${fileName}`, // 完整URL用于预览
|
||||||
row.cover_image.startsWith('http')
|
video: videoFileName, // 只保存文件名
|
||||||
? row.cover_image
|
video_url: `http://localhost:3000/uploads/courses/videos/${videoFileName}`, // 完整URL用于预览
|
||||||
: `http://localhost:3000/uploads/courses/images/${row.cover_image}`
|
|
||||||
) : '',
|
|
||||||
video: row.video || '', // 保存视频文件名
|
|
||||||
video_url: row.video ? (
|
|
||||||
row.video.startsWith('http')
|
|
||||||
? row.video
|
|
||||||
: `http://localhost:3000/uploads/courses/videos/${row.video}`
|
|
||||||
) : '', // 完整的视频URL用于预览
|
|
||||||
video_duration: row.video_duration || 0,
|
video_duration: row.video_duration || 0,
|
||||||
video_size: row.video_size || 0,
|
video_size: row.video_size || 0,
|
||||||
description: row.description || '',
|
description: row.description || '',
|
||||||
@ -285,7 +400,7 @@ const handleEdit = (row) => {
|
|||||||
imageInputType: 'upload',
|
imageInputType: 'upload',
|
||||||
videoInputType: 'upload'
|
videoInputType: 'upload'
|
||||||
}
|
}
|
||||||
console.log('编辑表单数据:', form.value)
|
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,10 +517,27 @@ const handleImageTypeChange = () => {
|
|||||||
form.value.cover_image = ''
|
form.value.cover_image = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理图片错误
|
// 修改图片错误处理函数
|
||||||
const handleImageError = (e) => {
|
const handleImageError = (e) => {
|
||||||
console.error('图片加载失败:', e)
|
console.error('图片加载失败:', e)
|
||||||
ElMessage.warning('图片加载失败,但不影响保存')
|
const img = e.target
|
||||||
|
if (!img || !form.value.cover_image) return
|
||||||
|
|
||||||
|
// 防止死循环:记录重试次数
|
||||||
|
if (!img.dataset.retryCount) {
|
||||||
|
img.dataset.retryCount = '1'
|
||||||
|
} else if (Number(img.dataset.retryCount) >= 2) {
|
||||||
|
// 如果已经重试两次,就不再重试
|
||||||
|
console.warn('图片加载失败,已达到最大重试次数')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取正确的文件名
|
||||||
|
const fileName = getFileNameFromUrl(form.value.cover_image)
|
||||||
|
// 使用新的URL重试
|
||||||
|
img.src = `http://localhost:3000/uploads/courses/images/${fileName}`
|
||||||
|
// 增加重试计数
|
||||||
|
img.dataset.retryCount = String(Number(img.dataset.retryCount) + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理视频上传
|
// 处理视频上传
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user