gongxiangp2/CARD_ENHANCEMENT.md
2025-10-26 09:11:04 +08:00

9.5 KiB
Raw Blame History

素材卡片增强功能说明 v2.2

📅 更新日期:2025-10-17


✨ 新增功能概览

1. 📊 下载次数统计

  • 自动计数:每次下载自动增加计数
  • 实时显示:卡片上显示下载次数图标和数字
  • 数据库持久化:所有统计数据保存在数据库

2. ❤️ 点赞功能

  • 一键点赞:点击红心按钮即可点赞
  • 取消点赞:再次点击可取消点赞
  • 唯一性:每个用户对每个素材只能点赞一次
  • 实时反馈:点赞后立即更新UI状态

3. 🎨 卡片信息优化

  • SPU标签:图片上叠加显示SPU
  • 彩色标签:店铺(蓝色)和场景类别(绿色)标签
  • 文件信息:显示完整的压缩包文件名
  • 统计图标:下载和点赞次数带图标显示
  • 视觉优化:更现代的布局和配色

🗄️ 数据库变更

Material模型新增字段

model Material {
  // ... 原有字段 ...
  downloadCount Int      @default(0) // 下载次数
  likeCount     Int      @default(0) // 点赞次数
  likes         MaterialLike[]       // 点赞关系
  
  @@index([downloadCount])
  @@index([likeCount])
}

新增MaterialLike模型

model MaterialLike {
  id          String   @id @default(uuid())
  materialId  String
  userId      String
  createdAt   DateTime @default(now())
  
  material    Material @relation(fields: [materialId], references: [id], onDelete: Cascade)
  user        User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([materialId, userId]) // 确保一个用户只能点赞一次
  @@map("material_likes")
  @@index([materialId])
  @@index([userId])
}

User模型更新

model User {
  // ... 原有字段 ...
  materials Material[]
  likes     MaterialLike[]  // 新增点赞关系
}

🔌 API更新

1. GET /api/materials

更新内容:返回数据包含点赞状态

响应数据:

[
  {
    "id": "uuid",
    "productModel": "SPU-001",
    "categoryName": "天猫旗舰店",
    "sceneName": "客厅",
    "authorName": "设计师A",
    "zipFileName": "zip-xxxx-素材名称.zip",
    "downloadCount": 25,
    "likeCount": 10,
    "isLiked": true,  // ← 新增:当前用户是否点赞
    // ... 其他字段
  }
]

逻辑改进:

  • 获取session判断是否登录
  • 如果登录,查询当前用户的所有点赞记录
  • 为每个素材添加isLiked字段

2. POST /api/materials/like

新增API:处理点赞/取消点赞

请求体:

{
  "materialId": "uuid"
}

响应:

{
  "liked": true,  // true=点赞成功,false=取消点赞
  "message": "点赞成功"
}

功能:

  • 检查用户是否已点赞
  • 如果未点赞:创建点赞记录,likeCount +1
  • 如果已点赞:删除点赞记录,likeCount -1
  • 使用唯一索引确保数据一致性

3. GET /api/materials/download

更新内容:自动增加下载次数

新增逻辑:

// 增加下载次数
await prisma.material.update({
  where: { id },
  data: {
    downloadCount: {
      increment: 1
    }
  }
})

🎨 UI设计详解

卡片布局结构

┌─────────────────────────────┐
│  预览图 (200px高度)          │
│  ┌───────────────┐          │
│  │ SPU标签(左上)  │          │
│  └───────────────┘          │
├─────────────────────────────┤
│ 【店铺标签】【场景标签】      │
│                             │
│ 作者:xxx                   │
│ 文件:xxx.zip               │
│ 时间:2025-10-17 12:00      │
│                             │
│ ─────────────────────────  │
│ 📥 25    ❤️ 10             │
│ ─────────────────────────  │
│                             │
│ [❤️] [📥 下载]              │
└─────────────────────────────┘

配色方案

店铺标签

  • 亮色模式:蓝色背景 (#DBEAFE) + 蓝色文字 (#1D4ED8)
  • 暗色模式:深蓝背景 (blue-900/30) + 浅蓝文字 (#93C5FD)

场景类别标签

  • 亮色模式:绿色背景 (#D1FAE5) + 绿色文字 (#047857)
  • 暗色模式:深绿背景 (green-900/30) + 浅绿文字 (#6EE7B7)

点赞按钮

  • 未点赞:灰色背景,空心图标
  • 已点赞:红色背景 (#EF4444),实心图标

💡 功能特性

点赞功能

1. 防重复点赞

  • 数据库层面:@@unique([materialId, userId])
  • 应用层面:查询后再执行操作

2. 状态同步

  • 点赞后自动刷新列表
  • 实时更新点赞数量和状态
  • UI即时反馈

3. 视觉反馈

// 已点赞
className="bg-red-500 text-white hover:bg-red-600"
fill="currentColor"  // 实心

// 未点赞
className="bg-gray-100 text-gray-700 hover:bg-gray-200"
fill="none"  // 空心

下载统计

1. 自动计数

  • 每次成功下载文件前计数 +1
  • 使用数据库increment操作确保原子性
  • 不受前端刷新影响

2. 实时显示

  • 下载后立即刷新列表
  • 显示更新后的下载次数

📱 响应式设计

网格布局

  • Mobile (sm):1列
  • Tablet (lg):3列
  • Desktop (xl):4列

卡片尺寸

  • 预览图高度:200px
  • 卡片宽度:自适应 (grid布局)
  • 间距:gap-6 (1.5rem)

🚀 用户交互流程

点赞流程

用户点击点赞按钮
    ↓
发送POST请求到 /api/materials/like
    ↓
服务器检查点赞状态
    ↓
├─ 未点赞 → 创建记录 + likeCount++
└─ 已点赞 → 删除记录 + likeCount--
    ↓
返回新状态
    ↓
前端刷新列表
    ↓
UI更新(图标填充、颜色、数量)

下载流程

用户点击下载按钮
    ↓
发送GET请求到 /api/materials/download
    ↓
服务器 downloadCount++
    ↓
读取文件并返回
    ↓
浏览器下载文件
    ↓
前端刷新列表(显示新的下载次数)

🎯 用户体验提升

Before vs After

功能 之前 现在
信息显示 基本信息 完整信息(SPU、店铺、场景、文件名)
统计数据 无 下载次数、点赞次数
互动功能 仅下载 下载 + 点赞
视觉设计 简单列表 彩色标签、图标、分层布局
用户反馈 下载后无变化 实时更新统计数据

数据洞察

  • ✅ 了解哪些素材最受欢迎(点赞数)
  • ✅ 了解哪些素材使用最多(下载数)
  • ✅ 用户可以收藏喜欢的素材(点赞)
  • ✅ 提供数据支持运营决策

🔧 部署步骤

1. 数据库迁移

ssh root@192.168.58.20
cd /mnt/tank/apps/youyidian-3d

# 运行数据库迁移
docker compose exec app npx prisma db push

迁移内容:

  • 添加 downloadCount 字段(默认0)
  • 添加 likeCount 字段(默认0)
  • 创建 material_likes 表
  • 创建索引

2. 重新部署代码

# 本地打包
cd /Users/lanmu/Desktop/gongxiangp2
./update-deploy.sh

或手动部署:

# 打包
tar -czf update.tar.gz --exclude='node_modules' --exclude='.next' .

# 上传
scp update.tar.gz root@192.168.58.20:/mnt/tank/apps/youyidian-3d/

# 部署
ssh root@192.168.58.20
cd /mnt/tank/apps/youyidian-3d
tar -xzf update.tar.gz
docker compose down
docker compose up -d --build

3. 初始化现有数据(可选)

如果有旧数据,下载和点赞次数会默认为0。可以手动初始化:

docker compose exec -T app npx prisma db execute --schema=/app/prisma/schema.prisma --stdin <<< "
-- 所有现有素材设置默认值
UPDATE materials 
SET \"downloadCount\" = 0, \"likeCount\" = 0 
WHERE \"downloadCount\" IS NULL OR \"likeCount\" IS NULL;
"

✅ 测试清单

功能测试

  • 查看首页,卡片显示完整信息
  • 点击点赞按钮,按钮变红
  • 再次点击,取消点赞,按钮变灰
  • 点赞次数实时更新
  • 下载素材,下载次数 +1
  • 刷新页面,点赞状态保持
  • 多个用户对同一素材点赞,计数正确

UI测试

  • 标签颜色正确显示
  • SPU标签在图片左上角
  • 图标正常显示
  • 黑暗模式下样式正常
  • 响应式布局正常

边界测试

  • 未登录用户点赞(应提示登录)
  • 重复点赞(应正常切换)
  • 大量点赞/下载(性能正常)
  • 网络异常(显示错误提示)

📊 数据示例

热门素材排行

按点赞数排序:

SELECT "productModel", "categoryName", "likeCount" 
FROM materials 
ORDER BY "likeCount" DESC 
LIMIT 10;

按下载数排序:

SELECT "productModel", "categoryName", "downloadCount" 
FROM materials 
ORDER BY "downloadCount" DESC 
LIMIT 10;

🎉 效果展示

卡片信息完整度

✅ 之前:仅显示基本信息
✅ 现在:

  • SPU标签(图片上)
  • 店铺标签(蓝色)
  • 场景类别标签(绿色)
  • 作者信息
  • 文件名
  • 创建时间
  • 下载次数(带图标)
  • 点赞次数(带图标)
  • 点赞按钮(可交互)
  • 下载按钮(带图标)

功能完成!准备部署! 🚀