Omrawat11/Disaster-Response-Emergency-Assistant

GitHub: Omrawat11/Disaster-Response-Emergency-Assistant

RescueNet 是一个基于 React + Three.js 的灾难响应与紧急援助门户应用,提供实时 3D 地球可视化、AI 紧急情报、事件上报、避难所定位和灾难模拟等功能。

Stars: 0 | Forks: 0

# 🔴 RescueNet — 灾难响应与紧急援助门户 ## 概述 RescueNet 是一个生产就绪的单页应用程序,专为实时灾难响应协调而构建。它具有实时 3D 地球仪、AI 驱动的紧急情报、实时数据滚动、多步骤事件报告、避难所定位器和灾难模拟功能——所有这些都以余烬与灰烬的视觉系统呈现,并搭配极其流畅的 WebGL 和滚动动画。 ## 技术栈 | 层级 | 技术 | |---|---| | 框架 | React 18 + Vite 5 | | 样式 | Tailwind CSS v3 (任意值) | | 3D / WebGL | React Three Fiber 8.x + Three.js r165 + `@react-three/drei` 9.x + `@react-three/postprocessing` 2.x | | 动画 | GSAP 3.12 (ScrollTrigger + ticker bridge) — **所有动画都在此处** | | 平滑滚动 | Lenis 1.x (`lenis` npm 包) | | 状态 | Zustand 4.x | | 图表 | Recharts 2.x | | 图标 | Lucide React | | 噪声 | simplex-noise (粒子位移) | ## 快速开始 ``` # 安装 dependencies npm install # 启动 development server npm run dev # 在 browser 中打开 http://localhost:5173 ``` ## 色彩系统 所有颜色均为 CSS 自定义属性。**无例外。不允许覆盖。** ``` :root { --void: #06080f; /* Background — near-black, warm undertone */ --surface: #0e1018; /* Card / panel base */ --ember: #C8410A; /* PRIMARY accent — rescue red-orange */ --crimson: #7A0F0F; /* Secondary — deep threat red */ --gold: #D4A853; /* Highlight — resource / success */ --ash: #E8E0D5; /* Primary text — warm off-white */ --smoke: #5C5650; /* Muted text / disabled */ --glass: rgba(232,224,213,0.04);/* Glassmorphic surface */ --border: rgba(232,224,213,0.08);/* Card borders */ } ``` **禁止:** 任何以 `#0066`、`#00f`、`#0af`、`#4a`、`#7c3aed` 开头的十六进制颜色值,或任何蓝色 / 紫色 / 青色系。 ### 灾难模拟颜色覆盖 在第 12 部分通过 `document.body.dataset.sim` 应用: | 模拟 | `--sim-accent` | 备注 | |---|---|---| | 洪水 | `#2E5C6E` | 深青灰色 — 不是蓝色 | | 野火 | `#E84B0A` | 明亮的余烬色 | | 飓风 | `#8A7560` | 温暖的沙灰色 | | 地震 | `#A67C2E` | 深金色 | ## 排版 | 角色 | 字体 | 粗细 | 大小 | |---|---|---|---| | 标题 | Space Grotesk | 700 | `clamp(2rem, 6vw, 7rem)` | | UI 标签 | Inter | 400 / 500 | 13px – 16px | | 数据 / 数字 | JetBrains Mono | 400 | 所有计数器、Case ID、时间戳 | 在 `index.html` 中通过 `` 从 Google Fonts 加载这三种字体。 ## 文件夹结构 ``` src/ ├── components/ │ ├── canvas/ │ │ ├── Scene.jsx # R3F Canvas wrapper + post-processing │ │ ├── EarthGlobe.jsx # 3D Earth sphere + atmosphere shader │ │ ├── ParticleField.jsx # 800-particle ember/gold drift field │ │ └── SimOverlay.jsx # Flood/Wildfire/Cyclone/Earthquake overlays │ └── ui/ │ ├── Navbar.jsx │ ├── CustomCursor.jsx │ ├── ScrollProgressBar.jsx │ ├── GlassCard.jsx │ ├── MagneticButton.jsx │ ├── AlertBadge.jsx │ ├── ProgressBar.jsx │ └── CounterStat.jsx ├── hooks/ │ ├── useSmoothScroll.js # Lenis + GSAP ticker bridge │ ├── useTickEngine.js # 1500ms interval stat updates │ ├── useTilt.js │ ├── useMouseParallax.js │ └── useCountUp.js ├── store/ │ └── disasterStore.js # Zustand: simulation, alertLevel, liveStats, alerts ├── sections/ │ ├── S00_Loading.jsx │ ├── S01_Hero.jsx │ ├── S02_CommandCenter.jsx │ ├── S03_AlertSystem.jsx │ ├── S04_DisasterMap.jsx │ ├── S05_IncidentReport.jsx │ ├── S06_ShelterLocator.jsx │ ├── S07_SafetyGuidelines.jsx │ ├── S08_EmergencyContacts.jsx │ ├── S09_ResourceDashboard.jsx │ ├── S10_VolunteerCenter.jsx │ ├── S11_AIAssistant.jsx │ ├── S12_DisasterSimulation.jsx │ ├── S13_ResponseTimeline.jsx │ ├── S14_MissingPersons.jsx │ ├── S15_Donations.jsx │ ├── S16_Checklist.jsx │ ├── S17_RescueNetwork.jsx │ ├── S18_NewsFeed.jsx │ ├── S19_Analytics.jsx │ └── S20_Footer.jsx ├── data/ │ ├── alerts.json │ └── shelters.json ├── App.jsx └── main.jsx public/ └── earth.jpg # User-provided Earth texture (WebP preferred) ``` ## 架构 ### 核心引擎 **`useSmoothScroll.js`** — Lenis(持续时间 1.3,自定义指数缓动)桥接到 GSAP 的 ticker 中。返回 `{ lenis, scrollY, scrollProgress }`。不需要 `ScrollTrigger.scrollerProxy()`。 **`useTickEngine.js`** — 以 1500ms 间隔执行 `setInterval`。每次 tick 会对 `disasterStore` 应用随机增量:获救人数、活跃事件、避难所占用率、志愿者人数。所有部分通过 Zustand 订阅 — 无需 prop 逐层传递。 **`disasterStore.js`** — 持有 `simulation`、`alertLevel`、`liveStats` 和 `alerts[]` 的 Zustand store。 ### 3D Canvas (`Scene.jsx`) - `` 使用 `ACESFilmicToneMapping`,曝光度 1.1,关闭抗锯齿 - 相机:`fov 50`,位置 `[0, 0, 6]`,`dpr={[1, 1.5]}` - 后期处理链:**Bloom** → **Noise** → **Vignette** - ``:性能下降 → 60k 粒子;性能提升 → 120k 粒子 - 每个 `` 都包裹在 `` 中 — 如果 WebGL 失败,将静默回退到 CSS 渐变 + 内联 SVG Earth ### 滚动与动画 - 所有动画均在 **GSAP** 中编写(ScrollTrigger 用于滚动驱动,ticker 用于帧驱动) - 仅在 S01 Hero 上设置 `frameloop="always"`;在 S04 Map 上设置 `frameloop="demand"`;其他所有部分均已移除该属性 - 每个部分文件都使用 `React.lazy()` + `` ## 部分(共 20 个) | # | 部分 | 核心功能 | |---|---|---| | S00 | 加载 | SVG logo 描边动画、扫描线、启动消息、clip-path 擦除进入 Hero | | S01 | Hero | R3F 地球仪、热点标记、鼠标视差、字符交错标题、实时状态栏、警报 ticker | | S02 | 指挥中心 | 6 个带有实时 Zustand 统计数据的 GlassCards、Recharts 迷你折线图、紧急状态推送、SVG 世界地图 | | S03 | 警报系统 | 筛选标签、严重程度颜色编码卡片、跳动的紧急背景 | | S04 | 灾难地图 | 可交互的 EarthGlobe、raycasting → 详情面板、灾难类型筛选器 | | S05 | 事件报告 | 4 步表单、拖拽上传、Case ID 生成 (`RESCUE-YYYYMMDD-XXXX`) | | S06 | 避难所定位器 | 实时搜索、占用率进度条、距离排序 | | S07 | 安全指南 | 动态手风琴 (GSAP 高度补间动画)、5 种灾难类别 | | S08 | 紧急联系人 | 4 个大型点击目标卡片、`tel:` 链接 | | S09 | 资源仪表板 | 水平 Recharts 条形图、余烬渐变条、滚动触发动画 | | S10 | 志愿者中心 | 卡片网格、滚动触发的垂直时间轴 | | S11 | AI 助手 | 固定在右下角的余烬/猩红球体、向上滑动面板、语音波形 SVG、关键字回复映射 | | S12 | 灾难模拟 | 4 种灾难类型 → `body.dataset.sim`、地球颜色变换、Web Audio API 音调、3D 叠加层 | | S13 | 响应时间轴 | 6 节点垂直时间轴、滚动触发交错动画 | | S14 | 失踪人员 | 搜索 + 筛选(失踪 / 已找到 / 搜索中) | | S15 | 捐赠 | 径向 SVG 进度条、滚动触发描边动画 | | S16 | 清单 | `localStorage` 持久化、颜色渐变进度条、100% 时的彩屑爆发效果 | | S17 | 救援网络 | SVG 力导向图、动态边线、跳动的节点 | | S18 | 新闻推送 | 每 4 秒自动前置内容、CSS 扫描线覆盖层 | | S19 | 数据分析 | 2×2 Recharts 网格:饼图 / 折线图 / 条形图 / 面积图 | | S20 | 页脚 | 5 列网格、悬停时社交图标变为余烬色 | ## 灾难模拟 (S12) 选择灾难类型会同时触发: 1. `document.body.dataset.sim = type` → 通过 `[data-sim]` 选择器覆盖 CSS 变量 2. 地球粒子颜色变为 `--sim-accent` 3. 警报部分自动筛选为所选类型 4. 统计数据更新为特定于模拟的数字 5. Web Audio API 音调(无音频文件): - **洪水** — 正弦波 80Hz,增益 0.05 - **野火** — 锯齿波 120Hz,增益 0.04 - **飓风** — 三角波 60Hz,增益 0.06 + LFO 调制 - **地震** — 通过 `AudioBufferSourceNode` 的噪声爆发,增益 0.08,2秒淡出 6. 3D 叠加层:上升的网格 / 粒子位移 / 环面纽结 / GSAP ShakeX ## 性能规则 - Three.js:在每个 `useEffect` 清理函数中 `dispose()` 几何体和材质 - Recharts:仅在部分进入视口时渲染(`IntersectionObserver`,阈值 0.1) - 图片:懒加载、WebP 格式,始终放在 `public/` 目录中 — 永远不要作为 JS 模块导入 - 部分:为每个部分文件使用 `React.lazy()` + `` - `frameloop` 按作用域划分到各个 canvas — 全局永远不要使用 "always" ## WebGL 降级方案 每个 `` 都包裹在 `` 中。如果 WebGL 失败: - **Hero** → CSS 动画渐变(`--ember` → `--crimson` → `--void`)+ 内联 SVG Earth - **Map** → 2D SVG 世界地图,带有 CSS 跳动标记 - 不向用户显示任何错误消息 ## 验收标准 - [ ] 加载屏幕完整播放动画,并以 clip-path 擦除效果进入 Hero — 无闪烁 - [ ] 3D 地球正常渲染、旋转,并响应鼠标 - [ ] 任何渲染输出中均无蓝色、紫色或青色(运行取色器进行抽查) - [ ] 灾难模拟能同时更改 `body` data 属性、地球颜色和警报筛选器 - [ ] AI 助手球体是余烬色/猩红色 — **不是**蓝色/青色 - [ ] 事件表单可完成所有 4 个步骤,并以 JetBrains Mono 生成 Case ID - [ ] Ticker 自动更新;统计计数器在挂载时执行累加 - [ ] 清单状态在页面刷新后依然保留 - [ ] 网站可在 iPhone 14 (375px) 上正常浏览,无水平滚动条 - [ ] 全部 20 个部分均能在 Chrome 125+ 上正常渲染,且控制台无报错 ## 构建阶段 | 阶段 | 交付物 | |---|---| | 0 | `globals.css` · `tailwind.config.js` · `disasterStore.js` · 所有 `/data/*.json` | | 1 | `useSmoothScroll` · `useTickEngine` · `useTilt` · `useMouseParallax` · `useCountUp` | | 2 | `Scene.jsx` · `EarthGlobe.jsx` · `ParticleField.jsx` · `SimOverlay.jsx` | | 3 | Navbar · CustomCursor · ScrollProgressBar · GlassCard · MagneticButton · AlertBadge · ProgressBar · CounterStat | | 4 | S00 加载 · S01 Hero · S02 指挥中心 · S03 警报系统 | | 5 | S04 地图 · S05 事件报告 · S06 避难所定位器 · S11 AI 助手 · S12 模拟 | | 6 | S07–S10 · S13–S19 · S20 页脚 | | 7 | `App.jsx` · `main.jsx` README | ## 终止条件 在以下情况发生前请先询问: - 添加锁定技术栈之外的任何包 - 使用任何色调的蓝色、青色或紫色 — 而是建议一种替代方案 - WebGL 帧率降至 30fps 以下 — 询问需要简化哪些部分 - 某个部分的布局破坏了相邻部分 ## 许可证 内部项目。保留所有权利。
标签:AI辅助, React, Syscalls, Three.js, Web前端, 应急管理系统, 灾害响应, 自定义脚本