antra1947/SafeVoyage-AI-Tourist-Safety-Incident-Response-System
GitHub: antra1947/SafeVoyage-AI-Tourist-Safety-Incident-Response-System
一个面向旅游场景的企业级安全与事件情报平台,集成实时定位、AI安全建议与紧急响应。
Stars: 0 | Forks: 0
# SafeVoyage AI — 企业游客安全与事件情报平台
一个为现实旅游安全而构建的生产级全栈 MERN 应用程序。具备实时位置追踪、AI 驱动的安全建议、紧急 SOS 与邮件提醒、事件上报以及管理控制面板。
## 截图
### 登录页面

### 注册页面(带密码强度指示器)

### 仪表盘

### 编辑资料(安全档案 + 紧急联系人)

### 紧急 SOS

### 忘记密码

### 报告事件

### 安全提醒与区域警告

## 技术栈
**前端**
- React.js(Context API)
- Bootstrap 5
- Leaflet.js(实时地图)
- Axios
- react-hot-toast(通知)
**后端**
- Node.js + Express.js(MVC + 微服务)
- MongoDB + Mongoose(地理空间 2dsphere)
- Socket.IO(实时位置)
- JWT 认证 + bcrypt
- Joi 校验(带密码强度规则)
- Nodemailer(Gmail / Amazon SES)
- Helmet + 速率限制 + Morgan
- express-mongo-sanitize(NoSQL 注入防护)
- EJS(地图界面)
- Google Gemini AI(`gemini-1.5-flash`)
## 项目结构
```
├── backend/
│ ├── src/
│ │ ├── config/
│ │ │ ├── db.js
│ │ │ └── validateEnv.js
│ │ ├── middleware/
│ │ │ ├── auth.js
│ │ │ └── validate.js
│ │ ├── modules/
│ │ │ ├── auth/
│ │ │ ├── user/
│ │ │ ├── emergency/
│ │ │ ├── incident/
│ │ │ ├── location/
│ │ │ ├── admin/
│ │ │ └── ai/
│ │ ├── utils/
│ │ │ ├── emailService.js
│ │ │ └── logger.js
│ │ ├── views/map.ejs
│ │ └── app.js
│ ├── services/ ← Microservices
│ │ ├── api-gateway/ → port 7000
│ │ ├── auth-service/ → port 7001
│ │ ├── user-service/ → port 7002
│ │ ├── incident-service/ → port 7003
│ │ ├── emergency-service/ → port 7004
│ │ └── location-service/ → port 7005
│ ├── .env.example
│ └── package.json
└── frontend/
├── src/
│ ├── components/
│ ├── context/AuthContext.js
│ ├── pages/
│ │ ├── Login.js
│ │ ├── Register.js
│ │ ├── Dashboard.js
│ │ ├── SOSPage.js
│ │ ├── IncidentReport.js
│ │ ├── SafetyAlerts.js
│ │ ├── AdminPanel.js
│ │ ├── ForgotPassword.js
│ │ ├── ResetPassword.js
│ │ └── NotFound.js
│ ├── styles/global.css
│ ├── api.js
│ └── App.js
└── package.json
```
## 环境变量
将 `backend/.env.example` 复制为 `backend/.env` 并填写:
```
PORT=7000
DB_CONNECTION_STRING=your_mongodb_uri
JWT_SECRET=your_32_char_random_secret
# Gmail
EMAIL_PROVIDER=gmail
EMAIL_USER=your_email@gmail.com
EMAIL_PASS=your_gmail_app_password
# Amazon SES (alternative)
# EMAIL_PROVIDER=ses
# SES_HOST=email-smtp.ap-south-1.amazonaws.com
# SES_PORT=587
# SES_USER=your_ses_user
# SES_PASS=your_ses_pass
ALLOWED_ORIGINS=http://localhost:3000
FRONTEND_URL=http://localhost:3000
# Gemini AI
GEMINI_API_KEY=your_gemini_api_key
# 日志
LOG_LEVEL=info
```
## 本地搭建
### 1. 后端
```
cd backend
npm install
npm run dev
```
运行在 `http://localhost:7000`
### 2. 前端
```
cd frontend
npm install
npm start
```
运行在 `http://localhost:3000`
### 3. 微服务(可选)
```
cd backend/services
node start-all.js
```
启动全部 6 个服务(端口 7000–7005)
### 4. 创建管理员账户
正常注册,然后运行 MongoDB Shell:
```
db.users.updateOne({ email: "your@email.com" }, { $set: { role: "admin" } })
```
## API 端点
### 认证
| 方法 | 端点 | 描述 |
|------|------|------|
| POST | `/api/auth/register` | 注册(密码:至少 8 位,含大写、小写、数字、特殊字符) |
| POST | `/api/auth/login` | 登录 |
| POST | `/api/auth/forgot-password` | 发送密码重置邮件 |
| POST | `/api/auth/reset-password/:token` | 重置密码(15 分钟有效) |
### 用户
| 方法 | 端点 | 描述 |
|------|------|------|
| GET | `/api/user/profile` | 获取资料 |
| PATCH | `/api/user/profile` | 更新资料 + 安全档案 + 紧急联系人 + 头像 |
### 紧急
| 方法 | 端点 | 描述 |
|------|------|------|
| POST | `/api/emergency/sos` | 触发 SOS — 向所有紧急联系人发送 HTML 邮件并确认发送者 |
| GET | `/api/emergency/history` | 获取 SOS 历史 |
| GET | `/api/emergency/:id` | 获取单个紧急事件 |
| PATCH | `/api/emergency/:id/resolve` | 解决紧急事件 |
| DELETE | `/api/emergency/:id` | 删除 SOS 记录 |
### 事件
| 方法 | 端点 | 描述 |
|------|------|------|
| POST | `/api/incidents` | 上报事件 |
| GET | `/api/incidents/my` | 我的事件(分页) |
| GET | `/api/incidents` | 所有事件 — 管理员(搜索、筛选、分页) |
| PATCH | `/api/incidents/:id/mystatus` | 用户更新自身事件状态 |
| PATCH | `/api/incidents/:id/status` | 管理员更新事件状态 |
| DELETE | `/api/incidents/:id` | 用户删除自身事件 |
### 管理员
| 方法 | 端点 | 描述 |
|------|------|------|
| GET | `/api/admin/stats` | 仪表盘统计 |
| GET | `/api/admin/users` | 所有用户 |
| GET | `/api/admin/sos` | 所有 SOS 提醒 |
| PATCH | `/api/admin/sos/:id/acknowledge` | 确认 SOS |
### AI(Gemini)
| 方法 | 端点 | 描述 |
|------|------|------|
| POST | `/api/ai/safety-advice` | 获取位置相关的 AI 安全建议 |
| POST | `/api/ai/analyze-incident` | AI 事件风险分析 |
### 位置
| 方法 | 端点 | 描述 |
|------|------|------|
| GET | `/api/locations/nearby?lat=&lng=` | 附近用户(100 米半径) |
| GET | `/api/map?token=` | 实时地图界面(EJS + Leaflet) |
### 认证头
```
Authorization: Bearer
```
## SOS 邮件流程
当用户触发 SOS 时:
1. 从浏览器获取 GPS 坐标(回退:Socket 内存 → 数据库)
2. 校验坐标(纬度 -90 至 90,经度 -180 至 180)
3. 向所有紧急联系人发送含 Google 地图链接的富 HTML 警报邮件
4. 向用户发送确认邮件,注明已通知的对象
5. 每封邮件包含紧急号码(100、108、101、1091)
6. 在数据库中记录 SOS 并追踪状态
7. 速率限制:每分钟最多 3 次 SOS
## 实时位置(Socket.IO)
```
socket.emit("send-location", { latitude: 31.25, longitude: 75.70 })
```
- 经过 JWT 认证的 Socket 连接
- 位置即时保存在内存中
- 数据库写入节流:5 秒时间 + 10 米距离
- 断开连接时保存最后位置
- 通过 MongoDB `$near` 地理空间查询获取附近用户
## 安全特性
- JWT 认证,含角色权限(游客 / 管理员)
- bcrypt 密码哈希(盐轮数:10)
- 密码强度校验:至少 8 位,含大写、小写、数字、特殊字符
- Helmet.js 安全头
- 速率限制:全局 200/15 分钟,认证 20/15 分钟,SOS 3/分钟
- 防止 NoSQL 注入(express-mongo-sanitize)
- 按环境配置 CORS
- 启动时验证环境变量
- 带日志级别的结构化日志
## 功能特性
- JWT 认证,含角色权限(游客 / 管理员)
- 完整安全档案 — 血型、过敏信息、医疗记录、紧急联系人
- 从浏览器上传头像(Base64)
- 一键 SOS,附带富 HTML 邮件提醒与发送确认
- 通过 Socket.IO 实现实时位置追踪
- 通过 MongoDB 2dsphere 地理空间查询查找附近用户
- 事件上报,含类型、严重等级、GPS、AI 分析
- 用户可更新或删除自身事件与 SOS 记录
- 由 Google Gemini 驱动的 AI 安全顾问(位置相关提示)
- 带严重等级的安全区域提醒
- 管理面板 — 统计、用户管理、事件管理、SOS 确认
- 事件面板的搜索与筛选
- 所有列表端点支持分页
- 通过邮件进行密码重置(15 分钟有效令牌)
- 忘记密码流程(含邮件链接)
- 404 页面
- 吐司通知(无浏览器弹窗)
- 认证页面隐藏导航栏
- 提供者无关邮件(Gmail 或 Amazon SES)
- 速率限制、Helmet 安全头、Morgan 日志
- 带日志级别的结构化日志
- 启动时验证环境变量
- 带有 API 网关的服务架构
标签:2dsphere索引, AI安全助手, bcrypt, EJS模板, Express, GeoJSON, GNU通用公共许可证, Google Gemini AI, Helmet, Joiv, JWT认证, MERN栈, MITM代理, MongoDB, Mongoose, Morgan日志, Node.js, Nodemailer, NoSQL注入防护, React, Socket.IO, Syscalls, 事件上报, 企业安全, 前后端分离, 地图追踪, 地理围栏, 安全告警, 安全配置文件, 实时定位, 密码强度验证, 应急报警, 旅游安全, 旅行安全平台, 服务器监控, 游客安全, 生产就绪, 紧急SOS, 紧急联系人, 网络资产管理, 自定义脚本, 项目展示