elykia 1.0.18 → 1.0.20
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/{welcome.js → blog/welcome.js} +168 -82
- package/license +1 -0
- package/package.json +1 -1
- package/countdown.js +0 -201
- package/friend.js +0 -23939
- package/home.css +0 -15
- package/privacy.js +0 -29
- package/twikoo.json +0 -1349
|
@@ -3,38 +3,29 @@ const elykia = {
|
|
|
3
3
|
setWelcome_info: async () => {
|
|
4
4
|
if (!document.getElementById("welcome-info")) return;
|
|
5
5
|
|
|
6
|
-
let ipLoacation = saveToLocal.get('welcome-info');
|
|
7
|
-
|
|
8
6
|
try {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
script.src = url;
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
var script = document.createElement('script');
|
|
9
|
+
var url = `https://apis.map.qq.com/ws/location/v1/ip?key=TNLBZ-FS2LQ-4X257-4ACX6-OP673-62BFJ&output=jsonp&callback=QQmap`;
|
|
10
|
+
script.src = url;
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
};
|
|
28
|
-
document.body.appendChild(script);
|
|
29
|
-
});
|
|
30
|
-
} else {
|
|
31
|
-
await Promise.resolve(); // 确保在同步代码路径上也能保持异步风格
|
|
32
|
-
elykia.showWelcome(ipLoacation);
|
|
33
|
-
}
|
|
12
|
+
window.QQmap = (data) => {
|
|
13
|
+
if (data.status === 0) {
|
|
14
|
+
elykia.showWelcome(data);
|
|
15
|
+
resolve();
|
|
16
|
+
} else {
|
|
17
|
+
reject(new Error('Failed to fetch location data'));
|
|
18
|
+
}
|
|
19
|
+
document.body.removeChild(script);
|
|
20
|
+
delete window.QQmap;
|
|
21
|
+
};
|
|
22
|
+
document.body.appendChild(script);
|
|
23
|
+
});
|
|
34
24
|
} catch (err) {
|
|
35
25
|
console.error("Error fetching data:", err);
|
|
36
26
|
}
|
|
37
27
|
},
|
|
28
|
+
|
|
38
29
|
//根据经纬度计算两点距离(点1经度,点1纬度,点2经度,点2纬度)
|
|
39
30
|
getDistance: (e1, n1, e2, n2) => {
|
|
40
31
|
const R = 6371
|
|
@@ -50,13 +41,20 @@ const elykia = {
|
|
|
50
41
|
let r = asin(c / 2) * 2 * R
|
|
51
42
|
return Math.round(r);
|
|
52
43
|
},
|
|
44
|
+
|
|
53
45
|
//根据国家、省份、城市信息自定义欢迎语
|
|
54
46
|
showWelcome: (ipStore) => {
|
|
55
47
|
const WelcomeInfo = document.getElementById("welcome-info"),
|
|
56
48
|
IP = ipStore.result.ip || "未知";
|
|
57
|
-
let dist = elykia.getDistance(
|
|
49
|
+
let dist = elykia.getDistance(
|
|
50
|
+
113.625000,
|
|
51
|
+
34.747201,
|
|
52
|
+
ipStore.result.location.lng,
|
|
53
|
+
ipStore.result.location.lat
|
|
54
|
+
),
|
|
58
55
|
address,
|
|
59
56
|
welcome_info;
|
|
57
|
+
|
|
60
58
|
//根据国家、省份、城市信息自定义欢迎语
|
|
61
59
|
//海外地区不支持省份及城市信息
|
|
62
60
|
switch (ipStore.result.ad_info.nation) {
|
|
@@ -85,7 +83,13 @@ const elykia = {
|
|
|
85
83
|
welcome_info = "拾起一片枫叶赠予你";
|
|
86
84
|
break;
|
|
87
85
|
case "中国":
|
|
88
|
-
address =
|
|
86
|
+
address =
|
|
87
|
+
ipStore.result.ad_info.province +
|
|
88
|
+
" " +
|
|
89
|
+
ipStore.result.ad_info.city +
|
|
90
|
+
" " +
|
|
91
|
+
ipStore.result.ad_info.district;
|
|
92
|
+
|
|
89
93
|
switch (ipStore.result.ad_info.province) {
|
|
90
94
|
case "北京市":
|
|
91
95
|
address = "北京市";
|
|
@@ -97,16 +101,19 @@ const elykia = {
|
|
|
97
101
|
break;
|
|
98
102
|
case "重庆市":
|
|
99
103
|
address = "重庆市";
|
|
100
|
-
welcome_info =
|
|
104
|
+
welcome_info =
|
|
105
|
+
"高德地图:已到达重庆,下面交给百度地图导航";
|
|
101
106
|
break;
|
|
102
107
|
case "河北省":
|
|
103
|
-
welcome_info =
|
|
108
|
+
welcome_info =
|
|
109
|
+
"山势巍巍成壁垒,天下雄关。铁马金戈由此向,无限江山";
|
|
104
110
|
break;
|
|
105
111
|
case "山西省":
|
|
106
112
|
welcome_info = "展开坐具长三尺,已占山河五百余";
|
|
107
113
|
break;
|
|
108
114
|
case "内蒙古自治区":
|
|
109
|
-
welcome_info =
|
|
115
|
+
welcome_info =
|
|
116
|
+
"天苍苍,野茫茫,风吹草低见牛羊";
|
|
110
117
|
break;
|
|
111
118
|
case "辽宁省":
|
|
112
119
|
welcome_info = "我想吃烤鸡架";
|
|
@@ -119,28 +126,33 @@ const elykia = {
|
|
|
119
126
|
break;
|
|
120
127
|
case "上海市":
|
|
121
128
|
address = "上海市";
|
|
122
|
-
welcome_info =
|
|
129
|
+
welcome_info =
|
|
130
|
+
"众所周知,中国只有两个城市";
|
|
123
131
|
break;
|
|
124
132
|
case "江苏省":
|
|
125
133
|
switch (ipStore.result.ad_info.city) {
|
|
126
134
|
case "南京市":
|
|
127
|
-
welcome_info =
|
|
135
|
+
welcome_info =
|
|
136
|
+
"欢迎来自安徽省南京市的小伙伴";
|
|
128
137
|
break;
|
|
129
138
|
case "苏州市":
|
|
130
139
|
welcome_info = "上有天堂,下有苏杭";
|
|
131
140
|
break;
|
|
132
141
|
default:
|
|
133
|
-
welcome_info =
|
|
142
|
+
welcome_info =
|
|
143
|
+
"散装是必须要散装的";
|
|
134
144
|
break;
|
|
135
145
|
}
|
|
136
146
|
break;
|
|
137
147
|
case "浙江省":
|
|
138
148
|
switch (ipStore.result.ad_info.city) {
|
|
139
149
|
case "杭州市":
|
|
140
|
-
welcome_info =
|
|
150
|
+
welcome_info =
|
|
151
|
+
"东风渐绿西湖柳,雁已还人未南归";
|
|
141
152
|
break;
|
|
142
153
|
default:
|
|
143
|
-
welcome_info =
|
|
154
|
+
welcome_info =
|
|
155
|
+
"望海楼明照曙霞,护江堤白蹋晴沙";
|
|
144
156
|
break;
|
|
145
157
|
}
|
|
146
158
|
break;
|
|
@@ -151,15 +163,18 @@ const elykia = {
|
|
|
151
163
|
welcome_info = "井邑白云间,岩城远带山";
|
|
152
164
|
break;
|
|
153
165
|
case "江西省":
|
|
154
|
-
welcome_info =
|
|
166
|
+
welcome_info =
|
|
167
|
+
"落霞与孤鹜齐飞,秋水共长天一色";
|
|
155
168
|
break;
|
|
156
169
|
case "山东省":
|
|
157
|
-
welcome_info =
|
|
170
|
+
welcome_info =
|
|
171
|
+
"遥望齐州九点烟,一泓海水杯中泻";
|
|
158
172
|
break;
|
|
159
173
|
case "湖北省":
|
|
160
174
|
switch (ipStore.result.ad_info.city) {
|
|
161
175
|
case "黄冈市":
|
|
162
|
-
welcome_info =
|
|
176
|
+
welcome_info =
|
|
177
|
+
"红安将军县!辈出将才!";
|
|
163
178
|
break;
|
|
164
179
|
default:
|
|
165
180
|
welcome_info = "来碗热干面~";
|
|
@@ -172,16 +187,19 @@ const elykia = {
|
|
|
172
187
|
case "广东省":
|
|
173
188
|
switch (ipStore.result.ad_info.city) {
|
|
174
189
|
case "广州市":
|
|
175
|
-
welcome_info =
|
|
190
|
+
welcome_info =
|
|
191
|
+
"看小蛮腰,喝早茶了嘛~";
|
|
176
192
|
break;
|
|
177
193
|
case "深圳市":
|
|
178
|
-
welcome_info =
|
|
194
|
+
welcome_info =
|
|
195
|
+
"今天你逛商场了嘛~";
|
|
179
196
|
break;
|
|
180
197
|
case "阳江市":
|
|
181
198
|
welcome_info = "阳春合水!";
|
|
182
199
|
break;
|
|
183
200
|
default:
|
|
184
|
-
welcome_info =
|
|
201
|
+
welcome_info =
|
|
202
|
+
"老板来两斤福建人";
|
|
185
203
|
break;
|
|
186
204
|
}
|
|
187
205
|
break;
|
|
@@ -189,7 +207,8 @@ const elykia = {
|
|
|
189
207
|
welcome_info = "桂林山水甲天下";
|
|
190
208
|
break;
|
|
191
209
|
case "海南省":
|
|
192
|
-
welcome_info =
|
|
210
|
+
welcome_info =
|
|
211
|
+
"朝观日出逐白浪,夕看云起收霞光";
|
|
193
212
|
break;
|
|
194
213
|
case "四川省":
|
|
195
214
|
welcome_info = "康康川妹子";
|
|
@@ -197,122 +216,189 @@ const elykia = {
|
|
|
197
216
|
case "贵州省":
|
|
198
217
|
switch (ipStore.result.ad_info.city) {
|
|
199
218
|
case "六盘水市":
|
|
200
|
-
welcome_info =
|
|
219
|
+
welcome_info =
|
|
220
|
+
"凉都六盘水,您好";
|
|
201
221
|
break;
|
|
202
222
|
case "贵阳市":
|
|
203
|
-
welcome_info =
|
|
223
|
+
welcome_info =
|
|
224
|
+
"爽爽贵阳,您好";
|
|
204
225
|
break;
|
|
205
226
|
case "遵义市":
|
|
206
|
-
welcome_info =
|
|
227
|
+
welcome_info =
|
|
228
|
+
"遵义红城,您好";
|
|
207
229
|
break;
|
|
208
230
|
case "安顺市":
|
|
209
|
-
welcome_info =
|
|
231
|
+
welcome_info =
|
|
232
|
+
"安顺福地,您好";
|
|
210
233
|
break;
|
|
211
234
|
case "毕节市":
|
|
212
|
-
welcome_info =
|
|
235
|
+
welcome_info =
|
|
236
|
+
"毕节山水,您好";
|
|
213
237
|
break;
|
|
214
238
|
case "铜仁市":
|
|
215
|
-
welcome_info =
|
|
239
|
+
welcome_info =
|
|
240
|
+
"铜仁梵净,您好";
|
|
216
241
|
break;
|
|
217
242
|
case "黔西南布依族苗族自治州":
|
|
218
|
-
welcome_info =
|
|
243
|
+
welcome_info =
|
|
244
|
+
"黔西南风情,您好";
|
|
219
245
|
break;
|
|
220
246
|
case "黔东南苗族侗族自治州":
|
|
221
|
-
welcome_info =
|
|
247
|
+
welcome_info =
|
|
248
|
+
"黔东南歌舞,您好";
|
|
222
249
|
break;
|
|
223
250
|
case "黔南布依族苗族自治州":
|
|
224
|
-
welcome_info =
|
|
251
|
+
welcome_info =
|
|
252
|
+
"黔南美景,您好";
|
|
225
253
|
break;
|
|
226
254
|
default:
|
|
227
|
-
welcome_info =
|
|
255
|
+
welcome_info =
|
|
256
|
+
"茅台,学生,再塞200";
|
|
228
257
|
break;
|
|
229
258
|
}
|
|
230
259
|
break;
|
|
231
260
|
case "云南省":
|
|
232
|
-
welcome_info =
|
|
261
|
+
welcome_info =
|
|
262
|
+
"玉龙飞舞云缠绕,万仞冰川直耸天";
|
|
233
263
|
break;
|
|
234
264
|
case "西藏自治区":
|
|
235
|
-
welcome_info =
|
|
265
|
+
welcome_info =
|
|
266
|
+
"躺在茫茫草原上,仰望蓝天";
|
|
236
267
|
break;
|
|
237
268
|
case "陕西省":
|
|
238
269
|
welcome_info = "来份臊子面加馍";
|
|
239
270
|
break;
|
|
240
271
|
case "甘肃省":
|
|
241
|
-
welcome_info =
|
|
272
|
+
welcome_info =
|
|
273
|
+
"羌笛何须怨杨柳,春风不度玉门关";
|
|
242
274
|
break;
|
|
243
275
|
case "青海省":
|
|
244
|
-
welcome_info =
|
|
276
|
+
welcome_info =
|
|
277
|
+
"牛肉干和老酸奶都好好吃";
|
|
245
278
|
break;
|
|
246
279
|
case "宁夏回族自治区":
|
|
247
|
-
welcome_info =
|
|
280
|
+
welcome_info =
|
|
281
|
+
"大漠孤烟直,长河落日圆";
|
|
248
282
|
break;
|
|
249
283
|
case "新疆维吾尔自治区":
|
|
250
|
-
welcome_info =
|
|
284
|
+
welcome_info =
|
|
285
|
+
"驼铃古道丝绸路,胡马犹闻唐汉风";
|
|
251
286
|
break;
|
|
252
287
|
case "台湾省":
|
|
253
|
-
welcome_info =
|
|
288
|
+
welcome_info =
|
|
289
|
+
"我在这头,大陆在那头";
|
|
254
290
|
break;
|
|
255
291
|
case "香港特别行政区":
|
|
256
292
|
address = "香港特别行政区";
|
|
257
|
-
welcome_info =
|
|
293
|
+
welcome_info =
|
|
294
|
+
"永定贼有残留地鬼嚎,迎击光非岁玉";
|
|
258
295
|
break;
|
|
259
296
|
case "澳门特别行政区":
|
|
260
297
|
address = "澳门特别行政区";
|
|
261
|
-
welcome_info =
|
|
298
|
+
welcome_info =
|
|
299
|
+
"性感荷官,在线发牌";
|
|
262
300
|
break;
|
|
263
301
|
case "河南省":
|
|
264
302
|
switch (ipStore.result.ad_info.city) {
|
|
265
303
|
case "郑州市":
|
|
266
|
-
welcome_info =
|
|
304
|
+
welcome_info =
|
|
305
|
+
"豫州之域,天地之中";
|
|
267
306
|
break;
|
|
268
307
|
case "南阳市":
|
|
269
|
-
welcome_info =
|
|
308
|
+
welcome_info =
|
|
309
|
+
"臣本布衣,躬耕于南阳此南阳非彼南阳!";
|
|
270
310
|
break;
|
|
271
311
|
case "驻马店市":
|
|
272
|
-
welcome_info =
|
|
312
|
+
welcome_info =
|
|
313
|
+
"峰峰有奇石,石石挟仙气嵖岈山的花很美哦!";
|
|
273
314
|
break;
|
|
274
315
|
case "开封市":
|
|
275
|
-
welcome_info =
|
|
316
|
+
welcome_info =
|
|
317
|
+
"刚正不阿包青天!";
|
|
276
318
|
break;
|
|
277
319
|
case "洛阳市":
|
|
278
|
-
welcome_info =
|
|
320
|
+
welcome_info =
|
|
321
|
+
"洛阳牡丹甲天下";
|
|
279
322
|
break;
|
|
280
323
|
case "平顶山市":
|
|
281
|
-
welcome_info =
|
|
324
|
+
welcome_info =
|
|
325
|
+
"QQ市~ 博主家乡~ 欢迎来玩~!";
|
|
282
326
|
break;
|
|
283
327
|
default:
|
|
284
|
-
welcome_info =
|
|
328
|
+
welcome_info =
|
|
329
|
+
"可否带我品尝河南烩面啦?";
|
|
285
330
|
break;
|
|
286
331
|
}
|
|
287
332
|
break;
|
|
288
333
|
default:
|
|
289
|
-
welcome_info =
|
|
334
|
+
welcome_info =
|
|
335
|
+
"带我去你的城市逛逛吧";
|
|
290
336
|
break;
|
|
291
337
|
}
|
|
292
338
|
break;
|
|
293
339
|
default:
|
|
294
|
-
welcome_info =
|
|
340
|
+
welcome_info =
|
|
341
|
+
"带我去你的国家看看吧";
|
|
295
342
|
break;
|
|
296
343
|
}
|
|
344
|
+
|
|
297
345
|
//判断时间
|
|
298
346
|
let timeChange,
|
|
299
347
|
date = new Date();
|
|
300
|
-
if (date.getHours() >= 5 && date.getHours() < 11)
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
else if (
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
348
|
+
if (date.getHours() >= 5 && date.getHours() < 11)
|
|
349
|
+
timeChange =
|
|
350
|
+
"<span>🌤️上午好,一日之计在于晨</span>";
|
|
351
|
+
else if (
|
|
352
|
+
date.getHours() >= 11 &&
|
|
353
|
+
date.getHours() < 13
|
|
354
|
+
)
|
|
355
|
+
timeChange =
|
|
356
|
+
"<span>☀️中午好,该摸鱼吃午饭了</span>";
|
|
357
|
+
else if (
|
|
358
|
+
date.getHours() >= 13 &&
|
|
359
|
+
date.getHours() < 15
|
|
360
|
+
)
|
|
361
|
+
timeChange =
|
|
362
|
+
"<span>🕞下午好,懒懒地睡个午觉吧</span>";
|
|
363
|
+
else if (
|
|
364
|
+
date.getHours() >= 15 &&
|
|
365
|
+
date.getHours() < 16
|
|
366
|
+
)
|
|
367
|
+
timeChange =
|
|
368
|
+
"<span>🍵三点几啦,饮茶先啦</span>";
|
|
369
|
+
else if (
|
|
370
|
+
date.getHours() >= 16 &&
|
|
371
|
+
date.getHours() < 18
|
|
372
|
+
)
|
|
373
|
+
timeChange =
|
|
374
|
+
"<span>🚶♂️即将下班,记得按时吃饭~</span>";
|
|
375
|
+
else if (
|
|
376
|
+
date.getHours() >= 18 &&
|
|
377
|
+
date.getHours() < 19
|
|
378
|
+
)
|
|
379
|
+
timeChange =
|
|
380
|
+
"<span>🌇夕阳无限好,只是近黄昏</span>";
|
|
381
|
+
else if (
|
|
382
|
+
date.getHours() >= 19 &&
|
|
383
|
+
date.getHours() < 24
|
|
384
|
+
)
|
|
385
|
+
timeChange =
|
|
386
|
+
"<span>🌔晚上好,夜生活嗨起来</span>";
|
|
387
|
+
else
|
|
388
|
+
timeChange =
|
|
389
|
+
"🌌夜深了,早点休息,少熬夜";
|
|
308
390
|
|
|
309
|
-
|
|
310
|
-
|
|
391
|
+
WelcomeInfo &&
|
|
392
|
+
(WelcomeInfo.innerHTML = `
|
|
311
393
|
欢迎来自 <strong>${address}</strong> 的小伙伴🍂<br>
|
|
312
394
|
<strong>${welcome_info}!</strong><br>
|
|
313
395
|
您距离 <strong>Elykia</strong> 约有 <strong>${dist}</strong> 公里!<br>
|
|
314
396
|
您的IP地址为:<strong>${IP}</strong><br>
|
|
315
397
|
<strong>${timeChange}!</strong>`);
|
|
316
398
|
},
|
|
317
|
-
}
|
|
399
|
+
};
|
|
318
400
|
|
|
401
|
+
// 页面加载后执行
|
|
402
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
403
|
+
elykia.setWelcome_info();
|
|
404
|
+
});
|
package/license
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
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
|
package/package.json
CHANGED
package/countdown.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
const CountdownTimer = (() => {
|
|
2
|
-
const config = {
|
|
3
|
-
targetDate: "2025-12-20",
|
|
4
|
-
targetName: "考研",
|
|
5
|
-
units: {
|
|
6
|
-
day: { text: "今日", divider: 1, unit: "小时" },
|
|
7
|
-
week: { text: "本周", divider: 24, unit: "天" },
|
|
8
|
-
month: { text: "本月", divider: 24, unit: "天" },
|
|
9
|
-
year: { text: "本年", divider: 24, unit: "天" }
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
function getTimeUnit(unit) {
|
|
14
|
-
const now = new Date();
|
|
15
|
-
const start = new Date(now.setHours(0, 0, 0, 0));
|
|
16
|
-
const end = new Date(now.setHours(23, 59, 59, 999));
|
|
17
|
-
|
|
18
|
-
if (unit === 'day') {
|
|
19
|
-
const currentHour = new Date().getHours();
|
|
20
|
-
const remaining = 24 - currentHour;
|
|
21
|
-
const percentage = (currentHour / 24) * 100;
|
|
22
|
-
|
|
23
|
-
return {
|
|
24
|
-
name: config.units[unit].text,
|
|
25
|
-
remaining: remaining,
|
|
26
|
-
percentage: percentage.toFixed(2),
|
|
27
|
-
unit: config.units[unit].unit
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const ranges = {
|
|
32
|
-
week: () => {
|
|
33
|
-
start.setDate(start.getDate() - start.getDay());
|
|
34
|
-
end.setDate(end.getDate() - end.getDay() + 6);
|
|
35
|
-
},
|
|
36
|
-
month: () => {
|
|
37
|
-
start.setDate(1);
|
|
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]?.();
|
|
46
|
-
|
|
47
|
-
const total = unit === "day" ? 24 : Math.floor((end - start) / 86400000) + 1;
|
|
48
|
-
const passed = Math.floor((now - start) / (3600000 * config.units[unit].divider));
|
|
49
|
-
const percentage = (passed / total) * 100;
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
name: config.units[unit].text,
|
|
53
|
-
remaining: total - passed,
|
|
54
|
-
percentage: percentage.toFixed(2),
|
|
55
|
-
unit: config.units[unit].unit
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function updateCountdown() {
|
|
60
|
-
const elements = ['eventName', 'eventDate', 'daysUntil', 'countRight']
|
|
61
|
-
.map(id => document.getElementById(id));
|
|
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);
|
|
68
|
-
|
|
69
|
-
eventName.textContent = config.targetName;
|
|
70
|
-
eventDate.textContent = config.targetDate;
|
|
71
|
-
daysUntil.textContent = daysRemaining;
|
|
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
|
-
}
|
|
86
|
-
|
|
87
|
-
function injectStyles() {
|
|
88
|
-
const styles = `
|
|
89
|
-
.card-countdown .item-content {
|
|
90
|
-
display: flex;
|
|
91
|
-
}
|
|
92
|
-
.cd-count-left {
|
|
93
|
-
position: relative;
|
|
94
|
-
display: flex;
|
|
95
|
-
flex-direction: column;
|
|
96
|
-
margin-right: 0.8rem;
|
|
97
|
-
line-height: 1.5;
|
|
98
|
-
align-items: center;
|
|
99
|
-
justify-content: center;
|
|
100
|
-
}
|
|
101
|
-
.cd-count-left .cd-text {
|
|
102
|
-
font-size: 14px;
|
|
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
|
-
`;
|
|
184
|
-
|
|
185
|
-
const styleSheet = document.createElement("style");
|
|
186
|
-
styleSheet.textContent = styles;
|
|
187
|
-
document.head.appendChild(styleSheet);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
let timer;
|
|
191
|
-
const start = () => {
|
|
192
|
-
injectStyles();
|
|
193
|
-
updateCountdown();
|
|
194
|
-
timer = setInterval(updateCountdown, 600000);
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
['pjax:complete', 'DOMContentLoaded'].forEach(event => document.addEventListener(event, start));
|
|
198
|
-
document.addEventListener('pjax:send', () => timer && clearInterval(timer));
|
|
199
|
-
|
|
200
|
-
return { start, stop: () => timer && clearInterval(timer) };
|
|
201
|
-
})();
|