class NewsApp {
constructor() {
this.newsContainer = document.getElementById('newsContainer');
this.loadingIndicator = document.getElementById('loadingIndicator');
this.endOfContent = document.getElementById('endOfContent');
this.startDateInput = document.getElementById('startDate');
this.endDateInput = document.getElementById('endDate');
this.refreshBtn = document.getElementById('refreshBtn');
this.currentStartDate = null;
this.currentEndDate = null;
this.isLoading = false;
this.hasMoreNews = true;
this.allNews = new Map(); // 用于存储所有新闻数据
this.init();
}
init() {
this.setupEventListeners();
this.initializeDates();
this.loadInitialNews();
this.setupInfiniteScroll();
}
setupEventListeners() {
// 刷新按钮点击事件
this.refreshBtn.addEventListener('click', () => {
this.refreshNews();
});
// 日期输入变化事件
this.startDateInput.addEventListener('change', () => {
this.updateDateRange();
});
this.endDateInput.addEventListener('change', () => {
this.updateDateRange();
});
}
initializeDates() {
const today = new Date();
const weekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
// 设置默认日期范围(最近一周)
this.currentEndDate = this.formatDate(today);
this.currentStartDate = this.formatDate(weekAgo);
this.startDateInput.value = this.currentStartDate;
this.endDateInput.value = this.currentEndDate;
}
formatDate(date) {
return date.toISOString().split('T')[0];
}
updateDateRange() {
const newStartDate = this.startDateInput.value;
const newEndDate = this.endDateInput.value;
if (newStartDate && newEndDate) {
if (new Date(newStartDate) > new Date(newEndDate)) {
alert('开始日期不能晚于结束日期');
return;
}
this.currentStartDate = newStartDate;
this.currentEndDate = newEndDate;
this.refreshNews();
}
}
async loadInitialNews() {
this.showLoading(true);
try {
const newsData = await this.fetchNews(this.currentStartDate, this.currentEndDate);
this.renderNews(newsData);
this.hasMoreNews = newsData.length > 0;
} catch (error) {
console.error('加载新闻失败:', error);
this.showError('加载新闻失败,请稍后重试');
} finally {
this.showLoading(false);
}
}
async refreshNews() {
this.allNews.clear();
this.newsContainer.innerHTML = '';
this.hasMoreNews = true;
this.endOfContent.classList.add('hidden');
await this.loadInitialNews();
}
async fetchNews(startDate, endDate) {
// 显示加载状态
this.showLoading(true);
try {
// 构建API URL - 请替换为您的实际API地址
const apiUrl = `https://api.doorcome.cn/api/xwlbNews/?start_date=${startDate}&end_date=${endDate}`;
console.log('Fetching news from:', apiUrl); // 调试日志
const response = await fetch(apiUrl, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
console.log('API Response:', result); // 调试日志
// 根据您的API返回格式调整
// 常见格式示例:
// 1. { "data": { "news": [...] } }
// 2. { "news": [...] }
// 3. [...] // 直接是数组
if (result.data && result.data.news) {
result.data.news.forEach(item => {
if (item.news_improve) {
item.news_improve = item.news_improve.replace(/\n/g, '
');
}
});
return result.data.news;
} else if (result.news) {
return result.news;
} else if (Array.isArray(result)) {
return result;
} else {
console.error('无法识别的API返回格式:', result);
return [];
}
} catch (error) {
console.error('API调用失败:', error);
this.showError('网络请求失败,请检查网络连接');
throw error;
} finally {
this.showLoading(false);
}
}
renderNews(newsData) {
// 按日期分组并排序
const groupedNews = this.groupNewsByDate(newsData);
groupedNews.forEach((dayNews, date) => {
// 如果该日期的新闻已经渲染过,则跳过
if (this.allNews.has(date)) {
return;
}
this.allNews.set(date, dayNews);
// 创建日期分组
const dateGroup = this.createDateGroup(date, dayNews);
this.newsContainer.appendChild(dateGroup);
// 添加淡入动画
anime({
targets: dateGroup,
opacity: [0, 1],
translateY: [20, 0],
duration: 600,
easing: 'easeOutQuart'
});
});
}
groupNewsByDate(newsData) {
const grouped = new Map();
// 按日期分组
newsData.forEach(news => {
const date = news.news_days;
if (!grouped.has(date)) {
grouped.set(date, []);
}
grouped.get(date).push(news);
});
// 按日期倒序排列
const sortedGrouped = new Map();
const sortedDates = Array.from(grouped.keys()).sort((a, b) => new Date(b) - new Date(a));
sortedDates.forEach(date => {
// 同一天的新闻按daily_sub_id排序
const dayNews = grouped.get(date).sort((a, b) => a.daily_sub_id - b.daily_sub_id);
sortedGrouped.set(date, dayNews);
});
return sortedGrouped;
}
createDateGroup(date, dayNews) {
const dateGroup = document.createElement('div');
dateGroup.className = 'mb-8';
// 日期标题
const dateHeader = document.createElement('div');
dateHeader.className = 'mb-4';
dateHeader.innerHTML = `
${news.news_improve}