Browse Source

1.修改图库的直接下载功能,点击直接保存和下载;
2. 视频预览图限制高度最高200px;

moshaorui 2 weeks ago
parent
commit
906af6b0a5

+ 6 - 1
app/Http/Controllers/HomeController.php

@@ -10,6 +10,7 @@ namespace App\Http\Controllers;
 use App\Models\SiteAlbum;
 use App\Models\SiteAlbumFolder;
 use App\Models\SiteAlbumLog;
+use App\Models\SitePreviewVideo;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Validator;
@@ -143,9 +144,13 @@ class HomeController extends Controller
             }
         }
        // dd(json_decode($album['parameters'], true));
+
+        $album = $album->toArray();
+        $album['video'] = SitePreviewVideo::changeVideo($album['id'],$album['video']);
+        //dd($album);
         return view('gallery-detail',[
             'foldersTree' => $this->foldersTree,
-            'album' => $album->toArray(),
+            'album' => $album,
             'showTabs' => $showTabs
         ]);
     }

+ 31 - 0
app/Models/SitePreviewVideo.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Models;
+
+
+
+use Illuminate\Database\Eloquent\Model;
+
+class SitePreviewVideo extends Model
+{
+
+    protected $table = 'site_preview_video';
+
+    public static function changeVideo($albumId,$voidData) {
+        if (is_string($voidData)) {
+            $voidData = json_decode($voidData, true);
+        }
+        $result = SitePreviewVideo::where('album_id', $albumId)->get();
+        foreach ($voidData as $key => $value) {
+            foreach ($result as $item) {
+                if ($item->video_url == $value['video_src']) {
+                    $voidData[$key]['preview_url'] = $item->preview_url;
+                }
+            }
+        }
+
+        return json_encode($voidData);
+    }
+
+
+}

+ 4 - 0
app/helpers.php

@@ -6,9 +6,13 @@ if (! function_exists('ossUrl')) {
      * @param string $path 路径
      */
     function ossUrl($path) {
+        if (empty($path)) {
+            return '';
+        }
         if (strpos($path, 'http') === 0 || strpos($path, 'https') === 0) {
             return $path;
         }
+
         return env('OSS_HOST').'/'. $path;
     }
 }

+ 131 - 2
resources/views/gallery-detail.blade.php

@@ -20,6 +20,39 @@
     <link rel="stylesheet" href="/static/css/main.css">
 
 </head>
+<style>
+    .video-hover-container {
+        position: relative;
+        display: inline-block;
+    }
+
+    .video-hover-container img,
+    .video-hover-container video {
+        display: block;
+        object-fit: cover;
+    }
+
+    .video-hover-container a {
+        display: block;
+        position: relative;
+    }
+
+    /* Spinner styles */
+    .spinner {
+        width: 40px;
+        height: 40px;
+        border: 4px solid #fff;
+        border-top: 4px solid transparent;
+        border-radius: 50%;
+        animation: spin 1s linear infinite;
+    }
+
+    @keyframes spin {
+        0% { transform: rotate(0deg); }
+        100% { transform: rotate(360deg); }
+    }
+</style>
+
 <body class="main-body">
 
 <div class="menu-overlay"></div>
@@ -92,9 +125,9 @@
                                 <tbody>
                                 @foreach($content as $item)
                                 <tr>
-                                    <td>
+                                    <td class="video-hover-container">
                                         <a href="{{ossUrl($item['cover'])}}" target="_blank">
-                                            <img src="{{ossUrl($item['cover'])}}?x-oss-process=image/resize,w_260" class="void-img">
+                                            <img src="{{ossUrl($item['cover'])}}?x-oss-process=image/resize,w_260" class="void-img" data-index="{{$loop->index}}" data-preview="{{ossUrl($item['preview_url'])}}" data-poster="{{ossUrl($item['cover'])}}?x-oss-process=image/resize,w_260">
                                         </a>
                                     </td>
                                     <td>
@@ -214,6 +247,102 @@
     $(document).ready(function() {
         $('.grid-album:first').addClass('');
     });
+
+    $(document).ready(function() {
+        $('.video-hover-container').each(function() {
+            var $container = $(this);
+            var $img = $container.find('img');
+            $img.data('original-src', $img.attr('src'));
+        });
+
+        // Object to track load status using data-index as key
+        var loadIndexes = {};
+
+        $('.video-hover-container').on('mouseenter', function(e) {
+            e.preventDefault(); // Prevent link default behavior during hover
+            var $container = $(this);
+            var $img = $container.find('img');
+            var $link = $container.find('a');
+            var videoUrl = $img.data('preview');
+            var posterUrl = $img.data('poster');
+            var index = $img.data('index'); // Get the data-index value
+
+            // Initialize loadIndexes[index] if not set
+            if (!loadIndexes.hasOwnProperty(index)) {
+                loadIndexes[index] = 0;
+            }
+
+            // Create loading overlay
+            var $loading = $('<div>', {
+                class: 'loading-overlay',
+                css: {
+                    position: 'absolute',
+                    top: 0,
+                    left: 0,
+                    width: '100%',
+                    height: '100%',
+                    background: 'rgba(0,0,0,0.5)',
+                    display: 'flex',
+                    alignItems: 'center',
+                    justifyContent: 'center',
+                    zIndex: 10
+                }
+            }).append('<div class="spinner"></div>');
+
+            // Create video element
+            var $video = $('<video>', {
+                src: videoUrl,
+                poster: posterUrl,
+                autoplay: true,
+                muted: true,
+                loop: true,
+                css: {
+                    width: $img.width(),
+                    height: $img.height(),
+                    display: 'none' // Initially hidden until loaded
+                }
+            });
+
+            if (loadIndexes[index] === 0 && videoUrl != "") {
+                loadIndexes[index] = 1;
+                $container.css('position', 'relative');
+                $link.append($loading);
+            }
+
+            // When video can play
+            $video.on('canplay', function() {
+                if (loadIndexes[index] === 1) {
+                    loadIndexes[index] = 2;
+                    $loading.remove();
+                    $img.hide();
+                    $video.show();
+                    $link.append($video);
+                }
+            });
+
+            // Maintain link functionality
+            $link.on('click', function(e) {
+                if ($video.is(':visible')) {
+                    e.preventDefault(); // Prevent click when video is showing
+                }
+            });
+        });
+
+        $('.video-hover-container').on('mouseleave', function() {
+            var $container = $(this);
+            var $img = $container.find('img');
+            var index = $img.data('index'); // Get the data-index value
+
+            if (loadIndexes[index] === 2 || loadIndexes[index] === 1) {
+                loadIndexes[index] = 0;
+                var $video = $container.find('video');
+                var $loading = $container.find('.loading-overlay');
+                $video.remove();
+                $loading.remove();
+                $img.show();
+            }
+        });
+    });
 </script>
 </body>
 </html>