elykia 1.0.28 → 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 +137 -184
- 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,27 +1,61 @@
|
|
|
1
|
-
const
|
|
2
|
-
//
|
|
3
|
-
|
|
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
|
+
},
|
|
29
|
+
|
|
30
|
+
// 入口函数
|
|
31
|
+
setWelcome: async () => {
|
|
4
32
|
const WelcomeInfo = document.getElementById("welcome-info");
|
|
5
33
|
if (!WelcomeInfo) {
|
|
6
|
-
setTimeout(
|
|
34
|
+
setTimeout(elykiaWelcome.setWelcome, 200);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const cached = elykiaWelcome.cache.get(elykiaWelcome.config.cacheKey);
|
|
39
|
+
if (cached) {
|
|
40
|
+
elykiaWelcome.showWelcome(cached);
|
|
7
41
|
return;
|
|
8
42
|
}
|
|
9
43
|
|
|
10
44
|
try {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
script.src = url;
|
|
45
|
+
await new Promise((resolve, reject) => {
|
|
46
|
+
const script = document.createElement('script');
|
|
47
|
+
script.src = elykiaWelcome.config.apiUrl;
|
|
15
48
|
|
|
16
49
|
window.QQmap = (data) => {
|
|
50
|
+
document.body.removeChild(script);
|
|
51
|
+
delete window.QQmap;
|
|
17
52
|
if (data.status === 0) {
|
|
18
|
-
|
|
53
|
+
elykiaWelcome.cache.set(elykiaWelcome.config.cacheKey, data, elykiaWelcome.config.cacheMinutes);
|
|
54
|
+
elykiaWelcome.showWelcome(data);
|
|
19
55
|
resolve();
|
|
20
56
|
} else {
|
|
21
57
|
reject(new Error('Failed to fetch location data'));
|
|
22
58
|
}
|
|
23
|
-
document.body.removeChild(script);
|
|
24
|
-
delete window.QQmap;
|
|
25
59
|
};
|
|
26
60
|
document.body.appendChild(script);
|
|
27
61
|
});
|
|
@@ -30,37 +64,34 @@ const elykia = {
|
|
|
30
64
|
}
|
|
31
65
|
},
|
|
32
66
|
|
|
33
|
-
|
|
67
|
+
// 计算两点距离(单位:公里)
|
|
34
68
|
getDistance: (e1, n1, e2, n2) => {
|
|
35
|
-
const R = 6371
|
|
36
|
-
const { sin, cos, asin, PI, hypot } = Math
|
|
37
|
-
|
|
38
|
-
e *= PI / 180
|
|
39
|
-
n *= PI / 180
|
|
40
|
-
return { x: cos(n) * cos(e), y: cos(n) * sin(e), z: sin(n) }
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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;
|
|
46
80
|
return Math.round(r);
|
|
47
81
|
},
|
|
48
82
|
|
|
49
|
-
|
|
83
|
+
// 显示欢迎语
|
|
50
84
|
showWelcome: (ipStore) => {
|
|
51
|
-
const WelcomeInfo = document.getElementById("welcome-info")
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
34.747201,
|
|
56
|
-
ipStore.result.location.lng,
|
|
57
|
-
ipStore.result.location.lat
|
|
58
|
-
),
|
|
59
|
-
address,
|
|
60
|
-
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);
|
|
61
89
|
|
|
62
|
-
|
|
63
|
-
|
|
90
|
+
let address = ipStore.result.ad_info.nation || "未知地区";
|
|
91
|
+
let welcome_info = "欢迎访问本站";
|
|
92
|
+
|
|
93
|
+
// 根据国家、省份、城市信息自定义欢迎语
|
|
94
|
+
// 海外地区不支持省份及城市信息
|
|
64
95
|
switch (ipStore.result.ad_info.nation) {
|
|
65
96
|
case "日本":
|
|
66
97
|
welcome_info = "よろしく,一起去看樱花吗";
|
|
@@ -87,12 +118,7 @@ const elykia = {
|
|
|
87
118
|
welcome_info = "拾起一片枫叶赠予你";
|
|
88
119
|
break;
|
|
89
120
|
case "中国":
|
|
90
|
-
address =
|
|
91
|
-
ipStore.result.ad_info.province +
|
|
92
|
-
" " +
|
|
93
|
-
ipStore.result.ad_info.city +
|
|
94
|
-
" " +
|
|
95
|
-
ipStore.result.ad_info.district;
|
|
121
|
+
address = ipStore.result.ad_info.province + " " + ipStore.result.ad_info.city + " " + ipStore.result.ad_info.district;
|
|
96
122
|
|
|
97
123
|
switch (ipStore.result.ad_info.province) {
|
|
98
124
|
case "北京市":
|
|
@@ -105,19 +131,16 @@ const elykia = {
|
|
|
105
131
|
break;
|
|
106
132
|
case "重庆市":
|
|
107
133
|
address = "重庆市";
|
|
108
|
-
welcome_info =
|
|
109
|
-
"高德地图:已到达重庆,下面交给百度地图导航";
|
|
134
|
+
welcome_info = "高德地图:已到达重庆,下面交给百度地图导航";
|
|
110
135
|
break;
|
|
111
136
|
case "河北省":
|
|
112
|
-
welcome_info =
|
|
113
|
-
"山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
|
|
137
|
+
welcome_info = "山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
|
|
114
138
|
break;
|
|
115
139
|
case "山西省":
|
|
116
140
|
welcome_info = "展开坐具长三尺,已占山河五百余";
|
|
117
141
|
break;
|
|
118
142
|
case "内蒙古自治区":
|
|
119
|
-
welcome_info =
|
|
120
|
-
"天苍苍,野茫茫,风吹草低见牛羊";
|
|
143
|
+
welcome_info = "天苍苍,野茫茫,风吹草低见牛羊";
|
|
121
144
|
break;
|
|
122
145
|
case "辽宁省":
|
|
123
146
|
welcome_info = "我想吃烤鸡架";
|
|
@@ -130,33 +153,28 @@ const elykia = {
|
|
|
130
153
|
break;
|
|
131
154
|
case "上海市":
|
|
132
155
|
address = "上海市";
|
|
133
|
-
welcome_info =
|
|
134
|
-
"众所周知,中国只有两个城市";
|
|
156
|
+
welcome_info = "众所周知,中国只有两个城市";
|
|
135
157
|
break;
|
|
136
158
|
case "江苏省":
|
|
137
159
|
switch (ipStore.result.ad_info.city) {
|
|
138
160
|
case "南京市":
|
|
139
|
-
welcome_info =
|
|
140
|
-
"欢迎来自安徽省南京市的小伙伴";
|
|
161
|
+
welcome_info = "欢迎来自安徽省南京市的小伙伴";
|
|
141
162
|
break;
|
|
142
163
|
case "苏州市":
|
|
143
164
|
welcome_info = "上有天堂,下有苏杭";
|
|
144
165
|
break;
|
|
145
166
|
default:
|
|
146
|
-
welcome_info =
|
|
147
|
-
"散装是必须要散装的";
|
|
167
|
+
welcome_info = "散装是必须要散装的";
|
|
148
168
|
break;
|
|
149
169
|
}
|
|
150
170
|
break;
|
|
151
171
|
case "浙江省":
|
|
152
172
|
switch (ipStore.result.ad_info.city) {
|
|
153
173
|
case "杭州市":
|
|
154
|
-
welcome_info =
|
|
155
|
-
"东风渐绿西湖柳,雁已还人未南归";
|
|
174
|
+
welcome_info = "东风渐绿西湖柳,雁已还人未南归";
|
|
156
175
|
break;
|
|
157
176
|
default:
|
|
158
|
-
welcome_info =
|
|
159
|
-
"望海楼明照曙霞,护江堤白蹋晴沙";
|
|
177
|
+
welcome_info = "望海楼明照曙霞,护江堤白蹋晴沙";
|
|
160
178
|
break;
|
|
161
179
|
}
|
|
162
180
|
break;
|
|
@@ -167,18 +185,15 @@ const elykia = {
|
|
|
167
185
|
welcome_info = "井邑白云间,岩城远带山";
|
|
168
186
|
break;
|
|
169
187
|
case "江西省":
|
|
170
|
-
welcome_info =
|
|
171
|
-
"落霞与孤鹜齐飞,秋水共长天一色";
|
|
188
|
+
welcome_info = "落霞与孤鹜齐飞,秋水共长天一色";
|
|
172
189
|
break;
|
|
173
190
|
case "山东省":
|
|
174
|
-
welcome_info =
|
|
175
|
-
"遥望齐州九点烟,一泓海水杯中泻";
|
|
191
|
+
welcome_info = "遥望齐州九点烟,一泓海水杯中泻";
|
|
176
192
|
break;
|
|
177
193
|
case "湖北省":
|
|
178
194
|
switch (ipStore.result.ad_info.city) {
|
|
179
195
|
case "黄冈市":
|
|
180
|
-
welcome_info =
|
|
181
|
-
"红安将军县!辈出将才!";
|
|
196
|
+
welcome_info = "红安将军县!辈出将才!";
|
|
182
197
|
break;
|
|
183
198
|
default:
|
|
184
199
|
welcome_info = "来碗热干面~";
|
|
@@ -191,19 +206,16 @@ const elykia = {
|
|
|
191
206
|
case "广东省":
|
|
192
207
|
switch (ipStore.result.ad_info.city) {
|
|
193
208
|
case "广州市":
|
|
194
|
-
welcome_info =
|
|
195
|
-
"看小蛮腰,喝早茶了嘛~";
|
|
209
|
+
welcome_info = "看小蛮腰,喝早茶了嘛~";
|
|
196
210
|
break;
|
|
197
211
|
case "深圳市":
|
|
198
|
-
welcome_info =
|
|
199
|
-
"今天你逛商场了嘛~";
|
|
212
|
+
welcome_info = "今天你逛商场了嘛~";
|
|
200
213
|
break;
|
|
201
214
|
case "阳江市":
|
|
202
215
|
welcome_info = "阳春合水!";
|
|
203
216
|
break;
|
|
204
217
|
default:
|
|
205
|
-
welcome_info =
|
|
206
|
-
"老板来两斤福建人";
|
|
218
|
+
welcome_info = "老板来两斤福建人";
|
|
207
219
|
break;
|
|
208
220
|
}
|
|
209
221
|
break;
|
|
@@ -211,8 +223,7 @@ const elykia = {
|
|
|
211
223
|
welcome_info = "桂林山水甲天下";
|
|
212
224
|
break;
|
|
213
225
|
case "海南省":
|
|
214
|
-
welcome_info =
|
|
215
|
-
"朝观日出逐白浪,夕看云起收霞光";
|
|
226
|
+
welcome_info = "朝观日出逐白浪,夕看云起收霞光";
|
|
216
227
|
break;
|
|
217
228
|
case "四川省":
|
|
218
229
|
welcome_info = "康康川妹子";
|
|
@@ -220,199 +231,141 @@ const elykia = {
|
|
|
220
231
|
case "贵州省":
|
|
221
232
|
switch (ipStore.result.ad_info.city) {
|
|
222
233
|
case "六盘水市":
|
|
223
|
-
welcome_info =
|
|
224
|
-
"凉都六盘水,您好";
|
|
234
|
+
welcome_info = "凉都六盘水,您好";
|
|
225
235
|
break;
|
|
226
236
|
case "贵阳市":
|
|
227
|
-
welcome_info =
|
|
228
|
-
"爽爽贵阳,您好";
|
|
237
|
+
welcome_info = "爽爽贵阳,您好";
|
|
229
238
|
break;
|
|
230
239
|
case "遵义市":
|
|
231
|
-
welcome_info =
|
|
232
|
-
"遵义红城,您好";
|
|
240
|
+
welcome_info = "遵义红城,您好";
|
|
233
241
|
break;
|
|
234
242
|
case "安顺市":
|
|
235
|
-
welcome_info =
|
|
236
|
-
"安顺福地,您好";
|
|
243
|
+
welcome_info = "安顺福地,您好";
|
|
237
244
|
break;
|
|
238
245
|
case "毕节市":
|
|
239
|
-
welcome_info =
|
|
240
|
-
"毕节山水,您好";
|
|
246
|
+
welcome_info = "毕节山水,您好";
|
|
241
247
|
break;
|
|
242
248
|
case "铜仁市":
|
|
243
|
-
welcome_info =
|
|
244
|
-
"铜仁梵净,您好";
|
|
249
|
+
welcome_info = "铜仁梵净,您好";
|
|
245
250
|
break;
|
|
246
251
|
case "黔西南布依族苗族自治州":
|
|
247
|
-
welcome_info =
|
|
248
|
-
"黔西南风情,您好";
|
|
252
|
+
welcome_info = "黔西南风情,您好";
|
|
249
253
|
break;
|
|
250
254
|
case "黔东南苗族侗族自治州":
|
|
251
|
-
welcome_info =
|
|
252
|
-
"黔东南歌舞,您好";
|
|
255
|
+
welcome_info = "黔东南歌舞,您好";
|
|
253
256
|
break;
|
|
254
257
|
case "黔南布依族苗族自治州":
|
|
255
|
-
welcome_info =
|
|
256
|
-
"黔南美景,您好";
|
|
258
|
+
welcome_info = "黔南美景,您好";
|
|
257
259
|
break;
|
|
258
260
|
default:
|
|
259
|
-
welcome_info =
|
|
260
|
-
"茅台,学生,再塞200";
|
|
261
|
+
welcome_info = "茅台,学生,再塞200";
|
|
261
262
|
break;
|
|
262
263
|
}
|
|
263
264
|
break;
|
|
264
265
|
case "云南省":
|
|
265
|
-
welcome_info =
|
|
266
|
-
"玉龙飞舞云缠绕,万仞冰川直耸天";
|
|
266
|
+
welcome_info = "玉龙飞舞云缠绕,万仞冰川直耸天";
|
|
267
267
|
break;
|
|
268
268
|
case "西藏自治区":
|
|
269
|
-
welcome_info =
|
|
270
|
-
"躺在茫茫草原上,仰望蓝天";
|
|
269
|
+
welcome_info = "躺在茫茫草原上,仰望蓝天";
|
|
271
270
|
break;
|
|
272
271
|
case "陕西省":
|
|
273
272
|
welcome_info = "来份臊子面加馍";
|
|
274
273
|
break;
|
|
275
274
|
case "甘肃省":
|
|
276
|
-
welcome_info =
|
|
277
|
-
"羌笛何须怨杨柳,春风不度玉门关";
|
|
275
|
+
welcome_info = "羌笛何须怨杨柳,春风不度玉门关";
|
|
278
276
|
break;
|
|
279
277
|
case "青海省":
|
|
280
|
-
welcome_info =
|
|
281
|
-
"牛肉干和老酸奶都好好吃";
|
|
278
|
+
welcome_info = "牛肉干和老酸奶都好好吃";
|
|
282
279
|
break;
|
|
283
280
|
case "宁夏回族自治区":
|
|
284
|
-
welcome_info =
|
|
285
|
-
"大漠孤烟直,长河落日圆";
|
|
281
|
+
welcome_info = "大漠孤烟直,长河落日圆";
|
|
286
282
|
break;
|
|
287
283
|
case "新疆维吾尔自治区":
|
|
288
|
-
welcome_info =
|
|
289
|
-
"驼铃古道丝绸路,胡马犹闻唐汉风";
|
|
284
|
+
welcome_info = "驼铃古道丝绸路,胡马犹闻唐汉风";
|
|
290
285
|
break;
|
|
291
286
|
case "台湾省":
|
|
292
|
-
welcome_info =
|
|
293
|
-
"我在这头,大陆在那头";
|
|
287
|
+
welcome_info = "我在这头,大陆在那头";
|
|
294
288
|
break;
|
|
295
289
|
case "香港特别行政区":
|
|
296
290
|
address = "香港特别行政区";
|
|
297
|
-
welcome_info =
|
|
298
|
-
"永定贼有残留地鬼嚎,迎击光非岁玉";
|
|
291
|
+
welcome_info = "永定贼有残留地鬼嚎,迎击光非岁玉";
|
|
299
292
|
break;
|
|
300
293
|
case "澳门特别行政区":
|
|
301
294
|
address = "澳门特别行政区";
|
|
302
|
-
welcome_info =
|
|
303
|
-
"性感荷官,在线发牌";
|
|
295
|
+
welcome_info = "性感荷官,在线发牌";
|
|
304
296
|
break;
|
|
305
297
|
case "河南省":
|
|
306
298
|
switch (ipStore.result.ad_info.city) {
|
|
307
299
|
case "郑州市":
|
|
308
|
-
welcome_info =
|
|
309
|
-
"豫州之域,天地之中";
|
|
300
|
+
welcome_info = "豫州之域,天地之中";
|
|
310
301
|
break;
|
|
311
302
|
case "南阳市":
|
|
312
|
-
welcome_info =
|
|
313
|
-
"臣本布衣,躬耕于南阳此南阳非彼南阳!";
|
|
303
|
+
welcome_info = "臣本布衣,躬耕于南阳此南阳非彼南阳!";
|
|
314
304
|
break;
|
|
315
305
|
case "驻马店市":
|
|
316
|
-
welcome_info =
|
|
317
|
-
"峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
|
|
306
|
+
welcome_info = "峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
|
|
318
307
|
break;
|
|
319
308
|
case "开封市":
|
|
320
|
-
welcome_info =
|
|
321
|
-
"刚正不阿包青天!";
|
|
309
|
+
welcome_info = "刚正不阿包青天!";
|
|
322
310
|
break;
|
|
323
311
|
case "洛阳市":
|
|
324
|
-
welcome_info =
|
|
325
|
-
"洛阳牡丹甲天下";
|
|
312
|
+
welcome_info = "洛阳牡丹甲天下";
|
|
326
313
|
break;
|
|
327
314
|
case "平顶山市":
|
|
328
|
-
welcome_info =
|
|
329
|
-
"QQ市~ 博主家乡~ 欢迎来玩~!";
|
|
315
|
+
welcome_info = "QQ市~ 博主家乡~ 欢迎来玩~!";
|
|
330
316
|
break;
|
|
331
317
|
default:
|
|
332
|
-
welcome_info =
|
|
333
|
-
"可否带我品尝河南烩面啦?";
|
|
318
|
+
welcome_info = "可否带我品尝河南烩面啦?";
|
|
334
319
|
break;
|
|
335
320
|
}
|
|
336
321
|
break;
|
|
337
322
|
default:
|
|
338
|
-
welcome_info =
|
|
339
|
-
"带我去你的城市逛逛吧";
|
|
323
|
+
welcome_info = "带我去你的城市逛逛吧";
|
|
340
324
|
break;
|
|
341
325
|
}
|
|
342
326
|
break;
|
|
343
327
|
default:
|
|
344
|
-
welcome_info =
|
|
345
|
-
"带我去你的国家看看吧";
|
|
328
|
+
welcome_info = "带我去你的国家看看吧";
|
|
346
329
|
break;
|
|
347
330
|
}
|
|
348
331
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
if (
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
else if (
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
"<span>☀️中午好,该摸鱼吃午饭了</span>";
|
|
361
|
-
else if (
|
|
362
|
-
date.getHours() >= 13 &&
|
|
363
|
-
date.getHours() < 15
|
|
364
|
-
)
|
|
365
|
-
timeChange =
|
|
366
|
-
"<span>🕞下午好,懒懒地睡个午觉吧</span>";
|
|
367
|
-
else if (
|
|
368
|
-
date.getHours() >= 15 &&
|
|
369
|
-
date.getHours() < 16
|
|
370
|
-
)
|
|
371
|
-
timeChange =
|
|
372
|
-
"<span>🍵三点几啦,饮茶先啦</span>";
|
|
373
|
-
else if (
|
|
374
|
-
date.getHours() >= 16 &&
|
|
375
|
-
date.getHours() < 18
|
|
376
|
-
)
|
|
377
|
-
timeChange =
|
|
378
|
-
"<span>🚶♂️即将下班,记得按时吃饭~</span>";
|
|
379
|
-
else if (
|
|
380
|
-
date.getHours() >= 18 &&
|
|
381
|
-
date.getHours() < 19
|
|
382
|
-
)
|
|
383
|
-
timeChange =
|
|
384
|
-
"<span>🌇夕阳无限好,只是近黄昏</span>";
|
|
385
|
-
else if (
|
|
386
|
-
date.getHours() >= 19 &&
|
|
387
|
-
date.getHours() < 24
|
|
388
|
-
)
|
|
389
|
-
timeChange =
|
|
390
|
-
"<span>🌔晚上好,夜生活嗨起来</span>";
|
|
391
|
-
else
|
|
392
|
-
timeChange =
|
|
393
|
-
"🌌夜深了,早点休息,少熬夜";
|
|
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 = "🌌夜深了,早点休息,少熬夜";
|
|
394
343
|
|
|
395
|
-
|
|
396
|
-
|
|
344
|
+
// 渲染欢迎信息
|
|
345
|
+
WelcomeInfo && (WelcomeInfo.innerHTML = `
|
|
397
346
|
欢迎来自 <strong>${address}</strong> 的小伙伴🍂<br>
|
|
398
347
|
<strong>${welcome_info}!</strong><br>
|
|
399
348
|
您距离 <strong>Elykia</strong> 约有 <strong>${dist}</strong> 公里!<br>
|
|
400
349
|
您的IP地址为:<strong>${IP}</strong><br>
|
|
401
350
|
<strong>${timeChange}!</strong>`);
|
|
402
|
-
}
|
|
351
|
+
}
|
|
403
352
|
};
|
|
404
353
|
|
|
405
354
|
// 页面加载后执行
|
|
406
355
|
document.addEventListener("DOMContentLoaded", () => {
|
|
407
|
-
|
|
356
|
+
elykiaWelcome.setWelcome();
|
|
408
357
|
});
|
|
409
358
|
|
|
410
|
-
//
|
|
411
|
-
|
|
412
|
-
|
|
359
|
+
// 浏览器前进/后退
|
|
360
|
+
window.addEventListener("popstate", () => {
|
|
361
|
+
setTimeout(elykiaWelcome.setWelcome, 100);
|
|
413
362
|
});
|
|
414
363
|
|
|
415
|
-
//
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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 });
|