<?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%E5%8D%9A%E5%AE%A2/</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%E5%8D%9A%E5%AE%A2/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-项目更新说明"&gt;BlogEdit 项目更新说明
&lt;/h1&gt;&lt;h2 id="项目概述"&gt;项目概述
&lt;/h2&gt;&lt;p&gt;基于 Tauri 2 + Svelte 5 + Vite 构建的 Hugo 博客桌面客户端，通过 SSH 远程管理博客文章，支持本地 Ollama AI 辅助写作与一键部署。采用 Apple 风格设计，强调简洁、高效、稳定与安全。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="技术架构"&gt;技术架构
&lt;/h2&gt;&lt;h3 id="前端技术"&gt;前端技术
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;框架&lt;/strong&gt;：Svelte 5 + Vite（纯 SPA，无框架）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心组件&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;App.svelte&lt;/code&gt;（根组件）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sidebar.svelte&lt;/code&gt;（侧边栏）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Editor.svelte&lt;/code&gt;（编辑器）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AiPage.svelte&lt;/code&gt;（AI对话页）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Settings.svelte&lt;/code&gt;（设置面板）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stats.svelte&lt;/code&gt;（统计卡片）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Modal.svelte&lt;/code&gt;（统一弹窗组件）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="后端技术"&gt;后端技术
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;框架&lt;/strong&gt;：Tauri 2 (Rust) + Tokio + Reqwest + Serde_YAML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键模块&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;utils.js&lt;/code&gt;（所有业务逻辑）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;store.svelte.js&lt;/code&gt;（全局状态管理）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ai_messages&lt;/code&gt;（AI对话流式传输）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="博客系统"&gt;博客系统
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;存储路径&lt;/strong&gt;：&lt;code&gt;{server_path}/content/post/*.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部署方式&lt;/strong&gt;：通过 SSH 远程管理&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&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;blogedit/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── index.html # Vite 入口（inline 脚本预置 data-theme 防闪烁）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── package.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── vite.config.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── jsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── bump.sh # 版本号管理
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── release.sh # 发版流程（测试→版本+1→构建→安装）
&lt;/span&gt;&lt;/span&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;│ ├── main.js # 挂载 App + 引入全局样式
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── style.css # 全部样式（token + 组件）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── store.svelte.js # 全局状态（$state + SvelteSet）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── utils.js # 所有业务逻辑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── utils.test.js # 纯函数单测
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── App.svelte # 根组件（布局 + 主题 + 设置加载）
&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 # 编辑器 + AI侧面板 + 预览
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── AiPage.svelte # 独立 AI 对话页
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Settings.svelte # 设置（SSH/AI/博客地址）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Stats.svelte # 统计卡片 + 月度趋势图
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── Modal.svelte # 统一弹窗（confirm/prompt/newPost）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── src-tauri/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── Cargo.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── tauri.conf.json
&lt;/span&gt;&lt;/span&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; ├── main.rs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── lib.rs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── commands.rs # 全部 Tauri 命令 + 单测
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="设计原则"&gt;设计原则
&lt;/h2&gt;&lt;p&gt;按「简洁 → 高效 → 稳定 → 安全」标准，Apple 风格：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;简洁&lt;/strong&gt;：纯 Vite + Svelte 5，不用框架。一个 &lt;code&gt;App.svelte&lt;/code&gt; 做条件渲染，不带路由魔术文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高效&lt;/strong&gt;：CSS 一个文件，全局 import。border-radius 4/6/8/10 四级，active scale 统一 0.96&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稳定&lt;/strong&gt;：Modal 一个组件自适应三种模式，不需要三个独立弹窗&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全&lt;/strong&gt;：所有业务逻辑在 &lt;code&gt;utils.js&lt;/code&gt; 一个文件，不设中间层&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全加固&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SvelteSet&lt;/code&gt; 保证多选 checkbox 响应式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sq_escape&lt;/code&gt; 防 SSH 注入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DOMPurify&lt;/code&gt; 防 XSS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交互优化&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;SSH 命令统一 30s 超时，写入 15s 超时&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index.html&lt;/code&gt; inline 脚本预置 &lt;code&gt;data-theme&lt;/code&gt;，消除亮暗切换闪烁&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="全局状态"&gt;全局状态
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;app = $state({...})&lt;/code&gt; 单例。核心字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;posts&lt;/code&gt;：博客文章集合&lt;/li&gt;
&lt;li&gt;&lt;code&gt;activePost&lt;/code&gt;：当前编辑文章&lt;/li&gt;
&lt;li&gt;&lt;code&gt;view&lt;/code&gt;：视图模式（编辑/预览）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;connected&lt;/code&gt;：是否连接 SSH&lt;/li&gt;
&lt;li&gt;&lt;code&gt;settings&lt;/code&gt;：设置配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aiMessages&lt;/code&gt;：AI对话历史&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama&lt;/code&gt;：Ollama 实例状态&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modal&lt;/code&gt;：统一弹窗组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selectMode&lt;/code&gt;：选择模式（编辑/预览）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selectedPosts&lt;/code&gt;：选中文章集合&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="tauri-命令"&gt;Tauri 命令
&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;test_connection &lt;span class="c1"&gt;# 测试 SSH 连接 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;setup_key_auth &lt;span class="c1"&gt;# 设置 SSH 密钥 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;list_posts &lt;span class="c1"&gt;# 列出博客文章 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;read_post &lt;span class="c1"&gt;# 读取指定文章 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;save_post &lt;span class="c1"&gt;# 保存指定文章 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;create_post &lt;span class="c1"&gt;# 创建新文章 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;delete_post &lt;span class="c1"&gt;# 删除指定文章 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trigger_deploy &lt;span class="c1"&gt;# 触发部署 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_statistics &lt;span class="c1"&gt;# 获取统计信息 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get/save_settings &lt;span class="c1"&gt;# 原子写入设置（权限 0o600） &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ai_chat_stream &lt;span class="c1"&gt;# 流式 AI 对话（SSE） &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;check_ollama &lt;span class="c1"&gt;# 检查 Ollama 状态 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pull_model &lt;span class="c1"&gt;# 拉取模型 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;install_ollama &lt;span class="c1"&gt;# 安装 Ollama &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;open_external &lt;span class="c1"&gt;# 打开外部链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&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 class="c1"&gt;# 安装依赖 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run tauri dev &lt;span class="c1"&gt;# Tauri 开发模式 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="c1"&gt;# 前端测试 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run release &lt;span class="c1"&gt;# patch 版本 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash release.sh minor &lt;span class="c1"&gt;# minor 版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="架构亮点"&gt;架构亮点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单文件 CSS&lt;/strong&gt;：全局样式通过 &lt;code&gt;style.css&lt;/code&gt; 导入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一弹窗&lt;/strong&gt;：&lt;code&gt;Modal.svelte&lt;/code&gt; 适配三种模式（confirm/prompt/newPost）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原子写入&lt;/strong&gt;：&lt;code&gt;get/save_settings&lt;/code&gt; 采用 0o600 权限控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流式传输&lt;/strong&gt;：&lt;code&gt;ai_chat_stream&lt;/code&gt; 通过 SSE 实现实时对话&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="未来方向"&gt;未来方向
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;增加多语言支持&lt;/li&gt;
&lt;li&gt;实现文章版本控制&lt;/li&gt;
&lt;li&gt;支持 Markdown 语法高亮&lt;/li&gt;
&lt;li&gt;集成 Git 脚本自动部署&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;项目遵循 Apple 风格设计，注重用户体验与开发效率，所有核心功能均通过 Svelte 5 和 Vite 实现，保持轻量级与高性能。&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>