@ -25,24 +25,44 @@ const material = computed(() => {
const name = String ( props . materialName || "" ) . trim ( ) ;
const url = String ( props . materialUrl || "" ) . trim ( ) ;
if ( ! name || ! url || ( name === "案例资料.rar" && url === "/file/example.rar" ) ) return null ;
return { name , url } ;
return { name , url : normalizeMaterialUrl ( url ) } ;
} ) ;
const extension = computed ( ( ) => String ( material . value ? . name || material . value ? . url || "" ) . split ( /[?#]/ ) [ 0 ] . split ( "." ) . pop ( ) . toLowerCase ( ) ) ;
const isImage = computed ( ( ) => [ "jpg" , "jpeg" , "png" , "gif" , "webp" , "bmp" , "svg" ] . includes ( extension . value ) ) ;
const isPdf = computed ( ( ) => extension . value === "pdf" ) ;
const previewable = computed ( ( ) => isImage . value || isPdf . value ) ;
function handleDownload ( ) {
function normalizeMaterialUrl ( rawUrl ) {
const url = String ( rawUrl || "" ) . trim ( ) ;
if ( ! url ) return "" ;
try {
const parsed = new URL ( url ) ;
if ( [ "localhost" , "127.0.0.1" , "::1" ] . includes ( parsed . hostname ) && parsed . pathname . startsWith ( "/file/" ) ) {
return ` ${ parsed . pathname } ${ parsed . search } ${ parsed . hash } ` ;
}
} catch {
/ / R e l a t i v e f i l e p a t h s a r e a l r e a d y r e s o l v e d t h r o u g h t h e c u r r e n t d e p l o y m e n t o r V i t e p r o x y .
}
return url ;
}
async function handleDownload ( ) {
if ( ! material . value ? . url ) { ElMessage . warning ( "暂无案例资料" ) ; return ; }
const link = document . createElement ( "a" ) ;
link . href = material . value . url ;
link . target = "_blank" ;
link . rel = "noopener" ;
link . download = material . value . name ;
document . body . appendChild ( link ) ;
link . click ( ) ;
document . body . removeChild ( link ) ;
if ( ! previewable . value ) ElMessage . info ( "该文件类型暂不支持在线预览,已为您打开下载。" ) ;
try {
const response = await fetch ( material . value . url ) ;
if ( ! response . ok ) throw new Error ( ` HTTP ${ response . status } ` ) ;
const objectUrl = URL . createObjectURL ( await response . blob ( ) ) ;
const link = document . createElement ( "a" ) ;
link . href = objectUrl ;
link . download = material . value . name ;
document . body . appendChild ( link ) ;
link . click ( ) ;
document . body . removeChild ( link ) ;
URL . revokeObjectURL ( objectUrl ) ;
} catch ( error ) {
console . warn ( "Case material download failed" , error ) ;
ElMessage . error ( "案例资料文件不存在或暂不可下载,请联系管理员重新上传。" ) ;
}
}
< / script >