基于SSM框架的在线鲜花商城系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MySQL
2026-02-0810 浏览

文章摘要

基于SSM框架的在线鲜花商城系统是一个面向现代花卉零售行业的综合性电子商务平台,旨在解决传统鲜花销售中信息不透明、选购流程繁琐、订单处理效率低下的核心痛点。系统通过标准化的商品展示与智能化的订单管理,帮助商家降低运营成本、提升客户购物体验,同时为消费者提供便捷、直观的鲜花选购与跟踪服务。其核心业务价...

在现代花卉零售行业数字化转型的浪潮中,传统鲜花销售模式面临着信息不透明、选购流程繁琐、订单处理效率低下的挑战。针对这些痛点,我们设计并实现了一个基于SSM框架的企业级鲜花电商平台,该系统通过标准化的商品展示与智能化的订单管理,为商家和消费者构建了一个高效、便捷的交易环境。

系统架构与技术栈选型

该平台采用经典的SSM(Spring+SpringMVC+MyBatis)框架组合,构建了分层清晰、可维护性强的系统架构。Spring框架负责业务对象管理和事务控制,通过依赖注入和面向切面编程实现了松耦合的组件管理。SpringMVC作为Web层框架,采用前端控制器模式处理用户请求与页面跳转,实现了请求响应的标准化处理。MyBatis作为数据持久层框架,通过XML映射文件灵活配置SQL语句,支持动态查询与结果集封装。

技术栈配置如下:

<!-- Spring核心依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.8</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.8</version>
</dependency>

<!-- MyBatis集成 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>

系统严格遵循MVC设计模式,代码结构分为实体层、DAO层、服务层和控制器层。实体层对应数据库表结构,DAO层负责数据访问逻辑,服务层封装业务规则,控制器层处理HTTP请求和响应。这种分层架构便于团队协作开发与功能扩展维护。

数据库设计亮点分析

商品表(goods)的设计优化

商品表作为系统的核心数据表,其设计体现了多个优化考量:

CREATE TABLE `goods` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `cover` varchar(255) DEFAULT NULL COMMENT '封面',
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `intro` varchar(255) DEFAULT NULL COMMENT '介绍',
  `spec` varchar(255) DEFAULT NULL COMMENT '规格',
  `price` int(11) NOT NULL DEFAULT 0 COMMENT '价格',
  `stock` int(11) NOT NULL DEFAULT 0 COMMENT '库存',
  `sales` int(11) NOT NULL DEFAULT 0 COMMENT '销量',
  `content` text DEFAULT NULL COMMENT '详情',
  `type_id` int(11) NOT NULL DEFAULT 0 COMMENT '分类ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8 COMMENT='商品'

设计亮点分析:

  1. 价格字段优化:使用int(11)类型存储价格,以分为单位,避免浮点数计算精度问题
  2. 索引策略:主键采用自增ID,同时建议为type_idsales字段添加复合索引,提升分类查询和热销商品排序性能
  3. 存储引擎选择:使用InnoDB引擎支持事务处理,确保库存扣减等操作的原子性
  4. 字段长度规划nameintro字段采用varchar(255)长度,平衡存储效率与业务需求

订单表(orders)的事务完整性设计

订单表的设计重点考虑了电商业务的事务完整性要求:

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `total` int(11) NOT NULL DEFAULT 0 COMMENT '订单金额',
  `amount` int(11) NOT NULL DEFAULT 0 COMMENT '商品总数',
  `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '订单状态(1未付款/2已付款/3已发货/4已完成)',
  `paytype` tinyint(4) NOT NULL DEFAULT 0 COMMENT '支付方式 (1微信/2支付宝/3积分)',
  `name` varchar(255) DEFAULT NULL COMMENT '收货人',
  `phone` varchar(255) DEFAULT NULL COMMENT '收货电话',
  `address` varchar(255) DEFAULT NULL COMMENT '收货地址',
  `systime` datetime DEFAULT NULL COMMENT '下单时间',
  `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '下单用户ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8 COMMENT='订单'

事务完整性保障:

  • 状态字段使用tinyint类型,通过枚举值确保状态流转的规范性
  • 金额字段统一使用整数类型,避免金额计算误差
  • 时间戳字段记录完整的订单生命周期
  • 用户ID外键关联确保数据一致性

订单管理界面

推荐商品表(tops)的灵活扩展设计

推荐系统采用可扩展的表结构设计:

CREATE TABLE `tops` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '推荐类型(1今日推荐)',
  `good_id` int(11) NOT NULL DEFAULT 0 COMMENT '商品ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='推荐商品'

该设计支持多种推荐类型扩展,通过type字段区分不同的推荐策略,为后续个性化推荐功能预留了扩展空间。

核心功能实现详解

1. 管理员权限控制与登录机制

系统采用Session-based的身份认证机制,管理员控制器实现了完整的登录验证流程:

@Controller
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    private AdminService adminService;

    /**
     * 管理员登录处理
     */
    @PostMapping("/login")
    public String login(String username, String password, 
            HttpServletRequest request, HttpSession session) {
        Admins admin = adminService.getByUsernameAndPassword(username, password);
        if (Objects.nonNull(admin)) {
            session.setAttribute("admin", admin);
            return "redirect:index";
        }
        request.setAttribute("msg", "用户名或密码错误!");
        return "/admin/login.jsp";
    }

    /**
     * 安全退出机制
     */
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        session.removeAttribute("admin");
        return "/admin/login.jsp";
    }
}

管理员登录界面

2. 商品分类管理的层级设计

分类管理采用扁平化结构,支持动态排序功能:

@Service
public class TypeServiceImpl implements TypeService {
    
    @Autowired
    private TypeMapper typeMapper;
    
    @Override
    public List<Types> getList() {
        // 按照排序号升序排列,支持自定义分类显示顺序
        return typeMapper.selectByExample(new TypesExample() {{
            setOrderByClause("num ASC");
        }});
    }
    
    @Override
    @Transactional
    public void add(Types type) throws Exception {
        // 验证分类名称唯一性
        if (typeMapper.countByName(type.getName()) > 0) {
            throw new Exception("分类名称已存在");
        }
        typeMapper.insertSelective(type);
    }
}

对应的分类表结构支持灵活的排序机制:

CREATE TABLE `types` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(50) DEFAULT NULL COMMENT '名称',
  `num` int(11) DEFAULT 0 COMMENT '排序号 (从小到大)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='分类'

分类管理界面

3. 购物车功能的并发控制

购物车模块实现了商品数量的实时更新和并发安全控制:

@Service
public class CartServiceImpl implements CartService {
    
    @Autowired
    private CartMapper cartMapper;
    
    @Autowired
    private GoodMapper goodMapper;
    
    @Override
    @Transactional
    public void addOrUpdate(Carts cart) {
        // 检查商品库存
        Goods goods = goodMapper.selectByPrimaryKey(cart.getGoodId());
        if (goods.getStock() < cart.getAmount()) {
            throw new RuntimeException("商品库存不足");
        }
        
        // 查询用户是否已有该商品的购物车记录
        CartsExample example = new CartsExample();
        example.createCriteria()
            .andUserIdEqualTo(cart.getUserId())
            .andGoodIdEqualTo(cart.getGoodId());
        List<Carts> existingCarts = cartMapper.selectByExample(example);
        
        if (existingCarts.isEmpty()) {
            // 新增购物车记录
            cartMapper.insertSelective(cart);
        } else {
            // 更新已有记录数量
            Carts existingCart = existingCarts.get(0);
            existingCart.setAmount(existingCart.getAmount() + cart.getAmount());
            cartMapper.updateByPrimaryKey(existingCart);
        }
    }
}

购物车界面

4. 订单状态机与业务流程

订单系统实现了完整的状态流转机制:

@Service
public class OrderServiceImpl implements OrderService {
    
    private static final Map<Integer, String> STATUS_MAP = new HashMap<>();
    static {
        STATUS_MAP.put(1, "未付款");
        STATUS_MAP.put(2, "已付款");
        STATUS_MAP.put(3, "已发货");
        STATUS_MAP.put(4, "已完成");
    }
    
    @Override
    @Transactional
    public void createOrder(Orders order, List<Carts> cartItems) {
        // 1. 验证库存
        for (Carts cart : cartItems) {
            Goods goods = goodMapper.selectByPrimaryKey(cart.getGoodId());
            if (goods.getStock() < cart.getAmount()) {
                throw new RuntimeException("商品[" + goods.getName() + "]库存不足");
            }
        }
        
        // 2. 创建订单
        order.setSystime(new Date());
        order.setStatus(1); // 未付款状态
        orderMapper.insertSelective(order);
        
        // 3. 扣减库存并生成订单项
        for (Carts cart : cartItems) {
            // 扣减库存
            goodMapper.decreaseStock(cart.getGoodId(), cart.getAmount());
            // 生成订单项记录
            OrderItems item = new OrderItems();
            item.setOrderId(order.getId());
            item.setGoodId(cart.getGoodId());
            item.setAmount(cart.getAmount());
            orderItemMapper.insertSelective(item);
        }
        
        // 4. 清空购物车
        cartMapper.deleteByUserId(order.getUserId());
    }
}

订单详情界面

5. 商品详情页的动态渲染

商品详情页面通过JSP动态渲染技术展示完整的商品信息:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div class="product-detail">
    <div class="product-image">
        <img src="${pageContext.request.contextPath}${good.cover}" 
             alt="${good.name}" class="img-responsive">
    </div>
    <div class="product-info">
        <h2>${good.name}</h2>
        <p class="intro">${good.intro}</p>
        <div class="specification">
            <span>规格:${good.spec}</span>
        </div>
        <div class="price-section">
            <span class="price">¥${good.price / 100}</span>
            <span class="stock">库存:${good.stock}件</span>
        </div>
        <div class="action-buttons">
            <input type="number" id="quantity" value="1" min="1" max="${good.stock}">
            <button onclick="addToCart(${good.id})" class="btn-cart">加入购物车</button>
        </div>
    </div>
</div>

<script>
function addToCart(goodId) {
    const quantity = parseInt($('#quantity').val());
    $.post('${pageContext.request.contextPath}/cart/add', {
        goodId: goodId,
        amount: quantity
    }, function(response) {
        if (response.success) {
            alert('添加购物车成功');
        } else {
            alert('添加失败:' + response.message);
        }
    });
}
</script>

商品详情界面

实体模型设计规范

系统实体类严格遵循JavaBean规范,支持Spring的依赖注入和MyBatis的自动映射:

package com.entity;

public class Admins {
    private int id;
    private String username;
    private String password;
    private String passwordNew;

    // Getter和Setter方法符合JavaBean规范
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }
    
    // 业务逻辑相关方法
    public boolean validatePassword(String inputPassword) {
        return this.password.equals(hashPassword(inputPassword));
    }
}

功能展望与系统优化方向

1. 引入Redis缓存提升性能

实现方案:为商品信息、分类数据等高频读取数据建立多级缓存策略

@Service
public class CachedGoodService {
    
    @Autowired
    private RedisTemplate<String, Goods> redisTemplate;
    
    private static final String GOODS_CACHE_KEY = "goods:";
    private static final long CACHE_EXPIRE = 3600; // 1小时
    
    public Goods getGoodsWithCache(int id) {
        String cacheKey = GOODS_CACHE_KEY + id;
        Goods goods = redisTemplate.opsForValue().get(cacheKey);
        if (goods == null) {
            goods = goodMapper.selectByPrimaryKey(id);
            if (goods != null) {
                redisTemplate.opsForValue().set(cacheKey, goods, 
                    CACHE_EXPIRE, TimeUnit.SECONDS);
            }
        }
        return goods;
    }
}

2. 消息队列实现异步订单处理

技术选型:采用RabbitMQ或RocketMQ处理高并发订单

@Component
public class OrderMessageProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendOrderCreateMessage(Orders order) {
        rabbitTemplate.convertAndSend("order.exchange", 
            "order.create", order.getId());
    }
}

@Component
public class OrderMessageConsumer {
    
    @RabbitListener(queues = "order.queue")
    public void processOrderCreate(Integer orderId) {
        // 异步处理库存扣减、日志记录等耗时操作
        inventoryService.decreaseStockAsync(orderId);
        logService.recordOrderLog(orderId);
    }
}

3. 微服务架构改造

架构规划:将单体应用拆分为商品服务、订单服务、用户服务等独立微服务

# Spring Cloud配置示例
spring:
  application:
    name: flower-mall-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        - id: product-service
          uri: lb://product-service
          predicates:
            - Path=/api/product/**
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**

4. 移动端适配与PWA支持

技术实现:采用响应式设计 + Service Worker技术

// 注册Service Worker实现离线缓存
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js')
        .then(registration => {
            console.log('SW registered: ', registration);
        });
}

5. 智能推荐算法集成

算法方案:基于用户行为数据的协同过滤推荐

# Python推荐算法示例(可通过微服务接口集成)
def recommend_flowers(user_id, top_n=10):
    # 基于用户历史购买记录和相似用户行为
    user_vector = build_user_vector(user_id)
    similar_users = find_similar_users(user_vector)
    return generate_recommendations(similar_users, top_n)

该鲜花电商平台通过严谨的架构设计和精细的功能实现,为传统花卉零售企业提供了完整的数字化转型解决方案。系统在保证稳定性的同时,具有良好的扩展性和可维护性,为后续的技术演进和业务拓展奠定了坚实基础。

本文关键词
SSM框架在线鲜花商城源码解析数据库设计系统架构

上下篇

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