From f1970eef5785cf3d3a4483f40db026a390ea4f48 Mon Sep 17 00:00:00 2001 From: wong <106998207@qq.com> Date: Tue, 13 May 2025 18:20:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=BA=93=E7=B4=A0=E6=9D=90?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cunkebao/app/content/[id]/materials/page.tsx | 448 ++++++++++++------- 1 file changed, 295 insertions(+), 153 deletions(-) diff --git a/Cunkebao/app/content/[id]/materials/page.tsx b/Cunkebao/app/content/[id]/materials/page.tsx index 92d0e54e..81466ee5 100644 --- a/Cunkebao/app/content/[id]/materials/page.tsx +++ b/Cunkebao/app/content/[id]/materials/page.tsx @@ -11,7 +11,11 @@ import { toast } from "@/components/ui/use-toast" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { api } from "@/lib/api" import { showToast } from "@/lib/toast" +import { Avatar } from "@/components/ui/avatar" +import { Separator } from "@/components/ui/separator" +import { format } from "date-fns" import Image from "next/image" +import { cn } from "@/lib/utils" interface ApiResponse { code: number @@ -39,6 +43,7 @@ interface Material { friendId: string | null wechatChatroomId: number senderNickname: string + senderAvatar: string // 发布朋友圈用户的头像 location: string | null lat: string lng: string @@ -48,40 +53,6 @@ const isImageUrl = (url: string) => { return /\.(jpg|jpeg|png|gif|webp)$/i.test(url) || url.includes('oss-cn-shenzhen.aliyuncs.com') } -const ContentDisplay = ({ content, resUrls }: { content: string, resUrls: string[] }) => { - if (isImageUrl(content)) { - return ( -
- 素材图片 -
- ) - } - - if (resUrls.length > 0 && resUrls.some(isImageUrl)) { - return ( -
- {resUrls.filter(isImageUrl).map((url, index) => ( -
- {`素材图片 -
- ))} -
- ) - } - - return
{content}
-} - export default function MaterialsPage({ params }: { params: Promise<{ id: string }> }) { const resolvedParams = use(params) const router = useRouter() @@ -95,8 +66,8 @@ export default function MaterialsPage({ params }: { params: Promise<{ id: string const [deleteDialogOpen, setDeleteDialogOpen] = useState(null) const fetchMaterials = useCallback(async () => { - setIsLoading(true) - try { + setIsLoading(true) + try { const queryParams = new URLSearchParams({ page: page.toString(), limit: limit.toString(), @@ -112,11 +83,11 @@ export default function MaterialsPage({ params }: { params: Promise<{ id: string showToast(response.msg || "获取素材数据失败", "error") } } catch (error: any) { - console.error("Failed to fetch materials:", error) + console.error("Failed to fetch materials:", error) showToast(error?.message || "请检查网络连接", "error") - } finally { - setIsLoading(false) - } + } finally { + setIsLoading(false) + } }, [page, searchQuery, resolvedParams.id]) useEffect(() => { @@ -171,10 +142,124 @@ export default function MaterialsPage({ params }: { params: Promise<{ id: string } } - const filteredMaterials = materials + // 处理内容显示 + const renderContent = (material: Material) => { + // 如果内容是图片,由renderImageResources处理 + if (isImageUrl(material.content)) { + return null + } + + // 显示文本内容 + return ( +
+

{material.content}

+
+ ) + } + + // 处理图片资源 + const renderImageResources = (material: Material) => { + const imageUrls = material.resUrls.filter(isImageUrl) + // 如果内容本身是图片,也添加到图片数组中 + if (isImageUrl(material.content) && !imageUrls.includes(material.content)) { + imageUrls.unshift(material.content) + } + + if (imageUrls.length === 0) return null + + // 微信朋友圈风格的图片布局 + if (imageUrls.length === 1) { + // 单张图片:大图显示 + return ( +
+
+ 图片内容 +
+
+ ) + } else if (imageUrls.length === 2) { + // 两张图片:横向排列 + return ( +
+ {imageUrls.map((url, idx) => ( +
+ {`图片 +
+ ))} +
+ ) + } else if (imageUrls.length === 3) { + // 三张图片:使用3x3网格的前三个格子 + return ( +
+ {imageUrls.map((url, idx) => ( +
+ {`图片 +
+ ))} +
+ ) + } else if (imageUrls.length === 4) { + // 四张图片:2x2网格 + return ( +
+ {imageUrls.map((url, idx) => ( +
+ {`图片 +
+ ))} +
+ ) + } else { + // 五张及以上:3x3网格 + const displayImages = imageUrls.slice(0, 9) + const hasMore = imageUrls.length > 9 + + return ( +
+ {displayImages.map((url, idx) => ( +
+ {`图片 + {idx === 8 && hasMore && ( +
+ +{imageUrls.length - 9} +
+ )} +
+ ))} +
+ ) + } + } return ( -
+
@@ -184,12 +269,6 @@ export default function MaterialsPage({ params }: { params: Promise<{ id: string

已采集素材

- {/* 已隐藏下载Excel按钮 - - */}
- -
-
-
- - setSearchQuery(e.target.value)} - onKeyDown={(e) => e.key === 'Enter' && handleSearch()} - className="pl-9" - /> -
- + +
+
+ + setSearchQuery(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && handleSearch()} + />
+ +
+
-
- {isLoading ? ( -
- -
- ) : filteredMaterials.length === 0 ? ( -
-
-

暂无数据

- + {isLoading ? ( + // 加载状态 +
+ {Array.from({ length: 3 }).map((_, index) => ( + +
+
+
+
+
- ) : ( - filteredMaterials.map((material) => ( -
- {/* 图片/内容区 */} - - {/* 资源标签(非图片) */} - {material.resUrls.length > 0 && !material.resUrls.some(isImageUrl) && ( -
- {material.resUrls.map((url, index) => ( - - - 资源 {index + 1} - - ))} -
- )} - {/* 底部信息区 */} -
-
- 发送者: {material.senderNickname} - 时间: {material.time} -
-
-
- - - - - - - - AI 分析结果 - -
-

正在分析中...

-
-
-
-
-
- setDeleteDialogOpen(open ? material.id : null)}> - - - - - - 确认删除 - -
确定要删除该素材吗?此操作不可恢复。
-
- - -
-
-
+
+
+
+
+
+
+
+
+
+ + ))} +
+ ) : ( + // 素材列表 +
+ {materials.length === 0 ? ( + + 暂无素材数据 + + ) : ( + materials.map(material => ( + +
+
+ + {material.senderNickname} + +
+
{material.senderNickname}
+
+ {material.time && format(new Date(material.time), 'yyyy-MM-dd HH:mm')}
+ + ID: {material.id} +
- )) - )} -
+ + + + {/* 文本内容 */} + {renderContent(material)} + + {/* 图片资源 */} + {renderImageResources(material)} + + {/* 非图片资源标签 */} + {material.resUrls.length > 0 && !material.resUrls.some(isImageUrl) && ( +
+ {material.resUrls.map((url, index) => ( + + + 资源 {index + 1} + + ))} +
+ )} + +
+
+ + + + + + + + AI 分析结果 + +
+

正在分析中...

+
+
+
+
+ setDeleteDialogOpen(open ? material.id : null)}> + + + + + + 确认删除 + +
确定要删除该素材吗?此操作不可恢复。
+
+ + +
+
+
+
+ + )) + )}
- + )} + + {!isLoading && total > limit && ( +
+ + + 第 {page} 页,共 {Math.ceil(total / limit)} 页 + + +
+ )}
)