feat.文档更新

This commit is contained in:
lincube
2026-06-08 03:54:33 +08:00
parent 7db72fbcd0
commit 49af6601aa
247 changed files with 2939 additions and 0 deletions

View File

@@ -0,0 +1,156 @@
# 项目介绍
## 什么是阑山桌面
**LanMountainDesktop阑山桌面** 是一个基于 .NET 和 Avalonia UI 的模块化桌面定制平台,旨在为用户提供高度可定制的桌面体验。
### 核心特性
#### 🧩 插件系统
- **进程内插件** - 当前稳定的插件运行模式
- **进程隔离插件** - 未来支持的隔离模式(规划中)
- **插件 SDK** - 完整的插件开发工具包
- **插件市场** - 应用内插件浏览和安装
#### 🎨 桌面组件Widget
- **可视化编辑** - 拖拽式布局编辑
- **多种组件** - 时钟、天气、日历、倒计时等
- **自定义组件** - 通过插件扩展新组件
- **主题支持** - 亮色/暗色模式自适应
#### 🚀 Air APP 系统
- **独立应用** - 在桌面环境中运行的独立窗口应用
- **生命周期管理** - 统一的应用启动、激活和清理
- **窗口模式** - 标准、无边框、全屏、工具窗口
- **IPC 通信** - 与桌面宿主的双向通信
#### ⚙️ 设置系统
- **分域管理** - 按功能模块组织设置
- **持久化** - 自动保存到本地
- **插件集成** - 插件可注册自己的设置页
#### 🔄 更新系统
- **增量更新** - 只下载变更文件,节省带宽
- **原子化更新** - 保证更新完整性,失败自动回滚
- **多版本管理** - 支持版本共存和回退
- **签名验证** - RSA 签名确保安全性
## 技术架构
### 核心技术栈
| 技术 | 版本 | 用途 |
|------|------|------|
| .NET | 10.0 | 应用框架 |
| Avalonia UI | 12.x | 跨平台 UI 框架 |
| FluentAvalonia | 2.x | Fluent Design 控件 |
| CommunityToolkit.Mvvm | 8.x | MVVM 框架 |
| VeloPack | 最新 | 应用更新系统 |
| dotnetCampus.Ipc | 最新 | 进程间通信 |
### 项目结构
```
LanMountainDesktop/
├── LanMountainDesktop/ # 主桌面宿主应用
├── LanMountainDesktop.Launcher/ # 启动器OOBE、Splash、版本管理
├── LanMountainDesktop.AirAppRuntime/ # Air APP 运行时容器
├── LanMountainDesktop.AirAppHost/ # Air APP 渲染进程
├── LanMountainDesktop.PluginSdk/ # 插件 SDK
├── LanMountainDesktop.Shared.Contracts/ # 共享契约类型
├── LanMountainDesktop.Settings.Core/ # 设置系统
├── LanMountainDesktop.Appearance/ # 主题和外观
├── LanMountainDesktop.DesktopComponents.Runtime/# 组件运行时
└── LanMountainDesktop.PluginIsolation.*/ # 插件隔离(未来)
```
### 启动流程
```
用户启动 Launcher.exe
首次启动 → OOBE 引导
显示 Splash 启动动画
预启动 AirAppRuntime框架依赖 JIT 进程)
扫描 app-* 目录,选择最佳版本
启动 LanMountainDesktop.exe主程序
初始化日志、遥测、Host 生命周期
加载主题、语言、设置
初始化桌面壳层、主窗口、托盘
加载插件、注册组件
桌面就绪
```
## 应用场景
### 个人用户
- **桌面定制** - 打造个性化的桌面环境
- **效率工具** - 快速访问常用功能和信息
- **信息聚合** - 在桌面上展示天气、日历、待办等
### 开发者
- **插件开发** - 为桌面扩展新功能
- **Air APP 开发** - 创建独立的桌面应用
- **组件开发** - 设计自定义桌面组件
### 企业用户
- **定制部署** - 企业专用的桌面环境
- **信息看板** - 展示企业数据和通知
- **工作流集成** - 集成企业工作流工具
## 版本与支持
### 当前版本
- **稳定版**: 查看 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases)
- **预览版**: 通过更新频道切换到 Preview
### 平台支持
-**Windows 10/11** - 完整支持
- 🚧 **Linux** - 计划支持
- 🚧 **macOS** - 计划支持
### 系统要求
- **操作系统**: Windows 10 1809 或更高版本
- **.NET Runtime**: 自动包含,无需单独安装
- **内存**: 建议 4GB 或更高
- **磁盘**: 安装需要约 200MB 空间
## 开发理念
### 模块化设计
所有功能通过插件和组件实现,核心保持精简。
### 开放生态
鼓励社区开发插件和组件,共建生态系统。
### 稳定可靠
原子化更新、版本回退、进程隔离等机制保证系统稳定。
### 性能优先
增量更新、延迟加载、异步渲染等优化确保流畅体验。
## 开源协议
本项目采用 [MIT License](https://github.com/HelloWRC/LanMountainDesktop/blob/main/LICENSE) 开源协议。
## 社区与贡献
- **GitHub**: https://github.com/HelloWRC/LanMountainDesktop
- **Issues**: 报告 Bug 和功能建议
- **Discussions**: 技术讨论和问答
- **Pull Requests**: 欢迎贡献代码和文档
## 下一步
- [快速安装](02-快速安装.md) - 安装阑山桌面
- [开发环境配置](03-开发环境配置.md) - 配置开发环境
- [插件开发快速开始](../01-插件开发/01-快速开始/01-环境准备.md) - 开始开发插件

View File

@@ -0,0 +1,277 @@
# 快速安装
本指南将帮助你快速安装和运行阑山桌面。
## 安装方式
### 方式一:使用安装包(推荐)
#### 下载安装包
访问 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases) 页面,下载最新版本的安装包:
- **Windows x64**: `LanMountainDesktop-Setup-{version}-x64.exe`
#### 运行安装程序
1. 双击下载的安装包
2. 按照安装向导提示完成安装
3. 安装完成后,启动器会自动运行
#### 首次启动 (OOBE)
首次启动时会显示欢迎页面:
1. **欢迎页** - 项目介绍和基本说明
2. **权限确认** - 了解应用所需的权限
3. **基础设置** - 选择主题、语言等
4. **完成** - 开始使用阑山桌面
### 方式二:便携版
#### 下载便携包
从 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases) 下载:
- **Windows x64**: `LanMountainDesktop-Portable-{version}-x64.zip`
#### 解压并运行
```powershell
# 解压到目标目录
Expand-Archive -Path LanMountainDesktop-Portable-1.0.0-x64.zip -DestinationPath C:\LanMountainDesktop
# 进入目录
cd C:\LanMountainDesktop
# 启动应用
.\LanMountainDesktop.Launcher.exe
```
#### 便携版特点
- ✅ 无需安装,解压即用
- ✅ 数据存储在程序目录
- ✅ 适合 U 盘或多机器同步使用
- ⚠️ 需要手动创建快捷方式
- ⚠️ 不会自动添加到开始菜单
## 目录结构
### 安装版目录结构
```
安装根目录/
├── LanMountainDesktop.Launcher.exe # 启动器(唯一入口)
├── app-1.0.0/ # 版本目录
│ ├── .current # 当前版本标记
│ ├── LanMountainDesktop.exe # 主程序
│ ├── *.dll # 依赖库
│ └── ...
├── LanMountainDesktop.AirAppRuntime.exe # Air APP 运行时
├── .Launcher/ # 启动器数据
│ ├── state/ # OOBE 状态
│ └── update/ # 更新缓存
└── unins000.exe # 卸载程序
```
### 用户数据目录
```
%LOCALAPPDATA%\LanMountainDesktop\
├── settings/ # 设置文件
├── plugins/ # 已安装插件
├── logs/ # 日志文件
├── cache/ # 缓存数据
└── telemetry/ # 遥测数据(可选)
```
### 便携版目录结构
便携版的用户数据存储在程序目录的 `Data/` 文件夹下:
```
LanMountainDesktop/
├── LanMountainDesktop.Launcher.exe
├── app-1.0.0/
├── Data/ # 便携数据目录
│ ├── settings/
│ ├── plugins/
│ ├── logs/
│ └── cache/
└── ...
```
## 启动选项
### 正常启动
```powershell
# 双击启动器
.\LanMountainDesktop.Launcher.exe
# 或从开始菜单启动
```
### 命令行选项
```powershell
# 显示版本信息
.\LanMountainDesktop.Launcher.exe --version
# 显示帮助信息
.\LanMountainDesktop.Launcher.exe --help
# 重置 OOBE 状态(重新显示欢迎页)
.\LanMountainDesktop.Launcher.exe --reset-oobe
# 启动到指定版本
.\LanMountainDesktop.Launcher.exe --version 1.0.0
# 安装插件(本地维护命令)
.\LanMountainDesktop.Launcher.exe plugin install path\to\plugin.laapp
# 应用插件更新队列(本地维护命令)
.\LanMountainDesktop.Launcher.exe plugin update
```
## 验证安装
### 检查应用状态
启动后,你应该看到:
1. **桌面组件** - 默认的时钟或其他组件显示在桌面上
2. **系统托盘图标** - 阑山桌面的托盘图标
3. **主窗口** - 可通过托盘图标打开
### 检查日志
如果遇到问题,可以查看日志:
```powershell
# 打开日志目录
explorer %LOCALAPPDATA%\LanMountainDesktop\logs
# 查看最新日志
Get-Content %LOCALAPPDATA%\LanMountainDesktop\logs\latest.log -Tail 50
```
### 检查版本信息
1. 右键点击托盘图标
2. 选择"关于"或"设置"
3. 查看版本号和构建信息
## 常见问题
### 安装失败
**问题**: 安装程序报错或无法完成安装
**解决方案**:
1. 确认 Windows 版本 ≥ Windows 10 1809
2. 以管理员身份运行安装程序
3. 关闭杀毒软件和防火墙
4. 检查磁盘空间是否充足(≥ 500MB
5. 查看安装日志:`%TEMP%\LanMountainDesktop-Setup.log`
### 启动失败
**问题**: 双击启动器没有反应
**解决方案**:
1. 检查进程管理器是否已有实例运行
2. 查看日志文件:`%LOCALAPPDATA%\LanMountainDesktop\logs\latest.log`
3. 尝试以管理员身份运行
4. 检查是否有其他应用占用端口或资源
### OOBE 无法显示
**问题**: 首次启动没有显示欢迎页面
**解决方案**:
1. 删除 OOBE 状态文件:
```powershell
Remove-Item -Path "$env:LOCALAPPDATA\LanMountainDesktop\.launcher\state\oobe-state.json" -Force
```
2. 重新启动应用
### 组件不显示
**问题**: 桌面上看不到任何组件
**解决方案**:
1. 右键点击桌面空白处
2. 选择"添加组件"
3. 选择一个组件添加到桌面
4. 检查组件是否被其他窗口遮挡
5. 确认桌面图层设置正确(设置 → 桌面 → 图层模式)
## 卸载应用
### 使用控制面板
1. 打开"设置" → "应用" → "已安装的应用"
2. 找到"LanMountainDesktop"
3. 点击"卸载"按钮
4. 按照向导完成卸载
### 使用卸载程序
```powershell
# 运行卸载程序
.\unins000.exe
```
### 清理残留数据
卸载后,用户数据不会自动删除。如需彻底清理:
```powershell
# 删除用户数据目录
Remove-Item -Path "$env:LOCALAPPDATA\LanMountainDesktop" -Recurse -Force
# 删除 Launcher 状态
Remove-Item -Path "$env:LOCALAPPDATA\LanMountainDesktop\.launcher" -Recurse -Force
# 删除缓存(如果存在)
Remove-Item -Path "$env:TEMP\LanMountainDesktop" -Recurse -Force -ErrorAction SilentlyContinue
```
## 更新应用
### 自动更新(推荐)
阑山桌面支持自动更新:
1. 应用会在后台检查更新
2. 发现新版本时会提示下载
3. 下载完成后重启应用自动安装
4. 支持增量更新,只下载变更文件
### 手动更新
如果需要手动更新:
1. 访问 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases)
2. 下载最新版本的安装包
3. 运行安装包,选择"覆盖安装"
4. 安装完成后启动新版本
### 更新频道
可以在设置中切换更新频道:
- **Stable稳定版**: 只接收正式发布的版本
- **Preview预览版**: 接收所有版本,包括预发布版本
```
设置 → 更新 → 更新频道 → 选择频道
```
## 下一步
- [开发环境配置](03-开发环境配置.md) - 配置开发环境
- [插件开发快速开始](../01-插件开发/01-快速开始/01-环境准备.md) - 开始开发插件
- [使用教程](04-基础使用.md) - 了解基本使用方法

View File

@@ -0,0 +1,380 @@
# 开发环境配置
本指南将帮助你配置阑山桌面的开发环境,以便进行插件开发、组件开发或贡献核心代码。
## 系统要求
### 操作系统
- Windows 10 1809 或更高版本(推荐 Windows 11
- Linux实验性支持
- macOS计划支持
### 硬件要求
- **CPU**: 双核或更高
- **内存**: 8GB 或更高(推荐 16GB
- **磁盘**: 至少 10GB 可用空间
- **显示器**: 1920x1080 或更高分辨率
## 必需工具
### 1. .NET SDK
阑山桌面基于 .NET 10需要安装对应的 SDK。
#### 下载并安装
访问 [.NET 官网](https://dotnet.microsoft.com/download/dotnet/10.0) 下载并安装 .NET 10 SDK。
#### 验证安装
```powershell
dotnet --version
# 应输出: 10.0.x
```
### 2. IDE 选择
#### 选项 A: Visual Studio 2022推荐
**下载**: [Visual Studio 2022](https://visualstudio.microsoft.com/vs/)
**工作负载**:
- ✅ .NET 桌面开发
- ✅ ASP.NET 和 Web 开发(用于调试工具)
- ✅ .NET 跨平台开发
**推荐扩展**:
- Avalonia for Visual Studio
- GitHub Copilot可选
- ReSharper 或 Rider可选
#### 选项 B: JetBrains Rider
**下载**: [JetBrains Rider](https://www.jetbrains.com/rider/)
**优势**:
- 优秀的代码分析和重构功能
- 内置 Avalonia 支持
- 跨平台支持
#### 选项 C: Visual Studio Code
**下载**: [Visual Studio Code](https://code.visualstudio.com/)
**必需扩展**:
- C# Dev Kit
- Avalonia for VSCode
- .NET Extension Pack
**配置**:
```json
// .vscode/settings.json
{
"dotnet.defaultSolution": "LanMountainDesktop.sln",
"omnisharp.enableRoslynAnalyzers": true,
"omnisharp.enableEditorConfigSupport": true
}
```
### 3. Git
#### 下载并安装
- **Windows**: [Git for Windows](https://git-scm.com/download/win)
- **Linux**: `sudo apt install git``sudo dnf install git`
- **macOS**: `brew install git`
#### 验证安装
```powershell
git --version
# 应输出: git version 2.x.x
```
#### 配置 Git
```powershell
git config --global user.name "你的名字"
git config --global user.email "your.email@example.com"
```
## 可选工具
### 1. PowerShell 7+
用于运行构建和发布脚本。
```powershell
# 安装 PowerShell 7
winget install Microsoft.PowerShell
```
### 2. Windows Terminal
更好的终端体验。
```powershell
# 安装 Windows Terminal
winget install Microsoft.WindowsTerminal
```
### 3. Avalonia UI 预览器
#### Visual Studio 扩展
在 Visual Studio 中安装"Avalonia for Visual Studio"扩展,可以实时预览 AXAML 文件。
#### JetBrains Rider
Rider 内置了 Avalonia 预览器,无需额外安装。
## 克隆仓库
### 从 GitHub 克隆
```powershell
# 克隆主仓库
git clone https://github.com/HelloWRC/LanMountainDesktop.git
# 进入目录
cd LanMountainDesktop
# 切换到开发分支(如果有)
git checkout develop
```
### 初始化子模块
如果项目使用了 Git 子模块:
```powershell
git submodule update --init --recursive
```
## 构建项目
### 还原依赖
```powershell
# 还原 NuGet 包
dotnet restore
```
### 构建解决方案
```powershell
# 构建整个解决方案
dotnet build
# 或者构建特定项目
dotnet build LanMountainDesktop/LanMountainDesktop.csproj
```
### 运行应用
```powershell
# 方式 1: 通过 Launcher 启动(推荐)
dotnet run --project LanMountainDesktop.Launcher
# 方式 2: 直接启动主程序(开发模式)
dotnet run --project LanMountainDesktop
# 方式 3: 使用 Visual Studio
# 按 F5 启动调试
```
## 项目结构
### 解决方案结构
```
LanMountainDesktop.sln
├── LanMountainDesktop # 主程序
├── LanMountainDesktop.Launcher # 启动器
├── LanMountainDesktop.PluginSdk # 插件 SDK
├── LanMountainDesktop.AirAppRuntime # Air APP 运行时
├── LanMountainDesktop.AirAppHost # Air APP 宿主
├── LanMountainDesktop.Shared.Contracts # 共享契约
└── LanMountainDesktop.Tests # 测试项目
```
### 重要目录
| 目录 | 说明 |
|------|------|
| `LanMountainDesktop/Views/` | UI 视图文件 (.axaml) |
| `LanMountainDesktop/ViewModels/` | 视图模型 |
| `LanMountainDesktop/Services/` | 业务服务 |
| `LanMountainDesktop/ComponentSystem/` | 组件系统 |
| `LanMountainDesktop/plugins/` | 插件运行时 |
| `scripts/` | 构建和发布脚本 |
| `docs/` | 文档 |
## 安装插件模板
### 安装官方模板
```powershell
# 安装插件模板
dotnet new install LanMountainDesktop.PluginTemplate
# 验证安装
dotnet new list | Select-String "lmd"
```
### 创建测试插件
```powershell
# 创建新插件
dotnet new lmd-plugin -n MyTestPlugin
# 进入插件目录
cd MyTestPlugin
# 构建插件
dotnet build
# 打包为 .laapp
dotnet publish -c Release
```
## 调试配置
### Visual Studio 调试配置
1. 右键点击"LanMountainDesktop.Launcher"项目
2. 选择"设为启动项目"
3. 按 F5 开始调试
### 多项目调试
如果需要同时调试 Launcher 和 Host
1. 右键点击解决方案
2. 选择"属性" → "启动项目"
3. 选择"多个启动项目"
4. 设置"LanMountainDesktop.Launcher"为"启动"
### VSCode 调试配置
创建 `.vscode/launch.json`
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Launcher",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/LanMountainDesktop.Launcher/bin/Debug/net10.0/LanMountainDesktop.Launcher.exe",
"args": [],
"cwd": "${workspaceFolder}/LanMountainDesktop.Launcher/bin/Debug/net10.0",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Launch Host (Direct)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/LanMountainDesktop/bin/Debug/net10.0/LanMountainDesktop.exe",
"args": [],
"cwd": "${workspaceFolder}/LanMountainDesktop/bin/Debug/net10.0",
"console": "internalConsole",
"stopAtEntry": false
}
]
}
```
## 运行测试
### 运行所有测试
```powershell
dotnet test
```
### 运行特定测试项目
```powershell
dotnet test LanMountainDesktop.Tests/LanMountainDesktop.Tests.csproj
```
### 带覆盖率的测试
```powershell
dotnet test --collect:"XPlat Code Coverage"
```
## 代码规范
### EditorConfig
项目包含 `.editorconfig` 文件,自动配置代码风格。确保你的 IDE 支持 EditorConfig。
### 代码分析
项目启用了 Roslyn 分析器,编译时会显示代码质量警告。
### 推荐的编码规范
- 使用 `nullable` 引用类型
- 遵循 C# 命名约定
- 优先使用 `async/await` 而不是 `Task.Wait()`
- 为公共 API 编写 XML 文档注释
## 常见问题
### 编译错误: SDK 版本不匹配
**问题**: `error NETSDK1045: The current .NET SDK does not support targeting .NET 10.0`
**解决方案**:
```powershell
# 检查 SDK 版本
dotnet --list-sdks
# 如果没有 10.0.x请安装 .NET 10 SDK
```
### NuGet 包还原失败
**问题**: `error NU1101: Unable to find package`
**解决方案**:
```powershell
# 清理 NuGet 缓存
dotnet nuget locals all --clear
# 重新还原
dotnet restore
```
### Avalonia 预览器不工作
**问题**: AXAML 文件无法预览
**解决方案**:
1. 确保安装了 Avalonia 扩展
2. 重启 IDE
3. 检查项目是否正确引用了 Avalonia 包
4. 尝试清理并重新构建项目
### 调试时无法附加进程
**问题**: 无法附加到 LanMountainDesktop 进程
**解决方案**:
1. 确保没有其他实例正在运行
2. 以管理员身份运行 IDE
3. 检查防火墙设置
4. 使用"直接启动 Host"模式而不是通过 Launcher
## 下一步
- [插件开发快速开始](../01-插件开发/01-快速开始/01-环境准备.md) - 开始开发插件
- [整体架构](../04-架构与实现/01-整体架构.md) - 了解系统架构
- [贡献指南](05-贡献指南.md) - 贡献代码到项目

View File

@@ -0,0 +1,345 @@
# 插件开发 - 环境准备
## 前置要求
在开始开发插件之前,请确保你已经:
- ✅ 安装了 .NET 10 SDK
- ✅ 安装了支持 C# 的 IDEVisual Studio 2022 / Rider / VS Code
- ✅ 了解 C# 基础语法
- ✅ 了解 Avalonia UI 基础(或 WPF两者相似
> 如果还没有配置开发环境,请先阅读 [开发环境配置](../../00-快速开始/03-开发环境配置.md)
## 安装插件模板
### 安装官方模板
阑山桌面提供了官方的插件项目模板,可以快速创建插件项目骨架。
```powershell
# 安装插件模板包
dotnet new install LanMountainDesktop.PluginTemplate
# 验证安装成功
dotnet new list | Select-String "lmd"
```
你应该看到类似输出:
```
lmd-plugin LanMountainDesktop Plugin C# LanMountainDesktop/Plugin
```
### 模板版本管理
```powershell
# 查看已安装的模板
dotnet new list lmd
# 更新到最新版本
dotnet new install LanMountainDesktop.PluginTemplate --force
# 卸载模板
dotnet new uninstall LanMountainDesktop.PluginTemplate
```
## 创建第一个插件项目
### 使用模板创建项目
```powershell
# 创建新插件项目
dotnet new lmd-plugin -n MyFirstPlugin
# 进入项目目录
cd MyFirstPlugin
```
### 项目结构
创建后的项目结构如下:
```
MyFirstPlugin/
├── MyFirstPlugin.csproj # 项目文件
├── Plugin.cs # 插件入口类
├── plugin.json # 插件清单
├── Components/ # 组件目录
│ └── SampleComponent.cs # 示例组件
├── Views/ # 视图目录
│ └── SampleComponentView.axaml # 组件视图
│ └── SampleComponentView.axaml.cs # 视图代码后台
├── ViewModels/ # 视图模型
│ └── SampleComponentViewModel.cs # 组件视图模型
├── Settings/ # 设置页目录
│ └── PluginSettingsPage.axaml # 设置页视图
│ └── PluginSettingsPage.axaml.cs # 设置页代码
├── Assets/ # 资源目录
│ └── icon.png # 插件图标
└── Localization/ # 本地化目录
└── Strings.resx # 字符串资源
```
## 理解插件清单
### plugin.json 文件
`plugin.json` 是插件的元数据文件,定义了插件的基本信息。
```json
{
"Id": "com.example.myfirstplugin",
"Name": "My First Plugin",
"Version": "1.0.0",
"Author": "Your Name",
"Description": "My first LanMountainDesktop plugin",
"MinHostVersion": "1.0.0",
"SdkVersion": "5.0.0",
"Dependencies": [],
"Permissions": [
"Network.Access"
],
"Icon": "Assets/icon.png",
"Homepage": "https://github.com/yourusername/myfirstplugin",
"Repository": "https://github.com/yourusername/myfirstplugin.git"
}
```
### 字段说明
| 字段 | 必需 | 说明 |
|------|------|------|
| `Id` | ✅ | 插件唯一标识符,建议使用反向域名格式 |
| `Name` | ✅ | 插件显示名称 |
| `Version` | ✅ | 插件版本号,遵循语义化版本 |
| `Author` | ✅ | 插件作者 |
| `Description` | ✅ | 插件简介 |
| `MinHostVersion` | ✅ | 最低宿主版本要求 |
| `SdkVersion` | ✅ | 使用的 SDK 版本 |
| `Dependencies` | ❌ | 依赖的其他插件 ID 列表 |
| `Permissions` | ❌ | 插件所需权限列表 |
| `Icon` | ❌ | 插件图标路径 |
| `Homepage` | ❌ | 插件主页 URL |
| `Repository` | ❌ | 源码仓库 URL |
### 版本号规范
插件版本号遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/)
```
主版本号.次版本号.修订号
例如: 1.2.3
```
- **主版本号**: 不兼容的 API 修改
- **次版本号**: 向下兼容的功能性新增
- **修订号**: 向下兼容的问题修正
## 理解项目文件
### MyFirstPlugin.csproj
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<!-- 插件元数据 -->
<PluginId>com.example.myfirstplugin</PluginId>
<PluginName>My First Plugin</PluginName>
<PluginVersion>1.0.0</PluginVersion>
<!-- 禁用可执行文件生成,插件是类库 -->
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<!-- Plugin SDK -->
<PackageReference Include="LanMountainDesktop.PluginSdk" Version="5.0.0" />
<PackageReference Include="LanMountainDesktop.Shared.Contracts" Version="5.0.0" />
<!-- Avalonia UI -->
<PackageReference Include="Avalonia" Version="12.0.1" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="12.0.1" />
<!-- MVVM Toolkit -->
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
</ItemGroup>
<!-- 复制 plugin.json 到输出目录 -->
<ItemGroup>
<None Update="plugin.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<!-- Avalonia 编译支持 -->
<ItemGroup>
<AvaloniaResource Include="**\*.axaml" />
</ItemGroup>
</Project>
```
### 关键配置项
- **TargetFramework**: 必须是 `net10.0`
- **OutputType**: 必须是 `Library`(插件是类库,不是可执行文件)
- **Nullable**: 建议启用,提高代码质量
- **PluginId/PluginName/PluginVersion**: 应与 `plugin.json` 保持一致
## 构建插件
### 还原依赖
```powershell
dotnet restore
```
### 构建项目
```powershell
# Debug 模式
dotnet build
# Release 模式
dotnet build -c Release
```
### 查看输出
构建成功后,输出目录结构:
```
bin/Debug/net10.0/
├── MyFirstPlugin.dll # 主程序集
├── MyFirstPlugin.pdb # 调试符号
├── plugin.json # 插件清单
├── Assets/ # 资源文件
│ └── icon.png
└── *.dll # 依赖程序集
```
## 调试插件
### 方法一:复制到插件目录(推荐)
```powershell
# 构建插件
dotnet build
# 复制到宿主的插件目录
$pluginDir = "$env:LOCALAPPDATA\LanMountainDesktop\plugins\MyFirstPlugin"
New-Item -ItemType Directory -Path $pluginDir -Force
Copy-Item -Path "bin\Debug\net10.0\*" -Destination $pluginDir -Recurse -Force
# 启动宿主应用
# (确保宿主在 Debug 模式下构建,这样可以附加调试器)
```
### 方法二:使用符号链接
在开发模式下,可以创建符号链接避免每次复制:
```powershell
# 创建符号链接(需要管理员权限)
$pluginDir = "$env:LOCALAPPDATA\LanMountainDesktop\plugins\MyFirstPlugin"
$buildDir = "$(pwd)\bin\Debug\net10.0"
New-Item -ItemType SymbolicLink -Path $pluginDir -Target $buildDir -Force
```
### 方法三:配置宿主调试路径
如果你有宿主源码,可以修改宿主的插件搜索路径指向你的插件构建目录。
在宿主项目的 `appsettings.Development.json` 中:
```json
{
"PluginPaths": [
"C:\\Dev\\MyFirstPlugin\\bin\\Debug\\net10.0"
]
}
```
### 附加调试器
1. 启动宿主应用LanMountainDesktop
2. 在 Visual Studio 中,选择"调试" → "附加到进程"
3. 找到 `LanMountainDesktop.exe` 进程
4. 点击"附加"
5. 在插件代码中设置断点
## 查看日志
### 日志位置
```
%LOCALAPPDATA%\LanMountainDesktop\logs\latest.log
```
### 实时查看日志
```powershell
# PowerShell
Get-Content "$env:LOCALAPPDATA\LanMountainDesktop\logs\latest.log" -Wait -Tail 50
```
### 日志级别
- **Trace**: 最详细的信息,用于诊断
- **Debug**: 调试信息
- **Information**: 一般信息
- **Warning**: 警告信息
- **Error**: 错误信息
- **Critical**: 严重错误
## 常见问题
### 插件没有被加载
**检查清单**:
1. 确认 `plugin.json` 存在且格式正确
2. 确认插件 DLL 文件存在
3. 查看日志文件中的错误信息
4. 确认插件 ID 唯一,没有与其他插件冲突
5. 确认 SDK 版本匹配
### 编译错误:找不到类型
**问题**: `error CS0246: The type or namespace name 'IPlugin' could not be found`
**解决方案**:
```powershell
# 确认引用了 PluginSdk
dotnet add package LanMountainDesktop.PluginSdk --version 5.0.0
# 清理并重新构建
dotnet clean
dotnet build
```
### Avalonia 视图无法编译
**问题**: AXAML 文件编译错误
**解决方案**:
1. 确认安装了 Avalonia NuGet 包
2. 检查 AXAML 语法是否正确
3. 确认 `AvaloniaResource` 项已配置在 csproj 中
4. 清理并重新构建项目
## 下一步
现在你已经完成了环境准备,可以继续:
- [创建第一个插件](02-创建第一个插件.md) - 实现插件功能
- [插件生命周期](../02-核心概念/01-插件生命周期.md) - 理解插件运行机制
- [组件系统](../02-核心概念/02-组件系统.md) - 创建桌面组件

View File

@@ -0,0 +1,266 @@
# 插件开发完整指南
欢迎来到阑山桌面插件开发指南!本章节将带你从零开始,掌握插件开发的完整流程。
## 📚 学习路径
### 初学者路径
如果你是第一次开发阑山桌面插件,请按以下顺序学习:
1. **[环境准备](01-快速开始/01-环境准备.md)** - 配置开发环境和工具
2. **[创建第一个插件](01-快速开始/02-创建第一个插件.md)** - 快速上手
3. **[插件生命周期](02-核心概念/01-插件生命周期.md)** - 理解插件运行机制
4. **[组件系统](02-核心概念/02-组件系统.md)** - 创建桌面组件
### 进阶路径
已经了解基础,想要深入学习?
1. **[设置系统](02-核心概念/03-设置系统.md)** - 管理插件配置
2. **[主题与外观](02-核心概念/04-主题外观.md)** - 适配暗色/亮色模式
3. **[插件通信](02-核心概念/05-插件通信.md)** - 插件间数据交互
4. **[IPC 公共服务](03-API参考/05-IPC公共服务.md)** - 对外提供服务
### 实战路径
通过完整案例学习:
1. **[天气组件插件](04-实战案例/01-天气组件.md)** - 完整的组件开发
2. **[待办事项插件](04-实战案例/02-待办事项.md)** - 数据持久化
3. **[RSS 阅读器](04-实战案例/03-RSS阅读器.md)** - 网络请求和列表展示
4. **[系统监控插件](04-实战案例/04-系统监控.md)** - 系统信息获取
## 🎯 核心概念
### 什么是插件?
插件是扩展阑山桌面功能的独立模块,可以:
- ✅ 添加新的桌面组件Widget
- ✅ 注册设置页面
- ✅ 提供后台服务
- ✅ 与其他插件通信
- ✅ 对外提供 IPC 服务
### 插件架构
```
┌─────────────────────────────────────┐
│ LanMountainDesktop Host │
│ (桌面宿主 - 主程序) │
├─────────────────────────────────────┤
│ Plugin Runtime (插件运行时) │
│ ┌────────────┐ ┌────────────┐ │
│ │ Plugin A │ │ Plugin B │ │
│ ├────────────┤ ├────────────┤ │
│ │ Components │ │ Components │ │
│ │ Settings │ │ Settings │ │
│ │ Services │ │ Services │ │
│ └────────────┘ └────────────┘ │
└─────────────────────────────────────┘
```
### 插件 SDK 版本
| SDK 版本 | 发布时间 | 主要特性 |
|---------|---------|---------|
| **5.0.0** | 2025.05 | 当前版本 - 进程隔离准备、IPC 公共服务 |
| 4.0.0 | 2025.03 | 组件系统重构、设置域管理 |
| 3.0.0 | 2025.01 | Avalonia 12 升级 |
| 2.0.0 | 2024.11 | 稳定 API插件市场支持 |
| 1.0.0 | 2024.09 | 初始版本 |
## 📖 文档结构
### [01-快速开始](01-快速开始/)
快速上手,从零到一创建插件
- [环境准备](01-快速开始/01-环境准备.md) - 安装工具和模板
- [创建第一个插件](01-快速开始/02-创建第一个插件.md) - 实现基本功能
- [调试与测试](01-快速开始/03-调试测试.md) - 调试技巧
- [打包插件](01-快速开始/04-打包插件.md) - 生成 .laapp 文件
### [02-核心概念](02-核心概念/)
深入理解插件系统的工作原理
- [插件生命周期](02-核心概念/01-插件生命周期.md) - 加载、初始化、卸载
- [组件系统](02-核心概念/02-组件系统.md) - 桌面组件的创建和管理
- [设置系统](02-核心概念/03-设置系统.md) - 配置持久化
- [主题与外观](02-核心概念/04-主题外观.md) - 适配主题和圆角系统
- [插件通信](02-核心概念/05-插件通信.md) - 插件间协作
### [03-API参考](03-API参考/)
完整的 API 文档和使用示例
- [IPlugin 接口](03-API参考/01-IPlugin接口.md) - 插件入口
- [IPluginContext](03-API参考/02-IPluginContext.md) - 插件上下文
- [组件 API](03-API参考/03-组件API.md) - 组件开发接口
- [设置 API](03-API参考/04-设置API.md) - 设置管理接口
- [IPC 公共服务](03-API参考/05-IPC公共服务.md) - 对外服务接口
- [日志 API](03-API参考/06-日志API.md) - 日志记录
### [04-实战案例](04-实战案例/)
通过完整示例学习插件开发
- [天气组件](04-实战案例/01-天气组件.md) - API 调用、数据展示
- [待办事项](04-实战案例/02-待办事项.md) - 数据持久化、CRUD
- [RSS 阅读器](04-实战案例/03-RSS阅读器.md) - 网络请求、列表
- [系统监控](04-实战案例/04-系统监控.md) - 系统信息、实时更新
### [05-发布维护](05-发布维护/)
插件的发布、更新和维护
- [版本管理](05-发布维护/01-版本管理.md) - 语义化版本
- [CI/CD 配置](05-发布维护/02-CICD配置.md) - 自动构建
- [发布到市场](05-发布维护/03-发布市场.md) - 插件市场发布
- [用户反馈](05-发布维护/04-用户反馈.md) - 收集和处理反馈
- [迁移指南](05-发布维护/05-迁移指南.md) - SDK 版本升级
## 🚀 快速参考
### 创建插件
```powershell
# 安装模板
dotnet new install LanMountainDesktop.PluginTemplate
# 创建项目
dotnet new lmd-plugin -n MyPlugin
# 构建
dotnet build
```
### 插件入口
```csharp
public class Plugin : IPlugin
{
public string Id => "com.example.myplugin";
public string Name => "My Plugin";
public string Version => "1.0.0";
public async Task InitializeAsync(IPluginContext context)
{
// 注册组件
var registry = context.Services.GetService<IComponentRegistry>();
registry?.RegisterComponent<MyComponent>();
}
public Task ShutdownAsync() => Task.CompletedTask;
}
```
### 创建组件
```csharp
[Component(
Id = "com.example.myplugin.mycomponent",
Name = "我的组件",
Category = "工具"
)]
public class MyComponent : ComponentBase
{
public override string Id => "com.example.myplugin.mycomponent";
public override string Name => "我的组件";
}
```
## 💡 最佳实践
### 代码规范
- ✅ 使用异步编程(`async/await`
- ✅ 启用可空引用类型(`nullable enable`
- ✅ 编写 XML 文档注释
- ✅ 遵循 C# 命名约定
- ✅ 使用依赖注入模式
### 性能优化
- ✅ 避免阻塞 UI 线程
- ✅ 使用延迟加载
- ✅ 缓存数据避免重复计算
- ✅ 及时释放资源(实现 `IDisposable`
- ✅ 使用弱事件模式避免内存泄漏
### 用户体验
- ✅ 适配亮色/暗色主题
- ✅ 支持多语言本地化
- ✅ 提供友好的错误提示
- ✅ 响应式设计适配不同分辨率
- ✅ 提供设置页让用户自定义
## 🔗 相关资源
### 官方资源
- [GitHub 仓库](https://github.com/HelloWRC/LanMountainDesktop)
- [插件示例](https://github.com/HelloWRC/LanMountainDesktop.SamplePlugin)
- [SDK 源码](https://github.com/HelloWRC/LanMountainDesktop/tree/main/LanMountainDesktop.PluginSdk)
- [问题反馈](https://github.com/HelloWRC/LanMountainDesktop/issues)
### 技术文档
- [Avalonia UI 文档](https://docs.avaloniaui.net/)
- [FluentAvalonia 文档](https://github.com/amwx/FluentAvalonia/wiki)
- [CommunityToolkit.Mvvm](https://learn.microsoft.com/dotnet/communitytoolkit/mvvm/)
- [.NET API 浏览器](https://learn.microsoft.com/dotnet/api/)
### 社区
- [GitHub Discussions](https://github.com/HelloWRC/LanMountainDesktop/discussions) - 技术讨论
- [插件市场](https://github.com/HelloWRC/LanMountainDesktop/wiki/Plugins) - 浏览现有插件
## ❓ 常见问题
### 我需要什么基础?
- **必需**: C# 基础语法、面向对象编程
- **推荐**: XAML/Avalonia UI 基础、MVVM 模式
- **加分**: 异步编程、依赖注入
### 插件可以做什么?
插件可以:
- ✅ 添加桌面组件(显示天气、时钟、待办等)
- ✅ 添加设置页面
- ✅ 提供后台服务(定时任务、数据同步等)
- ✅ 与其他插件通信
- ✅ 通过 IPC 对外提供服务
插件不能:
- ❌ 修改宿主核心代码
- ❌ 直接访问其他插件的私有数据
- ❌ 绕过权限系统访问敏感资源
### 如何调试插件?
1. 将插件构建到宿主的插件目录
2. 启动宿主应用
3. 使用 IDE 附加到宿主进程
4. 在插件代码中设置断点
详见 [调试与测试](01-快速开始/03-调试测试.md)
### 插件会被隔离运行吗?
当前插件运行在宿主进程内in-process 模式),未来将支持进程隔离模式:
- **当前**: 进程内插件,共享内存空间
- **未来**: 进程隔离插件,独立进程运行(计划中)
## 🎯 下一步
准备开始了吗?
- [环境准备](01-快速开始/01-环境准备.md) - 配置开发环境
- [创建第一个插件](01-快速开始/02-创建第一个插件.md) - 动手实践
- [插件生命周期](02-核心概念/01-插件生命周期.md) - 理解原理

View File

@@ -0,0 +1,253 @@
# Air APP 开发完整指南
欢迎来到阑山桌面 Air APP 开发指南Air APP 是运行在阑山桌面环境中的独立窗口应用。
## 什么是 Air APP
**Air APP** 是阑山桌面生态中的独立应用形态与桌面组件Widget不同
### 对比Air APP vs 桌面组件
| 特性 | Air APP | 桌面组件 |
|------|---------|---------|
| **窗口形式** | 独立窗口,可移动、缩放 | 固定在桌面上 |
| **生命周期** | 独立进程,按需启动 | 随宿主启动 |
| **UI 复杂度** | 适合复杂界面 | 适合简单信息展示 |
| **资源占用** | 按需运行,不用时退出 | 始终运行 |
| **典型案例** | 白板、世界时钟、计算器 | 天气组件、时钟组件 |
### Air APP 架构
```
┌──────────────────────────────────────┐
│ LanMountainDesktop (桌面宿主) │
│ │
│ ┌────────────────────────────────┐ │
│ │ LanMountainDesktop.AirAppRuntime│ │
│ │ (Air APP 运行时容器) │ │
│ │ │ │
│ │ 管理所有 Air APP 进程 │ │
│ │ - 启动/停止 │ │
│ │ - 实例去重 │ │
│ │ - 生命周期跟踪 │ │
│ └─────────┬────────────────────────┘ │
└────────────┼───────────────────────────┘
│ IPC 通信
┌────────▼──────────┐
│ Air APP Process │
│ │
│ ┌─────────────┐ │
│ │ AirAppHost │ │
│ │ (渲染容器) │ │
│ └─────────────┘ │
│ │
│ 你的 Air APP │
│ - UI │
│ - 业务逻辑 │
│ - 数据管理 │
└──────────────────┘
```
## 📚 学习路径
### 快速上手
1. **[Air APP 介绍](01-Air-APP介绍.md)** - 理解 Air APP 是什么
2. **[创建第一个 Air APP](02-创建第一个AirApp.md)** - Hello World
3. **[架构与生命周期](03-架构与生命周期.md)** - 理解运行机制
### 深入学习
4. **[IPC 通信](04-IPC通信.md)** - 与宿主和其他 APP 通信
5. **[窗口管理](05-窗口管理.md)** - 窗口模式、大小、位置
6. **[数据持久化](06-数据持久化.md)** - 保存应用数据
7. **[主题适配](07-主题适配.md)** - 适配亮色/暗色模式
### 实战案例
8. **[世界时钟 APP](08-实战-世界时钟.md)** - 完整示例
9. **[白板 APP](09-实战-白板.md)** - 全屏交互应用
10. **[打包与发布](10-打包与发布.md)** - 发布到市场
## 🎯 快速开始
### 创建 Air APP 项目
```powershell
# 安装模板
dotnet new install LanMountainDesktop.AirAppTemplate
# 创建项目
dotnet new lmd-airapp -n MyAirApp
# 构建
cd MyAirApp
dotnet build
```
### 项目结构
```
MyAirApp/
├── MyAirApp.csproj # 项目文件
├── Program.cs # 程序入口
├── App.axaml # 应用定义
├── App.axaml.cs # 应用代码
├── Views/ # 视图目录
│ └── MainWindow.axaml # 主窗口
├── ViewModels/ # 视图模型
│ └── MainWindowViewModel.cs
├── Models/ # 数据模型
├── Services/ # 业务服务
├── Assets/ # 资源文件
│ └── icon.png
└── airapp.json # Air APP 清单
```
### Air APP 清单 (airapp.json)
```json
{
"Id": "com.example.myairapp",
"Name": "My Air APP",
"Version": "1.0.0",
"Author": "Your Name",
"Description": "My first Air APP",
"MinHostVersion": "1.0.0",
"Icon": "Assets/icon.png",
"WindowMode": "Standard",
"DefaultSize": {
"Width": 800,
"Height": 600
},
"AllowMultipleInstances": false
}
```
### 窗口模式
| 模式 | 说明 | 适用场景 |
|------|------|---------|
| `Standard` | 标准窗口,带标题栏和边框 | 大多数应用 |
| `Borderless` | 无边框窗口,自定义标题栏 | 自定义 UI |
| `FullScreen` | 全屏窗口 | 白板、游戏 |
| `Tool` | 工具窗口,始终置顶 | 小工具 |
## 核心概念
### 生命周期
```
用户点击启动
AirAppRuntime 检查是否已运行
否 → 启动新进程
是 → 激活现有窗口(如果 AllowMultipleInstances=false
AirAppHost 初始化
加载 Air APP 代码
显示主窗口
应用运行中...
用户关闭窗口
AirAppHost 清理资源
进程退出
AirAppRuntime 清理注册
```
### IPC 通信
Air APP 可以通过 IPC 与桌面宿主通信:
```csharp
// 获取宿主设置
var theme = await ipcClient.InvokeAsync<string>(
"LanMountainDesktop.Host.v1",
"GetCurrentTheme"
);
// 订阅宿主事件
ipcClient.OnNotify("lanmountain.theme.changed", (themeData) =>
{
// 主题变更,更新 UI
ApplyTheme(themeData);
});
```
## 📖 章节目录
### [01-Air-APP介绍.md](01-Air-APP介绍.md)
什么是 Air APP与桌面组件的区别应用场景
### [02-创建第一个AirApp.md](02-创建第一个AirApp.md)
从零创建一个简单的 Air APP运行和调试
### [03-架构与生命周期.md](03-架构与生命周期.md)
Air APP 架构、运行时、生命周期管理
### [04-IPC通信.md](04-IPC通信.md)
与桌面宿主通信、调用服务、订阅事件
### [05-窗口管理.md](05-窗口管理.md)
窗口模式、大小调整、位置记忆
### [06-数据持久化.md](06-数据持久化.md)
保存应用状态和用户数据
### [07-主题适配.md](07-主题适配.md)
适配亮色/暗色主题、圆角系统
### [08-实战-世界时钟.md](08-实战-世界时钟.md)
完整案例:世界时钟应用
### [09-实战-白板.md](09-实战-白板.md)
完整案例:全屏白板应用
### [10-打包与发布.md](10-打包与发布.md)
打包、签名、发布到市场
## 💡 最佳实践
### 性能优化
- ✅ 使用虚拟化列表处理大量数据
- ✅ 图片和资源延迟加载
- ✅ 避免复杂的布局嵌套
- ✅ 使用 `RenderTransform` 而非 `Margin` 做动画
- ✅ 及时取消不需要的异步操作
### 用户体验
- ✅ 记住窗口位置和大小
- ✅ 提供键盘快捷键
- ✅ 优雅处理错误和异常
- ✅ 适配不同屏幕分辨率和 DPI
- ✅ 响应主题变更
### 安全性
- ✅ 验证用户输入
- ✅ 使用 HTTPS 进行网络请求
- ✅ 敏感数据加密存储
- ✅ 避免路径遍历漏洞
- ✅ 遵循最小权限原则
## 🔗 相关资源
- [插件开发指南](../01-插件开发/) - 如果需要桌面组件
- [整体架构](../04-架构与实现/01-整体架构.md) - 系统架构
- [设计规范](../03-组件设计规范/) - UI 设计指南
## 🎯 下一步
- [Air APP 介绍](01-Air-APP介绍.md) - 了解 Air APP
- [创建第一个 Air APP](02-创建第一个AirApp.md) - 动手实践
- [架构与生命周期](03-架构与生命周期.md) - 理解原理

View File

@@ -0,0 +1,363 @@
# 整体架构
本文档描述阑山桌面的整体技术架构、各模块职责和交互方式。
## 架构概览
### 核心模块
```
┌─────────────────────────────────────────────────────────────┐
│ 用户交互层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │桌面组件 │ │主窗口 │ │托盘图标 │ │设置窗口 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ LanMountainDesktop桌面宿主
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 组件系统 │ │
│ │ 组件注册 | 组件渲染 | 布局管理 | 编辑模式 │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 插件运行时 │ │
│ │ 插件加载 | 生命周期 | SDK 接入 | 契约装配 │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 核心服务层 │ │
│ │ 设置 | 主题 | 本地化 | 日志 | 遥测 | IPC │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↓ ↓
┌──────────────────────┐ ┌──────────────────────────────┐
│ LanMountainDesktop │ │ LanMountainDesktop │
│ .AirAppRuntime │←IPC→│ .AirAppHost (多实例) │
│ Air APP 运行时容器 │ │ Air APP 渲染进程 │
└──────────────────────┘ └──────────────────────────────┘
┌──────────────────────┐
│ LanMountainDesktop │
│ .Launcher │
│ 启动器 (唯一入口) │
└──────────────────────┘
```
## 项目结构
### 核心项目
| 项目 | 职责 | 类型 |
|------|------|------|
| **LanMountainDesktop** | 桌面宿主主程序 | WPF 应用 |
| **LanMountainDesktop.Launcher** | 启动器OOBE、Splash、版本管理 | 独立可执行 |
| **LanMountainDesktop.AirAppRuntime** | Air APP 运行时容器 | 独立服务 |
| **LanMountainDesktop.AirAppHost** | Air APP 渲染进程 | 框架依赖应用 |
### SDK 和基础设施
| 项目 | 职责 | 类型 |
|------|------|------|
| **LanMountainDesktop.PluginSdk** | 插件 SDK | NuGet 包 |
| **LanMountainDesktop.AirAppSdk** | Air APP SDK | NuGet 包 |
| **LanMountainDesktop.Shared.Contracts** | 共享契约类型 | 类库 |
| **LanMountainDesktop.Shared.IPC** | IPC 基础设施 | 类库 |
### 功能模块
| 项目 | 职责 | 类型 |
|------|------|------|
| **LanMountainDesktop.Settings.Core** | 设置系统 | 类库 |
| **LanMountainDesktop.Appearance** | 主题和外观 | 类库 |
| **LanMountainDesktop.DesktopComponents.Runtime** | 组件运行时 | 类库 |
| **LanMountainDesktop.DesktopHost** | 桌面宿主生命周期 | 类库 |
### 未来扩展(计划中)
| 项目 | 职责 | 状态 |
|------|------|------|
| **LanMountainDesktop.PluginIsolation.Contracts** | 插件隔离契约 | 已创建 |
| **LanMountainDesktop.PluginIsolation.Ipc** | 插件隔离 IPC | 已创建 |
## 启动流程
### 生产环境启动
```
1. 用户启动 Launcher.exe
2. 首次启动? → 是 → 显示 OOBE 欢迎页
↓ 否
3. 显示 Splash 启动动画
4. 扫描 app-* 目录,选择最佳版本
- 优先选择有 .current 标记的
- 其次选择版本号最高的
- 跳过有 .partial 或 .destroy 标记的
5. 预启动 AirAppRuntime.exe
- JIT 框架依赖进程
- 等待 IPC 管道就绪
6. 启动 app-{version}/LanMountainDesktop.exe
7. Host 初始化
- 日志系统
- 遥测系统
- 设置加载
- 主题应用
8. 初始化桌面环境
- 创建桌面窗口
- 加载插件
- 注册组件
- 显示托盘图标
9. 将 Host PID 附加给 AirAppRuntime
10. 清理标记为 .destroy 的旧版本
11. 桌面就绪
```
### 开发环境启动
```
开发者直接启动 LanMountainDesktop.exe
检测到没有通过 Launcher 启动
跳过 OOBE 和版本管理
如果 AirAppRuntime 未运行,自动启动
正常初始化桌面环境
```
## 核心系统
### 1. 组件系统
**职责**: 管理桌面组件的注册、创建、渲染和布局
**架构**:
```
ComponentRegistry (组件注册表)
↓ 注册
ComponentDefinition (组件定义)
↓ 创建实例
ComponentInstance (组件实例)
↓ 渲染
ComponentView (Avalonia UI)
↓ 显示
DesktopWidgetWindow (桌面窗口)
```
**关键类**:
- `ComponentRegistry` - 组件注册和查找
- `ComponentBase` - 组件基类
- `ComponentInstanceManager` - 组件实例管理
- `DesktopLayoutService` - 布局管理
### 2. 插件系统
**职责**: 加载、初始化和管理插件生命周期
**运行时模式**:
| 模式 | 状态 | 说明 |
|------|------|------|
| **in-proc** | ✅ 当前默认 | 插件运行在宿主进程内 |
| **isolated-background** | 🚧 规划中 | 后台逻辑隔离进程 |
| **isolated-window** | 🚧 规划中 | UI 渲染隔离进程 |
**加载流程**:
```
1. 扫描插件目录
%LOCALAPPDATA%\LanMountainDesktop\plugins\
2. 读取 plugin.json 清单
3. 验证依赖关系
4. 创建 PluginLoadContext
5. 加载插件程序集
6. 创建 IPlugin 实例
7. 调用 InitializeAsync()
8. 注册组件和服务
```
### 3. 设置系统
**职责**: 管理应用和插件的配置数据
**设置域**:
```
Settings Root
├── General (通用设置)
├── Appearance (外观设置)
├── Components (组件设置)
├── Plugins (插件设置)
│ ├── Plugin A
│ └── Plugin B
└── Advanced (高级设置)
```
**持久化**:
- 位置: `%LOCALAPPDATA%\LanMountainDesktop\settings\`
- 格式: JSON
- 实时保存,延迟写入
### 4. 主题系统
**职责**: 管理亮色/暗色主题、圆角系统
**圆角规范**:
| 级别 | Token | 值 | 用途 |
|------|-------|----|------|
| 基础 | `DesignCornerRadiusBasic` | 4 | 按钮、输入框 |
| 组件 | `DesignCornerRadiusComponent` | 8 | 卡片、面板 |
| 窗口 | `DesignCornerRadiusWindow` | 12 | 窗口、对话框 |
**主题切换**:
1. 用户选择主题
2. `AppearanceService` 切换资源字典
3. 广播主题变更事件
4. 各组件响应并更新 UI
5. 通过 IPC 通知 Air APP
### 5. IPC 系统
**职责**: 进程间通信
**通信拓扑**:
```
┌────────────────┐
│ Host │ ← 外部 IPC 入口点
│ (主程序) │
└────────┬───────┘
│ IPC
┌────┴────┐
↓ ↓
┌────────┐ ┌────────────┐
│Launcher│ │AirAppRuntime│
└────────┘ └──────┬──────┘
│ IPC
┌─────┴─────┐
↓ ↓
┌─────────┐ ┌─────────┐
│AirAppHost│ │AirAppHost│
└─────────┘ └─────────┘
```
**IPC 管道**:
- `LanMountainDesktop.Host.v1` - 宿主公共服务
- `LanMountainDesktop.AirAppRuntime.v1` - Air APP 生命周期
- `LanMountainDesktop.AirAppRuntimeControl.v1` - Runtime 控制
## 数据流
### 设置变更流程
```
用户修改设置
SettingsService.SetValue()
触发 SettingChanged 事件
相关组件监听并响应
延迟写入磁盘(防抖 500ms
```
### 组件更新流程
```
定时器触发 (默认 1 秒)
ComponentUpdateService.UpdateAsync()
遍历所有组件实例
调用 Component.UpdateAsync()
组件更新数据
UI 自动刷新(数据绑定)
```
### 插件通信流程
```
Plugin A 发送消息
PluginMessenger.Send()
消息总线分发
Plugin B 接收消息
处理并可选回复
```
## 安全性
### 权限系统
插件需要声明所需权限:
```json
{
"Permissions": [
"FileSystem.Read", // 读取文件
"FileSystem.Write", // 写入文件
"Network.Access", // 网络访问
"System.Info" // 系统信息
]
}
```
### 沙箱隔离(未来)
进程隔离模式下:
- 插件运行在独立进程
- 通过 IPC 访问宿主服务
- 限制文件系统访问
- 限制网络访问
## 性能优化
### 启动优化
- ✅ 延迟加载插件
- ✅ 异步初始化
- ✅ 组件按需创建
- ✅ 资源延迟加载
### 运行时优化
- ✅ 虚拟化列表
- ✅ 图片缓存
- ✅ 布局缓存
- ✅ 事件防抖/节流
### 内存优化
- ✅ 弱事件模式
- ✅ 及时释放资源
- ✅ 图片降采样
- ✅ 组件卸载清理
## 相关文档
- [启动器系统](02-启动器系统.md) - 启动器详细设计
- [插件运行时](04-插件运行时.md) - 插件加载和管理
- [组件系统](05-组件系统.md) - 组件架构和渲染
- [IPC 通信](07-IPC通信.md) - 进程间通信设计

View File

@@ -0,0 +1,474 @@
# 更新系统架构
本文档描述阑山桌面的更新系统设计,包括增量更新、原子化安装、版本管理和回滚机制。
## 更新系统概览
### 核心特性
-**增量更新** - 只下载变更文件,节省带宽
-**原子化更新** - 保证完整性,失败自动回滚
-**多版本共存** - 支持多版本并存和快速切换
-**签名验证** - RSA 签名确保安全性
-**版本回退** - 一键回退到上一版本
-**更新频道** - Stable/Preview 频道切换
-**后台下载** - 静默下载,不影响使用
### 架构组件
```
┌──────────────────────────────────────────────┐
│ LanMountainDesktop (Host) │
│ │
│ ┌────────────────────────────────────────┐ │
│ │ UpdateOrchestrator │ │
│ │ (更新编排 - Host 拥有) │ │
│ │ - 检查更新 │ │
│ │ - 下载更新 │ │
│ │ - 应用更新 │ │
│ │ - 回滚更新 │ │
│ └────────────────────────────────────────┘ │
│ │
│ ┌────────────────┐ ┌──────────────────┐ │
│ │UpdateInstall │ │UpdateRollback │ │
│ │ Gateway │ │ Gateway │ │
│ └────────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────┘
↓ 写入 deployment.lock
┌──────────────────────────────────────────────┐
│ Launcher │
│ (启动器 - 版本选择和清理) │
│ │
│ ┌────────────────────────────────────────┐ │
│ │ DeploymentLocator │ │
│ │ 扫描和选择最佳版本 │ │
│ └────────────────────────────────────────┘ │
└──────────────────────────────────────────────┘
```
## 目录结构
### 版本目录布局
```
安装根目录/
├── LanMountainDesktop.Launcher.exe # 启动器
├── app-1.0.0/ # 旧版本
│ ├── .destroy # 待删除标记
│ ├── LanMountainDesktop.exe
│ └── ...
├── app-1.0.1/ # 当前版本
│ ├── .current # 当前版本标记
│ ├── LanMountainDesktop.exe
│ └── ...
├── app-1.0.2/ # 新版本(下载中)
│ ├── .partial # 未完成标记
│ └── ...
└── .Launcher/ # 启动器数据
├── state/
│ └── oobe-state.json
├── update/
│ ├── incoming/ # 更新缓存
│ │ ├── deployment.lock # 部署锁
│ │ ├── plonds-filemap.json # 文件清单
│ │ ├── plonds-filemap.sig # RSA 签名
│ │ └── objects/ # 对象文件
│ ├── public-key.pem # 公钥
│ └── snapshots/ # 更新快照
│ └── snapshot-{id}.json
└── logs/
```
### 版本标记文件
| 标记文件 | 含义 | 创建者 | 删除时机 |
|---------|------|--------|---------|
| `.current` | 当前使用版本 | Host UpdateInstallGateway | 切换到新版本时 |
| `.partial` | 下载未完成 | Host UpdateInstallGateway | 安装成功或失败清理时 |
| `.destroy` | 待删除版本 | Host UpdateInstallGateway | Launcher 下次启动清理 |
## 更新流程
### 完整更新流程
```
1. Host 后台检查更新
UpdateOrchestrator.CheckAsync()
- 调用 manifest provider (PLONDS/GitHub)
- 根据更新频道过滤版本
- 对比当前版本和最新版本
2. 发现新版本
用户收到通知
3. Host 下载更新
UpdateOrchestrator.DownloadAsync()
- 下载 plonds-filemap.json
- 下载 plonds-filemap.sig
- 下载对象文件
- 保存到 .Launcher/update/incoming/
4. 写入 deployment.lock
{
"TargetVersion": "1.0.2",
"FromVersion": "1.0.1",
"FileMapPath": "...",
"SignaturePath": "...",
"ArchivePath": "..."
}
5. Host 调用 UpdateInstallGateway
UpdateInstallGateway.InstallAsync()
- 验证签名 (UpdateSignatureVerifier)
- 创建目标目录 app-1.0.2/
- 标记 .partial
- 保存快照到 snapshots/
6. 应用文件操作
PlondsUpdateApplier.ApplyFileMap()
For each file in filemap:
- action="replace" → 从对象解压
- action="reuse" → 从旧版本复制
- action="delete" → 跳过
7. 验证所有文件哈希
For each file:
计算 SHA256
与 filemap 对比
8. 激活新版本
DeploymentActivator.ActivateDeployment()
- 移除 app-1.0.2/.partial
- 添加 app-1.0.2/.current
- 移除 app-1.0.1/.current
- 添加 app-1.0.1/.destroy
9. 更新快照状态 = "applied"
10. 清理 incoming 缓存
IncomingArtifactsCleaner.Clean()
11. 用户重启应用
Launcher 启动 app-1.0.2/
12. Launcher 清理 .destroy 目录
删除 app-1.0.1/
```
### 增量包结构
#### GitHub Release Assets
```
LanMountainDesktop-v1.0.2/
├── LanMountainDesktop-Setup-1.0.2-x64.exe # 完整安装包
├── releases.win.json # VeloPack 清单
├── LanMountainDesktop-1.0.2-win-x64.nupkg # VeloPack 包
├── RELEASES # VeloPack 元数据
└── (legacy) plonds-filemap-1.0.2.json # 旧格式(可选)
```
#### plonds-filemap.json 格式
```json
{
"FromVersion": "1.0.1",
"ToVersion": "1.0.2",
"GeneratedAt": "2026-06-08T10:00:00Z",
"Files": [
{
"Path": "LanMountainDesktop.exe",
"Action": "replace",
"Sha256": "abc123...",
"Size": 1024000,
"ObjectPath": "objects/abc123"
},
{
"Path": "LanMountainDesktop.dll",
"Action": "reuse",
"Sha256": "def456...",
"Size": 512000
},
{
"Path": "OldPlugin.dll",
"Action": "delete"
}
]
}
```
### 文件操作类型
| Action | 说明 | 处理方式 |
|--------|------|----------|
| `replace` | 新增或替换文件 | 从 objects/ 解压 |
| `reuse` | 文件未变更 | 从旧版本目录复制 |
| `delete` | 删除文件 | 不操作(新版本中不存在) |
## 原子化保证
### 失败场景处理
| 失败场景 | 检测机制 | 恢复方式 |
|---------|---------|---------|
| **签名验证失败** | RSA 验证 | 拒绝安装,保留旧版本 |
| **文件哈希不匹配** | SHA256 校验 | 自动回滚到旧版本 |
| **磁盘空间不足** | 写入失败 | 自动回滚到旧版本 |
| **进程崩溃** | .partial 标记 | Launcher 启动时清理 |
| **断电/强制关机** | .partial 标记 | Launcher 启动时清理 |
### 回滚机制
```csharp
private void TryRollbackOnFailure(SnapshotMetadata snapshot)
{
try
{
// 1. 删除未完成的新版本目录
if (Directory.Exists(snapshot.TargetDirectory))
{
Directory.Delete(snapshot.TargetDirectory, true);
}
// 2. 移除旧版本的 .destroy 标记
var destroyMarker = Path.Combine(
snapshot.SourceDirectory,
".destroy"
);
if (File.Exists(destroyMarker))
{
File.Delete(destroyMarker);
}
// 3. 确保旧版本有 .current 标记
var currentMarker = Path.Combine(
snapshot.SourceDirectory,
".current"
);
if (!File.Exists(currentMarker))
{
File.WriteAllText(currentMarker, string.Empty);
}
// 4. 更新快照状态
snapshot.Status = "rolled_back";
SaveSnapshot(snapshotPath, snapshot);
}
catch (Exception ex)
{
_logger.LogError(ex, "Rollback failed");
// 记录错误但不抛出
}
}
```
## 版本管理
### 版本选择算法
Launcher 启动时的版本选择逻辑:
```csharp
public string? FindBestVersion()
{
var appDirs = Directory.GetDirectories(
_installRoot,
"app-*"
);
// 1. 过滤掉标记为 .partial 或 .destroy 的版本
var validDirs = appDirs.Where(dir =>
!File.Exists(Path.Combine(dir, ".partial")) &&
!File.Exists(Path.Combine(dir, ".destroy"))
);
// 2. 优先选择带 .current 标记的版本
var currentDir = validDirs.FirstOrDefault(dir =>
File.Exists(Path.Combine(dir, ".current"))
);
if (currentDir != null)
return currentDir;
// 3. 否则选择版本号最高的
var sortedDirs = validDirs
.Select(dir => new {
Path = dir,
Version = ParseVersion(dir)
})
.Where(x => x.Version != null)
.OrderByDescending(x => x.Version)
.ToList();
return sortedDirs.FirstOrDefault()?.Path;
}
```
### 版本回退
用户可以通过设置页手动回退到上一版本:
```
设置 → 更新 → 版本历史 → 回滚
```
**回退流程**:
```
1. Host 调用 UpdateRollbackGateway
2. 读取最新快照 (snapshots/)
3. 获取 SourceDirectory (旧版本)
4. 激活旧版本
- 移除当前版本的 .current
- 添加 .current 到旧版本
- 移除旧版本的 .destroy
- 添加 .destroy 到当前版本
5. 更新快照状态 = "manual_rollback"
6. 提示用户重启应用
```
## 安全机制
### RSA 签名
#### 签名生成CI 环境)
```powershell
# scripts/Sign-FileMap.ps1
$privateKeyPem = Get-Content -Path $PrivateKeyPath -Raw
$rsa = [System.Security.Cryptography.RSA]::Create()
$rsa.ImportFromPem($privateKeyPem)
$jsonBytes = [System.IO.File]::ReadAllBytes($FilesJsonPath)
$signature = $rsa.SignData(
$jsonBytes,
[System.Security.Cryptography.HashAlgorithmName]::SHA256,
[System.Security.Cryptography.RSASignaturePadding]::Pkcs1
)
$signatureBase64 = [Convert]::ToBase64String($signature)
Set-Content -Path "$FilesJsonPath.sig" -Value $signatureBase64
```
#### 签名验证Launcher
```csharp
private (bool Success, string Message) VerifySignature(
string fileMapPath,
string signaturePath)
{
// 1. 读取公钥
var publicKeyPath = Path.Combine(
_launcherRoot,
"update",
"public-key.pem"
);
using var rsa = RSA.Create();
rsa.ImportFromPem(File.ReadAllText(publicKeyPath));
// 2. 读取签名
var signatureBase64 = File.ReadAllText(signaturePath).Trim();
var signature = Convert.FromBase64String(signatureBase64);
// 3. 验证
var jsonBytes = File.ReadAllBytes(fileMapPath);
var isValid = rsa.VerifyData(
jsonBytes,
signature,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1
);
return isValid
? (true, "ok")
: (false, "Signature verification failed");
}
```
### 文件完整性验证
```csharp
// 验证所有文件的 SHA256
foreach (var file in fileMap.Files)
{
if (file.Action == "delete")
continue;
var fullPath = Path.Combine(targetDeployment, file.Path);
var actualHash = ComputeSha256Hex(fullPath);
if (!string.Equals(
actualHash,
file.Sha256,
StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(
$"File hash mismatch for '{file.Path}'."
);
}
}
```
### 路径遍历防护
```csharp
private static void EnsurePathWithinRoot(
string targetPath,
string rootPath)
{
var fullTarget = Path.GetFullPath(targetPath);
var fullRoot = Path.GetFullPath(rootPath);
if (!fullTarget.StartsWith(
fullRoot,
StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(
$"Path traversal detected: {targetPath}"
);
}
}
```
## 更新频道
### 频道类型
| 频道 | 说明 | GitHub Release 过滤 |
|------|------|---------------------|
| **Stable** | 正式版,推荐大多数用户使用 | `prerelease=false` |
| **Preview** | 预览版,包含最新功能和 Bug 修复 | 所有版本(包括 `prerelease=true` |
### 切换频道
```
设置 → 更新 → 更新频道 → 选择频道
```
切换后立即检查更新。
## VeloPack 集成
### 当前状态
- ✅ CI 管道已生成 VeloPack 原生资产(`releases.win.json`, `*.nupkg`, `RELEASES`
- ✅ Host 拥有更新检查/下载/应用/回滚编排
- ✅ Launcher 仅负责版本选择和启动
- ⚠️ 旧的 `files.json` + `update.zip` 生成作为禁用的回退路径保留在 CI 中
### 未来迁移
计划完全迁移到 VeloPack
1. 移除旧格式支持
2. 简化 CI 管道
3. 利用 VeloPack 的增量更新算法
## 相关文档
- [打包与构建](../05-更新与发布/03-打包与构建.md) - 构建流程
- [CI/CD 配置](../05-更新与发布/04-CICD配置.md) - 自动化构建
- [启动器系统](02-启动器系统.md) - 启动器详细设计

View File

@@ -0,0 +1,290 @@
# 文档重构完成报告
## 重构概览
本次文档重构于 **2026年6月8日** 完成,对阑山桌面技术文档进行了全面的重新设计和编写。
## 重构目标
**保留旧文档** - 所有原有文档已迁移到 `archive/` 目录
**重新设计架构** - 按照开发流程组织文档结构
**覆盖完整链路** - 从插件开发到更新系统的完整技术链
**提升可读性** - 清晰的导航、丰富的示例、实用的参考
## 新文档架构
### 文档目录结构
```
docs/
├── README.md # 文档中心首页(已完成)
├── 00-快速开始/ # 项目入门(已完成)
│ ├── 01-项目介绍.md
│ ├── 02-快速安装.md
│ └── 03-开发环境配置.md
├── 01-插件开发/ # 插件开发完整指南(已完成骨架)
│ ├── README.md
│ ├── 01-快速开始/
│ │ └── 01-环境准备.md
│ ├── 02-核心概念/
│ ├── 03-API参考/
│ ├── 04-实战案例/
│ └── 05-发布维护/
├── 02-AirApp开发/ # Air APP 开发指南(已完成骨架)
│ └── README.md
├── 03-组件设计规范/ # 设计系统(目录已创建)
├── 04-架构与实现/ # 技术架构(已完成核心)
│ └── 01-整体架构.md
├── 05-更新与发布/ # 更新和发布流程(已完成核心)
│ └── 01-更新系统架构.md
└── archive/ # 旧文档归档(已完成)
├── README.md
├── Plugins develop/ # 旧插件开发文档
├── ai/ # AI 辅助文档
├── auto_commit_md/ # 自动提交文档
├── superpowers/ # 早期规划文档
└── *.md # 其他旧文档
```
## 已完成内容
### ✅ 基础框架100%
- [x] 文档中心首页 (`README.md`)
- [x] 旧文档归档和迁移 (`archive/`)
- [x] 新目录结构创建
### ✅ 快速开始100%
- [x] 项目介绍 - 项目概览、特性、技术栈
- [x] 快速安装 - 安装包、便携版、启动选项
- [x] 开发环境配置 - IDE、工具、调试配置
### ✅ 插件开发指南(骨架 100%
- [x] 插件开发总览 (`README.md`)
- [x] 环境准备 - 模板安装、项目创建、调试
- [ ] 其他章节待细化(已规划好结构)
### ✅ Air APP 开发指南(骨架 100%
- [x] Air APP 开发总览 (`README.md`)
- [ ] 其他章节待细化(已规划好结构)
### ✅ 架构与实现(核心 100%
- [x] 整体架构 - 系统架构、模块职责、数据流
### ✅ 更新与发布(核心 100%
- [x] 更新系统架构 - 增量更新、原子化、版本管理
## 文档特色
### 📚 结构清晰
- **按学习路径组织** - 从快速开始到深入架构
- **层次分明** - 概览 → 快速上手 → 核心概念 → API 参考 → 实战案例
- **相互链接** - 文档间有清晰的导航和交叉引用
### 🎯 实用导向
- **快速索引表** - "我想..." 快速找到对应文档
- **代码示例** - 包含完整可运行的代码
- **常见问题** - 每个章节都有 FAQ 和故障排除
### 🚀 开发者友好
- **技术深度** - 不仅是使用指南,更深入技术实现
- **最佳实践** - 包含性能优化、安全性、用户体验建议
- **版本信息** - 明确标注 SDK 版本和兼容性
### 🔄 持续更新
- **模块化设计** - 便于独立更新某个章节
- **扩展性** - 为未来功能预留章节(如进程隔离)
- **版本标记** - 每个文档底部标注更新时间
## 核心文档亮点
### 项目介绍
- ✨ 清晰的项目定位和核心特性
- 📊 技术栈和版本信息一目了然
- 🎯 应用场景和目标用户明确
- 🏗️ 项目结构和启动流程可视化
### 开发环境配置
- 🛠️ 详细的工具安装指南IDE、Git、SDK
- ⚙️ 多种 IDE 配置VS2022、Rider、VS Code
- 🐛 完整的调试配置
- ❓ 常见问题和解决方案
### 插件开发指南
- 📦 模板安装和项目创建
- 📝 plugin.json 字段详解
- 🔧 多种调试方式
- 📖 清晰的学习路径规划
### 整体架构
- 🏗️ 完整的架构图和模块说明
- 🔄 启动流程和数据流可视化
- 🧩 各系统的详细说明(组件、插件、设置、主题)
- 🔒 安全性和性能优化
### 更新系统架构
- 📦 完整的更新流程说明
- 🔐 安全机制(签名、校验、防护)
- ♻️ 原子化保证和回滚机制
- 📂 目录结构和版本管理详解
## 待完成内容
### 优先级 1核心功能文档
- [ ] 插件开发 - 创建第一个插件
- [ ] 插件开发 - 插件生命周期
- [ ] 插件开发 - 组件系统
- [ ] Air APP 开发 - 创建第一个 Air APP
- [ ] 组件设计规范 - 设计系统概述
- [ ] 组件设计规范 - 视觉规范
### 优先级 2API 参考)
- [ ] 插件开发 - IPlugin 接口详解
- [ ] 插件开发 - 组件 API
- [ ] 插件开发 - 设置 API
- [ ] Air APP 开发 - IPC 通信
- [ ] Air APP 开发 - 窗口管理
### 优先级 3实战案例
- [ ] 插件开发 - 天气组件案例
- [ ] 插件开发 - 待办事项案例
- [ ] Air APP 开发 - 世界时钟案例
- [ ] Air APP 开发 - 白板案例
### 优先级 4发布维护
- [ ] 插件开发 - 版本管理
- [ ] 插件开发 - CI/CD 配置
- [ ] 插件开发 - 发布到市场
- [ ] 更新与发布 - 打包与构建
- [ ] 更新与发布 - CI/CD 配置
## 使用指南
### 查看文档
1. **从首页开始**: 打开 `docs/README.md`
2. **选择路径**: 根据你的需求选择相应的章节
3. **循序渐进**: 按照推荐的学习路径阅读
### 贡献文档
1. **选择章节**: 从待完成列表中选择一个主题
2. **参考模板**: 查看已完成文档的结构和风格
3. **遵循规范**: 保持一致的格式和术语
4. **添加示例**: 提供可运行的代码示例
5. **交叉链接**: 添加相关文档的链接
### 文档规范
#### Markdown 格式
- 使用 ATX 风格标题(`#` 而非 `===`
- 代码块指定语言(```csharp, ```powershell, ```json
- 使用表格展示结构化数据
- 使用任务列表展示步骤
#### 术语规范
| 中文 | 英文 | 说明 |
|------|------|------|
| 阑山桌面 | LanMountainDesktop | 项目名称 |
| 桌面宿主 | Host | 主程序 |
| 启动器 | Launcher | 启动器程序 |
| 插件 | Plugin | 扩展模块 |
| 组件 | Component/Widget | 桌面组件 |
| Air APP | Air APP | 独立应用 |
#### 链接规范
- 相对路径链接:`[文本](../目录/文件.md)`
- 锚点链接:`[文本](#标题)`
- 外部链接:`[文本](https://...)`
## 技术实现
### 文档生成工具
建议未来使用以下工具增强文档体验:
- **MkDocs** 或 **Docusaurus** - 静态站点生成
- **PlantUML** - 架构图和流程图
- **Mermaid** - 内嵌图表
- **Algolia** - 文档搜索
### 自动化
可以添加的自动化流程:
- **链接检查** - CI 中检查失效链接
- **拼写检查** - 自动检查拼写错误
- **格式检查** - 检查 Markdown 格式一致性
- **自动部署** - 推送到 GitHub Pages
## 迁移说明
### 从旧文档迁移
如果需要查看旧文档内容:
1. 打开 `docs/archive/` 目录
2. 查看 `archive/README.md` 了解归档内容
3. 旧文档按原有结构保留,未做修改
### 更新现有链接
如果其他地方链接了旧文档,建议更新为:
- `docs/PLUGIN_DEVELOPMENT.md``docs/01-插件开发/README.md`
- `docs/ARCHITECTURE.md``docs/04-架构与实现/01-整体架构.md`
- `docs/UPDATE_SYSTEM.md``docs/05-更新与发布/01-更新系统架构.md`
## 总结
### 成果
**完整的文档架构** - 6 个主要章节,覆盖从入门到高级的完整链路
**核心文档完成** - 项目介绍、安装、架构、更新系统等核心文档已完成
**保留旧内容** - 所有旧文档已归档,不丢失任何历史信息
**清晰的导航** - 多级目录结构和快速索引表
**开发者友好** - 包含代码示例、调试指南、最佳实践
### 后续工作
建议按以下优先级继续完善文档:
1. **完成插件开发核心章节**生命周期、组件系统、API 参考)
2. **完成 Air APP 开发核心章节**创建、IPC、窗口管理
3. **添加设计规范文档**(视觉规范、组件规范)
4. **添加实战案例**(完整的开发示例)
5. **完善发布维护文档**CI/CD、版本管理
### 联系方式
如有文档问题或建议:
- 📝 提交 Issuehttps://github.com/HelloWRC/LanMountainDesktop/issues
- 💬 GitHub Discussionshttps://github.com/HelloWRC/LanMountainDesktop/discussions
---
**文档重构完成时间**: 2026年6月8日
**重构人员**: Claude (Anthropic AI)
**文档版本**: v1.0.0

99
docs/README.md Normal file
View File

@@ -0,0 +1,99 @@
# 阑山桌面技术文档
欢迎来到 **LanMountainDesktop阑山桌面** 技术文档中心。
## 📚 文档导航
### [00-快速开始](00-快速开始/)
项目概览、快速安装和基础配置
- [项目介绍](00-快速开始/01-项目介绍.md)
- [快速安装](00-快速开始/02-快速安装.md)
- [开发环境配置](00-快速开始/03-开发环境配置.md)
### [01-插件开发](01-插件开发/)
完整的插件开发指南,从入门到发布
- [插件开发快速开始](01-插件开发/01-快速开始/)
- [插件核心概念](01-插件开发/02-核心概念/)
- [插件 API 参考](01-插件开发/03-API参考/)
- [插件开发实战](01-插件开发/04-实战案例/)
- [插件发布与维护](01-插件开发/05-发布维护/)
### [02-AirApp开发](02-AirApp开发/)
Air APP 独立应用开发指南
- [Air APP 介绍](02-AirApp开发/01-Air-APP介绍.md)
- [创建第一个 Air APP](02-AirApp开发/02-创建第一个AirApp.md)
- [Air APP 架构](02-AirApp开发/03-架构与生命周期.md)
- [Air APP IPC 通信](02-AirApp开发/04-IPC通信.md)
- [Air APP 打包发布](02-AirApp开发/05-打包与发布.md)
### [03-组件设计规范](03-组件设计规范/)
桌面组件设计系统和视觉规范
- [设计系统概述](03-组件设计规范/01-设计系统概述.md)
- [视觉规范](03-组件设计规范/02-视觉规范.md)
- [组件布局规范](03-组件设计规范/03-组件布局规范.md)
- [主题与外观](03-组件设计规范/04-主题与外观.md)
- [交互规范](03-组件设计规范/05-交互规范.md)
### [04-架构与实现](04-架构与实现/)
技术架构、核心系统实现细节
- [整体架构](04-架构与实现/01-整体架构.md)
- [启动器系统](04-架构与实现/02-启动器系统.md)
- [桌面宿主](04-架构与实现/03-桌面宿主.md)
- [插件运行时](04-架构与实现/04-插件运行时.md)
- [组件系统](04-架构与实现/05-组件系统.md)
- [设置系统](04-架构与实现/06-设置系统.md)
- [IPC 通信](04-架构与实现/07-IPC通信.md)
### [05-更新与发布](05-更新与发布/)
应用更新、打包和发布流程
- [更新系统架构](05-更新与发布/01-更新系统架构.md)
- [增量更新实现](05-更新与发布/02-增量更新实现.md)
- [打包与构建](05-更新与发布/03-打包与构建.md)
- [CI/CD 配置](05-更新与发布/04-CICD配置.md)
- [发布流程](05-更新与发布/05-发布流程.md)
## 🎯 快速索引
### 我想...
| 目标 | 查看文档 |
|------|---------|
| 了解项目基本信息 | [项目介绍](00-快速开始/01-项目介绍.md) |
| 搭建开发环境 | [开发环境配置](00-快速开始/03-开发环境配置.md) |
| 开发一个插件 | [插件开发快速开始](01-插件开发/01-快速开始/) |
| 创建桌面组件 | [组件系统](04-架构与实现/05-组件系统.md) |
| 开发独立应用 | [Air APP 开发](02-AirApp开发/) |
| 了解设计规范 | [设计系统概述](03-组件设计规范/01-设计系统概述.md) |
| 理解整体架构 | [整体架构](04-架构与实现/01-整体架构.md) |
| 配置自动更新 | [更新系统架构](05-更新与发布/01-更新系统架构.md) |
| 打包发布应用 | [打包与构建](05-更新与发布/03-打包与构建.md) |
## 🔧 技术栈
- **.NET 10** - 应用框架
- **Avalonia UI 12** - 跨平台 UI 框架
- **FluentAvalonia** - Fluent Design 控件库
- **CommunityToolkit.Mvvm** - MVVM 框架
- **VeloPack** - 应用更新系统
- **dotnetCampus.Ipc** - 进程间通信
## 📖 相关资源
- [GitHub 仓库](https://github.com/HelloWRC/LanMountainDesktop)
- [插件示例](https://github.com/HelloWRC/LanMountainDesktop.SamplePlugin)
- [Avalonia 文档](https://docs.avaloniaui.net/)
- [FluentAvalonia 文档](https://github.com/amwx/FluentAvalonia)
## 📝 贡献文档
发现文档问题或想要改进?欢迎提交 Pull Request
文档源码位于 `docs/` 目录,使用 Markdown 格式编写。
## 📜 旧版文档
旧版文档已归档至 [archive](archive/) 目录,仅供参考。
---
**最后更新**: 2026年6月8日

36
docs/archive/README.md Normal file
View File

@@ -0,0 +1,36 @@
# 旧版文档归档
本目录包含阑山桌面项目的历史文档。这些文档已被新的文档体系替代,但保留在此以供参考。
## 归档时间
2026年6月8日
## 归档内容
- **原有插件开发文档** (`Plugins develop/`) - SDK v5 之前的插件开发指南
- **原有技术文档** - 包括架构、构建、更新系统等文档
- **AI 辅助文档** (`ai/`) - AI 生成的代码库地图和工作流程
- **自动提交文档** (`auto_commit_md/`) - 自动生成的提交记录文档
- **Superpowers 计划** (`superpowers/`) - 早期功能规划文档
## 新文档位置
新的文档体系位于 `docs/` 根目录,按照以下结构组织:
```
docs/
├── 00-快速开始/ # 项目概览、快速安装
├── 01-插件开发/ # 完整插件开发指南
├── 02-AirApp开发/ # Air APP 应用开发
├── 03-组件设计规范/ # 桌面组件设计系统
├── 04-架构与实现/ # 技术架构文档
├── 05-更新与发布/ # 更新系统和发布流程
└── archive/ # 本归档目录
```
## 注意事项
- 旧文档中的 API 和示例代码可能已过时
- 请优先参考新文档体系
- 如需查看历史实现细节,可参考此归档

Some files were not shown because too many files have changed in this diff Show More