chore: sync local changes (2026-03-12)
This commit is contained in:
@@ -1,146 +1,146 @@
|
||||
// API 配置和数据获取模块
|
||||
class HotTopicsAPI {
|
||||
constructor() {
|
||||
this.apiUrl = 'https://60s.api.shumengya.top/v2/baidu/tieba';
|
||||
this.fallbackData = null;
|
||||
}
|
||||
|
||||
// 获取热搜数据
|
||||
async fetchHotTopics() {
|
||||
try {
|
||||
const response = await fetch(this.apiUrl, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
// 添加超时控制
|
||||
signal: AbortSignal.timeout(10000) // 10秒超时
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
// 验证数据格式
|
||||
if (!this.validateData(data)) {
|
||||
throw new Error('Invalid data format');
|
||||
}
|
||||
|
||||
// 缓存成功的数据作为备用
|
||||
this.fallbackData = data;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: data,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('API请求失败:', error);
|
||||
|
||||
// 如果有缓存数据,返回缓存数据
|
||||
if (this.fallbackData) {
|
||||
return {
|
||||
success: true,
|
||||
data: this.fallbackData,
|
||||
timestamp: new Date().toISOString(),
|
||||
isCache: true
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: false,
|
||||
error: error.message,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 验证数据格式
|
||||
validateData(data) {
|
||||
if (!data || typeof data !== 'object') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (data.code !== 200) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Array.isArray(data.data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数据项格式
|
||||
return data.data.every(item => {
|
||||
return item.rank &&
|
||||
item.title &&
|
||||
item.desc &&
|
||||
item.score_desc;
|
||||
});
|
||||
}
|
||||
|
||||
// 处理图片URL
|
||||
processImageUrl(url) {
|
||||
if (!url) return null;
|
||||
|
||||
// 处理百度贴吧图片URL的特殊字符
|
||||
try {
|
||||
return url.replace(/&/g, '&');
|
||||
} catch (error) {
|
||||
console.warn('图片URL处理失败:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 处理跳转URL
|
||||
processTopicUrl(url) {
|
||||
if (!url) return '#';
|
||||
|
||||
try {
|
||||
return url.replace(/&/g, '&');
|
||||
} catch (error) {
|
||||
console.warn('链接URL处理失败:', error);
|
||||
return '#';
|
||||
}
|
||||
}
|
||||
|
||||
// 格式化分数显示
|
||||
formatScore(score, scoreDesc) {
|
||||
if (scoreDesc) {
|
||||
return scoreDesc;
|
||||
}
|
||||
|
||||
if (typeof score === 'number') {
|
||||
if (score >= 10000) {
|
||||
return (score / 10000).toFixed(1) + 'w';
|
||||
}
|
||||
return score.toString();
|
||||
}
|
||||
|
||||
return '0';
|
||||
}
|
||||
|
||||
// 截断文本
|
||||
truncateText(text, maxLength = 100) {
|
||||
if (!text) return '';
|
||||
|
||||
if (text.length <= maxLength) {
|
||||
return text;
|
||||
}
|
||||
|
||||
return text.substring(0, maxLength) + '...';
|
||||
}
|
||||
|
||||
// 获取排名样式类
|
||||
getRankClass(rank) {
|
||||
if (rank === 1) return 'top-1';
|
||||
if (rank === 2) return 'top-2';
|
||||
if (rank === 3) return 'top-3';
|
||||
return 'normal';
|
||||
}
|
||||
}
|
||||
|
||||
// 导出API实例
|
||||
// API 配置和数据获取模块
|
||||
class HotTopicsAPI {
|
||||
constructor() {
|
||||
this.apiUrl = 'https://60s.api.shumengya.top/v2/baidu/tieba';
|
||||
this.fallbackData = null;
|
||||
}
|
||||
|
||||
// 获取热搜数据
|
||||
async fetchHotTopics() {
|
||||
try {
|
||||
const response = await fetch(this.apiUrl, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
// 添加超时控制
|
||||
signal: AbortSignal.timeout(10000) // 10秒超时
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
// 验证数据格式
|
||||
if (!this.validateData(data)) {
|
||||
throw new Error('Invalid data format');
|
||||
}
|
||||
|
||||
// 缓存成功的数据作为备用
|
||||
this.fallbackData = data;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: data,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('API请求失败:', error);
|
||||
|
||||
// 如果有缓存数据,返回缓存数据
|
||||
if (this.fallbackData) {
|
||||
return {
|
||||
success: true,
|
||||
data: this.fallbackData,
|
||||
timestamp: new Date().toISOString(),
|
||||
isCache: true
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: false,
|
||||
error: error.message,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 验证数据格式
|
||||
validateData(data) {
|
||||
if (!data || typeof data !== 'object') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (data.code !== 200) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Array.isArray(data.data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数据项格式
|
||||
return data.data.every(item => {
|
||||
return item.rank &&
|
||||
item.title &&
|
||||
item.desc &&
|
||||
item.score_desc;
|
||||
});
|
||||
}
|
||||
|
||||
// 处理图片URL
|
||||
processImageUrl(url) {
|
||||
if (!url) return null;
|
||||
|
||||
// 处理百度贴吧图片URL的特殊字符
|
||||
try {
|
||||
return url.replace(/&/g, '&');
|
||||
} catch (error) {
|
||||
console.warn('图片URL处理失败:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 处理跳转URL
|
||||
processTopicUrl(url) {
|
||||
if (!url) return '#';
|
||||
|
||||
try {
|
||||
return url.replace(/&/g, '&');
|
||||
} catch (error) {
|
||||
console.warn('链接URL处理失败:', error);
|
||||
return '#';
|
||||
}
|
||||
}
|
||||
|
||||
// 格式化分数显示
|
||||
formatScore(score, scoreDesc) {
|
||||
if (scoreDesc) {
|
||||
return scoreDesc;
|
||||
}
|
||||
|
||||
if (typeof score === 'number') {
|
||||
if (score >= 10000) {
|
||||
return (score / 10000).toFixed(1) + 'w';
|
||||
}
|
||||
return score.toString();
|
||||
}
|
||||
|
||||
return '0';
|
||||
}
|
||||
|
||||
// 截断文本
|
||||
truncateText(text, maxLength = 100) {
|
||||
if (!text) return '';
|
||||
|
||||
if (text.length <= maxLength) {
|
||||
return text;
|
||||
}
|
||||
|
||||
return text.substring(0, maxLength) + '...';
|
||||
}
|
||||
|
||||
// 获取排名样式类
|
||||
getRankClass(rank) {
|
||||
if (rank === 1) return 'top-1';
|
||||
if (rank === 2) return 'top-2';
|
||||
if (rank === 3) return 'top-3';
|
||||
return 'normal';
|
||||
}
|
||||
}
|
||||
|
||||
// 导出API实例
|
||||
const hotTopicsAPI = new HotTopicsAPI();
|
||||
Reference in New Issue
Block a user