1. 项目概述:篮球馆球衣与场馆预定管理系统
最近帮本地篮球馆做了套管理系统,整合了球衣租赁和场地预定两大核心功能。这个系统用PHP+MySQL开发,特别适合中小型篮球场馆的日常运营管理。系统上线后场馆的预约效率提升了60%,球衣库存管理也实现了数字化。
传统篮球馆常面临两个痛点:一是场地预约靠电话或纸质登记,容易出错且效率低;二是球队服装管理混乱,经常出现丢失或错拿。这套系统就是为解决这些问题设计的,采用B/S架构让管理员和用户都能通过浏览器便捷操作。
提示:系统采用模块化设计,球衣管理和场地预定既可独立运行,也能无缝整合。源码包已包含完整数据库结构和安装脚本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统核心功能解析
2.1 球衣管理模块设计要点
球衣管理采用"球队-球员"二级关联模式。每个球队注册时会分配专属储物柜,柜内球衣按号码排列。系统会记录每件球衣的:
- 唯一RFID标签(物理缝制)
- 当前状态(在库/送洗/损坏)
- 最后使用日期
- 清洗次数统计
关键数据库表设计:
sql复制CREATE TABLE `jerseys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`team_id` int(11) NOT NULL,
`jersey_number` varchar(3) NOT NULL,
`rfid_tag` varchar(32) UNIQUE NOT NULL,
`status` enum('available','washing','damaged') DEFAULT 'available',
`last_used` date DEFAULT NULL,
`wash_count` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 场地预定系统实现方案
场地预定采用可视化时间轴界面,支持:
- 按小时为单位的精确预约
- 团体预约(整队登记)
- 预约冲突自动检测
- 微信/短信提醒功能
核心算法是时间片冲突检测:
php复制function checkTimeConflict($courtId, $startTime, $endTime) {
$sql = "SELECT id FROM reservations
WHERE court_id = ?
AND ((start_time < ? AND end_time > ?)
OR (start_time < ? AND end_time > ?))";
$stmt = $pdo->prepare($sql);
$stmt->execute([$courtId, $endTime, $startTime, $endTime, $startTime]);
return $stmt->rowCount() > 0;
}
3. 技术实现细节
3.1 PHP环境配置建议
推荐使用MAMP Pro作为开发环境,注意这些配置:
- PHP版本建议7.4+(兼容性最好)
- 必须开启的扩展:
- PDO_MySQL
- GD(用于验证码生成)
- mbstring(多语言支持)
- 安全设置:
ini复制expose_php = Off display_errors = Off post_max_size = 16M
3.2 数据库优化技巧
针对高频查询做了这些优化:
- 为预定表添加复合索引:
sql复制ALTER TABLE `reservations` ADD INDEX `court_time` (`court_id`, `start_time`, `end_time`); - 使用存储过程处理每日统计:
sql复制CREATE PROCEDURE `DailyStats`(IN report_date DATE) BEGIN SELECT COUNT(*) as total_orders, SUM(amount) as total_income FROM payments WHERE DATE(pay_time) = report_date; END - 定期执行表优化:
bash复制
mysqlcheck -o basketball_db -u root -p
4. 系统安全防护措施
4.1 防SQL注入方案
采用三层防护:
- PDO预处理语句(基础防护)
- 自定义过滤函数:
php复制function safe_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data, ENT_QUOTES); return $data; } - 数据库操作日志审计
4.2 会话安全管理
- 会话固定防护:
php复制session_regenerate_id(true); - 二次验证机制:
- 关键操作需验证短信验证码
- 管理员操作记录IP和设备指纹
- 自动超时设置:
php复制ini_set('session.gc_maxlifetime', 1800);
5. 部署与运维实战
5.1 Docker部署方案
使用官方PHP镜像+nginx组合:
dockerfile复制FROM php:7.4-fpm
RUN docker-php-ext-install pdo_mysql mbstring
COPY . /var/www/html
nginx配置要点:
nginx复制location ~ \.php$ {
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
5.2 日常维护脚本
- 自动备份脚本(backup.sh):
bash复制#!/bin/bash mysqldump -u root -p basketball_db > /backups/db_$(date +%F).sql zip -r /backups/files_$(date +%F).zip /var/www/html find /backups -mtime +30 -delete - 日志轮转配置:
bash复制/var/log/nginx/*.log { daily missingok rotate 30 compress delaycompress notifempty }
6. 开发经验与避坑指南
6.1 支付接口集成要点
微信支付SDK使用时注意:
- 证书路径必须使用绝对路径
- 异步通知要做重复处理防护
- 金额单位是分(整数)
- 必须验证签名和订单金额
典型回调处理逻辑:
php复制$result = $wechatPay->verify();
if($result && checkOrderStatus($result['out_trade_no'])){
updateOrder($result['out_trade_no'], $result['total_fee']);
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>';
}
6.2 常见问题排查
-
预定时间显示错乱:
- 检查服务器时区设置(应为Asia/Shanghai)
- 前端JS日期对象要转换时区
-
球衣状态不同步:
- 确认RFID读写器网络连接
- 检查jerseys表的触发器是否生效
-
性能突然下降:
sql复制SHOW PROCESSLIST; -- 查看阻塞的查询 ANALYZE TABLE reservations; -- 更新统计信息
这套系统经过三个月的实际运行测试,日均处理200+预定订单和500+次球衣存取记录。最大的收获是认识到:在体育场馆这类线下场景,系统响应速度比花哨的功能更重要。所有关键操作都控制在3秒内完成,这才是用户满意度的关键。
