<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络，技术 on My Life is Going On</title><link>https://liuhp.net/categories/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/</link><description>Recent content in 网络，技术 on My Life is Going On</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 13 Jul 2026 21:55:07 +0800</lastBuildDate><atom:link href="https://liuhp.net/categories/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>博客客户端已经完成</title><link>https://liuhp.net/post/2026-07-13-215507/</link><pubDate>Mon, 13 Jul 2026 21:55:07 +0800</pubDate><guid>https://liuhp.net/post/2026-07-13-215507/</guid><description>&lt;h1 id="blogedit用原生桌面体验重新定义-hugo-博客管理"&gt;BlogEdit：用原生桌面体验重新定义 Hugo 博客管理
&lt;/h1&gt;&lt;p&gt;如果你和我一样，喜欢用 Hugo 配合 PaperMod 主题写博客，但又对命令行 SSH + scp 的编辑流程感到腻烦——那么 BlogEdit 可能就是你要找的答案。&lt;/p&gt;
&lt;p&gt;这是一个基于 &lt;strong&gt;Tauri 2&lt;/strong&gt; 和 &lt;strong&gt;SvelteKit 5&lt;/strong&gt; 的 macOS 原生客户端，设计上承袭 Apple HIG 风格。它的核心逻辑很简单：通过 SSH 远程管理博客文章，没有本地存储，所有读写都在远端完成。配合 AI 辅助写作、一键部署和沉浸式编辑器，让 Hugo 博客的日常维护变得像使用现代笔记应用一样顺滑。&lt;/p&gt;
&lt;h2 id="主要功能一览"&gt;主要功能一览
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文章 CRUD&lt;/strong&gt;：通过 SSH 远程创建、编辑、删除 Markdown 文件，数据始终留在服务器上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沉浸式单栏编辑器 + 滑入预览浮层&lt;/strong&gt;：专注写作，向右滑动即可预览渲染效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 辅助&lt;/strong&gt;：支持大纲生成、文章润色、摘要提取和自由对话，背后可对接任何兼容 OpenAI API 的服务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统计面板&lt;/strong&gt;：一目了然的文章总数、总字数、月度分布、标签分布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布即部署&lt;/strong&gt;：保存或删除文章后，自动触发 Hugo 构建命令，将站点部署到博客根目录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三档主题&lt;/strong&gt;：深色、浅色、跟随系统，配合 16 个 CSS 语义 Token，轻松适配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;侧边栏搜索过滤&lt;/strong&gt;：按标题、标签或分类快速筛选文章列表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义确认弹窗 + 弹簧动效&lt;/strong&gt;：细节上向 Apple 原生应用靠拢，操作反馈自然有弹性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="项目架构"&gt;项目架构
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── lib/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Sidebar.svelte # 文章列表 + 搜索 + 导航
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Editor.svelte # 编辑器 + 滑入预览
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── StatsPanel.svelte # 统计卡片
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── SettingsPanel.svelte # 设置页面
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── NewPostModal.svelte # 新建文章弹窗
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── ConfirmModal.svelte # 确认删除弹窗
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── state.svelte.js # 全局响应式状态
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── actions.svelte.js # 所有业务动作
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── routes/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── +layout.svelte # 根布局 + CSS Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── +page.svelte
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── src-tauri/src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── commands.rs # Rust 后端 SSH 与 AI 调用
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前端采用 SvelteKit 2（adapter-static 打包为 SPA），后端是 Tauri 2 的 Rust 命令层，通过 &lt;code&gt;system ssh&lt;/code&gt; 执行远程操作，通过 &lt;code&gt;reqwest&lt;/code&gt; 调用 AI API。&lt;/p&gt;
&lt;h2 id="如何开发"&gt;如何开发
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run tauri dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tauri 的热重载让 Svelte 组件修改即时反映在原生窗口中，调试体验和 Web 开发几乎一致。&lt;/p&gt;
&lt;h2 id="构建发布"&gt;构建发布
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run release
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个命令会自动：自增版本号 → 编译 Rust → 打包 → 安装到 &lt;code&gt;/Applications/BlogEdit.app&lt;/code&gt;。发布后可直接从 Launchpad 启动，像使用任何 macOS 应用一样。&lt;/p&gt;
&lt;h2 id="备份机制"&gt;备份机制
&lt;/h2&gt;&lt;p&gt;项目的 Git 仓库托管在自建服务器上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# remote: root@10.10.10.254:/mnt/mmc0-8/git/blogedit.git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="你需要配置什么"&gt;你需要配置什么
&lt;/h2&gt;&lt;p&gt;打开设置面板，填入以下信息即可使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH 地址、博客 Hugo 根目录路径、部署路径&lt;/li&gt;
&lt;li&gt;AI API 地址 / Key / 模型（可选）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么选择-tauri--sveltekit"&gt;为什么选择 Tauri + SvelteKit
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;更小的体积&lt;/strong&gt;：相比 Electron，Tauri 应用打包后不足 10 MB。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原生性能&lt;/strong&gt;：Rust 后端直接调用系统 SSH，无需额外依赖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apple 风格&lt;/strong&gt;：Svelte 的响应式系统与 CSS 计算能力结合，能精确还原 Apple HIG 动效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你也在寻找一个优雅的 Hugo 桌面客户端，不妨试试 BlogEdit。它没有云端同步、没有第三方服务依赖，有的只是对写作和生产力的尊重。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;项目持续迭代中，欢迎贡献想法或 PR。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>