feat: 实现v1.2.0云同步与实体重构核心功能
1. 重构用户与任务实体:UserEntity实现IUser<Guid>,TaskEntity继承ABP风格FullAuditedEntityWithUser,主键从int改为Guid 2. 新增云同步代理系统:嵌入式WebServer支持CloudSyncProxy转发云同步请求,新增配置API与持久化 3. 完善前端适配:新增Guid工具函数,更新任务类型定义与API交互逻辑,调整云同步设置弹窗适配本地代理 4. 文档与配置优化:更新文档结构,新增部署文档、版本记录,统一各项目配置项 5. 补充测试与迁移:新增单元测试,更新EF Core数据库迁移快照
This commit is contained in:
@@ -1,414 +0,0 @@
|
||||
# Hua.Todo 技术设计文档 v1.1.0
|
||||
|
||||
## 1. 项目概述
|
||||
本文档描述 Hua.Todo v1.1.0 的技术设计方案,包括项目文件目录结构、模块划分、技术选型和实现细节。
|
||||
|
||||
## 2. 技术栈
|
||||
|
||||
### 2.1 后端技术栈
|
||||
- **开发语言**: C# 10
|
||||
- **框架**: .NET 10
|
||||
- **UI 框架**: MAUI (Multi-platform App UI) + Avalonia (Linux 支持)
|
||||
- **Web 服务器**: Kestrel (ASP.NET Core 内置)
|
||||
- **API 框架**: ASP.NET Core Web API
|
||||
- **数据访问**: Entity Framework Core
|
||||
- **数据库**: SQLite (本地存储)
|
||||
- **日志**: Serilog
|
||||
- **依赖注入**: Microsoft.Extensions.DependencyInjection
|
||||
|
||||
### 2.2 前端技术栈
|
||||
- **开发语言**: JavaScript/TypeScript
|
||||
- **框架**: Vue.js 3
|
||||
- **构建工具**: Vite
|
||||
- **HTTP 客户端**: Axios
|
||||
- **状态管理**: Pinia
|
||||
- **UI 组件库**: Element Plus / Vant (移动端)
|
||||
- **CSS 预处理器**: SCSS
|
||||
|
||||
## 3. 项目目录结构
|
||||
|
||||
```
|
||||
Hua.Todo/
|
||||
├── docs/ # 文档目录
|
||||
│ ├── manual/ # 用户/开发者手册
|
||||
│ │ ├── 技术栈与模块.md
|
||||
│ │ ├── 版本记录.md
|
||||
│ │ ├── 技术设计文档.md(本文件)
|
||||
│ │ ├── 代码规范文档.md
|
||||
│ │ └── 部署文档.md
|
||||
│ └── project/ # 项目进度/需求文档
|
||||
│ ├── 产品需求文档.md
|
||||
│ └── ...
|
||||
│
|
||||
├── src/ # 源代码目录
|
||||
│ ├── Hua.Todo.Maui/ # MAUI 主项目(跨平台入口)
|
||||
│ │ ├── Platforms/ # 平台特定代码
|
||||
│ │ │ ├── Windows/ # Windows 平台代码
|
||||
│ │ │ │ ├── App.xaml # Windows 应用入口
|
||||
│ │ │ │ └── Services/ # Windows 平台服务
|
||||
│ │ │ │ └── HotKeyService.cs
|
||||
│ │ │ ├── MacCatalyst/ # macOS 平台代码
|
||||
│ │ │ │ ├── App.xaml
|
||||
│ │ │ │ └── Services/
|
||||
│ │ │ │ └── HotKeyService.cs
|
||||
│ │ │ ├── Android/ # Android 平台代码
|
||||
│ │ │ │ ├── MainActivity.cs
|
||||
│ │ │ │ └── Services/
|
||||
│ │ │ │ └── NotificationService.cs
|
||||
│ │ │ └── iOS/ # iOS 平台代码
|
||||
│ │ │ ├── AppDelegate.cs
|
||||
│ │ │ └── Services/
|
||||
│ │ │ └── NotificationService.cs
|
||||
│ │ ├── Resources/ # 资源文件
|
||||
│ │ │ ├── Images/ # 图片资源
|
||||
│ │ │ ├── Styles/ # 样式资源
|
||||
│ │ │ └── Fonts/ # 字体资源
|
||||
│ │ ├── Controls/ # 自定义控件
|
||||
│ │ │ └── WebViewContainer.xaml
|
||||
│ │ ├── Services/ # 服务层
|
||||
│ │ │ ├── IHotKeyService.cs
|
||||
│ │ │ ├── IPlatformService.cs
|
||||
│ │ │ └── AppLifecycleService.cs
|
||||
│ │ ├── App.xaml # MAUI 应用入口
|
||||
│ │ ├── App.xaml.cs
|
||||
│ │ ├── MauiProgram.cs # MAUI 程序配置
|
||||
│ │ └── Hua.Todo.Maui.csproj # MAUI 项目文件
|
||||
│ │
|
||||
│ ├── Hua.Todo.Avalonia/ # Avalonia 项目(Linux 支持)
|
||||
│ │ ├── Assets/ # 资源文件
|
||||
│ │ │ └── icon.ico # 应用图标
|
||||
│ │ ├── Services/ # 服务层
|
||||
│ │ │ ├── EmbeddedWebServerServiceFactory.cs
|
||||
│ │ │ ├── GlobalHotKeyServiceFactory.cs
|
||||
│ │ │ ├── NoopEmbeddedWebServerService.cs
|
||||
│ │ │ └── Platforms/ # 平台特定服务
|
||||
│ │ │ ├── AndroidGlobalHotKeyService.cs
|
||||
│ │ │ └── LinuxGlobalHotKeyService.cs
|
||||
│ │ ├── Views/ # 视图
|
||||
│ │ │ ├── MainView.axaml
|
||||
│ │ │ ├── MainView.axaml.cs
|
||||
│ │ │ ├── MainWindow.axaml
|
||||
│ │ │ └── MainWindow.axaml.cs
|
||||
│ │ ├── App.axaml # Avalonia 应用入口
|
||||
│ │ ├── App.axaml.cs
|
||||
│ │ ├── Program.cs # Avalonia 程序配置
|
||||
│ │ ├── appsettings.json # 配置文件
|
||||
│ │ ├── setup.iss # 安装脚本
|
||||
│ │ ├── wwwroot/ # 前端静态资源
|
||||
│ │ └── Hua.Todo.Avalonia.csproj # Avalonia 项目文件
|
||||
│ │
|
||||
│ ├── Hua.Todo.Host/ # 后端 API 项目
|
||||
│ │ ├── Controllers/ # API 控制器
|
||||
│ │ │ ├── TasksController.cs
|
||||
│ │ │ ├── SettingsController.cs
|
||||
│ │ │ └── SyncController.cs
|
||||
│ │ ├── Models/ # 数据模型
|
||||
│ │ │ ├── Task.cs
|
||||
│ │ │ ├── TaskDto.cs
|
||||
│ │ │ └── ApiResponse.cs
|
||||
│ │ ├── Services/ # 业务服务
|
||||
│ │ │ ├── ITaskService.cs
|
||||
│ │ │ ├── TaskService.cs
|
||||
│ │ │ ├── ISyncService.cs
|
||||
│ │ │ └── SyncService.cs
|
||||
│ │ ├── Data/ # 数据访问层
|
||||
│ │ │ ├── TodoDbContext.cs
|
||||
│ │ │ ├── Converters/ # 类型转换器
|
||||
│ │ │ │ └── LenientUtcDateTimeStringConverter.cs
|
||||
│ │ │ ├── Repositories/
|
||||
│ │ │ │ ├── ITaskRepository.cs
|
||||
│ │ │ │ └── TaskRepository.cs
|
||||
│ │ │ └── Migrations/ # 数据库迁移
|
||||
│ │ ├── Middleware/ # 中间件
|
||||
│ │ │ └── ExceptionMiddleware.cs
|
||||
│ │ ├── Extensions/ # 扩展方法
|
||||
│ │ │ └── ServiceCollectionExtensions.cs
|
||||
│ │ ├── Program.cs # API 入口
|
||||
│ │ ├── appsettings.json # 配置文件
|
||||
│ │ └── Hua.Todo.Host.csproj # Host 项目文件
|
||||
│ │
|
||||
│ ├── Hua.Todo.Application/ # 应用层
|
||||
│ │ ├── Data/ # 数据访问
|
||||
│ │ │ ├── TodoDbContext.cs
|
||||
│ │ │ └── Converters/ # 类型转换器
|
||||
│ │ │ └── LenientUtcDateTimeStringConverter.cs
|
||||
│ │ └── Hua.Todo.Application.csproj # Application 项目文件
|
||||
│ │
|
||||
│ ├── Hua.Todo.Core/ # 核心业务逻辑层
|
||||
│ │ ├── Entities/ # 实体类
|
||||
│ │ │ ├── Task.cs
|
||||
│ │ │ └── TaskPriority.cs
|
||||
│ │ ├── Interfaces/ # 接口定义
|
||||
│ │ │ ├── ITaskRepository.cs
|
||||
│ │ │ └── IUnitOfWork.cs
|
||||
│ │ ├── ValueObjects/ # 值对象
|
||||
│ │ │ └── TaskTitle.cs
|
||||
│ │ ├── Specifications/ # 规范模式
|
||||
│ │ │ └── TaskSpecifications.cs
|
||||
│ │ └── Hua.Todo.Core.csproj # Core 项目文件
|
||||
│ │
|
||||
│ ├── Hua.Todo.Web/ # 前端 Web 项目 (Vue.js)
|
||||
│ │ ├── public/ # 静态资源
|
||||
│ │ │ └── favicon.svg # 网站图标
|
||||
│ │ ├── src/ # 源代码
|
||||
│ │ │ ├── api/ # API 调用
|
||||
│ │ │ │ ├── client.ts # HTTP 客户端配置
|
||||
│ │ │ │ ├── tasks.ts # 任务相关 API
|
||||
│ │ │ │ └── settings.ts # 设置相关 API
|
||||
│ │ │ ├── assets/ # 资源文件
|
||||
│ │ │ │ ├── images/
|
||||
│ │ │ │ └── styles/
|
||||
│ │ │ ├── components/ # Vue 组件
|
||||
│ │ │ │ ├── TaskList.vue
|
||||
│ │ │ │ ├── TaskItem.vue
|
||||
│ │ │ │ ├── QuickEntry.vue
|
||||
│ │ │ │ └── Settings.vue
|
||||
│ │ │ ├── composables/ # 组合式函数
|
||||
│ │ │ │ ├── useTasks.ts
|
||||
│ │ │ │ └── useHotKey.ts
|
||||
│ │ │ ├── stores/ # 状态管理 (Pinia)
|
||||
│ │ │ │ ├── tasks.ts
|
||||
│ │ │ │ └── settings.ts
|
||||
│ │ │ ├── types/ # TypeScript 类型定义
|
||||
│ │ │ │ ├── task.ts
|
||||
│ │ │ │ └── api.ts
|
||||
│ │ │ ├── utils/ # 工具函数
|
||||
│ │ │ │ ├── date.ts
|
||||
│ │ │ │ └── storage.ts
|
||||
│ │ │ ├── App.vue # 根组件
|
||||
│ │ │ └── main.ts # 应用入口
|
||||
│ │ ├── package.json # 依赖配置
|
||||
│ │ ├── vite.config.ts # Vite 配置
|
||||
│ │ ├── tsconfig.json # TypeScript 配置
|
||||
│ │ └── index.html # HTML 模板
|
||||
│ │
|
||||
│ └── Hua.Todo.Tests/ # 测试项目
|
||||
│ ├── Unit/ # 单元测试
|
||||
│ │ ├── Services/
|
||||
│ │ │ └── TaskServiceTests.cs
|
||||
│ │ └── Controllers/
|
||||
│ │ └── TasksControllerTests.cs
|
||||
│ ├── Integration/ # 集成测试
|
||||
│ │ └── ApiIntegrationTests.cs
|
||||
│ └── Hua.Todo.Tests.csproj
|
||||
│
|
||||
├── .gitignore # Git 忽略文件
|
||||
├── Hua.Todo.sln # 解决方案文件
|
||||
└── README.md # 项目说明文档
|
||||
```
|
||||
|
||||
## 4. 模块设计
|
||||
|
||||
### 4.1 MAUI 主项目 (Hua.Todo.Maui)
|
||||
**职责**:
|
||||
- 应用程序入口和生命周期管理
|
||||
- 平台特定功能封装
|
||||
- WebView 容器管理
|
||||
- 本地 HTTP 服务器启动
|
||||
|
||||
**调试与接口文档**:
|
||||
- Windows Debug 模式下,内嵌 WebServer 默认提供 Swagger UI(`{HostUrl}/swagger`)与 OpenAPI JSON(`{HostUrl}/swagger/v1/swagger.json`),用于本地接口联调。
|
||||
|
||||
**关键组件**:
|
||||
- `MauiProgram.cs`: 配置 MAUI 应用和依赖注入
|
||||
- `App.xaml.cs`: 应用程序主入口
|
||||
- `WebViewContainer`: 封装 WebView 控件
|
||||
- 平台特定服务: 快捷键、通知等
|
||||
|
||||
### 4.2 Avalonia 项目 (Hua.Todo.Avalonia)
|
||||
**职责**:
|
||||
- Linux 平台支持
|
||||
- 桌面交互功能(托盘菜单、全局热键等)
|
||||
- WebView 容器管理
|
||||
- 本地 HTTP 服务器启动
|
||||
|
||||
**关键组件**:
|
||||
- `Program.cs`: 配置 Avalonia 应用和依赖注入
|
||||
- `App.axaml.cs`: 应用程序主入口
|
||||
- `MainWindow.axaml.cs`: 主窗口管理
|
||||
- `MainView.axaml.cs`: 主视图管理
|
||||
- `GlobalHotKeyServiceFactory`: 全局热键服务工厂
|
||||
- `EmbeddedWebServerServiceFactory`: 内嵌 Web 服务器服务工厂
|
||||
- 平台特定服务: Linux 全局热键等
|
||||
|
||||
### 4.3 后端 API 项目 (Hua.Todo.Host)
|
||||
**职责**:
|
||||
- 提供 RESTful API 接口
|
||||
- 业务逻辑处理
|
||||
- 数据访问和持久化
|
||||
- 本地 HTTP 服务器托管
|
||||
|
||||
**接口文档**:
|
||||
- 开发环境(`ASPNETCORE_ENVIRONMENT=Development`)下提供 Swagger UI:`http://localhost:5173/swagger`(或 `https://localhost:7175/swagger`)。
|
||||
|
||||
**关键组件**:
|
||||
- `CloudSync`: 云同步 Minimal APIs(`/auth`、`/tasks`、`/sync`、`/security`)
|
||||
- `DynamicApiMiddleware`: 任务管理等业务接口通过 Dynamic API(`/api/{service}/...`)对外暴露
|
||||
- `Data`: 数据访问层和数据库上下文
|
||||
- `Program.cs`: API 服务器配置和启动
|
||||
|
||||
### 4.4 核心业务层 (Hua.Todo.Core)
|
||||
**职责**:
|
||||
- 定义领域模型和业务规则
|
||||
- 提供核心业务接口
|
||||
- 实现领域驱动设计模式
|
||||
|
||||
**关键组件**:
|
||||
- `Entities`: 领域实体
|
||||
- `Interfaces`: 业务接口定义
|
||||
- `ValueObjects`: 值对象
|
||||
- `Specifications`: 业务规范
|
||||
|
||||
### 4.5 前端 Web 项目 (Hua.Todo.Web)
|
||||
**职责**:
|
||||
- 用户界面展示
|
||||
- 用户交互处理
|
||||
- HTTP API 调用
|
||||
- 状态管理
|
||||
|
||||
**关键组件**:
|
||||
- `components`: Vue 组件
|
||||
- `api`: API 调用封装
|
||||
- `stores`: 状态管理
|
||||
- `composables`: 组合式函数
|
||||
|
||||
## 5. HTTP API 设计
|
||||
|
||||
### 5.1 API 基础配置
|
||||
- **基础 URL(开发三件套 / Host 模式)**: `http://localhost:5173/api`(或 `https://localhost:7175/api`)
|
||||
- **基础 URL(MAUI 内嵌模式)**: `{HostUrl}/api`(`HostUrl` 来自 `appsettings.json: WebServer.HostUrl`,默认 `http://localhost:5057`)
|
||||
- **数据格式**: JSON
|
||||
- **认证方式**: 以实际端点为准(如云同步相关端点可能需要认证)
|
||||
- **跨域配置**: 允许本地跨域请求
|
||||
|
||||
### 5.2 API 端点设计
|
||||
|
||||
#### 任务管理 API
|
||||
```
|
||||
GET /api/task # 获取任务列表(默认:全部)
|
||||
GET /api/task/active # 获取未完成任务
|
||||
GET /api/task/completed # 获取已完成任务
|
||||
GET /api/task/{id} # 获取单个任务
|
||||
POST /api/task # 创建任务
|
||||
PUT /api/task # 更新任务(通过 Body 内的 id 定位)
|
||||
DELETE /api/task/{id} # 删除任务
|
||||
PATCH /api/task/{id}/toggle # 切换完成状态
|
||||
GET /api/task/{parentTaskId}/subtasks # 获取子任务列表
|
||||
```
|
||||
|
||||
#### 云同步 API(Host 模式)
|
||||
```
|
||||
POST /auth/bootstrap # 初始化管理员(仅首次)
|
||||
POST /auth/login # 登录
|
||||
POST /auth/step-up # 二次验证(提升权限)
|
||||
GET /tasks/ # 获取云端任务(只读)
|
||||
POST /sync/ # 推送/拉取合并同步
|
||||
GET /security/policy # 获取安全策略
|
||||
PUT /security/policy # 更新安全策略
|
||||
```
|
||||
|
||||
## 6. 数据库设计
|
||||
|
||||
### 6.1 数据库表结构
|
||||
|
||||
#### Tasks 表
|
||||
```sql
|
||||
CREATE TABLE Tasks (
|
||||
Id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
Title TEXT NOT NULL,
|
||||
Priority INTEGER NOT NULL DEFAULT 0,
|
||||
IsCompleted INTEGER NOT NULL DEFAULT 0,
|
||||
CreatedAt TEXT NOT NULL,
|
||||
UpdatedAt TEXT NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
#### Settings 表
|
||||
```sql
|
||||
CREATE TABLE Settings (
|
||||
Key TEXT PRIMARY KEY,
|
||||
Value TEXT NOT NULL,
|
||||
UpdatedAt TEXT NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
### 6.2 数据访问策略
|
||||
- 使用 Entity Framework Core 进行数据访问
|
||||
- 采用 Repository 模式封装数据访问
|
||||
- 支持 LINQ 查询和异步操作
|
||||
- 数据库迁移管理
|
||||
|
||||
## 7. 通信机制
|
||||
|
||||
### 7.1 HTTP 通信流程
|
||||
1. **C# 后端启动**: MAUI 应用启动时启动本地 Kestrel 服务器
|
||||
2. **Vue 前端加载**: WebView 加载 Vue 应用
|
||||
3. **API 调用**: Vue 通过 Axios 调用本地 HTTP API
|
||||
4. **数据处理**: C# 后端处理请求并返回 JSON 数据
|
||||
5. **界面更新**: Vue 接收响应并更新界面
|
||||
|
||||
### 7.2 错误处理
|
||||
- 统一的错误响应格式
|
||||
- 异常中间件捕获和处理
|
||||
- 前端错误提示和重试机制
|
||||
|
||||
## 8. 部署和打包
|
||||
|
||||
### 8.1 开发环境
|
||||
- **后端调试**: 使用 Visual Studio 调试 MAUI 应用
|
||||
- **前端调试**: 使用 Vite 开发服务器
|
||||
- **热重载**: 支持前后端热重载
|
||||
|
||||
### 8.2 生产构建
|
||||
- **前端构建**: `npm run build` 生成静态文件
|
||||
- **后端打包**: MAUI 发布各平台应用
|
||||
- **静态文件嵌入**: 将前端静态文件嵌入到 MAUI 应用中
|
||||
|
||||
### 8.3 平台特定配置
|
||||
- **Windows**: WebView2 运行时要求
|
||||
- **macOS**: 代码签名和公证
|
||||
- **移动端**: 应用商店发布配置
|
||||
- **Linux**: .NET MAUI 无官方 Linux 目标,需要引入独立桌面宿主(例如基于 WebKitGTK 的方案)并处理运行时依赖与打包格式
|
||||
|
||||
## 9. 性能优化
|
||||
|
||||
### 9.1 前端优化
|
||||
- 组件懒加载
|
||||
- 虚拟滚动(长列表)
|
||||
- 图片懒加载
|
||||
- 缓存策略
|
||||
|
||||
### 9.2 后端优化
|
||||
- 数据库查询优化
|
||||
- 响应缓存
|
||||
- 异步处理
|
||||
- 连接池管理
|
||||
|
||||
## 10. 安全考虑
|
||||
|
||||
### 10.1 本地安全
|
||||
- 本地服务器仅监听 localhost
|
||||
- 防止外部访问
|
||||
- 数据加密存储(可选)
|
||||
|
||||
### 10.2 数据安全
|
||||
- 数据库文件权限控制
|
||||
- 定期备份机制
|
||||
- 敏感数据保护
|
||||
|
||||
## 11. 测试策略
|
||||
|
||||
### 11.1 单元测试
|
||||
- 核心业务逻辑测试
|
||||
- 服务层测试
|
||||
- 工具函数测试
|
||||
|
||||
### 11.2 集成测试
|
||||
- API 集成测试
|
||||
- 数据库集成测试
|
||||
- 前后端集成测试
|
||||
|
||||
### 11.3 端到端测试
|
||||
- 跨平台功能测试
|
||||
- 用户流程测试
|
||||
- 性能测试
|
||||
Reference in New Issue
Block a user