当前位置:首页 > PHP

php实现叫号系统

2026-02-15 06:26:23PHP

实现叫号系统的核心功能

叫号系统通常用于医院、银行等场所,主要功能包括取号、叫号、显示当前号码等。以下是一个基于PHP和MySQL的简单实现方案。

数据库设计

创建名为queue_system的数据库,包含两个表:

CREATE TABLE `tickets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ticket_number` varchar(20) NOT NULL,
  `status` enum('waiting','called','completed') DEFAULT 'waiting',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

CREATE TABLE `counters` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `current_ticket` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

取号功能实现

创建get_ticket.php文件:

php实现叫号系统

<?php
$conn = new mysqli('localhost', 'username', 'password', 'queue_system');

$prefix = date('Ymd');
$lastTicket = $conn->query("SELECT MAX(ticket_number) as last FROM tickets WHERE ticket_number LIKE '$prefix%'")->fetch_assoc();
$nextNum = $lastTicket['last'] ? intval(substr($lastTicket['last'], 8)) + 1 : 1;
$ticketNumber = $prefix . str_pad($nextNum, 3, '0', STR_PAD_LEFT);

$conn->query("INSERT INTO tickets (ticket_number) VALUES ('$ticketNumber')");
echo json_encode(['ticket_number' => $ticketNumber]);
?>

叫号功能实现

创建call_ticket.php文件:

<?php
$conn = new mysqli('localhost', 'username', 'password', 'queue_system');
$counterId = $_POST['counter_id'] ?? 1;

$ticket = $conn->query("SELECT * FROM tickets WHERE status='waiting' ORDER BY created_at ASC LIMIT 1")->fetch_assoc();
if ($ticket) {
    $conn->query("UPDATE tickets SET status='called' WHERE id={$ticket['id']}");
    $conn->query("UPDATE counters SET current_ticket='{$ticket['ticket_number']}' WHERE id=$counterId");
    echo json_encode(['success' => true, 'ticket' => $ticket]);
} else {
    echo json_encode(['success' => false]);
}
?>

显示当前号码

创建display.php文件:

php实现叫号系统

<?php
$conn = new mysqli('localhost', 'username', 'password', 'queue_system');

$current = $conn->query("SELECT c.name, t.ticket_number FROM counters c LEFT JOIN tickets t ON t.ticket_number = c.current_ticket")->fetch_all(MYSQLI_ASSOC);
$waitingCount = $conn->query("SELECT COUNT(*) as cnt FROM tickets WHERE status='waiting'")->fetch_assoc();

header('Content-Type: application/json');
echo json_encode([
    'counters' => $current,
    'waiting_count' => $waitingCount['cnt']
]);
?>

前端界面实现

创建简单的HTML界面:

<!DOCTYPE html>
<html>
<head>
    <title>叫号系统</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        .display { font-size: 2em; margin: 20px; }
        .counter { border: 1px solid #ccc; padding: 10px; margin: 10px; }
    </style>
</head>
<body>
    <div>
        <button id="getTicket">取号</button>
        <div id="ticketNumber"></div>
    </div>

    <div id="countersDisplay"></div>

    <script>
        function updateDisplay() {
            $.get('display.php', function(data) {
                let html = `<div>等待人数: ${data.waiting_count}</div>`;
                data.counters.forEach(c => {
                    html += `<div class="counter">${c.name}: ${c.ticket_number || '空闲'}</div>`;
                });
                $('#countersDisplay').html(html);
            });
        }

        $('#getTicket').click(function() {
            $.get('get_ticket.php', function(data) {
                $('#ticketNumber').text('您的号码: ' + data.ticket_number);
                updateDisplay();
            });
        });

        setInterval(updateDisplay, 5000);
        updateDisplay();
    </script>
</body>
</html>

管理员界面

创建admin.php用于叫号操作:

<!DOCTYPE html>
<html>
<head>
    <title>叫号管理</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div>
        <button onclick="callTicket(1)">柜台1叫号</button>
        <button onclick="callTicket(2)">柜台2叫号</button>
    </div>

    <script>
        function callTicket(counterId) {
            $.post('call_ticket.php', {counter_id: counterId}, function(data) {
                if(data.success) {
                    alert('已叫号: ' + data.ticket.ticket_number);
                } else {
                    alert('没有等待的号码');
                }
            });
        }
    </script>
</body>
</html>

系统扩展建议

  1. 添加用户类型分类(如普通、VIP)
  2. 实现多队列管理
  3. 增加声音提示功能
  4. 添加数据统计和分析功能
  5. 实现过号重新排队逻辑

该系统使用PHP和MySQL实现基本叫号功能,前端使用jQuery进行简单交互。实际部署时需要根据具体需求进行调整和完善。

标签: 系统php
分享给朋友:

相关文章

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php实现单例模式

php实现单例模式

单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。 PHP实现单例模式的关键步骤 私有化构造函…

用vue实现会员系统

用vue实现会员系统

使用Vue实现会员系统 项目初始化与依赖安装 创建一个新的Vue项目,安装必要的依赖: vue create member-system cd member-system npm install v…

vue实现图书购买系统

vue实现图书购买系统

Vue实现图书购买系统 项目结构设计 使用Vue CLI或Vite初始化项目,推荐目录结构: src/components/ 存放可复用组件(如图书卡片、购物车) src/views/ 存放页面级组…