T41h4X/emergency-999

GitHub: T41h4X/emergency-999

面向紧急服务的实时调度与响应 DBMS,集成基于 Haversine 公式的地理自动路由、InnoDB 悲观锁并发控制和数据库触发器驱动的资源容量管理。

Stars: 0 | Forks: 0

# 🚨 紧急 999 响应 DBMS [![PHP Version](https://img.shields.io/badge/PHP-8.1%2B-777BB4?style=for-the-badge&logo=php&logoColor=white)](https://www.php.net/) [![MySQL](https://img.shields.io/badge/MySQL-8.0%2B-4479A1?style=for-the-badge&logo=mysql&logoColor=white)](https://www.mysql.com/) [![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-3.0-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/) [![LeafletJS](https://img.shields.io/badge/Leaflet-1.9-199900?style=for-the-badge&logo=leaflet&logoColor=white)](https://leafletjs.com/) 一个为孟加拉国设计的实时紧急调度和响应数据库管理系统(DBMS)原型。集成了 PHP、MySQL (InnoDB) 和 Leaflet/OpenStreetMap,用于管理事件报告、自动地理路由、资源容量限制以及响应人员生命周期。 ## 🌟 核心功能 * **🚨 实时事件地图** — 公共门户网站实时显示活跃事件,并带有颜色编码的优先级环 (Leaflet.js + OpenStreetMap)。 * **📍 地理位置选择器** — 市民可以在首页放置地图图钉以注册精确坐标。 * **🤖 自动调度** — 在报告验证后,系统使用 **Haversine 公式** 在 `DISPATCH_RANGE_KM`(默认:12 公里)范围内定位最近的可用调度单元和响应人员。 * **🔒 InnoDB 悲观锁** — 采用 `SELECT FOR UPDATE` 防止在并发响应调度期间出现竞态条件。 * **🚒 全员配置初始化** — 所有 15 个单元均完全配备了**每个单元 6 名响应人员**(共 90 名响应人员),保证强大的覆盖范围且零人员配置警报。 * **📊 容量感知资源管理** — 自动管理单元状态(当活动负载达到容量时设置为 `busy`,并在解决后恢复为 `available`)。 * **⚙️ 实时数据库触发器** — 通过 **5 个 MySQL 触发器**直接在数据库层强制执行逻辑约束(更新负载、记录审计追踪,并在容量修改时纠正单元状态)。 ## 🏗️ 系统架构 ### 数据库实体(8 张表) ``` erDiagram Users ||--o{ Emergency_Report : "submits / verifies" Users ||--o{ Responder : "has profile" Users ||--o{ Dispatch_Assignment : "assigns (admin)" Users ||--o{ Audit_Log : "performs action (actor)" Emergency_Type ||--o{ Emergency_Report : "classifies" Dispatch_Unit ||--o{ Responder : "employs" Dispatch_Unit ||--o{ Dispatch_Assignment : "handles" Responder ||--o{ Dispatch_Assignment : "undertakes" Emergency_Report ||--o{ Dispatch_Assignment : "assigned to" Emergency_Report ||--o{ Hospital : "suggests nearest" Emergency_Report ||--o{ Audit_Log : "audits changes" Dispatch_Assignment ||--o{ Audit_Log : "audits changes" ``` * **`Users`**:系统账户(管理员、响应人员、市民),带有 bcrypt 凭证。 * **`Emergency_Type`**:分类(消防、医疗、警察、救援)及其优先级、自定义地图图标和颜色。 * **`Emergency_Report`**:带有 GPS 定位的事件,包含严重级别、状态生命周期和请求的服务。 * **`Dispatch_Unit`**:调度站(消防、警察、救护车、救援),具有地理基准坐标、状态和最大分配容量。 * **`Responder`**:绑定到特定调度单元的个人资料。 * **`Dispatch_Assignment`**:通过详细的操作时间戳追踪将事件与单元和响应人员关联起来。 * **`Hospital`**:跟踪附近医疗中心的床位可用性和邻近建议。 * **`Audit_Log`**:对所有状态转换和用户/系统更改的不可变记录。 ### 数据库触发器 (MySQL) | 触发器 | 时间 / 表 | 事件 | 动作 | |---|---|---|---| | `after_dispatch_assignment_insert` | `AFTER INSERT ON Dispatch_Assignment` | `INSERT` | 增加单元的 `active_assignments_count`;如果达到容量,则将单元状态切换为 `busy`;将响应人员标记为 `assigned`。 | | `after_dispatch_assignment_update` | `AFTER UPDATE ON Dispatch_Assignment` | `UPDATE` | 完成或取消时:减少计数,更新单元状态,并释放响应人员。到达时:将响应人员标记为 `on_scene`。 | | `after_dispatch_assignment_delete` | `AFTER DELETE ON Dispatch_Assignment` | `DELETE` | 如果删除了活动分配,则恢复单元负载计数和响应人员可用性。 | | `after_emergency_report_update` | `AFTER UPDATE ON Emergency_Report` | `UPDATE` | 将报告状态修改记录到 `Audit_Log` 表中。 | | `before_dispatch_unit_update` | `BEFORE UPDATE ON Dispatch_Unit` | `UPDATE` | **容量同步**:如果更新了 `capacity` 或 `active_assignments_count`,则自动重新计算单元状态。 | ## 🚀 安装与设置 ### 前置条件 * PHP 8.1+ * MySQL 8.0+ 或 MariaDB 10.4+ * Web 服务器(XAMPP、Laragon、Apache 或类似的本地环境) ### 步骤 1. **克隆或放置该目录**到您的 web 根目录中(例如,`C:/xampp/htdocs/emergency-999`)。 2. **启动您的 PHP 和 MySQL 服务**(通过 XAMPP 控制面板)。 3. **运行自动数据库安装**脚本,使用 PHP CLI: php database/reset_db.php *(如果 php 不在您的环境 PATH 中,请使用完整路径运行:`d:\Xampp\php\php.exe database/reset_db.php`)* 4. 如果您的 MySQL 凭证不是 `root` 且密码为空,请在 `config/config.php` 中进行配置。 5. 访问该 Web 应用程序:[http://localhost/emergency-999/](http://localhost/emergency-999/) ## 👥 演示用户账户 所有初始化的凭证均使用密码:`password` | 角色 | 邮箱 | 所属单元 / 权限 | |---|---|---| | **Admin** | `admin@999.local` | 完整的控制室访问权限 | | **Citizen** | `user@999.local` | 报告提交和个人历史记录追踪 | | **Tejgaon 消防主管** | `responder@999.local` | Tejgaon 消防站(单元 1) | | **达卡救护车官员** | `kamal@999.local` | 达卡城市救护车(单元 2) | | **Gulshan 警官** | `rafiq@999.local` | Gulshan 警察局(单元 3) | ## 📁 代码库参考 * [index.php](file:///d:/Xampp/htdocs/emergency-999/index.php) — 公共着陆页、Leaflet 报告界面和实时事件仪表板。 * [config/config.php](file:///d:/Xampp/htdocs/emergency-999/config/config.php) — 全系统凭证和配置(调度范围、基础 URL)。 * [includes/](file:///d:/Xampp/htdocs/emergency-999/includes/) — 包含布局渲染、数据库连接和辅助脚本的核心 PHP 模块: * [dispatch_helpers.php](file:///d:/Xampp/htdocs/emergency-999/includes/dispatch_helpers.php) — 距离计算 (Haversine) 和自动调度逻辑。 * [auth.php](file:///d:/Xampp/htdocs/emergency-999/includes/auth.php) — 基于角色的授权层和 CSRF 保护。 * [admin/](file:///d:/Xampp/htdocs/emergency-999/admin/) — 管理控制台文件: * [reports.php](file:///d:/Xampp/htdocs/emergency-999/admin/reports.php) — 中央调度控制台。验证事件并分配响应人员建议。 * [manage.php](file:///d:/Xampp/htdocs/emergency-999/admin/manage.php) — 资源管理 CRUD 表格(单元、医院、响应人员)。 * [responder/index.php](file:///d:/Xampp/htdocs/emergency-999/responder/index.php) — 供外勤响应人员查看范围限制、自我分配和转换任务状态的门户。 有关每个文件、模块、数据库功能和 API endpoint 的全面解析,请参阅 **[📖 代码库指南](CODEBASE_GUIDE.md)**。
标签:ffuf, Leaflet, OpenVAS, PHP, Tailwind CSS, 地理信息系统, 应急响应系统, 数据库管理系统