Reor日历集成:将笔记与日程安排无缝连接
痛点解析:当笔记遇上时间管理
你是否也曾遇到这样的困境:重要会议记录散落在笔记系统中难以回溯,待办事项与项目文档缺乏时间维度的关联,或者需要在特定日期回顾过去的思考过程却无从下手?在知识工作者的日常中,时间与内容往往是割裂的两个维度——日历负责规划时间,笔记负责记录信息,而这种割裂会导致信息检索效率低下、工作流中断和思维连续性丧失。
Reor作为一款本地运行的自组织AI笔记应用(Self-organizing AI note-taking app),通过深度日历集成功能解决了这一核心矛盾。本文将系统介绍如何利用Reor的日历功能实现笔记与日程的无缝连接,构建时空一体的知识管理系统。我们将通过实际代码示例、配置指南和高级技巧,帮助你在30分钟内掌握以下能力:
- 使用日期范围选择器筛选特定时间段的笔记内容
- 创建带时间戳的会议记录与日程自动关联
- 基于时间维度的语义搜索与知识回顾
- 自定义日历事件触发的笔记模板自动化
Reor日历功能架构解析
Reor的日历集成并非简单的功能叠加,而是通过数据层-组件层-应用层的三级架构实现深度融合。以下是系统架构的核心组件:
核心数据结构
在Reor的文件系统中,每个笔记文件都包含完整的时间元数据,这些数据存储在FileInfoTree结构中,为日历集成提供基础:
// 文件元数据中的时间属性(src/contexts/FileContext.tsx)
interface FileInfo {
id: string;
name: string;
path: string;
isDirectory: boolean;
dateCreated: Date; // 创建时间戳
dateModified: Date; // 修改时间戳
size: number;
tags?: string[];
// 其他属性...
}
这些时间戳不仅用于排序和筛选,还会被转换为向量嵌入(Embedding),支持基于时间语义的联想搜索——例如"查找上周讨论过的项目计划"不仅会匹配关键词,还会优先返回对应时间范围内的相关内容。
快速上手:日期范围选择器使用指南
Reor提供了直观的日期范围选择组件(DateRangePicker),让用户可以轻松筛选特定时间段的笔记内容。该组件位于src/components/ui/date-picker.tsx,支持快捷选择和自定义日期范围两种模式。
基础使用方法
以下是在聊天配置组件中集成日期范围选择器的实际代码示例,用于筛选特定时间段内的笔记作为AI对话上下文:
// src/components/Chat/ChatConfigComponents/DBSearchFilters.tsx
import DateRangePicker from '../../ui/date-picker';
export default function DBSearchFilters() {
const [dateRange, setDateRange] = useState({
from: undefined,
to: undefined
});
return (
<div className="space-y-4">
{/* 其他筛选选项 */}
<div className="space-y-2">
<span className="mb-1 text-sm text-muted-foreground">
按日期筛选搜索(最后修改时间):
</span>
<DateRangePicker
from={dateRange.from}
to={dateRange.to}
onDateChange={(from, to) => setDateRange({ from, to })}
/>
</div>
</div>
);
}
快捷时间范围选择
DateRangePicker内置了五种常用的时间范围快捷选项,用户无需手动选择起止日期:
// src/components/ui/date-picker.tsx 中的快捷选项定义
const quickSelectOptions = [
{ label: 'Last hour', value: 'last-hour' }, // 过去1小时
{ label: 'Today', value: 'today' }, // 今天
{ label: 'This week', value: 'this-week' }, // 本周
{ label: 'This month', value: 'this-month' },// 本月
{ label: 'Custom', value: 'custom' }, // 自定义范围
];
选择这些选项会触发对应的日期计算逻辑,例如"Last hour"选项的实现:
// 快捷选项点击处理逻辑
case 'last-hour':
newFrom = subHours(now, 1); // 使用date-fns库计算1小时前的时间
break;
自定义日期范围选择
当选择"Custom"选项时,会触发双日历弹窗,允许精确选择起止日期:
实战指南:构建会议记录与日历集成工作流
现在让我们通过一个完整案例,展示如何使用Reor的日历功能构建高效的会议记录工作流。这个工作流将实现:
- 通过日历选择会议日期
- 自动生成带时间戳的会议笔记模板
- 将会议记录与日历事件双向关联
- 按时间范围回顾历史会议内容
步骤1:筛选特定日期的笔记
在Reor的文件侧边栏中,使用日期范围选择器筛选特定会议日期的笔记:
// 日期范围选择器完整代码(src/components/ui/date-picker.tsx)
const DateRangePicker: React.FC<DateRangePickerProps> = ({ from, to, onDateChange }) => {
const [activeOption, setActiveOption] = useState<string | null>();
const [isDatePopoverOpen, setIsDatePopoverOpen] = useState(false);
const updateDateRange = useCallback(
(newFrom: Date | undefined, newTo: Date | undefined, option: string | null) => {
onDateChange(newFrom, newTo); // 回调函数,用于更新父组件状态
setActiveOption(option);
if (option !== 'custom') {
setIsDatePopoverOpen(false);
}
},
[onDateChange],
);
// 渲染快捷选项按钮和自定义日历弹窗...
};
选择"Today"选项后,系统会自动筛选出今天创建或修改的所有笔记,方便快速定位当天的会议记录。
步骤2:创建带时间戳的会议笔记
使用Reor的Slash命令(/meeting)创建带时间戳的会议笔记模板。以下是实现这一功能的核心代码:
// 会议笔记模板生成逻辑(概念代码)
function generateMeetingNoteTemplate(date: Date) {
const formattedDate = format(date, 'yyyy-MM-dd HH:mm');
return `# 会议记录 - ${formattedDate}
## 参会人员
- [ ]
## 会议议程
1.
## 讨论要点
-
## 行动项
- [ ] 负责人: 截止日期:
`;
}
该模板会自动包含当前时间戳,并提供结构化的会议记录框架。
步骤3:实现笔记与日历事件的双向关联
虽然Reor当前版本未直接提供日历事件创建API,但我们可以通过元数据标签和命名约定实现类似功能:
// 为笔记添加日历事件元数据(概念代码)
async function linkNoteToCalendarEvent(notePath: string, eventDetails: CalendarEvent) {
// 1. 将日历事件信息写入笔记元数据
await window.electronStore.setMetadata(notePath, {
calendarEvent: {
title: eventDetails.title,
startTime: eventDetails.startTime,
endTime: eventDetails.endTime,
participants: eventDetails.participants
}
});
// 2. 创建反向链接 - 在笔记内容中插入日历事件标记
const noteContent = await window.fileSystem.readFile(notePath);
const updatedContent = `[[calendar:event:${eventDetails.id}]]\n${noteContent}`;
await window.fileSystem.writeFile(notePath, updatedContent);
}
步骤4:时间维度的语义搜索与回顾
利用Reor的向量数据库和日期筛选功能,可以实现基于时间和内容的复合搜索。以下是搜索组件中集成日期筛选的实现逻辑:
// 带日期范围的语义搜索(src/components/Chat/ChatConfigComponents/DBSearchFilters.tsx)
function DBSearchFilters({ onSearchParamsChange }) {
const [dateRange, setDateRange] = useState({ from: undefined, to: undefined });
useEffect(() => {
// 当日期范围变化时,更新搜索参数
onSearchParamsChange(prev => ({
...prev,
dateFilter: {
from: dateRange.from?.toISOString(),
to: dateRange.to?.toISOString()
}
}));
}, [dateRange]);
return (
<div>
<span className="mb-1 text-sm text-muted-foreground">
Filter search by date (last modified):
</span>
<DateRangePicker
from={dateRange.from}
to={dateRange.to}
onDateChange={(from, to) => setDateRange({ from, to })}
/>
</div>
);
}
通过组合日期范围和关键词搜索,你可以快速找到"2023年Q3所有关于项目X的会议记录"这类精确查询。
高级技巧:自定义日历集成功能
对于高级用户,Reor的开放架构允许通过以下方式扩展日历集成功能:
扩展日期范围选择器
你可以通过修改quickSelectOptions数组添加自定义时间范围选项:
// 添加"本季度"快捷选项(修改src/components/ui/date-picker.tsx)
const quickSelectOptions = [
// 现有选项...
{ label: 'This quarter', value: 'this-quarter' },
];
// 添加对应的日期计算逻辑
case 'this-quarter':
const currentMonth = now.getMonth();
const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
newFrom = new Date(now.getFullYear(), quarterStartMonth, 1);
break;
实现周期性笔记模板
结合日期筛选和模板功能,可以创建周期性笔记(如日报、周报):
// 周期性笔记生成逻辑(概念代码)
async function createRecurringNote(templateId: string, frequency: 'daily' | 'weekly' | 'monthly') {
const today = new Date();
const dateSuffix = format(today, frequency === 'daily' ? 'yyyy-MM-dd' :
frequency === 'weekly' ? 'yyyy-'W'ww' : 'yyyy-MM');
const notePath = `/${frequency}-notes/${templateId}-${dateSuffix}.md`;
// 检查笔记是否已存在
if (!await window.fileSystem.exists(notePath)) {
// 从模板创建新笔记
const templateContent = await window.fileSystem.readFile(`/templates/${templateId}.md`);
await window.fileSystem.writeFile(notePath, templateContent);
// 设置创建时间元数据
await window.electronStore.setMetadata(notePath, {
dateCreated: today,
dateModified: today,
recurringTemplate: templateId,
recurrenceFrequency: frequency
});
}
// 打开新创建的笔记
window.contentContext.openContent(notePath);
}
基于时间线的知识回顾
利用Reor的文件时间戳和语义相似性,可以构建时间线视图,按时间顺序展示相关笔记:
这种时间线视图可以通过以下代码实现:
// 时间线视图组件(概念代码)
function NoteTimeline({ notes }) {
// 按创建时间排序笔记
const sortedNotes = [...notes].sort((a, b) =>
a.dateCreated.getTime() - b.dateCreated.getTime()
);
return (
<div className="timeline">
{sortedNotes.map(note => (
<div key={note.id} className="timeline-item">
<div className="timeline-date">
{format(new Date(note.dateCreated), 'yyyy-MM-dd')}
</div>
<div className="timeline-content">
<NoteLink path={note.path}>{note.name}</NoteLink>
<NotePreview content={note.preview} />
</div>
</div>
))}
</div>
);
}
常见问题与解决方案
Q1: 如何批量更新笔记的时间戳?
A1: 可以使用Reor的批量操作API结合日期范围选择实现:
// 批量更新笔记创建时间(概念代码)
async function batchUpdateCreationDates(fromDate: Date, toDate: Date, newDate: Date) {
// 1. 获取指定日期范围内的笔记
const notesInRange = await window.fileSystem.searchFiles({
dateModified: { from: fromDate, to: toDate }
});
// 2. 批量更新元数据
for (const note of notesInRange) {
await window.electronStore.setMetadata(note.path, {
dateCreated: newDate
});
}
return notesInRange.length;
}
Q2: 能否将Reor笔记与外部日历应用(如Google Calendar)同步?
A2: 虽然Reor当前不直接支持外部日历同步,但可以通过以下间接方式实现:
-
导出到外部日历:将带有
[[calendar:event]]标签的笔记导出为ICS格式// ICS文件生成逻辑(概念代码) function generateICSEvent(noteMetadata) { const event = noteMetadata.calendarEvent; return `BEGIN:VEVENT UID:${event.id} SUMMARY:${event.title} DTSTART:${formatICSTime(event.startTime)} DTEND:${formatICSTime(event.endTime)} DESCRIPTION:${noteMetadata.path} END:VEVENT`; } -
从外部日历导入:编写脚本监控外部日历的ICS文件变化,自动创建对应笔记
Q3: 如何设置笔记的提醒功能?
A3: 可以结合日期选择器和本地通知API实现提醒功能:
// 为笔记设置提醒(概念代码)
async function setNoteReminder(notePath: string, reminderDate: Date) {
// 1. 存储提醒信息
await window.electronStore.setMetadata(notePath, {
reminder: {
date: reminderDate,
enabled: true
}
});
// 2. 设置定时通知
const now = new Date();
const delay = reminderDate.getTime() - now.getTime();
if (delay > 0) {
setTimeout(async () => {
// 显示系统通知
new Notification('Reor笔记提醒', {
body: `您有一条笔记需要查看: ${await window.fileSystem.getFileName(notePath)}`
});
// 激活Reor并打开笔记
window.ipcRenderer.send('show-app');
window.contentContext.openContent(notePath);
}, delay);
}
}
总结与未来展望
Reor的日历集成功能为知识管理带来了时间维度的全新视角,通过本文介绍的方法,你可以构建从"碎片化记录"到"时空一体化知识网络"的跃迁。当前实现虽然依赖日期筛选和元数据标签等基础功能,但已能满足大部分时间管理需求。
未来版本中,我们期待看到更深度的日历集成,包括:
- 原生日历事件API:直接创建、编辑和删除系统日历事件
- 自然语言日期解析:支持"明天下午3点"等自然语言时间输入
- 时间块笔记模板:基于预设时间块自动创建对应笔记
- 跨设备日历同步:通过自托管服务器实现多设备间的日历-笔记同步
通过不断完善日历集成功能,Reor正逐步实现从"笔记应用"到"个人知识时空管理系统"的进化,帮助用户在信息爆炸的时代构建有序、高效且富有洞察力的知识体系。
要开始使用Reor的日历功能,只需从GitCode仓库克隆项目并按照README中的指南安装:
git clone https://gitcode.com/GitHub_Trending/re/reor
cd reor
npm install
npm run dev
立即体验将时间维度融入知识管理的全新方式,让每一条笔记都找到它在时空中的位置。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



