基于SpringBoot的在线化妆品销售平台 - 源码深度解析

JavaJavaScriptHTMLCSSSpringboot框架SSM框架MavenMySQL
2026-02-0711 浏览

文章摘要

本项目是一款基于SpringBoot框架开发的在线化妆品销售平台,旨在为消费者提供便捷、安全的一站式美妆产品购物体验。平台的核心业务价值在于解决了传统线下化妆品零售渠道信息不透明、选购过程依赖导购、以及地域性库存限制等痛点。通过数字化的商品展示、用户账户体系和在线交易流程,平台能够帮助用户高效筛选适...

随着电子商务的快速发展,化妆品行业的数字化转型已成为必然趋势。传统线下零售渠道存在信息不对称、选购依赖导购、地域库存限制等痛点,消费者难以快速找到适合自己肤质和需求的产品。本文介绍的"美妆优选"电商平台正是基于SpringBoot框架构建的现代化解决方案,通过数字化商品展示、智能推荐和在线交易功能,为用户提供便捷、安全的一站式美妆购物体验。

系统架构与技术栈

该平台采用经典的分层架构设计,前端使用HTML、CSS和JavaScript构建响应式用户界面,后端基于SpringBoot框架实现业务逻辑。数据持久化层采用MySQL数据库,通过MyBatis框架进行数据访问操作。项目使用Maven进行依赖管理,确保组件版本的一致性。

SpringBoot的自动配置特性大大简化了项目初始化过程,内嵌Tomcat服务器使得应用可以独立运行,无需外部Servlet容器。配置文件采用YAML格式,清晰定义了数据源、MyBatis映射、静态资源处理等关键配置:

server:
  port: 8080
  servlet:
    context-path: /
  
spring:
  datasource:
    url: jdbc:mysql://www.csbishe.cn/boot_zxhzpshop?useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: boot_zxhzpshop
    password: boot_zxhzpshop
  
mybatis:
  mapper-locations: classpath:com/neusoft/mapper/*.xml
  type-aliases-package: com.neusoft.po

数据库设计亮点

商品表设计优化

商品表(item)的设计体现了电商系统对商品信息管理的深度思考。该表采用宽表设计,将商品基本属性、销售数据、图片资源等集中存储,提高了查询效率:

CREATE TABLE `item` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `price` varchar(255) DEFAULT NULL COMMENT '商品价格',
  `scNum` int(11) DEFAULT NULL COMMENT '收藏数',
  `gmNum` int(11) DEFAULT NULL COMMENT '购买数',
  `url1` varchar(255) DEFAULT NULL COMMENT '图片URL1',
  `url2` varchar(255) DEFAULT NULL COMMENT '图片URL2',
  `url3` varchar(255) DEFAULT NULL COMMENT '图片URL3',
  `url4` varchar(255) DEFAULT NULL COMMENT '图片URL4',
  `url5` varchar(255) DEFAULT NULL COMMENT '图片URL5',
  `ms` text DEFAULT NULL COMMENT '商品描述',
  `pam1` varchar(255) DEFAULT NULL COMMENT '参数1',
  `pam2` varchar(255) DEFAULT NULL COMMENT '参数2',
  `pam3` varchar(255) DEFAULT NULL COMMENT '参数3',
  `val1` varchar(255) DEFAULT NULL COMMENT '值1',
  `val2` varchar(255) DEFAULT NULL COMMENT '值2',
  `val3` varchar(255) DEFAULT NULL COMMENT '值3',
  `type` int(11) DEFAULT NULL COMMENT '商品类型',
  `zk` int(10) DEFAULT NULL COMMENT '折扣',
  `category_id_one` int(11) DEFAULT NULL COMMENT '一级分类ID',
  `category_id_two` int(11) DEFAULT NULL COMMENT '二级分类ID',
  `isDelete` int(2) DEFAULT NULL COMMENT '逻辑删除标志',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8 COMMENT='商品表'

设计亮点包括:

  • 灵活的图片存储:采用url1-url5字段存储多张商品图片,支持商品详情页的轮播展示
  • 动态参数设计:通过pam1-pam3和val1-val3字段实现商品参数的灵活扩展,适应不同化妆品类型的特性描述需求
  • 分类层级管理:category_id_one和category_id_two支持二级分类体系,便于商品组织和检索
  • 软删除机制:isDelete字段实现逻辑删除,保留数据完整性

购物车表业务逻辑设计

购物车表(car)的设计充分考虑了电商场景下的并发和计算需求:

CREATE TABLE `car` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `item_id` int(11) DEFAULT NULL COMMENT '商品ID',
  `user_id` int(11) DEFAULT NULL COMMENT '用户ID',
  `num` int(11) DEFAULT NULL COMMENT '数量',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  `total` varchar(255) DEFAULT NULL COMMENT '总价',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COMMENT='购物车表'

关键设计特点:

  • 价格精度控制:price字段使用decimal(10,2)类型,确保金额计算的准确性
  • 冗余字段优化:total字段预计算商品总价,减少实时计算开销
  • 组合索引建议:建议为(user_id, item_id)创建组合索引,提升购物车查询性能

购物车功能

核心功能实现

基础控制器设计

平台采用统一的基类控制器设计,提供通用的响应处理和数据校验方法:

package com.neusoft.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;

public class BaseController {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());
    
    protected final static String DATE_FORMATE = "yyyy-MM-dd";

    public String responseResult(Object obj) {
        String jsonObj = null;
        if (obj != null) {
            logger.info("后端返回对象:{}", obj);
            jsonObj = JSONObject.toJSONString(obj);
            logger.info("后端返回数据:" + jsonObj);
        }
        logger.info("输出结果:{}", jsonObj);
        return jsonObj;
    }

    // 空值校验工具方法
    public boolean isEmpty(String str) {
        return (null == str) || (str.trim().length() <= 0);
    }
    
    public boolean isEmpty(Object obj) {
        return (null == obj);
    }
    
    public boolean isEmpty(Collection<?> obj) {
        return (null == obj) || obj.isEmpty();
    }
    
    public boolean isEmpty(Map<?, ?> map) {
        return (null == map) || map.isEmpty();
    }
    
    public Map<String,Object> getMap(){
        return new HashMap<String,Object>();
    }
}

商品收藏功能实现

收藏功能通过sc表实现用户与商品的多对多关系,业务逻辑层处理收藏状态的切换:

@Service
public class ItemService {
    
    @Autowired
    private ScMapper scMapper;
    
    @Autowired
    private ItemMapper itemMapper;
    
    public Map<String, Object> toggleFavorite(Integer itemId, Integer userId) {
        Map<String, Object> result = new HashMap<>();
        
        // 检查是否已收藏
        Sc existingFavorite = scMapper.selectByUserAndItem(userId, itemId);
        
        if (existingFavorite != null) {
            // 取消收藏
            scMapper.deleteById(existingFavorite.getId());
            itemMapper.decreaseScNum(itemId);
            result.put("status", "removed");
        } else {
            // 添加收藏
            Sc newFavorite = new Sc();
            newFavorite.setItemId(itemId);
            newFavorite.setUserId(userId);
            scMapper.insert(newFavorite);
            itemMapper.increaseScNum(itemId);
            result.put("status", "added");
        }
        
        // 获取更新后的收藏数
        Item item = itemMapper.selectById(itemId);
        result.put("scNum", item.getScNum());
        
        return result;
    }
}

收藏管理

购物车业务逻辑

购物车服务实现商品添加、数量修改、价格计算等核心功能:

@Service
@Transactional
public class CartService {
    
    @Autowired
    private CarMapper carMapper;
    
    @Autowired
    private ItemMapper itemMapper;
    
    public void addToCart(Integer itemId, Integer userId, Integer quantity) {
        // 检查商品是否存在且可用
        Item item = itemMapper.selectById(itemId);
        if (item == null || item.getIsDelete() == 1) {
            throw new BusinessException("商品不存在或已下架");
        }
        
        // 检查购物车中是否已有该商品
        Car existingItem = carMapper.selectByUserAndItem(userId, itemId);
        
        if (existingItem != null) {
            // 更新数量
            int newQuantity = existingItem.getNum() + quantity;
            BigDecimal newTotal = item.getPrice().multiply(new BigDecimal(newQuantity));
            
            existingItem.setNum(newQuantity);
            existingItem.setTotal(newTotal.toString());
            carMapper.update(existingItem);
        } else {
            // 新增购物车项
            Car newItem = new Car();
            newItem.setItemId(itemId);
            newItem.setUserId(userId);
            newItem.setNum(quantity);
            newItem.setPrice(item.getPrice());
            newItem.setTotal(item.getPrice().multiply(new BigDecimal(quantity)).toString());
            
            carMapper.insert(newItem);
        }
    }
    
    public List<CartVO> getCartItems(Integer userId) {
        List<Car> cartItems = carMapper.selectByUserId(userId);
        return cartItems.stream().map(item -> {
            CartVO vo = new CartVO();
            Item product = itemMapper.selectById(item.getItemId());
            
            vo.setId(item.getId());
            vo.setItemId(item.getItemId());
            vo.setProductName(product.getName());
            vo.setPrice(item.getPrice());
            vo.setQuantity(item.getNum());
            vo.setTotalPrice(new BigDecimal(item.getTotal()));
            vo.setImageUrl(product.getUrl1());
            
            return vo;
        }).collect(Collectors.toList());
    }
}

订单管理系统

订单处理涉及复杂的业务流程,包括库存检查、价格计算、状态跟踪等:

@Service
@Transactional
public class OrderService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private OrderItemMapper orderItemMapper;
    
    @Autowired
    private ItemMapper itemMapper;
    
    public Order createOrder(OrderDTO orderDTO, Integer userId) {
        // 验证购物车商品
        List<OrderItemDTO> items = validateCartItems(orderDTO.getCartItemIds());
        
        // 计算总金额
        BigDecimal totalAmount = calculateTotalAmount(items);
        
        // 创建订单
        Order order = new Order();
        order.setOrderNo(generateOrderNo());
        order.setUserId(userId);
        order.setTotalAmount(totalAmount);
        order.setStatus(OrderStatus.PENDING_PAYMENT);
        order.setCreateTime(new Date());
        
        orderMapper.insert(order);
        
        // 创建订单明细
        for (OrderItemDTO item : items) {
            OrderItem orderItem = new OrderItem();
            orderItem.setOrderId(order.getId());
            orderItem.setItemId(item.getItemId());
            orderItem.setQuantity(item.getQuantity());
            orderItem.setPrice(item.getPrice());
            orderItem.setSubTotal(item.getSubTotal());
            
            orderItemMapper.insert(orderItem);
            
            // 减少库存
            itemMapper.decreaseStock(item.getItemId(), item.getQuantity());
        }
        
        return order;
    }
    
    private String generateOrderNo() {
        return "ORD" + System.currentTimeMillis() + 
               String.valueOf(new Random().nextInt(9000) + 1000);
    }
}

订单管理

用户评论系统

评论功能增强用户互动和商品可信度,采用分层架构设计:

@RestController
@RequestMapping("/api/comment")
public class CommentController extends BaseController {
    
    @Autowired
    private CommentService commentService;
    
    @PostMapping("/add")
    public String addComment(@RequestBody CommentDTO commentDTO) {
        try {
            Comment comment = commentService.addComment(commentDTO);
            return responseResult(Result.success("评论成功", comment));
        } catch (BusinessException e) {
            return responseResult(Result.error(e.getMessage()));
        }
    }
    
    @GetMapping("/item/{itemId}")
    public String getItemComments(@PathVariable Integer itemId,
                                 @RequestParam(defaultValue = "1") Integer page,
                                 @RequestParam(defaultValue = "10") Integer size) {
        Page<CommentVO> comments = commentService.getItemComments(itemId, page, size);
        return responseResult(Result.success(comments));
    }
}

@Entity
@Table(name = "comment")
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    private Integer userId;
    private Integer itemId;
    private String content;
    private Date addTime;
    
    // getters and setters
}

实体模型设计

系统采用面向对象的设计思想,核心实体模型之间的关系清晰明确:

  • 用户实体:作为系统核心,与订单、收藏、评论等建立一对多关系
  • 商品实体:作为商品核心,通过分类体系组织,与订单、收藏、评论建立关联
  • 订单实体:作为交易核心,包含订单状态、金额等关键业务属性
  • 分类实体:支持二级分类体系,实现商品的有效组织和管理

实体间的关系通过外键约束确保数据一致性,同时业务逻辑层维护复杂的业务规则。

商品详情

功能展望与优化

性能优化方向

  1. 引入Redis缓存层
    • 实现热点商品数据的缓存,减少数据库压力
    • 使用Redis存储用户会话和购物车数据,支持分布式部署
    • 实现商品搜索结果的缓存,提升搜索响应速度
@Service
public class CacheService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    public Item getItemWithCache(Integer itemId) {
        String key = "item:" + itemId;
        Item item = (Item) redisTemplate.opsForValue().get(key);
        
        if (item == null) {
            item = itemMapper.selectById(itemId);
            if (item != null) {
                redisTemplate.opsForValue().set(key, item, Duration.ofHours(1));
            }
        }
        return item;
    }
}
  1. ** Elasticsearch搜索优化**
    • 实现商品全文检索,支持拼音、同义词搜索
    • 构建复杂的筛选条件,如按肤质、功效、价格区间等多维搜索
    • 实现搜索词建议和热门搜索推荐

架构升级建议

  1. 微服务架构改造

    • 将单体应用拆分为用户服务、商品服务、订单服务、支付服务等独立微服务
    • 使用Spring Cloud实现服务注册发现、配置中心、网关路由等功能
    • 引入消息队列(如RabbitMQ)处理异步任务,如订单通知、库存同步等
  2. 移动端适配扩展

    • 开发React Native或Flutter移动应用,提供更好的移动端体验
    • 实现PWA(渐进式Web应用),支持离线访问和推送通知
    • 优化API设计,支持GraphQL查询语言,减少网络请求次数

业务功能增强

  1. 智能推荐系统
    • 基于用户行为数据实现协同过滤推荐
    • 利用机器学习算法分析用户肤质和偏好,提供个性化产品推荐
    • 构建知识图谱,实现成分分析和产品搭配建议

用户管理

总结

美妆优选电商平台通过SpringBoot框架实现了完整的在线化妆品销售解决方案。系统采用分层架构设计,数据库设计充分考虑业务需求,核心功能实现完整且健壮。控制器基类提供了统一的响应处理机制,业务逻辑层封装了复杂的业务规则,数据访问层通过MyBatis实现高效的数据操作。

平台支持商品展示、购物车管理、订单处理、用户评论等核心电商功能,同时为管理员提供了完善的后台管理系统。在性能优化和功能扩展方面,系统具有良好的可扩展性,为后续的技术升级和业务发展奠定了坚实基础。

通过持续的技术优化和功能迭代,该平台有望成为化妆品行业数字化转型的标杆解决方案,为消费者和商家创造更大的价值。未来的发展方向包括引入更先进的技术栈、优化用户体验、扩展商业模式等,这些都将进一步提升平台的竞争力和市场影响力。

本文关键词
SpringBoot源码化妆品电商平台MySQL数据库设计MyBatis框架电商系统架构

上下篇

上一篇
没有更多文章
下一篇
没有更多文章