在电子商务蓬勃发展的今天,折扣商品市场以其独特的吸引力占据了重要份额。针对中小型电商企业与品牌特卖平台在商品管理、订单处理等环节面临的效率低下、信息同步滞后等痛点,一套基于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='书籍信息'
设计亮点:
- 价格字段精度控制:
xiaoshoujiage使用decimal(18,2)类型,确保金额计算的精确性,避免浮点数精度问题 - 文本字段优化:商品详情使用
longtext类型,支持大容量商品描述,而图片字段使用text类型存储图片路径 - 索引策略:在
fenlei字段建立索引,加速按分类查询商品的速度,提升前台商品列表页的加载性能 - 默认时间戳:
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='订单签收关联表'
设计亮点:
- 订单状态管理:
zhuangtai字段支持多种订单状态(待付款、已付款、已发货、已完成等),iszf字段单独标记支付状态 - 关联表设计:订单签收关联表采用外键关联,实现订单数据的规范化存储,避免数据冗余
- 金额计算:
xiaoji字段存储商品小计金额,zongjijine存储订单总金额,支持复杂的促销计算 - 地址信息分离:收货人、电话、地址字段独立设计,便于后续的地址管理功能扩展

核心功能实现深度解析
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 (!