KxlSys/BisoMapTech
GitHub: KxlSys/BisoMapTech
BisoMapTech 是一个为刚果技术社区构建的开源互动地图平台,旨在连接本地技术人才、促进协作并展示区域技术生态。
Stars: 3 | Forks: 0
## 关于
**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开发, 交互式地图, 安全插件, 实时通讯, 测试用例, 社区平台, 自动化攻击