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 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,32 +1,61 @@
1
- const elykia = {
2
- // 欢迎语
3
- setWelcome_info: async () => {
4
- console.log("welcome.js loaded and setWelcome_info called");
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
- console.log("welcome-info element not found, retrying in 200ms...");
9
- setTimeout(elykia.setWelcome_info, 200);
34
+ setTimeout(elykiaWelcome.setWelcome, 200);
10
35
  return;
11
36
  }
12
37
 
13
- console.log("welcome-info element found, proceeding with location fetch...");
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
- return new Promise((resolve, reject) => {
17
- var script = document.createElement('script');
18
- var url = `https://apis.map.qq.com/ws/location/v1/ip?key=TNLBZ-FS2LQ-4X257-4ACX6-OP673-62BFJ&output=jsonp&callback=QQmap`;
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
- elykia.showWelcome(data);
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
- //根据经纬度计算两点距离(点1经度,点1纬度,点2经度,点2纬度)
67
+ // 计算两点距离(单位:公里)
39
68
  getDistance: (e1, n1, e2, n2) => {
40
- const R = 6371
41
- const { sin, cos, asin, PI, hypot } = Math
42
- let getPoint = (e, n) => {
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
- let a = getPoint(e1, n1)
48
- let b = getPoint(e2, n2)
49
- let c = hypot(a.x - b.x, a.y - b.y, a.z - b.z)
50
- 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;
51
80
  return Math.round(r);
52
81
  },
53
82
 
54
- //根据国家、省份、城市信息自定义欢迎语
83
+ // 显示欢迎语
55
84
  showWelcome: (ipStore) => {
56
- const WelcomeInfo = document.getElementById("welcome-info"),
57
- IP = ipStore.result.ip || "未知";
58
- let dist = elykia.getDistance(
59
- 113.625000,
60
- 34.747201,
61
- ipStore.result.location.lng,
62
- ipStore.result.location.lat
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
- let timeChange,
356
- date = new Date();
357
- if (date.getHours() >= 5 && date.getHours() < 11)
358
- timeChange =
359
- "<span>🌤️上午好,一日之计在于晨</span>";
360
- else if (
361
- date.getHours() >= 11 &&
362
- date.getHours() < 13
363
- )
364
- timeChange =
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
- WelcomeInfo &&
401
- (WelcomeInfo.innerHTML = `
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
- elykia.setWelcome_info();
356
+ elykiaWelcome.setWelcome();
413
357
  });
414
358
 
415
- // 支持 PJAX 页面切换
416
- document.addEventListener("pjax:complete", () => {
417
- elykia.setWelcome_info();
359
+ // 浏览器前进/后退
360
+ window.addEventListener("popstate", () => {
361
+ setTimeout(elykiaWelcome.setWelcome, 100);
418
362
  });
419
363
 
420
- // 支持其他可能的页面切换事件
421
- document.addEventListener("turbo:load", () => {
422
- elykia.setWelcome_info();
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 });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elykia",
3
- "version": "1.0.27",
3
+ "version": "1.0.29",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Elykia",