功能概述 商品更新记录功能用于跟踪小象买菜系统中商品信息的变更历史,包括价格调整、库存变化、商品上下架等操作,便于运营管理和问题追溯。 数据库设计 商品更新记录表(product_update_log) ```sql CREATETABLEproduct_update_lo
功能概述
商品更新记录功能用于跟踪小象买菜系统中商品信息的变更历史,包括价格调整、库存变化、商品上下架等操作,便于运营管理和问题追溯。
数据库设计
商品更新记录表(product_update_log)
```sql
CREATE TABLE product_update_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL COMMENT 商品ID,
update_type VARCHAR(20) NOT NULL COMMENT 更新类型:price/stock/status/info,
old_value TEXT COMMENT 旧值(JSON格式),
new_value TEXT COMMENT 新值(JSON格式),
update_by BIGINT COMMENT 操作人ID,
update_by_name VARCHAR(50) COMMENT 操作人姓名,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 更新时间,
remark VARCHAR(255) COMMENT 更新备注,
INDEX idx_product_id (product_id),
INDEX idx_update_time (update_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=商品更新记录表;
```
后端实现
1. 记录更新服务
```java
@Service
public class ProductUpdateLogService {
@Autowired
private ProductUpdateLogMapper logMapper;
/
* 记录商品更新
* @param productId 商品ID
* @param updateType 更新类型
* @param oldValue 旧值
* @param newValue 新值
* @param operator 操作人信息
* @param remark 备注
*/
public void recordUpdate(Long productId, String updateType,
Object oldValue, Object newValue,
UserInfo operator, String remark) {
ProductUpdateLog log = new ProductUpdateLog();
log.setProductId(productId);
log.setUpdateType(updateType);
log.setOldValue(JSON.toJSONString(oldValue));
log.setNewValue(JSON.toJSONString(newValue));
log.setUpdateBy(operator.getUserId());
log.setUpdateByName(operator.getUsername());
log.setRemark(remark);
logMapper.insert(log);
}
/
* 查询商品更新记录
* @param productId 商品ID
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNum 页码
* @param pageSize 每页大小
* @return 分页结果
*/
public PageInfo
queryUpdateLogs(Long productId,
Date startTime,
Date endTime,
int pageNum,
int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List logs = logMapper.selectByConditions(productId, startTime, endTime);
return new PageInfo<>(logs);
}
}
```
2. 商品服务中集成更新记录
```java
@Service
public class ProductService {
@Autowired
private ProductUpdateLogService logService;
@Autowired
private ProductMapper productMapper;
/
* 更新商品价格
*/
public boolean updatePrice(Long productId, BigDecimal newPrice, UserInfo operator) {
Product product = productMapper.selectById(productId);
BigDecimal oldPrice = product.getPrice();
// 更新商品价格
product.setPrice(newPrice);
int affectedRows = productMapper.updateById(product);
if (affectedRows > 0) {
// 记录更新日志
Map oldValue = new HashMap<>();
oldValue.put("price", oldPrice);
Map newValue = new HashMap<>();
newValue.put("price", newPrice);
logService.recordUpdate(productId, "price", oldValue, newValue,
operator, "调整商品价格");
return true;
}
return false;
}
// 其他更新方法类似...
}
```
前端实现
1. 更新记录列表页面
```vue
v-model="dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
查询
{{ formatDate(row.updateTime) }}
{{ formatUpdateType(row.updateType) }}
查看详情
@current-change="handleCurrentChange"
:current-page="pagination.currentPage"
:page-size="pagination.pageSize"
layout="prev, pager, next"
:total="pagination.total">
旧值
{{ oldValue }} 新值
{{ newValue }}
<script>
export default {
data() {
return {
dateRange: [],
logList: [],
pagination: {
currentPage: 1,
pageSize: 10,
total: 0
},
detailDialogVisible: false,
oldValue: ,
newValue: ,
currentLog: null
}
},
methods: {
searchLogs() {
const params = {
productId: this.$route.params.productId,
startTime: this.dateRange ? this.dateRange[0] : null,
endTime: this.dateRange ? this.dateRange[1] : null,
pageNum: this.pagination.currentPage,
pageSize: this.pagination.pageSize
};
this.$api.product.getUpdateLogs(params).then(res => {
this.logList = res.data.list;
this.pagination.total = res.data.total;
});
},
handleCurrentChange(page) {
this.pagination.currentPage = page;
this.searchLogs();
},
showDetail(log) {
this.currentLog = log;
this.oldValue = JSON.stringify(JSON.parse(log.oldValue), null, 2);
this.newValue = JSON.stringify(JSON.parse(log.newValue), null, 2);
this.detailDialogVisible = true;
},
formatDate(dateStr) {
// 日期格式化逻辑
},
formatUpdateType(type) {
const map = {
price: 价格变更,
stock: 库存变更,
status: 上下架状态变更,
info: 商品信息变更
};
return map[type] || type;
}
},
mounted() {
this.searchLogs();
}
}
```
关键点说明
1. 更新类型定义:
- price: 价格变更
- stock: 库存变更
- status: 上下架状态变更
- info: 商品基本信息变更(标题、描述等)
2. 数据存储:
- 使用JSON格式存储变更前后的值,便于扩展和解析
- 记录操作人信息和操作时间,便于追溯
3. 性能考虑:
- 对商品ID和更新时间建立索引,提高查询效率
- 分页查询大量记录
4. 扩展性:
- 可以轻松添加新的更新类型
- 支持按时间范围和商品ID筛选记录
5. 安全考虑:
- 记录操作人信息,防止未授权修改
- 重要变更(如价格调整)需要权限验证
部署建议
1. 对于高频更新的商品,考虑使用异步方式记录日志,避免阻塞主业务
2. 定期归档历史记录,保持数据库性能
3. 对于重要变更,可以添加邮件或短信通知功能
此实现方案可以完整记录小象买菜系统中商品的所有关键变更,为运营管理和问题排查提供有力支持。