功能概述 商品更新记录功能用于跟踪和管理小象买菜系统中商品信息的变更历史,包括价格变动、库存调整、商品上下架等操作记录,便于审计和问题追溯。 数据库设计 商品更新记录表(product_update_log) ```sql CREATETABLE`product_u
功能概述
商品更新记录功能用于跟踪和管理小象买菜系统中商品信息的变更历史,包括价格变动、库存调整、商品上下架等操作记录,便于审计和问题追溯。
数据库设计
商品更新记录表(product_update_log)
```sql
CREATE TABLE `product_update_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,
`product_id` bigint(20) NOT NULL COMMENT 商品ID,
`update_type` varchar(20) NOT NULL COMMENT 更新类型: price_change(价格变更), stock_change(库存变更), status_change(状态变更), info_change(信息变更),
`old_value` text COMMENT 旧值(JSON格式),
`new_value` text NOT NULL COMMENT 新值(JSON格式),
`operator_id` bigint(20) DEFAULT NULL COMMENT 操作人ID,
`operator_name` varchar(50) DEFAULT NULL COMMENT 操作人名称,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 更新时间,
`remark` varchar(255) DEFAULT NULL COMMENT 备注,
PRIMARY KEY (`id`),
KEY `idx_product_id` (`product_id`),
KEY `idx_update_time` (`update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=商品更新记录表;
```
后端实现
1. 创建更新记录实体类
```java
@Data
public class ProductUpdateLog {
private Long id;
private Long productId;
private String updateType;
private String oldValue;
private String newValue;
private Long operatorId;
private String operatorName;
private LocalDateTime updateTime;
private String remark;
}
```
2. 创建更新记录服务层
```java
@Service
public class ProductUpdateLogService {
@Autowired
private ProductUpdateLogMapper productUpdateLogMapper;
/
* 记录商品更新
*/
public void recordUpdate(Long productId, String updateType,
String oldValue, String newValue,
Long operatorId, String operatorName, String remark) {
ProductUpdateLog log = new ProductUpdateLog();
log.setProductId(productId);
log.setUpdateType(updateType);
log.setOldValue(oldValue);
log.setNewValue(newValue);
log.setOperatorId(operatorId);
log.setOperatorName(operatorName);
log.setRemark(remark);
productUpdateLogMapper.insert(log);
}
/
* 查询商品更新记录列表
*/
public List
getUpdateLogs(Long productId, LocalDateTime startTime, LocalDateTime endTime) {
// 实现查询逻辑
// ...
}
}
```
3. 在商品服务中集成更新记录
```java
@Service
public class ProductService {
@Autowired
private ProductUpdateLogService productUpdateLogService;
/
* 更新商品价格
*/
public void updatePrice(Long productId, BigDecimal newPrice, Long operatorId, String operatorName) {
// 1. 获取旧价格
Product product = productMapper.selectById(productId);
BigDecimal oldPrice = product.getPrice();
// 2. 更新价格
product.setPrice(newPrice);
productMapper.updateById(product);
// 3. 记录更新日志
Map oldValueMap = new HashMap<>();
oldValueMap.put("price", oldPrice);
Map newValueMap = new HashMap<>();
newValueMap.put("price", newPrice);
productUpdateLogService.recordUpdate(
productId,
"price_change",
JSON.toJSONString(oldValueMap),
JSON.toJSONString(newValueMap),
operatorId,
operatorName,
"价格调整"
);
}
// 其他更新方法类似...
}
```
前端实现
1. 商品更新记录列表页面
```vue
商品更新记录
{{ formatUpdateType(row.updateType) }}
价格: {{ JSON.parse(row.oldValue).price }}
价格: {{ JSON.parse(row.newValue).price }}
<script>
export default {
data() {
return {
updateLogs: [],
productId: this.$route.params.id
}
},
created() {
this.fetchUpdateLogs();
},
methods: {
fetchUpdateLogs() {
// 调用API获取更新记录
// this.$api.getProductUpdateLogs(this.productId).then(response => {
// this.updateLogs = response.data;
// });
},
formatUpdateType(type) {
const map = {
price_change: 价格变更,
stock_change: 库存变更,
status_change: 状态变更,
info_change: 信息变更
};
return map[type] || type;
}
}
}
```
高级功能扩展
1. 更新记录差异对比
```java
// 在服务层添加方法
public String getUpdateDiff(String oldValue, String newValue, String updateType) {
try {
JSONObject oldObj = JSON.parseObject(oldValue);
JSONObject newObj = JSON.parseObject(newValue);
// 根据不同类型生成差异描述
switch (updateType) {
case "price_change":
BigDecimal oldPrice = oldObj.getBigDecimal("price");
BigDecimal newPrice = newObj.getBigDecimal("price");
return String.format("价格从 %s 变更为 %s",
oldPrice.setScale(2, RoundingMode.HALF_UP),
newPrice.setScale(2, RoundingMode.HALF_UP));
// 其他类型处理...
default:
return "内容已变更";
}
} catch (Exception e) {
return "解析更新内容失败";
}
}
```
2. 更新记录通知
可以在关键更新(如价格大幅变动)时发送通知:
```java
public void updatePriceWithNotification(Long productId, BigDecimal newPrice,
Long operatorId, String operatorName) {
// 原有更新逻辑...
// 检查价格变动幅度
Product product = productMapper.selectById(productId);
BigDecimal oldPrice = product.getPrice();
BigDecimal changeRate = newPrice.subtract(oldPrice)
.divide(oldPrice, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
if (changeRate.abs().compareTo(new BigDecimal("10")) >= 0) { // 变动超过10%
// 发送通知
notificationService.sendPriceChangeNotification(
productId, oldPrice, newPrice, operatorName
);
}
}
```
部署与监控
1. 日志索引:确保数据库为update_time字段创建索引,便于按时间范围查询
2. 数据归档:对于长期运行的系统,考虑定期归档旧记录
3. 监控告警:对异常频繁的更新操作设置监控告警
安全考虑
1. 操作记录不可修改或删除
2. 敏感信息(如成本价)在记录中应脱敏处理
3. 记录操作人IP地址等额外信息增强审计能力
通过以上实现,小象买菜系统可以完整记录商品信息的变更历史,为运营分析和问题排查提供有力支持。