Files
2026-10-27 19:01:56 +08:00

69 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 是框架示例,不证明商品业务已接入。新增商品字段、上架状态或权限须依据具体需求与服务端契约。