增加推销模式

This commit is contained in:
cyh666666
2026-03-06 17:30:50 +08:00
parent 3b0e397714
commit 7b5801a72b
39 changed files with 9831 additions and 34 deletions

View File

@@ -0,0 +1,373 @@
# 商城推销模式功能需求文档
## 一、功能概述
本文档描述商城消费者端的推销模式功能,包含以下三大模块:
1. **分享免单系统** - 用户分享商品,达成条件后免单
2. **会员等级系统** - 用户等级享受不同优惠价格
3. **经销点返利系统** - 经销点销售返利
---
## 二、分享免单系统
### 2.1 功能描述
用户购买商品后可分享商品链接给其他用户二级用户。当二级用户通过分享链接购买该商品累计达到指定数量默认4件原用户可获得免单奖励免单金额存入账户余额。
### 2.2 业务流程
```
用户A购买商品 → 生成分享链接 → 分享给用户B/C/D
二级用户通过链接购买
累计购买数量达标4件
用户A获得免单奖励
奖励金额存入余额
商家微信返现后清零余额
```
### 2.3 数据库设计
#### 2.3.1 分享记录表 ml_share_records
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| user_id | UUID | 分享用户ID |
| product_id | UUID | 商品ID |
| order_id | UUID | 关联订单ID |
| share_code | VARCHAR(20) | 分享码(唯一) |
| required_count | INT | 需要的购买数量默认4 |
| current_count | INT | 当前已购买数量 |
| status | INT | 状态0-进行中1-已完成2-已失效 |
| reward_amount | DECIMAL(10,2) | 奖励金额 |
| created_at | TIMESTAMPTZ | 创建时间 |
| completed_at | TIMESTAMPTZ | 完成时间 |
#### 2.3.2 二级购买记录表 ml_secondary_purchases
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| share_record_id | UUID | 关联分享记录ID |
| buyer_id | UUID | 购买用户ID |
| order_id | UUID | 订单ID |
| quantity | INT | 购买数量 |
| created_at | TIMESTAMPTZ | 创建时间 |
#### 2.3.3 免单奖励记录表 ml_free_order_rewards
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| user_id | UUID | 获得奖励的用户ID |
| share_record_id | UUID | 关联分享记录ID |
| amount | DECIMAL(10,2) | 奖励金额 |
| status | INT | 状态0-待处理1-已发放2-已清零 |
| balance_before | DECIMAL(10,2) | 发放前余额 |
| balance_after | DECIMAL(10,2) | 发放后余额 |
| cleared_at | TIMESTAMPTZ | 清零时间 |
| cleared_by | UUID | 清零操作人 |
| created_at | TIMESTAMPTZ | 创建时间 |
### 2.4 API 接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/share/create | POST | 创建分享记录,生成分享码 |
| /api/share/info | GET | 获取分享详情和进度 |
| /api/share/validate | GET | 验证分享码有效性 |
| /api/share/my-records | GET | 获取我的分享记录列表 |
| /api/share/rewards | GET | 获取我的免单奖励记录 |
| /api/admin/clear-balance | POST | 商家清零用户余额(后台) |
### 2.5 前端页面
#### 2.5.1 分享弹窗(订单详情页)
- 显示分享链接/二维码
- 显示当前进度X/4
- 分享按钮(微信好友、朋友圈)
#### 2.5.2 我的分享页
- 分享记录列表
- 每条记录显示:商品信息、进度、状态
- 邀请好友按钮
#### 2.5.3 我的余额页
- 余额显示
- 免单奖励记录
- 提现说明(联系商家微信)
---
## 三、会员等级系统
### 3.1 功能描述
商家可设置多个会员等级,每个等级对应不同的优惠折扣。用户可通过以下方式升级:
1. 商家手动设置等级
2. 累计消费金额自动升级
### 3.2 等级设置
| 等级 | 名称 | 升级条件 | 折扣 |
|------|------|---------|------|
| 0 | 普通会员 | 注册即可 | 无折扣 |
| 1 | 铜牌会员 | 累计消费500元 | 98折 |
| 2 | 银牌会员 | 累计消费2000元 | 95折 |
| 3 | 金牌会员 | 累计消费5000元 | 92折 |
| 4 | 钻石会员 | 累计消费10000元 | 88折 |
| 5 | VIP会员 | 商家手动设置 | 85折 |
### 3.3 数据库设计
#### 3.3.1 会员等级配置表 ml_member_levels
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | INT | 等级ID |
| name | VARCHAR(50) | 等级名称 |
| min_amount | DECIMAL(10,2) | 升级最低消费金额 |
| discount | DECIMAL(5,4) | 折扣率0.85表示85折 |
| icon | VARCHAR(200) | 等级图标 |
| description | TEXT | 等级说明 |
| sort_order | INT | 排序 |
| status | INT | 状态0-禁用1-启用 |
#### 3.3.2 用户会员信息扩展ml_user_profiles 扩展字段)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| member_level | INT | 当前会员等级 |
| total_spent | DECIMAL(10,2) | 累计消费金额 |
| level_updated_at | TIMESTAMPTZ | 等级更新时间 |
| manual_level | BOOLEAN | 是否手动设置等级 |
| manual_level_by | UUID | 手动设置操作人 |
#### 3.3.3 会员等级变更记录表 ml_member_level_logs
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| user_id | UUID | 用户ID |
| old_level | INT | 原等级 |
| new_level | INT | 新等级 |
| reason | VARCHAR(200) | 变更原因 |
| operator_id | UUID | 操作人(自动则为空) |
| created_at | TIMESTAMPTZ | 创建时间 |
### 3.4 API 接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/member/levels | GET | 获取会员等级列表 |
| /api/member/my-info | GET | 获取我的会员信息 |
| /api/member/upgrade-check | POST | 检查并升级会员等级 |
| /api/admin/set-member-level | POST | 商家手动设置用户等级 |
### 3.5 前端页面
#### 3.5.1 会员中心页
- 当前等级显示
- 等级进度条
- 等级权益说明
- 升级攻略
#### 3.5.2 商品详情页
- 显示会员价
- 显示折扣信息
---
## 四、经销点返利系统
### 4.1 功能描述
商家可创建多个经销点,每个经销点有独立的推广码。经销点通过推广码产生的订单可获得返利,返利按单数计算。
### 4.2 返利规则
| 单数范围 | 返利金额/单 |
|---------|------------|
| 1-10单 | 2元/单 |
| 11-50单 | 3元/单 |
| 51-100单 | 4元/单 |
| 100单以上 | 5元/单 |
### 4.3 数据库设计
#### 4.3.1 经销点表 ml_distribution_points
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| name | VARCHAR(100) | 经销点名称 |
| contact_name | VARCHAR(50) | 联系人 |
| contact_phone | VARCHAR(20) | 联系电话 |
| address | VARCHAR(200) | 地址 |
| invite_code | VARCHAR(20) | 邀请码(唯一) |
| owner_id | UUID | 负责人用户ID |
| status | INT | 状态0-禁用1-启用 |
| total_orders | INT | 累计订单数 |
| total_rebate | DECIMAL(10,2) | 累计返利 |
| balance | DECIMAL(10,2) | 可提现余额 |
| created_at | TIMESTAMPTZ | 创建时间 |
#### 4.3.2 经销点订单关联表 ml_distribution_orders
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| distribution_id | UUID | 经销点ID |
| order_id | UUID | 订单ID |
| user_id | UUID | 下单用户ID |
| order_amount | DECIMAL(10,2) | 订单金额 |
| rebate_amount | DECIMAL(10,2) | 返利金额 |
| status | INT | 状态0-待结算1-已结算 |
| settled_at | TIMESTAMPTZ | 结算时间 |
| created_at | TIMESTAMPTZ | 创建时间 |
#### 4.3.3 返利配置表 ml_rebate_config
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| min_orders | INT | 最小单数 |
| max_orders | INT | 最大单数 |
| rebate_per_order | DECIMAL(10,2) | 每单返利金额 |
| status | INT | 状态 |
#### 4.3.4 返利提现记录表 ml_rebate_withdrawals
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| distribution_id | UUID | 经销点ID |
| amount | DECIMAL(10,2) | 提现金额 |
| status | INT | 状态0-待处理1-已完成2-已拒绝 |
| handled_by | UUID | 处理人 |
| handled_at | TIMESTAMPTZ | 处理时间 |
| created_at | TIMESTAMPTZ | 创建时间 |
### 4.4 API 接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/distribution/info | GET | 获取经销点信息 |
| /api/distribution/orders | GET | 获取经销点订单列表 |
| /api/distribution/rebate-summary | GET | 获取返利统计 |
| /api/distribution/withdraw | POST | 申请提现 |
| /api/admin/distributions | GET | 获取经销点列表(后台) |
| /api/admin/create-distribution | POST | 创建经销点(后台) |
| /api/admin/settle-rebate | POST | 结算返利(后台) |
### 4.5 前端页面
#### 4.5.1 经销点中心页(经销点负责人)
- 经销点信息
- 今日/本月订单数
- 累计返利
- 可提现余额
- 申请提现按钮
#### 4.5.2 经销点订单页
- 订单列表
- 筛选(日期、状态)
- 每单返利金额显示
---
## 五、用户余额系统
### 5.1 数据库设计
#### 5.1.1 用户余额表 ml_user_balance
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| user_id | UUID | 用户ID |
| balance | DECIMAL(10,2) | 当前余额 |
| frozen_balance | DECIMAL(10,2) | 冻结余额 |
| total_earned | DECIMAL(10,2) | 累计获得 |
| total_withdrawn | DECIMAL(10,2) | 累计提现 |
| updated_at | TIMESTAMPTZ | 更新时间 |
#### 5.1.2 余额变动记录表 ml_balance_records
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | UUID | 主键 |
| user_id | UUID | 用户ID |
| type | VARCHAR(50) | 类型free_order-免单rebate-返利withdraw-提现clear-清零 |
| amount | DECIMAL(10,2) | 变动金额(正数增加,负数减少) |
| balance_before | DECIMAL(10,2) | 变动前余额 |
| balance_after | DECIMAL(10,2) | 变动后余额 |
| related_id | UUID | 关联ID |
| description | VARCHAR(200) | 描述 |
| operator_id | UUID | 操作人(系统操作为空) |
| created_at | TIMESTAMPTZ | 创建时间 |
---
## 六、前端页面汇总
### 6.1 消费者端新增页面
| 页面 | 路径 | 说明 |
|------|------|------|
| 我的分享 | /pages/mall/consumer/share/my-shares | 分享记录列表 |
| 分享详情 | /pages/mall/consumer/share/detail | 分享进度详情 |
| 我的余额 | /pages/mall/consumer/balance/index | 余额和奖励记录 |
| 会员中心 | /pages/mall/consumer/member/index | 会员等级信息 |
| 会员权益 | /pages/mall/consumer/member/benefits | 等级权益说明 |
### 6.2 经销点端页面(可选独立入口)
| 页面 | 路径 | 说明 |
|------|------|------|
| 经销点中心 | /pages/distribution/index | 经销点首页 |
| 经销点订单 | /pages/distribution/orders | 订单列表 |
| 返利记录 | /pages/distribution/rebates | 返利记录 |
| 提现申请 | /pages/distribution/withdraw | 提现页面 |
---
## 七、开发优先级
### 第一阶段(核心功能)
1. 用户余额系统
2. 分享免单系统
3. 会员等级系统
### 第二阶段(扩展功能)
1. 经销点返利系统
2. 后台管理功能
3. 数据统计报表
---
## 八、注意事项
1. **安全性**
- 分享码唯一且不可预测
- 防止刷单作弊(同一用户多次购买不计入)
- 余额变动需有完整记录
2. **性能**
- 高频查询使用缓存
- 大数据量分页处理
3. **合规性**
- 返利模式需符合当地法规
- 用户协议需明确说明规则
4. **扩展性**
- 返利规则可配置
- 会员等级可扩展
- 支持多种分享渠道

View File

@@ -0,0 +1,629 @@
# 商城消费者端 - 积分与评价功能完善需求文档
## 一、项目概述
### 1.1 项目背景
本项目为商城消费者端应用,当前积分和评价功能已有基础实现,但存在部分功能缺失和体验优化空间。本文档旨在明确积分和评价功能的完善需求。
### 1.2 当前实现状态
| 功能模块 | 当前状态 | 说明 |
|---------|---------|------|
| 消费者端积分页面 | ✅ 已完成 | 显示积分余额、积分明细列表 |
| 积分兑换商城 | ❌ 未实现 | 点击"积分兑换"提示"开发中" |
| 消费者端商品评价 | ✅ 已完成 | 支持评分、文字、图片、匿名评价 |
| 消费者端店铺评价 | ✅ 已完成 | 支持描述/物流/服务三维评分 |
| 商家端评价管理 | ✅ 已完成 | 支持查看、筛选、回复评价 |
---
## 二、积分功能完善需求
### 2.1 功能架构图
```
┌─────────────────────────────────────────────────────────────┐
│ 积分系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 积分获取 │ │ 积分使用 │ │ 积分管理 │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ • 注册赠送 │ │ • 积分兑换 │ │ • 积分查询 │ │
│ │ • 每日签到 │ │ • 订单抵扣 │ │ • 明细记录 │ │
│ │ • 购物奖励 │ │ • 积分抽奖 │ │ • 过期处理 │ │
│ │ • 评价奖励 │ │ │ │ • 积分规则 │ │
│ │ • 邀请好友 │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 2.2 前端功能需求
#### 2.2.1 积分首页优化
**页面路径**: `pages/mall/consumer/points/index.uvue`
**需求描述**:
1. **积分概览卡片**
- 显示当前可用积分
- 显示即将过期积分30天内
- 显示历史累计积分
- 积分趋势图表近7天/30天
2. **快捷入口**
- 签到入口(带签到状态提示)
- 积分兑换入口
- 积分规则说明
3. **积分明细列表**
- 支持按类型筛选(获取/消费/过期)
- 支持按时间范围筛选
- 下拉刷新、上拉加载更多
#### 2.2.2 每日签到功能(新增)
**页面路径**: `pages/mall/consumer/points/signin.uvue`
**需求描述**:
1. **签到日历**
- 显示当月签到记录
- 连续签到天数统计
- 签到奖励预览
2. **签到奖励规则**
- 每日签到:+5积分
- 连续签到7天额外+20积分
- 连续签到30天额外+100积分
3. **签到弹窗**
- 签到成功动画
- 显示获得积分
- 连续签到进度提示
#### 2.2.3 积分兑换商城(新增)
**页面路径**: `pages/mall/consumer/points/exchange.uvue`
**需求描述**:
1. **兑换商品列表**
- 优惠券兑换
- 实物商品兑换
- 虚拟商品兑换(会员权益等)
2. **商品详情**
- 商品图片、名称、描述
- 兑换所需积分
- 库存状态
- 兑换记录
3. **兑换流程**
- 积分不足提示
- 确认兑换弹窗
- 兑换成功/失败反馈
- 物流跟踪(实物商品)
#### 2.2.4 积分规则页面(新增)
**页面路径**: `pages/mall/consumer/points/rules.uvue`
**需求描述**:
- 积分获取规则说明
- 积分使用规则说明
- 积分有效期说明
- 常见问题FAQ
### 2.3 后端API需求
#### 2.3.1 新增API接口
| 接口名称 | 请求方法 | 接口路径 | 说明 |
|---------|---------|---------|------|
| 签到 | POST | `/api/points/signin` | 用户每日签到 |
| 获取签到记录 | GET | `/api/points/signin-records` | 获取月度签到记录 |
| 获取兑换商品列表 | GET | `/api/points/exchange-products` | 获取可兑换商品 |
| 积分兑换 | POST | `/api/points/exchange` | 兑换商品 |
| 获取兑换记录 | GET | `/api/points/exchange-records` | 获取兑换历史 |
| 积分过期提醒 | GET | `/api/points/expiring` | 获取即将过期积分 |
#### 2.3.2 接口详细设计
**签到接口**
```typescript
// 请求
POST /api/points/signin
Response: {
success: boolean
points: number // 本次获得积分
continuous_days: number // 连续签到天数
bonus_points: number // 额外奖励积分
total_points: number // 当前总积分
}
```
**积分兑换接口**
```typescript
// 请求
POST /api/points/exchange
Body: {
product_id: string // 兑换商品ID
quantity: number // 兑换数量
address_id?: string // 收货地址(实物商品)
}
Response: {
success: boolean
exchange_id: string // 兑换记录ID
points_used: number // 消耗积分
remaining_points: number // 剩余积分
}
```
### 2.4 数据库设计
#### 2.4.1 现有表结构
**用户积分表 (ml_user_points)**
```sql
CREATE TABLE IF NOT EXISTS ml_user_points (
user_id UUID NOT NULL PRIMARY KEY REFERENCES auth.users(id),
points INT DEFAULT 0 NOT NULL, -- 当前可用积分
total_earned INT DEFAULT 0, -- 历史累计获得积分
total_used INT DEFAULT 0, -- 历史累计使用积分
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 添加索引
CREATE INDEX idx_user_points_user_id ON ml_user_points(user_id);
```
**积分记录表 (ml_point_records)**
```sql
CREATE TABLE IF NOT EXISTS ml_point_records (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID NOT NULL REFERENCES auth.users(id),
points INT NOT NULL, -- 变动积分 (正/负)
balance INT NOT NULL, -- 变动后余额
type VARCHAR(50) NOT NULL, -- 类型
reference_id UUID, -- 关联ID订单ID/兑换ID等
description TEXT,
expires_at TIMESTAMPTZ, -- 过期时间
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 添加索引
CREATE INDEX idx_point_records_user_id ON ml_point_records(user_id);
CREATE INDEX idx_point_records_type ON ml_point_records(type);
CREATE INDEX idx_point_records_created_at ON ml_point_records(created_at);
```
#### 2.4.2 新增表结构
**签到记录表 (ml_signin_records)**
```sql
CREATE TABLE IF NOT EXISTS ml_signin_records (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID NOT NULL REFERENCES auth.users(id),
signin_date DATE NOT NULL, -- 签到日期
points_earned INT DEFAULT 0, -- 获得积分
bonus_points INT DEFAULT 0, -- 奖励积分
continuous_days INT DEFAULT 1, -- 当次连续签到天数
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(user_id, signin_date) -- 每用户每天只能签到一次
);
-- 添加索引
CREATE INDEX idx_signin_records_user_id ON ml_signin_records(user_id);
CREATE INDEX idx_signin_records_date ON ml_signin_records(signin_date);
```
**积分兑换商品表 (ml_point_products)**
```sql
CREATE TABLE IF NOT EXISTS ml_point_products (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name VARCHAR(200) NOT NULL, -- 商品名称
description TEXT, -- 商品描述
image_url VARCHAR(500), -- 商品图片
product_type VARCHAR(50) NOT NULL, -- 类型: coupon/physical/virtual
points_required INT NOT NULL, -- 所需积分
original_price DECIMAL(10,2), -- 原价(展示用)
stock INT DEFAULT 0, -- 库存
status INT DEFAULT 1, -- 状态: 0=下架, 1=上架
sort_order INT DEFAULT 0, -- 排序
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
```
**积分兑换记录表 (ml_point_exchanges)**
```sql
CREATE TABLE IF NOT EXISTS ml_point_exchanges (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID NOT NULL REFERENCES auth.users(id),
product_id UUID NOT NULL REFERENCES ml_point_products(id),
quantity INT DEFAULT 1, -- 兑换数量
points_used INT NOT NULL, -- 消耗积分
status INT DEFAULT 0, -- 状态: 0=待处理, 1=已发货, 2=已完成, 3=已取消
tracking_no VARCHAR(100), -- 物流单号
address_id UUID, -- 收货地址
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
```
**积分规则配置表 (ml_point_rules)**
```sql
CREATE TABLE IF NOT EXISTS ml_point_rules (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
rule_type VARCHAR(50) NOT NULL, -- 规则类型
rule_name VARCHAR(100) NOT NULL, -- 规则名称
points INT NOT NULL, -- 积分值
description TEXT, -- 规则说明
config JSONB, -- 扩展配置
status INT DEFAULT 1, -- 状态
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 初始化规则数据
INSERT INTO ml_point_rules (rule_type, rule_name, points, description) VALUES
('register', '注册赠送', 100, '新用户注册赠送积分'),
('signin_daily', '每日签到', 5, '每日签到获得积分'),
('signin_continuous_7', '连续签到7天奖励', 20, '连续签到7天额外奖励'),
('signin_continuous_30', '连续签到30天奖励', 100, '连续签到30天额外奖励'),
('shopping', '购物奖励', 1, '每消费1元获得1积分'),
('review', '评价奖励', 10, '完成商品评价获得积分'),
('review_with_image', '带图评价奖励', 20, '带图评价额外奖励');
```
---
## 三、评价功能完善需求
### 3.1 功能架构图
```
┌─────────────────────────────────────────────────────────────┐
│ 评价系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 评价提交 │ │ 评价展示 │ │ 评价管理 │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ • 商品评价 │ │ • 商品详情 │ │ • 商家回复 │ │
│ │ • 店铺评价 │ │ • 评价列表 │ │ • 评价统计 │ │
│ │ • 配送评价 │ │ • 评分统计 │ │ • 违规处理 │ │
│ │ • 追加评价 │ │ • 筛选排序 │ │ • 评价审核 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 3.2 前端功能需求
#### 3.2.1 评价页面优化
**页面路径**: `pages/mall/consumer/review.uvue`
**需求描述**:
1. **评价表单优化**
- 支持视频上传限1个30秒内
- 支持图片拖拽排序
- 添加评价标签选择(质量好/物流快/服务好等)
- 添加商品满意度维度(质量/包装/性价比)
2. **追加评价功能**
- 订单完成后7天内可追加评价
- 追加评价入口(订单详情页)
- 追加评价表单
3. **评价预览**
- 提交前预览评价效果
- 匿名评价预览效果
#### 3.2.2 商品评价列表(新增)
**页面路径**: `pages/mall/consumer/product-reviews.uvue`
**需求描述**:
1. **评价统计概览**
- 好评率百分比
- 评分分布图1-5星
- 标签云(高频评价关键词)
2. **评价列表**
- 支持按评分筛选
- 支持按时间/点赞数排序
- 支持只看有图/有视频评价
- 评价点赞功能
- 评价举报功能
3. **评价详情**
- 点击评价查看详情
- 查看商家回复
- 查看追加评价
#### 3.2.3 我的评价页面(新增)
**页面路径**: `pages/mall/consumer/my-reviews.uvue`
**需求描述**:
1. **评价列表**
- 显示已评价商品
- 显示待评价商品
- 显示可追加评价商品
2. **评价操作**
- 编辑评价24小时内
- 删除评价
- 追加评价
#### 3.2.4 配送员评价(完善)
**页面路径**: `pages/mall/delivery/ratings.uvue`
**需求描述**:
- 对接真实API当前使用Mock数据
- 配送员评分统计
- 配送评价列表
### 3.3 后端API需求
#### 3.3.1 新增API接口
| 接口名称 | 请求方法 | 接口路径 | 说明 |
|---------|---------|---------|------|
| 获取商品评价列表 | GET | `/api/reviews/product/:productId` | 分页获取商品评价 |
| 获取评价统计 | GET | `/api/reviews/stats/:productId` | 获取商品评分统计 |
| 追加评价 | POST | `/api/reviews/append` | 追加评价内容 |
| 评价点赞 | POST | `/api/reviews/like/:id` | 点赞评价 |
| 获取我的评价 | GET | `/api/reviews/my` | 获取用户评价列表 |
| 编辑评价 | PUT | `/api/reviews/:id` | 编辑评价24小时内 |
| 删除评价 | DELETE | `/api/reviews/:id` | 删除评价 |
| 评价举报 | POST | `/api/reviews/report/:id` | 举报违规评价 |
#### 3.3.2 接口详细设计
**获取商品评价列表**
```typescript
GET /api/reviews/product/:productId?page=1&limit=10&rating=5&has_image=true
Response: {
total: number
page: number
limit: number
data: [{
id: string
user_name: string
user_avatar: string
rating: number
content: string
images: string[]
videos: string[]
tags: string[]
like_count: number
is_liked: boolean
reply: {
content: string
created_at: string
}
append_content?: {
content: string
created_at: string
}
created_at: string
}]
}
```
**获取评价统计**
```typescript
GET /api/reviews/stats/:productId
Response: {
total_count: number
avg_rating: number
good_rate: number // 好评率
rating_distribution: { // 评分分布
1: number
2: number
3: number
4: number
5: number
}
tags: [{ // 高频标签
name: string
count: number
}]
}
```
### 3.4 数据库设计
#### 3.4.1 现有表结构优化
**商品评价表 (ml_product_reviews)**
```sql
-- 添加新字段
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS videos JSONB DEFAULT '[]';
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS tags JSONB DEFAULT '[]';
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS like_count INT DEFAULT 0;
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS is_edited BOOLEAN DEFAULT false;
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS append_content TEXT;
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS append_at TIMESTAMPTZ;
ALTER TABLE ml_product_reviews ADD COLUMN IF NOT EXISTS append_images JSONB DEFAULT '[]';
```
#### 3.4.2 新增表结构
**评价点赞表 (ml_review_likes)**
```sql
CREATE TABLE IF NOT EXISTS ml_review_likes (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
review_id UUID NOT NULL REFERENCES ml_product_reviews(id),
user_id UUID NOT NULL REFERENCES auth.users(id),
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(review_id, user_id) -- 每用户对每条评价只能点赞一次
);
CREATE INDEX idx_review_likes_review_id ON ml_review_likes(review_id);
```
**评价举报表 (ml_review_reports)**
```sql
CREATE TABLE IF NOT EXISTS ml_review_reports (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
review_id UUID NOT NULL REFERENCES ml_product_reviews(id),
user_id UUID NOT NULL REFERENCES auth.users(id),
reason VARCHAR(200) NOT NULL, -- 举报原因
description TEXT, -- 详细说明
status INT DEFAULT 0, -- 状态: 0=待处理, 1=已处理, 2=已驳回
handle_result TEXT, -- 处理结果
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
```
**配送员评价表 (ml_delivery_ratings)**
```sql
CREATE TABLE IF NOT EXISTS ml_delivery_ratings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
order_id UUID NOT NULL REFERENCES ml_orders(id),
delivery_user_id UUID NOT NULL, -- 配送员ID
user_id UUID NOT NULL REFERENCES auth.users(id),
rating INT CHECK (rating >= 1 AND rating <= 5),
content TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(order_id) -- 每订单只能评价一次
);
```
---
## 四、开发优先级
### 4.1 第一阶段(高优先级)
| 序号 | 功能 | 模块 | 预估工时 |
|-----|------|------|---------|
| 1 | 每日签到功能 | 积分 | 2天 |
| 2 | 积分兑换商城 | 积分 | 3天 |
| 3 | 商品评价列表展示 | 评价 | 2天 |
| 4 | 我的评价页面 | 评价 | 1天 |
### 4.2 第二阶段(中优先级)
| 序号 | 功能 | 模块 | 预估工时 |
|-----|------|------|---------|
| 1 | 积分规则配置 | 积分 | 1天 |
| 2 | 追加评价功能 | 评价 | 1天 |
| 3 | 评价点赞功能 | 评价 | 0.5天 |
| 4 | 配送员评价对接 | 评价 | 1天 |
### 4.3 第三阶段(低优先级)
| 序号 | 功能 | 模块 | 预估工时 |
|-----|------|------|---------|
| 1 | 积分过期提醒 | 积分 | 0.5天 |
| 2 | 评价视频上传 | 评价 | 1天 |
| 3 | 评价举报功能 | 评价 | 0.5天 |
| 4 | 管理端完善 | 综合 | 2天 |
---
## 五、技术要点
### 5.1 积分系统技术要点
1. **积分并发安全**
- 使用数据库事务保证积分变动原子性
- 添加乐观锁防止超扣
2. **积分过期处理**
- 定时任务每日检查过期积分
- 过期前7天推送提醒通知
3. **签到防刷**
- 限制每日只能签到一次
- 记录签到IP检测异常行为
### 5.2 评价系统技术要点
1. **评价数据统计**
- 使用触发器自动更新商品评分统计
- 缓存热门商品评价数据
2. **图片/视频处理**
- 图片压缩后上传
- 视频转码处理
- CDN加速访问
3. **敏感词过滤**
- 评价内容敏感词检测
- 自动替换或人工审核
---
## 六、测试要点
### 6.1 积分功能测试
- [ ] 签到功能:每日签到、连续签到奖励
- [ ] 积分兑换:积分不足、库存不足、兑换成功
- [ ] 积分过期:自动过期、过期提醒
- [ ] 并发测试:同时兑换、同时签到
### 6.2 评价功能测试
- [ ] 评价提交:文字、图片、视频、匿名
- [ ] 评价展示:列表、筛选、排序
- [ ] 评价操作:编辑、删除、追加、点赞
- [ ] 边界测试:空内容、超长内容、敏感词
---
## 七、附录
### 7.1 相关文件路径
```
pages/
├── mall/
│ └── consumer/
│ ├── points/
│ │ ├── index.uvue # 积分首页(已有)
│ │ ├── signin.uvue # 签到页面(新增)
│ │ ├── exchange.uvue # 兑换商城(新增)
│ │ └── rules.uvue # 积分规则(新增)
│ ├── review.uvue # 评价页面(已有)
│ ├── product-reviews.uvue # 商品评价列表(新增)
│ └── my-reviews.uvue # 我的评价(新增)
└── user/
└── login.uvue # 登录页面
utils/
└── supabaseService.uts # API服务
types/
└── mall-types.uts # 类型定义
doc_mall/
└── consumer/
└── sql/
├── 01_wallet_and_points.sql
└── add_reviews_tables.sql
```
### 7.2 参考文档
- [Supabase 官方文档](https://supabase.com/docs)
- [uni-app x 开发文档](https://doc.dcloud.net.cn/uni-app-x/)
- [UTS 语法指南](https://doc.dcloud.net.cn/uni-app-x/uts/)
---
**文档版本**: v1.0
**创建日期**: 2026-03-05
**最后更新**: 2026-03-05