功能概述
商品更新记录功能用于跟踪和管理小象买菜系统中商品信息的变更历史,包括价格调整、库存变化、商品上下架等操作记录。
数据库设计
商品更新记录表(product_update_log)
```sql
CREATE TABLE product_update_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 记录ID,
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_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 更新时间,
operator_id BIGINT COMMENT 操作人ID,
operator_name VARCHAR(50) 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
@Data
public class ProductUpdateLog {
private Long id;
private Long productId;
private String updateType;
private String oldValue;
private String newValue;
private Date updateTime;
private Long operatorId;
private String operatorName;
private String remark;
}
```
2. 记录服务接口
```java
public interface ProductUpdateLogService {
/
* 记录商品更新
* @param productId 商品ID
* @param updateType 更新类型
* @param oldValue 旧值
* @param newValue 新值
* @param operatorId 操作人ID
* @param operatorName 操作人姓名
* @param remark 备注
*/
void recordUpdate(Long productId, String updateType,
String oldValue, String newValue,
Long operatorId, String operatorName,
String remark);
/
* 查询商品更新记录
* @param productId 商品ID
* @param startTime 开始时间
* @param endTime 结束时间
* @param pageNum 页码
* @param pageSize 每页大小
* @return 更新记录列表
*/
PageInfo
queryUpdateLogs(Long productId,
Date startTime,
Date endTime,
Integer pageNum,
Integer pageSize);
}
```
3. 记录服务实现
```java
@Service
public class ProductUpdateLogServiceImpl implements ProductUpdateLogService {
@Autowired
private ProductUpdateLogMapper productUpdateLogMapper;
@Override
@Transactional
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);
}
@Override
public PageInfo queryUpdateLogs(Long productId,
Date startTime,
Date endTime,
Integer pageNum,
Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List logs = productUpdateLogMapper.selectByCondition(
productId, startTime, endTime);
return new PageInfo<>(logs);
}
}
```
4. Mapper接口
```java
public interface ProductUpdateLogMapper {
int insert(ProductUpdateLog log);
List selectByCondition(@Param("productId") Long productId,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
}
```
业务逻辑集成
在商品相关服务中集成更新记录功能:
```java
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductUpdateLogService updateLogService;
@Override
@Transactional
public boolean updateProductPrice(Long productId, BigDecimal newPrice,
Long operatorId, String operatorName) {
// 1. 查询旧价格
Product product = productMapper.selectById(productId);
BigDecimal oldPrice = product.getPrice();
// 2. 更新价格
product.setPrice(newPrice);
int result = productMapper.updateById(product);
// 3. 记录更新日志
if (result > 0) {
JSONObject oldJson = new JSONObject();
oldJson.put("price", oldPrice);
JSONObject newJson = new JSONObject();
newJson.put("price", newPrice);
updateLogService.recordUpdate(
productId,
"price",
oldJson.toJSONString(),
newJson.toJSONString(),
operatorId,
operatorName,
"调整商品价格"
);
}
return result > 0;
}
// 其他商品更新方法类似...
}
```
前端实现
1. 更新记录列表页面
```vue
商品更新记录
v-model="dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="handleDateChange"
/>
查询
{{ formatUpdateType(row.updateType) }}
查看详情
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagination.currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total"
/>
旧值
{{ oldValue }} 新值
{{ newValue }}
<script>
export default {
data() {
return {
productId: this.$route.params.id,
dateRange: [],
logList: [],
pagination: {
currentPage: 1,
pageSize: 10,
total: 0
},
detailDialogVisible: false,
oldValue: ,
newValue:
}
},
created() {
this.fetchLogs();
},
methods: {
fetchLogs() {
const params = {
productId: this.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;
});
},
handleDateChange(val) {
if (val && val.length === 2) {
// 确保结束日期不小于开始日期
if (val[1] < val[0]) {
this.dateRange = [val[1], val[0]];
}
}
},
searchLogs() {
this.pagination.currentPage = 1;
this.fetchLogs();
},
handleSizeChange(val) {
this.pagination.pageSize = val;
this.fetchLogs();
},
handleCurrentChange(val) {
this.pagination.currentPage = val;
this.fetchLogs();
},
showDetail(row) {
this.oldValue = this.formatJson(row.oldValue);
this.newValue = this.formatJson(row.newValue);
this.detailDialogVisible = true;
},
formatJson(jsonStr) {
try {
const obj = JSON.parse(jsonStr);
return JSON.stringify(obj, null, 2);
} catch (e) {
return jsonStr || 无;
}
},
formatUpdateType(type) {
const typeMap = {
price: 价格变更,
stock: 库存变更,
status: 上下架状态变更,
info: 商品信息变更
};
return typeMap[type] || type;
}
}
}
<style scoped>
.update-log-container {
padding: 20px;
}
.search-bar {
margin-bottom: 20px;
}
.detail-content pre {
background: f5f5f5;
padding: 10px;
border-radius: 4px;
max-height: 400px;
overflow-y: auto;
}
```
高级功能扩展
1. 变更对比视图:实现新旧值的差异高亮显示
2. 操作人信息补全:集成用户系统显示操作人详细信息
3. 批量导出:支持将更新记录导出为Excel或CSV格式
4. 自动归档:对超过一定时间的记录进行归档存储
5. 变更通知:重要变更(如价格大幅调整)触发通知机制
注意事项
1. 确保在事务中记录更新日志,避免因主操作失败而留下无效记录
2. 对敏感信息(如成本价)进行脱敏处理
3. 考虑记录性能影响,对高频更新场景可采用异步记录方式
4. 定期清理或归档过旧的记录以控制数据库大小
通过以上实现,小象买菜系统可以完整记录商品信息的变更历史,便于追溯和审计,同时为运营分析提供数据支持。