基于SSM框架的在线女装销售商城系统 - 源码深度解析
随着电子商务的蓬勃发展,传统服装零售行业正面临着数字化转型的迫切需求。时尚女装电商平台应运而生,该系统采用经典的SSM(Spring + SpringMVC + MyBatis)框架架构,为中小型女装品牌商提供了一套完整的线上销售解决方案。本文将深入解析该系统的技术实现细节。
系统架构与技术栈
该平台采用典型的三层架构设计,实现了前后端分离的开发模式:
- Spring框架:作为核心容器,通过依赖注入(DI)机制管理业务对象,同时利用声明式事务管理确保订单处理、库存更新等关键操作的数据一致性。
- SpringMVC模块:负责Web请求的分发和处理,配合拦截器实现权限验证和日志记录功能。
- MyBatis持久层框架:通过XML配置实现灵活的SQL映射,支持动态查询和分页处理,提升数据库操作效率。
技术栈配置示例:
<dependencies>
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</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>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
前端采用JSP结合JSTL标签库进行页面渲染,配合JavaScript实现商品图片轮播、购物车动态交互等用户体验优化功能。
数据库设计亮点
商品表设计优化
商品表(goods)的设计充分考虑了电商平台的业务需求:
CREATE TABLE `goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`cover` varchar(255) DEFAULT NULL COMMENT '封面',
`image1` varchar(255) DEFAULT NULL COMMENT '细节图片1',
`image2` varchar(255) DEFAULT NULL COMMENT '细节图片2',
`price` int(11) DEFAULT NULL COMMENT '价格',
`intro` varchar(255) DEFAULT NULL COMMENT '介绍',
`stock` int(11) DEFAULT 0 COMMENT '库存',
`type_id` int(11) DEFAULT NULL COMMENT '分类',
PRIMARY KEY (`id`),
KEY `idx_type_id` (`type_id`),
KEY `idx_price` (`price`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='商品表'
设计亮点分析:
- 多图片字段设计:采用cover、image1、image2字段,支持商品主图和细节展示图的管理
- 价格字段优化:使用整型存储,避免浮点数精度问题,同时提高计算效率
- 索引策略:建立类型索引(idx_type_id)和价格索引(idx_price),优化商品分类查询和价格筛选性能
- 库存安全设计:设置默认值0,防止空值异常
订单表状态管理
订单表(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 1 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` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '下单时间',
`user_id` int(11) DEFAULT NULL COMMENT '下单用户',
`fpingfen` int(11) DEFAULT NULL COMMENT '评分',
`ftext` varchar(255) DEFAULT NULL COMMENT '评价内容',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_systime` (`systime`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='订单表'
订单状态流转机制:
- 状态1:未付款 - 用户下单但未完成支付
- 状态2:已付款 - 支付成功,等待发货
- 状态3:已发货 - 商品已发出,等待收货
- 状态4:已完成 - 交易成功,可进行评价

推荐系统设计
推荐表(tops)采用灵活的推荐位管理机制:
CREATE TABLE `tops` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`type` tinyint(4) DEFAULT NULL COMMENT '推荐类型(1条幅/2大图/3小图)',
`good_id` int(11) DEFAULT NULL COMMENT '商品id',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_type_good` (`type`,`good_id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8 COMMENT='首页推荐商品'
通过唯一索引(uk_type_good)确保同一推荐位不会重复推荐相同商品,支持多种推荐样式配置。
核心功能实现
管理员权限控制
系统采用基于Session的权限验证机制,确保后台管理功能的安全性:
@Controller
@RequestMapping("/admin")
public class AdminController {
@Autowired
private AdminService adminService;
/**
* 管理员登录验证
* 使用Session存储登录状态,实现权限控制
*/
@RequestMapping("/login")
public String login(Admins admin, HttpServletRequest request, HttpSession session) {
if (adminService.checkUser(admin.getUsername(), admin.getPassword())) {
session.setAttribute("username", admin.getUsername());
return "redirect:/admin/orderList";
}
request.setAttribute("msg", "用户名或密码错误!");
return "/admin/login.jsp";
}
/**
* 订单列表分页查询
* 支持按状态筛选和分页显示
*/
@RequestMapping("/orderList")
public String orderList(@RequestParam(required=false, defaultValue="0")byte status,
HttpServletRequest request,
@RequestParam(required=false, defaultValue="1") int page) {
request.setAttribute("flag", 1);
request.setAttribute("status", status);
request.setAttribute("orderList", orderService.getList(status, page, rows));
// 分页工具计算
if(status == 0){
request.setAttribute("pageTool",
PageUtil.getPageTool(request, orderService.getTotal1(), page, rows));
}else{
request.setAttribute("pageTool",
PageUtil.getPageTool(request, orderService.getTotal(status), page, rows));
}
return "/admin/index.jsp";
}
}