aditya531-a/sahayog
GitHub: aditya531-a/sahayog
基于 React 和 Express 的全栈灾害管理与响应系统,集成预警、事件上报、交互地图、SOS 求救、医院定位和 NGO 协作功能,用于提升灾害场景下的信息协调与社区参与。
Stars: 0 | Forks: 2
## 目录
- 项目概述
- 架构与文件结构
- 核心技术与工具
- 本地设置(开发环境)
- 运行与调试
# 综合灾害管理与响应系统 (IDMRS)
用于灾害警报、事故报告、交互式地图、SOS(紧急求救)、医院定位和 NGO(非政府组织)协作的全栈 Web 应用。
## 结构
- `client/`:React (Vite) + TypeScript + Tailwind + shadcn-ui + i18next + Leaflet
- `server/`:Express + Mongoose + REST API
## 设置
### 前置条件
- Node.js
- MongoDB(本地或 Atlas)
# 综合灾害管理与响应系统 (IDMRS)
本仓库包含一个全栈演示应用程序,涵盖灾害警报、事故报告、灾区地图绘制、医院/NGO 目录以及 SOS 流程。它被构建为一个对开发者友好的 monorepo(单体仓库),包含两个主要包:
- `client/` — React + TypeScript 前端 (Vite),使用 Tailwind CSS 和 Leaflet 地图
- `server/` — Node.js + Express 后端,包含用于 MongoDB 的 Mongoose 模型
本 README 说明了项目的组织方式、工作原理、如何在本地运行以及常见故障排查步骤。
- API 参考
- 地图与数据流工作原理
- 常见问题与故障排查(CORS、重复 React、地图空白)
- 开发工作流与测试
- 贡献指南
## 项目概述
IDMRS 是一个小型综合系统,允许用户查看灾害警报、报告事故、在地图上查看易灾区域和资源、请求紧急 SOS 以及浏览或注册 NGO 和医院。它旨在作为一个可运行的原型和开发者练习,用于集成地图、类实时数据流和 CRUD API。
核心面向用户的功能
- 浏览带有灾区、事故标记和医院位置的交互式 Leaflet 地图
- 报告事故,该事故将显示在地图上
- 发送 SOS 请求(使用浏览器地理定位)并提交到后端
- 简单的 NGO 和医院目录页面
## 架构与重要文件
顶层布局
- `client/` — 前端应用
- `src/main.tsx` — 引导 React 应用启动
- `src/App.tsx` — 路由和 providers(React Query、Context、Router)
- `src/context/DisasterContext.tsx` — 中央客户端数据源并获取 API 数据
- `src/pages/DisasterMap.tsx` — 使用 `react-leaflet` 的地图页面
- `src/components/` — UI 组件(shadcn 风格原语)
- `public/` — 静态资源
- `server/` — 后端 API
- `server.js` — Express 应用和路由绑定
- `routes/*.js` — express 路由(alerts、incidents、hospitals、ngos、sos)
- `controllers/*.js` — 请求处理程序(业务逻辑)
- `models/*.js` — Mongoose schemas
- `seed/seed.js` — 用于创建演示数据的脚本
## 使用的核心技术与工具
- 前端
- React 18 + TypeScript
- Vite(开发服务器和构建)
- Tailwind CSS(实用优先的样式)
- shadcn/ui 风格的组件(Radix + Tailwind 原语)
- react-leaflet + leaflet 用于交互式地图
- react-i18next 用于国际化
- TanStack React Query(可选)
- 后端
- Node.js + Express
- Mongoose(MongoDB ODM)
- cors 中间件用于跨域请求
- 工具
- npm 用于包管理
- nodemon 用于后端开发
- curl / Invoke-RestMethod 用于 API 检查
## 本地设置(开发)
前置条件
- Node.js(推荐 >= 18)
- MongoDB(本地或 Atlas)或将 `MONGO_URI` 设置为您的集群
安装依赖
1. 从仓库根目录:
```
cd C:\Users\Akash\sahayog\sahayog
npm install
```
2. (可选)如有需要,可单独安装子包:
```
npm --prefix server install
npm --prefix client install
```
环境配置
- Server:将 `server/env.example` 复制到 `server/.env` 并设置 `MONGO_URI`(如果您使用 Atlas) npm --prefix client run dev
```如果您的无法访问后端,请确保后端进程正在运行并检查 CORS 设置(服务器使用了允许 `localhost:8080` 的 CORS 中间件)。
## API 参考(摘要)
所有端点都挂载在 `/api` 下
- GET /api/alerts — 列出可用警报
- GET /api/incidents — 列出事故
- POST /api/incidents — 创建事故 { type, description, location: { lat, lng } }
- GET /api/hospitals — 列出医院
- GET /api/ngos — 列出 NGO
- POST /api/ngos — 创建 NGO
- POST /api/sos — 发送 SOS 请求(期望 userLocation)
以及可选的 `PORT`。
- Client:将 `client/env.example` 复制到 `client/.env` 并设置 `VITE_API_BASE_URL`(如果您的后端使用非默认 URL)。
初始化演示数据(可选)
```
npm --prefix server run seed
```
在开发环境中运行应用
```
# 从 repository 根目录
npm run dev
# 或单独运行 packages
npm --prefix server run dev
Use `curl` or `Invoke-RestMethod` for quick checks:
```powershell
curl http://localhost:5001/api/hospitals
```
默认开发 URL
- Frontend (Vite):http://localhost:8080(或 Vite 打印的端口)
- Backend (Express):http://localhost:5001(server.js 中的默认值)
## 注意:我
## 地图与数据流工作原理(前端)
1. `client/src/context/DisasterContext.tsx` 在应用挂载时从 API 获取初始数据(alerts、incidents、hospitals、ngos)。它通过 React Context(`useDisaster`)将这些数据暴露给页面和组件使用。
2. `DisasterMap.tsx` 使用 `react-leaflet` 组件(MapContainer、TileLayer、Marker、Circle)进行渲染:
- 来自 OpenStreetMap 的 Tile layer
- 灾区圆形区域(静态示例数据)
- 来自 `DisasterContext` 的事故和医院标记
3. 当用户报告事故(报告页面)时,客户端会向 `/api/incidents` 发送 POST 请求,返回的事故将被添加到上下文中,以便立即显示在地图上。
4. SOS 使用 `navigator.geolocation.getCurrentPosition()` 并将坐标 POST 到 `/api/sos`。
样式与 CSS 说明
- Leaflet 要求在地图挂载之前加载其 CSS(在 `main.tsx` 中导入)。项目包含 `.leaflet-container { height: 100%; }` 并确保设置了 `html, body, #root { height: 100%; }` 以避免地图容器高度为零。
## 后端工作原理
1. `server/server.js` 创建了一个 Express 应用,使用 `Mongoose` 连接到 MongoDB,并在 `/api` 下配置路由。
2. 路由委托给使用 Mongoose 模型(例如,`models/Hospital.js`)查询并发送 JSON 响应的 controllers。
3. `seed/seed.js` 辅助脚本可以填充示例医院/事故以测试 UI。
## 常见问题与故障排查
- 地图空白但页面已加载
- 检查浏览器控制台是否有 React 错误。常见的服务器端原因是在 monorepo 中**重复安装了 React**(context provider/consumer 运行时不匹配)。在仓库根目录运行 `npm ls react` 并确保只安装了一个版本。如果存在重复,请移除本地的 `file:` 依赖或进行去重(dedupe)。
- 确保 Leaflet CSS 已加载且 `.leaflet-container` 具有高度。检查 DOM → `.leaflet-container` 的计算高度。
- API 请求失败,状态为 0 或被阻止 (CORS)
- 确认后端正在运行,并且可以通过 `VITE_API_BASE_URL` 配置的 URL 或默认的 `http://localhost:5001` 访问。
- 检查服务器日志并确认 CORS 中间件处于激活状态(服务器包含明确的 CORS 配置,以在开发期间允许 `localhost:8080`)。
- Tile 图像未加载
- 检查 Network 标签页中对 `tile.openstreetmap.org` 的请求。如果被阻止或返回 403,请尝试不同的 Tile 提供商或检查网络限制。
## 开发工作流与测试
- 使用 monorepo 脚本安装并运行这两个包:
```
npm install
npm run dev
```
- 推荐的迭代工作流
1. 使用 `npm --prefix server run dev` 运行后端并确认 `Server running on port 5001`。
2. 使用 `npm --prefix client run dev` 运行前端并打开地图页面。
3. 使用浏览器 DevTools 的 Network 和 Console 标签页进行实时调试。
自动化测试
- 此模板中未包含自动化的单元测试。对于生产级项目,请添加 Jest/React Testing Library 和后端测试。
## 贡献指南
- Fork 并创建功能分支。提交包含清晰描述和行为更改测试的 Pull Request。
- 遵循现有的代码风格:客户端使用 TypeScript,服务器 controllers 使用 JSDoc 或注释,样式使用 Tailwind 实用类。
## 下一步开发指引
- 前端地图代码:`client/src/pages/DisasterMap.tsx`
- 数据提供者:`client/src/context/DisasterContext.tsx`
- 后端路由:`server/routes/*.js`
- Controllers:`server/controllers/*.js`
- 种子数据:`server/seed/seed.js`
标签:CRUD, Express, GNU通用公共许可证, i18next, Leaflet, MITM代理, MongoDB, Mongoose, NGO协作, Node.js, React, REST API, shadcn-ui, SOS紧急求助, Syscalls, Tailwind CSS, TypeScript, Vite, 交互式地图, 信息透明, 前后端分离, 医院定位, 原型系统, 地图可视化, 地理定位, 多语言支持, 安全插件, 安全测试框架, 实时预警, 市民事件上报, 库, 应急响应, 灾害协调, 灾害管理与响应系统, 社区参与, 自动化攻击