elykia 1.0.27 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/countdown.js +173 -192
- package/blog/welcome.js +135 -187
- package/package.json +1 -1
package/blog/countdown.js
CHANGED
|
@@ -1,201 +1,182 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
1
|
+
const elykiaCountdown = {
|
|
2
|
+
// 配置
|
|
3
|
+
config: {
|
|
4
|
+
targetDate: "2025-12-20",
|
|
5
|
+
targetName: "考研",
|
|
6
|
+
units: {
|
|
7
|
+
day: { text: "今日", unit: "小时" },
|
|
8
|
+
week: { text: "本周", unit: "天" },
|
|
9
|
+
month: { text: "本月", unit: "天" },
|
|
10
|
+
year: { text: "本年", unit: "天" }
|
|
11
|
+
}
|
|
12
|
+
},
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
14
|
+
// 计算器
|
|
15
|
+
calculators: {
|
|
16
|
+
day: () => {
|
|
17
|
+
const hours = new Date().getHours();
|
|
18
|
+
return { remaining: 24 - hours, percentage: (hours / 24) * 100 };
|
|
19
|
+
},
|
|
20
|
+
week: () => {
|
|
21
|
+
const day = new Date().getDay();
|
|
22
|
+
const passed = day === 0 ? 6 : day - 1;
|
|
23
|
+
return { remaining: 6 - passed, percentage: ((passed + 1) / 7) * 100 };
|
|
24
|
+
},
|
|
25
|
+
month: () => {
|
|
26
|
+
const now = new Date();
|
|
27
|
+
const total = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
|
|
28
|
+
const passed = now.getDate();
|
|
29
|
+
return { remaining: total - passed, percentage: (passed / total) * 100 };
|
|
30
|
+
},
|
|
31
|
+
year: () => {
|
|
32
|
+
const now = new Date();
|
|
33
|
+
const start = new Date(now.getFullYear(), 0, 1);
|
|
34
|
+
const total = 365 + (now.getFullYear() % 4 === 0 ? 1 : 0);
|
|
35
|
+
const passed = Math.floor((now - start) / 86400000);
|
|
36
|
+
return { remaining: total - passed, percentage: (passed / total) * 100 };
|
|
37
|
+
}
|
|
38
|
+
},
|
|
30
39
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
end.setMonth(end.getMonth() + 1, 0);
|
|
39
|
-
},
|
|
40
|
-
year: () => {
|
|
41
|
-
start.setMonth(0, 1);
|
|
42
|
-
end.setMonth(11, 31);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
ranges[unit]?.();
|
|
40
|
+
// 入口函数
|
|
41
|
+
setCountdown: () => {
|
|
42
|
+
elykiaCountdown.injectStyles();
|
|
43
|
+
elykiaCountdown.updateCountdown();
|
|
44
|
+
if (elykiaCountdown.timer) clearInterval(elykiaCountdown.timer);
|
|
45
|
+
elykiaCountdown.timer = setInterval(elykiaCountdown.updateCountdown, 600000);
|
|
46
|
+
},
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
// 更新倒计时
|
|
49
|
+
updateCountdown: () => {
|
|
50
|
+
const elements = ['eventName', 'eventDate', 'daysUntil', 'countRight']
|
|
51
|
+
.map(id => document.getElementById(id));
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
name: config.units[unit].text,
|
|
53
|
-
remaining: total - passed,
|
|
54
|
-
percentage: percentage.toFixed(2),
|
|
55
|
-
unit: config.units[unit].unit
|
|
56
|
-
};
|
|
57
|
-
}
|
|
53
|
+
if (elements.some(el => !el)) return;
|
|
58
54
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (elements.some(el => !el)) return;
|
|
64
|
-
|
|
65
|
-
const [eventName, eventDate, daysUntil, countRight] = elements;
|
|
66
|
-
const timeData = Object.keys(config.units).reduce((acc, unit) => ({...acc, [unit]: getTimeUnit(unit)}), {});
|
|
67
|
-
const daysRemaining = Math.round((new Date(config.targetDate) - new Date().setHours(0,0,0,0)) / 86400000);
|
|
55
|
+
const [eventName, eventDate, daysUntil, countRight] = elements;
|
|
56
|
+
const config = elykiaCountdown.config;
|
|
57
|
+
const daysRemaining = Math.round((new Date(config.targetDate) - new Date().setHours(0, 0, 0, 0)) / 86400000);
|
|
68
58
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
countRight.innerHTML = Object.entries(timeData)
|
|
73
|
-
.map(([_, item]) => `
|
|
74
|
-
<div class="cd-count-item">
|
|
75
|
-
<div class="cd-item-name">${item.name}</div>
|
|
76
|
-
<div class="cd-item-progress">
|
|
77
|
-
<div class="cd-progress-bar" style="width: ${item.percentage}%; opacity: ${item.percentage/100}"></div>
|
|
78
|
-
<span class="cd-percentage ${item.percentage >= 46 ? 'cd-many' : ''}">${item.percentage}%</span>
|
|
79
|
-
<span class="cd-remaining ${item.percentage >= 60 ? 'cd-many' : ''}">
|
|
80
|
-
<span class="cd-tip">还剩</span>${item.remaining}<span class="cd-tip">${item.unit}</span>
|
|
81
|
-
</span>
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
84
|
-
`).join('');
|
|
85
|
-
}
|
|
59
|
+
eventName.textContent = config.targetName;
|
|
60
|
+
eventDate.textContent = config.targetDate;
|
|
61
|
+
daysUntil.textContent = daysRemaining;
|
|
86
62
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
.cd-count-left .cd-name {
|
|
105
|
-
font-weight: bold;
|
|
106
|
-
font-size: 18px;
|
|
107
|
-
}
|
|
108
|
-
.cd-count-left .cd-time {
|
|
109
|
-
font-size: 30px;
|
|
110
|
-
font-weight: bold;
|
|
111
|
-
color: var(--anzhiyu-main);
|
|
112
|
-
}
|
|
113
|
-
.cd-count-left .cd-date {
|
|
114
|
-
font-size: 12px;
|
|
115
|
-
opacity: 0.6;
|
|
116
|
-
}
|
|
117
|
-
.cd-count-left::after {
|
|
118
|
-
content: "";
|
|
119
|
-
position: absolute;
|
|
120
|
-
right: -0.8rem;
|
|
121
|
-
width: 2px;
|
|
122
|
-
height: 80%;
|
|
123
|
-
background-color: var(--anzhiyu-main);
|
|
124
|
-
opacity: 0.5;
|
|
125
|
-
}
|
|
126
|
-
.cd-count-right {
|
|
127
|
-
flex: 1;
|
|
128
|
-
margin-left: .8rem;
|
|
129
|
-
display: flex;
|
|
130
|
-
flex-direction: column;
|
|
131
|
-
justify-content: space-between;
|
|
132
|
-
}
|
|
133
|
-
.cd-count-item {
|
|
134
|
-
display: flex;
|
|
135
|
-
flex-direction: row;
|
|
136
|
-
align-items: center;
|
|
137
|
-
height: 24px;
|
|
138
|
-
}
|
|
139
|
-
.cd-item-name {
|
|
140
|
-
font-size: 14px;
|
|
141
|
-
margin-right: 0.8rem;
|
|
142
|
-
white-space: nowrap;
|
|
143
|
-
}
|
|
144
|
-
.cd-item-progress {
|
|
145
|
-
position: relative;
|
|
146
|
-
display: flex;
|
|
147
|
-
flex-direction: row;
|
|
148
|
-
align-items: center;
|
|
149
|
-
justify-content: space-between;
|
|
150
|
-
height: 100%;
|
|
151
|
-
width: 100%;
|
|
152
|
-
border-radius: 8px;
|
|
153
|
-
background-color: var(--anzhiyu-background);
|
|
154
|
-
overflow: hidden;
|
|
155
|
-
}
|
|
156
|
-
.cd-progress-bar {
|
|
157
|
-
height: 100%;
|
|
158
|
-
border-radius: 8px;
|
|
159
|
-
background-color: var(--anzhiyu-main);
|
|
160
|
-
}
|
|
161
|
-
.cd-percentage,
|
|
162
|
-
.cd-remaining {
|
|
163
|
-
position: absolute;
|
|
164
|
-
font-size: 12px;
|
|
165
|
-
margin: 0 6px;
|
|
166
|
-
transition: opacity 0.3s ease-in-out, transform 0.3s ease-in-out;
|
|
167
|
-
}
|
|
168
|
-
.cd-many {
|
|
169
|
-
color: #fff;
|
|
170
|
-
}
|
|
171
|
-
.cd-remaining {
|
|
172
|
-
opacity: 0;
|
|
173
|
-
transform: translateX(10px);
|
|
174
|
-
}
|
|
175
|
-
.card-countdown .item-content:hover .cd-remaining {
|
|
176
|
-
transform: translateX(0);
|
|
177
|
-
opacity: 1;
|
|
178
|
-
}
|
|
179
|
-
.card-countdown .item-content:hover .cd-percentage {
|
|
180
|
-
transform: translateX(-10px);
|
|
181
|
-
opacity: 0;
|
|
182
|
-
}
|
|
183
|
-
`;
|
|
63
|
+
countRight.innerHTML = Object.entries(config.units)
|
|
64
|
+
.map(([key, { text, unit }]) => {
|
|
65
|
+
const { remaining, percentage } = elykiaCountdown.calculators[key]();
|
|
66
|
+
return `
|
|
67
|
+
<div class="cd-count-item">
|
|
68
|
+
<div class="cd-item-name">${text}</div>
|
|
69
|
+
<div class="cd-item-progress">
|
|
70
|
+
<div class="cd-progress-bar" style="width: ${percentage}%; opacity: ${percentage / 100}"></div>
|
|
71
|
+
<span class="cd-percentage ${percentage >= 46 ? 'cd-many' : ''}">${percentage.toFixed(2)}%</span>
|
|
72
|
+
<span class="cd-remaining ${percentage >= 60 ? 'cd-many' : ''}">
|
|
73
|
+
<span class="cd-tip">还剩</span>${remaining}<span class="cd-tip">${unit}</span>
|
|
74
|
+
</span>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
`}).join('');
|
|
78
|
+
}
|
|
79
|
+
};
|
|
184
80
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
81
|
+
// 注入样式(闭包防止重复注入)
|
|
82
|
+
elykiaCountdown.injectStyles = (() => {
|
|
83
|
+
let injected = false;
|
|
84
|
+
return () => {
|
|
85
|
+
if (injected) return;
|
|
86
|
+
injected = true;
|
|
87
|
+
|
|
88
|
+
const styles = `
|
|
89
|
+
.card-countdown .item-content {
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
}
|
|
93
|
+
.cd-count-left {
|
|
94
|
+
position: relative;
|
|
95
|
+
display: flex;
|
|
96
|
+
flex-direction: column;
|
|
97
|
+
margin-right: 0.8rem;
|
|
98
|
+
line-height: 1.5;
|
|
99
|
+
align-items: center;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
}
|
|
102
|
+
.cd-count-left .cd-text { font-size: 14px; }
|
|
103
|
+
.cd-count-left .cd-name { font-weight: bold; font-size: 18px; }
|
|
104
|
+
.cd-count-left .cd-time { font-size: 30px; font-weight: bold; color: var(--anzhiyu-main); }
|
|
105
|
+
.cd-count-left .cd-date { font-size: 12px; opacity: 0.6; }
|
|
106
|
+
.cd-count-left::after {
|
|
107
|
+
content: "";
|
|
108
|
+
position: absolute;
|
|
109
|
+
right: -0.8rem;
|
|
110
|
+
width: 2px;
|
|
111
|
+
height: 80%;
|
|
112
|
+
background-color: var(--anzhiyu-main);
|
|
113
|
+
opacity: 0.5;
|
|
114
|
+
}
|
|
115
|
+
.cd-count-right {
|
|
116
|
+
flex: 1;
|
|
117
|
+
margin-left: .8rem;
|
|
118
|
+
display: flex;
|
|
119
|
+
flex-direction: column;
|
|
120
|
+
gap: 4px;
|
|
121
|
+
}
|
|
122
|
+
.cd-count-item {
|
|
123
|
+
display: flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
height: 24px;
|
|
126
|
+
}
|
|
127
|
+
.cd-item-name {
|
|
128
|
+
font-size: 14px;
|
|
129
|
+
margin-right: 0.8rem;
|
|
130
|
+
white-space: nowrap;
|
|
131
|
+
}
|
|
132
|
+
.cd-item-progress {
|
|
133
|
+
position: relative;
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
justify-content: space-between;
|
|
137
|
+
height: 100%;
|
|
138
|
+
width: 100%;
|
|
139
|
+
border-radius: 8px;
|
|
140
|
+
background-color: var(--anzhiyu-background);
|
|
141
|
+
overflow: hidden;
|
|
142
|
+
}
|
|
143
|
+
.cd-progress-bar {
|
|
144
|
+
height: 100%;
|
|
145
|
+
border-radius: 8px;
|
|
146
|
+
background-color: var(--anzhiyu-main);
|
|
147
|
+
}
|
|
148
|
+
.cd-percentage, .cd-remaining {
|
|
149
|
+
position: absolute;
|
|
150
|
+
font-size: 12px;
|
|
151
|
+
margin: 0 6px;
|
|
152
|
+
transition: opacity 0.3s, transform 0.3s;
|
|
153
|
+
}
|
|
154
|
+
.cd-many { color: #fff; }
|
|
155
|
+
.cd-remaining { opacity: 0; transform: translateX(10px); }
|
|
156
|
+
.card-countdown .item-content:hover .cd-remaining { transform: translateX(0); opacity: 1; }
|
|
157
|
+
.card-countdown .item-content:hover .cd-percentage { transform: translateX(-10px); opacity: 0; }
|
|
158
|
+
`;
|
|
159
|
+
const styleSheet = document.createElement("style");
|
|
160
|
+
styleSheet.textContent = styles;
|
|
161
|
+
document.head.appendChild(styleSheet);
|
|
162
|
+
};
|
|
163
|
+
})();
|
|
164
|
+
|
|
165
|
+
// 页面加载后执行
|
|
166
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
167
|
+
elykiaCountdown.setCountdown();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// 浏览器前进/后退
|
|
171
|
+
window.addEventListener("popstate", () => {
|
|
172
|
+
setTimeout(elykiaCountdown.setCountdown, 100);
|
|
173
|
+
});
|
|
189
174
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
document.addEventListener('pjax:send', () => timer && clearInterval(timer));
|
|
199
|
-
|
|
200
|
-
return { start, stop: () => timer && clearInterval(timer) };
|
|
201
|
-
})();
|
|
175
|
+
// 监听 Vue Router 的 URL 变化
|
|
176
|
+
let elykiaCountdownLastUrl = location.href;
|
|
177
|
+
new MutationObserver(() => {
|
|
178
|
+
if (location.href !== elykiaCountdownLastUrl) {
|
|
179
|
+
elykiaCountdownLastUrl = location.href;
|
|
180
|
+
setTimeout(elykiaCountdown.setCountdown, 100);
|
|
181
|
+
}
|
|
182
|
+
}).observe(document.body, { childList: true, subtree: true });
|
package/blog/welcome.js
CHANGED
|
@@ -1,32 +1,61 @@
|
|
|
1
|
-
const
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
const elykiaWelcome = {
|
|
2
|
+
// 配置
|
|
3
|
+
config: {
|
|
4
|
+
apiUrl: "https://apis.map.qq.com/ws/location/v1/ip?key=TNLBZ-FS2LQ-4X257-4ACX6-OP673-62BFJ&output=jsonp&callback=QQmap",
|
|
5
|
+
baseCoord: { lng: 113.625000, lat: 34.747201 }, // 基准坐标(用于计算距离)
|
|
6
|
+
cacheKey: "welcome-info",
|
|
7
|
+
cacheMinutes: 30
|
|
8
|
+
},
|
|
9
|
+
|
|
10
|
+
// 缓存工具
|
|
11
|
+
cache: {
|
|
12
|
+
get(key) {
|
|
13
|
+
const item = localStorage.getItem(key);
|
|
14
|
+
if (!item) return null;
|
|
15
|
+
const { data, expire } = JSON.parse(item);
|
|
16
|
+
if (Date.now() > expire) {
|
|
17
|
+
localStorage.removeItem(key);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return data;
|
|
21
|
+
},
|
|
22
|
+
set(key, data, minutes) {
|
|
23
|
+
localStorage.setItem(key, JSON.stringify({
|
|
24
|
+
data,
|
|
25
|
+
expire: Date.now() + minutes * 60 * 1000
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
},
|
|
5
29
|
|
|
30
|
+
// 入口函数
|
|
31
|
+
setWelcome: async () => {
|
|
6
32
|
const WelcomeInfo = document.getElementById("welcome-info");
|
|
7
33
|
if (!WelcomeInfo) {
|
|
8
|
-
|
|
9
|
-
setTimeout(elykia.setWelcome_info, 200);
|
|
34
|
+
setTimeout(elykiaWelcome.setWelcome, 200);
|
|
10
35
|
return;
|
|
11
36
|
}
|
|
12
37
|
|
|
13
|
-
|
|
38
|
+
const cached = elykiaWelcome.cache.get(elykiaWelcome.config.cacheKey);
|
|
39
|
+
if (cached) {
|
|
40
|
+
elykiaWelcome.showWelcome(cached);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
14
43
|
|
|
15
44
|
try {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
script.src = url;
|
|
45
|
+
await new Promise((resolve, reject) => {
|
|
46
|
+
const script = document.createElement('script');
|
|
47
|
+
script.src = elykiaWelcome.config.apiUrl;
|
|
20
48
|
|
|
21
49
|
window.QQmap = (data) => {
|
|
50
|
+
document.body.removeChild(script);
|
|
51
|
+
delete window.QQmap;
|
|
22
52
|
if (data.status === 0) {
|
|
23
|
-
|
|
53
|
+
elykiaWelcome.cache.set(elykiaWelcome.config.cacheKey, data, elykiaWelcome.config.cacheMinutes);
|
|
54
|
+
elykiaWelcome.showWelcome(data);
|
|
24
55
|
resolve();
|
|
25
56
|
} else {
|
|
26
57
|
reject(new Error('Failed to fetch location data'));
|
|
27
58
|
}
|
|
28
|
-
document.body.removeChild(script);
|
|
29
|
-
delete window.QQmap;
|
|
30
59
|
};
|
|
31
60
|
document.body.appendChild(script);
|
|
32
61
|
});
|
|
@@ -35,37 +64,34 @@ const elykia = {
|
|
|
35
64
|
}
|
|
36
65
|
},
|
|
37
66
|
|
|
38
|
-
|
|
67
|
+
// 计算两点距离(单位:公里)
|
|
39
68
|
getDistance: (e1, n1, e2, n2) => {
|
|
40
|
-
const R = 6371
|
|
41
|
-
const { sin, cos, asin, PI, hypot } = Math
|
|
42
|
-
|
|
43
|
-
e *= PI / 180
|
|
44
|
-
n *= PI / 180
|
|
45
|
-
return { x: cos(n) * cos(e), y: cos(n) * sin(e), z: sin(n) }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
69
|
+
const R = 6371;
|
|
70
|
+
const { sin, cos, asin, PI, hypot } = Math;
|
|
71
|
+
const getPoint = (e, n) => {
|
|
72
|
+
e *= PI / 180;
|
|
73
|
+
n *= PI / 180;
|
|
74
|
+
return { x: cos(n) * cos(e), y: cos(n) * sin(e), z: sin(n) };
|
|
75
|
+
};
|
|
76
|
+
const a = getPoint(e1, n1);
|
|
77
|
+
const b = getPoint(e2, n2);
|
|
78
|
+
const c = hypot(a.x - b.x, a.y - b.y, a.z - b.z);
|
|
79
|
+
const r = asin(c / 2) * 2 * R;
|
|
51
80
|
return Math.round(r);
|
|
52
81
|
},
|
|
53
82
|
|
|
54
|
-
|
|
83
|
+
// 显示欢迎语
|
|
55
84
|
showWelcome: (ipStore) => {
|
|
56
|
-
const WelcomeInfo = document.getElementById("welcome-info")
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
),
|
|
64
|
-
address,
|
|
65
|
-
welcome_info;
|
|
85
|
+
const WelcomeInfo = document.getElementById("welcome-info");
|
|
86
|
+
const IP = ipStore.result.ip || "未知";
|
|
87
|
+
const coord = elykiaWelcome.config.baseCoord;
|
|
88
|
+
const dist = elykiaWelcome.getDistance(coord.lng, coord.lat, ipStore.result.location.lng, ipStore.result.location.lat);
|
|
89
|
+
|
|
90
|
+
let address = ipStore.result.ad_info.nation || "未知地区";
|
|
91
|
+
let welcome_info = "欢迎访问本站";
|
|
66
92
|
|
|
67
|
-
|
|
68
|
-
|
|
93
|
+
// 根据国家、省份、城市信息自定义欢迎语
|
|
94
|
+
// 海外地区不支持省份及城市信息
|
|
69
95
|
switch (ipStore.result.ad_info.nation) {
|
|
70
96
|
case "日本":
|
|
71
97
|
welcome_info = "よろしく,一起去看樱花吗";
|
|
@@ -92,12 +118,7 @@ const elykia = {
|
|
|
92
118
|
welcome_info = "拾起一片枫叶赠予你";
|
|
93
119
|
break;
|
|
94
120
|
case "中国":
|
|
95
|
-
address =
|
|
96
|
-
ipStore.result.ad_info.province +
|
|
97
|
-
" " +
|
|
98
|
-
ipStore.result.ad_info.city +
|
|
99
|
-
" " +
|
|
100
|
-
ipStore.result.ad_info.district;
|
|
121
|
+
address = ipStore.result.ad_info.province + " " + ipStore.result.ad_info.city + " " + ipStore.result.ad_info.district;
|
|
101
122
|
|
|
102
123
|
switch (ipStore.result.ad_info.province) {
|
|
103
124
|
case "北京市":
|
|
@@ -110,19 +131,16 @@ const elykia = {
|
|
|
110
131
|
break;
|
|
111
132
|
case "重庆市":
|
|
112
133
|
address = "重庆市";
|
|
113
|
-
welcome_info =
|
|
114
|
-
"高德地图:已到达重庆,下面交给百度地图导航";
|
|
134
|
+
welcome_info = "高德地图:已到达重庆,下面交给百度地图导航";
|
|
115
135
|
break;
|
|
116
136
|
case "河北省":
|
|
117
|
-
welcome_info =
|
|
118
|
-
"山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
|
|
137
|
+
welcome_info = "山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
|
|
119
138
|
break;
|
|
120
139
|
case "山西省":
|
|
121
140
|
welcome_info = "展开坐具长三尺,已占山河五百余";
|
|
122
141
|
break;
|
|
123
142
|
case "内蒙古自治区":
|
|
124
|
-
welcome_info =
|
|
125
|
-
"天苍苍,野茫茫,风吹草低见牛羊";
|
|
143
|
+
welcome_info = "天苍苍,野茫茫,风吹草低见牛羊";
|
|
126
144
|
break;
|
|
127
145
|
case "辽宁省":
|
|
128
146
|
welcome_info = "我想吃烤鸡架";
|
|
@@ -135,33 +153,28 @@ const elykia = {
|
|
|
135
153
|
break;
|
|
136
154
|
case "上海市":
|
|
137
155
|
address = "上海市";
|
|
138
|
-
welcome_info =
|
|
139
|
-
"众所周知,中国只有两个城市";
|
|
156
|
+
welcome_info = "众所周知,中国只有两个城市";
|
|
140
157
|
break;
|
|
141
158
|
case "江苏省":
|
|
142
159
|
switch (ipStore.result.ad_info.city) {
|
|
143
160
|
case "南京市":
|
|
144
|
-
welcome_info =
|
|
145
|
-
"欢迎来自安徽省南京市的小伙伴";
|
|
161
|
+
welcome_info = "欢迎来自安徽省南京市的小伙伴";
|
|
146
162
|
break;
|
|
147
163
|
case "苏州市":
|
|
148
164
|
welcome_info = "上有天堂,下有苏杭";
|
|
149
165
|
break;
|
|
150
166
|
default:
|
|
151
|
-
welcome_info =
|
|
152
|
-
"散装是必须要散装的";
|
|
167
|
+
welcome_info = "散装是必须要散装的";
|
|
153
168
|
break;
|
|
154
169
|
}
|
|
155
170
|
break;
|
|
156
171
|
case "浙江省":
|
|
157
172
|
switch (ipStore.result.ad_info.city) {
|
|
158
173
|
case "杭州市":
|
|
159
|
-
welcome_info =
|
|
160
|
-
"东风渐绿西湖柳,雁已还人未南归";
|
|
174
|
+
welcome_info = "东风渐绿西湖柳,雁已还人未南归";
|
|
161
175
|
break;
|
|
162
176
|
default:
|
|
163
|
-
welcome_info =
|
|
164
|
-
"望海楼明照曙霞,护江堤白蹋晴沙";
|
|
177
|
+
welcome_info = "望海楼明照曙霞,护江堤白蹋晴沙";
|
|
165
178
|
break;
|
|
166
179
|
}
|
|
167
180
|
break;
|
|
@@ -172,18 +185,15 @@ const elykia = {
|
|
|
172
185
|
welcome_info = "井邑白云间,岩城远带山";
|
|
173
186
|
break;
|
|
174
187
|
case "江西省":
|
|
175
|
-
welcome_info =
|
|
176
|
-
"落霞与孤鹜齐飞,秋水共长天一色";
|
|
188
|
+
welcome_info = "落霞与孤鹜齐飞,秋水共长天一色";
|
|
177
189
|
break;
|
|
178
190
|
case "山东省":
|
|
179
|
-
welcome_info =
|
|
180
|
-
"遥望齐州九点烟,一泓海水杯中泻";
|
|
191
|
+
welcome_info = "遥望齐州九点烟,一泓海水杯中泻";
|
|
181
192
|
break;
|
|
182
193
|
case "湖北省":
|
|
183
194
|
switch (ipStore.result.ad_info.city) {
|
|
184
195
|
case "黄冈市":
|
|
185
|
-
welcome_info =
|
|
186
|
-
"红安将军县!辈出将才!";
|
|
196
|
+
welcome_info = "红安将军县!辈出将才!";
|
|
187
197
|
break;
|
|
188
198
|
default:
|
|
189
199
|
welcome_info = "来碗热干面~";
|
|
@@ -196,19 +206,16 @@ const elykia = {
|
|
|
196
206
|
case "广东省":
|
|
197
207
|
switch (ipStore.result.ad_info.city) {
|
|
198
208
|
case "广州市":
|
|
199
|
-
welcome_info =
|
|
200
|
-
"看小蛮腰,喝早茶了嘛~";
|
|
209
|
+
welcome_info = "看小蛮腰,喝早茶了嘛~";
|
|
201
210
|
break;
|
|
202
211
|
case "深圳市":
|
|
203
|
-
welcome_info =
|
|
204
|
-
"今天你逛商场了嘛~";
|
|
212
|
+
welcome_info = "今天你逛商场了嘛~";
|
|
205
213
|
break;
|
|
206
214
|
case "阳江市":
|
|
207
215
|
welcome_info = "阳春合水!";
|
|
208
216
|
break;
|
|
209
217
|
default:
|
|
210
|
-
welcome_info =
|
|
211
|
-
"老板来两斤福建人";
|
|
218
|
+
welcome_info = "老板来两斤福建人";
|
|
212
219
|
break;
|
|
213
220
|
}
|
|
214
221
|
break;
|
|
@@ -216,8 +223,7 @@ const elykia = {
|
|
|
216
223
|
welcome_info = "桂林山水甲天下";
|
|
217
224
|
break;
|
|
218
225
|
case "海南省":
|
|
219
|
-
welcome_info =
|
|
220
|
-
"朝观日出逐白浪,夕看云起收霞光";
|
|
226
|
+
welcome_info = "朝观日出逐白浪,夕看云起收霞光";
|
|
221
227
|
break;
|
|
222
228
|
case "四川省":
|
|
223
229
|
welcome_info = "康康川妹子";
|
|
@@ -225,199 +231,141 @@ const elykia = {
|
|
|
225
231
|
case "贵州省":
|
|
226
232
|
switch (ipStore.result.ad_info.city) {
|
|
227
233
|
case "六盘水市":
|
|
228
|
-
welcome_info =
|
|
229
|
-
"凉都六盘水,您好";
|
|
234
|
+
welcome_info = "凉都六盘水,您好";
|
|
230
235
|
break;
|
|
231
236
|
case "贵阳市":
|
|
232
|
-
welcome_info =
|
|
233
|
-
"爽爽贵阳,您好";
|
|
237
|
+
welcome_info = "爽爽贵阳,您好";
|
|
234
238
|
break;
|
|
235
239
|
case "遵义市":
|
|
236
|
-
welcome_info =
|
|
237
|
-
"遵义红城,您好";
|
|
240
|
+
welcome_info = "遵义红城,您好";
|
|
238
241
|
break;
|
|
239
242
|
case "安顺市":
|
|
240
|
-
welcome_info =
|
|
241
|
-
"安顺福地,您好";
|
|
243
|
+
welcome_info = "安顺福地,您好";
|
|
242
244
|
break;
|
|
243
245
|
case "毕节市":
|
|
244
|
-
welcome_info =
|
|
245
|
-
"毕节山水,您好";
|
|
246
|
+
welcome_info = "毕节山水,您好";
|
|
246
247
|
break;
|
|
247
248
|
case "铜仁市":
|
|
248
|
-
welcome_info =
|
|
249
|
-
"铜仁梵净,您好";
|
|
249
|
+
welcome_info = "铜仁梵净,您好";
|
|
250
250
|
break;
|
|
251
251
|
case "黔西南布依族苗族自治州":
|
|
252
|
-
welcome_info =
|
|
253
|
-
"黔西南风情,您好";
|
|
252
|
+
welcome_info = "黔西南风情,您好";
|
|
254
253
|
break;
|
|
255
254
|
case "黔东南苗族侗族自治州":
|
|
256
|
-
welcome_info =
|
|
257
|
-
"黔东南歌舞,您好";
|
|
255
|
+
welcome_info = "黔东南歌舞,您好";
|
|
258
256
|
break;
|
|
259
257
|
case "黔南布依族苗族自治州":
|
|
260
|
-
welcome_info =
|
|
261
|
-
"黔南美景,您好";
|
|
258
|
+
welcome_info = "黔南美景,您好";
|
|
262
259
|
break;
|
|
263
260
|
default:
|
|
264
|
-
welcome_info =
|
|
265
|
-
"茅台,学生,再塞200";
|
|
261
|
+
welcome_info = "茅台,学生,再塞200";
|
|
266
262
|
break;
|
|
267
263
|
}
|
|
268
264
|
break;
|
|
269
265
|
case "云南省":
|
|
270
|
-
welcome_info =
|
|
271
|
-
"玉龙飞舞云缠绕,万仞冰川直耸天";
|
|
266
|
+
welcome_info = "玉龙飞舞云缠绕,万仞冰川直耸天";
|
|
272
267
|
break;
|
|
273
268
|
case "西藏自治区":
|
|
274
|
-
welcome_info =
|
|
275
|
-
"躺在茫茫草原上,仰望蓝天";
|
|
269
|
+
welcome_info = "躺在茫茫草原上,仰望蓝天";
|
|
276
270
|
break;
|
|
277
271
|
case "陕西省":
|
|
278
272
|
welcome_info = "来份臊子面加馍";
|
|
279
273
|
break;
|
|
280
274
|
case "甘肃省":
|
|
281
|
-
welcome_info =
|
|
282
|
-
"羌笛何须怨杨柳,春风不度玉门关";
|
|
275
|
+
welcome_info = "羌笛何须怨杨柳,春风不度玉门关";
|
|
283
276
|
break;
|
|
284
277
|
case "青海省":
|
|
285
|
-
welcome_info =
|
|
286
|
-
"牛肉干和老酸奶都好好吃";
|
|
278
|
+
welcome_info = "牛肉干和老酸奶都好好吃";
|
|
287
279
|
break;
|
|
288
280
|
case "宁夏回族自治区":
|
|
289
|
-
welcome_info =
|
|
290
|
-
"大漠孤烟直,长河落日圆";
|
|
281
|
+
welcome_info = "大漠孤烟直,长河落日圆";
|
|
291
282
|
break;
|
|
292
283
|
case "新疆维吾尔自治区":
|
|
293
|
-
welcome_info =
|
|
294
|
-
"驼铃古道丝绸路,胡马犹闻唐汉风";
|
|
284
|
+
welcome_info = "驼铃古道丝绸路,胡马犹闻唐汉风";
|
|
295
285
|
break;
|
|
296
286
|
case "台湾省":
|
|
297
|
-
welcome_info =
|
|
298
|
-
"我在这头,大陆在那头";
|
|
287
|
+
welcome_info = "我在这头,大陆在那头";
|
|
299
288
|
break;
|
|
300
289
|
case "香港特别行政区":
|
|
301
290
|
address = "香港特别行政区";
|
|
302
|
-
welcome_info =
|
|
303
|
-
"永定贼有残留地鬼嚎,迎击光非岁玉";
|
|
291
|
+
welcome_info = "永定贼有残留地鬼嚎,迎击光非岁玉";
|
|
304
292
|
break;
|
|
305
293
|
case "澳门特别行政区":
|
|
306
294
|
address = "澳门特别行政区";
|
|
307
|
-
welcome_info =
|
|
308
|
-
"性感荷官,在线发牌";
|
|
295
|
+
welcome_info = "性感荷官,在线发牌";
|
|
309
296
|
break;
|
|
310
297
|
case "河南省":
|
|
311
298
|
switch (ipStore.result.ad_info.city) {
|
|
312
299
|
case "郑州市":
|
|
313
|
-
welcome_info =
|
|
314
|
-
"豫州之域,天地之中";
|
|
300
|
+
welcome_info = "豫州之域,天地之中";
|
|
315
301
|
break;
|
|
316
302
|
case "南阳市":
|
|
317
|
-
welcome_info =
|
|
318
|
-
"臣本布衣,躬耕于南阳此南阳非彼南阳!";
|
|
303
|
+
welcome_info = "臣本布衣,躬耕于南阳此南阳非彼南阳!";
|
|
319
304
|
break;
|
|
320
305
|
case "驻马店市":
|
|
321
|
-
welcome_info =
|
|
322
|
-
"峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
|
|
306
|
+
welcome_info = "峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
|
|
323
307
|
break;
|
|
324
308
|
case "开封市":
|
|
325
|
-
welcome_info =
|
|
326
|
-
"刚正不阿包青天!";
|
|
309
|
+
welcome_info = "刚正不阿包青天!";
|
|
327
310
|
break;
|
|
328
311
|
case "洛阳市":
|
|
329
|
-
welcome_info =
|
|
330
|
-
"洛阳牡丹甲天下";
|
|
312
|
+
welcome_info = "洛阳牡丹甲天下";
|
|
331
313
|
break;
|
|
332
314
|
case "平顶山市":
|
|
333
|
-
welcome_info =
|
|
334
|
-
"QQ市~ 博主家乡~ 欢迎来玩~!";
|
|
315
|
+
welcome_info = "QQ市~ 博主家乡~ 欢迎来玩~!";
|
|
335
316
|
break;
|
|
336
317
|
default:
|
|
337
|
-
welcome_info =
|
|
338
|
-
"可否带我品尝河南烩面啦?";
|
|
318
|
+
welcome_info = "可否带我品尝河南烩面啦?";
|
|
339
319
|
break;
|
|
340
320
|
}
|
|
341
321
|
break;
|
|
342
322
|
default:
|
|
343
|
-
welcome_info =
|
|
344
|
-
"带我去你的城市逛逛吧";
|
|
323
|
+
welcome_info = "带我去你的城市逛逛吧";
|
|
345
324
|
break;
|
|
346
325
|
}
|
|
347
326
|
break;
|
|
348
327
|
default:
|
|
349
|
-
welcome_info =
|
|
350
|
-
"带我去你的国家看看吧";
|
|
328
|
+
welcome_info = "带我去你的国家看看吧";
|
|
351
329
|
break;
|
|
352
330
|
}
|
|
353
331
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
if (
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
else if (
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
"<span>☀️中午好,该摸鱼吃午饭了</span>";
|
|
366
|
-
else if (
|
|
367
|
-
date.getHours() >= 13 &&
|
|
368
|
-
date.getHours() < 15
|
|
369
|
-
)
|
|
370
|
-
timeChange =
|
|
371
|
-
"<span>🕞下午好,懒懒地睡个午觉吧</span>";
|
|
372
|
-
else if (
|
|
373
|
-
date.getHours() >= 15 &&
|
|
374
|
-
date.getHours() < 16
|
|
375
|
-
)
|
|
376
|
-
timeChange =
|
|
377
|
-
"<span>🍵三点几啦,饮茶先啦</span>";
|
|
378
|
-
else if (
|
|
379
|
-
date.getHours() >= 16 &&
|
|
380
|
-
date.getHours() < 18
|
|
381
|
-
)
|
|
382
|
-
timeChange =
|
|
383
|
-
"<span>🚶♂️即将下班,记得按时吃饭~</span>";
|
|
384
|
-
else if (
|
|
385
|
-
date.getHours() >= 18 &&
|
|
386
|
-
date.getHours() < 19
|
|
387
|
-
)
|
|
388
|
-
timeChange =
|
|
389
|
-
"<span>🌇夕阳无限好,只是近黄昏</span>";
|
|
390
|
-
else if (
|
|
391
|
-
date.getHours() >= 19 &&
|
|
392
|
-
date.getHours() < 24
|
|
393
|
-
)
|
|
394
|
-
timeChange =
|
|
395
|
-
"<span>🌔晚上好,夜生活嗨起来</span>";
|
|
396
|
-
else
|
|
397
|
-
timeChange =
|
|
398
|
-
"🌌夜深了,早点休息,少熬夜";
|
|
332
|
+
// 根据时间显示问候语
|
|
333
|
+
const hour = new Date().getHours();
|
|
334
|
+
let timeChange;
|
|
335
|
+
if (hour >= 5 && hour < 11) timeChange = "<span>🌤️上午好,一日之计在于晨</span>";
|
|
336
|
+
else if (hour >= 11 && hour < 13) timeChange = "<span>☀️中午好,该摸鱼吃午饭了</span>";
|
|
337
|
+
else if (hour >= 13 && hour < 15) timeChange = "<span>🕞下午好,懒懒地睡个午觉吧</span>";
|
|
338
|
+
else if (hour >= 15 && hour < 16) timeChange = "<span>🍵三点几啦,饮茶先啦</span>";
|
|
339
|
+
else if (hour >= 16 && hour < 18) timeChange = "<span>🚶♂️即将下班,记得按时吃饭~</span>";
|
|
340
|
+
else if (hour >= 18 && hour < 19) timeChange = "<span>🌇夕阳无限好,只是近黄昏</span>";
|
|
341
|
+
else if (hour >= 19 && hour < 24) timeChange = "<span>🌔晚上好,夜生活嗨起来</span>";
|
|
342
|
+
else timeChange = "🌌夜深了,早点休息,少熬夜";
|
|
399
343
|
|
|
400
|
-
|
|
401
|
-
|
|
344
|
+
// 渲染欢迎信息
|
|
345
|
+
WelcomeInfo && (WelcomeInfo.innerHTML = `
|
|
402
346
|
欢迎来自 <strong>${address}</strong> 的小伙伴🍂<br>
|
|
403
347
|
<strong>${welcome_info}!</strong><br>
|
|
404
348
|
您距离 <strong>Elykia</strong> 约有 <strong>${dist}</strong> 公里!<br>
|
|
405
349
|
您的IP地址为:<strong>${IP}</strong><br>
|
|
406
350
|
<strong>${timeChange}!</strong>`);
|
|
407
|
-
}
|
|
351
|
+
}
|
|
408
352
|
};
|
|
409
353
|
|
|
410
354
|
// 页面加载后执行
|
|
411
355
|
document.addEventListener("DOMContentLoaded", () => {
|
|
412
|
-
|
|
356
|
+
elykiaWelcome.setWelcome();
|
|
413
357
|
});
|
|
414
358
|
|
|
415
|
-
//
|
|
416
|
-
|
|
417
|
-
|
|
359
|
+
// 浏览器前进/后退
|
|
360
|
+
window.addEventListener("popstate", () => {
|
|
361
|
+
setTimeout(elykiaWelcome.setWelcome, 100);
|
|
418
362
|
});
|
|
419
363
|
|
|
420
|
-
//
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
364
|
+
// 监听 Vue Router 的 URL 变化
|
|
365
|
+
let elykiaWelcomeLastUrl = location.href;
|
|
366
|
+
new MutationObserver(() => {
|
|
367
|
+
if (location.href !== elykiaWelcomeLastUrl) {
|
|
368
|
+
elykiaWelcomeLastUrl = location.href;
|
|
369
|
+
setTimeout(elykiaWelcome.setWelcome, 100);
|
|
370
|
+
}
|
|
371
|
+
}).observe(document.body, { childList: true, subtree: true });
|