7.3 KiB
7.3 KiB
nomadro · 数字游民旅居平台
全栈数字游民旅居指南,品牌 nomadro — 用一行代码环游世界 🌏
线上: https://nomadweb.nomadro.com
核心产品闭环:发现目的地 → 智能匹配 / 城市对比 → 旅居计划中心 → 登录云端同步
技术栈
| 层级 | 技术 | 说明 |
|---|---|---|
| 前端 | Next.js 16 + React 19 | App Router、ISR、Turbopack、standalone |
| 后端 | FastAPI | REST API、业务逻辑、账号计划同步 |
| 数据 | PocketBase + Mock 降级 | 内容库;用户收藏/计划可落盘 |
| 部署 | Caddy + systemd(原生优先) | 生产非 Docker 跑 Web/API |
项目结构
nomadweb/
├── frontend/ # Next.js
│ ├── src/app/ # 路由:/ /plan /compare /tools /profile …
│ ├── src/components/ # UI 与工具组件
│ └── src/lib/ # API、auth、trip/plan 存储与同步
├── backend/ # FastAPI
│ ├── app/routers/ # API 路由
│ ├── app/services/ # PocketBase、Auth(含计划同步)
│ └── app/data/ # Mock 降级 + user_store(运行时)
├── deploy/ # Caddy、systemd 单元
├── scripts/ # 本地开发、生产部署脚本
├── pocketbase/ # PocketBase 数据目录
└── docker-compose*.yml # 本地 / 备选生产 Compose
快速开始
1. PocketBase(可选)
不启动则 API 自动使用 backend/app/data/mock_data.py。
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 一键
docker compose up -d # Compose 全栈
核心产品
| 能力 | 路径 / 入口 | 说明 |
|---|---|---|
| 🗺️ 地图 & 目的地 | /#map /#destinations |
筛选、收藏、勾选对比(最多 4 城) |
| 🎯 智能匹配 | FAB / M |
4 步问卷;偏好本地保存;Top 结果可写入计划 / 对比 |
| ⚖️ 城市对比台 | /compare |
可分享 ?cities=;指标并排;写入计划 |
| 🗓️ 旅居计划中心 | /plan |
多城时间轴、出发月、预算、站内备注、签证方案与超期提醒、就绪清单、MD / ICS 导出、分享链接 |
| ☁️ 账号同步 | /login?next=/plan |
登录后合并本机与云端计划;收藏同步;服务重启落盘保留 |
| 👤 个人中心 | /profile |
计划仪表盘、就绪度、收藏写入计划、成就 |
演示账号:demo@nomadro.com / demo123
首页与工具箱
首页仍聚合大量旅居工具(按视口懒加载),完整列表见 /tools 与 /changelog。常见能力包括:
- 费用计算器、多币种、启动金 / 跑道、落地首月成本
- 时区看板、会议重叠、日照办公窗、时差估算
- 签证指南 + 停留倒计时、保险、税居天数
- 联合办公、住宿、SIM、电源、紧急联系、防坑与取现
- 行李清单、到站清单、专注时钟、博客与 FAQ 等
导航、Hero、快捷条、底栏与新手引导优先导向 计划 / 对比,小工具集中在工具箱。
体验与性能
- 首屏:地图 + 目的地;中屏及以下
WhenVisible+ 动态拆包 - Outfit 自托管;中文系统字体;缩短 Loader;粒子延后、无连线
- 深浅色主题、
Ctrl+K全局搜索、Toast、Cookie 提示 - 响应式布局;
.section使用content-visibility
页面路由
| 路径 | 说明 |
|---|---|
/ |
首页 |
/plan |
旅居计划中心 |
/compare |
城市对比台 |
/tools |
工具箱 |
/destinations/[slug] |
目的地详情(画像、停留月数、加入计划) |
/login |
登录 / 注册(?next= 回流,默认 /plan) |
/profile |
用户中心 |
/blog/[slug] |
博客 |
/about /privacy /changelog |
关于 / 隐私 / 更新日志 |
/sitemap.xml |
含 /plan、/compare 等 |
后端 API(节选)
| 端点 | 方法 | 说明 |
|---|---|---|
/api/v1/destinations |
GET | 列表(region / search / sort) |
/api/v1/destinations/{slug} |
GET | 详情 |
/api/v1/destinations/compare |
POST | 按 slug 取城 |
/api/v1/calculator |
POST | 费用估算 |
/api/v1/search |
GET | 全局搜索 |
/api/v1/visas 等 |
GET | 签证 / FAQ / 博客 / 图表 |
/api/v1/auth/register |
POST | 注册 |
/api/v1/auth/login |
POST | 登录 |
/api/v1/auth/demo |
GET | 演示登录 |
/api/v1/auth/favorites |
GET/POST | 收藏 |
/api/v1/auth/plan |
GET/PUT | 旅居计划云端读写 |
/api/v1/auth/profile/stats |
GET | 个人统计 |
/api/v1/subscribe |
POST | 邮件订阅 |
/api/v1/health |
GET | 健康检查 |
PocketBase 不可用时内容接口降级 Mock。用户收藏与计划写入 backend/app/data/user_store.json(运行时生成,勿提交密钥与生产数据)。
环境变量
Backend backend/.env
POCKETBASE_URL=http://127.0.0.1:8090
POCKETBASE_ADMIN_EMAIL=admin@nomadro.com
POCKETBASE_ADMIN_PASSWORD=admin123456
CORS_ORIGINS=http://localhost:3000
Frontend frontend/.env.local
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
部署
生产(已上线)
| 项目 | 地址 |
|---|---|
| 网站 | https://nomadweb.nomadro.com |
| API 健康检查 | https://nomadweb.nomadro.com/api/v1/health |
| API 文档 | https://nomadweb.nomadro.com/docs |
| 仓库 | https://gitea.dsx2020.com/eric/nomadweb |
架构(原生 systemd,Caddy 反代):
| 进程 | 地址 |
|---|---|
| Caddy | HTTPS → 见 deploy/caddy/nomadweb.caddy |
nomadro-web |
127.0.0.1:3055(Next standalone) |
nomadro-api |
127.0.0.1:8055(uvicorn) |
| PocketBase | 127.0.0.1:8090 |
单元:deploy/systemd/nomadro-web.service、nomadro-api.service。
推荐更新:
# 需能 git pull 到 origin/dev1 时
python scripts/deploy_update.py
拉取 → 按变更增量构建前后端 → systemctl restart;会停掉占用端口的旧 Docker Web/API 容器。
Gitea 不可用 / 仅本地有最新提交时:
python scripts/deploy_direct_sync.py
SFTP 同步变更文件 → 重建前端(并重启 API)→ 健康检查。
备选 Docker Compose: 见 docker-compose.prod.yml(生产默认以原生为准)。
快捷键
| 按键 | 功能 |
|---|---|
Ctrl+K |
全局搜索 |
M |
智能匹配 |
P |
打开旅居计划中心 |
T |
打开工具箱 |
G |
命运转盘(首页) |
? |
快捷键帮助 |
Esc |
关闭弹窗 |
相关文档
- 产品迭代:
/changelog - 本地变更记录:
frontend/src/app/changelog/page.tsx
License
MIT