告别遗忘:Logseq插件实现智能时间提醒全攻略

告别遗忘:Logseq插件实现智能时间提醒全攻略

【免费下载链接】logseq A privacy-first, open-source platform for knowledge management and collaboration. Download link: http://github.com/logseq/logseq/releases. roadmap: http://trello.com/b/8txSM12G/roadmap 【免费下载链接】logseq 项目地址: https://gitcode.com/GitHub_Trending/lo/logseq

你是否曾在知识管理中遇到这些困扰?重要待办事项被淹没在笔记海洋,项目截止日期悄然错过,灵光一闪的创意因未及时跟进而流失。本文将带你构建一个基于Logseq插件的时间提醒系统,通过LSPlugin.Storage.ts持久化存储和LSPlugin.Request.ts定时任务,让知识管理真正服务于高效工作流。

核心功能架构解析

Logseq插件系统提供了三大核心能力支撑时间提醒功能:

  • 数据持久化:通过LSPluginFileStorage类实现任务数据的安全存储,关键API包括:

    // 存储提醒任务
    await storage.setItem('reminder_20251031', JSON.stringify(reminderData))
    
    // 获取所有提醒
    const allReminders = await storage.allKeys()
    
  • 定时触发机制:利用LSPluginRequestTask的异步任务能力,结合系统时钟实现精准提醒:

    // 创建定时检查任务
    const task = request._request({
      url: 'logseq://internal/reminder-check',
      method: 'GET',
      timeout: 24 * 60 * 60 * 1000, // 24小时轮询
      success: handleReminderCheck
    })
    
  • 内容检索能力:通过LSPluginSearchService实现提醒内容与知识库的关联查询:

    // 搜索包含提醒标签的块内容
    searchService.onQuery('my-graph', '#reminder', (results) => {
      processReminderBlocks(results.blocks)
    })
    

插件开发实战指南

项目结构搭建

遵循Logseq插件开发最佳实践,推荐的项目结构如下:

reminder-plugin/
├── package.json          // 插件元数据
├── src/
│   ├── main.ts           // 入口文件
│   ├── storage.ts        // 基于[LSPluginFileStorage](https://link.gitcode.com/i/de5987b566ccadc6197763d787391c05)的封装
│   ├── scheduler.ts      // 定时任务管理
│   └── ui.ts             // 提醒界面组件
└── README.md             // 用户文档

关键功能实现

1. 提醒数据模型设计

interface Reminder {
  id: string;                // 唯一标识
  pageId: string;            // 关联页面ID
  blockId: string;           // 关联块ID
  scheduledTime: Date;       // 提醒时间
  repeat: 'daily'|'weekly'|'none'; // 重复规则
  isCompleted: boolean;      // 完成状态
}

2. 存储模块实现

import { LSPluginFileStorage } from "logseq/libs/src/modules/LSPlugin.Storage";

export class ReminderStorage {
  private storage: LSPluginFileStorage;
  
  constructor(ctx: any) {
    this.storage = new LSPluginFileStorage(ctx);
  }
  
  async saveReminder(reminder: Reminder): Promise<void> {
    await this.storage.setItem(
      `reminder_${reminder.id}`, 
      JSON.stringify(reminder)
    );
  }
  
  async getDueReminders(): Promise<Reminder[]> {
    const now = new Date();
    const keys = await this.storage.allKeys();
    const reminders: Reminder[] = [];
    
    for (const key of keys) {
      if (key.startsWith('reminder_')) {
        const data = await this.storage.getItem(key);
        if (data) {
          const reminder = JSON.parse(data);
          if (new Date(reminder.scheduledTime) <= now && !reminder.isCompleted) {
            reminders.push(reminder);
          }
        }
      }
    }
    
    return reminders;
  }
}

3. 定时检查机制

import { LSPluginRequest } from "logseq/libs/src/modules/LSPlugin.Request";

export class ReminderScheduler {
  private request: LSPluginRequest;
  private checkInterval: number;
  
  constructor(ctx: any) {
    this.request = new LSPluginRequest(ctx);
    this.checkInterval = setInterval(
      () => this.checkReminders(), 
      60 * 1000 // 每分钟检查一次
    );
  }
  
  private async checkReminders() {
    const storage = new ReminderStorage();
    const dueReminders = await storage.getDueReminders();
    
    dueReminders.forEach(reminder => {
      this.showNotification(reminder);
      // 如果是一次性提醒,标记为已完成
      if (reminder.repeat === 'none') {
        reminder.isCompleted = true;
        storage.saveReminder(reminder);
      }
    });
  }
  
  private showNotification(reminder: Reminder) {
    // 实现系统通知和Logseq内提醒
    logseq.UI.showMsg(`提醒: ${reminder.content}`);
  }
  
  destroy() {
    clearInterval(this.checkInterval);
  }
}

界面集成方案

通过Logseq的UI API实现提醒管理界面:

// 在侧边栏添加提醒面板
logseq.App.registerUIItem('sidebar', {
  key: 'reminder-panel',
  path: 'src/ui/sidebar.tsx',
  label: '时间提醒'
});

// 添加编辑器工具栏按钮
logseq.Editor.registerBlockContextMenuItem('添加提醒', async (blockId) => {
  const block = await logseq.Editor.getBlock(blockId);
  showReminderDialog(blockId, block?.content || '');
});

高级功能扩展

自然语言日期解析

集成date-fns库实现自然语言处理:

import { parse } from 'date-fns';

// 解析"明天下午3点"为Date对象
const parseNaturalDate = (text: string): Date | null => {
  const patterns = [
    /明天 (\d+)点/,
    /(\d+)月(\d+)日 (\d+):(\d+)/,
    /(\d+)天后/
  ];
  
  // 实现解析逻辑...
  return parse(text, 'yyyy-MM-dd HH:mm', new Date());
};

与日历应用同步

利用LSPluginRequest实现外部API调用:

// 同步到Google日历
async function syncToGoogleCalendar(reminder: Reminder) {
  const event = {
    summary: reminder.content,
    start: { dateTime: reminder.scheduledTime.toISOString() },
    end: { dateTime: new Date(reminder.scheduledTime.getTime() + 30*60*1000).toISOString() }
  };
  
  return request._request({
    url: 'https://www.googleapis.com/calendar/v3/calendars/primary/events',
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${userToken}`
    },
    data: event,
    returnType: 'json'
  });
}

部署与使用指南

插件安装

  1. 克隆仓库:git clone https://gitcode.com/GitHub_Trending/lo/logseq
  2. 进入插件目录:cd logseq/plugins/reminder-plugin
  3. 安装依赖:npm install
  4. 构建插件:npm run build
  5. 在Logseq中加载:设置 > 插件 > 加载已安装插件 > 选择本插件目录

使用场景示例

场景1:项目截止日期提醒

  1. 在项目页面添加块:## 网站改版 [due:: 2025-11-15]
  2. 右键点击块,选择"添加提醒"
  3. 设置提前3天提醒,每日重复
  4. 系统将在11月12日开始每日提醒

场景2:周期性任务管理

  1. 创建"每周回顾"页面
  2. 添加提醒规则:每周日晚8点
  3. 插件自动创建周期性提醒
  4. 完成后自动生成下周提醒

常见问题解决

提醒不触发

  1. 检查系统时间是否准确
  2. 确认插件是否有权限发送通知:系统设置指南
  3. 查看插件日志:~/.logseq/plugins/reminder-plugin/logs.txt

数据备份与迁移

提醒数据存储在:~/.logseq/plugins/reminder-plugin/storage/,定期备份此目录即可。迁移时复制到新设备相同路径下。

总结与展望

通过本文介绍的方法,你已掌握基于Logseq插件系统构建时间提醒功能的核心技术。该方案利用LSPlugin.Storage.ts实现数据持久化,LSPlugin.Request.ts处理异步任务,结合LSPlugin.Search.ts实现内容关联,为知识管理添加了时间维度。

未来可探索的方向:

  • 基于AI的提醒智能推荐
  • 与第三方日历深度集成
  • 团队协作场景下的共享提醒

完整代码示例可参考官方插件模板,更多API细节请查阅Logseq插件开发文档

【免费下载链接】logseq A privacy-first, open-source platform for knowledge management and collaboration. Download link: http://github.com/logseq/logseq/releases. roadmap: http://trello.com/b/8txSM12G/roadmap 【免费下载链接】logseq 项目地址: https://gitcode.com/GitHub_Trending/lo/logseq

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值