AbhayMinhas/Smart-Tourist-Safety-Monitoring-Incident-Response-System
GitHub: AbhayMinhas/Smart-Tourist-Safety-Monitoring-Incident-Response-System
基于 Node.js 的游客安全监控后端系统,提供实时位置追踪和紧急求助功能。
Stars: 1 | Forks: 0
# 智能游客安全监控与应急响应系统(后端)
## 概述
该后端为实时游客安全平台提供支持,包含:
* 安全认证(基于 JWT)
* 用户资料与安全档案管理
* 带有邮件警报的紧急 SOS 系统
* 实时位置追踪 (Socket.IO)
* 通过地理空间查询查找附近用户
该系统采用**清晰的模块化架构**设计,具备可扩展性和现实世界的后端实践。
## 技术栈
* Node.js
* Express.js
* MongoDB + Mongoose
* Socket.IO(实时通信)
* JWT 认证
* Joi 验证
* Nodemailer(邮件服务)
* EJS + Leaflet(地图测试界面)
## 项目结构
```
src/
├── config/
├── middleware/
├── validators/
├── utils/
├── routes/
├── modules/
│ ├── auth/
│ ├── user/
│ ├── emergency/
│ ├── location/
├── app.js
```
## 环境变量
创建一个 `.env` 文件:
```
PORT=7000
DB_CONNECTION_STRING=your_mongodb_uri
JWT_SECRET=your_secret_key
EMAIL_PROVIDER=gmail
EMAIL_USER=your_email
EMAIL_PASS=your_app_password
```
您也可以通过以不同方式设置 .env 来将 provider 配置为 AMAZON SES,因为代码是与提供商无关的
对于 AWS SES:
```
EMAIL_PROVIDER=ses
SES_HOST=email-smtp.ap-south-1.amazonaws.com
SES_PORT=587
SES_USER=xxxx
SES_PASS=xxxx
```
## 安装与设置
```
npm install
npm run dev
```
服务器运行于:
```
http://localhost:7000
```
## 认证
所有受保护的路由都需要 JWT,它被设置在请求头中。
### Header 格式
```
Authorization: Bearer
```
* Header 名称:`authorization`
* 值格式:`Bearer `
# API 契约
## 通用响应格式
### 成功
```
{
"success": true,
"message": "Optional message",
"data": {}
}
```
### 错误
```
{
"success": false,
"message": "Error message",
"errors": []
}
```
# 可用的 API 端点
## 认证模块 (AUTH MODULE)
### 注册 (Register)
```
POST /api/auth/register
```
请求:
```
{
"firstName": "Abhay",
"lastName": "Minhas",
"email": "abhay@example.com",
"password": "Password123",
"age": 22,
"gender": "male"
}
```
响应:
```
{
"success": true,
"message": "User registered successfully",
"data": {
"user": {},
"token": "jwt_token"
}
}
```
### 登录 (Login)
```
POST /api/auth/login
```
请求:
```
{
"email": "abhay@example.com",
"password": "Password123"
}
```
响应:
```
{
"success": true,
"message": "Login successful",
"data": {
"user": {},
"token": "jwt_token"
}
}
```
## 用户模块 (USER MODULE)
### 获取资料 (Get Profile)
```
GET /api/user/profile
```
Headers:
```
Authorization: Bearer
```
响应:
```
{
"success": true,
"data": {
"firstName": "...",
"lastName": "...",
"email": "...",
"safetyProfile": {}
}
}
```
### 更新资料(包括安全档案) (Update Profile)
```
PATCH /api/user/profile
```
Headers:
```
Authorization: Bearer
```
请求(允许部分更新):
```
{
"firstName": "Abhay",
"photoUrl": "https://...",
"safetyProfile": {
"bloodGroup": "B+",
"allergies": "None",
"medicalNotes": "N/A",
"emergencyContacts": [
{
"name": "John",
"phone": "+1234567890",
"email": "john@example.com"
}
]
}
}
```
响应:
```
{
"success": true,
"message": "Profile updated successfully",
"data": {}
}
```
## 紧急模块 (EMERGENCY MODULE)
### 触发 SOS (Trigger SOS)
```
POST /api/emergency/sos
```
Headers:
```
Authorization: Bearer
```
请求:
```
{
"message": "Need help urgently"
}
```
响应:
```
{
"success": true,
"message": "SOS triggered successfully",
"data": {}
}
```
### 获取紧急历史记录 (Get Emergency History)
```
GET /api/emergency/history
```
Headers:
```
Authorization: Bearer
```
### 获取单个紧急记录 (Get Single Emergency)
```
GET /api/emergency/:id
```
Headers:
```
Authorization: Bearer
```
### 解决紧急情况 (Resolve Emergency)
```
PATCH /api/emergency/:id/resolve
```
Headers:
```
Authorization: Bearer
```
## 位置模块 (LOCATION MODULE)
### 附近用户(供地图内部使用)
```
GET /api/locations/nearby?lat=&lng=
```
* 需要 JWT
* 供地图界面 (`/api/map`) 使用
* 返回半径范围内的附近用户
响应:
```
{
"success": true,
"data": [
{
"userId": "123",
"name": "User",
"coordinates": [lng, lat]
}
]
}
```
## 地图端点 (MAP ENDPOINT)
```
GET /api/map
```
* 受保护路由
* 返回地图 UI (EJS)
* 将 JWT token 注入前端
* 自动建立 socket 连接
# 实时定位系统
## 致前端开发者的重要说明
* 前端 **不需要手动实现 socket 连接**
* Socket 已在地图 (`map.ejs`) 内部处理
* Token 会自动注入
## Socket 行为
* 使用 JWT 进行认证
* 客户端通过以下方式发送位置:
```
send-location
```
Payload (负载):
```
{
"latitude": number,
"longitude": number
}
```
## 后端处理
* 将最新位置存储在内存 中
* 使用以下方式将位置保存到数据库:
* 基于时间的节流
* 基于距离的过滤
* 在断开连接时保存最后位置
# 位置系统设计
* GeoJSON 格式:`[longitude, latitude]`
* MongoDB `2dsphere` 索引
* 混合系统:
```
Socket → write (location updates)
API → read (nearby users via geo query)
```
# 地图功能
* 地图向用户显示 100 米范围内的所有用户,此处我们为此目的使用了 API 轮询。
* 所有用户的姓名将显示在用户的位置图标上
* 为了区分用户本身和其他用户,当前用户的地图标记颜色为蓝色,其他用户为黄色。
# 安全档案
存储在用户模型中:
* 血型
* 过敏史
* 医疗备注
* 紧急联系人
更新方式:
```
PATCH /api/user/profile
```
# SOS 流程
1. 用户触发 SOS
2. 系统检索位置:
* 首先从内存中(最新)
* 回退到数据库
3. 向紧急联系人发送邮件警报
4. 存储紧急记录
# 前端集成说明
* 始终在 Authorization header 中包含 JWT
* 不要过于频繁地发送位置
* 使用 `/api/map` 进行基于 Web 的地图测试
* 使用 `/api/locations/nearby` 获取附近用户
* 每 5-10 秒轮询一次 API 以获取更新
# 当前状态
已完成:
* 认证系统
* 用户资料 + 安全档案
* 紧急 SOS 系统
* 实时位置追踪
* 附近用户(地理空间查询)
事件模块:开发中
# 总结
该后端提供:
* 安全的 API 架构
* 实时定位能力
* 可扩展的地理空间查询
* 清晰的模块化设计
已准备好集成:
* Android 前端 (Kotlin)
* Web 前端 (React / WebView)
设计兼顾了现实世界的后端实践和可扩展性。
标签:Express, GNU通用公共许可证, JWT认证, MITM代理, MongoDB, Mongoose, Node.js, RESTful API, Socket.IO, SOS紧急求助, Syscall, Web开发, 全栈项目, 后端开发, 地理空间查询, 安全管理, 实时位置追踪, 应急响应系统, 提示词优化, 旅游安全监控, 智慧旅游, 用户画像, 系统架构, 邮件告警, 附近的人, 预警系统