-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
213 lines (191 loc) · 10.5 KB
/
Copy pathindex.html
File metadata and controls
213 lines (191 loc) · 10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>全球人脸数据分析大屏</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts/map/js/world.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Courier New', Courier, monospace;
background-color: rgb(16, 12, 42);
color: #e2e8f0;
overflow-x: hidden;
}
.chart-card {
background: rgb(16, 12, 42);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
border: 1px solid rgb(18, 20, 52);
border-radius: 0.75rem;
box-shadow: 0 0 20px rgba(56, 189, 248, 0.1);
display: flex;
flex-direction: column;
transition: all 0.3s ease-in-out;
}
.chart-card:hover {
transform: translateY(-8px);
border-color: rgba(56, 189, 248, 0.4);
box-shadow: 0 10px 30px rgba(56, 189, 248, 0.2);
}
.chart-title {
font-family: 'Roboto', sans-serif;
font-weight: 700;
color: #94a3b8;
padding: 1rem 1rem 0 1rem;
font-size: 1.125rem;
flex-shrink: 0;
text-align: center;
}
.chart-content {
flex-grow: 1;
min-height: 0;
}
.title-font {
font-family: 'Orbitron', sans-serif;
font-weight: 700;
letter-spacing: 2px;
}
</style>
</head>
<body class="p-4">
<div>
<header class="text-center mb-6">
<h1 class="text-4xl md:text-5xl text-sky-400 title-font">全球人群面部特征分析平台</h1>
<p id="current-view-title" class="text-2xl text-amber-400 mt-2">正在加载数据...</p>
</header>
<main class="grid grid-cols-1 lg:grid-cols-4 gap-6 h-[calc(100vh-150px)]">
<div class="lg:col-span-1 flex flex-col gap-6">
<div class="chart-card flex-1">
<h2 class="chart-title">颜值评分分布</h2>
<div id="beauty-score-chart" class="chart-content p-2"></div>
</div>
<div class="chart-card flex-1">
<h2 class="chart-title">脸型分布</h2>
<div id="faceshape-chart" class="chart-content p-2"></div>
</div>
</div>
<div class="lg:col-span-2 chart-card">
<div id="world-map-chart" class="w-full h-full"></div>
</div>
<div class="lg:col-span-1 flex flex-col gap-6">
<div class="chart-card flex-1">
<h2 class="chart-title">五官特征</h2>
<div id="features-chart" class="chart-content p-2"></div>
</div>
<div class="chart-card flex-1">
<h2 class="chart-title">眼镜佩戴比例</h2>
<div id="glasses-chart" class="chart-content p-2"></div>
</div>
</div>
</main>
</div>
<script type="text/javascript">
beautyScoreChart = echarts.init(document.getElementById('beauty-score-chart'), 'dark');
faceshapeChart = echarts.init(document.getElementById('faceshape-chart'), 'dark');
worldMapChart = echarts.init(document.getElementById('world-map-chart'), 'dark');
featuresChart = echarts.init(document.getElementById('features-chart'), 'dark');
glassesChart = echarts.init(document.getElementById('glasses-chart'), 'dark');
currentViewTitle = document.getElementById('current-view-title');
countryToContinent = {
'Afghanistan': 'Asia', 'Angola': 'Africa', 'Albania': 'Europe', 'United Arab Emirates': 'Asia',
'Argentina': 'South America', 'Armenia': 'Asia', 'Australia': 'Oceania', 'Austria': 'Europe',
'Azerbaijan': 'Asia', 'Burundi': 'Africa', 'Belgium': 'Europe', 'Benin': 'Africa',
'Burkina Faso': 'Africa', 'Bangladesh': 'Asia', 'Bulgaria': 'Europe', 'Bosnia and Herz.': 'Europe',
'Belarus': 'Europe', 'Belize': 'North America', 'Bolivia': 'South America', 'Brazil': 'South America',
'Brunei': 'Asia', 'Bhutan': 'Asia', 'Botswana': 'Africa', 'Central African Rep.': 'Africa',
'Canada': 'North America', 'Switzerland': 'Europe', 'Chile': 'South America', 'China': 'Asia',
'Côte d\'Ivoire': 'Africa', 'Cameroon': 'Africa', 'Dem. Rep. Congo': 'Africa', 'Congo': 'Africa',
'Colombia': 'South America', 'Costa Rica': 'North America', 'Cuba': 'North America', 'Czech Rep.': 'Europe',
'Germany': 'Europe', 'Djibouti': 'Africa', 'Denmark': 'Europe', 'Dominican Rep.': 'North America',
'Algeria': 'Africa', 'Ecuador': 'South America', 'Egypt': 'Africa', 'Eritrea': 'Africa',
'Spain': 'Europe', 'Estonia': 'Europe', 'Ethiopia': 'Africa', 'Finland': 'Europe', 'Fiji': 'Oceania',
'France': 'Europe', 'Gabon': 'Africa', 'United Kingdom': 'Europe', 'Georgia': 'Asia',
'Ghana': 'Africa', 'Guinea': 'Africa', 'Gambia': 'Africa', 'Guinea-Bissau': 'Africa',
'Eq. Guinea': 'Africa', 'Greece': 'Europe', 'Greenland': 'North America', 'Guatemala': 'North America',
'Guyana': 'South America', 'Honduras': 'North America', 'Croatia': 'Europe', 'Haiti': 'North America',
'Hungary': 'Europe', 'Indonesia': 'Asia', 'India': 'Asia', 'Ireland': 'Europe', 'Iran': 'Asia',
'Iraq': 'Asia', 'Iceland': 'Europe', 'Israel': 'Asia', 'Italy': 'Europe', 'Jamaica': 'North America',
'Jordan': 'Asia', 'Japan': 'Asia', 'Kazakhstan': 'Asia', 'Kenya': 'Africa', 'Kyrgyzstan': 'Asia',
'Cambodia': 'Asia', 'Korea': 'Asia', 'Kuwait': 'Asia', 'Lao PDR': 'Asia', 'Lebanon': 'Asia',
'Liberia': 'Africa', 'Libya': 'Africa', 'Sri Lanka': 'Asia', 'Lesotho': 'Africa', 'Lithuania': 'Europe',
'Luxembourg': 'Europe', 'Latvia': 'Europe', 'Morocco': 'Africa', 'Moldova': 'Europe', 'Madagascar': 'Africa',
'Mexico': 'North America', 'Macedonia': 'Europe', 'Mali': 'Africa', 'Myanmar': 'Asia', 'Montenegro': 'Europe',
'Mongolia': 'Asia', 'Mozambique': 'Africa', 'Mauritania': 'Africa', 'Malawi': 'Africa', 'Malaysia': 'Asia',
'Namibia': 'Africa', 'Niger': 'Africa', 'Nigeria': 'Africa', 'Nicaragua': 'North America',
'Netherlands': 'Europe', 'Norway': 'Europe', 'Nepal': 'Asia', 'New Zealand': 'Oceania', 'Oman': 'Asia',
'Pakistan': 'Asia', 'Panama': 'North America', 'Peru': 'South America', 'Philippines': 'Asia',
'Papua New Guinea': 'Oceania', 'Poland': 'Europe', 'Puerto Rico': 'North America', 'Dem. Rep. Korea': 'Asia',
'Portugal': 'Europe', 'Paraguay': 'South America', 'Qatar': 'Asia', 'Romania': 'Europe',
'Russia': 'Europe', 'Rwanda': 'Africa', 'W. Sahara': 'Africa', 'Saudi Arabia': 'Asia',
'Sudan': 'Africa', 'S. Sudan': 'Africa', 'Senegal': 'Africa', 'Sierra Leone': 'Africa',
'El Salvador': 'North America', 'Somaliland': 'Africa', 'Somalia': 'Africa', 'Serbia': 'Europe',
'Suriname': 'South America', 'Slovakia': 'Europe', 'Slovenia': 'Europe', 'Sweden': 'Europe',
'Swaziland': 'Africa', 'Syria': 'Asia', 'Chad': 'Africa', 'Togo': 'Africa', 'Thailand': 'Asia',
'Tajikistan': 'Asia', 'Turkmenistan': 'Asia', 'Timor-Leste': 'Asia', 'Trinidad and Tobago': 'North America',
'Tunisia': 'Africa', 'Turkey': 'Asia', 'Tanzania': 'Africa', 'Uganda': 'Africa', 'Ukraine': 'Europe',
'Uruguay': 'South America', 'United States': 'North America', 'Uzbekistan': 'Asia',
'Venezuela': 'South America', 'Vietnam': 'Asia', 'Vanuatu': 'Oceania', 'Yemen': 'Asia',
'South Africa': 'Africa', 'Zambia': 'Africa', 'Zimbabwe': 'Africa'
};
let currentContinent = 'Global';
function update(data) {
const optionConfig = { notMerge: true };
beautyScoreChart.setOption(JSON.parse(data.beautyScoreOptions || '{}'), optionConfig);
faceshapeChart.setOption(JSON.parse(data.faceshapeOptions || '{}'), optionConfig);
featuresChart.setOption(JSON.parse(data.featuresOptions || '{}'), optionConfig);
glassesChart.setOption(JSON.parse(data.glassesOptions || '{}'), optionConfig);
currentViewTitle.innerText = `当前视图:${data.viewName}`;
}
async function Init() {
try {
const res = await fetch('/api/data/Global');
if (!res.ok) {
throw new Error("网络错误,状态码:" + res.status);
}
const data = await res.json();
worldMapChart.setOption(JSON.parse(data.worldMapOptions || '{}'));
update(data);
} catch (error) {
console.error("初始化失败:", error);
currentViewTitle.innerText = "初始化失败,请刷新页面再试";
}
}
worldMapChart.on('click', async function (params) {
const countryName = params.name;
if (!countryName) return;
const continent = countryToContinent[countryName];
if (!continent) {
console.log("未知国家:" + countryName);
return;
}
if (currentContinent === continent) {
console.log("当前已是 " + continent + " 视图");
return;
}
currentContinent = continent;
try {
const res = await fetch(`/api/data/${continent}`);
if (!res.ok) {
throw new Error("网络错误,状态码:" + res.status);
}
const data = await res.json();
update(data);
} catch (error) {
console.error("获取数据失败:", error);
}
});
Init();
window.addEventListener('resize', () => {
beautyScoreChart.resize();
faceshapeChart.resize();
worldMapChart.resize();
featuresChart.resize();
glassesChart.resize();
});
</script>
</body>
</html>