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开发, 全栈项目, 后端开发, 地理空间查询, 安全管理, 实时位置追踪, 应急响应系统, 提示词优化, 旅游安全监控, 智慧旅游, 用户画像, 系统架构, 邮件告警, 附近的人, 预警系统