perf(core): 资产/通知「取全部」改大页+并行,根治每次刷新串十几个请求

资产接口原固定 20/页且不支持 page_size,前端 allAssets 逐页串行翻完(190 资产=10 个
串行请求,每个 0.5~1.7s 依次等)→ 整页刷新好几秒。
- 后端:AssetViewSet 加 AssetPagination(page_size_query_param,上限 200)
- 前端:allAssets/allNotifications 改「首页大页(200/100)+ 剩余页 Promise.all 并行」
资产 ≤200 时 1 个请求取全;再多也并行不串行。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-17 14:52:19 +08:00
co-authored by Claude Opus 4.8
parent 608c8aeb7f
commit da0c7edfe2
2 changed files with 41 additions and 18 deletions
+10
View File
@@ -6,6 +6,7 @@ from django.db import transaction
from django.http import StreamingHttpResponse
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.pagination import PageNumberPagination
from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework.response import Response
from rest_framework.views import APIView
@@ -18,9 +19,18 @@ from .serializers import AssetSerializer, AssetUploadSerializer
from .storage import TosStorage
class AssetPagination(PageNumberPagination):
"""允许前端用 ?page_size= 覆盖(默认 20,上限 200)。前端「取全部资产」一次大页拉完,
不再逐页串行(原来 20/页 → 资产多时每次刷新要串十几个请求,整页很慢)。"""
page_size_query_param = "page_size"
max_page_size = 200
class AssetViewSet(TeamScopedViewSetMixin, ModelViewSet):
queryset = Asset.objects.prefetch_related("files").all()
serializer_class = AssetSerializer
pagination_class = AssetPagination
search_fields = ["name", "description"]
ordering_fields = ["created_at", "updated_at", "name"]