基于SSM框架的在线手机商城销售平台 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenMySQL
2026-02-0811 浏览

文章摘要

本项目是基于SSM(Spring+Spring MVC+MyBatis)框架构建的在线手机商城销售平台,旨在为消费者提供便捷的手机选购与购买服务,同时为商家打造高效的线上销售渠道。平台的核心业务价值在于解决了传统手机零售中信息不透明、选购流程繁琐、交易时空受限等痛点,通过集中展示商品信息、简化下单支...

在当今电子商务蓬勃发展的时代,移动设备在线销售平台已成为连接消费者与商家的关键桥梁。这一企业级移动设备销售管理引擎通过现代化的技术架构,为消费者提供便捷的购物体验,同时为商家打造高效的线上销售渠道。

系统架构与技术栈

该平台采用经典的三层架构设计,基于SSM(Spring+Spring MVC+MyBatis)框架构建,使用Maven进行项目依赖管理。表现层采用Spring MVC框架处理用户请求与页面路由,结合JSP和JSTL标签库实现动态页面渲染。业务逻辑层通过Spring的IoC容器统一管理服务组件,数据持久层则利用MyBatis实现对象关系映射。

技术栈配置如下:

<dependencies>
    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    
    <!-- MyBatis集成 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>
    
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
</dependencies>

数据库设计亮点

商品表设计优化

商品表(item)的设计充分考虑了电商平台的业务需求,采用多图片存储和灵活的参数配置方案:

CREATE TABLE `item` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) DEFAULT NULL COMMENT '名字',
  `price` varchar(255) DEFAULT NULL COMMENT '价格',
  `scNum` int(11) DEFAULT NULL COMMENT '收藏数',
  `gmNum` int(11) DEFAULT NULL COMMENT '购买数',
  `url1` varchar(255) DEFAULT NULL COMMENT '图片1',
  `url2` varchar(255) DEFAULT NULL COMMENT '图片2',
  `url3` varchar(255) DEFAULT NULL COMMENT '图片3',
  `url4` varchar(255) DEFAULT NULL COMMENT '图片4',
  `url5` varchar(255) DEFAULT NULL COMMENT '图片5',
  `ms` text DEFAULT NULL COMMENT '描述',
  `pam1` varchar(255) DEFAULT NULL COMMENT '参数1',
  `pam2` varchar(255) DEFAULT NULL COMMENT '参数2',
  `pam3` varchar(255) DEFAULT NULL COMMENT '参数3',
  `val3` varchar(255) DEFAULT NULL COMMENT '值3',
  `val2` varchar(255) DEFAULT NULL COMMENT '值2',
  `val1` varchar(255) DEFAULT NULL COMMENT '值1',
  `type` int(11) DEFAULT NULL COMMENT '类型',
  `zk` int(10) DEFAULT NULL COMMENT '折扣',
  `category_id_one` int(11) DEFAULT NULL COMMENT '类别id',
  `category_id_two` int(11) DEFAULT NULL COMMENT '类别2级',
  `isDelete` int(2) DEFAULT NULL COMMENT '0否 1是',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'

该表设计的亮点在于:

  • 多图片支持:通过url1-url5字段支持商品多角度展示
  • 动态参数设计:pam1-pam3和val1-val3字段组合实现可配置的商品参数展示
  • 软删除机制:isDelete字段实现逻辑删除而非物理删除
  • 分类层级:category_id_one和category_id_two支持多级分类管理

购物车表业务逻辑设计

购物车表(car)的设计体现了电商业务的核心逻辑:

CREATE TABLE `car` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `item_id` int(11) DEFAULT NULL COMMENT '商品ID',
  `user_id` int(11) DEFAULT NULL COMMENT '用户ID',
  `num` int(11) DEFAULT NULL COMMENT '数量',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  `total` varchar(255) DEFAULT NULL COMMENT '总价',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='购物车表'

该设计的优势:

  • 价格快照:price字段存储加入购物车时的价格,避免后续价格变动影响
  • 数量控制:num字段支持多数量购买需求
  • 总价预计算:total字段提升前端展示性能

核心功能实现

商品详情展示系统

商品详情页是用户决策的关键环节,系统通过多维度展示商品信息。控制器层采用注解驱动的方式处理请求:

@Controller
@RequestMapping("/item")
public class ItemController extends BaseController {
    
    @Autowired
    private ItemService itemService;
    
    @RequestMapping("/detail")
    public String detail(@RequestParam("id") Integer id, Model model) {
        try {
            Item item = itemService.load(id);
            if (item != null) {
                model.addAttribute("item", item);
                // 加载商品评论
                List<Comment> comments = commentService.findByItemId(id);
                model.addAttribute("comments", comments);
                // 加载相关商品推荐
                List<Item> relatedItems = itemService.findRelatedItems(item.getCategoryIdOne());
                model.addAttribute("relatedItems", relatedItems);
            }
            return "item/detail";
        } catch (Exception e) {
            logger.error("获取商品详情失败", e);
            return "error/404";
        }
    }
}

服务层实现商品信息聚合:

@Service
@Transactional
public class ItemServiceImpl implements ItemService {
    
    @Autowired
    private ItemMapper itemMapper;
    
    @Override
    public Item load(Integer id) {
        Item item = itemMapper.selectByPrimaryKey(id);
        if (item != null && item.getIsDelete() == 0) {
            // 更新商品浏览量
            itemMapper.updateViewCount(id);
            return item;
        }
        return null;
    }
    
    @Override
    public List<Item> findRelatedItems(Integer categoryId) {
        Map<String, Object> params = new HashMap<>();
        params.put("categoryId", categoryId);
        params.put("limit", 6);
        return itemMapper.selectRelatedItems(params);
    }
}

商品详情展示

购物车管理引擎

购物车功能采用实时计算和持久化存储相结合的策略:

@Service
public class CarServiceImpl implements CarService {
    
    @Autowired
    private CarMapper carMapper;
    
    @Autowired
    private ItemMapper itemMapper;
    
    @Override
    @Transactional
    public void addToCar(Integer userId, Integer itemId, Integer num) {
        // 检查商品是否存在且未下架
        Item item = itemMapper.selectByPrimaryKey(itemId);
        if (item == null || item.getIsDelete() == 1) {
            throw new BusinessException("商品不存在或已下架");
        }
        
        // 检查购物车是否已有该商品
        Car existCar = carMapper.selectByUserAndItem(userId, itemId);
        if (existCar != null) {
            // 更新数量
            existCar.setNum(existCar.getNum() + num);
            existCar.setTotal(calculateTotal(existCar.getNum(), item.getPrice()));
            carMapper.updateByPrimaryKey(existCar);
        } else {
            // 新增购物车项
            Car car = new Car();
            car.setUserId(userId);
            car.setItemId(itemId);
            car.setNum(num);
            car.setPrice(new BigDecimal(item.getPrice()));
            car.setTotal(calculateTotal(num, item.getPrice()));
            carMapper.insert(car);
        }
    }
    
    private String calculateTotal(Integer num, String price) {
        BigDecimal itemPrice = new BigDecimal(price);
        BigDecimal total = itemPrice.multiply(new BigDecimal(num));
        return total.toString();
    }
}

购物车控制器实现:

@RestController
@RequestMapping("/api/car")
public class CarApiController extends BaseController {
    
    @Autowired
    private CarService carService;
    
    @PostMapping("/add")
    public Map<String, Object> addToCar(@RequestParam Integer itemId, 
                                       @RequestParam Integer num,
                                       HttpSession session) {
        Map<String, Object> result = getMap();
        try {
            User user = (User) session.getAttribute("user");
            if (user == null) {
                result.put("code", 401);
                result.put("msg", "请先登录");
                return result;
            }
            
            carService.addToCar(user.getId(), itemId, num);
            result.put("code", 200);
            result.put("msg", "添加成功");
        } catch (BusinessException e) {
            result.put("code", 500);
            result.put("msg", e.getMessage());
        }
        return result;
    }
    
    @GetMapping("/list")
    public Map<String, Object> carList(HttpSession session) {
        Map<String, Object> result = getMap();
        User user = (User) session.getAttribute("user");
        if (user != null) {
            List<CarVO> carList = carService.findByUserId(user.getId());
            result.put("code", 200);
            result.put("data", carList);
        } else {
            result.put("code", 401);
            result.put("msg", "请先登录");
        }
        return result;
    }
}

购物车管理

订单处理系统

订单处理涉及复杂的业务逻辑,包括库存校验、价格计算、状态管理等:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private ItemMapper itemMapper;
    
    @Autowired
    private CarMapper carMapper;
    
    @Override
    public Order createOrder(Integer userId, List<Integer> carIds, String address) {
        // 验证购物车项
        List<Car> cars = carMapper.selectByIds(carIds);
        if (cars.isEmpty()) {
            throw new BusinessException("购物车项不存在");
        }
        
        // 校验库存和价格
        BigDecimal totalAmount = BigDecimal.ZERO;
        List<OrderDetail> details = new ArrayList<>();
        
        for (Car car : cars) {
            Item item = itemMapper.selectByPrimaryKey(car.getItemId());
            if (item.getStock() < car.getNum()) {
                throw new BusinessException(item.getName() + "库存不足");
            }
            
            OrderDetail detail = new OrderDetail();
            detail.setItemId(item.getId());
            detail.setNum(car.getNum());
            detail.setPrice(car.getPrice());
            detail.setTotal(new BigDecimal(car.getTotal()));
            details.add(detail);
            
            totalAmount = totalAmount.add(new BigDecimal(car.getTotal()));
        }
        
        // 创建订单
        Order order = new Order();
        order.setUserId(userId);
        order.setTotal(totalAmount.toString());
        order.setStatus(0); // 待支付
        order.setAddress(address);
        order.setCreateTime(new Date());
        orderMapper.insert(order);
        
        // 保存订单详情
        for (OrderDetail detail : details) {
            detail.setOrderId(order.getId());
            orderDetailMapper.insert(detail);
            
            // 扣减库存
            itemMapper.updateStock(detail.getItemId(), detail.getNum());
        }
        
        // 清空购物车
        carMapper.deleteByIds(carIds);
        
        return order;
    }
}

订单管理系统

用户收藏功能

收藏功能通过独立的收藏表实现,支持用户个性化商品管理:

@Service
public class ScServiceImpl implements ScService {
    
    @Autowired
    private ScMapper scMapper;
    
    @Override
    public void toggleFavorite(Integer userId, Integer itemId) {
        Sc existSc = scMapper.selectByUserAndItem(userId, itemId);
        if (existSc != null) {
            // 取消收藏
            scMapper.deleteByPrimaryKey(existSc.getId());
            // 更新商品收藏数
            itemMapper.decreaseScNum(itemId);
        } else {
            // 添加收藏
            Sc sc = new Sc();
            sc.setUserId(userId);
            sc.setItemId(itemId);
            scMapper.insert(sc);
            // 更新商品收藏数
            itemMapper.increaseScNum(itemId);
        }
    }
    
    @Override
    public List<Item> findUserFavorites(Integer userId) {
        return scMapper.selectUserFavorites(userId);
    }
}

收藏管理

实体模型设计

系统采用标准的JavaBean实体模型,与数据库表结构严格对应:

public class Item implements Serializable {
    private Integer id;
    private String name;
    private String price;
    private Integer scNum;
    private Integer gmNum;
    private String url1;
    private String url2;
    private String url3;
    private String url4;
    private String url5;
    private String ms;
    private String pam1;
    private String pam2;
    private String pam3;
    private String val1;
    private String val2;
    private String val3;
    private Integer type;
    private Integer zk;
    private Integer categoryIdOne;
    private Integer categoryIdTwo;
    private Integer isDelete;
    
    // getter和setter方法
    // 构造方法
}

MyBatis映射文件配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.neusoft.mapper.ItemMapper">
    
    <resultMap id="BaseResultMap" type="com.neusoft.entity.Item">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="price" property="price" jdbcType="VARCHAR"/>
        <result column="scNum" property="scNum" jdbcType="INTEGER"/>
        <result column="gmNum" property="gmNum" jdbcType="INTEGER"/>
        <!-- 其他字段映射 -->
    </resultMap>
    
    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        SELECT * FROM item WHERE id = #{id} AND isDelete = 0
    </select>
    
    <update id="updateStock">
        UPDATE item SET stock = stock - #{num} WHERE id = #{itemId} AND stock >= #{num}
    </update>
    
</mapper>

功能展望与优化

性能优化方向

  1. 引入Redis缓存层
@Service
public class ItemServiceWithCache {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    private static final String ITEM_CACHE_PREFIX = "item:";
    private static final long CACHE_EXPIRE = 3600; // 1小时
    
    public Item getItemWithCache(Integer id) {
        String cacheKey = ITEM_CACHE_PREFIX + id;
        Item item = (Item) redisTemplate.opsForValue().get(cacheKey);
        if (item == null) {
            item = itemMapper.selectByPrimaryKey(id);
            if (item != null) {
                redisTemplate.opsForValue().set(cacheKey, item, CACHE_EXPIRE, TimeUnit.SECONDS);
            }
        }
        return item;
    }
}
  1. 数据库读写分离 通过配置多数据源实现读写分离,提升系统并发处理能力。

功能扩展建议

  1. 推荐算法集成 基于用户行为数据实现个性化商品推荐:
@Service
public class RecommendationService {
    public List<Item> getRecommendedItems(Integer userId) {
        // 基于协同过滤或内容推荐的算法实现
        return recommendationEngine.generateRecommendations(userId);
    }
}
  1. 消息队列异步处理 使用RabbitMQ或Kafka处理高并发场景下的订单创建、库存扣减等操作。

  2. 微服务架构改造 将单体应用拆分为商品服务、订单服务、用户服务等独立微服务,提升系统可扩展性。

  3. 移动端API支持 开发RESTful API接口,支持iOS和Android移动端应用接入。

  4. 搜索引擎集成 集成Elasticsearch实现商品搜索功能,支持全文检索和复杂查询。

总结

该移动设备销售管理平台通过严谨的架构设计和细致的功能实现,构建了一个稳定可靠的电商系统。基于SSM框架的技术选型确保了系统的可维护性和扩展性,合理的数据库设计为业务发展提供了坚实基础。系统在商品管理、购物车处理、订单流程等核心功能上表现出色,同时为未来的技术演进和功能扩展预留了充足空间。

随着业务规模的扩大,通过引入缓存机制、消息队列、微服务架构等现代化技术手段,可以进一步提升系统性能和用户体验,为平台的长期发展提供有力支撑。该系统的设计理念和实现方案为同类电商平台的开发提供了有价值的参考。

本文关键词
SSM框架在线手机商城销售平台源码解析数据库设计

上下篇

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