Require login for meetup RSVP with cancel, notify organizers/authors/posters on RSVP/reply/gig/match, optional ntfy + Listmonk hooks, and honest newsletter messaging. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|---|---|---|
| backend | ||
| css | ||
| deploy | ||
| frontend | ||
| js | ||
| pocketbase/pb_data | ||
| scripts | ||
| .env.production.example | ||
| .gitignore | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| index.html | ||
| package.json | ||
| README.md | ||
nomadro · 数字游民旅居平台
品牌 nomadro — 用一行代码环游世界 🌏
线上: https://nomadweb.nomadro.com
产品路径(环环相扣)
功能很多,但不一次全部展示。导航与首页按三条环串联,每页只露出「接下来」:
| 环 | 做什么 | 主要入口 |
|---|---|---|
| 探索 Explore | 发现去哪 | 目的地、地图、下一站、签证;(离首页后再出现计划 / 对比) |
| 连接 Connect | 遇见同行 | 活动 → 社区 → 匹配 → 私信 |
| 成长 Grow | 路上做事 | 学院 → 赏金 → 工具箱(按需)→ 电子书 |
发现城市 ──► 写入计划 / 同城活动 ──► 社区 / 匹配 ──► 学院 / 赏金
- 顶栏:探索 / 连接 / 成长 三组下拉,EN · 主题 · 通知 固定在右上
Ctrl+K空态只给三环捷径;次要页面要搜索才出现- 工具箱默认精选 +「展开全部」,不再当全站站点地图
- 连接闭环: 活动报名需登录(可取消);匹配 / 报名 / 讨论回复 / 赏金申请会写入通知中心;可选 ntfy 推送(
NTFY_ENABLED+ 设置里打开「推送」) - 订阅: 写入 PocketBase;配置
LISTMONK_*后同步 Listmonk,未配置时文案如实提示「已登记」
技术栈
| 层级 | 技术 | 说明 |
|---|---|---|
| 前端 | Next.js 16 + React 19 | 仅 UI;App Router、standalone |
| 后端 | FastAPI | 全部业务逻辑(无 Next.js 业务 API Route) |
| 数据 | PocketBase | 主存储;本地可 Mock 降级 |
| 对象存储 | S3 兼容(生产 SeaweedFS) | 媒体上传 |
| 部署 | Caddy + systemd | 原生进程;勿与同机 dylive 业务互相干扰 |
项目结构
nomadweb/
├── frontend/ # Next.js(页面与组件)
│ ├── src/app/ # 路由
│ ├── src/components/ # UI(含 RingNext 下一步条)
│ └── src/lib/ # api / auth / i18n / rings
├── backend/ # FastAPI
│ ├── app/routers/ # REST
│ ├── app/services/ # PocketBase、S3、城市深度等
│ └── app/data/ # Mock 降级(开发)
├── deploy/ # Caddy、systemd、env 模板
├── scripts/ # 本地开发与生产更新
└── pocketbase/ # PB 数据目录(本地可选)
快速开始
1. PocketBase(可选)
不启动则 API 使用 Mock。
docker run -d -p 8090:8090 -v ./pocketbase/pb_data:/pb_data ghcr.io/muchobien/pocketbase:latest
2. FastAPI
cd backend
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reload --port 8000
3. Next.js
cd frontend
cp .env.local.example .env.local
npm install --legacy-peer-deps
npm run dev
.\scripts\dev.ps1 # Windows 一键
核心功能一览
按环归类(深度页会互相引导,避免平铺):
探索
| 能力 | 路径 |
|---|---|
| 地图 / 目的地 | /#map /#destinations /destinations/[slug] |
| 智能匹配 | 首页 CTA / M |
| 下一站决策 | /next-stop |
| 城市对比 | /compare |
| 旅居计划 | /plan(时间轴、预算、签证提醒、清单、ICS) |
| 签证指南 | /#visa |
连接
| 能力 | 路径 |
|---|---|
| 活动 RSVP / 直播间 | /meetups /meetups/[id]/live |
| 社区讨论 | /community |
| 游民匹配 | /dating |
| 私信 | /chat |
| 通知 | /notifications |
成长
| 能力 | 路径 |
|---|---|
| 游民学院 | /digital |
| 赏金任务 | /gigs |
| 工具箱 | /tools(实用小工具,非功能总览) |
| 电子书 | /book |
| 会员 | /join /pricing |
演示账号:demo@nomadro.com / demo123
环境变量
Backend
POCKETBASE_URL=http://127.0.0.1:8090
POCKETBASE_ADMIN_EMAIL=...
POCKETBASE_ADMIN_PASSWORD=...
CORS_ORIGINS=http://localhost:3000
# S3(生产见服务器 deploy/nomadro-api.env)
Frontend
NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
NEXT_PUBLIC_SITE_URL=http://localhost:3000
生产构建:
NEXT_PUBLIC_API_URL=https://nomadweb.nomadro.com/api/v1
NEXT_PUBLIC_SITE_URL=https://nomadweb.nomadro.com
Git 与部署
仓库:gitea.dsx2020.com/eric/nomadweb · 分支 dev1
git checkout dev1
git pull origin dev1
# … 改代码 …
git push origin dev1
python scripts/deploy_update.py # 服务器 pull + 增量构建重启
| 生产进程 | 地址 |
|---|---|
| 网站 | https://nomadweb.nomadro.com |
nomadro-web |
127.0.0.1:3055 |
nomadro-api |
127.0.0.1:8055 |
| PocketBase | 127.0.0.1:8090 |
| S3 | s3.nomadro.com → SeaweedFS |
注意: 同机还跑有 dylive.nomadro.com(/opt/douyinWEB)。更新 nomadweb 时不要改动 / 限流 / 杀掉直播相关进程。
密钥仅放服务器 deploy/nomadro-api.env(模板见 *.env.example),勿提交。
快捷键
| 按键 | 功能 |
|---|---|
Ctrl+K |
全局搜索(三环捷径) |
M |
智能匹配 |
P |
旅居计划 |
T |
工具箱 |
? |
帮助 |
Esc |
关闭弹窗 |
相关
- 迭代说明:/changelog
- 前端脚手架说明:
frontend/README.md(以本文件为准)
License
MIT