随着电子商务的蓬勃发展,传统服装零售行业面临着线下客流受限、商品展示空间不足以及库存管理效率低下的多重挑战。针对这些痛点,一个基于SSM(Spring + Spring MVC + Mybatis)框架的企业级服装电商平台应运而生。该系统采用B/S架构,为中小型服装品牌商和消费者提供了完整的线上购物解决方案。
系统架构与技术栈
该平台采用经典的三层架构设计,每一层都充分发挥了SSM框架的技术优势:
表现层基于Spring MVC框架构建,通过注解驱动的控制器(如@Controller、@RequestMapping)处理前端请求,利用JSP视图技术结合JSTL标签库实现动态页面渲染。这种设计使得商品列表展示、详情页跳转和用户交互更加灵活高效。
业务逻辑层依托Spring框架的IoC容器进行Bean的生命周期管理,通过声明式事务控制确保核心业务操作(如用户下单、库存扣减)的数据一致性。AOP面向切面编程的应用使得日志记录、权限验证等横切关注点能够与核心业务逻辑解耦。
数据持久层采用MyBatis框架,开发者通过编写Mapper接口与对应的XML映射文件,实现了Java对象与数据库表的灵活映射。MyBatis的动态SQL功能为复杂的商品查询和分类筛选提供了强大支持。
技术栈配置通过Maven进行依赖管理,确保了项目构建的一致性和可重复性。数据库选用MySQL,提供了稳定可靠的数据存储服务。
数据库设计亮点
商品表设计优化
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`pname` varchar(255) DEFAULT NULL COMMENT '商品名称',
`market_price` double DEFAULT NULL COMMENT '市场价',
`shop_price` double DEFAULT NULL COMMENT '商城价',
`image` varchar(255) DEFAULT NULL COMMENT '商品图片',
`pdesc` varchar(5000) DEFAULT NULL COMMENT '商品描述',
`is_hot` int(11) DEFAULT NULL COMMENT '是否热销',
`pdate` date DEFAULT NULL COMMENT '上架日期',
`csid` int(11) DEFAULT NULL COMMENT '二级分类ID',
`state` int(11) DEFAULT NULL COMMENT '商品状态',
PRIMARY KEY (`pid`) USING BTREE,
KEY `FKED8DCCEF5F778050` (`csid`) USING BTREE,
CONSTRAINT `FKED8DCCEF5F778050` FOREIGN KEY (`csid`)
REFERENCES `categorysecond` (`csid`)
) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci ROW_FORMAT=COMPACT COMMENT='商品表'
商品表的设计体现了多个优化考量:
- 价格字段分离:
market_price和shop_price分别存储市场价和商城价,便于价格策略管理和促销活动开展 - 热销标识:
is_hot字段支持热销商品快速筛选,提升首页推荐效率 - 外键约束:通过
csid字段与二级分类表建立外键关系,确保数据完整性 - 索引优化:在
csid字段建立BTREE索引,显著提升分类查询性能
订单业务表关系设计
CREATE TABLE `orders` (
`oid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`money` double DEFAULT NULL COMMENT '订单金额',
`state` int(11) DEFAULT NULL COMMENT '订单状态',
`receiveInfo` varchar(255) DEFAULT NULL COMMENT '收货信息',
`phoNum` varchar(255) DEFAULT NULL COMMENT '电话号码',
`order_time` datetime DEFAULT NULL COMMENT '下单时间',
`uid` int(11) DEFAULT NULL COMMENT '用户ID',
`accepter` varchar(100) DEFAULT NULL COMMENT '收货人',
PRIMARY KEY (`oid`) USING BTREE,
KEY `FKC3DF62E5FC32F8E` (`uid`) USING BTREE,
CONSTRAINT `FKC3DF62E5FC32F8E` FOREIGN KEY (`uid`)
REFERENCES `user` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci ROW_FORMAT=COMPACT COMMENT='订单表'
CREATE TABLE `orderitem` (
`oiid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
`count` int(11) DEFAULT NULL COMMENT '数量',
`subtotal` double DEFAULT NULL COMMENT '小计',
`pid` int(11) DEFAULT NULL COMMENT '商品ID',
`oid` int(11) DEFAULT NULL COMMENT '订单ID',
PRIMARY KEY (`oiid`) USING BTREE,
KEY `FKE8B2AB61E818A405` (`oid`) USING BTREE,
KEY `FKE8B2AB6173B4E627` (`pid`) USING BTREE,
CONSTRAINT `FKE8B2AB6173B4E627` FOREIGN KEY (`pid`)
REFERENCES `product` (`pid`),
CONSTRAINT `FKE8B2AB61E818A405` FOREIGN KEY (`oid`)
REFERENCES `orders` (`oid`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci ROW_FORMAT=COMPACT COMMENT='订单项表'
订单模块采用主从表设计,orders表记录订单概要信息,orderitem表存储订单明细。这种设计支持一个订单包含多个商品,同时通过外键约束确保数据的一致性。order_time字段使用datetime类型,精确记录下单时间,为后续的数据分析和报表生成提供支持。
核心功能实现
管理员商品管理功能
系统为管理员提供了完整的商品管理功能,包括商品上架、编辑、下架等操作。商品管理界面清晰展示了商品的基本信息和状态。

控制器层通过AdminController处理商品管理相关请求:
@Controller
public class AdminController {
@Autowired
private ProductService productService;
@Autowired
public CategoryService categoryService;
@Autowired
public CategorySecondService categorySecondService;
// 商品添加页面跳转
@RequestMapping("/admin/adminProduct_addPage")
public String adminProduct_addPage(Model model, HttpServletRequest request)
throws Exception {
Adminuser adminuserLogin = (Adminuser) request.getSession()
.getAttribute("adminuserLogin");
if(adminuserLogin == null){
request.getSession().setAttribute("message", "对不起您还没有登录");
return "admin/index";
}
// 查询所有一级分类
List<Category> categoryList = categoryService.adminbFindCategory();
model.addAttribute("categoryList", categoryList);
return "admin/product/add";
}
// 商品添加处理
@RequestMapping("/admin/adminProduct_add")
public String adminProduct_add(@RequestParam MultipartFile file,
Product product, HttpServletRequest request) throws Exception {
Adminuser adminuserLogin = (Adminuser) request.getSession()
.getAttribute("adminuserLogin");
if(adminuserLogin == null){
request.getSession().setAttribute("message", "对不起您还没有登录");
return "admin/index";
}
// 文件上传处理
if(file != null && !file.isEmpty()){
String filePath = request.getSession().getServletContext()
.getRealPath("/products/1/");
String fileName = UUIDUtiils.getUUID() +
file.getOriginalFilename().substring(
file.getOriginalFilename().lastIndexOf("."));
File targetFile = new File(filePath, fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
file.transferTo(targetFile);
product.setImage("products/1/" + fileName);
}
product.setPdate(new Date());
productService.adminProduct_save(product);
return "redirect:/admin/adminProduct_findAll?page=1";
}
// 商品分页查询
@RequestMapping("/admin/adminProduct_findAll")
public String adminProduct_findAll(@RequestParam int page, Model model,
HttpServletRequest request) throws Exception {
Adminuser adminuserLogin = (Adminuser) request.getSession()
.getAttribute("adminuserLogin");
if(adminuserLogin == null){
request.getSession().setAttribute("message", "对不起您还没有登录");
return "admin/index";
}
PageBean<Product> pageBean = productService.adminProduct_findAll(page);
model.addAttribute("pageBean", pageBean);
return "admin/product/list";
}
}
服务层通过ProductService实现业务逻辑:
@Service
public class ProductService {
@Autowired
private ProductMapper productMapper;
public PageBean<Product> adminProduct_findAll(int page) {
PageBean<Product> pageBean = new PageBean<Product>();
pageBean.setPage(page);
int limit = 10;
pageBean.setLimit(limit);
int totalCount = productMapper.adminProduct_findCount();
pageBean.setTotalCount(totalCount);
int totalPage = 0;
if(totalCount % limit == 0) {
totalPage = totalCount / limit;
} else {
totalPage = totalCount / limit + 1;
}
pageBean.setTotalPage(totalPage);
int begin = (page - 1) * limit;
List<Product> list = productMapper.adminProduct_findAll(begin, limit);
pageBean.setList(list);
return pageBean;
}
public void adminProduct_save(Product product) {
productMapper.insert(product);
}
}
购物车功能实现
购物车是电商平台的核心功能之一,系统通过shopcartitem表存储用户的购物车信息:
CREATE TABLE `shopcartitem` (
`cartitemid` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物车项ID',
`uid` int(11) DEFAULT NULL COMMENT '用户ID',
`pid` int(11) DEFAULT NULL COMMENT '商品ID',
`pcount` int(11) DEFAULT NULL COMMENT '商品数量',
`price` double DEFAULT NULL COMMENT '商品价格',
`image` varchar(255) DEFAULT NULL COMMENT '商品图片',
`ptotal` double DEFAULT NULL COMMENT '商品总价',
`pname` varchar(255) DEFAULT NULL COMMENT '商品名称',
PRIMARY KEY (`cartitemid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci ROW_FORMAT=COMPACT COMMENT='购物车项表'
购物车界面直观展示了用户选择的商品信息:

购物车控制器实现:
@Controller
public class CartController {
@Autowired
private CartService cartService;
@Autowired
private ProductService productService;
// 添加商品到购物车
@RequestMapping("/cart_addCart")
public String addCart(@RequestParam int pid, @RequestParam int count,
HttpServletRequest request) {
User user = (User) request.getSession().getAttribute("user");
if(user == null) {
request.setAttribute("message", "请先登录!");
return "msg";
}
CartItem cartItem = new CartItem();
Product product = productService.findByPid(pid);
cartItem.setProduct(product);
cartItem.setCount(count);
cartItem.setSubtotal(count * product.getShop_price());
Cart cart = getCart(request);
cart.addCart(cartItem);
return "redirect:/cart_myCart";
}
// 获取购物车
private Cart getCart(HttpServletRequest request) {
Cart cart = (Cart) request.getSession().getAttribute("cart");
if(cart == null) {
cart = new Cart();
request.getSession().setAttribute("cart", cart);
}
return cart;
}
// 清空购物车
@RequestMapping("/cart_clearCart")
public String clearCart(HttpServletRequest request) {
Cart cart = getCart(request);
cart.clearCart();
return "redirect:/cart_myCart";
}
}
订单管理功能
订单管理包括订单生成、状态跟踪和后台管理等功能。管理员可以查看所有订单并进行状态更新。

订单服务层实现:
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private ProductMapper productMapper;
// 生成订单
public void saveOrder(Orders order, Cart cart) {
// 保存订单基本信息
order.setOrder_time(new Date());
order.setState(1); // 1代表未付款
order.setMoney(cart.getTotal());
orderMapper.insert(order);
// 保存订单项
for (CartItem cartItem : cart.getCartItems()) {
OrderItem orderItem = new OrderItem();
orderItem.setCount(cartItem.getCount());
orderItem.setSubtotal(cartItem.getSubtotal());
orderItem.setProduct(cartItem.getProduct());
orderItem.setOrders(order);
orderItemMapper.insert(orderItem);
// 更新商品库存
Product product = cartItem.getProduct();
product.setInventory(product.getInventory() - cartItem.getCount());
productMapper.updateByPrimaryKey(product);
}
}
// 分页查询用户订单
public PageBean<Orders> findOrderByUid(Integer uid, Integer page) {
PageBean<Orders> pageBean = new PageBean<>();
pageBean.setPage(page);
int limit = 5;
pageBean.setLimit(limit);
int totalCount = orderMapper.findCountByUid(uid);
pageBean.setTotalCount(totalCount);
int totalPage = (totalCount % limit == 0) ?
totalCount / limit : totalCount / limit + 1;
pageBean.setTotalPage(totalPage);
int begin = (page - 1) * limit;
List<Orders> list = orderMapper.findByPageUid(uid, begin, limit);
pageBean.setList(list);
return pageBean;
}
}
用户管理与权限控制
系统采用双用户体系,普通用户和管理员分开管理。管理员登录界面简洁专业:

权限控制通过拦截器实现:
@Component
public class AdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if(uri.contains("/admin/")) {
Adminuser adminuser = (Adminuser) request.getSession()
.getAttribute("adminuserLogin");
if(adminuser == null) {
request.setAttribute("message", "请先登录管理员账户!");
request.getRequestDispatcher("/admin/index").forward(request, response);
return false;
}
}
return true;
}
}
用户管理功能实现:
@Controller
public class UserController {
@Autowired
private UserService userService;
// 用户注册
@RequestMapping("/user_regist")
public String regist(User user, Model model,
HttpServletRequest request) throws Exception {
// 检查用户名是否已存在
User existUser = userService.findByUsername(user.getUsername());
if(existUser != null) {
model.addAttribute("message", "用户名已存在!");
return "regist";
}
user.setRegistTime(new Date());
user.setState(1); // 激活状态
userService.save(user);
model.addAttribute("message", "注册成功!请登录");
return "msg";
}
// 用户登录
@RequestMapping("/user_login")
public String login(User user, Model model,
HttpServletRequest request) {
User existUser = userService.login(user);
if(existUser == null) {
model.addAttribute("message", "用户名或密码错误!");
return "login";
}
request.getSession().setAttribute("user", existUser);
return "redirect:/index";
}
}
实体模型设计
系统采用面向对象的设计思想,核心实体模型之间的关系清晰明确:
// 商品实体类
public class Product {
private Integer pid;
private String pname;
private Double market_price;
private Double shop_price;
private String image;
private String pdesc;
private Integer is_hot;
private Date pdate;
private Integer csid;
private Integer state;
// 关联的二级分类
private Categorysecond categorysecond;
// getter和setter方法
// ...
}
// 订单实体类
public class Orders {
private Integer oid;
private Double money;
private Integer state;
private String receiveInfo;
private String phoNum;
private Date order_time;
private Integer uid;
private String accepter;
// 关联的用户
private User user;
// 订单项集合
private Set<OrderItem> orderItems = new HashSet<>();
// getter和setter方法
// ...
}
// 购物车项实体类
public class CartItem {
private Product product;
private Integer count;
private Double subtotal;
public Double getSubtotal() {
return product.getShop_price() * count;
}
// getter和setter方法
// ...
}
功能展望与优化
基于当前系统架构,未来可以从以下几个方向进行优化和功能扩展:
1. 引入Redis缓存提升性能
实现思路:将热点数据(如商品分类、热门商品、用户会话)存入Redis,减轻数据库压力。
@Service
public class ProductServiceWithCache {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private ProductMapper productMapper;
public List<Product> findHotProducts() {
String cacheKey = "hot_products";
List<Product> products = (List<Product>) redisTemplate.ops