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)]