一、系统概述 小象买菜系统需要实现动态价格展示功能,即根据市场行情、库存情况、促销活动等因素实时调整商品价格,并在前端界面动态更新显示。 二、技术架构设计 1.后端架构 -微服务架构:将价格计算逻辑拆分为独立的价格服务 -数据库设计: -商品表(products):存
一、系统概述
小象买菜系统需要实现动态价格展示功能,即根据市场行情、库存情况、促销活动等因素实时调整商品价格,并在前端界面动态更新显示。
二、技术架构设计
1. 后端架构
- 微服务架构:将价格计算逻辑拆分为独立的价格服务
- 数据库设计:
- 商品表(products):存储基础商品信息
- 价格表(prices):存储商品当前价格及历史价格
- 价格规则表(price_rules):存储定价规则
- 促销活动表(promotions):存储促销活动信息
2. 前端架构
- 实时通信:使用WebSocket或Server-Sent Events(SSE)实现价格实时更新
- 状态管理:Vuex/Redux管理商品价格状态
- UI组件:开发可复用的价格展示组件
三、核心功能实现
1. 价格计算引擎
```javascript
// 价格计算服务示例
class PriceCalculator {
constructor(productService, promotionService, inventoryService) {
this.productService = productService;
this.promotionService = promotionService;
this.inventoryService = inventoryService;
}
async calculatePrice(productId) {
const product = await this.productService.getProduct(productId);
const inventory = await this.inventoryService.getInventory(productId);
const promotions = await this.promotionService.getActivePromotions(productId);
// 基础价格
let finalPrice = product.basePrice;
// 应用库存折扣
if (inventory.quantity < 10) {
finalPrice *= 0.9; // 库存少于10件打9折
}
// 应用促销活动
for (const promo of promotions) {
if (promo.type === percentage) {
finalPrice *= (1 - promo.value / 100);
} else if (promo.type === fixed) {
finalPrice -= promo.value;
}
}
// 确保价格不低于成本价
finalPrice = Math.max(finalPrice, product.costPrice);
return finalPrice.toFixed(2);
}
}
```
2. 实时价格更新机制
后端实现 (Node.js + WebSocket示例)
```javascript
const WebSocket = require(ws);
const wss = new WebSocket.Server({ port: 8080 });
// 价格变化事件发射器
const priceEventEmitter = new (require(events))();
// 模拟价格变化
setInterval(() => {
// 这里应该是实际的价格变化逻辑
priceEventEmitter.emit(priceChanged, {
productId: 123,
newPrice: 9.99
});
}, 5000); // 每5秒模拟一次价格变化
wss.on(connection, (ws) => {
console.log(New client connected);
// 发送当前所有商品价格
// ws.send(JSON.stringify(getAllCurrentPrices()));
// 监听价格变化事件
const onPriceChanged = (data) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: priceUpdate,
...data
}));
}
};
priceEventEmitter.on(priceChanged, onPriceChanged);
ws.on(close, () => {
priceEventEmitter.off(priceChanged, onPriceChanged);
});
});
```
前端实现 (Vue.js示例)
```javascript
export default {
data() {
return {
products: [],
priceSocket: null
};
},
mounted() {
this.initPriceSocket();
this.fetchInitialPrices();
},
beforeDestroy() {
if (this.priceSocket) {
this.priceSocket.close();
}
},
methods: {
initPriceSocket() {
this.priceSocket = new WebSocket(ws://localhost:8080);
this.priceSocket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === priceUpdate) {
this.updateProductPrice(data.productId, data.newPrice);
}
};
},
fetchInitialPrices() {
// API调用获取初始价格
api.getProducts().then(response => {
this.products = response.data.map(product => ({
...product,
displayPrice: product.price.toFixed(2)
}));
});
},
updateProductPrice(productId, newPrice) {
const product = this.products.find(p => p.id === productId);
if (product) {
// 添加动画效果类
product.displayPrice = newPrice.toFixed(2);
// 可以在这里触发CSS动画或使用其他UI反馈
setTimeout(() => {
// 移除动画效果类
}, 500);
}
}
}
};
```
3. 价格展示UI组件
```vue
¥{{ displayPrice }}
¥{{ originalPrice }}
{{ priceChangeDirection > 0 ? ↑ : ↓ }}{{ Math.abs(priceChangeAmount).toFixed(2) }}
<script>
export default {
props: {
currentPrice: {
type: Number,
required: true
},
originalPrice: {
type: Number,
default: null
}
},
data() {
return {
displayPrice: this.currentPrice.toFixed(2),
lastPrice: this.currentPrice,
isPriceChanged: false
};
},
computed: {
priceChangeDirection() {
if (this.lastPrice === null) return null;
return this.currentPrice - this.lastPrice;
},
priceChangeAmount() {
if (this.lastPrice === null) return 0;
return this.currentPrice - this.lastPrice;
}
},
watch: {
currentPrice(newVal) {
this.displayPrice = newVal.toFixed(2);
this.isPriceChanged = true;
this.lastPrice = newVal;
// 3秒后移除变化状态
setTimeout(() => {
this.isPriceChanged = false;
}, 3000);
}
}
};
<style scoped>
.price-display {
font-size: 1.2rem;
position: relative;
}
.current-price {
font-weight: bold;
color: e63946;
}
.original-price {
text-decoration: line-through;
color: 999;
margin-left: 8px;
font-size: 0.9rem;
}
.price-change {
margin-left: 8px;
font-size: 0.8rem;
}
.price-changed {
animation: pulse 0.5s;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
```
四、性能优化考虑
1. 价格更新频率控制:
- 避免过于频繁的价格更新(如每秒多次)
- 对批量价格更新进行节流处理
2. 数据传输优化:
- 只发送变化的价格数据
- 使用二进制协议或压缩技术减少数据量
3. 前端渲染优化:
- 对价格展示组件使用虚拟滚动(对于长列表)
- 避免不必要的重新渲染
4. 缓存策略:
- 实现客户端价格缓存
- 设置合理的缓存失效时间
五、安全考虑
1. 价格验证:
- 确保后端计算的价格不低于成本价
- 防止价格被恶意篡改
2. WebSocket安全:
- 使用wss://协议
- 实现身份验证机制
3. 输入验证:
- 对所有影响价格的输入参数进行验证
六、扩展功能建议
1. 价格历史记录:展示商品价格变化趋势图
2. 价格预警:当价格达到用户设定阈值时通知用户
3. 多货币支持:为国际用户提供不同货币的价格显示
4. 价格预测:基于历史数据预测未来价格走势
七、部署与监控
1. 监控指标:
- 价格计算服务响应时间
- WebSocket连接数
- 价格更新频率
2. 日志记录:
- 记录所有价格变更操作
- 记录价格计算过程中的关键决策点
3. 告警机制:
- 当价格异常波动时触发告警
- 当价格计算服务不可用时通知运维团队
通过以上方案,小象买菜系统可以实现高效、可靠的动态价格展示功能,提升用户体验和系统灵活性。