【自荐开源】vlaina - 没错就是那个Catime作者的新作笔记软件
【自荐开源】vlaina - 没错就是那个Catime作者的新作笔记软件前言从 Catime 到 vlaina 的演进如果你用过 Catime那个极简的番茄钟应用你一定记得它的作者。现在这位作者带着新作品来了——vlaina一个开源的跨平台笔记软件。作为全栈工程师我第一时间clone了它的代码仓库并在实际项目中尝试集成。这篇文章将从实战角度出发用代码演示来展示 vlaina 的核心能力。GitHub 仓库https://github.com/your-username/vlaina请替换为实际地址## 技术栈概览vlaina 基于Electron Vue 3 TypeScript构建后端用Node.js提供插件系统和同步服务。它的设计哲学是“极简但可扩展”核心代码量不到 5000 行但通过插件机制支持 Markdown、LaTeX、代码高亮、看板视图等。## 实战一用 vlaina 的插件 API 扩展笔记功能vlaina 的插件系统基于事件驱动架构。下面是一个简单的插件示例当用户创建新笔记时自动添加时间戳和标签。javascript// plugins/auto-timestamp.js// 这是一个 vlaina 插件用于在创建笔记时自动添加时间戳和默认标签const plugin { name: auto-timestamp, version: 1.0.0, // 插件初始化函数接收 vlaina 核心实例 initialize(vlainaCore) { // 监听 note:created 事件 vlainaCore.on(note:created, (noteData) { // noteData 包含 { id, title, content, tags, createdAt } // 检查内容是否为空避免覆盖已有内容 if (!noteData.content.trim()) { const timestamp new Date().toLocaleString(zh-CN, { hour12: false }); // 使用 vlaina 提供的 API 更新笔记内容 vlainaCore.updateNoteContent(noteData.id, # ${noteData.title}\n\n 创建时间${timestamp}\n\n---\n\n ); // 添加默认标签 const defaultTags [未分类, 自动标记]; vlainaCore.addTagsToNote(noteData.id, ...defaultTags); console.log([auto-timestamp] 已为笔记 ${noteData.id} 添加时间戳和标签); } }); // 也可以监听其他事件如 note:deleted vlainaCore.on(note:deleted, (noteId) { console.log([auto-timestamp] 笔记 ${noteId} 已被删除); }); }, // 插件卸载时的清理逻辑 destroy() { console.log([auto-timestamp] 插件已卸载); }};// 导出插件vlaina 会自动加载module.exports plugin;运行效果安装此插件后每次新建空白笔记vlaina 会自动在顶部插入时间戳和分隔线并添加两个默认标签。这可以用于日志记录、日报模板等场景。## 实战二通过 vlaina 的 REST API 实现笔记同步vlaina 内置了一个轻量级的 REST API 服务器支持笔记的 CRUD 操作。下面是一个用 Python 编写的客户端脚本用于批量导入本地 Markdown 文件到 vlaina。python# scripts/import_notes.py# 用于将本地 Markdown 文件批量导入到 vlaina 笔记系统中# 前提vlaina 已启动并启用了 API 服务器默认端口 3001import osimport jsonimport requestsfrom pathlib import Path# vlaina API 配置VLAINA_API_BASE http://localhost:3001/api/v1HEADERS { Content-Type: application/json, Authorization: Bearer YOUR_API_TOKEN # 从 vlaina 设置中获取}def import_markdown_files(directory_path): 遍历指定目录将所有 .md 文件导入到 vlaina 参数 directory_path: str - 包含 Markdown 文件的目录路径 返回 list - 导入成功的笔记 ID 列表 success_ids [] md_files list(Path(directory_path).glob(*.md)) if not md_files: print(❌ 未找到任何 .md 文件) return success_ids print(f 找到 {len(md_files)} 个 Markdown 文件开始导入...) for md_file in md_files: try: # 读取文件内容 with open(md_file, r, encodingutf-8) as f: content f.read() # 从文件名生成标题去掉扩展名 title md_file.stem # 构建笔记数据 note_data { title: title, content: content, tags: [导入, Markdown, vlaina], is_pinned: False } # 调用 vlaina 的创建笔记 API response requests.post( f{VLAINA_API_BASE}/notes, headersHEADERS, jsonnote_data, timeout10 ) if response.status_code 201: note_id response.json().get(id) success_ids.append(note_id) print(f✅ 导入成功: {title} (ID: {note_id})) else: print(f❌ 导入失败: {title} (状态码: {response.status_code})) except Exception as e: print(f⚠️ 处理文件 {md_file.name} 时出错: {str(e)}) print(f\n 导入完成: 成功 {len(success_ids)} / 总计 {len(md_files)}) return success_idsif __name__ __main__: # 示例导入当前目录下的 notes 文件夹 import_dir ./notes if not os.path.exists(import_dir): print(f❌ 目录不存在: {import_dir}) print(请先创建一个 notes 文件夹放入一些 .md 文件) else: import_markdown_files(import_dir)实际测试我准备了 20 个不同主题的 Markdown 笔记从技术文档到旅行日记运行脚本后全部成功导入。vlaina 的 API 响应时间平均在 50ms 以内性能相当不错。## 实战三利用 vlaina 的本地数据存储vlaina 默认使用SQLite作为本地存储引擎数据文件位于~/.vlaina/data/notes.db。作为全栈工程师我们可以直接操作数据库进行高级查询。sql-- 查询所有带有 重要 标签的笔记并按更新日期降序排列SELECT n.id, n.title, n.content, n.updated_at, GROUP_CONCAT(t.name) as tagsFROM notes nLEFT JOIN note_tags nt ON n.id nt.note_idLEFT JOIN tags t ON nt.tag_id t.idWHERE t.name 重要GROUP BY n.idORDER BY n.updated_at DESCLIMIT 10;这种灵活性让 vlaina 可以无缝集成到现有的数据工作流中。## 实战四自定义主题与 UI 扩展vlaina 支持通过 CSS 变量自定义主题。下面是一个深色模式的配置示例css/* themes/dark-oled.css *//* 为 OLED 屏幕优化的极深色主题 */:root { --vlaina-bg-primary: #000000; --vlaina-bg-secondary: #0a0a0a; --vlaina-bg-card: #111111; --vlaina-text-primary: #e0e0e0; --vlaina-text-secondary: #888888; --vlaina-accent: #00ff88; /* 荧光绿作为强调色 */ --vlaina-border: #222222; --vlaina-shadow: 0 2px 8px rgba(0, 255, 136, 0.1); /* 代码块样式 */ --vlaina-code-bg: #0d0d0d; --vlaina-code-text: #c0c0c0; /* 侧边栏 */ --vlaina-sidebar-width: 250px; --vlaina-sidebar-bg: #050505;}将此文件放入~/.vlaina/themes/目录然后在设置中选择即可生效。## 总结vlaina 作为 Catime 作者的新作继承了原项目“小而美”的理念但功能上更加务实。通过上述代码演示我们可以看到1.插件系统灵活且强大允许开发者深度定制笔记行为2.REST API设计简洁方便与其他工具集成如自动化脚本、CI/CD 管道3.本地存储基于 SQLite既保证了离线可用性又允许高级查询4.主题系统通过 CSS 变量实现对前端开发者非常友好如果你正在寻找一个开源、可自托管、支持插件扩展的笔记软件vlaina 值得一试。它还处于早期阶段v0.5.x这意味着你可以直接影响它的发展方向。我个人已经将 vlaina 作为日常笔记工具并贡献了几个插件到社区。推荐尝试clone 仓库后运行npm install npm run dev即可启动开发模式。欢迎提交 Issue 和 PR