基于SSM框架的在线服装选购平台 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenMySQL
2026-02-089 浏览

文章摘要

基于SSM框架的在线服装选购平台是一个整合了Spring、Spring MVC与MyBatis技术的B/S架构电子商务系统。该项目旨在解决传统服装零售业面临的线下客流受限、商品展示空间不足以及库存管理效率低下的核心痛点,为商家提供一个高效、稳定、易于维护的线上销售渠道,同时为消费者打造便捷的一站式购...

随着电子商务的蓬勃发展,传统服装零售行业面临着线下客流受限、商品展示空间不足以及库存管理效率低下的多重挑战。针对这些痛点,一个基于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_priceshop_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
本文关键词
SSM框架在线服装选购电商平台源码解析数据库设计

上下篇

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