From 2e9171a4f98676a5ae6842c52374b03a1ed04573 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Tue, 10 Feb 2026 15:17:41 +0900 Subject: [PATCH 1/3] feat(photoalbums): improve listing perf --- .../User/Photoalbums/PhotoalbumsPlugin.php | 7 +- app/Providers/AppServiceProvider.php | 12 ++- .../photoalbums/card/index_folder.blade.php | 2 + .../default/index_folder.blade.php | 2 + .../photoalbums/default/index_image.blade.php | 93 +++++++++++++------ 5 files changed, 87 insertions(+), 29 deletions(-) diff --git a/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php b/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php index 174e0dc69..f28efdb17 100644 --- a/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php +++ b/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php @@ -154,7 +154,10 @@ public function index($request, $page_id, $frame_id, $parent_id = null) } // カバー写真に指定されている写真 - $covers = PhotoalbumContent::whereIn('parent_id', $photoalbum_contents->where('is_folder', PhotoalbumContent::is_folder_on)->pluck('id'))->where('is_cover', PhotoalbumContent::is_cover_on)->get(); + $covers = PhotoalbumContent::whereIn('parent_id', $photoalbum_contents->where('is_folder', PhotoalbumContent::is_folder_on)->pluck('id')) + ->where('is_cover', PhotoalbumContent::is_cover_on) + ->with(['upload', 'posterUpload']) + ->get(); // 表示テンプレートを呼び出す。 return $this->view('index', [ @@ -375,7 +378,7 @@ private function isHiddenPhotoalbumContent(PhotoalbumContent $content, array $hi private function getSortedChildren(PhotoalbumContent $parent, ?string $sort_folder, ?string $sort_file, ?Collection $preloaded_children = null) { $children = is_null($preloaded_children) - ? $parent->children()->get() + ? $parent->children()->with(['upload', 'posterUpload'])->get() : $preloaded_children->get($parent->id, collect()); // 設定画面などで事前に読み込んだ子要素一覧を再利用し、追加クエリを避ける diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3d850f778..62d48218a 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -541,7 +541,17 @@ private function getPostBucketsRoles($buckets) return false; } - // return $buckets->getBucketsRoles(); + $request = app(Request::class); + $bucket_id = $buckets->id ?? null; + if ($bucket_id && $request->isMethod('get')) { + static $cached_post_roles = []; + if (array_key_exists($bucket_id, $cached_post_roles)) { + return $cached_post_roles[$bucket_id]; + } + $cached_post_roles[$bucket_id] = $buckets->getPostArrayBucketsRoles(); + return $cached_post_roles[$bucket_id]; + } + return $buckets->getPostArrayBucketsRoles(); // // Buckets にrole がない場合などで、Buckets のrole を使用しない場合はfalse を返す。 diff --git a/resources/views/plugins/user/photoalbums/card/index_folder.blade.php b/resources/views/plugins/user/photoalbums/card/index_folder.blade.php index 615038da0..ba99602e2 100644 --- a/resources/views/plugins/user/photoalbums/card/index_folder.blade.php +++ b/resources/views/plugins/user/photoalbums/card/index_folder.blade.php @@ -28,6 +28,8 @@ id="cover_{{$loop->iteration}}" style="max-height: 200px; object-fit: scale-down; cursor:pointer; border-radius: 3px;" class="img-fluid" + loading="lazy" + decoding="async" > @else diff --git a/resources/views/plugins/user/photoalbums/default/index_folder.blade.php b/resources/views/plugins/user/photoalbums/default/index_folder.blade.php index b1265f75b..82a951163 100644 --- a/resources/views/plugins/user/photoalbums/default/index_folder.blade.php +++ b/resources/views/plugins/user/photoalbums/default/index_folder.blade.php @@ -30,6 +30,8 @@ id="cover_{{$loop->iteration}}" style="max-height: 200px; object-fit: scale-down; cursor:pointer; border-radius: 3px;" class="img-fluid" + loading="lazy" + decoding="async" > @else diff --git a/resources/views/plugins/user/photoalbums/default/index_image.blade.php b/resources/views/plugins/user/photoalbums/default/index_image.blade.php index d92ccfc70..2bb94a4c5 100644 --- a/resources/views/plugins/user/photoalbums/default/index_image.blade.php +++ b/resources/views/plugins/user/photoalbums/default/index_image.blade.php @@ -20,9 +20,13 @@ $play_view_default = \App\Enums\PhotoalbumPlayviewType::play_in_list; $play_view = FrameConfig::getConfigValueAndOld($frame_configs, PhotoalbumFrameConfig::play_view, $play_view_default); $description_list_length = FrameConfig::getConfigValueAndOld($frame_configs, PhotoalbumFrameConfig::description_list_length); +$image_modal_id = 'photoalbum-image-modal-' . $frame_id; @endphp
@foreach($photoalbum_contents->where('is_folder', 0) as $photoalbum_content) + @php + $description_attr = str_replace(["\r\n", "\r", "\n"], '\\n', (string) $photoalbum_content->description); + @endphp
@if ($photoalbum_content->upload->is_image) @@ -30,39 +34,25 @@ - - @elseif ($photoalbum_content->isVideo($photoalbum_content->mimetype) && $play_view == PhotoalbumPlayviewType::play_in_detail) {{-- 動画:一覧はサムネイル画像のみで詳細画面で再生する --}} + class="img-fluid" + loading="lazy" + decoding="async"/> @elseif ($photoalbum_content->isVideo($photoalbum_content->mimetype)) {{-- 動画:一覧で再生する --}} @@ -129,4 +119,55 @@ class="img-fluid"
@endforeach
+ + + + @endif From 94c59b569ddeca343f17e6a6b6ea347471cdbc9f Mon Sep 17 00:00:00 2001 From: gakigaki Date: Thu, 12 Feb 2026 16:05:35 +0900 Subject: [PATCH 2/3] docs(auth): explain GET-only cache --- app/Providers/AppServiceProvider.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 62d48218a..29dec0dee 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -543,6 +543,8 @@ private function getPostBucketsRoles($buckets) $request = app(Request::class); $bucket_id = $buckets->id ?? null; + // GETは読み取り専用のため、同一リクエスト内キャッシュでSQLを減らしても整合性に影響しない。 + // POST系は同一リクエスト内で権限やバケツ設定が更新される可能性があるためキャッシュしない。 if ($bucket_id && $request->isMethod('get')) { static $cached_post_roles = []; if (array_key_exists($bucket_id, $cached_post_roles)) { From 9988028b420a044be70ab9c641f18f8804c4df75 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Thu, 12 Feb 2026 17:36:59 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix(photoalbums):=20=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=80=E3=83=AB=E8=AA=AC=E6=98=8E=E3=81=AE=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photoalbums/default/index_image.blade.php | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/resources/views/plugins/user/photoalbums/default/index_image.blade.php b/resources/views/plugins/user/photoalbums/default/index_image.blade.php index 2bb94a4c5..7823910a3 100644 --- a/resources/views/plugins/user/photoalbums/default/index_image.blade.php +++ b/resources/views/plugins/user/photoalbums/default/index_image.blade.php @@ -140,22 +140,33 @@ class="img-fluid" $(function () { var modalId = '#{{$image_modal_id}}'; var $modal = $(modalId); + var $htmlDecoder = $('