KxlSys/BisoMapTech

GitHub: KxlSys/BisoMapTech

BisoMapTech 是一个为刚果技术社区构建的开源互动地图平台,旨在连接本地技术人才、促进协作并展示区域技术生态。

Stars: 3 | Forks: 0

BisoMapTech Logo

BisoMapTech

刚果技术社区的互动地图。

Vite React TypeScript Supabase Tailwind CSS License Open Source

关于 · 功能 · 架构 · 快速开始 · 贡献

## 关于 **BisoMapTech**(*“biso”* 在林加拉语中意为 *“我们”*)是一个开源平台,旨在**绘制并连接**刚果共和国的 IT 社区:包括开发者、系统与网络管理员、网络安全专家、data engineers、DevOps、设计师、培训师等。 其目标有三: | 🗺️ 可见性 | 🤝 连接 | 🌱 代表性 | |---|---|---| | 清晰展示刚果技术生态系统的丰富性 | 促进交流、指导与合作 | 展示刚果的技术不仅限于布拉柴维尔,并激励下一代 | ## 功能 - 🗺️ 基于 Leaflet 的刚果贡献者和技术地点**互动地图** - 👤 包含技能、技术栈、项目和 GitHub 链接的**详细个人资料** - 🔐 通过 Supabase Auth 的**安全身份验证** - 🔍 按城市、职业、技术、经验水平进行**搜索与过滤** - 💬 **端到端加密消息** (E2EE — ECDH P-256 + AES-GCM 256) - 🔔 新消息的**电子邮件通知**(通过 Edge Functions) - 🏢 **地点页面**(联合办公空间、学校、社区、企业等) - ⚙️ 自动同步个人资料中的 **GitHub 仓库** - 🛡️ 用于内容审核的**管理后台** - 📱 **响应式设计** — 针对移动端优化,支持浅色/深色模式 ## 技术栈 | 领域 | 技术 | | --- | --- | | 构建 / 开发服务器 | [Vite 7](https://vitejs.dev) | | UI 框架 | [React 19](https://react.dev) + TypeScript 5.9 | | 路由 | [React Router 6](https://reactrouter.com) | | 样式 | [Tailwind CSS 4](https://tailwindcss.com) + [shadcn/ui](https://ui.shadcn.com) (Radix UI) | | 状态管理 | [Zustand](https://zustand-demo.pmnd.rs) | | 表单 | [React Hook Form](https://react-hook-form.com) + [Zod](https://zod.dev) | | 地图 | [Leaflet](https://leafletjs.com) + React Leaflet | | 图表 | [Recharts](https://recharts.org) | | 后端 | [Supabase](https://supabase.com) (PostgreSQL, Auth, Realtime, Storage, Edge Functions) | | 测试 | [Vitest](https://vitest.dev) | | 部署 | [Vercel](https://vercel.com) | ## 架构 ### 项目结构 ``` BisoMapTech/ ├── public/ # Assets statiques (logo, favicons) ├── src/ │ ├── components/ # Composants UI réutilisables │ │ ├── filters/ # Panneaux de filtres │ │ ├── layout/ # Navbar, Footer, Layout global │ │ ├── map/ # Couche Leaflet et marqueurs │ │ ├── profile/ # Formulaires et cartes de profil │ │ └── ui/ # shadcn/ui (Button, Input, Avatar…) │ ├── pages/ # Pages applicatives routées │ ├── hooks/ # Hooks React partagés │ ├── lib/ # Clients (Supabase, E2EE service) et utilitaires │ ├── store/ # Stores Zustand (auth, filtres, unread…) │ ├── types/ # Types TypeScript partagés │ ├── App.tsx # Configuration des routes │ └── main.tsx # Point d'entrée Vite ├── supabase/ │ ├── migrations/ # Schéma SQL versionné (Row Level Security) │ └── functions/ # Edge Functions Deno │ ├── send-message-notification/ │ └── sync-github-repos/ ├── index.html ├── vite.config.ts └── vercel.json ``` ### 数据流 ``` graph TD A[Utilisateur / Navigateur] -->|Auth JWT| B[Supabase Auth] A -->|Requêtes REST / Realtime| C[Supabase Database\nPostgreSQL + RLS] A -->|Upload fichiers chiffrés| D[Supabase Storage] A -->|Appels SDK| E[Edge Functions Deno] E -->|Email| F[Service SMTP] E -->|API| G[GitHub API] C -->|Websocket Realtime| A style A fill:#1e293b,color:#e2e8f0 style B fill:#3ecf8e,color:#000 style C fill:#3ecf8e,color:#000 style D fill:#3ecf8e,color:#000 style E fill:#646cff,color:#fff ``` ### 消息的 E2EE 加密 ``` sequenceDiagram participant Alice participant Supabase participant Bob Alice->>Supabase: Récupère clé publique de Bob (JWK) Alice->>Alice: Dérive secret partagé ECDH(priv_Alice, pub_Bob) Alice->>Alice: Chiffre le message AES-GCM 256 bits Alice->>Supabase: INSERT message { cipherText, iv } Supabase-->>Bob: Realtime → nouveau message Bob->>Supabase: Récupère clé publique d'Alice (JWK) Bob->>Bob: Dérive secret partagé ECDH(priv_Bob, pub_Alice) Bob->>Bob: Déchiffre AES-GCM → texte clair ✅ Note over Alice,Bob: Les clés privées ne quittent jamais le navigateur (IndexedDB) ``` ## 快速开始 ### 前置条件 - **Node.js 20+** (Vite 7 需要 Node ≥ 20.19) - **npm** (或 pnpm / yarn / bun) - 一个**[Supabase](https://supabase.com)**(免费)项目,用于数据库和身份验证 ### 安装 ``` # 克隆仓库 git clone https://github.com/KalelDAMBA/BisoMapTech.git cd BisoMapTech # 安装依赖 npm install # 配置环境变量 cp .env.example .env.local # → 填入 VITE_SUPABASE_URL 和 VITE_SUPABASE_ANON_KEY # 启动开发服务器 npm run dev ``` 应用程序可通过 [http://localhost:5173](http://localhost:5173) 访问。 ### Supabase 数据库 ``` # 关联您的 Supabase 项目 supabase link --project-ref # 应用 SQL 迁移 supabase db push # 部署 Edge Functions supabase functions deploy send-message-notification supabase functions deploy sync-github-repos ``` ## 环境变量 | 变量 | 必填 | 描述 | | --- | :---: | --- | | `VITE_SUPABASE_URL` | ✅ | Supabase 项目 URL | | `VITE_SUPABASE_ANON_KEY` | ✅ | Supabase 项目的公共 (anon) 密钥 | ## 可用脚本 | 命令 | 描述 | | --- | --- | | `npm run dev` | 启动 Vite 开发服务器 (HMR) | | `npm run build` | 检查 TypeScript 类型并生成生产环境构建 | | `npm run preview` | 在本地提供生产环境构建的服务 | | `npm run typecheck` | 仅检查 TypeScript 类型 | | `npm run test` | 运行 Vitest 测试套件 | ## 安全与隐私 为了保护贡献者,发布任何位置数据均须遵守以下规则: - ✅ 使用**您所在城市的中心**或**公共地标**(市政厅、广场、纪念碑、大学)的坐标 - ❌ **绝不**透露您的个人住址或雇主地址 - ❌ 请勿重复使用其他贡献者的坐标 ### 参考坐标 — 刚果共和国 | 城市 | 省 | 纬度 | 经度 | | --- | --- | ---: | ---: | | 布拉柴维尔 (Brazzaville) | Brazzaville | -4.2634 | 15.2429 | | 黑角 (Pointe-Noire) | Pointe-Noire | -4.7889 | 11.8653 | | 多利吉 (Dolisie) | Niari | -4.1995 | 12.6667 | | 恩卡伊 (Nkayi) | Bouenza | -4.1842 | 13.2883 | | 马丁古 (Madingou) | Bouenza | -4.1550 | 13.5500 | | 奥万多 (Owando) | Cuvette | -0.4819 | 15.9000 | | 韦索 (Ouesso) | Sangha | 1.6136 | 16.0517 | | 因普丰多 (Impfondo) | Likouala | 1.6186 | 18.0622 | 如需报告安全漏洞,请提交一个标记为 `security` 的 GitHub *issue*。 ## 路线图 - [ ] 公开的 API 文档(RLS schema、表、视图) - [ ] 国际化(FR / EN / 林加拉语) - [ ] 移动应用(先推出 PWA,随后是原生应用) - [ ] 刚果技术生态系统的公开统计数据 - [ ] 科技公司与机构目录 - [ ] 内置指导计划 - [ ] 社区徽章与奖励系统 欢迎提出建议:请开一个 *issue* 进行讨论。 ## 许可证 基于 **MIT** 许可证分发。您可以自由使用、修改和重新分发本项目,但须保留原始版权声明。
由**刚果技术社区**制作并服务于该社区 ❤️ *BisoMapTech — 团结一致,走得更远。*
测试 CI workflow
标签:React, Supabase, Syscall, Syscalls, TypeScript, Web开发, 交互式地图, 安全插件, 实时通讯, 测试用例, 社区平台, 自动化攻击