1. 项目概述
这个宠物用品电商系统采用前后端分离架构,前端使用Vue.js框架,后端基于Spring Boot技术栈。系统主要面向宠物用品零售商和宠物主人,提供商品展示、在线购买、订单管理、用户中心等核心功能模块。
我在实际开发中发现,宠物用品电商与传统电商系统存在显著差异:需要特别关注宠物分类体系(如犬类/猫类/小宠)、宠物年龄阶段对应的商品匹配(幼犬粮/成犬粮),以及宠物体重与商品规格的关联计算。这些业务特性直接影响着数据库设计和业务逻辑实现。
2. 技术架构解析
2.1 后端技术栈
Spring Boot 2.7.x 作为基础框架,主要依赖包括:
- Spring Security 5.7(认证授权)
- MyBatis-Plus 3.5(数据持久化)
- Redis 6.2(缓存会话管理)
- Alibaba Cloud OSS(图片存储)
数据库采用MySQL 8.0,特别设计了以下核心表:
CREATE TABLE `pet_product` ( `id` bigint NOT NULL AUTO_INCREMENT, `pet_type` tinyint COMMENT '1-犬类 2-猫类 3-小宠', `age_stage` tinyint COMMENT '1-幼年 2-成年 3-老年', `weight_range` varchar(20) COMMENT '适用体重范围', `spec_json` json COMMENT '规格参数(颜色/尺寸等)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;2.2 前端技术栈
Vue 3 + Element Plus构建管理后台,主要特性包括:
- 动态路由权限控制
- Axios请求拦截
- Vuex状态管理
- ECharts数据可视化
移动端采用Vant 4组件库,通过rem适配方案实现响应式布局。实测数据显示,首屏加载时间优化至1.2秒内:
// vite.config.js 优化配置 export default defineConfig({ build: { chunkSizeWarningLimit: 1500, rollupOptions: { output: { manualChunks(id) { if (id.includes('node_modules')) { return 'vendor' } } } } } })3. 核心业务实现
3.1 智能商品推荐
基于用户浏览记录和宠物档案数据,实现个性化推荐算法:
public List<Product> recommendProducts(Long userId) { // 获取用户宠物信息 Pet pet = petMapper.selectByUserId(userId); // 构建推荐查询条件 LambdaQueryWrapper<Product> query = new LambdaQueryWrapper<>(); query.eq(Product::getPetType, pet.getType()) .eq(Product::getAgeStage, pet.getAgeStage()) .apply("JSON_CONTAINS(weight_range, {0})", pet.getWeight()); // 混合推荐策略 return productMapper.selectList(query) .stream() .sorted(Comparator.comparing(Product::getSales).reversed()) .limit(12) .collect(Collectors.toList()); }3.2 购物车特殊处理
针对宠物用品特性,购物车需要额外校验:
- 宠物食品不能与用品混合结算
- 处方粮需要上传兽医证明
- 大件商品(如猫爬架)需单独计算运费
前端实现示例:
<template> <div v-if="isMedicalProduct" class="certificate-upload"> <el-upload action="/api/upload/cert" :before-upload="checkCertFile"> <el-button type="primary">上传兽医证明</el-button> </el-upload> </div> </template> <script> export default { methods: { checkCertFile(file) { const isPDF = file.type === 'application/pdf' if (!isPDF) { this.$message.error('请上传PDF格式证明') return false } return true } } } </script>4. 部署实践指南
4.1 生产环境部署
推荐使用Docker Compose编排服务:
version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql-data:/var/lib/mysql redis: image: redis:6.2-alpine ports: - "6379:6379" backend: build: ./backend ports: - "8080:8080" depends_on: - mysql - redis frontend: build: ./frontend ports: - "80:80"4.2 性能调优要点
- MySQL配置优化:
[mysqld] innodb_buffer_pool_size = 1G innodb_log_file_size = 256M max_connections = 200- JVM参数建议:
java -jar -Xms512m -Xmx1024m -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -Dspring.profiles.active=prod \ petstore-backend.jar5. 典型问题排查
5.1 图片上传失败
常见原因及解决方案:
- OSS权限配置错误 → 检查RAM策略的Action包含
oss:PutObject - 前端未设置Content-Type → 显式指定
'Content-Type': 'multipart/form-data' - 文件超过大小限制 → Nginx添加配置
client_max_body_size 20M
5.2 订单状态不同步
分布式事务处理方案:
@Transactional public void completeOrder(Long orderId) { // 1. 更新订单状态 orderMapper.updateStatus(orderId, PAID); // 2. 扣减库存 boolean success = inventoryService.reduceStock( orderMapper.selectById(orderId).getItems()); if (!success) { throw new RuntimeException("库存不足"); } // 3. 发送物流消息 rabbitTemplate.convertAndSend( "order.exchange", "order.complete", orderId); }6. 扩展开发建议
6.1 宠物健康档案
可扩展功能模块设计:
@Entity @Table(name = "pet_health_record") public class HealthRecord { @Id @GeneratedValue(strategy = IDENTITY) private Long id; @Enumerated(EnumType.ORDINAL) private HealthIndicator indicator; // 体温/体重等 private BigDecimal value; private LocalDate recordDate; @ManyToOne @JoinColumn(name = "pet_id") private Pet pet; }6.2 智能喂养提醒
基于Quartz的任务调度实现:
public class FeedingReminderJob implements Job { @Override public void execute(JobExecutionContext context) { List<PetSchedule> schedules = scheduleMapper .selectList(new QueryWrapper<PetSchedule>() .eq("reminder_enabled", true)); schedules.forEach(schedule -> { if (shouldRemindNow(schedule)) { pushService.send(schedule.getUserId(), "该给%s喂食啦!".formatted(schedule.getPetName())); } }); } }关键提示:开发宠物类系统时,务必注意不同宠物品种的特殊需求。例如猫粮需要考虑室内/室外猫的区别,犬类商品需要区分大型犬/小型犬规格。这些业务规则应该通过数据字典进行可配置化管理。
我在实际部署中发现,宠物用品的图片资源往往体积较大,建议采用以下优化方案:
- 使用WebP格式替代JPEG,平均可减少30%体积
- 实现懒加载技术,首屏只加载可视区域图片
- 对商品详情页的图片启用CDN加速
系统后续可考虑集成宠物医院预约、宠物社区等增值服务模块,这些扩展需要特别注意用户隐私数据的保护,建议采用字段级加密方案处理敏感信息。