欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

请添加图片描述

📌 概述

时间轴模块用于以时间顺序展示所有日记。这个模块提供了按时间排序的日记视图,用户可以直观地看到日记的时间分布。通过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的文件系统能力,为用户提供完整的时间轴体验。

在实际开发中,建议实现时间轴的缩放功能,提供按年份或按周的分组选项,并支持时间轴的导出。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐