# PetWashControl 项目结构说明 ## 文件夹组织 ``` PetWashControl/ ├── Converters/ # 值转换器 │ └── BoolToStatusConverter.cs ├── Models/ # 数据模型 │ ├── Order.cs │ └── Package.cs ├── Services/ # 业务服务层 │ ├── ApiService.cs # API通信服务 │ ├── MqttClientService.cs # MQTT客户端服务 │ ├── ConfigurationService.cs # 配置管理 │ └── LogService.cs # 日志服务 ├── ViewModels/ # 视图模型(MVVM) │ └── MainViewModel.cs ├── Views/ # 视图(XAML界面) │ ├── MainWindow.xaml │ └── MainWindow.xaml.cs ├── Resources/ # 资源文件 │ └── Styles.xaml # 样式定义 ├── App.xaml # 应用程序入口 ├── App.xaml.cs └── AssemblyInfo.cs ``` ## 架构模式 ### MVVM (Model-View-ViewModel) - **Model**: 数据模型,定义业务实体(Package, Order) - **View**: XAML界面,负责UI展示 - **ViewModel**: 视图模型,处理业务逻辑和数据绑定 ### 依赖注入 使用构造函数注入服务依赖: - ConfigurationService: 配置管理 - ApiService: HTTP API通信 - MqttClientService: MQTT消息通信 - LogService: 日志记录 ## 核心组件 ### 1. Services(服务层) #### ApiService - 负责与后端API通信 - 提供套餐查询、订单管理等接口 - 统一异常处理 #### MqttClientService - MQTT客户端封装 - 订阅设备状态和命令主题 - 自动重连机制 #### ConfigurationService - 集中管理配置参数 - API地址、MQTT连接信息等 #### LogService - 日志记录到文件和调试窗口 - 按日期分割日志文件 ### 2. ViewModels(视图模型) #### MainViewModel - 使用 CommunityToolkit.Mvvm 实现MVVM - ObservableProperty: 自动属性通知 - RelayCommand: 命令绑定 - 业务流程控制 ### 3. Converters(值转换器) #### BoolToStatusConverter - 将布尔值转换为状态文本 - 用于UI显示 ### 4. Resources(资源) #### Styles.xaml - 统一的UI样式定义 - 颜色主题 - 按钮、文本等控件样式 ## NuGet 依赖包 ```xml ``` ### 包说明 - **CommunityToolkit.Mvvm**: MVVM框架,提供ObservableObject、RelayCommand等 - **MQTTnet**: MQTT客户端库(4.3.7版本) - **Microsoft.Extensions.Hosting**: 依赖注入和托管服务 - **System.Net.Http.Json**: HTTP JSON扩展方法 - **System.Text.Json**: JSON序列化 ### 版本兼容性说明 #### MQTTnet 4.3.7 重要变更 1. **ConnectAsync**: 需要传入 `CancellationToken` 参数 ```csharp await _mqttClient.ConnectAsync(_options, CancellationToken.None); ``` 2. **SubscribeAsync**: 使用 Builder 模式 ```csharp var subscribeOptions = new MqttClientSubscribeOptionsBuilder() .WithTopicFilter("device/status") .WithTopicFilter("device/command") .Build(); await _mqttClient.SubscribeAsync(subscribeOptions, CancellationToken.None); ``` 3. **PublishAsync**: 需要传入 `CancellationToken` 参数 ```csharp await _mqttClient.PublishAsync(message, CancellationToken.None); ``` 4. **Payload 属性**: `PayloadSegment` 返回 `ArraySegment` ```csharp var payloadBytes = args.ApplicationMessage.PayloadSegment.ToArray(); var payload = Encoding.UTF8.GetString(payloadBytes); ``` ## 数据流 1. **初始化**: MainViewModel.InitializeAsync() - 连接MQTT Broker - 加载套餐列表 2. **创建订单**: CreateOrderCommand - 调用API创建订单 - 更新UI状态 3. **支付**: SimulatePaymentCommand - 确认支付 - 接收MQTT开门指令 4. **关门**: CloseDoorCommand - 发送MQTT关门状态 - 更新订单状态 - 接收开始清洗指令 5. **完成**: 自动流程 - 模拟清洗时间 - 发送完成状态 - 更新订单 ## 配置说明 ### ConfigurationService 默认配置 ```csharp ApiBaseUrl = "https://localhost:7001/" MqttBrokerHost = "localhost" MqttBrokerPort = 1883 MqttClientId = "PetWashControl" WashSimulationSeconds = 10 ``` ## 日志 日志文件位置: `{应用目录}/Logs/log_yyyyMMdd.txt` 日志级别: - INFO: 一般信息 - WARN: 警告 - ERROR: 错误(包含异常堆栈) ## 开发建议 1. 新增功能时遵循MVVM模式 2. 服务层保持单一职责 3. 使用依赖注入管理服务 4. 异常处理要友好提示用户 5. 重要操作记录日志 6. UI样式统一使用资源字典 ## 扩展点 - 添加新视图: Views文件夹 - 添加新服务: Services文件夹 - 自定义样式: Resources/Styles.xaml - 配置参数: ConfigurationService