一、系统概述
小象买菜系统需要实现动态价格展示功能,即根据市场行情、库存情况、促销活动等因素实时更新商品价格,提升用户体验和系统灵活性。
二、功能需求分析
1. 实时价格更新:价格变化应即时反映在用户界面
2. 多维度价格策略:支持原价、促销价、会员价等多种价格类型
3. 价格历史记录:记录价格变动历史用于分析和审计
4. 价格计算规则:支持复杂的价格计算逻辑(如满减、折扣、组合优惠等)
5. 多端同步:确保Web、App、小程序等各端价格一致
三、技术架构设计
前端实现
```javascript
// Vue.js 示例 - 商品价格组件
¥{{ currentPrice.toFixed(2) }}
¥{{ originalPrice.toFixed(2) }}
{{ formatTime(priceUpdateTime) }}更新
<script>
export default {
props: [productId],
data() {
return {
currentPrice: 0,
originalPrice: 0,
hasDiscount: false,
priceUpdateTime: null
}
},
created() {
// 订阅价格更新
this.$priceService.subscribe(this.productId, (priceData) => {
this.updatePrice(priceData);
});
// 初始加载
this.loadPrice();
},
methods: {
async loadPrice() {
const response = await api.getProductPrice(this.productId);
this.updatePrice(response.data);
},
updatePrice(priceData) {
this.currentPrice = priceData.currentPrice;
this.originalPrice = priceData.originalPrice;
this.hasDiscount = priceData.hasDiscount;
this.priceUpdateTime = priceData.updateTime;
},
formatTime(timestamp) {
// 时间格式化逻辑
}
}
}
```
后端实现
1. 价格服务设计
```java
// Spring Boot 价格服务示例
@Service
public class PriceService {
@Autowired
private PriceRepository priceRepository;
@Autowired
private PriceUpdatePublisher priceUpdatePublisher;
// 获取当前价格
public PriceData getCurrentPrice(Long productId) {
// 从缓存或数据库获取最新价格
PriceEntity priceEntity = priceRepository.findByProductId(productId);
return convertToPriceData(priceEntity);
}
// 更新价格
@Transactional
public void updatePrice(PriceUpdateRequest request) {
// 验证权限等业务逻辑
PriceEntity priceEntity = priceRepository.findByProductId(request.getProductId());
// 更新价格信息
priceEntity.setCurrentPrice(request.getNewPrice());
priceEntity.setOriginalPrice(request.getOriginalPrice());
priceEntity.setUpdateTime(LocalDateTime.now());
// 其他价格相关字段更新...
priceRepository.save(priceEntity);
// 发布价格更新事件
priceUpdatePublisher.publishPriceUpdate(request.getProductId());
}
// 价格计算逻辑
public BigDecimal calculateFinalPrice(Long productId, User user) {
// 根据用户类型、促销活动等计算最终价格
// 实现复杂的定价规则
}
}
```
2. 实时价格推送
```java
// 使用WebSocket实现实时价格推送
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/price-ws").withSockJS();
}
}
@Service
public class PriceUpdatePublisher {
@Autowired
private SimpMessagingTemplate messagingTemplate;
public void publishPriceUpdate(Long productId) {
// 获取最新价格信息
PriceData priceData = priceService.getPriceData(productId);
// 推送给所有订阅该商品价格的用户
messagingTemplate.convertAndSend("/topic/prices/" + productId, priceData);
}
}
```
3. 价格计算引擎
```java
public interface PriceCalculator {
BigDecimal calculate(PriceContext context);
}
@Component
public class CompositePriceCalculator implements PriceCalculator {
@Autowired
private List
calculators;
@Override
public BigDecimal calculate(PriceContext context) {
BigDecimal result = context.getOriginalPrice();
// 按优先级应用各种计算器
for (PriceCalculator calculator : calculators) {
result = calculator.calculate(context.withCurrentPrice(result));
}
return result;
}
}
// 具体计算器示例 - 会员折扣
@Component
public class MemberDiscountCalculator implements PriceCalculator {
@Override
public BigDecimal calculate(PriceContext context) {
if (context.getUser().isMember()) {
return context.getCurrentPrice().multiply(new BigDecimal("0.9")); // 9折
}
return context.getCurrentPrice();
}
}
```
四、数据库设计
```sql
CREATE TABLE product_price (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
current_price DECIMAL(10,2) NOT NULL,
original_price DECIMAL(10,2) NOT NULL,
price_type VARCHAR(20) NOT NULL, -- NORMAL, PROMOTION, MEMBER等
start_time DATETIME,
end_time DATETIME,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_by VARCHAR(50),
version INT DEFAULT 0, -- 乐观锁版本号
UNIQUE KEY uk_product_id (product_id, price_type)
);
CREATE TABLE price_history (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
old_price DECIMAL(10,2) NOT NULL,
new_price DECIMAL(10,2) NOT NULL,
change_reason VARCHAR(200),
change_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
changed_by VARCHAR(50)
);
```
五、关键技术实现
1. 实时推送技术:
- WebSocket实现价格实时更新
- SSE (Server-Sent Events)作为备选方案
2. 缓存策略:
- Redis缓存商品价格,减少数据库查询
- 双缓存机制:热数据在内存,冷数据在Redis
3. 并发控制:
- 乐观锁机制处理并发价格更新
- 分布式锁防止重复更新
4. 价格计算引擎:
- 责任链模式处理复杂价格计算规则
- 规则引擎支持动态规则配置
六、测试方案
1. 单元测试:
- 测试各种价格计算场景
- 测试并发更新情况
2. 集成测试:
- 测试前后端价格同步
- 测试多端价格一致性
3. 性能测试:
- 模拟高并发价格更新场景
- 测试系统响应时间和稳定性
七、部署与监控
1. 部署方案:
- 价格服务独立部署,可横向扩展
- 使用Nginx负载均衡
2. 监控指标:
- 价格更新延迟
- 价格计算错误率
- 实时推送成功率
3. 告警机制:
- 价格更新失败告警
- 价格不一致告警
八、扩展功能建议
1. 价格预测:基于历史数据预测未来价格走势
2. 价格对比:展示不同渠道或历史价格对比
3. 价格提醒:用户设置价格阈值提醒
4. A/B测试:不同价格策略的效果测试
通过以上方案,小象买菜系统可以实现高效、准确的动态价格展示功能,提升用户体验和商业运营效率。