69 lines
5.5 KiB
Markdown
69 lines
5.5 KiB
Markdown
# Store.Management 项目架构
|
||
|
||
## 定位与实现边界
|
||
|
||
Store.Management 是需要登录并访问远端 API 的 WPF 门店管理客户端。当前实现包含登录、用户 API、框架能力示例以及管理、商品上架模块的启动骨架;不要把骨架或示例描述为已完成的业务功能。
|
||
|
||
## 项目划分
|
||
|
||
| 路径 | 职责 |
|
||
|---|---|
|
||
| `Source/Store.Management/` | 应用宿主、登录窗口、主窗口、示例页面与容器注册 |
|
||
| `Source/Store.Management.Framework/` | WPF 基础控件、应用生命周期、配置目录、配置服务、日志与工具 |
|
||
| `Source/Store.Management.Api/` | RestSharp API 客户端、认证会话、用户接口、DTO 与传输错误 |
|
||
| `Source/Core/MAX.Core/` | 通用工具、Autofac 注册、类型发现与通知集成 |
|
||
| `Source/Core/MAX.Framework/` | Prism/Autofac 适配、命令、弹窗基类与日志封装 |
|
||
| `Source/Core/MAX.Notification/` | 通知契约、发布器与处理器分发 |
|
||
| `Source/Modules/Store.Admin/` | 管理模块骨架,目前通过项目引用依赖 Framework |
|
||
| `Source/Modules/Store.ListingProduct/` | 商品上架模块骨架,目前通过项目引用依赖 Framework |
|
||
| `Tests/` | 可执行的冒烟测试项目 |
|
||
|
||
- 通用 Core 不反向依赖 Store 项目;API 层保持与 WPF 视图解耦。
|
||
- 共用客户端基础设施放 Framework,接口通信放 Api,具体业务放对应模块。
|
||
- 当前宿主没有引用上述两个业务模块;模块只有 `IStartup` 骨架。新增模块功能时核实程序集加载、注册和导航链路,不假设已自动接入。
|
||
- 不为遵守规则而新增数据库、ORM、图表、视频或文档生成依赖;当前仓库没有这些业务实现。
|
||
|
||
## 技术与配置依据
|
||
|
||
- `Directory.Build.props` 默认 `net8.0-windows`、C# `14.0`、隐式 using、Nullable annotations;各项目可以覆盖。
|
||
- Core 与 Notification 中有 `net8.0` 项目;业务模块和部分测试覆盖为 `net10.0` / `net10.0-windows`。依据各 `.csproj`,不将整个解决方案误写为同一目标框架,也不擅自统一。
|
||
- UI 使用 Prism.Wpf 和仓库内的 Autofac 适配,控件使用官方 `HandyControl` 与 `MAX.Common.WPF`;具体版本以项目文件为准。
|
||
- API 使用 RestSharp 与 System.Text.Json;JSON 配置服务使用 Newtonsoft.Json;日志使用 NLog。
|
||
- 应用入口为 `App : FrameworkApplication`,后者继承 `Prism.Autofac.PrismApplication`。维护现有启动、登录成功切换主窗口及退出释放客户端的流程。
|
||
|
||
## 数据、目录与生命周期
|
||
|
||
- 所有 HTTP 请求复用 `StoreApiClient` / `ApiTransport`,不在 ViewModel 中另起传输实现。
|
||
- 路径复用 `FolderConfig`,配置复用 `JsonSettingsServiceBase<T>`;读取路径不应触发不必要的文件创建。
|
||
- 当前 `FolderConfig.AppName` 是 `StoreManagement`,应用数据目录实际为 `%LOCALAPPDATA%/StoreManagement`;不要根据类注释或程序集名猜目录,也不要无迁移方案改名。
|
||
- 保持配置保存的串行化、同目录临时文件替换、失败保留原模型行为。
|
||
- 普通业务失败交给调用方展示;致命错误复用 `ApplicationLogService` / `FrameworkApplication.Fatal`。不要吞掉错误或把取消当作致命故障。
|
||
|
||
## 验证方式
|
||
|
||
C#、XAML 或项目依赖变更后,构建受影响项目并运行相关冒烟测试。以下命令均在仓库根目录执行:
|
||
|
||
```powershell
|
||
dotnet build Store.Management.slnx
|
||
dotnet run --project Tests/MAX.Core.SmokeTests/MAX.Core.SmokeTests.csproj
|
||
dotnet run --project Tests/MAX.Notification.SmokeTests/MAX.Notification.SmokeTests.csproj
|
||
dotnet run --project Tests/Store.Management.Api.SmokeTests/Store.Management.Api.SmokeTests.csproj
|
||
dotnet run --project Tests/Store.Management.Framework.SmokeTests/Store.Management.Framework.SmokeTests.csproj
|
||
dotnet run --project Tests/Store.Management.App.SmokeTests/Store.Management.App.SmokeTests.csproj
|
||
```
|
||
|
||
- 这些测试是控制台可执行程序,不能仅以 `dotnet test` 无失败判断测试已运行。
|
||
- Framework 和 App 冒烟测试未列入当前解决方案,按项目路径单独执行;WPF 测试需要 Windows,部分项目需要 .NET 10 SDK。
|
||
- 纯规则文档修改检查引用和内容即可,无需启动应用或全量构建。
|
||
- 遇到 SDK、还原或文件锁定问题,报告具体阻碍;不要擅自终止用户进程或把失败报告为通过。
|
||
|
||
## API 与业务契约
|
||
|
||
- 复用 `IAuthApi` 的登录、退出、当前用户接口及 `IUserApi` 的查询、新增、更新接口;保持现有路由大小写、HTTP 方法与参数位置。
|
||
- 登录窗口当前按服务端契约对 UTF-8 密码计算 32 位大写 MD5 后提交,保留密码首尾空格。不把该转换推广为其他用途的密码存储策略。
|
||
- TokenSession 只存内存,不将密码或 Token 写入配置、日志或用户资料 DTO;保持登录/退出串行及旧请求 401 不清除新会话的行为。
|
||
- ApiResult 的业务成功码为 200;HTTP 成功不等于业务成功。分页使用 Page、PageSize 与 Total、Items;保留 DTO DataAnnotations 的长度及范围限制。
|
||
- 用户名与昵称分别对应 UserName、NickName;积分与可空余额使用 DTO 的 decimal 类型,区分 null 与 0。不自行推断 GroupId、ParentUserName 的权限语义。
|
||
- ApiTransport 是统一传输出口,负责相对路由、版本、认证头、校验、取消与错误分类;保留 ApiException 的类型、状态和追踪信息。
|
||
- ProductSavedNotification 是框架示例,不证明商品业务已接入。新增商品字段、上架状态或权限须依据具体需求与服务端契约。
|