|
1 | 1 | # PROJECT KNOWLEDGE BASE |
2 | 2 |
|
3 | | -**Generated:** 2026-02-26 |
4 | | -**Commit:** 1cb9a70 |
5 | | -**Branch:** feat/munet-ui |
| 3 | +**Generated:** 2026-04-26 |
| 4 | +**Commit:** 232b5cb |
| 5 | +**Branch:** pr/Starrah/58 |
6 | 6 |
|
7 | 7 | ## OVERVIEW |
8 | 8 |
|
9 | | -MaiChartManager (Sitreamai) — maimai 音游谱面管理工具。C# ASP.NET Core 后端 + WinForms 桌面壳 + Vue 3 前端 SPA,内嵌本地 web server。 |
| 9 | +MaiChartManager (Sitreamai) — maimai 音游谱面管理工具。C# ASP.NET Core (net10.0-windows) 后端 + WinForms 桌面壳 + Vue 3 前端 SPA,内嵌本地 Kestrel web server。 |
10 | 10 |
|
11 | 11 | ## STRUCTURE |
12 | 12 |
|
13 | 13 | ``` |
14 | 14 | Sitreamai/ |
15 | 15 | ├── MaiChartManager/ # 主程序:ASP.NET Core + WinForms 混合桌面应用 |
16 | | -│ ├── Controllers/ # REST API 控制器(按领域分子目录) |
17 | | -│ ├── Front/ # Vue 3 + TypeScript 前端 SPA |
18 | | -│ ├── Models/ # DTO / XML 数据模型 |
| 16 | +│ ├── Controllers/ # REST API 控制器(按领域分 7 个子目录) |
| 17 | +│ ├── Front/ # Vue 3 + TypeScript 前端 SPA(pnpm workspace 成员) |
| 18 | +│ ├── Models/ # DTO / XML 数据模型(纯数据结构,无业务逻辑) |
19 | 19 | │ ├── Services/ # 业务逻辑服务 |
20 | 20 | │ ├── Utils/ # 音频/视频/图片转换、CRI 工具 |
21 | | -│ ├── WannaCRI/ # CRI 音频格式处理 |
22 | | -│ └── FFMpeg/ # 嵌入式 FFmpeg |
| 21 | +│ ├── Attributes/ # 自定义 Attribute |
| 22 | +│ ├── Locale/ # i18n 资源(resx) |
| 23 | +│ ├── Libs/ # 打包进来的第三方库 |
| 24 | +│ ├── Python/ # ⚠️ 嵌入式 Python 运行时(勿修改) |
| 25 | +│ ├── FFMpeg/ # ⚠️ 嵌入式 FFmpeg(勿修改) |
| 26 | +│ ├── WannaCRI/ # ⚠️ CRI 音频工具(勿修改) |
| 27 | +│ ├── Resources/ # 应用资源 |
| 28 | +│ └── wwwroot/ # ⚠️ 前端构建产物(勿手动修改) |
23 | 29 | ├── MaiChartManager.CLI/ # 命令行工具 (mcm),Spectre.Console |
| 30 | +├── MaiChartManager.GenClient/ # API client 生成辅助项目 |
24 | 31 | ├── AquaMai/ # [submodule] BepInEx/MelonLoader 游戏 mod |
25 | 32 | ├── MaiLib/ # [submodule] maimai 谱面解析库 |
| 33 | +├── MuConvert/ # [submodule] 谱面格式转换工具 |
| 34 | +├── MuNET-UI/ # [submodule] @munet/ui 通用 UI 组件库(pnpm workspace 成员) |
26 | 35 | ├── SimaiSharp/ # [submodule] Simai 谱面格式解析 |
27 | 36 | ├── SonicAudioTools/ # [submodule] CRI 音频工具库 |
28 | 37 | ├── XV2-Tools/ # [submodule] ACB/HCA 音频格式处理 |
29 | | -└── Packaging/ # MSIX 打包脚本和资源 |
| 38 | +└── Packaging/ # MSIX/Appx 打包脚本和资源 |
30 | 39 | ``` |
31 | 40 |
|
32 | 41 | ## WHERE TO LOOK |
33 | 42 |
|
34 | 43 | | Task | Location | Notes | |
35 | 44 | |------|----------|-------| |
36 | 45 | | 添加/修改 API 接口 | `MaiChartManager/Controllers/` | 按领域分目录,见子目录 AGENTS.md | |
37 | | -| 前端 UI 修改 | `MaiChartManager/Front/src/` | Vue 3 + Naive UI,见子目录 AGENTS.md | |
| 46 | +| 前端 UI 修改 | `MaiChartManager/Front/src/` | Vue 3 + Naive UI + UnoCSS,见子目录 AGENTS.md | |
38 | 47 | | 音频处理逻辑 | `MaiChartManager/Utils/Audio*.cs`, `CriUtils.cs` | FFmpeg + CRI SDK | |
39 | | -| 谱面导入/解析 | `MaiChartManager/Services/`, `MaiLib/`, `SimaiSharp/` | MaiLib 和 SimaiSharp 是 submodule | |
40 | | -| 应用启动流程 | `MaiChartManager/Program.cs` → `AppMain.cs` → `ServerManager.cs` | WinForms 单实例 + Kestrel | |
41 | | -| 桌面窗口 | `Browser.cs`, `Launcher.cs` | WinForms,WebView2 嵌入前端 | |
| 48 | +| 谱面导入/解析 | `Controllers/Charts/Services/`, `MaiLib/`, `SimaiSharp/` | MaiLib 和 SimaiSharp 是 submodule | |
| 49 | +| 应用启动流程 | `Program.cs` → `AppMain.cs` → `ServerManager.cs` | 单实例 + Kestrel + WebView2 | |
| 50 | +| 桌面窗口 | `Browser.cs`, `OobeBrowser.cs`, `Launcher.cs` | Browser=主窗口, OobeBrowser=引导页, Launcher=无WebView2时的旧壳 | |
42 | 51 | | IAP/授权 | `IapManager.cs`, `OfflineReg.cs` | Windows Store IAP | |
43 | | -| CLI 工具 | `MaiChartManager.CLI/` | `makeusm`, `makeacb` 命令 | |
| 52 | +| CLI 工具 | `MaiChartManager.CLI/` | `makeusm`, `makeacb`, `makemp4`, `makeab` 命令 | |
44 | 53 | | AquaMai mod 配置 | `Controllers/Mod/`, `Models/AquaMaiConfigDto.cs` | 管理游戏 mod 的安装和配置 | |
45 | | -| 打包发布 | `Packaging/Build.ps1` | PowerShell,MSIX 打包 | |
| 54 | +| UI 组件库 | `MuNET-UI/` | @munet/ui, defineComponent + JSX,submodule | |
| 55 | +| 谱面格式转换 | `MuConvert/` | ANTLR 解析,submodule | |
| 56 | +| 打包发布 | `Packaging/Build.ps1` | PowerShell, dotnet publish → makeappx | |
46 | 57 |
|
47 | 58 | ## CONVENTIONS |
48 | 59 |
|
49 | | -- 构建配置:Debug / Release / Crack(三种,Crack 是特殊功能解锁) |
50 | | -- 平台:仅 x64 |
51 | | -- 5 个 git submodule,各自有独立仓库,勿直接修改 submodule 内代码 |
52 | | -- 前端 API client 由 `genClient.ts` 自动生成,勿手动编辑 `apiGen.ts` |
53 | | -- 前端包管理用 pnpm |
54 | | -- 后端 ASP.NET Core 控制器按领域分子目录(App/AssetDir/Catagory/Charts/Mod/Music/Tools) |
55 | | -- 注意:`Catagory` 是 typo(应为 Category),但已是既定命名,保持一致 |
| 60 | +- **目标框架**:主程序 net10.0-windows,AquaMai net472,MaiLib net9.0 |
| 61 | +- **构建配置**:Debug / Release / Crack(Crack 启用 `CRACK` 宏,Canary 发布用) |
| 62 | +- **Nullable + ImplicitUsings**:主程序开启,子项目不一定 |
| 63 | +- **平台**:仅 x64 |
| 64 | +- **7 个 git submodule**,各自有独立仓库,勿直接修改 submodule 内代码 |
| 65 | +- **pnpm workspace**:根 `pnpm-workspace.yaml` 包含 `MaiChartManager/Front` 和 `MuNET-UI` |
| 66 | +- **前端 API client** 由 `genClient.ts` 使用 swagger-typescript-api 自动生成,勿手动编辑 `apiGen.ts` |
| 67 | +- **后端路由**:`[Route("MaiChartManagerServlet/[action]Api")]` 风格 |
| 68 | +- **控制器按领域分子目录**:App / AssetDir / Catagory / Charts / Mod / Music / Tools |
| 69 | +- **`Catagory` 是 typo**(应为 Category),但已是既定命名,保持一致 |
56 | 70 |
|
57 | 71 | ## ANTI-PATTERNS |
58 | 72 |
|
59 | | -- 不要修改 submodule 内的代码(AquaMai/MaiLib/SimaiSharp/SonicAudioTools/XV2-Tools) |
| 73 | +- 不要修改 submodule 内的代码(AquaMai/MaiLib/MuConvert/MuNET-UI/SimaiSharp/SonicAudioTools/XV2-Tools) |
60 | 74 | - 不要手动编辑 `Front/src/client/apiGen.ts` 和 `aquaMaiVersionConfigApiGen.ts` |
61 | 75 | - 不要修改 `*.Designer.cs` 文件(WinForms 自动生成) |
| 76 | +- 不要手动编辑 `wwwroot/`(前端构建产物,通过 `pnpm build` 生成) |
| 77 | +- 不要修改 `Python/`、`FFMpeg/`、`WannaCRI/` 目录(嵌入式运行时) |
| 78 | +- 不要在 `Models/` 里写业务逻辑,只放纯数据结构 |
| 79 | +- 不要用 npm 或 yarn,统一使用 pnpm |
62 | 80 |
|
63 | 81 | ## COMMANDS |
64 | 82 |
|
65 | 83 | ```bash |
66 | | -# 构建(需要 Visual Studio 或 dotnet CLI) |
| 84 | +# 构建 |
67 | 85 | dotnet build Sitreamai.slnx -c Release |
68 | 86 |
|
69 | | -# 前端开发 |
| 87 | +# 前端开发(dev server 端口 5182,代理后端 5181) |
70 | 88 | cd MaiChartManager/Front && pnpm install && pnpm dev |
71 | 89 |
|
72 | | -# 前端构建 |
| 90 | +# 前端构建(输出到 ../wwwroot) |
73 | 91 | cd MaiChartManager/Front && pnpm build |
74 | 92 |
|
75 | | -# 生成 API client |
76 | | -cd MaiChartManager/Front && npx ts-node genClient.ts |
| 93 | +# 生成 API client(需先启动后端 localhost:5181) |
| 94 | +cd MaiChartManager/Front && pnpm genClient |
77 | 95 |
|
78 | | -# 打包 |
| 96 | +# 打包(Release 或 Canary) |
79 | 97 | powershell Packaging/Build.ps1 |
| 98 | +powershell Packaging/Build.ps1 -Mode Canary |
80 | 99 | ``` |
81 | 100 |
|
82 | 101 | ## NOTES |
83 | 102 |
|
84 | | -- 项目混合了 WinForms(桌面壳)+ ASP.NET Core(本地 API server)+ Vue 3(前端 SPA)的非常规架构 |
85 | | -- Browser.cs 用 WebView2 加载前端,前端通过 localhost API 与后端通信 |
86 | | -- Python 和 FFmpeg 是嵌入式运行时,打包在应用内 |
87 | | -- MaiChartManager.CLI 共享主项目的部分代码,但是独立的 csproj |
| 103 | +- 非常规混合架构:WinForms 桌面壳 + ASP.NET Core 本地 API server + Vue 3 SPA + WebView2 |
| 104 | +- Browser.cs 通过 WebView2 加载前端,注入 `globalThis.backendUrl`,前端通过 localhost API 通信 |
| 105 | +- Python 和 FFmpeg 是嵌入式运行时,通过 csproj CopyToOutputDirectory 打包 |
| 106 | +- MaiChartManager.CLI 共享主项目部分代码,但是独立 csproj |
| 107 | +- CI 构建分两步:Linux 上 pnpm build 前端 → self-hosted Windows 上 dotnet publish + makeappx |
| 108 | +- Canary 发布使用 Crack 配置,产物上传到 Alist 而非 GitHub Release |
| 109 | +- 前端 `genClient.ts` 从两个 OpenAPI 源生成:本地后端 swagger + 远端 AquaMai 版本配置 |
0 commit comments