diff --git a/README.md b/README.md index e215bc4..65308a1 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,110 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# 游牧中国 NomadCNA -## Getting Started +数字游民生活操作系统 (Nomad OS) - 你的下一站,由数据决定 -First, run the development server: +## 项目简介 + +NomadCNA 是一个面向数字游民的站式生活平台,提供城市决策、税务签证、智能匹配、赏金任务等功能。从 Free 到 Pro,开启你的游牧人生。 + +## 技术栈 + +- **前端框架**: Next.js 16 (App Router) +- **UI 框架**: React 19 + Tailwind CSS 4 +- **样式**: Tailwind CSS +- **字体**: Geist (Vercel) +- **数据库**: PocketBase +- **对象存储**: MinIO +- **语言**: TypeScript + +## 功能特性 + +- 🌏 **城市探索** - 发现最适合数字游民的中国城市 +- 📍 **城市数据** - 成本、生活质量、网络速度等数据对比 +- 🎯 **智能匹配** - 根据个人偏好推荐适合的城市 +- 🤝 **社区聚会** - 与各地游民建立联系 +- 💬 **社区互动** - 论坛、话题讨论 +- 🛠️ **实用工具** - 汇率、天气等实用工具 +- 🌙 **暗色模式** - 支持亮色/暗色主题切换 +- 🌐 **国际化** - 支持中文/英文 + +## 快速开始 + +### 环境要求 + +- Node.js 18+ +- npm / yarn / pnpm / bun + +### 安装依赖 + +```bash +npm install +``` + +### 开发模式 ```bash npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +打开 [http://localhost:3000](http://localhost:3000) 查看项目。 -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +### 生产构建 -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. +```bash +npm run build +npm start +``` -## Learn More +## 项目结构 -To learn more about Next.js, take a look at the following resources: +``` +├── app/ # Next.js App Router +│ ├── components/ # React 组件 +│ ├── context/ # React Context (主题等) +│ ├── lib/ # 工具库 +│ └── [locale]/ # 国际化路由 +├── config/ # 配置文件 +│ ├── site.config.ts # 站点配置 +│ ├── nav.config.ts # 导航配置 +│ ├── footer.config.ts # 页脚配置 +│ └── ... +├── public/ # 静态资源 +└── i18n/ # 国际化配置 +``` -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +## 主要页面 -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! +- `/` - 首页 (城市探索) +- `/about` - 关于我们 +- `/meetups` - 聚会活动 +- `/dating` - 社区交友 +- `/tools` - 实用工具 +- `/ai` - AI 助手 +- `/gigs` - 赏金任务 +- `/pricing` - 会员价格 +- `/join` - 加入社区 -## Deploy on Vercel +## 配置 -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +### 主题配置 -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +主题相关逻辑位于 `app/context/ThemeContext.tsx`,支持: +- 手动切换亮色/暗色模式 +- 记住用户偏好 (localStorage) +- 跟随系统设置 + +### 导航配置 + +导航链接位于 `config/nav.config.ts`,可自定义修改。 + +### 页脚配置 + +页脚链接位于 `config/footer.config.ts`,可自定义修改。 + +## 贡献指南 + +欢迎提交 Pull Request 和 Issue! + +## 许可证 + +MIT License diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 4259e31..d87de4e 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -1,60 +1,17 @@ "use client"; import { useState, useMemo } from "react"; -import { Link } from "@/i18n/navigation"; +import { Link, useLocale } from "@/i18n/navigation"; +import { useTranslation } from "@/i18n/navigation"; import HeroSection from "../components/HeroSection"; import FilterBar from "../components/FilterBar"; import CityCard from "../components/CityCard"; import CityModal from "../components/CityModal"; import Footer from "../components/Footer"; import { cities, type City } from "../data/cities"; +import { HOME_CONFIG } from "@/config"; -const memberPhotos = [ - { name: "林晓", photo: "https://i.pravatar.cc/150?img=5" }, - { name: "张浩", photo: "https://i.pravatar.cc/150?img=3" }, - { name: "陈悦", photo: "https://i.pravatar.cc/150?img=9" }, - { name: "周杰", photo: "https://i.pravatar.cc/150?img=7" }, - { name: "吴婷", photo: "https://i.pravatar.cc/150?img=1" }, - { name: "杨帅", photo: "https://i.pravatar.cc/150?img=12" }, - { name: "赵琪", photo: "https://i.pravatar.cc/150?img=16" }, - { name: "黄磊", photo: "https://i.pravatar.cc/150?img=11" }, - { name: "孙莉", photo: "https://i.pravatar.cc/150?img=20" }, -]; - -const travelingNow = [ - { name: "小明", photo: "https://i.pravatar.cc/150?img=52", dest: "大理" }, - { name: "雨晴", photo: "https://i.pravatar.cc/150?img=44", dest: "成都" }, - { name: "阿杰", photo: "https://i.pravatar.cc/150?img=53", dest: "深圳" }, - { name: "小燕", photo: "https://i.pravatar.cc/150?img=47", dest: "杭州" }, - { name: "大伟", photo: "https://i.pravatar.cc/150?img=55", dest: "厦门" }, - { name: "佳琪", photo: "https://i.pravatar.cc/150?img=48", dest: "昆明" }, - { name: "志远", photo: "https://i.pravatar.cc/150?img=57", dest: "丽江" }, - { name: "心怡", photo: "https://i.pravatar.cc/150?img=49", dest: "三亚" }, - { name: "凯文", photo: "https://i.pravatar.cc/150?img=59", dest: "上海" }, - { name: "子豪", photo: "https://i.pravatar.cc/150?img=60", dest: "北京" }, - { name: "浩然", photo: "https://i.pravatar.cc/150?img=61", dest: "广州" }, - { name: "雅琪", photo: "https://i.pravatar.cc/150?img=21", dest: "南京" }, - { name: "天翔", photo: "https://i.pravatar.cc/150?img=67", dest: "长沙" }, - { name: "美玲", photo: "https://i.pravatar.cc/150?img=23", dest: "苏州" }, - { name: "俊杰", photo: "https://i.pravatar.cc/150?img=68", dest: "青岛" }, - { name: "晓华", photo: "https://i.pravatar.cc/150?img=26", dest: "珠海" }, -]; - -const meetups = [ - { city: "大理", emoji: "🏯", date: "3月9日", count: 12 }, - { city: "成都", emoji: "🐼", date: "3月12日", count: 8 }, - { city: "深圳", emoji: "🌃", date: "3月14日", count: 15 }, - { city: "厦门", emoji: "🌊", date: "3月16日", count: 6 }, - { city: "杭州", emoji: "⛲", date: "3月20日", count: 23 }, -]; - -const hotTopics = [ - { title: "大理最佳共享办公空间推荐 Top 10", views: 2340 }, - { title: "2026年数字游民友好城市排名", views: 1890 }, - { title: "远程工作者的税务规划指南", views: 1560 }, - { title: "成都 vs 大理:哪个更适合游民?", views: 1230 }, - { title: "新手游民必备工具与装备清单", views: 980 }, -]; +const { memberPhotos, travelingNow, meetups: homeMeetups, hotTopics, routes, stats, communityStats } = HOME_CONFIG; function safetyOrder(s: string): number { const o: Record = { 极好: 5, 很好: 4, 好: 3, 一般: 2, 差: 1 }; @@ -65,6 +22,9 @@ export default function Home() { const [activeFilter, setActiveFilter] = useState("全部"); const [sortBy, setSortBy] = useState("score"); const [cityModal, setCityModal] = useState(null); + const locale = useLocale(); + const { t } = useTranslation("home"); + const { t: tNav } = useTranslation("nav"); const filteredCities = useMemo(() => { let result = [...cities]; @@ -99,23 +59,23 @@ export default function Home() {
- 18 -

个城市

+ {stats.cities} +

{t("stats.cities")}

- 5,000+ -

位游民

+ {stats.nomads} +

{t("stats.nomads")}

- 8+ -

场聚会/月

+ {stats.homeMeetups} +

{t("stats.meetups")}

- ¥3,000 -

起/月生活费

+ {stats.cost} +

{t("stats.cost")}

@@ -132,23 +92,23 @@ export default function Home() {
-
加入社群
+
{t("joinCommunity")}
💬

- 加入数字游民微信社群 + {t("joinCommunityDesc")}

- 3,200+ 在线成员 + {communityStats.onlineMembers} {t("membersOnline")}

- 加入社群 → + {t("joinCommunity")} →
-
新成员
+
{t("newMembers")}
{memberPhotos.map((m) => ( ))}
- 本月 86 人加入 + {locale === "zh" ? "本月 86 人加入" : "86 joined this month"}
- -
最新活动
+ +
{t("latestEvents")}
🗓 3月15日 @@ -175,7 +135,7 @@ export default function Home() { 📍 深圳南山
- 👥 12人 + 👥 12{t("people")}
{memberPhotos.slice(0, 5).map((m) => ( @@ -204,13 +164,13 @@ export default function Home() {
🏜️

- 没有找到匹配的城市 + {t("noMatch")}

)} @@ -218,38 +178,10 @@ export default function Home() {

- 热门路线 + {t("hotRoutes")}

- {[ - { - title: "云南慢生活线", - cities: ["昆明", "大理", "丽江"], - emojis: ["🌸", "🏯", "🏔️"], - duration: "3-6个月", - cost: "¥3,200/月起", - desc: "从春城昆明出发,沿着滇西北一路感受最纯粹的慢生活", - gradient: "from-purple-500 to-pink-500", - }, - { - title: "科技创业线", - cities: ["深圳", "杭州", "上海"], - emojis: ["🌃", "⛲", "🏙️"], - duration: "2-4个月", - cost: "¥7,000/月起", - desc: "穿越中国三大科技中心,连接最前沿的创业生态", - gradient: "from-blue-500 to-cyan-500", - }, - { - title: "美食文化线", - cities: ["成都", "重庆", "长沙"], - emojis: ["🐼", "🌶️", "🎪"], - duration: "2-3个月", - cost: "¥4,000/月起", - desc: "巴蜀到湘楚,用味蕾丈量中国最火辣的城市", - gradient: "from-orange-500 to-red-500", - }, - ].map((route) => ( + {routes.map((route) => (

- 社区动态 + {t("communityDynamics")}

@@ -303,14 +235,14 @@ export default function Home() {

- 🍹 近期聚会 + 🍹 {t("recentMeetups")}

- 8场/月 + {homeMeetups.length}{t("perMonth")}
- {meetups.map((m) => ( + {homeMeetups.map((m) => (
{m.emoji} @@ -320,16 +252,16 @@ export default function Home() {
- {m.count}人 + {m.count}{t("people")}
))}
- 查看全部聚会 → + {t("viewMore")}
@@ -338,10 +270,10 @@ export default function Home() {

- 🛩️ 正在旅行 + 🛩️ {t("travelingNow")}

- {travelingNow.length}人 + {travelingNow.length}{t("people")}
@@ -361,27 +293,27 @@ export default function Home() {

- 🔥 热门讨论 + 🔥 {t("hotDiscussions")}

@@ -391,15 +323,15 @@ export default function Home() {
🛡️
-

旅行保险

-

数字游民定制方案

+

{t("travelInsurance")}

+

{t("travelInsuranceDesc")}

- 覆盖全国 + 境外,远程工作专属条款,¥15/天起 + {t("insuranceCoverage")}

@@ -409,8 +341,8 @@ export default function Home() {
💬
-

社区聊天

-

本月 3,200+ 条消息

+

{t("communityChat")}

+

{locale === "zh" ? `本月 ${communityStats.messagesPerMonth} 条消息` : `${communityStats.messagesPerMonth} messages this month`}

@@ -424,10 +356,10 @@ export default function Home() { /> ))}
- 在线中 + {t("onlineNow")}
@@ -437,9 +369,9 @@ export default function Home() {
🏛️
-

落地指南

+

{t("landingGuide")}

- 租房 · 共享办公 · 本地攻略 + {t("landingGuideDesc")}

@@ -454,7 +386,7 @@ export default function Home() { ))}
diff --git a/app/[locale]/tools/page.tsx b/app/[locale]/tools/page.tsx index 4ccb766..7251373 100644 --- a/app/[locale]/tools/page.tsx +++ b/app/[locale]/tools/page.tsx @@ -123,6 +123,26 @@ export default function ToolsPage() {
+ +
+

+ 🌱 {t("fireCalculator")} +

+

{t("fireDesc")}

+
+ {t("comingSoon")} +
+
+ +
+

+ 🌤️ {t("climateFinder")} +

+

{t("climateDesc")}

+
+ {t("comingSoon")} +
+