时间轴模块 - Cordova与OpenHarmony混合开发实战
开源鸿蒙跨平台日记应用的时间轴模块实现了按时间顺序展示日记的功能。该模块通过Web层实现灵活的时间轴展示,利用OpenHarmony进行日期处理和数据聚合。主要功能包括:按月份分组日记数据、渲染时间轴界面、支持点击查看详情以及生成时间轴报告。Web层代码处理数据分组和界面渲染,原生层提供报告生成功能,两者通过Cordova框架进行通信,共同构建了一个直观的时间线浏览体验。
欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。
📌 概述
时间轴模块用于以时间顺序展示所有日记。这个模块提供了按时间排序的日记视图,用户可以直观地看到日记的时间分布。通过Cordova框架,我们能够在Web层实现灵活的时间轴展示,同时利用OpenHarmony的日期处理能力进行时间聚合。
时间轴模块采用了竖向时间线设计,每个日记显示为时间线上的一个节点,用户可以快速浏览日记的时间分布。
🔗 完整流程
数据加载流程:应用从数据库中加载所有日记,按日期倒序排列,然后按月份或年份进行分组。
时间轴渲染流程:应用将分组后的日记渲染为时间轴,每个月份或年份作为一个时间段,该时间段内的日记显示为时间线上的节点。
交互流程:用户可以点击时间线上的节点查看日记详情,或者点击时间段展开/收起该时间段的日记。
🔧 Web代码实现
// 按月份分组日记
function groupDiariesByMonth(diaries) {
const grouped = {};
diaries.forEach(diary => {
const date = new Date(diary.date);
const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
if (!grouped[monthKey]) {
grouped[monthKey] = [];
}
grouped[monthKey].push(diary);
});
return Object.entries(grouped)
.sort((a, b) => new Date(b[0]) - new Date(a[0]))
.map(([month, diaries]) => ({
month: month,
diaries: diaries.sort((a, b) => new Date(b.date) - new Date(a.date))
}));
}
// 加载时间轴数据
async function loadTimelineData() {
try {
const diaries = await db.getAllDiaries();
return groupDiariesByMonth(diaries);
} catch (error) {
console.error('加载时间轴失败:', error);
return [];
}
}
这些函数处理日记的分组和时间轴数据的加载。
// 渲染时间轴页面
async function renderTimeline() {
const timelineData = await loadTimelineData();
const html = `
<div class="timeline-container">
<div class="timeline-header">
<h1>时间轴</h1>
<p>按时间顺序浏览所有日记</p>
</div>
<div class="timeline">
${timelineData.map((monthGroup, index) => `
<div class="timeline-section">
<div class="timeline-month">
<h2>${formatMonthYear(monthGroup.month)}</h2>
<span class="diary-count">${monthGroup.diaries.length} 条日记</span>
</div>
<div class="timeline-items">
${monthGroup.diaries.map(diary => ` <div class="timeline-item" onclick="app.navigateTo('diary-edit', ${diary.id})"> <div class="timeline-dot"></div> <div class="timeline-content"> <h3>${diary.title}</h3> <p class="diary-date">${formatDate(diary.date)}</p> <p class="diary-excerpt">${diary.content.substring(0, 100)}...</p> <span class="pet-tag">${diary.petName}</span> </div> </div> `).join('')}
</div>
</div>
`).join('')}
</div>
</div>
`;
document.getElementById('page-container').innerHTML = html;
}
// 格式化月份年份
function formatMonthYear(monthKey) {
const [year, month] = monthKey.split('-');
const date = new Date(year, parseInt(month) - 1);
return date.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long' });
}
这个渲染函数生成了时间轴界面,按月份分组展示日记。
🔌 原生代码实现
// TimelinePlugin.ets - 时间轴原生插件
import { fileIo } from '@kit.BasicServicesKit';
@Entry
@Component
struct TimelinePlugin {
// 生成时间轴报告
generateTimelineReport(timelineData: string, callback: (path: string) => void): void {
try {
const data = JSON.parse(timelineData);
let report = '时间轴报告\n============\n';
data.forEach(monthGroup => {
report += `\n${monthGroup.month}: ${monthGroup.diaries.length} 条日记\n`;
});
report += `\n生成时间: ${new Date().toISOString()}`;
const reportPath = `/data/reports/timeline_${Date.now()}.txt`;
const file = fileIo.openSync(reportPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE);
fileIo.writeSync(file.fd, report);
fileIo.closeSync(file.fd);
callback(reportPath);
} catch (error) {
console.error('[TimelinePlugin] 生成报告失败:', error);
callback('');
}
}
build() {
Column() {
Web({ src: 'resource://rawfile/www/index.html', controller: new WebviewController() })
}
}
}
这个原生插件提供了时间轴报告生成功能。
Web-Native通信代码
// 生成时间轴报告
function generateNativeTimelineReport(timelineData) {
return new Promise((resolve, reject) => {
cordova.exec(
(path) => {
if (path) {
showSuccess(`报告已生成: ${path}`);
resolve(path);
} else {
reject(new Error('生成失败'));
}
},
(error) => {
console.error('生成失败:', error);
reject(error);
},
'TimelinePlugin',
'generateTimelineReport',
[JSON.stringify(timelineData)]
);
});
}
这段代码展示了如何通过Cordova调用原生的报告生成功能。
📝 总结
时间轴模块展示了Cordova与OpenHarmony在时间数据展示方面的应用。在Web层,我们实现了灵活的时间轴渲染和日期分组。在原生层,我们提供了报告生成功能。
通过时间轴视图,用户可以直观地看到日记的时间分布。通过月份分组,用户可以快速定位特定时间段的日记。通过Web-Native通信,我们能够充分利用OpenHarmony的文件系统能力,为用户提供完整的时间轴体验。
在实际开发中,建议实现时间轴的缩放功能,提供按年份或按周的分组选项,并支持时间轴的导出。
更多推荐




所有评论(0)