基于SSH框架的在线游乐园票务管理系统 - 源码深度解析
在现代游乐园运营中,高效、便捷的票务管理已成为提升游客体验和运营效率的核心要素。传统线下售票模式普遍存在排队时间长、票务数据分散、财务对账复杂等痛点问题。为此,我们基于成熟的SSH框架设计并实现了一套智慧游乐园票务管理平台,通过数字化手段全面重构票务销售流程,实现业务闭环管理。
系统架构与技术栈选型
该平台采用经典的MVC三层架构设计,严格遵循高内聚、低耦合的开发原则,确保系统的可维护性和扩展性。
架构分层设计
- 表现层:使用Struts2框架处理用户请求和页面跳转,通过配置struts.xml文件定义Action映射关系,实现请求的集中管理和控制
- 业务逻辑层:由Spring框架的IoC容器统一管理各种Service组件,通过依赖注入降低组件耦合度,同时提供声明式事务管理
- 数据持久层:采用Hibernate实现对象关系映射,通过SessionFactory管理数据库会话,大幅简化数据访问操作
核心技术配置
<!-- 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/amusement_park?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
</bean>
<!-- Hibernate会话工厂配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/briup/entity/Comment.hbm.xml</value>
<!-- 其他实体映射文件 -->
</list>
</property>
</bean>
数据库设计亮点与优化策略
数据库采用MySQL 5.7版本,共设计10张核心业务表,涵盖用户管理、票务信息、订单处理、留言反馈等关键模块。
订单表设计 - 业务完整性的典范
CREATE TABLE t_order (
id INT PRIMARY KEY AUTO_INCREMENT,
order_number VARCHAR(64) NOT NULL UNIQUE COMMENT '系统生成的唯一订单号',
user_id INT NOT NULL COMMENT '关联用户ID',
ticket_id INT NOT NULL COMMENT '关联门票ID',
quantity INT NOT NULL DEFAULT 1 COMMENT '购买数量',
total_amount DECIMAL(10,2) NOT NULL COMMENT '总金额(精确计算)',
status TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态:1-待支付 2-已支付 3-已取消 4-已退款',
create_time DATETIME NOT NULL COMMENT '订单创建时间',
pay_time DATETIME COMMENT '支付完成时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
INDEX idx_user_id (user_id),
INDEX idx_create_time (create_time),
INDEX idx_status (status),
FOREIGN KEY (user_id) REFERENCES t_user(id) ON DELETE RESTRICT,
FOREIGN KEY (ticket_id) REFERENCES t_ticket(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
设计亮点:
- 状态机管理:通过status字段实现完整的订单生命周期管理
- 金额精确存储:使用DECIMAL类型避免浮点数计算误差
- 索引优化:建立复合索引提升用户查询和历史订单检索性能
- 外键约束:确保数据完整性和一致性
留言表设计 - 支持完整互动流程
CREATE TABLE t_comment (
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(1000) NOT NULL COMMENT '留言内容',
nick_name VARCHAR(30) NOT NULL COMMENT '网友昵称',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '留言时间',
reply_content VARCHAR(1000) COMMENT '管理员回复内容',
reply_time DATETIME COMMENT '回复时间',
is_show TINYINT DEFAULT 1 COMMENT '是否显示:0-隐藏 1-显示',
INDEX idx_create_time (create_time),
INDEX idx_is_show (is_show)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

核心功能模块实现详解
1. 票务管理模块
票务管理模块实现了门票信息的完整CRUD操作、库存动态管理和灵活的价格策略设置。
@Service("ticketService")
@Transactional
public class TicketServiceImpl implements TicketService {
@Autowired
private TicketDao ticketDao;
/**
* 添加门票信息
* 包含业务规则验证和数据完整性处理
*/
public void addTicket(Ticket ticket) {
// 验证票价合理性
if (ticket.getPrice().compareTo(BigDecimal.ZERO) < 0) {
throw new BusinessException("票价不能为负数");
}
// 验证库存数量
if (ticket.getStock() < 0) {
throw new BusinessException("库存数量不能为负数");
}
// 设置创建时间和初始状态
ticket.setCreateTime(new Date());
ticket.setStatus(1); // 1-上架状态
ticketDao.save(ticket);
}
/**
* 分页查询门票信息
* 支持按时间倒序排列,便于查看最新门票
*/
public PageModel<Ticket> findTicketsByPage(int pageNo, int pageSize) {
return ticketDao.findByPage("from Ticket where status = 1 order by createTime desc",
pageNo, pageSize);
}
/**
* 更新门票库存
* 使用悲观锁防止超卖
*/
@Transactional
public void updateStock(int ticketId, int quantity) {
Ticket ticket = ticketDao.get(ticketId);
if (ticket.getStock() < quantity) {
throw new BusinessException("库存不足");
}
ticket.setStock(ticket.getStock() - quantity);
ticketDao.update(ticket);
}
}

2. 购物车与订单处理系统
购物车功能采用Session临时存储方案,支持多门票添加、实时数量调整和批量结算。
@Controller
@Scope("prototype")
public class CartAction extends BaseAction {
private List<CartItem> cartItems;
private BigDecimal totalAmount;
/**
* 添加门票到购物车
* 支持同一门票数量累加
*/
public String addToCart() {
Ticket ticket = ticketService.findById(ticketId);
// 库存验证
if (ticket.getStock() < quantity) {
addActionError("库存不足,当前剩余:" + ticket.getStock());
return ERROR;
}
CartItem item = new CartItem(ticket, quantity);
// 从Session获取购物车
Map<Integer, CartItem> cart = getSessionCart();
if (cart.containsKey(ticketId)) {
// 更新数量
CartItem existing = cart.get(ticketId);
existing.setQuantity(existing.getQuantity() + quantity);
} else {
cart.put(ticketId, item);
}
// 更新购物车总金额
updateCartTotal();
return "cart_success";
}
/**
* 生成订单
* 包含事务管理和异常处理
*/
@Transactional
public String createOrder() {
try {
User user = getCurrentUser();
Order order = new Order();
order.setUser(user);
order.setOrderNumber(generateOrderNumber());
order.setTotalAmount(calculateTotal());
order.setCreateTime(new Date());
order.setStatus(1); // 待支付状态
// 创建订单并减少库存
orderService.createOrder(order, cartItems);
// 清空购物车
clearCart();
return "order_success";
} catch (Exception e) {
// 事务回滚
addActionError("订单创建失败:" + e.getMessage());
return ERROR;
}
}
/**
* 生成唯一订单号
* 格式:时间戳+随机数
*/
private String generateOrderNumber() {
return System.currentTimeMillis() + "" + (int)((Math.random() * 9 + 1) * 1000);
}
}

3. 留言互动系统
留言模块采用JPA注解进行实体映射,支持完整的留言回复和管理功能。
@Entity
@Table(name="t_comment")
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "content", length = 1000, nullable = false)
private String content;
@Column(name = "nick_name", length = 30, nullable = false)
private String nickName;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_time", nullable = false)
private Date createTime;
@Column(name = "reply_content", length = 1000)
private String replyContent;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "reply_time")
private Date replyTime;
@Column(name = "is_show")
private Integer isShow = 1;
// Getter和Setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getNickName() { return nickName; }
public void setNickName(String nickName) { this.nickName = nickName; }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
public String getReplyContent() { return replyContent; }
public void setReplyContent(String replyContent) { this.replyContent = replyContent; }
public Date getReplyTime() { return replyTime; }
public void setReplyTime(Date replyTime) { this.replyTime = replyTime; }
public Integer getIsShow() { return isShow; }
public void setIsShow(Integer isShow) { this.isShow = isShow; }
}
系统特色与技术创新
- 完整的业务流程:从门票浏览、购物车管理到订单支付,实现全流程数字化管理
- 性能优化:通过数据库索引优化、连接池配置提升系统响应速度
- 事务安全:采用Spring声明式事务管理,确保数据一致性
- 用户体验:友好的界面设计和流畅的操作流程,提升用户满意度
该系统不仅解决了传统票务管理的痛点,更为游乐园的数字化转型提供了可靠的技术支撑。