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 CHANGED
@@ -1,201 +1,182 @@
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
- };
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
- 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
- }
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
- 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]?.();
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
- 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;
48
+ // 更新倒计时
49
+ updateCountdown: () => {
50
+ const elements = ['eventName', 'eventDate', 'daysUntil', 'countRight']
51
+ .map(id => document.getElementById(id));
50
52
 
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
- }
53
+ if (elements.some(el => !el)) return;
58
54
 
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);
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
- 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
- }
59
+ eventName.textContent = config.targetName;
60
+ eventDate.textContent = config.targetDate;
61
+ daysUntil.textContent = daysRemaining;
86
62
 
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
- `;
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
- const styleSheet = document.createElement("style");
186
- styleSheet.textContent = styles;
187
- document.head.appendChild(styleSheet);
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
- 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
- })();
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 elykia = {
2
- // 欢迎语
3
- setWelcome_info: async () => {
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(elykia.setWelcome_info, 200);
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
- return new Promise((resolve, reject) => {
12
- var script = document.createElement('script');
13
- var url = `https://apis.map.qq.com/ws/location/v1/ip?key=TNLBZ-FS2LQ-4X257-4ACX6-OP673-62BFJ&output=jsonp&callback=QQmap`;
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
- elykia.showWelcome(data);
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
- //根据经纬度计算两点距离(点1经度,点1纬度,点2经度,点2纬度)
67
+ // 计算两点距离(单位:公里)
34
68
  getDistance: (e1, n1, e2, n2) => {
35
- const R = 6371
36
- const { sin, cos, asin, PI, hypot } = Math
37
- let getPoint = (e, n) => {
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
- let a = getPoint(e1, n1)
43
- let b = getPoint(e2, n2)
44
- let c = hypot(a.x - b.x, a.y - b.y, a.z - b.z)
45
- let r = asin(c / 2) * 2 * R
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
- IP = ipStore.result.ip || "未知";
53
- let dist = elykia.getDistance(
54
- 113.625000,
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
- let timeChange,
351
- date = new Date();
352
- if (date.getHours() >= 5 && date.getHours() < 11)
353
- timeChange =
354
- "<span>🌤️上午好,一日之计在于晨</span>";
355
- else if (
356
- date.getHours() >= 11 &&
357
- date.getHours() < 13
358
- )
359
- timeChange =
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
- WelcomeInfo &&
396
- (WelcomeInfo.innerHTML = `
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
- elykia.setWelcome_info();
356
+ elykiaWelcome.setWelcome();
408
357
  });
409
358
 
410
- // 支持 PJAX 页面切换
411
- document.addEventListener("pjax:complete", () => {
412
- elykia.setWelcome_info();
359
+ // 浏览器前进/后退
360
+ window.addEventListener("popstate", () => {
361
+ setTimeout(elykiaWelcome.setWelcome, 100);
413
362
  });
414
363
 
415
- // 支持其他可能的页面切换事件
416
- document.addEventListener("turbo:load", () => {
417
- elykia.setWelcome_info();
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 });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elykia",
3
- "version": "1.0.28",
3
+ "version": "1.0.29",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Elykia",