标题:美团买菜商品版本控制系统:设计、实现与部署方案

分类:IT频道 时间:2025-12-11 11:35 浏览:5
概述
    一、系统目标  实现美团买菜系统中商品信息的版本控制和迭代记录功能,支持:  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. 数据备份:定期备份版本数据,防止意外丢失
  
  此实现方案提供了完整的商品版本控制能力,支持美团买菜系统中的商品信息迭代管理需求,可根据实际业务场景进行调整和扩展。
评论
  • 下一篇

  • Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes) in /www/wwwroot/www.sjwxsc.com/config/function.php on line 274