XX学校功能室预约系统(PHP+MySql)

        这个系统提供了完整的预约功能,界面简洁易用,特别适合教师在手机端操作。管理员可以方便地管理教师、功能室和预约情况。

系统特点

  1. 响应式设计:适配手机端访问

  2. 权限控制:区分普通教师和管理员

  3. 时间限制:提前一天预约,防止临时预约

  4. 冲突检测:防止同一时间段重复预约

  5. 直观展示:日历式显示两周预约情况

  6. 操作便捷:一键取消、快速预约

  7. 批量操作:批量导入账号、批量导出预约数据

首页界面:

部分代码:

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>

完整代码详见附件文件。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值