This commit is contained in:
eric
2026-06-06 04:29:46 -05:00
parent 88aa96a2a1
commit 41493c35ca
50 changed files with 4666 additions and 416 deletions

373
backend/seed_data.py Normal file
View File

@@ -0,0 +1,373 @@
from __future__ import annotations
CITIES = [
{
"slug": "dali",
"idNumber": 1,
"name": "大理",
"nameEn": "Dali",
"country": "中国",
"countryEmoji": "🇨🇳",
"overallScore": 4.5,
"costPerMonth": 3000,
"internetSpeed": 50,
"safety": "很好",
"liked": "极好",
"temperature": 16,
"humidity": 60,
"nomadsNow": 520,
"description": "苍山洱海,文艺气息浓厚的慢生活之城",
"descriptionEn": "Cangshan and Erhai, a slow-living city with a strong creative vibe.",
"gradientFrom": "#2563eb",
"gradientTo": "#0891b2",
"icon": "🏯",
"tags": ["热门", "便宜", "宜居", "山城", "文化", "友好社区"],
"coverImage": "https://images.unsplash.com/photo-1590856029826-c7a73142bbf1?w=1200",
"reviewsCount": 2842,
"likedCount": 198,
"dislikedCount": 32,
"qualityOfLife": "Good",
"familyScore": "Okay",
"communityScore": "Great",
"nomadPercent": 2,
"funLabel": "Great",
"feelsLikeTemp": 18,
"acPercent": 65,
"lat": 25.7,
"lng": 100.2,
"region": "亚洲",
},
{
"slug": "chengdu",
"idNumber": 2,
"name": "成都",
"nameEn": "Chengdu",
"country": "中国",
"countryEmoji": "🇨🇳",
"overallScore": 4.4,
"costPerMonth": 4500,
"internetSpeed": 80,
"safety": "很好",
"liked": "极好",
"temperature": 17,
"humidity": 75,
"nomadsNow": 680,
"description": "天府之国,美食与慢节奏的完美融合",
"descriptionEn": "A laid-back food capital with strong community energy.",
"gradientFrom": "#059669",
"gradientTo": "#65a30d",
"icon": "🐼",
"tags": ["热门", "美食", "都市", "新一线", "文化", "友好社区"],
"coverImage": "https://images.unsplash.com/photo-1547981609-4b6bfe67ca0b?w=1200",
"reviewsCount": 3654,
"likedCount": 312,
"dislikedCount": 28,
"qualityOfLife": "Great",
"familyScore": "Good",
"communityScore": "Great",
"nomadPercent": 3,
"funLabel": "Great",
"feelsLikeTemp": 20,
"acPercent": 85,
"lat": 30.6,
"lng": 104.1,
"region": "亚洲",
},
{
"slug": "shenzhen",
"idNumber": 3,
"name": "深圳",
"nameEn": "Shenzhen",
"country": "中国",
"countryEmoji": "🇨🇳",
"overallScore": 4.1,
"costPerMonth": 8000,
"internetSpeed": 120,
"safety": "极好",
"liked": "很好",
"temperature": 23,
"humidity": 70,
"nomadsNow": 850,
"description": "科技创新之城,创业者的乐园",
"descriptionEn": "A fast-moving tech hub for builders and startup people.",
"gradientFrom": "#1d4ed8",
"gradientTo": "#0284c7",
"icon": "🌃",
"tags": ["热门", "高速网络", "都市", "一线城市", "安全"],
"coverImage": "https://images.unsplash.com/photo-1518837695005-2083093ee35b?w=1200",
"reviewsCount": 4242,
"likedCount": 355,
"dislikedCount": 24,
"qualityOfLife": "Good",
"familyScore": "Good",
"communityScore": "Great",
"nomadPercent": 4,
"funLabel": "Good",
"feelsLikeTemp": 28,
"acPercent": 95,
"lat": 22.5,
"lng": 114.1,
"region": "亚洲",
},
{"slug": "shanghai", "idNumber": 4, "name": "上海", "nameEn": "Shanghai", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 4.0, "costPerMonth": 10000, "internetSpeed": 110, "safety": "极好", "liked": "", "temperature": 17, "humidity": 65, "nomadsNow": 1200, "description": "国际大都市,东西方文化交汇的中心", "descriptionEn": "An international city for global teams and premium urban life.", "gradientFrom": "#b45309", "gradientTo": "#78716c", "icon": "🏙️", "tags": ["热门", "高速网络", "都市", "一线城市", "文化"], "lat": 31.2, "lng": 121.5, "region": "亚洲"},
{"slug": "hangzhou", "idNumber": 5, "name": "杭州", "nameEn": "Hangzhou", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 4.3, "costPerMonth": 6000, "internetSpeed": 100, "safety": "极好", "liked": "很好", "temperature": 17, "humidity": 70, "nomadsNow": 560, "description": "西湖之畔,互联网重镇与诗画江南", "descriptionEn": "West Lake, internet companies, and a polished lifestyle.", "gradientFrom": "#047857", "gradientTo": "#0d9488", "icon": "", "tags": ["热门", "高速网络", "都市", "新一线", "宜居", "文化"], "lat": 30.2, "lng": 120.2, "region": "亚洲"},
{"slug": "xiamen", "idNumber": 6, "name": "厦门", "nameEn": "Xiamen", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 4.1, "costPerMonth": 5500, "internetSpeed": 70, "safety": "很好", "liked": "很好", "temperature": 21, "humidity": 75, "nomadsNow": 320, "description": "海滨花园城市,鼓浪屿的浪漫与闽南风情", "descriptionEn": "A warm coastal city with island life and Fujian culture.", "gradientFrom": "#ea580c", "gradientTo": "#0284c7", "icon": "🌊", "tags": ["海滨", "温暖", "美食", "宜居", "文化"], "lat": 24.5, "lng": 118.1, "region": "亚洲"},
{"slug": "beijing", "idNumber": 7, "name": "北京", "nameEn": "Beijing", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.8, "costPerMonth": 9000, "internetSpeed": 100, "safety": "极好", "liked": "", "temperature": 14, "humidity": 50, "nomadsNow": 780, "description": "千年古都,政治文化中心的深厚底蕴", "descriptionEn": "A historic capital with deep culture and broad opportunities.", "gradientFrom": "#dc2626", "gradientTo": "#b91c1c", "icon": "🏛️", "tags": ["都市", "一线城市", "文化", "高速网络", "历史名城"], "lat": 39.9, "lng": 116.4, "region": "亚洲"},
{"slug": "guangzhou", "idNumber": 8, "name": "广州", "nameEn": "Guangzhou", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.9, "costPerMonth": 6500, "internetSpeed": 90, "safety": "很好", "liked": "", "temperature": 23, "humidity": 80, "nomadsNow": 480, "description": "食在广州,千年商都的烟火气", "descriptionEn": "A commercial southern city with excellent food and warm winters.", "gradientFrom": "#f97316", "gradientTo": "#ef4444", "icon": "🌺", "tags": ["热门", "美食", "都市", "一线城市", "温暖"], "lat": 23.1, "lng": 113.3, "region": "亚洲"},
{"slug": "chongqing", "idNumber": 9, "name": "重庆", "nameEn": "Chongqing", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.7, "costPerMonth": 4000, "internetSpeed": 75, "safety": "很好", "liked": "", "temperature": 18, "humidity": 80, "nomadsNow": 350, "description": "8D魔幻山城火锅与夜景的不夜城", "descriptionEn": "A dramatic mountain city with food, night views, and low cost.", "gradientFrom": "#ef4444", "gradientTo": "#c2410c", "icon": "🌶️", "tags": ["便宜", "美食", "山城", "都市", "文化"], "lat": 29.6, "lng": 106.6, "region": "亚洲"},
{"slug": "kunming", "idNumber": 10, "name": "昆明", "nameEn": "Kunming", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 4.2, "costPerMonth": 3500, "internetSpeed": 55, "safety": "", "liked": "很好", "temperature": 16, "humidity": 55, "nomadsNow": 380, "description": "四季如春的春城,通往东南亚的门户", "descriptionEn": "Spring-like weather year-round and a gateway to Southeast Asia.", "gradientFrom": "#d946ef", "gradientTo": "#059669", "icon": "🌸", "tags": ["便宜", "温暖", "宜居", "友好社区", "户外运动"], "lat": 25.0, "lng": 102.7, "region": "亚洲"},
{"slug": "sanya", "idNumber": 11, "name": "三亚", "nameEn": "Sanya", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.5, "costPerMonth": 5000, "internetSpeed": 60, "safety": "", "liked": "", "temperature": 26, "humidity": 85, "nomadsNow": 250, "description": "中国的热带天堂,椰风海韵的度假胜地", "descriptionEn": "A tropical beach city for winter sun and slower workdays.", "gradientFrom": "#0ea5e9", "gradientTo": "#06b6d4", "icon": "🏖️", "tags": ["海滨", "温暖", "户外运动"], "lat": 18.3, "lng": 109.5, "region": "亚洲"},
{"slug": "lijiang", "idNumber": 12, "name": "丽江", "nameEn": "Lijiang", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 4.0, "costPerMonth": 3200, "internetSpeed": 45, "safety": "", "liked": "", "temperature": 14, "humidity": 50, "nomadsNow": 280, "description": "玉龙雪山下的纳西古城,灵魂栖息地", "descriptionEn": "An old town below Jade Dragon Snow Mountain for reflective stays.", "gradientFrom": "#6366f1", "gradientTo": "#7c3aed", "icon": "🏔️", "tags": ["便宜", "文化", "山城", "宜居", "历史名城"], "lat": 26.9, "lng": 100.2, "region": "亚洲"},
{"slug": "xian", "idNumber": 13, "name": "西安", "nameEn": "Xi'an", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.8, "costPerMonth": 4200, "internetSpeed": 70, "safety": "很好", "liked": "", "temperature": 15, "humidity": 55, "nomadsNow": 230, "description": "十三朝古都,历史与美食交织的城市", "descriptionEn": "Ancient history, strong food culture, and reasonable costs.", "gradientFrom": "#78716c", "gradientTo": "#a16207", "icon": "🗿", "tags": ["便宜", "美食", "文化", "历史名城"], "lat": 34.3, "lng": 108.9, "region": "亚洲"},
{"slug": "nanjing", "idNumber": 14, "name": "南京", "nameEn": "Nanjing", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.9, "costPerMonth": 5500, "internetSpeed": 85, "safety": "很好", "liked": "", "temperature": 16, "humidity": 70, "nomadsNow": 400, "description": "六朝古都,紫金山下的文化名城", "descriptionEn": "A cultural city with universities, history, and steady infrastructure.", "gradientFrom": "#7c3aed", "gradientTo": "#059669", "icon": "🍃", "tags": ["文化", "都市", "新一线", "历史名城"], "lat": 32.1, "lng": 118.8, "region": "亚洲"},
{"slug": "changsha", "idNumber": 15, "name": "长沙", "nameEn": "Changsha", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.6, "costPerMonth": 4500, "internetSpeed": 75, "safety": "", "liked": "", "temperature": 17, "humidity": 75, "nomadsNow": 290, "description": "娱乐之都,夜生活与美食的不眠城", "descriptionEn": "A media and food city with active nightlife and young energy.", "gradientFrom": "#f59e0b", "gradientTo": "#16a34a", "icon": "🎪", "tags": ["美食", "都市", "新一线", "友好社区"], "lat": 28.2, "lng": 112.9, "region": "亚洲"},
{"slug": "qingdao", "idNumber": 16, "name": "青岛", "nameEn": "Qingdao", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.7, "costPerMonth": 4800, "internetSpeed": 65, "safety": "很好", "liked": "", "temperature": 13, "humidity": 65, "nomadsNow": 220, "description": "红瓦绿树碧海蓝天,啤酒飘香的海滨城市", "descriptionEn": "A northern coastal city with sea air, beer, and livable districts.", "gradientFrom": "#2563eb", "gradientTo": "#ca8a04", "icon": "🍺", "tags": ["海滨", "美食", "宜居", "户外运动"], "lat": 36.1, "lng": 120.4, "region": "亚洲"},
{"slug": "suzhou", "idNumber": 17, "name": "苏州", "nameEn": "Suzhou", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 4.0, "costPerMonth": 5000, "internetSpeed": 80, "safety": "极好", "liked": "很好", "temperature": 17, "humidity": 70, "nomadsNow": 260, "description": "上有天堂下有苏杭,古典园林与现代新城", "descriptionEn": "Classical gardens, modern industry, and a calm Jiangnan lifestyle.", "gradientFrom": "#0d9488", "gradientTo": "#64748b", "icon": "🏡", "tags": ["文化", "宜居", "安全", "历史名城"], "lat": 31.3, "lng": 120.6, "region": "亚洲"},
{"slug": "zhuhai", "idNumber": 18, "name": "珠海", "nameEn": "Zhuhai", "country": "中国", "countryEmoji": "🇨🇳", "overallScore": 3.9, "costPerMonth": 5200, "internetSpeed": 70, "safety": "很好", "liked": "", "temperature": 23, "humidity": 75, "nomadsNow": 180, "description": "浪漫之城,毗邻澳门的海滨花园", "descriptionEn": "A relaxed coastal city next to Macau with clean streets and sea views.", "gradientFrom": "#0891b2", "gradientTo": "#6366f1", "icon": "🎡", "tags": ["海滨", "温暖", "宜居", "安全"], "lat": 22.3, "lng": 113.6, "region": "亚洲"},
]
MEETUPS = [
{"city": "大理", "emoji": "🏯", "date": "2026-07-15", "time": "14:00", "venue": "大理古城人民路咖啡馆", "address": "大理市大理古城人民路中段", "description": "苍山脚下,洱海边,与大理的慢生活游民们一起喝咖啡、晒太阳、聊人生。", "rsvpCount": 12, "gradientFrom": "#3b82f6", "gradientTo": "#4f46e5", "attendees": [{"name": "林晓", "photo": "https://i.pravatar.cc/150?img=1"}, {"name": "张明", "photo": "https://i.pravatar.cc/150?img=2"}], "isUpcoming": True},
{"city": "成都", "emoji": "🐼", "date": "2026-07-18", "time": "19:00", "venue": "方所书店", "address": "成都市锦江区中纱帽街8号远洋太古里", "description": "天府之国游民聚会,在文艺书店里品茶聊天,探讨成都的慢生活与远程工作可能性。", "rsvpCount": 9, "gradientFrom": "#22c55e", "gradientTo": "#10b981", "attendees": [{"name": "杨帆", "photo": "https://i.pravatar.cc/150?img=6"}], "isUpcoming": True},
{"city": "深圳", "emoji": "🌃", "date": "2026-07-20", "time": "19:30", "venue": "WeWork 卓越前海壹号", "address": "深圳市南山区前海深港合作区卓越前海壹号", "description": "深圳数字游民线下见面会,探讨创业、远程工作与湾区发展机遇。", "rsvpCount": 15, "gradientFrom": "#ff4d4f", "gradientTo": "#ff7a45", "attendees": [{"name": "李娜", "photo": "https://i.pravatar.cc/150?img=10"}], "isUpcoming": True},
{"city": "杭州", "emoji": "", "date": "2026-05-25", "time": "18:00", "venue": "梦想小镇·良仓咖啡", "address": "杭州市余杭区梦想小镇互联网村", "description": "西湖畔数字游民聚会,交流产品与运营经验。", "rsvpCount": 11, "gradientFrom": "#06b6d4", "gradientTo": "#0d9488", "attendees": [], "isUpcoming": False},
]
DISCUSSIONS = [
{"title": "大理最佳共享办公空间推荐 Top 10", "author": "林晓", "city": "大理", "tags": ["共享办公", "大理"], "replies": 24, "views": 2340, "excerpt": "整理了古城和洱海周边几家适合长期办公的地方。"},
{"title": "2026 年数字游民友好城市排名", "author": "NomadCNA", "city": "上海", "tags": ["城市", "报告"], "replies": 18, "views": 1890, "excerpt": "从成本、网络、社区和气候四个维度重新排名。"},
{"title": "远程工作者的税务规划指南", "author": "李老师", "city": "深圳", "tags": ["税务", "远程工作"], "replies": 12, "views": 1560, "excerpt": "基础概念、常见误区和需要咨询专业人士的节点。"},
]
GIGS = [
{"title": "整理大理共享办公空间清单", "category": "内容", "budget": 500, "location": "远程", "description": "收集 20 个空间的价格、地址、网络和照片。", "status": "open"},
{"title": "设计数字游民城市评分图标", "category": "设计", "budget": 800, "location": "远程", "description": "为成本、网速、安全、社区氛围设计一组图标。", "status": "open"},
{"title": "深圳线下聚会摄影", "category": "活动", "budget": 1200, "location": "深圳", "description": "拍摄 2 小时活动现场并交付精选照片。", "status": "open"},
]
PROFILES = [
{"name": "林晓雨", "age": 28, "location": "大理", "tags": ["本科学历", "远程工作者", "数字游民", "咖啡爱好者"], "bio": "数字游民三年,目前在云南大理远程做产品设计。喜欢爬山、摄影,周末常去洱海边发呆。", "photo": "https://i.pravatar.cc/150?img=1"},
{"name": "陈浩然", "age": 32, "location": "成都", "tags": ["硕士学历", "独立开发者", "自由职业者", "素食主义"], "bio": "在成都住了两年,做独立开发。喜欢冲浪和冥想,寻找志同道合的旅伴一起探索世界。", "photo": "https://i.pravatar.cc/150?img=3"},
{"name": "王思琪", "age": 26, "location": "深圳", "tags": ["本科学历", "内容创作者", "数字游民", "环保主义者"], "bio": "自由撰稿人,在深圳写写画画。热爱瑜伽和冥想,相信慢生活才是真正的奢侈。", "photo": "https://i.pravatar.cc/150?img=5"},
]
CONTENT_ITEMS = [
{
"slug": "nomad-china-playbook",
"type": "ebook",
"title": "《中国数字游民落地手册》",
"titleEn": "China Digital Nomad Playbook",
"subtitle": "从选城、预算、租房到社群融入的一本实操指南",
"subtitleEn": "A practical guide for choosing cities, budgeting, housing, and community.",
"description": "这本电子书把城市决策拆成 7 个步骤:预算、气候、网络、工作空间、社群、住宿和长期身份。每一章都关联本平台真实城市数据,后续可根据你的收藏城市自动生成个性化版本。",
"descriptionEn": "A seven-step playbook connected to live city data: budget, climate, internet, workspace, community, housing, and long-stay planning.",
"coverImage": "https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=1200",
"mediaUrl": "http://127.0.0.1:8000/api/downloads/nomad-china-playbook.pdf",
"targetUrl": "/ebooks/nomad-china-playbook",
"ctaLabel": "查看电子书",
"ctaLabelEn": "View ebook",
"citySlugs": ["dali", "chengdu", "shenzhen", "hangzhou"],
"relatedProfiles": ["林晓雨", "陈浩然"],
"chapters": [
{"title": "如何判断一座城市是否适合远程工作", "minutes": 8},
{"title": "月预算拆解:房租、办公、交通、社交", "minutes": 10},
{"title": "30 天落地清单:从住宿到本地社群", "minutes": 12},
],
"durationMinutes": 42,
"sortOrder": 1,
"status": "published",
},
{
"slug": "lin-dali-documentary",
"type": "video",
"title": "林晓雨:在大理远程做产品设计的一天",
"titleEn": "Lin Xiaoyu: A remote product designer day in Dali",
"subtitle": "个人访谈 / 现实纪录片 · 大理",
"subtitleEn": "Interview documentary · Dali",
"description": "她把工作日切成晨间深度工作、午后咖啡馆协作和傍晚洱海散步。视频关联大理城市详情、共享办公和本地活动。",
"descriptionEn": "A day split into deep work, cafe collaboration, and an Erhai walk.",
"coverImage": "https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?w=1200",
"mediaUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"targetUrl": "/videos/lin-dali-documentary",
"ctaLabel": "观看访谈",
"ctaLabelEn": "Watch",
"citySlugs": ["dali"],
"relatedProfiles": ["林晓雨"],
"chapters": [
{"title": "为什么离开一线城市", "time": "00:00"},
{"title": "远程团队如何协作", "time": "03:20"},
{"title": "大理生活成本复盘", "time": "07:45"},
],
"durationMinutes": 12,
"sortOrder": 2,
"status": "published",
},
{
"slug": "nomadcna-app",
"type": "app",
"title": "NomadCNA App",
"titleEn": "NomadCNA App",
"subtitle": "记录旅居路线、发现同城活动、保存城市清单",
"subtitleEn": "Track routes, discover local meetups, and save city lists.",
"description": "App 落地页提供 Windows/Android/iOS 下载入口。本地 MVP 先提供模拟下载和功能预览,后续可接真实安装包、版本更新和用户设备同步。",
"descriptionEn": "The app landing page provides downloads and feature previews.",
"coverImage": "https://images.unsplash.com/photo-1516321318423-f06f85e504b3?w=1200",
"mediaUrl": "http://127.0.0.1:8000/api/downloads/nomadcna-app-demo.zip",
"targetUrl": "/app",
"ctaLabel": "下载 App",
"ctaLabelEn": "Download app",
"citySlugs": ["dali", "chengdu", "shenzhen", "hangzhou", "xiamen"],
"relatedProfiles": ["林晓雨", "陈浩然", "王思琪"],
"chapters": [
{"title": "旅居路线追踪", "icon": "🧭"},
{"title": "同城活动提醒", "icon": "🍹"},
{"title": "城市收藏和对比", "icon": ""},
],
"durationMinutes": 0,
"sortOrder": 3,
"status": "published",
},
{
"slug": "digital-nomad-guide",
"type": "guide",
"title": "数字游民指南",
"titleEn": "Digital Nomad Guide",
"subtitle": "完整方法论、工具、案例和长期更新",
"subtitleEn": "Methods, tools, cases, and long-term updates.",
"description": "跳转到 digital.hackrobot.cn 的数字游民专题站。当前站内城市、访谈、App 与专题指南互相导流。",
"descriptionEn": "External guide site connected with city pages, interviews, and the app.",
"coverImage": "https://images.unsplash.com/photo-1499750310107-5fef28a66643?w=1200",
"mediaUrl": "",
"targetUrl": "https://digital.hackrobot.cn/zh",
"ctaLabel": "打开指南",
"ctaLabelEn": "Open guide",
"citySlugs": ["dali", "chengdu", "shenzhen"],
"relatedProfiles": [],
"chapters": [
{"title": "远程工作基础设施", "minutes": 6},
{"title": "如何设计你的第一条旅居路线", "minutes": 9},
{"title": "如何避免孤独和信息差", "minutes": 7},
],
"durationMinutes": 22,
"sortOrder": 4,
"status": "published",
},
]
def _city_detail(city: dict, index: int) -> dict:
slug = city["slug"]
name = city["name"]
cost = int(city["costPerMonth"])
cowork = max(600, round(cost * 0.18))
rent = max(1200, round(cost * 0.42))
food = max(900, round(cost * 0.26))
transport = max(200, round(cost * 0.08))
leisure = max(300, cost - rent - food - cowork - transport)
return {
"citySlug": slug,
"guide": {
"summary": f"{name}适合想把远程工作和生活质量同时拉高的人。建议先用 2-4 周短住验证网络、社群和生活节奏,再决定是否长期停留。",
"bestFor": city.get("tags", [])[:4],
"workSetup": f"建议选择靠近核心生活区的住处,搭配 1 个固定共享办公点和 2 个备用咖啡馆。当前网速参考值为 {city['internetSpeed']} Mbps。",
"arrivalChecklist": ["确认 4G/5G 覆盖", "预约第一周住宿", "加入本地社群", "收藏 2 个办公点", "报名一场线下活动"],
"linkedContent": ["nomad-china-playbook", "digital-nomad-guide"],
},
"pros": {
"pros": [
f"月均生活成本约 ¥{cost:,},适合控制预算。",
f"当前估算有 {city['nomadsNow']} 位游民活跃,容易找到同频伙伴。",
f"城市标签覆盖:{''.join(city.get('tags', [])[:5])}",
],
"cons": [
"热门区域旺季住宿价格波动较大。",
"长期停留前仍需实测具体住处网络。",
"社交圈集中,需要主动参加活动融入。",
],
},
"reviews": {
"rating": city["overallScore"],
"items": [
{"author": "林晓雨", "role": "产品设计师", "text": f"{name}最适合有稳定远程收入的人,白天专注工作,晚上参加小规模聚会。", "score": 5},
{"author": "陈浩然", "role": "独立开发者", "text": "如果你需要高强度商务会面,建议先看交通和航班;如果是深度工作,这里很舒服。", "score": 4},
{"author": "王思琪", "role": "内容创作者", "text": "生活素材很多,但要避免把旅行感当成生产力,最好保持固定作息。", "score": 4},
],
},
"cost": {
"monthlyTotal": cost,
"currency": "CNY",
"breakdown": [
{"label": "住宿", "amount": rent},
{"label": "餐饮", "amount": food},
{"label": "共享办公", "amount": cowork},
{"label": "交通", "amount": transport},
{"label": "社交/休闲", "amount": leisure},
],
"tip": "预算表与城市卡片成本字段关联,后续可根据用户消费记录自动校准。",
},
"people": {
"nomadsNow": city["nomadsNow"],
"personas": [
{"name": "远程全职", "percent": 36},
{"name": "自由职业", "percent": 28},
{"name": "独立开发者", "percent": 18},
{"name": "内容创作者", "percent": 18},
],
"featuredProfiles": ["林晓雨", "陈浩然", "王思琪"] if index < 6 else ["陈浩然", "王思琪"],
},
"chat": {
"channels": [
{"name": f"{name}落地互助群", "members": min(999, city["nomadsNow"]), "status": "open"},
{"name": f"{name}共享办公情报", "members": round(city["nomadsNow"] * 0.42), "status": "open"},
{"name": "周末活动约局", "members": round(city["nomadsNow"] * 0.28), "status": "members"},
],
"latestTopics": ["本周线下咖啡局", "哪里适合视频会议", "短租避坑清单"],
},
"photos": {
"items": [
city.get("coverImage") or "https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?w=1200",
"https://images.unsplash.com/photo-1497366754035-f200968a6e72?w=1200",
"https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?w=1200",
]
},
"weather": {
"temperature": city["temperature"],
"humidity": city["humidity"],
"bestMonths": ["3月", "4月", "10月", "11月"],
"note": f"当前气候估算适合中长期试住,体感温度需结合季节和住宿条件判断。",
},
"trends": {
"growth": [
{"month": "1月", "value": max(50, city["nomadsNow"] - 160)},
{"month": "2月", "value": max(70, city["nomadsNow"] - 120)},
{"month": "3月", "value": max(90, city["nomadsNow"] - 80)},
{"month": "4月", "value": max(120, city["nomadsNow"] - 40)},
{"month": "5月", "value": city["nomadsNow"]},
],
"insight": f"{name}的社群热度正在上升,新增用户主要来自远程全职和自由职业人群。",
},
"demographics": {
"age": [
{"label": "22-27", "value": 24},
{"label": "28-34", "value": 46},
{"label": "35-44", "value": 22},
{"label": "45+", "value": 8},
],
"work": [
{"label": "技术/产品", "value": 34},
{"label": "内容/设计", "value": 26},
{"label": "运营/市场", "value": 18},
{"label": "创业/自由职业", "value": 22},
],
},
"relatedContent": ["nomad-china-playbook", "lin-dali-documentary" if slug == "dali" else "digital-nomad-guide", "nomadcna-app"],
}
CITY_DETAILS = [_city_detail(city, idx) for idx, city in enumerate(CITIES)]