基于SSM框架的在线折扣商城管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架JSP+ServletMySQL
2026-02-0710 浏览

文章摘要

本项目是基于SSM(Spring+SpringMVC+MyBatis)框架开发的在线折扣商城管理系统,旨在为中小型电商企业或品牌特卖平台提供一套功能完整、稳定可靠的后台运营支撑方案。系统核心解决了传统折扣商品管理中信息更新滞后、订单处理效率低下、人工操作易出错等痛点,通过标准化的业务流程与自动化的状...

在电子商务蓬勃发展的今天,折扣商品市场以其独特的吸引力占据了重要份额。针对中小型电商企业与品牌特卖平台在商品管理、订单处理等环节面临的效率低下、信息同步滞后等痛点,一套基于SSM(Spring + SpringMVC + MyBatis)框架的企业级折扣商城运营管理平台应运而生。该平台通过标准化的业务流程与自动化的状态流转,为运营人员提供了高效、可靠的后台支撑。

系统架构与技术栈

该平台采用经典的三层架构模式,实现了前后端分离与职责明确的分工。

  • 表现层:使用JSP与Servlet技术结合HTML、CSS、JavaScript构建用户界面,SpringMVC框架负责请求路由、参数绑定与视图解析。
  • 业务逻辑层:Spring框架作为IoC容器,管理Service组件的生命周期,并通过声明式事务管理确保业务操作的数据一致性。
  • 数据持久层:MyBatis框架通过XML映射文件实现灵活的SQL编写与结果集自动映射,支持动态SQL生成。

技术栈配置示例(pom.xml核心依赖):

<dependencies>
    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    
    <!-- MyBatis与Spring整合 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.5</version>
    </dependency>
    
    <!-- 数据库连接 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    
    <!-- 视图层支持 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

SpringMVC配置(spring-mvc.xml):

<!-- 注解驱动 -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<!-- 静态资源处理 -->
<mvc:resources mapping="/static/**" location="/static/" />

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

数据库设计亮点分析

系统采用MySQL数据库,设计了18张业务表,围绕商品、订单、用户三大核心实体建立关联关系。

商品信息表(shujixinxi)设计剖析

CREATE TABLE `shujixinxi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `shujibianhao` varchar(50) NOT NULL COMMENT '书籍编号',
  `shujimingcheng` varchar(255) NOT NULL COMMENT '书籍名称',
  `fenlei` int(10) unsigned NOT NULL COMMENT '分类',
  `shujitupian` text NOT NULL COMMENT '书籍图片',
  `xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
  `kucun` int(11) NOT NULL COMMENT '库存',
  `zuozhe` varchar(50) NOT NULL COMMENT '作者',
  `chubanshe` varchar(50) NOT NULL COMMENT '出版社',
  `shujixiangqing` longtext NOT NULL COMMENT '书籍详情',
  `tianjiaren` varchar(50) NOT NULL COMMENT '添加人',
  `addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
  `shichangjiage` varchar(50) NOT NULL COMMENT '市场价格',
  PRIMARY KEY (`id`),
  KEY `shujixinxi_fenlei_index` (`fenlei`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='书籍信息'

设计亮点

  1. 价格字段精度控制xiaoshoujiage使用decimal(18,2)类型,确保金额计算的精确性,避免浮点数精度问题
  2. 文本字段优化:商品详情使用longtext类型,支持大容量商品描述,而图片字段使用text类型存储图片路径
  3. 索引策略:在fenlei字段建立索引,加速按分类查询商品的速度,提升前台商品列表页的加载性能
  4. 默认时间戳addtime字段设置默认值为当前时间,简化数据插入操作

订单信息表(dingdanxinxi)与关联表设计

CREATE TABLE `dingdanxinxi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dingdanbianhao` varchar(50) NOT NULL COMMENT '订单编号',
  `dingdanxinxi` text NOT NULL COMMENT '订单信息',
  `zongjijine` decimal(18,2) NOT NULL COMMENT '总计金额',
  `shouhuoren` varchar(50) NOT NULL COMMENT '收货人',
  `dianhua` varchar(50) NOT NULL COMMENT '电话',
  `dizhi` varchar(255) NOT NULL COMMENT '地址',
  `beizhu` text NOT NULL COMMENT '备注',
  `zhuangtai` varchar(255) NOT NULL COMMENT '状态',
  `xiadanren` varchar(50) NOT NULL COMMENT '下单人',
  `iszf` varchar(10) NOT NULL DEFAULT '否' COMMENT '是否支付',
  `addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单信息表'

CREATE TABLE `dingdanqianshou_dingdanxinxi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dingdanqianshouid` int(10) unsigned NOT NULL COMMENT '签收信息ID',
  `shujixinxiid` int(10) unsigned NOT NULL COMMENT '图书ID',
  `shujibianhao` varchar(50) NOT NULL COMMENT '书籍编号',
  `shujimingcheng` varchar(255) NOT NULL COMMENT '书籍名称',
  `fenlei` int(10) unsigned NOT NULL COMMENT '分类',
  `xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
  `goumaishuliang` int(11) NOT NULL COMMENT '购买数量',
  `xiaoji` decimal(18,2) NOT NULL COMMENT '小计',
  `addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
  PRIMARY KEY (`id`),
  KEY `dingdanqianshou_dingdanxinxi_fenlei_index` (`fenlei`),
  KEY `dingdanqianshou_dingdanxinxi_dingdanqianshouid_index` (`dingdanqianshouid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单签收关联表'

设计亮点

  1. 订单状态管理zhuangtai字段支持多种订单状态(待付款、已付款、已发货、已完成等),iszf字段单独标记支付状态
  2. 关联表设计:订单签收关联表采用外键关联,实现订单数据的规范化存储,避免数据冗余
  3. 金额计算xiaoji字段存储商品小计金额,zongjijine存储订单总金额,支持复杂的促销计算
  4. 地址信息分离:收货人、电话、地址字段独立设计,便于后续的地址管理功能扩展

订单信息管理

核心功能实现深度解析

1. 购物车管理模块

购物车表(gouwuche)设计支持多用户并发操作:

CREATE TABLE `gouwuche` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `shujixinxiid` int(10) unsigned NOT NULL COMMENT '书籍信息id',
  `shujibianhao` varchar(50) NOT NULL COMMENT '书籍编号',
  `shujimingcheng` varchar(255) NOT NULL COMMENT '书籍名称',
  `fenlei` int(10) unsigned NOT NULL COMMENT '分类',
  `xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
  `goumaishuliang` int(11) NOT NULL COMMENT '购买数量',
  `xiaoji` decimal(18,2) NOT NULL COMMENT '小计',
  `goumairen` varchar(50) NOT NULL COMMENT '购买人',
  `addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
  PRIMARY KEY (`id`),
  KEY `gouwuche_shujixinxiid_index` (`shujixinxiid`),
  KEY `gouwuche_fenlei_index` (`fenlei`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='购物车'

购物车控制器实现代码:

@Controller
@RequestMapping("/gouwuche")
public class GouwucheController extends BaseController {
    
    @Autowired
    private GouwucheService gouwucheService;
    
    @Autowired
    private ShujixinxiService shujixinxiService;
    
    /**
     * 添加商品到购物车
     */
    @RequestMapping("/add")
    @ResponseBody
    public Map<String, Object> add() {
        Map<String, Object> map = new HashMap<>();
        
        // 获取当前登录用户
        String username = (String) request.getSession().getAttribute("username");
        if (username == null) {
            map.put("error", "请先登录");
            return map;
        }
        
        // 获取商品ID和购买数量
        Integer shujixinxiid = Request.getInt("shujixinxiid");
        Integer goumaishuliang = Request.getInt("goumaishuliang", 1);
        
        // 查询商品信息
        Shujixinxi shujixinxi = shujixinxiService.find(shujixinxiid);
        if (shujixinxi == null) {
            map.put("error", "商品不存在");
            return map;
        }
        
        // 检查库存
        if (shujixinxi.getKucun() < goumaishuliang) {
            map.put("error", "库存不足");
            return map;
        }
        
        // 检查购物车中是否已存在该商品
        Example example = new Example(Gouwuche.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("shujixinxiid", shujixinxiid);
        criteria.andEqualTo("goumairen", username);
        List<Gouwuche> list = gouwucheService.selectExample(example);
        
        if (list.size() > 0) {
            // 更新数量
            Gouwuche gouwuche = list.get(0);
            gouwuche.setGoumaishuliang(gouwuche.getGoumaishuliang() + goumaishuliang);
            gouwuche.setXiaoji(gouwuche.getXiaoshoujiage().multiply(
                new BigDecimal(gouwuche.getGoumaishuliang())));
            gouwucheService.update(gouwuche);
        } else {
            // 新增购物车记录
            Gouwuche gouwuche = new Gouwuche();
            gouwuche.setShujixinxiid(shujixinxiid);
            gouwuche.setShujibianhao(shujixinxi.getShujibianhao());
            gouwuche.setShujimingcheng(shujixinxi.getShujimingcheng());
            gouwuche.setFenlei(shujixinxi.getFenlei());
            gouwuche.setXiaoshoujiage(shujixinxi.getXiaoshoujiage());
            gouwuche.setGoumaishuliang(goumaishuliang);
            gouwuche.setXiaoji(shujixinxi.getXiaoshoujiage().multiply(
                new BigDecimal(goumaishuliang)));
            gouwuche.setGoumairen(username);
            gouwucheService.insert(gouwuche);
        }
        
        map.put("success", true);
        return map;
    }
    
    /**
     * 购物车列表
     */
    @RequestMapping("/list")
    public String list() {
        String username = (String) request.getSession().getAttribute("username");
        if (username == null) {
            return showError("请先登录", "../login.do");
        }
        
        Example example = new Example(Gouwuche.class);
        example.createCriteria().andEqualTo("goumairen", username);
        example.orderBy("addtime").desc();
        
        List<Gouwuche> list = gouwucheService.selectExample(example);
        
        // 计算总金额
        BigDecimal zongjine = BigDecimal.ZERO;
        for (Gouwuche item : list) {
            zongjine = zongjine.add(item.getXiaoji());
        }
        
        request.setAttribute("list", list);
        request.setAttribute("zongjine", zongjine);
        return "gouwuche_list";
    }
}

购物车管理

2. 订单处理流程

订单创建Service层实现,包含完整的业务逻辑校验:

@Service
@Transactional
public class DingdanxinxiService {
    
    @Autowired
    private DingdanxinxiMapper dao;
    
    @Autowired
    private GouwucheService gouwucheService;
    
    @Autowired
    private ShujixinxiService shujixinxiService;
    
    /**
     * 创建订单
     */
    public Map<String, Object> createOrder(String username, 
                                         String shouhuoren, 
                                         String dianhua, 
                                         String dizhi, 
                                         String beizhu) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 1. 查询用户购物车
            Example example = new Example(Gouwuche.class);
            example.createCriteria().andEqualTo("goumairen", username);
            List<Gouwuche> cartItems = gouwucheService.selectExample(example);
            
            if (cartItems.isEmpty()) {
                result.put("success", false);
                result.put("message", "购物车为空");
                return result;
            }
            
            // 2. 生成订单编号
            String dingdanbianhao = "DD" + System.currentTimeMillis() + 
                                  new Random().nextInt(1000);
            
            // 3. 计算总金额并验证库存
            BigDecimal zongjijine = BigDecimal.ZERO;
            StringBuilder dingdanxinxi = new StringBuilder();
            
            for (Gouwuche item : cartItems) {
                Shujixinxi goods = shujixinxiService.find(item.getShujixinxiid());
                if (goods.getKucun() < item.getGoumaishuliang()) {
                    throw new RuntimeException("商品【" + goods.getShujimingcheng() + 
                                            "】库存不足");
                }
                zongjijine = zongjijine.add(item.getXiaoji());
                dingdanxinxi.append(goods.getShujimingcheng())
                           .append(" x").append(item.getGoumaishuliang())
                           .append(";");
            }
            
            // 4. 创建订单主记录
            Dingdanxinxi order = new Dingdanxinxi();
            order.setDingdanbianhao(dingdanbianhao);
            order.setDingdanxinxi(dingdanxinxi.toString());
            order.setZongjijine(zongjijine);
            order.setShouhuoren(shouhuoren);
            order.setDianhua(dianhua);
            order.setDizhi(dizhi);
            order.setBeizhu(beizhu);
            order.setZhuangtai("待付款");
            order.setXiadanren(username);
            order.setIszf("否");
            dao.insert(order);
            
            // 5. 扣减库存
            for (Gouwuche item : cartItems) {
                Shujixinxi goods = shujixinxiService.find(item.getShujixinxiid());
                goods.setKucun(goods.getKucun() - item.getGoumaishuliang());
                shujixinxiService.update(goods);
            }
            
            // 6. 清空购物车
            Example delExample = new Example(Gouwuche.class);
            delExample.createCriteria().andEqualTo("goumairen", username);
            gouwucheService.deleteExample(delExample);
            
            result.put("success", true);
            result.put("dingdanbianhao", dingdanbianhao);
            result.put("message", "订单创建成功");
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "订单创建失败: " + e.getMessage());
            // Spring声明式事务会自动回滚
            throw new RuntimeException(e);
        }
        
        return result;
    }
}

确认订单

3. 商品信息管理

商品管理控制器实现完整的CRUD操作:

@Controller
@RequestMapping("/shujixinxi")
public class ShujixinxiController extends BaseController {
    
    @Autowired
    private ShujixinxiService service;
    
    /**
     * 商品列表页(带搜索功能)
     */
    @RequestMapping("/list")
    public String list() {
        if (!
本文关键词
SSM框架在线商城系统源码解析折扣商城管理数据库设计

上下篇

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