在电子商务蓬勃发展的时代,传统烘焙行业面临着销售渠道单一、运营效率低下以及客户数据管理困难等挑战。为了应对这些挑战,一款基于经典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_(订单表)的设计则体现了电商业务的复杂性。它通过uid和cakeId分别关联用户表和商品表,记录了购买关系。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();
}
});
}
}

平台的实体模型设计严格遵循面向对象原则,核心实体类如User、Cake、Order等通过注解方式配置与数据库表的映射关系。
/**
* 用户实体类
*/
@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蛋糕电商平台通过经典的分层架构和成熟的框架组合,为中小型烘焙企业提供了稳定可靠的线上销售渠道。清晰的技术栈选择、合理的数据库设计以及模块化的代码结构,不仅保证了当前系统的稳定运行,也为未来的功能扩展和技术演进奠定了坚实基础。随着电子商务模式的不断发展和用户需求的日益多样化,平台持续优化的潜力巨大。