移除目录复制
一个基于 Electron 的本地可视化日记管理桌面应用,将 Markdown 格式的日记文件转换为精美的交互式网页,支持日历视图、全文搜索和数据统计功能。所有数据存储在本地,无需联网,完全掌控你的日记文件。
loadFile()
index.js
diary/*.md
template.html
{{DIARIES_DATA}}
{{STATS_DATA}}
libs/chart.min.js
resources/

git clone <repository-url> cd cyber-diary
npm install
安装完成后 postinstall 会自动执行 npm run prepare,将 Chart.js 复制到 libs/ 目录。
postinstall
npm run prepare
libs/
npm run dev
该命令会:
npm run build
build/index.html
开发模式下数据目录为项目内的 diary/,你可以直接编辑其中的 Markdown 文件。
diary/
应用顶部菜单栏提供以下操作:
选择新日记文件夹后,应用会:
.md
图片路径约定:日记文件中可以使用 resources/xxx.jpg 或 ../resources/xxx.jpg 两种方式引用同级目录下的资源,构建时会自动将路径统一处理为正确的相对位置。
resources/xxx.jpg
../resources/xxx.jpg
首次启动时,应用没有已保存的日记路径,会自动弹出系统文件夹选择框,让你指定日记存放目录。选择后该路径会被记录下来。
以后每次启动,应用会自动读取上一次选择的日记路径,直接使用该目录下的 .md 文件构建页面,无需再次选择。
记忆数据保存在 app.getPath('userData')/config.json,格式如下:
app.getPath('userData')/config.json
{ "lastDiaryDir": "/home/user/我的日记" }
如果已保存的路径被删除或不再可用,下次启动时会重新弹出文件夹选择框。
输出:
build/resources/
node index.js --dir /path/to/custom-diary
不传入 --dir 时默认使用项目内 diary/ 目录。
--dir
npm run dist
打包产物位于 dist/ 目录:
dist/
.dmg
.exe
.AppImage
打包配置说明:
asar: true
asarUnpack: diary/**/*
extraResources: [{ from: 'diary', to: 'diary' }]
打包应用只在 userData 存放构建产物和第三方库,不复制日记文件和资源:
userData
app.getPath('userData')/build/
index.html
app.getPath('userData')/libs/
日记文件和资源(图片等)直接从用户选择的文件夹读取,每次构建时重新读取,不复制到 userData。
在 Linux 上,userData 默认为 ~/.config/cyber-diary/。
~/.config/cyber-diary/
每次点击「重新构建」或选择新日记文件夹时:
main.js
index.js.build(diaryDir, { buildDir })
diaryDir
diaryDir/../resources/
注意:resources/ 和 diary/ 必须始终同级。无论选择哪个文件夹作为日记源,其上级目录中的 resources/ 都会被同步到构建输出。支持任意层级的子目录嵌套。
在 diary/ 文件夹中创建 Markdown 格式的日记文件,文件名必须遵循以下格式:
格式一:
yyyyMMdd.md
例如:
20260606.md
20260705.md
格式二:
yyMMdd.md
260606.md
260705.md
提示:6 位日期格式会自动添加 "20" 前缀,转换为 20xx 年的日期。
"20"
20xx
注意:
# 今天的心情 今天天气很好,阳光明媚。 ## 工作 - 完成了项目报告 - 参加了团队会议 ## 生活 晚上和朋友一起吃了火锅,很开心! > 生活不止眼前的苟且,还有诗和远方。
#9b59b6
#0a0a0f
rgba(255,255,255,0.05)
#0040ff
#c5c9c9
A:修改 diary/ 文件夹中的 Markdown 文件后,重新运行 npm run build 或重启应用即可更新。
A:日记文件和资源(图片等)**不复制到 userData**,直接从你选择的文件夹读取。userData 下只存放构建产物(build/)和 Chart.js 等第三方库(libs/)。完整的目录结构请见生产环境数据目录。
build/
A:在菜单栏点击 **文件 → 选择日记文件夹…**,选择任意包含 .md 日记文件的目录。系统会自动重新构建并刷新页面。每次更换都会同步该目录同级的 resources/ 资源。选择后路径会被记忆,下次启动自动恢复。
A:可以。每次通过 文件 → 选择日记文件夹… 切换即可。应用会记住最后使用的路径,下次启动时自动加载。可以通过修改 ~/.config/cyber-diary/config.json 中的 lastDiaryDir 字段手动指定。
~/.config/cyber-diary/config.json
lastDiaryDir
A:使用相对路径引用同级 resources/ 目录中的文件,例如  或  均可。支持任意层级的子目录嵌套,例如  也会被正确复制到构建输出。



A:系统会自动填充第一篇和最后一篇日记之间的所有日期。如果日期超出这个范围,则不会显示。
A:可以在 index.js 第 38 行修改预览字数。
A:直接删除 diary/ 文件夹中对应的 .md 文件,重新构建即可。
A:可以。Chart.js 已本地化到 libs/chart.min.js,不依赖任何 CDN,完全离线可用。
cyber-diary/ ├── main.js # Electron 主进程入口(菜单、文件对话框、构建调度) ├── index.js # 构建脚本,导出 build(diaryDir) ├── prepare.js # 复制 Chart.js 到 libs/ ├── template.html # HTML 模板(自包含 CSS+JS) ├── package.json # 项目配置 + electron-builder 配置 ├── diary/ # 日记文件存放目录(开发环境) ├── resources/ # 静态资源(图片等,与 diary/ 同级) ├── build/ # 生成的 HTML 文件(git-ignored) │ ├── index.html # 构建输出 │ └── resources/ # 复制自 resources/ ├── libs/ # 本地第三方库 │ └── chart.min.js # Chart.js 本地副本 └── extra/ # 实验性备用模板
~/.config/cyber-diary/ ├── config.json # 配置信息(最近使用的日记文件夹路径) ├── build/ │ ├── index.html # 构建输出 │ └── resources/ # 复制自 diaryDir/../resources/ └── libs/ └── chart.min.js
日记文件和资源(图片等)**不复制到 userData**,直接从用户选择的文件夹读取。
开发模式: diary/*.md → index.js (markdown-it render + stats) → build/index.html resources/ → 从 diary/ 同级复制 → build/resources/ 生产模式(菜单选择文件夹): 任意文件夹/*.md → main.js 调用 index.js.build() → userData/build/index.html 任意文件夹/../resources/ → 从 diaryDir 同级复制 → userData/build/resources/
template.html 中的 {{DIARIES_DATA}} 和 {{STATS_DATA}} 在构建时被替换为 JSON 数据。
.gitignore
../libs/chart.min.js
This project is licensed under the PolyForm Noncommercial License 1.0.0.
See the full legal terms in LICENSE.
一个用来管理markdown格式日记文件的electron应用
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
赛博日记本
一个基于 Electron 的本地可视化日记管理桌面应用,将 Markdown 格式的日记文件转换为精美的交互式网页,支持日历视图、全文搜索和数据统计功能。所有数据存储在本地,无需联网,完全掌控你的日记文件。
目录
技术栈
loadFile()加载本地页面,菜单交互无 IPC/preloadindex.js读取diary/*.md,注入 JSON 到template.html{{DIARIES_DATA}}/{{STATS_DATA}}构建时替换libs/chart.min.js,不依赖 CDN功能特性
1. 日历视图
2. 日记详情面板
resources/目录的图片:3. 全文搜索
4. 统计图表
5. 年份/月份导航
6. 主题切换
安装步骤
环境要求
克隆仓库
安装依赖
使用方法
开发模式(推荐)
该命令会:
npm run build,读取diary/*.md,生成build/index.html并复制resources/build/index.html开发模式下数据目录为项目内的
diary/,你可以直接编辑其中的 Markdown 文件。菜单操作
应用顶部菜单栏提供以下操作:
选择新日记文件夹后,应用会:
.md文件resources/,复制到构建输出图片路径约定:日记文件中可以使用
resources/xxx.jpg或../resources/xxx.jpg两种方式引用同级目录下的资源,构建时会自动将路径统一处理为正确的相对位置。首次启动与文件夹记忆
首次启动时,应用没有已保存的日记路径,会自动弹出系统文件夹选择框,让你指定日记存放目录。选择后该路径会被记录下来。
以后每次启动,应用会自动读取上一次选择的日记路径,直接使用该目录下的
.md文件构建页面,无需再次选择。记忆数据保存在
app.getPath('userData')/config.json,格式如下:构建 HTML(不启动 Electron)
输出:
build/index.html— 包含所有日记数据和统计信息的单页应用build/resources/— 复制自resources/CLI 模式(兼容旧用法)
不传入
--dir时默认使用项目内diary/目录。打包成桌面应用
打包产物位于
dist/目录:.dmg文件.exe安装包.AppImage文件打包配置说明:
asar: true— 源码打包为 asarasarUnpack: diary/**/*— 开发模板数据不打包进 asarextraResources: [{ from: 'diary', to: 'diary' }]— 包含初始日记模板生产环境数据目录
打包应用只在
userData存放构建产物和第三方库,不复制日记文件和资源:app.getPath('userData')/build/index.htmlapp.getPath('userData')/libs/日记文件和资源(图片等)直接从用户选择的文件夹读取,每次构建时重新读取,不复制到
userData。在 Linux 上,
userData默认为~/.config/cyber-diary/。运行时构建流程
每次点击「重新构建」或选择新日记文件夹时:
main.js调用index.js.build(diaryDir, { buildDir })diaryDir下的所有.md文件,渲染为 HTMLdiaryDir/../resources/复制资源到build/resources/build/index.html日记文件规范
在
diary/文件夹中创建 Markdown 格式的日记文件,文件名必须遵循以下格式:格式一:
例如:
20260606.md(2026年6月6日)20260705.md(2026年7月5日)格式二:
例如:
260606.md(自动转换为2026年6月6日)260705.md(自动转换为2026年7月5日)注意:
示例日记内容
界面风格
紫色赛博朋克风格(默认)
#9b59b6)#0a0a0f)rgba(255,255,255,0.05))21th 简约风格
#0040ff)#c5c9c9)常见问题
Q:如何更新日记?
A:修改
diary/文件夹中的 Markdown 文件后,重新运行npm run build或重启应用即可更新。Q:打包后日记数据存在哪里?
A:日记文件和资源(图片等)**不复制到
userData**,直接从你选择的文件夹读取。userData下只存放构建产物(build/)和 Chart.js 等第三方库(libs/)。完整的目录结构请见生产环境数据目录。Q:如何更换日记文件夹?
A:在菜单栏点击 **文件 → 选择日记文件夹…**,选择任意包含
.md日记文件的目录。系统会自动重新构建并刷新页面。每次更换都会同步该目录同级的resources/资源。选择后路径会被记忆,下次启动自动恢复。Q:可以管理多个日记文件夹吗?
A:可以。每次通过 文件 → 选择日记文件夹… 切换即可。应用会记住最后使用的路径,下次启动时自动加载。可以通过修改
~/.config/cyber-diary/config.json中的lastDiaryDir字段手动指定。Q:日记中的图片如何引用?
A:使用相对路径引用同级
resources/目录中的文件,例如或均可。支持任意层级的子目录嵌套,例如也会被正确复制到构建输出。Q:为什么某些日期没有显示?
A:系统会自动填充第一篇和最后一篇日记之间的所有日期。如果日期超出这个范围,则不会显示。
Q:搜索结果预览字数可以调整吗?
A:可以在
index.js第 38 行修改预览字数。Q:如何删除日记?
A:直接删除
diary/文件夹中对应的.md文件,重新构建即可。Q:应用可以离线使用吗?
A:可以。Chart.js 已本地化到
libs/chart.min.js,不依赖任何 CDN,完全离线可用。项目结构
生产环境运行时目录(AppImage 首次启动后)
日记文件和资源(图片等)**不复制到
userData**,直接从用户选择的文件夹读取。开发说明
数据流
template.html中的{{DIARIES_DATA}}和{{STATS_DATA}}在构建时被替换为 JSON 数据。重要约束
build/已被.gitignore忽略,修改template.html或 JS 后需运行npm run build再提交diary/*.md内容不得删除或修改(除非明确要求)template.html中 Chart.js 必须保持本地路径../libs/chart.min.js,不得改回 CDNresources/始终与diary/同级,构建时会自动同步到构建输出License
This project is licensed under the PolyForm Noncommercial License 1.0.0.
See the full legal terms in LICENSE.