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

421 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 素材卡片增强功能说明 v2.2
## 📅 更新日期:2025-10-17
---
## ✨ 新增功能概览
### 1. 📊 下载次数统计
- **自动计数**:每次下载自动增加计数
- **实时显示**:卡片上显示下载次数图标和数字
- **数据库持久化**:所有统计数据保存在数据库
### 2. ❤️ 点赞功能
- **一键点赞**:点击红心按钮即可点赞
- **取消点赞**:再次点击可取消点赞
- **唯一性**:每个用户对每个素材只能点赞一次
- **实时反馈**:点赞后立即更新UI状态
### 3. 🎨 卡片信息优化
- **SPU标签**:图片上叠加显示SPU
- **彩色标签**:店铺(蓝色)和场景类别(绿色)标签
- **文件信息**:显示完整的压缩包文件名
- **统计图标**:下载和点赞次数带图标显示
- **视觉优化**:更现代的布局和配色
---
## 🗄️ 数据库变更
### Material模型新增字段
```prisma
model Material {
// ... 原有字段 ...
downloadCount Int @default(0) // 下载次数
likeCount Int @default(0) // 点赞次数
likes MaterialLike[] // 点赞关系
@@index([downloadCount])
@@index([likeCount])
}
```
### 新增MaterialLike模型
```prisma
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模型更新
```prisma
model User {
// ... 原有字段 ...
materials Material[]
likes MaterialLike[] // 新增点赞关系
}
```
---
## 🔌 API更新
### 1. GET /api/materials
**更新内容**:返回数据包含点赞状态
**响应数据**:
```json
[
{
"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**:处理点赞/取消点赞
**请求体**:
```json
{
"materialId": "uuid"
}
```
**响应**:
```json
{
"liked": true, // true=点赞成功,false=取消点赞
"message": "点赞成功"
}
```
**功能**:
- 检查用户是否已点赞
- 如果未点赞:创建点赞记录,likeCount +1
- 如果已点赞:删除点赞记录,likeCount -1
- 使用唯一索引确保数据一致性
### 3. GET /api/materials/download
**更新内容**:自动增加下载次数
**新增逻辑**:
```typescript
// 增加下载次数
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. 视觉反馈
```typescript
// 已点赞
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. 数据库迁移
```bash
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. 重新部署代码
```bash
# 本地打包
cd /Users/lanmu/Desktop/gongxiangp2
./update-deploy.sh
```
或手动部署:
```bash
# 打包
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。可以手动初始化:
```bash
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标签在图片左上角
- [ ] 图标正常显示
- [ ] 黑暗模式下样式正常
- [ ] 响应式布局正常
### 边界测试
- [ ] 未登录用户点赞(应提示登录)
- [ ] 重复点赞(应正常切换)
- [ ] 大量点赞/下载(性能正常)
- [ ] 网络异常(显示错误提示)
---
## 📊 数据示例
### 热门素材排行
**按点赞数排序**:
```sql
SELECT "productModel", "categoryName", "likeCount"
FROM materials
ORDER BY "likeCount" DESC
LIMIT 10;
```
**按下载数排序**:
```sql
SELECT "productModel", "categoryName", "downloadCount"
FROM materials
ORDER BY "downloadCount" DESC
LIMIT 10;
```
---
## 🎉 效果展示
### 卡片信息完整度
✅ **之前**:仅显示基本信息
✅ **现在**:
- SPU标签(图片上)
- 店铺标签(蓝色)
- 场景类别标签(绿色)
- 作者信息
- 文件名
- 创建时间
- 下载次数(带图标)
- 点赞次数(带图标)
- 点赞按钮(可交互)
- 下载按钮(带图标)
---
**功能完成!准备部署!** 🚀