-
📈
+
📊
年度进度
${lunarData.stats.percents_formatted.year}
diff --git a/frontend/60sapi/实用功能/哈希解压压缩/js/script.js b/frontend/60sapi/实用功能/哈希解压压缩/js/script.js
index 4427a177..6f846356 100644
--- a/frontend/60sapi/实用功能/哈希解压压缩/js/script.js
+++ b/frontend/60sapi/实用功能/哈希解压压缩/js/script.js
@@ -1,5 +1,5 @@
// API配置
-const API_BASE_URL = 'https://60s.viki.moe/v2/hash';
+const API_BASE_URL = 'https://60s.api.shumengya.top/v2/hash';
// DOM元素
const elements = {
diff --git a/frontend/60sapi/实用功能/实时天气/css/background.css b/frontend/60sapi/实用功能/天气预报/css/background.css
similarity index 100%
rename from frontend/60sapi/实用功能/实时天气/css/background.css
rename to frontend/60sapi/实用功能/天气预报/css/background.css
diff --git a/frontend/60sapi/实用功能/实时天气/css/style.css b/frontend/60sapi/实用功能/天气预报/css/style.css
similarity index 78%
rename from frontend/60sapi/实用功能/实时天气/css/style.css
rename to frontend/60sapi/实用功能/天气预报/css/style.css
index 8a1e29f0..f3d52bde 100644
--- a/frontend/60sapi/实用功能/实时天气/css/style.css
+++ b/frontend/60sapi/实用功能/天气预报/css/style.css
@@ -162,95 +162,6 @@ body {
font-size: 14px;
}
-/* 天气详情 */
-.weather-details {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 15px;
-}
-
-.detail-item {
- background: rgba(168, 213, 186, 0.1);
- padding: 15px;
- border-radius: 12px;
- text-align: center;
- border: 1px solid rgba(168, 213, 186, 0.2);
-}
-
-.detail-item .label {
- display: block;
- color: #666;
- font-size: 12px;
- margin-bottom: 5px;
- text-transform: uppercase;
- letter-spacing: 0.5px;
-}
-
-.detail-item span:last-child {
- color: #2d5a3d;
- font-weight: 600;
- font-size: 16px;
-}
-
-/* 生活指数 */
-.life-index {
- margin-top: 30px;
-}
-
-.life-index h3 {
- color: #2d5a3d;
- font-size: 1.5rem;
- margin-bottom: 20px;
- text-align: center;
-}
-
-.index-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
- gap: 20px;
-}
-
-.index-item {
- display: flex;
- align-items: center;
- background: rgba(168, 213, 186, 0.05);
- padding: 20px;
- border-radius: 15px;
- border: 1px solid rgba(168, 213, 186, 0.2);
- transition: all 0.3s ease;
-}
-
-.index-item:hover {
- background: rgba(168, 213, 186, 0.1);
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(168, 213, 186, 0.2);
-}
-
-.index-icon {
- font-size: 2rem;
- margin-right: 15px;
- width: 50px;
- text-align: center;
-}
-
-.index-content h4 {
- color: #2d5a3d;
- font-size: 16px;
- margin-bottom: 5px;
-}
-
-.index-content p {
- color: #6bb77b;
- font-weight: 600;
- margin-bottom: 3px;
-}
-
-.index-content span {
- color: #666;
- font-size: 13px;
- line-height: 1.4;
-}
-
/* 更新时间 */
.update-time {
text-align: center;
@@ -285,10 +196,6 @@ body {
font-size: 3.5rem;
}
- .weather-details {
- grid-template-columns: repeat(3, 1fr);
- }
-
.index-grid {
grid-template-columns: repeat(2, 1fr);
}
@@ -308,10 +215,6 @@ body {
justify-content: space-around;
}
- .weather-details {
- grid-template-columns: repeat(6, 1fr);
- }
-
.index-grid {
grid-template-columns: repeat(3, 1fr);
}
@@ -355,15 +258,6 @@ body {
font-size: 3rem;
}
- .weather-details {
- grid-template-columns: repeat(2, 1fr);
- gap: 10px;
- }
-
- .detail-item {
- padding: 12px;
- }
-
.index-grid {
grid-template-columns: 1fr;
gap: 15px;
@@ -398,12 +292,121 @@ body {
.temperature {
font-size: 2.5rem;
}
-
- .weather-details {
- grid-template-columns: 1fr;
+}
+
+/* 预报区域样式 */
+.forecast-section {
+ margin-top: 30px;
+ padding: 20px;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 20px;
+ backdrop-filter: blur(10px);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+}
+
+.forecast-section h3 {
+ color: #2d5a3d;
+ font-size: 1.5rem;
+ margin-bottom: 20px;
+ text-align: center;
+}
+
+.forecast-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 15px;
+}
+
+.forecast-item {
+ background: rgba(255, 255, 255, 0.8);
+ border-radius: 15px;
+ padding: 15px;
+ text-align: center;
+ border: 1px solid rgba(168, 213, 186, 0.3);
+ transition: all 0.3s ease;
+}
+
+.forecast-item:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+}
+
+.forecast-date {
+ font-weight: bold;
+ color: #2d5a3d;
+ margin-bottom: 10px;
+ font-size: 1.1rem;
+}
+
+.forecast-weather {
+ margin-bottom: 10px;
+}
+
+.weather-day {
+ color: #666;
+ font-size: 0.9rem;
+}
+
+.weather-night {
+ color: #888;
+ font-size: 0.85rem;
+}
+
+.forecast-temp {
+ margin-bottom: 10px;
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+}
+
+.temp-high {
+ color: #ff6b6b;
+ font-weight: bold;
+ font-size: 1.2rem;
+}
+
+.temp-low {
+ color: #4ecdc4;
+ font-size: 1rem;
+}
+
+.forecast-wind {
+ color: #666;
+ font-size: 0.85rem;
+ margin-bottom: 5px;
+}
+
+.forecast-humidity {
+ color: #888;
+ font-size: 0.8rem;
+}
+
+/* 预报区域响应式设计 */
+@media (max-width: 768px) {
+ .forecast-grid {
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ gap: 10px;
}
- .detail-item {
- padding: 10px;
+ .forecast-item {
+ padding: 12px;
+ }
+
+ .forecast-date {
+ font-size: 1rem;
+ }
+
+ .temp-high {
+ font-size: 1.1rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .forecast-section {
+ padding: 15px;
+ }
+
+ .forecast-grid {
+ grid-template-columns: repeat(2, 1fr);
}
}
\ No newline at end of file
diff --git a/frontend/60sapi/实用功能/天气预报/index.html b/frontend/60sapi/实用功能/天气预报/index.html
new file mode 100644
index 00000000..fac47523
--- /dev/null
+++ b/frontend/60sapi/实用功能/天气预报/index.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+
天气预报
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/60sapi/实用功能/实时天气/js/script.js b/frontend/60sapi/实用功能/天气预报/js/script.js
similarity index 55%
rename from frontend/60sapi/实用功能/实时天气/js/script.js
rename to frontend/60sapi/实用功能/天气预报/js/script.js
index a3aaacda..6361f580 100644
--- a/frontend/60sapi/实用功能/实时天气/js/script.js
+++ b/frontend/60sapi/实用功能/天气预报/js/script.js
@@ -2,11 +2,7 @@
class WeatherApp {
constructor() {
this.apiEndpoints = [
- 'https://60s-cf.viki.moe',
- 'https://60s.viki.moe',
- 'https://60s.b23.run',
- 'https://60s.114128.xyz',
- 'https://60s-cf.114128.xyz'
+ "https://60s.api.shumengya.top/v2/weather/forecast"
];
this.currentEndpointIndex = 0;
this.init();
@@ -74,7 +70,7 @@ class WeatherApp {
}
async fetchWeatherData(endpoint, city) {
- const url = `${endpoint}/v2/weather?query=${encodeURIComponent(city)}`;
+ const url = `${endpoint}?query=${encodeURIComponent(city)}`;
const response = await fetch(url, {
method: 'GET',
@@ -93,90 +89,61 @@ class WeatherApp {
}
displayWeatherData(data) {
- const { location, realtime } = data;
+ const { location, forecast } = data;
// 显示位置信息
document.getElementById('locationName').textContent = location.formatted;
document.getElementById('locationDetail').textContent =
`${location.province} ${location.city} | 邮编: ${location.zip_code}`;
- // 显示当前天气
- document.getElementById('temperature').textContent = realtime.temperature;
- document.getElementById('weatherCondition').textContent = realtime.weather;
+ // 使用第一天的预报数据作为当前天气(今天的天气)
+ const todayWeather = forecast[0];
- // 体感温度转换(API返回的是华氏度,需要转换为摄氏度)
- const feelsLikeCelsius = this.fahrenheitToCelsius(realtime.temperature_feels_like);
+ // 显示当前天气(使用今天的最高温度)
+ document.getElementById('temperature').textContent = todayWeather.temperature_high;
+ document.getElementById('weatherCondition').textContent =
+ `${todayWeather.weather_day} 转 ${todayWeather.weather_night}`;
+
+ // 体感温度(使用温度范围)
document.getElementById('feelsLike').textContent =
- `体感温度 ${feelsLikeCelsius}°C`;
+ `温度范围 ${todayWeather.temperature_low}°C - ${todayWeather.temperature_high}°C`;
- // 显示天气详情
- document.getElementById('humidity').textContent = `${realtime.humidity}%`;
- document.getElementById('windDirection').textContent = realtime.wind_direction;
- document.getElementById('windStrength').textContent = realtime.wind_strength;
- document.getElementById('pressure').textContent = `${realtime.pressure} hPa`;
- document.getElementById('visibility').textContent = realtime.visibility;
-
- // 空气质量显示
- const aqiElement = document.getElementById('aqi');
- aqiElement.textContent = `${realtime.aqi} (PM2.5: ${realtime.pm25})`;
- aqiElement.className = this.getAQIClass(realtime.aqi);
-
- // 显示生活指数
- const lifeIndex = realtime.life_index;
- this.displayLifeIndex('comfort', lifeIndex.comfort);
- this.displayLifeIndex('clothing', lifeIndex.clothing);
- this.displayLifeIndex('umbrella', lifeIndex.umbrella);
- this.displayLifeIndex('uv', lifeIndex.uv);
- this.displayLifeIndex('travel', lifeIndex.travel);
- this.displayLifeIndex('sport', lifeIndex.sport);
-
- // 显示更新时间
+ // 显示更新时间(使用当前时间)
document.getElementById('updateTime').textContent =
- `${realtime.updated} (${realtime.updated_at})`;
+ `${this.formatDate(new Date())} (基于预报数据)`;
+
+ // 显示天气预报
+ this.displayForecast(forecast);
this.showWeatherContainer();
}
- displayLifeIndex(type, indexData) {
- const levelElement = document.getElementById(`${type}Level`);
- const descElement = document.getElementById(`${type}Desc`);
+ displayForecast(forecast) {
+ const forecastGrid = document.getElementById('forecastGrid');
+ forecastGrid.innerHTML = '';
- if (levelElement && descElement && indexData) {
- levelElement.textContent = indexData.level;
- descElement.textContent = indexData.desc;
+ forecast.forEach((day, index) => {
+ const forecastItem = document.createElement('div');
+ forecastItem.className = 'forecast-item';
- // 根据指数级别设置颜色
- levelElement.className = this.getIndexLevelClass(indexData.level);
- }
- }
-
- getAQIClass(aqi) {
- if (aqi <= 50) return 'aqi-good';
- if (aqi <= 100) return 'aqi-moderate';
- if (aqi <= 150) return 'aqi-unhealthy-sensitive';
- if (aqi <= 200) return 'aqi-unhealthy';
- if (aqi <= 300) return 'aqi-very-unhealthy';
- return 'aqi-hazardous';
- }
-
- getIndexLevelClass(level) {
- const levelMap = {
- '优': 'level-excellent',
- '良': 'level-good',
- '适宜': 'level-suitable',
- '舒适': 'level-comfortable',
- '较适宜': 'level-fairly-suitable',
- '不宜': 'level-unsuitable',
- '较不宜': 'level-fairly-unsuitable',
- '带伞': 'level-bring-umbrella',
- '最弱': 'level-weakest',
- '弱': 'level-weak',
- '中等': 'level-moderate',
- '强': 'level-strong',
- '很强': 'level-very-strong'
- };
-
- return levelMap[level] || 'level-default';
+ forecastItem.innerHTML = `
+
${day.date_desc}
+
+
${day.weather_day}
+
${day.weather_night}
+
+
+ ${day.temperature_high}°
+ ${day.temperature_low}°
+
+
+
${day.wind_direction_day} ${day.wind_strength_day}
+
+
湿度: ${day.humidity}%
+ `;
+
+ forecastGrid.appendChild(forecastItem);
+ });
}
// 华氏度转摄氏度
@@ -185,6 +152,18 @@ class WeatherApp {
return Math.round(celsius * 10) / 10; // 保留一位小数
}
+ // 格式化时间
+ formatDate(date) {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ const seconds = String(date.getSeconds()).padStart(2, '0');
+
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+ }
+
showLoading() {
document.getElementById('loading').style.display = 'block';
document.getElementById('weatherContainer').style.display = 'none';
@@ -206,26 +185,6 @@ class WeatherApp {
}
}
-// 添加生活指数级别样式
-const style = document.createElement('style');
-style.textContent = `
- .aqi-good { color: #52c41a; }
- .aqi-moderate { color: #faad14; }
- .aqi-unhealthy-sensitive { color: #fa8c16; }
- .aqi-unhealthy { color: #f5222d; }
- .aqi-very-unhealthy { color: #a0206e; }
- .aqi-hazardous { color: #722ed1; }
-
- .level-excellent, .level-suitable, .level-comfortable { color: #52c41a; }
- .level-good, .level-fairly-suitable { color: #1890ff; }
- .level-bring-umbrella, .level-moderate { color: #faad14; }
- .level-unsuitable, .level-fairly-unsuitable { color: #f5222d; }
- .level-weakest, .level-weak { color: #52c41a; }
- .level-strong, .level-very-strong { color: #fa8c16; }
- .level-default { color: #666; }
-`;
-document.head.appendChild(style);
-
// 页面加载完成后初始化应用
document.addEventListener('DOMContentLoaded', () => {
new WeatherApp();
diff --git a/frontend/60sapi/实用功能/天气预报/接口集合.json b/frontend/60sapi/实用功能/天气预报/接口集合.json
new file mode 100644
index 00000000..178eeacc
--- /dev/null
+++ b/frontend/60sapi/实用功能/天气预报/接口集合.json
@@ -0,0 +1,3 @@
+[
+ "https://60s.api.shumengya.top/v2/weather/forecast"
+]
diff --git a/frontend/60sapi/实用功能/天气预报/返回接口.json b/frontend/60sapi/实用功能/天气预报/返回接口.json
new file mode 100644
index 00000000..7de58048
--- /dev/null
+++ b/frontend/60sapi/实用功能/天气预报/返回接口.json
@@ -0,0 +1,101 @@
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "location": {
+ "province": "北京",
+ "city": "北京",
+ "town": "北京",
+ "formatted": "北京",
+ "location_id": "101010100",
+ "detail_url": "http://www.weather.com.cn/weather/101010100.shtml",
+ "is_province": true,
+ "is_city": false,
+ "is_town": false,
+ "area_code": "10",
+ "zip_code": "100000"
+ },
+ "forecast": [
+ {
+ "date": "9/4",
+ "date_desc": "今天",
+ "weather_day": "多云",
+ "weather_night": "阴",
+ "weather_code_day": "01",
+ "weather_code_night": "02",
+ "temperature_high": 31,
+ "temperature_low": 21,
+ "wind_direction_day": "南风",
+ "wind_direction_night": "南风",
+ "wind_strength_day": "\u003C3级",
+ "wind_strength_night": "\u003C3级",
+ "rainfall": 96.1,
+ "humidity": 83
+ },
+ {
+ "date": "9/5",
+ "date_desc": "星期五",
+ "weather_day": "中雨",
+ "weather_night": "多云",
+ "weather_code_day": "08",
+ "weather_code_night": "01",
+ "temperature_high": 23,
+ "temperature_low": 19,
+ "wind_direction_day": "西南风",
+ "wind_direction_night": "北风",
+ "wind_strength_day": "\u003C3级",
+ "wind_strength_night": "\u003C3级",
+ "rainfall": 100,
+ "humidity": 68
+ },
+ {
+ "date": "9/6",
+ "date_desc": "星期六",
+ "weather_day": "多云",
+ "weather_night": "晴",
+ "weather_code_day": "01",
+ "weather_code_night": "00",
+ "temperature_high": 30,
+ "temperature_low": 19,
+ "wind_direction_day": "南风",
+ "wind_direction_night": "西南风",
+ "wind_strength_day": "\u003C3级",
+ "wind_strength_night": "\u003C3级",
+ "rainfall": 85.2,
+ "humidity": 36
+ },
+ {
+ "date": "9/7",
+ "date_desc": "星期日",
+ "weather_day": "多云",
+ "weather_night": "晴",
+ "weather_code_day": "01",
+ "weather_code_night": "00",
+ "temperature_high": 29,
+ "temperature_low": 20,
+ "wind_direction_day": "北风",
+ "wind_direction_night": "北风",
+ "wind_strength_day": "\u003C3级",
+ "wind_strength_night": "\u003C3级",
+ "rainfall": 87.3,
+ "humidity": 27
+ },
+ {
+ "date": "9/8",
+ "date_desc": "星期一",
+ "weather_day": "多云",
+ "weather_night": "多云",
+ "weather_code_day": "01",
+ "weather_code_night": "01",
+ "temperature_high": 28,
+ "temperature_low": 20,
+ "wind_direction_day": "南风",
+ "wind_direction_night": "南风",
+ "wind_strength_day": "\u003C3级",
+ "wind_strength_night": "\u003C3级",
+ "rainfall": 84.8,
+ "humidity": 41
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/frontend/60sapi/实用功能/实时天气/index.html b/frontend/60sapi/实用功能/实时天气/index.html
deleted file mode 100644
index 474571a4..00000000
--- a/frontend/60sapi/实用功能/实时天气/index.html
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
实时天气查询
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 湿度
-
-
-
- 风向
-
-
-
- 风力
-
-
-
- 气压
-
-
-
- 能见度
-
-
-
- 空气质量
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/60sapi/实用功能/实时天气/接口集合.json b/frontend/60sapi/实用功能/实时天气/接口集合.json
deleted file mode 100644
index 547b2771..00000000
--- a/frontend/60sapi/实用功能/实时天气/接口集合.json
+++ /dev/null
@@ -1,3 +0,0 @@
-[
- "https://60s.api.shumengya.top"
-]
diff --git a/frontend/60sapi/实用功能/实时天气/返回接口.json b/frontend/60sapi/实用功能/实时天气/返回接口.json
deleted file mode 100644
index a0243aa1..00000000
--- a/frontend/60sapi/实用功能/实时天气/返回接口.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "code": 200,
- "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
- "data": {
- "location": {
- "province": "北京",
- "city": "北京",
- "town": "北京",
- "formatted": "北京",
- "location_id": "101010100",
- "detail_url": "http://www.weather.com.cn/weather/101010100.shtml",
- "is_province": true,
- "is_city": false,
- "is_town": false,
- "area_code": "10",
- "zip_code": "100000"
- },
- "realtime": {
- "weather": "小雨转多云",
- "weather_desc": "未知",
- "weather_code": "d7",
- "temperature": 26,
- "temperature_feels_like": 81.1,
- "humidity": 78,
- "wind_direction": "南风转北风",
- "wind_strength": "\u003C3级",
- "wind_speed": "5km/h",
- "pressure": 1008,
- "visibility": "8km",
- "aqi": 37,
- "pm25": 37,
- "rainfall": 0,
- "rainfall_24h": 0,
- "updated": "2025-08-29 08:00:00",
- "updated_at": "15:10",
- "life_index": {
- "comfort": {
- "level": "舒适",
- "desc": "白天温度宜人,风力不大。"
- },
- "clothing": {
- "level": "舒适",
- "desc": "建议穿长袖衬衫单裤等服装。"
- },
- "umbrella": {
- "level": "带伞",
- "desc": "有降水,带雨伞,短期外出可收起雨伞。"
- },
- "uv": {
- "level": "最弱",
- "desc": "辐射弱,涂擦SPF8-12防晒护肤品。"
- },
- "car_wash": {
- "level": "不宜",
- "desc": "有雨,雨水和泥水会弄脏爱车。"
- },
- "travel": {
- "level": "适宜",
- "desc": "较弱降水和微风将伴您共赴旅程。"
- },
- "sport": {
- "level": "较不宜",
- "desc": "有降水,推荐您在室内进行休闲运动。"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/60sapi/实用功能/生成二维码/js/script.js b/frontend/60sapi/实用功能/生成二维码/js/script.js
index f09ff5a6..1b17ffe6 100644
--- a/frontend/60sapi/实用功能/生成二维码/js/script.js
+++ b/frontend/60sapi/实用功能/生成二维码/js/script.js
@@ -16,8 +16,10 @@ class QRCodeGenerator {
// 加载API接口列表
async loadApiEndpoints() {
try {
- const response = await fetch('./接口集合.json');
- this.apiEndpoints = await response.json();
+ // 直接在代码中配置API接口,避免CORS问题
+ this.apiEndpoints = [
+ "https://60s.api.shumengya.top"
+ ];
console.log('已加载API接口:', this.apiEndpoints);
} catch (error) {
console.error('加载API接口失败:', error);
@@ -32,16 +34,26 @@ class QRCodeGenerator {
const downloadBtn = document.querySelector('.download-btn');
const copyBtn = document.querySelector('.copy-btn');
const newBtn = document.querySelector('.new-btn');
-
- form.addEventListener('submit', (e) => this.handleSubmit(e));
- retryBtn.addEventListener('click', () => this.retryGeneration());
- downloadBtn.addEventListener('click', () => this.downloadQRCode());
- copyBtn.addEventListener('click', () => this.copyImageLink());
- newBtn.addEventListener('click', () => this.resetForm());
-
- // 实时字符计数
const textArea = document.getElementById('text');
- textArea.addEventListener('input', () => this.updateCharCount());
+
+ if (form) {
+ form.addEventListener('submit', (e) => this.handleSubmit(e));
+ }
+ if (retryBtn) {
+ retryBtn.addEventListener('click', () => this.retryGeneration());
+ }
+ if (downloadBtn) {
+ downloadBtn.addEventListener('click', () => this.downloadQRCode());
+ }
+ if (copyBtn) {
+ copyBtn.addEventListener('click', () => this.copyImageLink());
+ }
+ if (newBtn) {
+ newBtn.addEventListener('click', () => this.resetForm());
+ }
+ if (textArea) {
+ textArea.addEventListener('input', () => this.updateCharCount());
+ }
}
// 设置表单验证
@@ -162,7 +174,7 @@ class QRCodeGenerator {
// 添加查询参数
Object.entries(params).forEach(([key, value]) => {
- if (value) {
+ if (value !== null && value !== undefined && value !== '') {
url.searchParams.append(key, value);
}
});
@@ -188,20 +200,44 @@ class QRCodeGenerator {
}
// 根据返回格式处理
- if (params.encoding === 'image') {
- const blob = await response.blob();
- const imageUrl = URL.createObjectURL(blob);
- return {
- success: true,
- data: {
- imageUrl: imageUrl,
- text: params.text,
- size: params.size,
- level: params.level,
- format: 'image'
+ if (params.encoding === 'image' || !params.encoding) {
+ // 默认返回图片格式
+ const contentType = response.headers.get('content-type');
+ if (contentType && contentType.startsWith('image/')) {
+ const blob = await response.blob();
+ const imageUrl = URL.createObjectURL(blob);
+ return {
+ success: true,
+ data: {
+ imageUrl: imageUrl,
+ text: params.text,
+ size: params.size,
+ level: params.level,
+ format: 'image'
+ }
+ };
+ } else {
+ // 如果返回的不是图片,尝试解析JSON
+ const jsonData = await response.json();
+ if (jsonData.code === 0 && jsonData.data && jsonData.data.data_uri) {
+ return {
+ success: true,
+ data: {
+ imageUrl: jsonData.data.data_uri,
+ text: params.text,
+ size: params.size,
+ level: params.level,
+ format: 'json',
+ base64: jsonData.data.base64,
+ mimeType: jsonData.data.mime_type
+ }
+ };
+ } else {
+ throw new Error(jsonData.message || '生成失败');
}
- };
+ }
} else {
+ // JSON或text格式
const jsonData = await response.json();
if (jsonData.code === 0 && jsonData.data) {
return {
@@ -211,7 +247,7 @@ class QRCodeGenerator {
text: params.text,
size: params.size,
level: params.level,
- format: 'json',
+ format: params.encoding,
base64: jsonData.data.base64,
mimeType: jsonData.data.mime_type
}
diff --git a/frontend/60sapi/实用功能/生成二维码/返回接口.json b/frontend/60sapi/实用功能/生成二维码/返回接口.json
deleted file mode 100644
index 8cea87e9..00000000
--- a/frontend/60sapi/实用功能/生成二维码/返回接口.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "code": 0,
- "message": "success",
- "data": {
- "base64": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z15fBTV...",
- "data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z15fBTV...",
- "mime_type": "image/png",
- "text": "https://example.com"
- }
-}
\ No newline at end of file
diff --git a/frontend/60sapi/实用功能/百度百科词条/js/script.js b/frontend/60sapi/实用功能/百度百科词条/js/script.js
index 6dbc4939..20a423bf 100644
--- a/frontend/60sapi/实用功能/百度百科词条/js/script.js
+++ b/frontend/60sapi/实用功能/百度百科词条/js/script.js
@@ -3,11 +3,7 @@ class BaikeApp {
constructor() {
// API接口列表
this.apiEndpoints = [
- 'https://60s-cf.viki.moe',
- 'https://60s.viki.moe',
- 'https://60s.b23.run',
- 'https://60s.114128.xyz',
- 'https://60s-cf.114128.xyz'
+ 'https://60s.api.shumengya.top',
];
this.currentApiIndex = 0;
diff --git a/frontend/60sapi/实用功能/链接OG信息/js/script.js b/frontend/60sapi/实用功能/链接OG信息/js/script.js
index 73ccaa00..f7059a9c 100644
--- a/frontend/60sapi/实用功能/链接OG信息/js/script.js
+++ b/frontend/60sapi/实用功能/链接OG信息/js/script.js
@@ -3,7 +3,7 @@
class OGAnalyzer {
constructor() {
- this.apiUrl = 'https://60s.viki.moe/v2/og';
+ this.apiUrl = 'https://60s.api.shumengya.top/v2/og';
this.isAnalyzing = false;
this.currentUrl = '';
this.animationFrameId = null;
diff --git a/frontend/60sapi/日更资讯/历史上的今天/js/script.js b/frontend/60sapi/日更资讯/历史上的今天/js/script.js
index 986eac74..bb0ca469 100644
--- a/frontend/60sapi/日更资讯/历史上的今天/js/script.js
+++ b/frontend/60sapi/日更资讯/历史上的今天/js/script.js
@@ -13,7 +13,7 @@ const API = {
this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/today_in_history`);
} catch (e) {
// 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.viki.moe/v2/today_in_history'];
+ this.endpoints = ['https://60s.api.shumengya.top/v2/today_in_history'];
}
},
// 获取当前接口URL
diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js b/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js
index 9e231288..35ac3881 100644
--- a/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js
+++ b/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js
@@ -15,7 +15,7 @@ const API = {
this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/bing`);
} catch (e) {
// 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.viki.moe/v2/bing'];
+ this.endpoints = ['https://60s.api.shumengya.top/v2/bing'];
}
},
// 获取当前接口URL
diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json b/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json
index 04e92b7f..547b2771 100644
--- a/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json
+++ b/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json
@@ -1,7 +1,3 @@
[
- "https://60s-cf.viki.moe",
- "https://60s.viki.moe",
- "https://60s.b23.run",
- "https://60s.114128.xyz",
- "https://60s-cf.114128.xyz"
+ "https://60s.api.shumengya.top"
]
diff --git a/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js b/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js
index 63c2d19f..a8d48404 100644
--- a/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js
+++ b/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js
@@ -15,7 +15,7 @@ const API = {
this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/60s`);
} catch (e) {
// 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.viki.moe/v2/60s'];
+ this.endpoints = ['https://60s.api.shumengya.top/v2/60s'];
}
},
// 获取当前接口URL
diff --git a/frontend/60sapi/日更资讯/每日国际汇率/js/script.js b/frontend/60sapi/日更资讯/每日国际汇率/js/script.js
index d7d217b3..4f820299 100644
--- a/frontend/60sapi/日更资讯/每日国际汇率/js/script.js
+++ b/frontend/60sapi/日更资讯/每日国际汇率/js/script.js
@@ -14,7 +14,7 @@ const API = {
this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/exchange_rate`);
} catch (e) {
// 如果无法加载接口集合,使用默认接口
- this.endpoints = ['https://60s.viki.moe/v2/exchange_rate'];
+ this.endpoints = ['https://60s.api.shumengya.top/v2/exchange_rate'];
}
},
// 获取当前接口URL
diff --git a/frontend/60sapi/热搜榜单/Hacker News 榜单/css/style.css b/frontend/60sapi/热搜榜单/Hacker News 榜单/css/style.css
index bfbfae9c..fe482a48 100644
--- a/frontend/60sapi/热搜榜单/Hacker News 榜单/css/style.css
+++ b/frontend/60sapi/热搜榜单/Hacker News 榜单/css/style.css
@@ -109,14 +109,20 @@ body {
backdrop-filter: blur(10px);
}
-header {
+header, .header {
text-align: center;
margin-bottom: 28px;
padding-bottom: 20px;
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
}
-header h1 {
+.header-icon {
+ font-size: 3rem;
+ margin-bottom: 10px;
+ display: block;
+}
+
+header h1, .title {
background: linear-gradient(135deg, #4096ff, #ff7a45);
-webkit-background-clip: text;
background-clip: text;
@@ -127,6 +133,82 @@ header h1 {
letter-spacing: -0.5px;
}
+.subtitle {
+ color: #666;
+ font-size: 1.1rem;
+ margin-bottom: 20px;
+ font-weight: 400;
+}
+
+.tab-container {
+ display: flex;
+ justify-content: center;
+ gap: 12px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.tab-btn {
+ background: linear-gradient(135deg, #f0f0f0, #e8e8e8);
+ border: none;
+ padding: 12px 20px;
+ border-radius: 25px;
+ cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 500;
+ color: #666;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.tab-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.tab-btn.active {
+ background: linear-gradient(135deg, #4096ff, #40a9ff);
+ color: white;
+ box-shadow: 0 4px 16px rgba(64, 150, 255, 0.3);
+}
+
+.tab-icon {
+ font-size: 1.1rem;
+}
+
+.refresh-btn {
+ background: linear-gradient(135deg, #52c41a, #73d13d);
+ border: none;
+ padding: 12px 24px;
+ border-radius: 25px;
+ color: white;
+ cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 500;
+ margin-top: 15px;
+ transition: all 0.3s ease;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ box-shadow: 0 4px 12px rgba(82, 196, 26, 0.3);
+}
+
+.refresh-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 16px rgba(82, 196, 26, 0.4);
+}
+
+.btn-icon {
+ font-size: 1.1rem;
+}
+
+.time-icon {
+ margin-right: 6px;
+}
+
.update-time {
color: #666;
font-size: 0.9rem;
@@ -215,6 +297,331 @@ header h1 {
padding: 40px;
color: #666;
font-size: 1.1rem;
+ display: none;
+}
+
+.loading-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+}
+
+.rainbow-spinner {
+ width: 50px;
+ height: 50px;
+ border: 4px solid transparent;
+ border-top: 4px solid #4096ff;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3, #54a0ff, #5f27cd);
+ background-size: 400% 400%;
+ animation: spin 1s linear infinite, rainbowGradient 3s ease infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading-text {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 10px;
+}
+
+.loading-emoji {
+ font-size: 2rem;
+ animation: bounce 1.5s ease-in-out infinite;
+}
+
+@keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {
+ transform: translateY(0);
+ }
+ 40% {
+ transform: translateY(-10px);
+ }
+ 60% {
+ transform: translateY(-5px);
+ }
+}
+
+.loading-dots {
+ display: flex;
+ gap: 4px;
+}
+
+.loading-dots span {
+ width: 8px;
+ height: 8px;
+ background: #4096ff;
+ border-radius: 50%;
+ animation: loadingDots 1.4s ease-in-out infinite both;
+}
+
+.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
+.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
+.loading-dots span:nth-child(3) { animation-delay: 0s; }
+
+@keyframes loadingDots {
+ 0%, 80%, 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+
+.news-list {
+ margin-top: 20px;
+}
+
+/* 新闻项目卡片 - 移动端优先设计 */
+.news-item {
+ background: white;
+ border-radius: 16px;
+ padding: 16px;
+ margin-bottom: 12px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+ transition: all 0.3s ease;
+ border: 1px solid rgba(0, 0, 0, 0.05);
+ display: flex;
+ gap: 12px;
+ position: relative;
+ overflow: hidden;
+}
+
+.news-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
+ border-color: rgba(64, 169, 255, 0.2);
+}
+
+/* 排名容器 */
+.news-rank-container {
+ flex-shrink: 0;
+ display: flex;
+ align-items: flex-start;
+ padding-top: 2px;
+}
+
+.news-rank {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 48px;
+ height: 48px;
+ border-radius: 12px;
+ background: linear-gradient(135deg, #f0f0f0, #e8e8e8);
+ color: #666;
+ font-weight: 600;
+ position: relative;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.news-rank.rank-1 {
+ background: linear-gradient(135deg, #ff4d4f, #ff7a45);
+ color: white;
+ box-shadow: 0 4px 12px rgba(255, 77, 79, 0.3);
+}
+
+.news-rank.rank-2 {
+ background: linear-gradient(135deg, #ff7a45, #ffa940);
+ color: white;
+ box-shadow: 0 4px 12px rgba(255, 122, 69, 0.3);
+}
+
+.news-rank.rank-3 {
+ background: linear-gradient(135deg, #ffa940, #ffec3d);
+ color: #333;
+ box-shadow: 0 4px 12px rgba(255, 169, 64, 0.3);
+}
+
+.rank-number {
+ font-size: 0.9rem;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.rank-emoji {
+ font-size: 0.7rem;
+ line-height: 1;
+ margin-top: 1px;
+}
+
+/* 内容包装器 */
+.news-content-wrapper {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+/* 标题 */
+.news-title {
+ font-size: 1rem;
+ font-weight: 600;
+ color: #333;
+ line-height: 1.4;
+ margin: 0;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ cursor: pointer;
+ transition: color 0.2s ease;
+}
+
+.news-title:hover {
+ color: #4096ff;
+}
+
+/* 元信息行 */
+.news-meta-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+
+.news-author, .news-time {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ color: #666;
+ font-size: 0.8rem;
+ flex: 1;
+ min-width: 0;
+}
+
+.meta-icon {
+ font-size: 0.9rem;
+ flex-shrink: 0;
+}
+
+.meta-text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* 统计信息行 */
+.news-stats-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 12px;
+ margin-top: 4px;
+}
+
+.news-score {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: linear-gradient(135deg, #ff6b6b, #4ecdc4);
+ color: white;
+ padding: 4px 10px;
+ border-radius: 12px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
+}
+
+.heat-level {
+ font-size: 0.8rem;
+}
+
+.score-text {
+ font-size: 0.75rem;
+}
+
+.news-link {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: linear-gradient(135deg, #4096ff, #40a9ff);
+ color: white;
+ text-decoration: none;
+ padding: 6px 12px;
+ border-radius: 12px;
+ font-size: 0.75rem;
+ font-weight: 600;
+ transition: all 0.3s ease;
+ box-shadow: 0 2px 6px rgba(64, 150, 255, 0.3);
+ flex-shrink: 0;
+}
+
+.news-link:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 10px rgba(64, 150, 255, 0.4);
+ text-decoration: none;
+ color: white;
+}
+
+.link-icon {
+ font-size: 0.8rem;
+}
+
+.link-text {
+ font-size: 0.75rem;
+}
+
+.error-message {
+ text-align: center;
+ padding: 40px;
+ background: white;
+ border-radius: 12px;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
+}
+
+.error-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 16px;
+}
+
+.error-icon {
+ font-size: 3rem;
+}
+
+.error-content h3 {
+ color: #ff4d4f;
+ margin: 0;
+ font-size: 1.3rem;
+}
+
+.error-content p {
+ color: #666;
+ margin: 0;
+ font-size: 1rem;
+}
+
+.retry-btn {
+ background: linear-gradient(135deg, #ff4d4f, #ff7a45);
+ border: none;
+ padding: 12px 24px;
+ border-radius: 25px;
+ color: white;
+ cursor: pointer;
+ font-size: 0.95rem;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ box-shadow: 0 4px 12px rgba(255, 77, 79, 0.3);
+}
+
+.retry-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 16px rgba(255, 77, 79, 0.4);
}
footer {
@@ -226,7 +633,7 @@ footer {
font-size: 0.9rem;
}
-/* 响应式设计 */
+/* 响应式设计 - 移动端优化 */
@media (max-width: 1024px) and (min-width: 768px) {
.container {
max-width: 90%;
@@ -254,20 +661,40 @@ footer {
.container {
max-width: 95%;
margin: 12px auto;
- padding: 16px;
+ padding: 8px;
border-radius: 12px;
}
- header {
+ header, .header {
margin-bottom: 20px;
- padding-bottom: 16px;
+ padding: 12px 0 16px 0;
}
- header h1 {
- font-size: 1.8rem;
+ header h1, .title {
+ font-size: 1.6rem;
margin-bottom: 10px;
}
+ .subtitle {
+ font-size: 0.85rem;
+ }
+
+ .tab-container {
+ gap: 8px;
+ margin: 16px 0;
+ }
+
+ .tab-btn {
+ padding: 8px 12px;
+ font-size: 0.8rem;
+ min-width: auto;
+ }
+
+ .refresh-btn {
+ padding: 8px 10px;
+ font-size: 0.8rem;
+ }
+
.update-time {
font-size: 0.85rem;
padding: 6px 12px;
@@ -296,6 +723,52 @@ footer {
margin-bottom: 6px;
}
+ .news-item {
+ padding: 12px;
+ margin-bottom: 10px;
+ gap: 10px;
+ }
+
+ .news-rank {
+ width: 40px;
+ height: 40px;
+ }
+
+ .rank-number {
+ font-size: 0.8rem;
+ }
+
+ .rank-emoji {
+ font-size: 0.6rem;
+ }
+
+ .news-title {
+ font-size: 0.9rem;
+ line-height: 1.3;
+ }
+
+ .news-meta-row {
+ gap: 8px;
+ }
+
+ .news-author, .news-time {
+ font-size: 0.75rem;
+ }
+
+ .news-score {
+ padding: 3px 8px;
+ font-size: 0.7rem;
+ }
+
+ .news-link {
+ padding: 5px 10px;
+ font-size: 0.7rem;
+ }
+
+ .link-text {
+ font-size: 0.7rem;
+ }
+
footer {
margin-top: 24px;
padding-top: 16px;
@@ -306,10 +779,10 @@ footer {
@media (max-width: 480px) {
.container {
margin: 8px auto;
- padding: 14px;
+ padding: 6px;
}
- header h1 {
+ header h1, .title {
font-size: 1.6rem;
}
@@ -329,6 +802,47 @@ footer {
.hot-title {
font-size: 0.95rem;
}
+
+ .news-item {
+ padding: 10px;
+ gap: 8px;
+ }
+
+ .news-rank {
+ width: 36px;
+ height: 36px;
+ }
+
+ .rank-number {
+ font-size: 0.75rem;
+ }
+
+ .news-title {
+ font-size: 0.85rem;
+ }
+
+ .news-meta-row {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 6px;
+ }
+
+ .news-stats-row {
+ gap: 8px;
+ }
+
+ .news-author, .news-time {
+ font-size: 0.7rem;
+ }
+
+ .news-score {
+ font-size: 0.65rem;
+ }
+
+ .news-link {
+ font-size: 0.65rem;
+ padding: 4px 8px;
+ }
}
/* 减少动画以节省电池 */
diff --git a/frontend/60sapi/热搜榜单/Hacker News 榜单/js/script.js b/frontend/60sapi/热搜榜单/Hacker News 榜单/js/script.js
index 33d90bed..b9b4caa5 100644
--- a/frontend/60sapi/热搜榜单/Hacker News 榜单/js/script.js
+++ b/frontend/60sapi/热搜榜单/Hacker News 榜单/js/script.js
@@ -1,10 +1,6 @@
// API接口列表
const API_ENDPOINTS = [
- "https://60s-cf.viki.moe",
- "https://60s.viki.moe",
- "https://60s.b23.run",
- "https://60s.114128.xyz",
- "https://60s-cf.114128.xyz"
+ "https://60s.api.shumengya.top",
];
// 当前使用的API索引
@@ -118,7 +114,7 @@ function createNewsItem(item, rank) {
const newsItem = document.createElement('div');
newsItem.className = 'news-item';
- const rankClass = rank <= 5 ? 'news-rank top-5' : 'news-rank';
+ const rankClass = rank <= 3 ? `news-rank rank-${rank}` : 'news-rank';
const formattedScore = formatScore(item.score);
const formattedTime = formatTime(item.created);
@@ -127,8 +123,6 @@ function createNewsItem(item, rank) {
if (rank === 1) rankEmoji = '🏆';
else if (rank === 2) rankEmoji = '🥈';
else if (rank === 3) rankEmoji = '🥉';
- else if (rank <= 10) rankEmoji = '💎';
- else rankEmoji = '⭐';
// 根据评分添加热度指示
let heatLevel = '';
@@ -138,18 +132,35 @@ function createNewsItem(item, rank) {
else heatLevel = '💫';
newsItem.innerHTML = `
-