基于SSH框架的在线蛋糕销售平台 - 源码深度解析

JavaJavaScriptSSH框架HTMLCSSMySQLJSP+Servlet
2026-02-245 浏览

文章摘要

本项目是一款基于SSH(Struts2 + Spring + Hibernate)整合框架开发的在线蛋糕销售平台,旨在为中小型烘焙商家提供一个功能完整、稳定可靠的电子商务解决方案。其核心业务价值在于打通了蛋糕产品从线上展示、订购到后台管理的全流程,有效解决了传统实体店铺销售渠道单一、运营效率低下以及...

在电子商务蓬勃发展的时代,传统烘焙行业面临着销售渠道单一、运营效率低下以及客户数据管理困难等挑战。为了应对这些挑战,一款基于经典SSH(Struts2 + Spring + Hibernate)整合框架的在线蛋糕销售平台应运而生。该平台旨在为中小型烘焙商家提供一个功能完整、稳定可靠的全流程电子商务解决方案。

平台采用典型的多层架构设计,实现了表现层、业务逻辑层和数据持久层的清晰分离。Struts2框架作为MVC控制器,负责接收前端HTTP请求、调用业务逻辑并选择相应的视图进行响应。Spring框架的核心IoC容器统一管理着各个业务组件(Service)和数据访问对象(DAO),通过依赖注入降低组件间的耦合度,并提供了声明式事务管理,确保业务操作的数据一致性。Hibernate框架则承担了对象关系映射(ORM)的重任,将Java实体对象与数据库表结构进行映射,简化了数据持久化操作。

在数据库设计方面,平台采用了MySQL数据库,共设计了8张核心数据表来支撑业务运转。其中,cake(蛋糕商品)表的设计尤为关键。该表不仅包含了商品的基本信息,如名称、价格、库存,还通过is_hot字段标识热门商品,便于前台进行促销展示。cakedescription字段使用TEXT类型,满足了蛋糕商品详细图文介绍的大容量存储需求。cake_category_id外键关联商品分类表,实现了商品的多级分类管理。

CREATE TABLE `cake` (
  `cakeId` int(11) NOT NULL AUTO_INCREMENT,
  `cakeName` varchar(50) DEFAULT NULL,
  `price` decimal(10,0) DEFAULT NULL,
  `cakeNum` int(11) DEFAULT NULL,
  `cakedescription` text,
  `is_hot` int(11) DEFAULT NULL,
  `cake_category_id` int(11) DEFAULT NULL,
  `img` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`cakeId`),
  KEY `FK_category_cake` (`cake_category_id`),
  CONSTRAINT `FK_category_cake` FOREIGN KEY (`cake_category_id`) REFERENCES `cakecategory` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

另一张核心表order_(订单表)的设计则体现了电商业务的复杂性。它通过uidcakeId分别关联用户表和商品表,记录了购买关系。status字段使用整型数字来标识订单的生命周期状态,例如0待付款、1已付款、2已发货等,这种设计便于程序进行状态判断和流程控制。orderTime字段精确记录了下单时间,为后续的销售统计和数据分析提供了基础。

CREATE TABLE `order_` (
  `oid` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL,
  `cakeId` int(11) DEFAULT NULL,
  `cakeNum` int(11) DEFAULT NULL,
  `price` decimal(10,0) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `orderTime` datetime DEFAULT NULL,
  `message` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`oid`),
  KEY `FK_user_order` (`uid`),
  KEY `FK_cake_order` (`cakeId`),
  CONSTRAINT `FK_cake_order` FOREIGN KEY (`cakeId`) REFERENCES `cake` (`cakeId`),
  CONSTRAINT `FK_user_order` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

在核心功能实现上,商品浏览与搜索功能是用户体验的关键。前端页面通过JSP动态渲染商品列表,用户可以根据分类筛选或通过关键词搜索心仪的蛋糕。后端由CakeAction类处理请求,它通过Spring注入的CakeService来调用业务逻辑。

/**
 * 蛋糕Action类
 */
public class CakeAction extends ActionSupport implements ModelDriven<Cake> {
    private Cake cake = new Cake();
    private Integer cakeId;
    // 注入CakeService
    private CakeService cakeService;

    public void setCakeService(CakeService cakeService) {
        this.cakeService = cakeService;
    }

    /**
     * 根据ID查找蛋糕详情
     */
    public String findById() {
        cake = cakeService.findByCakeId(cakeId);
        return "cakeDetail";
    }

    /**
     * 分页查询蛋糕列表
     */
    public String findByPage() {
        // 分页查询逻辑
        return "cakeList";
    }

    @Override
    public Cake getModel() {
        return cake;
    }

    // Getter和Setter方法
    public Integer getCakeId() {
        return cakeId;
    }

    public void setCakeId(Integer cakeId) {
        this.cakeId = cakeId;
    }
}

商品浏览界面

购物车与订单生成模块实现了电商的核心交易流程。用户可以将选中的商品加入购物车,在结算时系统会验证库存,生成待支付的订单。OrderAction类负责处理订单相关的所有操作,包括创建订单、更新状态等。

/**
 * 订单Action类
 */
public class OrderAction extends ActionSupport implements ModelDriven<Order> {
    private Order order = new Order();
    private OrderService orderService;
    
    public void setOrderService(OrderService orderService) {
        this.orderService = orderService;
    }

    /**
     * 生成订单方法
     */
    public String generateOrder() {
        // 获取当前登录用户
        User user = (User) ActionContext.getContext().getSession().get("user");
        if (user == null) {
            return "login"; // 未登录跳转到登录页
        }
        
        try {
            order.setUser(user);
            order.setOrderTime(new Date());
            order.setStatus(0); // 初始状态为待支付
            orderService.save(order);
            return "orderSuccess";
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
    }

    /**
     * 查询用户订单列表
     */
    public String findUserOrders() {
        User user = (User) ActionContext.getContext().getSession().get("user");
        if (user != null) {
            // 调用Service查询该用户的所有订单
        }
        return "userOrderList";
    }

    @Override
    public Order getModel() {
        return order;
    }
}

提交订单界面

后台商品管理功能为商家提供了完善的产品维护能力。管理员可以添加新商品、编辑现有商品信息、上下架商品以及管理库存。AdminCakeAction类专门处理后台商品管理请求,通过CakeService完成数据持久化操作。

/**
 * 后台蛋糕管理Action
 */
public class AdminCakeAction extends ActionSupport implements ModelDriven<Cake> {
    private Cake cake = new Cake();
    private CakeService cakeService;
    // 文件上传相关属性
    private File upload; // 上传的文件
    private String uploadFileName; // 文件名称

    public void setCakeService(CakeService cakeService) {
        this.cakeService = cakeService;
    }

    /**
     * 添加新蛋糕商品
     */
    public String addCake() {
        try {
            if (upload != null) {
                // 处理图片上传逻辑
                String filePath = ServletActionContext.getServletContext().getRealPath("/cake_images");
                File destFile = new File(filePath, uploadFileName);
                FileUtils.copyFile(upload, destFile);
                cake.setImg("cake_images/" + uploadFileName);
            }
            cakeService.save(cake);
            return SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
    }

    /**
     * 更新蛋糕信息
     */
    public String updateCake() {
        cakeService.update(cake);
        return SUCCESS;
    }

    @Override
    public Cake getModel() {
        return cake;
    }

    // 文件上传的Getter和Setter
    public File getUpload() {
        return upload;
    }

    public void setUpload(File upload) {
        this.upload = upload;
    }

    public String getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
}

后台商品管理界面

在业务逻辑层,Spring的声明式事务管理确保了数据操作的原子性和一致性。CakeServiceImpl类使用@Transactional注解来管理事务边界。

/**
 * 蛋糕业务逻辑实现类
 */
@Service("cakeService")
@Transactional
public class CakeServiceImpl implements CakeService {
    
    @Autowired
    private CakeDao cakeDao;

    @Override
    public void save(Cake cake) {
        cakeDao.save(cake);
    }

    @Override
    public void update(Cake cake) {
        cakeDao.update(cake);
    }

    @Override
    public Cake findByCakeId(Integer cakeId) {
        return cakeDao.findByCakeId(cakeId);
    }

    @Override
    @Transactional(readOnly = true)
    public PageBean<Cake> findByPage(Integer page) {
        PageBean<Cake> pageBean = new PageBean<>();
        // 设置当前页
        pageBean.setPage(page);
        // 设置每页显示记录数
        int limit = 8;
        pageBean.setLimit(limit);
        // 设置总记录数
        int totalCount = cakeDao.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<Cake> list = cakeDao.findByPage(begin, limit);
        pageBean.setList(list);
        return pageBean;
    }
}

数据持久层基于Hibernate实现,CakeDaoImpl类封装了所有的数据访问操作,使用HQL(Hibernate Query Language)进行复杂查询。

/**
 * 蛋糕数据访问实现类
 */
@Repository("cakeDao")
public class CakeDaoImpl extends HibernateDaoSupport implements CakeDao {
    
    @Autowired
    public void setSessionFactory0(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }

    @Override
    public void save(Cake cake) {
        getHibernateTemplate().save(cake);
    }

    @Override
    public void update(Cake cake) {
        getHibernateTemplate().update(cake);
    }

    @Override
    public Cake findByCakeId(Integer cakeId) {
        return getHibernateTemplate().get(Cake.class, cakeId);
    }

    @Override
    public int findCount() {
        String hql = "select count(*) from Cake";
        List<Long> list = (List<Long>) getHibernateTemplate().find(hql);
        if (list != null && list.size() > 0) {
            return list.get(0).intValue();
        }
        return 0;
    }

    @Override
    public List<Cake> findByPage(int begin, int limit) {
        String hql = "from Cake order by cakeId desc";
        return getHibernateTemplate().execute(new HibernateCallback<List<Cake>>() {
            @Override
            public List<Cake> doInHibernate(Session session) throws HibernateException {
                Query query = session.createQuery(hql);
                query.setFirstResult(begin);
                query.setMaxResults(limit);
                return query.list();
            }
        });
    }
}

用户订单管理界面

平台的实体模型设计严格遵循面向对象原则,核心实体类如UserCakeOrder等通过注解方式配置与数据库表的映射关系。

/**
 * 用户实体类
 */
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "uid")
    private Integer uid;
    
    @Column(name = "username", unique = true, nullable = false)
    private String username;
    
    @Column(name = "password", nullable = false)
    private String password;
    
    @Column(name = "name")
    private String name;
    
    @Column(name = "email")
    private String email;
    
    @Column(name = "phone")
    private String phone;
    
    @Column(name = "addr")
    private String addr;
    
    @Column(name = "state")
    private Integer state;
    
    @Column(name = "code")
    private String code;
    
    // 一对多关系:一个用户可以有多个订单
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Order> orders = new HashSet<>();

    // 省略getter和setter方法
}

为了进一步提升平台的商业价值和技术先进性,可以考虑以下几个优化方向:

首先,集成第三方支付接口(如支付宝、微信支付),实现真正的在线支付功能。这需要在订单实体中增加支付相关的字段,如支付方式、支付状态、交易流水号等,并开发相应的支付回调处理逻辑。

其次,引入Redis等内存数据库作为缓存层,将热点数据(如热门商品信息、首页内容)缓存到内存中,显著减少数据库访问压力,提升系统响应速度。可以基于Spring的缓存注解@Cacheable来实现透明的缓存机制。

第三,开发基于用户行为分析的智能推荐系统。通过收集用户的浏览记录、购买历史等数据,使用协同过滤或基于内容的推荐算法,为用户推荐可能感兴趣的蛋糕商品,提升转化率和用户体验。

第四,实现微服务架构改造。将单体应用拆分为用户服务、商品服务、订单服务、支付服务等独立的微服务,每个服务独立部署和扩展,使用Spring Cloud体系中的Eureka实现服务注册与发现,使用Feign实现服务间调用,提升系统的可维护性和可扩展性。

最后,加强移动端支持,开发基于React Native或Flutter的跨平台移动应用,或者提供完善的RESTful API供第三方移动应用调用,满足用户移动购物需求。

该SSH蛋糕电商平台通过经典的分层架构和成熟的框架组合,为中小型烘焙企业提供了稳定可靠的线上销售渠道。清晰的技术栈选择、合理的数据库设计以及模块化的代码结构,不仅保证了当前系统的稳定运行,也为未来的功能扩展和技术演进奠定了坚实基础。随着电子商务模式的不断发展和用户需求的日益多样化,平台持续优化的潜力巨大。

本文关键词
SSH框架在线蛋糕销售电子商务平台源码解析Struts2 Spring Hibernate

上下篇

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