这个系统提供了完整的预约功能,界面简洁易用,特别适合教师在手机端操作。管理员可以方便地管理教师、功能室和预约情况。
系统特点
-
响应式设计:适配手机端访问
-
权限控制:区分普通教师和管理员
-
时间限制:提前一天预约,防止临时预约
-
冲突检测:防止同一时间段重复预约
-
直观展示:日历式显示两周预约情况
-
操作便捷:一键取消、快速预约
-
批量操作:批量导入账号、批量导出预约数据
首页界面:

部分代码:
1. 数据库设计
-- 教师表
CREATE TABLE teachers (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
real_name VARCHAR(50) NOT NULL,
phone VARCHAR(20),
department VARCHAR(100),
is_admin TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 教室表
CREATE TABLE classrooms (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
type ENUM('录播教室', 'AI教室') NOT NULL,
capacity INT,
description TEXT,
is_active TINYINT DEFAULT 1
);
-- 预约表
CREATE TABLE reservations (
id INT AUTO_INCREMENT PRIMARY KEY,
teacher_id INT NOT NULL,
classroom_id INT NOT NULL,
reservation_date DATE NOT NULL,
lesson_period INT NOT NULL, -- 第几节课 (1-7)
subject VARCHAR(100) NOT NULL,
class_name VARCHAR(100) NOT NULL,
course_topic VARCHAR(200) NOT NULL,
status ENUM('pending', 'confirmed', 'cancelled') DEFAULT 'confirmed',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (teacher_id) REFERENCES teachers(id),
FOREIGN KEY (classroom_id) REFERENCES classrooms(id),
UNIQUE KEY unique_reservation (classroom_id, reservation_date, lesson_period)
);
-- 插入默认数据
INSERT INTO classrooms (name, type, capacity) VALUES
('录播教室101', '录播教室', 50),
('录播教室102', '录播教室', 60),
('AI教室201', 'AI教室', 40),
('AI教室202', 'AI教室', 45);
-- 插入管理员账号
INSERT INTO teachers (username, password, real_name, is_admin) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '系统管理员', 1);
2. 数据库配置
<?php
session_start();
define('DB_HOST', 'localhost');
define('DB_NAME', 'classroom_booking');
define('DB_USER', 'root');
define('DB_PASS', '');
try {
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("set names utf8");
} catch(PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
// 时区设置
date_default_timezone_set('Asia/Shanghai');
// 用户登录检查
function checkLogin() {
if (!isset($_SESSION['teacher_id'])) {
header('Location: login.php');
exit;
}
}
// 管理员权限检查
function checkAdmin() {
if (!isset($_SESSION['is_admin']) || $_SESSION['is_admin'] != 1) {
header('Location: index.php');
exit;
}
}
?>
3.部分PHP代码
<?php
require_once 'config.php';
checkLogin();
// 获取两周内的日期
$startDate = date('Y-m-d');
$endDate = date('Y-m-d', strtotime('+13 days'));
$dates = [];
for ($i = 0; $i < 14; $i++) {
$date = date('Y-m-d', strtotime("+$i days"));
$dates[] = [
'date' => $date,
'weekday' => getWeekday(date('w', strtotime($date)))
];
}
// 获取两周内的预约数据
$stmt = $pdo->prepare("
SELECT r.*, c.name as classroom_name, c.type as classroom_type, t.real_name
FROM reservations r
JOIN classrooms c ON r.classroom_id = c.id
JOIN teachers t ON r.teacher_id = t.id
WHERE r.reservation_date BETWEEN ? AND ? AND r.status = 'confirmed'
ORDER BY r.reservation_date, r.lesson_period, c.name
");
$stmt->execute([$startDate, $endDate]);
$reservations = $stmt->fetchAll();
// 按日期和节次组织数据
$schedule = [];
foreach ($reservations as $res) {
$key = $res['reservation_date'] . '_' . $res['lesson_period'];
if (!isset($schedule[$key])) {
$schedule[$key] = [];
}
$schedule[$key][] = $res;
}
function getWeekday($num) {
$weekdays = ['日', '一', '二', '三', '四', '五', '六'];
return $weekdays[$num];
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>功能室预约系统</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 20px; background: #f5f5f5; }
.header { background: white; padding: 15px; border-radius: 8px; margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center; }
.schedule-table { background: white; border-radius: 8px; overflow: hidden; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 12px; text-align: center; }
th { background: #f8f9fa; font-weight: bold; }
.today { background: #e7f3ff !important; }
.reserved { background: #d4edda; cursor: pointer; }
.available { background: #f8f9fa; cursor: pointer; }
.reserved:hover, .available:hover { opacity: 0.8; }
.actions { margin: 20px 0; }
.btn { padding: 10px 15px; background: #007bff; color: white; text-decoration: none; border-radius: 4px; display: inline-block; }
.btn-danger { background: #dc3545; }
.classroom-type { font-size: 12px; color: #666; }
</style>
</head>
<body>
<div class="header">
<h1>功能室预约系统</h1>
<div>
<span>欢迎,<?php echo $_SESSION['real_name']; ?></span>
<?php if ($_SESSION['is_admin']): ?>
<a href="admin.php" class="btn" style="margin-left: 10px;">管理后台</a>
<?php endif; ?>
<a href="my_reservations.php" class="btn" style="margin-left: 10px;">我的预约</a>
<a href="logout.php" class="btn" style="margin-left: 10px;">退出</a>
</div>
</div>
<div class="actions">
<a href="reservation.php" class="btn">新建预约</a>
</div>
<div class="schedule-table">
<table>
<thead>
<tr>
<th>节次/日期</th>
<?php foreach ($dates as $date): ?>
<th <?php echo $date['date'] == date('Y-m-d') ? 'class="today"' : ''; ?>>
<?php echo date('m/d', strtotime($date['date'])); ?><br>
周<?php echo $date['weekday']; ?>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php for ($lesson = 1; $lesson <= 7; $lesson++): ?>
<tr>
<th>第<?php echo $lesson; ?>节</th>
<?php foreach ($dates as $date): ?>
<?php
$key = $date['date'] . '_' . $lesson;
$cellReservations = $schedule[$key] ?? [];
?>
<td <?php echo $date['date'] == date('Y-m-d') ? 'class="today"' : ''; ?>>
<?php if (strtotime($date['date']) <= strtotime('+1 day')): ?>
<span style="color: #999;">不可预约</span>
<?php elseif (!empty($cellReservations)): ?>
<?php foreach ($cellReservations as $res): ?>
<div class="reserved" onclick="location.href='reservation_detail.php?id=<?php echo $res['id']; ?>'">
<strong><?php echo $res['classroom_name']; ?></strong><br>
<span><?php echo $res['real_name']; ?></span><br>
<small class="classroom-type"><?php echo $res['classroom_type']; ?></small>
</div>
<?php endforeach; ?>
<?php else: ?>
<div class="available" onclick="location.href='reservation.php?date=<?php echo $date['date']; ?>&lesson=<?php echo $lesson; ?>'">
可预约
</div>
<?php endif; ?>
</td>
<?php endforeach; ?>
</tr>
<?php endfor; ?>
</tbody>
</table>
</div>
</body>
</html>
完整代码详见附件文件。

被折叠的 条评论
为什么被折叠?



