T41h4X/emergency-999
GitHub: T41h4X/emergency-999
面向紧急服务的实时调度与响应 DBMS,集成基于 Haversine 公式的地理自动路由、InnoDB 悲观锁并发控制和数据库触发器驱动的资源容量管理。
Stars: 0 | Forks: 0
# 🚨 紧急 999 响应 DBMS
[](https://www.php.net/)
[](https://www.mysql.com/)
[](https://tailwindcss.com/)
[](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, 地理信息系统, 应急响应系统, 数据库管理系统