# drip-note **Repository Path**: dripai/drip-note ## Basic Information - **Project Name**: drip-note - **Description**: Drip Note 一款本地优先、打开就能写的轻量笔记本。 - **Primary Language**: Rust - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-22 - **Last Updated**: 2026-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

简体中文 | English

# Velune 一款本地优先、打开就能写的轻量笔记本。 Velune 面向的是日常高频记录:临时想法、工作资料、技术笔记、长文草稿,都应该能在一个安静、快速、可控的桌面应用里完成。它不把自己做成复杂的知识平台,而是先把“写下来、找得到、不会丢、不卡顿”这几件事做到顺手。 ## 产品定位 Velune 当前版本聚焦个人本地笔记场景: - 打开应用后直接进入笔记列表和编辑区,减少无关入口。 - 数据保存在可执行文件同目录,便于备份和随程序一起携带。 - 支持 Markdown、文本和画布三种笔记类型。 - 使用树形目录组织内容,适合按项目、主题、时间线逐层沉淀。 - 提供图标和标签作为轻量属性,不引入复杂的元数据管理负担。 ## 核心体验 ### 1. 本地优先 笔记数据存储在本地 `drip-note.db` 中。应用不依赖账号体系和云端服务,适合个人资料、工作草稿和离线环境使用。 ### 2. 三种笔记类型 - Markdown:适合技术文档、长文、代码片段和结构化知识。 - 文本:适合快速记录、便签、清单、临时内容。 - 画布:通过文字卡片、图片卡片与连线整理想法,支持拖动、调整尺寸、平移缩放、撤销重做和自动保存。 在新建弹窗中选择“画布”。编辑状态下,工具栏显示“文字 / 图片”,点击可在视野中心添加卡片,也可拖入画布在落点添加。添加图片先生成占位卡片,点击卡片中央“选择图片”再选图;取消选图保留占位卡片。拖动卡片顶部移动位置,选中后拖动边框调整大小,从右侧圆点拖到另一张卡片的左侧圆点创建连线。双击顶部标题,或右键选择“属性”,可编辑标题和尺寸,宽度与高度同行显示;文字卡片还可编辑正文,已有图片可更换。 图片从配置的图片资源目录选择,与 Markdown 图片使用同一目录,默认路径为 `images`。支持相对程序目录的路径或绝对路径,以及 PNG、JPG、JPEG、WebP、GIF、BMP。选图后卡片自动适配到不超过 360 × 280 的初始尺寸(包含标题),图片使用 `contain` 等比例显示;之后可通过边框或属性调整尺寸。切换图片目录后按文件名重新读取图片;缺少目录、图片文件或图片加载失败时会明确显示错误。 拖动空白处平移,滚轮缩放,“显示全部”可找回视野外的卡片。选中卡片或连线后可删除;非文字输入状态下支持 Delete、Ctrl/Cmd+Z、Ctrl/Cmd+Shift+Z。工具栏删除按钮旁提供保存按钮,Ctrl+S / Command+S 在编辑文字时也可立即保存。撤销记录仅保留当前编辑会话最近 100 步,切换笔记后清空;标题、正文、图片引用、卡片位置、尺寸、连线和视图位置会保存。笔记引用和自由手绘尚未实现。 ### 3. 树形笔记管理 左侧目录分为文件夹和笔记。文件夹只负责组织,可以包含子文件夹及笔记;笔记可以是 Markdown、文本或画布,不能包含子节点。节点类型在创建时确定,创建后不转换。 点击“+”选择新建笔记或文件夹;新建弹窗使用标签与控件同行的表单,笔记类型显示为 Markdown / 文本 / 画布。文件夹右键可在其下新建。点击文件夹展开或收起,点击笔记打开内容。笔记可直接拖入其他文件夹,也可拖到根级节点之间移回根目录;落在节点之间时移动到该节点所属目录,同目录拖放不改变排序。文件夹不能拖动,可通过右键“移动到”调整位置。移动目标只包含根目录和文件夹,移动前保存当前笔记。非空文件夹不能直接删除,搜索结果只包含笔记。 ### 4. 自动保存 编辑内容进入统一保存队列,停止编辑 10 秒后合并写入。等待期间保存状态为静止的待保存图标,实际写入时才旋转。Markdown、文本和画布统一使用 Ctrl+S / Command+S 立即保存;画布也可点击删除按钮旁的保存按钮。切换笔记、窗口失焦或关闭窗口时立即提交待保存内容,保存失败保留草稿并阻止切换。 ### 5. 图标与标签 文件夹可以配置图标,笔记可以配置图标和标签,每篇笔记最多 5 个标签。标签显示在编辑区标题栏最右侧,无标签时不占位。右键“属性”使用行内标签表单;文件夹不显示标签字段。图标选择器内置多分类图标库,适合快速区分项目、资料、任务、技术、媒体等不同类型内容。 ### 6. 轻量桌面体验 应用基于 Tauri 构建,窗口、主题和编辑区围绕桌面笔记场景设计。浅色和深色主题可切换,整体界面保持克制,优先服务长期写作和查阅。 右上角“设置”左侧包含“配置 / 大模型”两个选项卡。“配置”仅设置图片资源路径和工作目录,默认分别为 `images`、`work`;相对路径以程序目录为基准,也可填写绝对路径。保存会创建所需目录,取消不保存;切换选项卡保留草稿,保存失败保留草稿并报错。工作目录设置目前仅保存并创建对应目录,不改变数据库位置。 首次初始化且没有模型配置时,默认模型为 Qwen,API 地址为 `https://maas.qianwenaiapi.com/compatible-mode/v1`,模型 ID 为 `qwen3.8-max-0902`([千问官方模型页](https://www.qianwenai.com/models/qwen3.8-max-0902))。同时预置一条 `qwen-max` 示例记录,使用相同地址和占位 Key `sk-placeholder`。两条记录均未启用;已有模型配置和主动清空的列表保持原样,不迁移或覆盖。真实 API 调用尚未验证,笔记 AI 操作入口尚未接入。 ## 适合谁 - 需要一个本地资料库的开发者。 - 想把工作记录、项目资料和临时想法放在一起管理的人。 - 不希望笔记工具绑定账号、订阅或复杂云服务的个人用户。 - 偏好 Markdown,但又希望保留纯文本快速记录体验的用户。 ## 当前边界 Velune 现阶段优先做好本地笔记本能力。同步、发布、协作等能力会在产品体验稳定后再逐步设计,避免过早引入复杂平台功能。 ## 技术栈 - 桌面容器:Tauri v2 - 前端:Vue 3、TypeScript、Vite、Pinia - UI:Ant Design Vue - 编辑器:md-editor-v3 - 画布:[Vue Flow 1.48.2](https://vueflow.dev/guide/) 与 [Node Resizer 1.5.1](https://vueflow.dev/guide/components/node-resizer.html),进入画布时按需加载 - 数据库:SQLite,基于 Tauri SQL 插件 ## 开发运行 ```bash pnpm install pnpm tauri dev ``` ## 构建 ```bash pnpm build pnpm tauri build ``` ## 发布构建 项目内置 GitHub Actions 发布构建配置。在 GitHub 仓库推送 `v*` 标签后,会自动构建 Tauri 安装包,所有平台构建成功后创建正式 Release。仅推送到 Gitee 不会直接执行 GitHub Actions;需要另外配置并验证 GitHub 镜像同步。 ```bash git push origin master git tag -a v1.0.0 -m "Release v1.0.0" git push origin v1.0.0 ``` ## 数据文件 程序使用可执行文件同目录下的 `drip-note.db`。搬移程序时,请将该文件一同搬移。 画布图片按文件名引用配置的图片资源目录中的文件,不将图片复制或嵌入数据库。备份或搬移程序时,请一并保留配置对应的图片目录及其文件名;绝对路径需在新位置可用或重新配置。删除或重命名被引用的图片会使对应卡片显示错误。 笔记、应用配置、AI 模型配置和目录展开状态均保存在 SQLite。程序不再读取、写入或自动导入 `config.json`、`tabs.json`;仅存在于旧 JSON 文件中的配置需要重新设置。数据库读取或解析失败会明确报错,不切换数据源。图片附件仍保存在配置的图片目录。 启动时直接删除不符合目录规则的记录,不做历史迁移:挂在笔记下的节点及其后代、孤立或循环节点、未知类型,以及带正文的文件夹会被移除。合法笔记保留原有类型和内容。清理通过单条 SQL 同步删除记录及搜索索引;清理失败会阻止初始化。创建和移动在状态层与存储层校验,数据库触发器另外约束父节点必须为文件夹、类型不可变和禁止循环。 画布文档以带版本的 JSON 字符串保存在 SQLite 的 `tree_nodes.content` 字段,不创建独立 JSON 文件。卡片标题和文字摘要与文档在同一条 SQL 中写入,FTS 触发器同步索引;搜索匹配笔记名称、卡片标题和正文,不匹配坐标或内部 ID。图片默认标题为文件名,可通过属性修改。索引升级失败会阻止初始化并在下次启动重试,保留原始笔记。损坏或不支持的画布文档会显示错误,不会自动重置为空画布。 保存队列按笔记区分草稿;保存失败时保留草稿并阻止切换。配置批量写入和目录排序使用单条原子 SQL,写入成功后才更新内存。AI 目前仍只有配置入口,笔记 AI 操作尚未接入;未接入的旧插件、封面及书签模块已移除。 ## 验证 ```bash pnpm test pnpm build cargo test --locked --offline --lib --manifest-path src-tauri/Cargo.toml ``` 回归测试使用隔离的内存 SQLite、Vue 状态和 Tauri IPC mock,覆盖保存并发、失败回滚、编辑器重建、搜索时序及 AI 参数契约。Rust 测试验证日志过滤器更新后实际输出的事件。它们不替代桌面 WebView 交互或外部 AI 服务实测。 画布另外覆盖文档校验、撤销分组、搜索原子性、索引升级重试和保存失败后的切换保护。已在隔离的 Edge 浏览器组件页面验证添加、编辑、拖动、连线、尺寸调整、删除、撤销重做、视图恢复及浅色/深色主题;Tauri 原生窗口中的画布交互尚未验证。 目录规则测试覆盖三种笔记类型、父节点限制、类型不可变、循环校验,以及历史清理和搜索索引的失败回滚。已在隔离的内置浏览器组件页面验证创建、菜单、文件夹展开收起及移动;该页面使用内存存储,Tauri 原生窗口中的目录交互尚未验证。 本轮 56 项 Node 测试、7 项 Rust 测试、vue-tsc 类型检查、Vite 构建及 Windows 桌面版构建通过。隔离的内置浏览器组件页面已验证行内表单、文件夹图标、笔记标签、跨文件夹拖放、工具栏点击与拖入、标题双击与右键属性、宽高同行、图片占位、选图取消后保留占位、填入图片、图片适配与替换、撤销重做、重开恢复、缺图报错与重试、只读限制,以及设置切换选项卡保留草稿和目录准备失败;该页面使用内存存储和模拟图片接口。桌面原生窗口的真实交互尚未验证。Windows 窗口已设置 `dragDropEnabled: false`,以启用 WebView 内部 HTML5 拖拽;需要重启新构建,旧窗口不会因前端热更新获得该配置。 实现依据:[SQLite 原子事务](https://www.sqlite.org/atomiccommit.html)与[触发器](https://www.sqlite.org/lang_createtrigger.html)、[Tauri SQL 插件](https://v2.tauri.app/plugin/sql/)、[tracing-subscriber 0.3.22 reload](https://docs.rs/tracing-subscriber/0.3.22/tracing_subscriber/reload/index.html)。 拖放与图片显示依据:[Vue Flow 拖放示例](https://vueflow.dev/examples/dnd.html)、[Tauri WindowConfig](https://v2.tauri.app/reference/config/#windowconfig) 和 [convertFileSrc](https://v2.tauri.app/reference/javascript/api/namespacecore/#convertfilesrc)。 ## License MIT License