一、系统概述
小象买菜系统需要实现动态价格展示功能,即根据市场行情、库存情况、促销活动等因素实时调整商品价格,并在用户端实时显示最新价格。
二、技术架构设计
1. 前端实现
- 框架选择:React/Vue.js + TypeScript
- 实时更新:
- 使用WebSocket或SSE(Server-Sent Events)实现实时价格推送
- 轮询机制作为备用方案(如每5秒请求一次)
- 价格展示组件:
```javascript
// React示例
function PriceDisplay({ productId }) {
const [price, setPrice] = useState(null);
useEffect(() => {
const eventSource = new EventSource(`/api/prices/${productId}/stream`);
eventSource.onmessage = (e) => {
setPrice(JSON.parse(e.data).price);
};
return () => eventSource.close();
}, [productId]);
return
¥{price || --}
;
}
```
2. 后端实现
- 技术栈:Spring Boot/Node.js/Django
- 核心组件:
- 价格计算服务:根据规则引擎计算动态价格
- 实时推送服务:WebSocket/SSE服务器
- 价格历史记录:记录价格变动历史
3. 数据库设计
```sql
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
base_price DECIMAL(10,2),
-- 其他产品字段
);
CREATE TABLE price_rules (
id SERIAL PRIMARY KEY,
product_id INTEGER REFERENCES products(id),
rule_type VARCHAR(50), -- 例如: discount, surge
condition JSONB, -- 规则条件
adjustment DECIMAL(10,2), -- 调整值
priority INTEGER, -- 规则优先级
active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE current_prices (
product_id INTEGER PRIMARY KEY REFERENCES products(id),
calculated_price DECIMAL(10,2),
last_updated TIMESTAMP DEFAULT NOW(),
-- 其他元数据
);
```
三、动态价格计算逻辑
1. 价格影响因素
- 基础价格
- 库存水平(库存越少价格可能越高)
- 时间因素(早晚市价格不同)
- 促销活动
- 用户等级/会员状态
- 竞争对手价格(需爬虫或API获取)
2. 规则引擎实现
```java
// Java示例
public class PriceCalculator {
public BigDecimal calculatePrice(Product product, User user, LocalDateTime now) {
BigDecimal basePrice = product.getBasePrice();
// 应用库存调整
BigDecimal inventoryAdjustment = calculateInventoryAdjustment(product.getStock());
// 应用时间调整
BigDecimal timeAdjustment = calculateTimeAdjustment(now);
// 应用促销调整
BigDecimal promotionAdjustment = calculatePromotionAdjustment(product, user);
// 应用会员调整
BigDecimal membershipAdjustment = calculateMembershipAdjustment(user);
return basePrice
.add(inventoryAdjustment)
.add(timeAdjustment)
.add(promotionAdjustment)
.add(membershipAdjustment);
}
private BigDecimal calculateInventoryAdjustment(int stock) {
// 库存越少,价格越高
if (stock < 10) {
return new BigDecimal("2.00"); // 库存紧张加价
} else if (stock > 100) {
return new BigDecimal("-1.50"); // 库存充足降价
}
return BigDecimal.ZERO;
}
// 其他调整方法...
}
```
四、实时更新机制
1. 价格变动触发方式
- 定时任务:每分钟检查所有商品价格是否需要更新
- 事件驱动:
- 库存变动时触发价格重新计算
- 促销活动开始/结束时触发
- 竞争对手价格变动时触发
2. WebSocket实现示例
```javascript
// Node.js WebSocket服务器
const WebSocket = require(ws);
const wss = new WebSocket.Server({ port: 8080 });
// 存储所有连接的客户端
const clients = new Map();
wss.on(connection, (ws) => {
// 识别客户端(如通过查询参数)
const clientId = /* 获取客户端标识 */;
clients.set(clientId, ws);
ws.on(close, () => {
clients.delete(clientId);
});
});
// 价格更新时广播
function broadcastPriceUpdate(productId, newPrice) {
const message = JSON.stringify({
type: price_update,
productId,
price: newPrice,
timestamp: new Date().toISOString()
});
clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
}
```
五、用户端显示优化
1. 价格变动动画:
- 使用CSS过渡效果显示价格变化
- 价格下降显示绿色向下箭头,上升显示红色向上箭头
2. 价格历史:
- 提供价格走势图(最近24小时/7天)
- 显示上次价格变动时间
3. 缓存策略:
- 对不常变动的商品使用短期缓存(1-5分钟)
- 对频繁变动的商品禁用缓存或使用极短缓存
六、测试方案
1. 单元测试:
- 测试价格计算逻辑的各种边界条件
- 测试规则引擎的优先级处理
2. 集成测试:
- 测试WebSocket连接和消息推送
- 测试多客户端同时接收更新
3. 性能测试:
- 模拟1000+商品同时价格变动
- 测试系统在高并发下的响应时间
七、部署与监控
1. 部署方案:
- 使用容器化部署(Docker + Kubernetes)
- 价格计算服务独立部署,可横向扩展
2. 监控指标:
- 价格更新延迟
- WebSocket连接数
- 价格计算服务响应时间
3. 告警设置:
- 价格更新失败告警
- 价格计算服务不可用告警
- 异常价格变动告警
八、扩展功能考虑
1. A/B测试:不同用户群体看到不同价格策略
2. 个性化定价:基于用户历史行为调整价格
3. 预测性定价:使用机器学习预测最佳价格点
通过以上方案,小象买菜系统可以实现高效、准确的动态价格展示功能,提升用户体验和平台运营效率。