在传统羽毛球馆和运动俱乐部的日常运营中,管理人员常常面临信息记录分散、预约流程繁琐、数据统计困难等挑战。纸质登记本和零散的电子表格不仅效率低下,而且极易导致数据错漏与遗失。为了解决这些核心痛点,我们设计并实现了一套高效、稳定的羽毛球运动信息管理平台。
该系统采用经典的JSP+Servlet技术架构,结合MySQL数据库,实现了会员管理、场地预约、订单处理、公告发布等核心业务功能的在线化与自动化。通过集中化的数据管理和直观的用户界面,显著提升了运动场馆的运营效率和管理规范化水平。
系统架构与技术栈
该平台采用典型的三层架构模式,清晰分离了表示层、业务逻辑层和数据访问层。
技术栈组成:
- 前端技术: HTML、CSS、JavaScript,负责用户界面的渲染和交互
- 表示层: JSP(JavaServer Pages)负责动态页面生成和数据显示
- 控制层: Servlet处理所有HTTP请求,进行业务逻辑调度和响应控制
- 数据持久层: JDBC直接连接MySQL数据库,采用DAO模式封装数据操作
- 安全控制: 基于Filter实现访问权限控制,Session管理用户登录状态
// 示例:基础Servlet控制器结构
public class MemberServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
MemberDAO memberDAO = new MemberDAO();
switch(action) {
case "add":
// 处理会员添加逻辑
addMember(request, response, memberDAO);
break;
case "update":
// 处理会员更新逻辑
updateMember(request, response, memberDAO);
break;
case "delete":
// 处理会员删除逻辑
deleteMember(request, response, memberDAO);
break;
default:
// 默认查询逻辑
listMembers(request, response, memberDAO);
}
}
private void addMember(HttpServletRequest request,
HttpServletResponse response,
MemberDAO memberDAO) {
// 具体的业务逻辑实现
String name = request.getParameter("xm");
String phone = request.getParameter("dh");
// ... 其他参数获取
Member member = new Member(name, phone, /* 其他属性 */);
boolean success = memberDAO.insert(member);
// 结果处理和页面跳转
if(success) {
response.sendRedirect("member?msg=success");
} else {
response.sendRedirect("member?error=failed");
}
}
}
数据库设计亮点
数据库设计是系统稳定性的基石,本项目通过精心设计的表结构和合理的字段规划,确保了数据的一致性和查询效率。
核心表结构深度分析
1. 团队表(td)设计分析
CREATE TABLE `td` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`xm` varchar(50) DEFAULT NULL COMMENT '姓名',
`xb` varchar(50) DEFAULT NULL COMMENT '性别',
`sfz` varchar(50) DEFAULT NULL COMMENT '身份证',
`dh` varchar(50) DEFAULT NULL COMMENT '电话',
`dz` varchar(50) DEFAULT NULL COMMENT '地址',
`bz` varchar(200) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='团队表'
设计亮点:
- 主键设计: 采用自增INT类型主键,保证插入性能和数据唯一性
- 字段长度优化: 根据实际业务需求合理设置字段长度,如姓名
varchar(50)足够覆盖绝大多数场景 - 字符集选择: 使用utf8字符集,完美支持中文存储
- 存储引擎: InnoDB引擎支持事务处理,确保数据一致性
- 注释规范: 每个字段都添加了详细的中文注释,提高可维护性
2. 订单表(dd)的业务逻辑设计
CREATE TABLE `dd` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ddid` varchar(200) DEFAULT NULL COMMENT '订单ID',
`member` varchar(50) DEFAULT NULL COMMENT '会员',
`zt` varchar(200) DEFAULT NULL COMMENT '状态',
`fkfs` varchar(50) DEFAULT NULL COMMENT '付款方式',
`addtime` varchar(50) DEFAULT NULL COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='订单表'
业务考量:
- 订单ID分离: 将业务订单ID(
ddid)与技术主键(id)分离,便于业务扩展 - 状态管理:
zt字段支持多种订单状态(待支付、已确认、已完成等) - 时间记录:
addtime记录订单创建时间,用于数据分析和查询排序 - 支付方式:
fkfs字段支持多种支付方式的扩展
3. 公告表(affiche)的灵活设计
CREATE TABLE `affiche` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL COMMENT '标题',
`content` varchar(200) DEFAULT NULL COMMENT '内容',
`addtime` varchar(50) DEFAULT NULL COMMENT '添加时间',
`adder` varchar(50) DEFAULT NULL COMMENT '添加人',
`ifhide` int(11) DEFAULT NULL COMMENT '是否隐藏',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='公告表'
功能特色:
- 内容控制:
ifhide字段实现公告的显示/隐藏控制 - 操作追踪:
adder和addtime记录操作痕迹,便于审计 - 标题优化: 标题长度100字符,满足大多数公告标题需求

核心功能实现
1. 会员信息管理模块
会员管理是系统的核心功能之一,实现了会员信息的增删改查完整生命周期管理。
// 会员数据访问对象实现
public class MemberDAO {
private DBO dbo = new DBO();
public boolean insert(Member member) {
String sql = "INSERT INTO td(xm, xb, sfz, dh, dz, bz) VALUES(?,?,?,?,?,?)";
try {
dbo.open();
PreparedStatement pstmt = dbo.getConnection().prepareStatement(sql);
pstmt.setString(1, member.getXm());
pstmt.setString(2, member.getXb());
pstmt.setString(3, member.getSfz());
pstmt.setString(4, member.getDh());
pstmt.setString(5, member.getDz());
pstmt.setString(6, member.getBz());
int result = pstmt.executeUpdate();
return result > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
dbo.close();
}
}
public List<Member> findAll() {
List<Member> members = new ArrayList<>();
String sql = "SELECT * FROM td ORDER BY id DESC";
try {
dbo.open();
ResultSet rs = dbo.executeQuery(sql);
while(rs.next()) {
Member member = new Member();
member.setId(rs.getInt("id"));
member.setXm(rs.getString("xm"));
member.setXb(rs.getString("xb"));
member.setSfz(rs.getString("sfz"));
member.setDh(rs.getString("dh"));
member.setDz(rs.getString("dz"));
member.setBz(rs.getString("bz"));
members.add(member);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
dbo.close();
}
return members;
}
}

2. 场地预约系统
场地预约功能实现了用户在线选择时间段、提交预约申请、管理员审核的全流程管理。
<%-- 场地预约JSP页面片段 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>场地预约</title>
<script>
function validateForm() {
var date = document.getElementById("date").value;
var time = document.getElementById("time").value;
if(!date || !time) {
alert("请选择预约日期和时间段");
return false;
}
return true;
}
function checkAvailability() {
// AJAX检查时间段是否可用
var date = document.getElementById("date").value;
var time = document.getElementById("time").value;
if(date && time) {
// 发送异步请求检查场地可用性
// 实现代码...
}
}
</script>
</head>
<body>
<h2>场地预约</h2>
<form action="BookingServlet" method="post" onsubmit="return validateForm()">
<input type="hidden" name="action" value="book">
<div class="form-group">
<label>预约日期:</label>
<input type="date" id="date" name="date" required
onchange="checkAvailability()">
</div>
<div class="form-group">
<label>时间段:</label>
<select id="time" name="time" required onchange="checkAvailability()">
<option value="">请选择</option>
<option value="08:00-10:00">08:00-10:00</option>
<option value="10:00-12:00">10:00-12:00</option>
<option value="14:00-16:00">14:00-16:00</option>
<option value="16:00-18:00">16:00-18:00</option>
<option value="19:00-21:00">19:00-21:00</option>
</select>
</div>
<div class="form-group">
<label>备注信息:</label>
<textarea name="remark" rows="3" placeholder="可选"></textarea>
</div>
<button type="submit">提交预约</button>
</form>
</body>
</html>

3. 订单处理流程
订单系统实现了从预约生成订单到支付完成的完整业务流程。
// 订单业务逻辑处理
public class OrderService {
private OrderDAO orderDAO = new OrderDAO();
public String createOrder(Booking booking, Member member) {
// 生成唯一订单ID
String orderId = generateOrderId();
Order order = new Order();
order.setDdid(orderId);
order.setMember(member.getXm());
order.setZt("待支付");
order.setAddtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
if(orderDAO.insert(order)) {
// 发送订单创建通知
sendOrderNotification(member, order);
return orderId;
}
return null;
}
private String generateOrderId() {
return "DD" + System.currentTimeMillis() +
String.format("%04d", (int)(Math.random() * 10000));
}
public boolean processPayment(String orderId, String paymentMethod) {
Order order = orderDAO.findByOrderId(orderId);
if(order != null && "待支付".equals(order.getZt())) {
order.setZt("已支付");
order.setFkfs(paymentMethod);
boolean updated = orderDAO.update(order);
if(updated) {
// 更新场地状态
updateVenueStatus(order);
return true;
}
}
return false;
}
}

4. 权限管理与安全控制
系统通过Filter实现统一的权限验证,确保未登录用户无法访问受保护资源。
// 权限控制过滤器
public class AuthFilter implements Filter {
private static final String[] PUBLIC_URLS = {
"/login.jsp", "/LoginServlet", "/logout.jsp",
"/register.jsp", "/css/", "/js/", "/images/"
};
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession session = httpRequest.getSession(false);
String path = httpRequest.getRequestURI().substring(
httpRequest.getContextPath().length());
// 检查是否为公开路径
if(isPublicPath(path)) {
chain.doFilter(request, response);
return;
}
// 检查用户登录状态
if(session != null && session.getAttribute("user") != null) {
User user = (User) session.getAttribute("user");
// 检查角色权限
if(hasPermission(user, path)) {
chain.doFilter(request, response);
} else {
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "权限不足");
}
} else {
// 重定向到登录页面
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.jsp");
}
}
private boolean isPublicPath(String path) {
for(String publicUrl : PUBLIC_URLS) {
if(path.startsWith(publicUrl)) {
return true;
}
}
return false;
}
private boolean hasPermission(User user, String path) {
// 根据用户角色和访问路径判断权限
// 实现细节...
return true;
}
}

实体模型设计
系统采用面向对象的设计思想,通过实体类封装业务数据模型。
// 公告实体类
public class Affiche {
private int id;
private String title;
private String content;
private String addtime;
private String adder;
private int ifhide;
// 构造函数
public Affiche() {}
public Affiche(String title, String content, String adder) {
this.title = title;
this.content = content;
this.adder = adder;
this.addtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
this.ifhide = 0; // 默认显示
}
// Getter和Setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getAddtime() { return addtime; }
public void setAddtime(String addtime) { this.addtime = addtime; }
public String getAdder() { return adder; }
public void setAdder(String adder) { this.adder = adder; }
public int getIfhide() { return ifhide; }
public void setIfhide(int ifhide) { this.ifhide = ifhide; }
// 业务方法
public boolean isHidden() {
return ifhide == 1;
}
public void publish() {
this.ifhide = 0;
}
public void hide() {
this.ifhide = 1;
}
}
功能展望与优化
基于当前系统架构,以下是几个可行的未来优化方向:
1. 引入Redis缓存层
优化目标: 提升系统响应速度,减轻数据库压力 实现方案:
// 缓存服务示例
@Service
public class CacheService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public Member getMemberFromCache(int memberId) {
String key = "member:" + memberId;
Member member = (Member) redisTemplate.opsForValue().get(key);
if(member == null) {
// 缓存未命中,从数据库加载
member = memberDAO.findById(memberId);
if(member != null) {
redisTemplate.opsForValue().set(key, member, 30, TimeUnit.MINUTES);
}
}
return member;
}
}
2. 微服务架构改造
优化目标: 提高系统可扩展性和维护性 架构设计:
- 将单体应用拆分为会员服务、预约服务、订单服务、公告服务等独立微服务
- 使用Spring Cloud实现服务注册发现、配置管理、负载均衡
- API网关统一处理请求路由和认证授权
3. 移动端适配与PWA应用
优化目标: 提升用户体验,支持移动设备访问 技术方案:
- 开发响应式Web设计,适配不同屏幕尺寸
- 实现PWA(Progressive Web App)特性,支持离线访问
- 开发原生移动应用(React Native/Flutter)
4. 大数据分析与智能推荐
优化目标: 提供数据驱动的运营决策支持 功能规划:
-- 数据分析查询示例
SELECT
HOUR(addtime) as hour,
COUNT(*) as booking_count,
AVG(duration) as avg_duration
FROM dd
WHERE zt = '已完成'
AND addtime >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY HOUR(addtime)
ORDER BY booking_count DESC;
5. 消息队列异步处理
优化目标: 解耦系统组件,提高吞吐量 应用场景:
- 订单创建后的通知消息异步发送
- 数据统计报表的异步生成
- 批量操作的异步处理
// 消息