一、功能概述
小象买菜系统需要实现动态价格展示功能,即根据市场行情、库存情况、促销活动等因素实时调整商品价格,并在用户端实时显示最新价格。
二、技术架构设计
1. 前端实现
- 框架选择:React/Vue.js + TypeScript
- 实时更新:
- 使用WebSocket建立长连接,接收价格变动通知
- 轮询机制作为备用方案(每5-10秒请求一次)
- 价格展示组件:
```javascript
// React示例
const PriceDisplay = ({productId}) => {
const [price, setPrice] = useState(null);
useEffect(() => {
// 初始化连接
const socket = new WebSocket(wss://your-api/prices);
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if(data.productId === productId) {
setPrice(data.newPrice);
}
};
return () => socket.close();
}, [productId]);
return
{price ? `¥${price.toFixed(2)}` : 加载中...}
;
};
```
2. 后端实现
- 技术栈:Node.js(Express/NestJS) 或 Spring Boot
- 核心组件:
- 价格计算服务:根据规则引擎计算动态价格
- 实时推送服务:通过WebSocket推送价格变动
- 价格历史记录:存储价格变动历史
3. 数据库设计
```sql
-- 商品表
CREATE TABLE products (
id VARCHAR(32) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
base_price DECIMAL(10,2) NOT NULL,
-- 其他商品字段...
);
-- 动态价格表
CREATE TABLE dynamic_prices (
id VARCHAR(32) PRIMARY KEY,
product_id VARCHAR(32) NOT NULL,
current_price DECIMAL(10,2) NOT NULL,
effective_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expire_time TIMESTAMP NULL,
FOREIGN KEY (product_id) REFERENCES products(id)
);
-- 价格变动历史
CREATE TABLE price_history (
id VARCHAR(32) PRIMARY KEY,
product_id VARCHAR(32) NOT NULL,
old_price DECIMAL(10,2) NOT NULL,
new_price DECIMAL(10,2) NOT NULL,
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
change_reason VARCHAR(255),
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
三、动态价格计算逻辑
1. 价格影响因素
- 市场行情:对接第三方价格API或爬取竞品价格
- 库存水平:库存<20%时触发涨价规则
- 促销活动:限时折扣、满减活动
- 用户等级:会员专属价格
- 购买时段:高峰时段/非高峰时段差异化定价
2. 规则引擎实现
```javascript
// 价格计算规则示例
function calculatePrice(product, context) {
let price = product.basePrice;
// 库存影响
if(product.stock < product.lowStockThreshold) {
price *= 1.1; // 库存低时涨价10%
}
// 促销活动
if(context.activePromotions.some(p => p.productId === product.id)) {
price *= 0.9; // 促销时打9折
}
// 会员折扣
if(context.user && context.user.isMember) {
price *= 0.95; // 会员95折
}
return Math.round(price * 100) / 100; // 保留两位小数
}
```
四、实时更新机制
1. 价格变动触发方式
- 定时任务:每晚凌晨更新基准价格
- 事件驱动:
- 库存变动时触发价格重算
- 竞品价格变动时触发价格调整
- 促销活动开始/结束时触发价格更新
- 手动调整:管理员通过后台系统修改价格
2. WebSocket实现
```javascript
// Node.js WebSocket服务示例
const WebSocket = require(ws);
const wss = new WebSocket.Server({ port: 8080 });
wss.on(connection, (ws) => {
console.log(新客户端连接);
// 监听价格变动事件
priceService.on(priceChange, (data) => {
ws.send(JSON.stringify(data));
});
ws.on(close, () => {
console.log(客户端断开连接);
});
});
```
五、关键优化点
1. 性能优化:
- 使用Redis缓存商品价格,减少数据库查询
- 对价格变动频繁的商品采用增量更新策略
2. 一致性保障:
- 实现最终一致性模型,允许短暂的价格不一致
- 提供价格快照功能,记录用户查看时的价格
3. 用户体验:
- 价格变动时添加动画效果(如数字滚动变化)
- 显示价格有效期(如"限时特价至23:59")
- 提供价格走势图表(近7天/30天)
六、测试方案
1. 单元测试:
- 测试价格计算逻辑的各种边界条件
- 验证不同促销组合下的价格计算
2. 集成测试:
- 模拟WebSocket连接和消息推送
- 测试高并发下的价格更新性能
3. 用户场景测试:
- 快速连续变动价格时的显示稳定性
- 网络不稳定时的重连机制
七、部署与监控
1. 部署架构:
- 使用Docker容器化部署
- Kubernetes集群管理,支持水平扩展
2. 监控指标:
- 价格更新延迟(P99)
- WebSocket连接数
- 价格计算服务响应时间
3. 告警规则:
- 价格更新延迟超过1秒
- 5分钟内价格变动超过100次
- WebSocket连接异常断开
八、扩展功能建议
1. 个性化定价:根据用户历史购买行为提供差异化价格
2. 价格预测:基于历史数据预测未来价格走势
3. 价格对比:展示与其他平台的价格对比
4. 价格锁定:允许用户锁定当前价格一段时间
通过以上方案,小象买菜系统可以实现高效、准确的动态价格展示功能,提升用户体验和平台竞争力。