一、系统架构设计 1.核心模块 -商品管理模块:负责商品基础信息的创建、编辑、删除 -迭代记录模块:记录商品所有变更历史 -版本控制模块:管理商品的不同版本 -审批流程模块:控制商品变更的发布流程 -通知模块:推送商品变更信息给相关人员 2.技术栈建议 -后端:Jav
一、系统架构设计
1. 核心模块
- 商品管理模块:负责商品基础信息的创建、编辑、删除
- 迭代记录模块:记录商品所有变更历史
- 版本控制模块:管理商品的不同版本
- 审批流程模块:控制商品变更的发布流程
- 通知模块:推送商品变更信息给相关人员
2. 技术栈建议
- 后端:Java/Spring Boot + MySQL/MongoDB
- 前端:React/Vue + Ant Design
- 搜索:Elasticsearch(用于快速检索历史版本)
- 缓存:Redis(缓存热门商品当前版本)
二、商品迭代记录实现方案
1. 数据库设计
```sql
-- 商品主表
CREATE TABLE `product` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`current_version_id` bigint COMMENT 当前版本ID,
`status` tinyint COMMENT 商品状态(0:下架,1:上架),
`create_time` datetime,
`update_time` datetime
);
-- 商品版本表
CREATE TABLE `product_version` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`product_id` bigint COMMENT 商品ID,
`version_number` varchar(20) COMMENT 版本号(如v1.0.0),
`change_content` text COMMENT 变更内容,
`operator_id` bigint COMMENT 操作人ID,
`operator_name` varchar(50) COMMENT 操作人姓名,
`status` tinyint COMMENT 版本状态(0:草稿,1:已发布,2:已回滚),
`publish_time` datetime COMMENT 发布时间,
`create_time` datetime,
`update_time` datetime
);
-- 商品版本详情表(存储每个版本的具体字段值)
CREATE TABLE `product_version_detail` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`version_id` bigint COMMENT 版本ID,
`field_name` varchar(50) COMMENT 字段名,
`field_value` text COMMENT 字段值,
`field_type` varchar(20) COMMENT 字段类型,
`create_time` datetime
);
-- 商品变更日志表(记录每次变更的详细差异)
CREATE TABLE `product_change_log` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`version_id` bigint COMMENT 版本ID,
`change_type` tinyint COMMENT 变更类型(1:新增,2:修改,3:删除),
`field_name` varchar(50) COMMENT 字段名,
`old_value` text COMMENT 旧值,
`new_value` text COMMENT 新值,
`create_time` datetime
);
```
2. 核心功能实现
2.1 商品编辑流程
1. 创建新版本草稿
2. 记录所有变更到change_log
3. 提交审批
4. 审批通过后发布版本
5. 更新product表的current_version_id
2.2 版本对比功能
```java
// 版本对比服务实现示例
public VersionDiffResult compareVersions(Long productId, String version1, String version2) {
// 1. 获取两个版本的详情数据
List
details1 = getVersionDetails(productId, version1);
List details2 = getVersionDetails(productId, version2);
// 2. 转换为Map便于比较
Map map1 = details1.stream()
.collect(Collectors.toMap(ProductVersionDetail::getFieldName, Function.identity()));
Map map2 = details2.stream()
.collect(Collectors.toMap(ProductVersionDetail::getFieldName, Function.identity()));
// 3. 找出所有字段
Set allFields = new HashSet<>();
allFields.addAll(map1.keySet());
allFields.addAll(map2.keySet());
// 4. 比较差异
List diffs = new ArrayList<>();
for (String field : allFields) {
ProductVersionDetail detail1 = map1.get(field);
ProductVersionDetail detail2 = map2.get(field);
if (detail1 == null) {
// 新增字段
diffs.add(new FieldDiff(field, null, detail2.getFieldValue(), ChangeType.ADD));
} else if (detail2 == null) {
// 删除字段
diffs.add(new FieldDiff(field, detail1.getFieldValue(), null, ChangeType.DELETE));
} else if (!Objects.equals(detail1.getFieldValue(), detail2.getFieldValue())) {
// 修改字段
diffs.add(new FieldDiff(field, detail1.getFieldValue(), detail2.getFieldValue(), ChangeType.MODIFY));
}
}
return new VersionDiffResult(version1, version2, diffs);
}
```
2.3 版本回滚功能
```java
public boolean rollbackToVersion(Long productId, String targetVersion) {
// 1. 获取目标版本详情
ProductVersion targetVersionObj = getVersionByNumber(productId, targetVersion);
if (targetVersionObj == null || targetVersionObj.getStatus() != VersionStatus.PUBLISHED) {
throw new BusinessException("目标版本不存在或不可回滚");
}
// 2. 创建新版本作为回滚版本
String newVersion = generateNextVersion(productId);
ProductVersion newVersionObj = createVersion(productId, newVersion,
"回滚到版本" + targetVersion, currentUser());
// 3. 复制目标版本详情到新版本
List targetDetails = getVersionDetails(productId, targetVersion);
for (ProductVersionDetail detail : targetDetails) {
saveVersionDetail(newVersionObj.getId(), detail.getFieldName(),
detail.getFieldValue(), detail.getFieldType());
}
// 4. 发布新版本
publishVersion(newVersionObj.getId());
// 5. 更新商品当前版本
updateProductCurrentVersion(productId, newVersionObj.getId());
return true;
}
```
2.4 前端展示方案
1. 版本列表:展示所有历史版本,可按时间、版本号排序
2. 版本详情:展示单个版本的完整信息和变更内容
3. 版本对比:并排展示两个版本的差异,高亮显示变更部分
4. 时间轴视图:以时间轴形式展示商品演变历史
三、高级功能实现
1. 自动生成变更说明
```java
public String generateChangeDescription(List diffs) {
StringBuilder sb = new StringBuilder();
for (FieldDiff diff : diffs) {
switch (diff.getChangeType()) {
case ADD:
sb.append("新增字段: ").append(diff.getFieldName())
.append(" = ").append(diff.getNewValue()).append("\n");
break;
case DELETE:
sb.append("删除字段: ").append(diff.getFieldName())
.append(" (原值: ").append(diff.getOldValue()).append(")\n");
break;
case MODIFY:
sb.append("修改字段: ").append(diff.getFieldName())
.append(" 从 ").append(diff.getOldValue())
.append(" 改为 ").append(diff.getNewValue()).append("\n");
break;
}
}
return sb.toString();
}
```
2. 变更影响分析
- 分析商品变更对库存、价格、促销活动的影响
- 检查关联的供应链、配送等系统是否需要同步更新
3. 自动化测试集成
- 对每次版本发布自动运行回归测试
- 关键字段变更时触发专项测试
四、实施建议
1. 分阶段实施:
- 第一阶段:实现基本版本控制和变更记录
- 第二阶段:增加版本对比和回滚功能
- 第三阶段:实现高级功能如影响分析和自动化测试
2. 数据迁移策略:
- 对现有商品数据生成初始版本
- 历史变更数据可逐步补录或只保留关键变更
3. 权限控制:
- 不同角色对商品迭代记录的查看和操作权限
- 变更审批流程配置
4. 性能优化:
- 对频繁访问的当前版本数据做缓存
- 变更日志表按时间分区
- 异步处理非关键变更记录
五、运维监控
1. 监控版本发布频率和成功率
2. 记录关键操作日志
3. 设置变更异常报警机制
4. 定期备份迭代记录数据
通过以上方案,美团买菜系统可以实现完善的商品迭代记录管理,确保商品信息的可追溯性,提高运营效率,降低变更风险。