533 lines
36 KiB
Python
533 lines
36 KiB
Python
from __future__ import annotations
|
||
|
||
from .avatar_assets import avatar_for_index
|
||
from .cities_extra import CITIES_EXTRA
|
||
|
||
|
||
CITIES_BASE = [
|
||
{
|
||
"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": "亚洲"},
|
||
]
|
||
|
||
CITIES = [*CITIES_BASE, *CITIES_EXTRA]
|
||
|
||
|
||
MEETUPS = [
|
||
{
|
||
"city": "线上",
|
||
"emoji": "🎙️",
|
||
"date": "2026-06-08",
|
||
"time": "19:00",
|
||
"venue": "NomadCNA 线上圆桌 · 2026-06-08",
|
||
"address": "视频会议 + Web 群聊 · 社区账户直通",
|
||
"description": "今晚 19:00 线上圆桌:远程工作节奏、旅居城市选择与社区协作。登录后你的社区昵称会自动带入视频房,群聊同步进入活动频道。",
|
||
"rsvpCount": 42,
|
||
"gradientFrom": "#ff4d4f",
|
||
"gradientTo": "#7c3aed",
|
||
"attendees": [{"name": "林晓", "photo": avatar_for_index(0)}, {"name": "张明", "photo": avatar_for_index(4)}, {"name": "陈静", "photo": avatar_for_index(2)}],
|
||
"isUpcoming": True,
|
||
"mode": "online",
|
||
"maxAttendees": 120,
|
||
"organizer": "NomadCNA",
|
||
"accessLevel": "public",
|
||
"meetingProvider": "mirotalk",
|
||
"mirotalkRoom": "nomadcna-20260608-online-roundtable",
|
||
"loungeChannel": "#nomadcna-20260608",
|
||
"meetingUrl": "",
|
||
"replayUrl": "",
|
||
"features": ["group_video", "screen_share", "whiteboard", "host_controls"],
|
||
},
|
||
{"city": "线上", "emoji": "💻", "date": "2026-07-09", "time": "20:00", "venue": "MiroTalk 多人视频房", "address": "线上活动", "description": "围绕远程工作的节奏、异地协作和旅居规划做一场开放圆桌。", "rsvpCount": 36, "gradientFrom": "#0f766e", "gradientTo": "#2563eb", "attendees": [{"name": "林晓", "photo": avatar_for_index(0)}, {"name": "张明", "photo": avatar_for_index(4)}], "isUpcoming": True, "mode": "online", "maxAttendees": 80, "organizer": "NomadCNA", "accessLevel": "members", "meetingProvider": "mirotalk", "mirotalkRoom": "nomadcna-remote-work-open-office", "loungeChannel": "#online-events", "meetingUrl": "", "replayUrl": "", "features": ["group_video", "screen_share", "whiteboard", "host_controls"]},
|
||
{"city": "大理", "emoji": "🏯", "date": "2026-07-15", "time": "14:00", "venue": "大理古城人民路咖啡馆", "address": "大理市大理古城人民路中段", "description": "苍山脚下,洱海边,与大理的慢生活游民们一起喝咖啡、晒太阳、聊人生。", "rsvpCount": 12, "gradientFrom": "#3b82f6", "gradientTo": "#4f46e5", "attendees": [{"name": "林晓", "photo": avatar_for_index(2)}, {"name": "张明", "photo": avatar_for_index(0)}], "isUpcoming": True, "mode": "hybrid", "maxAttendees": 32, "organizer": "大理城市主理人", "accessLevel": "vip", "meetingProvider": "mirotalk", "mirotalkRoom": "nomadcna-dali-slow-life-roundtable", "meetingUrl": "", "replayUrl": "", "features": ["group_video", "screen_share", "whiteboard", "recording", "host_controls"]},
|
||
{"city": "成都", "emoji": "🐼", "date": "2026-07-18", "time": "19:00", "venue": "方所书店", "address": "成都市锦江区中纱帽街8号远洋太古里", "description": "天府之国游民聚会,在文艺书店里品茶聊天,探讨成都的慢生活与远程工作可能性。", "rsvpCount": 9, "gradientFrom": "#22c55e", "gradientTo": "#10b981", "attendees": [{"name": "杨帆", "photo": avatar_for_index(28)}], "isUpcoming": True, "mode": "offline", "maxAttendees": 20, "organizer": "成都游民小组", "accessLevel": "public", "meetingProvider": "", "mirotalkRoom": "", "meetingUrl": "", "replayUrl": "", "features": []},
|
||
{"city": "深圳", "emoji": "🌃", "date": "2026-07-20", "time": "19:30", "venue": "WeWork 卓越前海壹号", "address": "深圳市南山区前海深港合作区卓越前海壹号", "description": "深圳数字游民线下见面会,探讨创业、远程工作与湾区发展机遇。", "rsvpCount": 15, "gradientFrom": "#ff4d4f", "gradientTo": "#ff7a45", "attendees": [{"name": "李娜", "photo": avatar_for_index(12)}], "isUpcoming": True, "mode": "hybrid", "maxAttendees": 48, "organizer": "深圳湾区主理人", "accessLevel": "members", "meetingProvider": "mirotalk", "mirotalkRoom": "nomadcna-shenzhen-maker-night", "meetingUrl": "", "replayUrl": "", "features": ["group_video", "screen_share", "breakout", "host_controls"]},
|
||
{"city": "杭州", "emoji": "⛲", "date": "2026-05-25", "time": "18:00", "venue": "梦想小镇·良仓咖啡", "address": "杭州市余杭区梦想小镇互联网村", "description": "西湖畔数字游民聚会,交流产品与运营经验。", "rsvpCount": 11, "gradientFrom": "#06b6d4", "gradientTo": "#0d9488", "attendees": [], "isUpcoming": False, "mode": "offline", "maxAttendees": 24, "organizer": "杭州产品游民", "accessLevel": "public", "meetingProvider": "", "mirotalkRoom": "", "meetingUrl": "", "replayUrl": "", "features": []},
|
||
]
|
||
|
||
|
||
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": "大理",
|
||
"citySlug": "dali",
|
||
"gender": "女",
|
||
"single": "单身",
|
||
"lookingFor": ["friends", "dating", "explore"],
|
||
"tags": ["本科学历", "远程工作者", "数字游民", "咖啡爱好者"],
|
||
"bio": "数字游民三年,目前在云南大理远程做产品设计。喜欢爬山、摄影,周末常去洱海边发呆。",
|
||
"photo": avatar_for_index(0),
|
||
},
|
||
{
|
||
"name": "陈浩然",
|
||
"age": 32,
|
||
"location": "成都",
|
||
"citySlug": "chengdu",
|
||
"gender": "男",
|
||
"single": "单身",
|
||
"lookingFor": ["friends", "partner", "cofounder"],
|
||
"tags": ["硕士学历", "独立开发者", "自由职业者", "素食主义"],
|
||
"bio": "在成都住了两年,做独立开发。喜欢冲浪和冥想,寻找志同道合的旅伴一起探索世界。",
|
||
"photo": avatar_for_index(2),
|
||
},
|
||
{
|
||
"name": "王思琪",
|
||
"age": 26,
|
||
"location": "深圳",
|
||
"citySlug": "shenzhen",
|
||
"gender": "女",
|
||
"single": "单身",
|
||
"lookingFor": ["dating", "roommate", "explore"],
|
||
"tags": ["本科学历", "内容创作者", "数字游民", "环保主义者"],
|
||
"bio": "自由撰稿人,在深圳写写画画。热爱瑜伽和冥想,相信慢生活才是真正的奢侈。",
|
||
"photo": avatar_for_index(4),
|
||
},
|
||
]
|
||
|
||
|
||
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": "/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": "chen-chengdu-dev",
|
||
"type": "video",
|
||
"title": "陈浩然:在成都做独立开发的真实节奏",
|
||
"titleEn": "Chen Haoran: indie dev life in Chengdu",
|
||
"subtitle": "个人访谈 · 成都",
|
||
"subtitleEn": "Interview · Chengdu",
|
||
"description": "从大厂离职到独立开发,他如何在成都维持稳定收入、社群连接和可持续的创作节奏。",
|
||
"descriptionEn": "From big tech to indie dev — income, community, and creative rhythm in Chengdu.",
|
||
"coverImage": "https://images.unsplash.com/photo-1547981609-4b6bfe67ca0b?w=1200",
|
||
"mediaUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
|
||
"targetUrl": "/videos/chen-chengdu-dev",
|
||
"ctaLabel": "观看访谈",
|
||
"ctaLabelEn": "Watch",
|
||
"citySlugs": ["chengdu"],
|
||
"relatedProfiles": ["陈浩然"],
|
||
"chapters": [
|
||
{"title": "为什么选成都", "time": "00:00"},
|
||
{"title": "独立开发的客户从哪来", "time": "04:10"},
|
||
],
|
||
"durationMinutes": 14,
|
||
"sortOrder": 3,
|
||
"status": "published",
|
||
},
|
||
{
|
||
"slug": "wang-shenzhen-creator",
|
||
"type": "video",
|
||
"title": "王思琪:深圳远程撰稿人的一天",
|
||
"titleEn": "Wang Siqi: a remote writer day in Shenzhen",
|
||
"subtitle": "个人访谈 · 深圳",
|
||
"subtitleEn": "Interview · Shenzhen",
|
||
"description": "她在深圳兼顾内容创作与远程协作,分享如何平衡输出、生活成本和城市探索。",
|
||
"descriptionEn": "Balancing content creation, remote work, and city exploration in Shenzhen.",
|
||
"coverImage": "https://images.unsplash.com/photo-1518837695005-2083093ee35b?w=1200",
|
||
"mediaUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
|
||
"targetUrl": "/videos/wang-shenzhen-creator",
|
||
"ctaLabel": "观看访谈",
|
||
"ctaLabelEn": "Watch",
|
||
"citySlugs": ["shenzhen"],
|
||
"relatedProfiles": ["王思琪"],
|
||
"chapters": [
|
||
{"title": "早晨写作仪式", "time": "00:00"},
|
||
{"title": "深圳租房与办公点", "time": "05:30"},
|
||
],
|
||
"durationMinutes": 11,
|
||
"sortOrder": 4,
|
||
"status": "published",
|
||
},
|
||
{
|
||
"slug": "zhang-hangzhou-startup",
|
||
"type": "video",
|
||
"title": "张明远:在杭州远程创业的一周",
|
||
"titleEn": "Zhang Mingyuan: remote startup week in Hangzhou",
|
||
"subtitle": "个人访谈 · 杭州",
|
||
"subtitleEn": "Interview · Hangzhou",
|
||
"description": "远程团队协作工具创业者,记录他在西湖边如何开会、写代码、见投资人。",
|
||
"descriptionEn": "Building a remote team tool while living and working around West Lake.",
|
||
"coverImage": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200",
|
||
"mediaUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
|
||
"targetUrl": "/videos/zhang-hangzhou-startup",
|
||
"ctaLabel": "观看访谈",
|
||
"ctaLabelEn": "Watch",
|
||
"citySlugs": ["hangzhou"],
|
||
"relatedProfiles": ["张明远"],
|
||
"chapters": [
|
||
{"title": "杭州为什么适合创业", "time": "00:00"},
|
||
{"title": "远程团队的日常站会", "time": "06:00"},
|
||
],
|
||
"durationMinutes": 16,
|
||
"sortOrder": 5,
|
||
"status": "published",
|
||
},
|
||
{
|
||
"slug": "li-xiamen-design",
|
||
"type": "video",
|
||
"title": "李雅婷:在厦门做远程 UI 设计",
|
||
"titleEn": "Li Yating: remote UI design from Xiamen",
|
||
"subtitle": "个人访谈 · 厦门",
|
||
"subtitleEn": "Interview · Xiamen",
|
||
"description": "闽南美食、海边散步和远程设计工作如何在她生活里共存。",
|
||
"descriptionEn": "Food, coast walks, and remote UI design in daily life.",
|
||
"coverImage": "https://images.unsplash.com/photo-1590559899731-a382839e5549?w=1200",
|
||
"mediaUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
|
||
"targetUrl": "/videos/li-xiamen-design",
|
||
"ctaLabel": "观看访谈",
|
||
"ctaLabelEn": "Watch",
|
||
"citySlugs": ["xiamen"],
|
||
"relatedProfiles": ["李雅婷"],
|
||
"chapters": [
|
||
{"title": "客户沟通时区", "time": "00:00"},
|
||
{"title": "厦门生活成本", "time": "04:40"},
|
||
],
|
||
"durationMinutes": 10,
|
||
"sortOrder": 6,
|
||
"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": "/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": 7,
|
||
"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": 8,
|
||
"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)]
|