在当今电子商务蓬勃发展的时代,专业垂直领域的在线商城系统成为连接供应商与消费者的重要桥梁。针对咖啡豆这一具有特定消费群体的商品,一个功能完善、性能稳定的在线销售平台能够有效解决传统销售模式中的地域限制和信息不对称问题。该系统采用经典的SSH(Struts2 + Spring + Hibernate)集成框架,构建了一个集商品展示、在线交易、订单管理和用户服务于一体的专业级咖啡豆电商解决方案。
系统架构与技术栈设计
该平台采用典型的三层架构设计,充分发挥了SSH框架的组合优势。表现层使用Struts2框架处理用户请求与页面跳转,通过其强大的拦截器机制实现统一的权限验证与数据校验。业务逻辑层由Spring框架的IoC容器进行Bean管理,利用声明式事务控制确保核心业务操作的数据一致性。数据持久层基于Hibernate实现对象关系映射,通过HQL语言进行高效查询,并借助缓存机制提升系统性能。
技术栈配置体现了企业级应用的标准规范:
<!-- Spring配置示例 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/coffee_mall"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- Hibernate会话工厂配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>com/coffee/model/Goods.hbm.xml</value>
<value>com/coffee/model/Order.hbm.xml</value>
</list>
</property>
</bean>
前端采用JSP动态页面技术,结合jQuery库实现丰富的交互效果,确保用户在使用过程中的流畅体验。系统整体架构清晰,各层职责分明,为后续功能扩展和维护提供了良好的基础。
数据库设计亮点分析
订单模块的精细化设计
订单管理作为电商系统的核心,其数据库设计直接关系到业务处理的准确性和效率。t_order表与t_orderitem表的分离设计体现了良好的数据库规范化原则:
-- 订单主表结构
CREATE TABLE `t_order` (
`order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_bianhao` varchar(50) DEFAULT NULL COMMENT '订单编号',
`order_date` varchar(50) DEFAULT NULL COMMENT '订单日期',
`order_zhuangtai` varchar(50) DEFAULT NULL COMMENT '订单状态',
`order_songhuodizhi` varchar(50) DEFAULT NULL COMMENT '送货地址',
`order_fukuangfangshi` varchar(50) DEFAULT NULL COMMENT '付款方式',
`order_jine` int(11) DEFAULT NULL COMMENT '订单金额',
`order_user_id` int(11) DEFAULT NULL COMMENT '用户ID',
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='订单表'
-- 订单项表结构
CREATE TABLE `t_orderitem` (
`orderItem_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
`order_id` int(11) DEFAULT NULL COMMENT '订单ID',
`goods_id` int(11) DEFAULT NULL COMMENT '商品ID',
`goods_quantity` int(11) DEFAULT NULL COMMENT '商品数量',
PRIMARY KEY (`orderItem_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='订单项表'
这种设计支持一个订单包含多个商品项,符合实际业务场景。订单编号字段采用varchar类型,便于生成具有业务意义的订单号(如"COFFEE202405200001")。金额字段使用int类型存储分单位数值,避免浮点数运算的精度问题。
商品管理的灵活架构
商品表t_goods的设计充分考虑了咖啡豆销售的特殊性:
CREATE TABLE `t_goods` (
`goods_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`goods_name` varchar(50) DEFAULT NULL COMMENT '商品名称',
`goods_miaoshu` varchar(4000) DEFAULT NULL COMMENT '商品描述',
`goods_pic` varchar(50) DEFAULT NULL COMMENT '商品图片',
`goods_shichangjia` int(11) DEFAULT NULL COMMENT '商品市场价',
`goods_tejia` int(11) DEFAULT NULL COMMENT '商品特价',
`goods_isnottejia` varchar(50) DEFAULT NULL COMMENT '是否特价',
`goods_catelog_id` int(11) DEFAULT NULL COMMENT '商品分类ID',
`goods_kucun` int(11) DEFAULT NULL COMMENT '商品库存',
`goods_Del` varchar(50) DEFAULT NULL COMMENT '删除标记',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='商品表'
商品描述字段长度达到4000字符,满足咖啡豆产地、烘焙程度、风味特点等详细信息的展示需求。特价相关字段的设计支持灵活的促销策略,软删除标记(goods_Del)实现了数据的逻辑删除,保证历史数据的完整性。

核心功能实现详解
用户认证与权限管理
系统采用基于角色的访问控制机制,区分普通用户和管理员权限。用户登录验证通过Struts2的拦截器实现:
// 用户登录Action
public class UserLoginAction extends ActionSupport {
private String user_name;
private String user_pw;
private UserDAO userDAO;
public String execute() throws Exception {
User user = userDAO.findByUsernameAndPassword(user_name, user_pw);
if (user != null) {
Map session = ActionContext.getContext().getSession();
session.put("user", user);
return SUCCESS;
} else {
this.addActionError("用户名或密码错误!");
return ERROR;
}
}
// Getter和Setter方法
public String getUser_name() { return user_name; }
public void setUser_name(String user_name) { this.user_name = user_name; }
// 其他getter/setter方法...
}
// 权限拦截器配置
public class AuthInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession();
User user = (User) session.get("user");
if (user == null) {
return "login";
}
return invocation.invoke();
}
}

购物车与订单处理机制
购物车功能采用Session存储方式,提供流畅的商品添加和修改体验:
// 购物车管理Action
public class CartAction extends ActionSupport {
private Map<Integer, CartItem> cart;
private int goods_id;
private int quantity;
public String addToCart() {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
cart = (Map<Integer, CartItem>) session.getAttribute("cart");
if (cart == null) {
cart = new HashMap<Integer, CartItem>();
}
Goods goods = goodsDAO.findById(goods_id);
if (cart.containsKey(goods_id)) {
CartItem item = cart.get(goods_id);
item.setQuantity(item.getQuantity() + quantity);
} else {
CartItem newItem = new CartItem(goods, quantity);
cart.put(goods_id, newItem);
}
session.setAttribute("cart", cart);
return SUCCESS;
}
}
// 订单生成服务类
@Service
@Transactional
public class OrderService {
@Autowired
private OrderDAO orderDAO;
@Autowired
private GoodsDAO goodsDAO;
public String createOrder(Order order, List<OrderItem> items) {
try {
// 生成订单编号
String orderNo = "COFFEE" + System.currentTimeMillis();
order.setOrder_bianhao(orderNo);
order.setOrder_date(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 保存订单主表
orderDAO.save(order);
// 处理订单项并更新库存
for (OrderItem item : items) {
item.setOrder_id(order.getOrder_id());
orderDAO.saveOrderItem(item);
// 更新商品库存
Goods goods = goodsDAO.findById(item.getGoods_id());
goods.setGoods_kucun(goods.getGoods_kucun() - item.getGoods_quantity());
goodsDAO.update(goods);
}
return orderNo;
} catch (Exception e) {
throw new RuntimeException("订单创建失败", e);
}
}
}

商品检索与展示优化
商品列表页面采用分页查询技术,结合Hibernate的查询优化:
// 商品分页查询实现
@Repository
public class GoodsDAOImpl extends HibernateDaoSupport implements GoodsDAO {
public PageBean<Goods> findGoodsByPage(int page, int pageSize, String catalogId) {
PageBean<Goods> pageBean = new PageBean<Goods>();
pageBean.setPage(page);
pageBean.setPageSize(pageSize);
String hql = "from Goods where goods_Del = 'no'";
if (catalogId != null && !catalogId.equals("")) {
hql += " and goods_catelog_id = " + catalogId;
}
// 查询总记录数
String countHql = "select count(*) " + hql;
Long totalCount = (Long) this.getHibernateTemplate().find(countHql).get(0);
pageBean.setTotalCount(totalCount.intValue());
// 查询分页数据
Query query = this.getSession().createQuery(hql);
query.setFirstResult((page - 1) * pageSize);
query.setMaxResults(pageSize);
List<Goods> list = query.list();
pageBean.setList(list);
return pageBean;
}
// 特价商品查询
public List<Goods> findTejiaGoods() {
String hql = "from Goods where goods_isnottejia = '是' and goods_Del = 'no' order by goods_id desc";
return this.getHibernateTemplate().find(hql);
}
}

后台管理功能实现
管理员后台提供完整的商品、订单、用户管理功能:
// 商品管理Action
public class GoodsManageAction extends ActionSupport {
private Goods goods;
private File upload; // 上传的文件
private String uploadFileName; // 文件名
public String addGoods() throws Exception {
if (upload != null) {
// 处理图片上传
String path = ServletActionContext.getServletContext().getRealPath("/goodsImages");
File destFile = new File(path, uploadFileName);
FileUtils.copyFile(upload, destFile);
goods.setGoods_pic(uploadFileName);
}
goods.setGoods_Del("no");
goodsDAO.save(goods);
return SUCCESS;
}
public String deleteGoods() {
Goods delGoods = goodsDAO.findById(goods.getGoods_id());
delGoods.setGoods_Del("yes"); // 逻辑删除
goodsDAO.update(delGoods);
return SUCCESS;
}
}

实体模型设计
系统采用面向对象的设计思想,通过Hibernate映射文件定义实体关系:
<!-- 商品实体映射配置 -->
<hibernate-mapping>
<class name="com.coffee.model.Goods" table="t_goods">
<id name="goods_id" column="goods_id">
<generator class="identity"/>
</id>
<property name="goods_name" column="goods_name" type="string"/>
<property name="goods_miaoshu" column="goods_miaoshu" type="text"/>
<property name="goods_pic" column="goods_pic" type="string"/>
<property name="goods_shichangjia" column="goods_shichangjia" type="integer"/>
<property name="goods_tejia" column="goods_tejia" type="integer"/>
<property name="goods_isnottejia" column="goods_isnottejia" type="string"/>
<property name="goods_catelog_id" column="goods_catelog_id" type="integer"/>
<property name="goods_kucun" column="goods_kucun" type="integer"/>
<property name="goods_Del" column="goods_Del" type="string"/>
</class>
</hibernate-mapping>
// 订单实体类设计
@Entity
@Table(name = "t_order")
public class Order {
private Integer order_id;
private String order_bianhao;
private String order_date;
private String order_zhuangtai;
private String order_songhuodizhi;
private String order_fukuangfangshi;
private Integer order_jine;
private Integer order_user_id;
private List<OrderItem> orderItems;
// 一对多关系配置
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
public List<OrderItem> getOrderItems() {
return orderItems;
}
// 其他getter/setter方法...
}
功能展望与优化方向
性能优化方案
- 缓存机制引入:集成Redis作为二级缓存,缓存热点商品数据和页面片段
// Redis缓存配置示例
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
- 数据库读写分离:配置MySQL主从复制,将读操作分发到从库
功能扩展建议
- 智能推荐系统:基于用户浏览和购买历史实现个性化推荐
// 推荐算法基础实现
@Service
public class RecommendationService {
public List<Goods> recommendGoods(Integer userId) {
// 基于协同过滤的推荐逻辑
// 实现用户相似度计算和商品评分预测
return recommendedGoods;
}
}
移动端适配:开发响应式前端或独立的移动App,提升移动用户体验
第三方支付集成:增加微信支付、支付宝等主流支付方式
物流跟踪功能:集成快递鸟等物流查询接口,实现订单物流实时跟踪
总结
该咖啡豆电商平台通过SSH框架的有机整合,构建了一个稳定可靠的专业级在线销售系统。系统架构清晰,数据库设计合理,核心功能完善。订单管理模块支持复杂的业务场景,商品管理提供灵活的营销策略,用户系统确保安全的交易环境。在现有基础上,通过引入缓存机制、智能推荐、移动端适配等优化措施,可以进一步提升系统性能和用户体验,为咖啡豆供应商和消费者提供更加优质的电商服务。
系统的模块化设计和标准化的编码规范为后续维护和扩展奠定了良好基础,体现了企业级应用开发的专业水准。随着业务的不断发展,该系统有望成为咖啡垂直电商领域的标杆解决方案。