一、系统目标 实现美团买菜系统中商品信息的版本控制和迭代记录功能,支持: 1.商品信息的全生命周期管理 2.每次变更的可追溯性 3.商品数据的历史版本回滚 4.变更原因和操作人记录 二、数据库设计 1.商品主表(product) ```sql CREATETABLE
一、系统目标
实现美团买菜系统中商品信息的版本控制和迭代记录功能,支持:
1. 商品信息的全生命周期管理
2. 每次变更的可追溯性
3. 商品数据的历史版本回滚
4. 变更原因和操作人记录
二、数据库设计
1. 商品主表(product)
```sql
CREATE TABLE product (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
current_version_id BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
category_id BIGINT NOT NULL,
status TINYINT DEFAULT 1 COMMENT 1-上架 0-下架,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
UNIQUE KEY (id, current_version_id)
);
```
2. 商品版本表(product_version)
```sql
CREATE TABLE product_version (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
version_number INT NOT NULL,
base_price DECIMAL(10,2) NOT NULL,
market_price DECIMAL(10,2),
stock INT NOT NULL,
unit VARCHAR(20) NOT NULL,
specs JSON COMMENT 商品规格信息,
images JSON COMMENT 商品图片列表,
description TEXT,
is_current TINYINT DEFAULT 1 COMMENT 1-当前版本 0-历史版本,
operator_id BIGINT NOT NULL COMMENT 操作人ID,
operator_name VARCHAR(50) NOT NULL,
change_reason VARCHAR(500),
create_time DATETIME NOT NULL,
INDEX idx_product_id (product_id),
INDEX idx_version (version_number)
);
```
3. 商品属性扩展表(product_attribute)
```sql
CREATE TABLE product_attribute (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
version_id BIGINT NOT NULL,
attr_name VARCHAR(50) NOT NULL,
attr_value VARCHAR(200) NOT NULL,
INDEX idx_version (version_id)
);
```
三、核心功能实现
1. 商品创建流程
```java
public Product createProduct(ProductDTO productDTO) {
// 1. 创建商品主记录
Product product = new Product();
product.setName(productDTO.getName());
// 其他主表字段设置...
productMapper.insert(product);
// 2. 创建初始版本
ProductVersion version = new ProductVersion();
version.setProductId(product.getId());
version.setVersionNumber(1);
version.setBasePrice(productDTO.getPrice());
// 其他版本字段设置...
version.setChangeReason("初始创建");
versionMapper.insert(version);
// 3. 更新主表当前版本
product.setCurrentVersionId(version.getId());
productMapper.updateById(product);
return product;
}
```
2. 商品更新流程
```java
public Product updateProduct(Long productId, ProductUpdateDTO updateDTO) {
// 1. 获取当前商品信息
Product product = productMapper.selectById(productId);
if (product == null) {
throw new RuntimeException("商品不存在");
}
// 2. 创建新版本
ProductVersion newVersion = new ProductVersion();
newVersion.setProductId(productId);
// 获取当前最大版本号并+1
Integer maxVersion = versionMapper.selectMaxVersion(productId);
newVersion.setVersionNumber(maxVersion == null ? 1 : maxVersion + 1);
// 设置新版本数据
newVersion.setBasePrice(updateDTO.getPrice());
newVersion.setChangeReason(updateDTO.getChangeReason());
newVersion.setOperatorId(updateDTO.getOperatorId());
newVersion.setOperatorName(updateDTO.getOperatorName());
// 其他字段设置...
versionMapper.insert(newVersion);
// 3. 更新主表当前版本指向
product.setCurrentVersionId(newVersion.getId());
productMapper.updateById(product);
return product;
}
```
3. 商品版本查询
```java
public List
getProductVersions(Long productId) {
// 获取商品当前版本
Product product = productMapper.selectById(productId);
if (product == null) {
throw new RuntimeException("商品不存在");
}
// 获取所有版本记录
List versions = versionMapper.selectByProductId(productId);
// 转换为DTO
return versions.stream()
.map(v -> {
ProductVersionDTO dto = new ProductVersionDTO();
BeanUtils.copyProperties(v, dto);
return dto;
})
.collect(Collectors.toList());
}
```
4. 商品版本回滚
```java
public boolean rollbackToVersion(Long productId, Integer versionNumber) {
// 1. 获取指定版本
ProductVersion targetVersion = versionMapper.selectByProductIdAndVersion(productId, versionNumber);
if (targetVersion == null) {
throw new RuntimeException("指定版本不存在");
}
// 2. 创建新版本作为回滚版本(保持变更记录)
ProductVersion rollbackVersion = new ProductVersion();
// 复制目标版本数据
BeanUtils.copyProperties(targetVersion, rollbackVersion);
// 设置回滚相关信息
Integer newVersion = versionMapper.selectMaxVersion(productId) + 1;
rollbackVersion.setId(null); // 创建新记录
rollbackVersion.setVersionNumber(newVersion);
rollbackVersion.setChangeReason("回滚到版本" + versionNumber);
rollbackVersion.setOperatorId(getCurrentUserId());
rollbackVersion.setOperatorName(getCurrentUserName());
versionMapper.insert(rollbackVersion);
// 3. 更新主表当前版本指向
Product product = productMapper.selectById(productId);
product.setCurrentVersionId(rollbackVersion.getId());
productMapper.updateById(product);
return true;
}
```
四、前端展示方案
1. 商品详情页展示版本历史
```javascript
// 获取商品版本历史
function fetchProductVersions(productId) {
return axios.get(`/api/products/${productId}/versions`)
.then(response => {
const versions = response.data;
// 在UI中展示版本历史表格
// 包含版本号、修改时间、操作人、变更原因等
});
}
```
2. 商品编辑页实现
```javascript
// 编辑商品时加载当前版本数据
function loadProductForEdit(productId) {
axios.get(`/api/products/${productId}/current-version`)
.then(response => {
const currentVersion = response.data;
// 填充表单数据
$( productName).val(currentVersion.name);
$( price).val(currentVersion.basePrice);
// 其他字段...
});
}
// 提交修改时创建新版本
function submitProductUpdate(productId, updateData) {
updateData.changeReason = prompt("请输入修改原因:");
if (!updateData.changeReason) return;
axios.put(`/api/products/${productId}/versions`, updateData)
.then(response => {
alert("商品信息已更新");
// 刷新页面或版本历史
});
}
```
五、高级功能实现
1. 版本差异对比
```java
public Map compareVersions(Long productId, Integer version1, Integer version2) {
ProductVersion v1 = versionMapper.selectByProductIdAndVersion(productId, version1);
ProductVersion v2 = versionMapper.selectByProductIdAndVersion(productId, version2);
Map differences = new HashMap<>();
// 比较价格
if (!v1.getBasePrice().equals(v2.getBasePrice())) {
differences.put("价格", "从 " + v1.getBasePrice() + " 改为 " + v2.getBasePrice());
}
// 比较其他字段...
return differences;
}
```
2. 自动版本号生成
```java
public Integer generateNextVersionNumber(Long productId) {
Integer maxVersion = versionMapper.selectMaxVersionByProductId(productId);
return maxVersion == null ? 1 : maxVersion + 1;
}
```
六、部署与监控
1. 数据库索引优化:
- 为product_id和version_number创建复合索引
- 为create_time字段创建索引以便按时间查询
2. 缓存策略:
- 当前商品信息缓存(Redis)
- 版本历史分页缓存
3. 监控指标:
- 版本创建频率
- 平均版本大小(变更字段数)
- 回滚操作频率
七、实施路线图
1. 第一阶段(2周):
- 数据库表设计实现
- 基础CRUD接口开发
- 商品创建/更新流程实现
2. 第二阶段(3周):
- 版本历史查询功能
- 版本差异对比
- 前端版本历史展示页面
3. 第三阶段(2周):
- 版本回滚功能
- 操作审计日志
- 性能优化
4. 第四阶段(持续):
- 用户操作培训
- 系统监控告警
- 定期数据归档
八、注意事项
1. 数据一致性:确保主表和版本表的数据一致性,使用事务处理
2. 性能考虑:对于高频更新的商品,考虑异步创建版本记录
3. 存储优化:对于大文本字段(如描述),考虑单独建表或使用文件存储
4. 权限控制:版本回滚等敏感操作需要严格的权限校验
5. 数据备份:定期备份版本数据,防止意外丢失
此实现方案提供了完整的商品版本控制能力,支持美团买菜系统中的商品信息迭代管理需求,可根据实际业务场景进行调整和扩展。