如何参与 SeatFlow 项目开发 — PR 流程、代码审查、文档联动
本页目录
全部文档
贡献指南
感谢你对 SeatFlow 项目的关注!本文档介绍如何参与项目开发。
行为准则
本项目采用 Contributor Covenant 行为准则。请在所有项目互动中保持尊重和建设性。
如何贡献
报告 Bug
- 在 GitHub Issues 搜索是否已有相同问题
- 使用 Bug 报告模板创建新 Issue
- 包含以下信息:
- 操作系统和版本
- SeatFlow 版本(在「关于」页面查看)
- 复现步骤
- 预期行为和实际行为
- 相关截图(如有)
功能建议
- 在 Issues 中搜索是否已有类似建议
- 使用功能建议模板
- 描述使用场景和期望效果
代码贡献
- Fork 本仓库
- 从
develop分支创建功能分支 - 编写代码和测试
- 提交 Pull Request 到
develop分支
开发环境
前置要求
- .NET 10 SDK(下载)
- WASM 工作负载(
dotnet workload install wasm-tools,构建浏览器版所需) - Git
- 推荐 IDE:Rider、Visual Studio 2022+、VS Code + C# 扩展
克隆和构建
git clone https://github.com/Helio-RC/Seatflow.git
cd Seatflow
dotnet build
构建浏览器壳前需安装 WASM 工作负载:
dotnet workload install wasm-tools
dotnet build src/SeatFlow.Browser
运行测试
# 运行所有测试
dotnet test
# 运行特定测试
dotnet test --filter "FullyQualifiedName~TestName"
详细开发环境搭建请参考 开发环境搭建。
分支策略
| 分支 | 用途 |
|---|---|
main |
稳定发布版本 |
develop |
日常开发,PR 目标分支 |
功能分支命名建议:feature/xxx、fix/xxx、docs/xxx、refactor/xxx。
编码规范
SeatFlow 遵循以下编码规范(详见 编码规范):
- C# 命名遵循 .NET 惯例
- ViewModel 继承
ViewModelBase;MVVM 双范式共存(CommunityToolkit.Mvvm 8.4.2 存量 + ReactiveUI.Avalonia 12.1.5 新代码优先,决策见主仓库docs/adr/ADR-014-reactiveui-and-canvas-architecture.md) - Axaml 根元素必须
x:DataType,全量编译绑定(ReflectionBinding实际使用为 0) - 颜色/间距/圆角/字阶只用
Resources/Tokens/令牌,不硬编码 hex - 对话框与日志构造函数注入,禁止静态可变状态;构造器禁止 fire-and-forget 加载(实现
IPageLifecycle) - 日志使用
ILogger<T>构造函数注入 - 异步方法以
Async结尾
类型:feat、fix、docs、refactor、test、chore、style、perf。
Pull Request 流程
提交前检查清单
- 代码通过
dotnet build无错误 - 所有测试通过
dotnet test(当前全量 448 用例) - UI 改动后本地跑过
tests/SeatFlow.Presentation.Tests(该项目的 Headless 用例目前不在 CI 中) - 新功能有对应的测试
- 公共 API 变更有 XML 文档注释
- 相关文档已更新(见下方「文档联动规则」)
PR 描述模板
## 变更说明
简要描述做了什么
## 变更类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 重构
- [ ] 文档
- [ ] 其他
## 测试
- [ ] 新增测试覆盖
- [ ] 已有测试全部通过
## 关联 Issue
Closes #xxx
代码审查
所有 PR 需要至少一位维护者审查。审查关注五个维度:
| 维度 | 关注点 |
|---|---|
| 正确性 | 逻辑是否正确,边界条件是否处理 |
| 可读性 | 命名是否清晰,结构是否易懂 |
| 架构 | 是否遵循分层架构,依赖方向是否正确 |
| 安全性 | 输入验证、文件路径安全 |
| 性能 | 无明显性能问题 |
文档联动规则
重要:修改代码时需同步更新相关文档。文档地图与联动规则详见
docs/INDEX.md。
必须更新的文档
| 代码变更 | 需同步更新的文档 |
|---|---|
| 新增/修改策略 | AGENTS.md 策略表 + ADR(如有架构变更) |
| 新增/修改 ViewModel | AGENTS.md 对应章节 |
| 新增 i18n 资源键 | 用 python3 scripts/i18n.py add(自动同步三文件 + Designer.cs) |
| 文件格式版本号变更 | file_versions.json + Model 类 + 迁移步骤(可选 scripts/version.py bump-file) |
| 公共 API 变更 | XML 文档注释 |
| 新增页面 | AGENTS.md「新增页面」约定 + docs/INDEX.md |
| 架构/UI 重大变更 | docs/adr/ 新增 ADR,并在 docs/UI_REFACTOR.md / docs/INDEX.md 登记 |
| 修改 CLI 命令 | scripts/ToolsCollection.md |
AI 指南唯一来源
根 AGENTS.md 是 AI 编码指南的唯一来源(根 CLAUDE.md 仅为指向它的指针),修改指南只改 AGENTS.md;不要再维护 docs/CLAUDE.md 副本。
测试指南
测试框架
- xUnit v3(
tests/下 4 个项目,共 448 用例) - FluentAssertions(断言)
- NSubstitute(模拟)
- Avalonia.Headless.XUnit + Avalonia.Skia(Presentation.Tests 的 Headless UI 与视觉基线)
测试项目
| 项目 | 用例数 | 测试范围 |
|---|---|---|
tests/SeatFlow.Core.Tests |
195 | 领域实体、策略、领域服务 |
tests/SeatFlow.Application.Tests |
61 | 应用服务、管道、命令 |
tests/SeatFlow.Infrastructure.Tests |
125 | 数据访问、迁移、导出 |
tests/SeatFlow.Presentation.Tests |
67 | Headless UI、页面生命周期、视觉基线 |
运行测试
dotnet test # 全部 4 个项目(448 用例)
dotnet test --filter "FullyQualifiedName~Strategy" # 策略相关
dotnet test tests/SeatFlow.Core.Tests # 单个项目
cd scripts && python3 -m pytest tests/ -v # 脚本测试
详见 测试指南。
添加新功能
添加新页面
当前为 7 页 IA(排座工作台为默认入口;原 Home、FreeformManagement 页已移除):
- 在
Services/INavigationService.cs的PageKey枚举中添加新值 - 创建
ViewModels/NewPageViewModel.cs(继承ViewModelBase,构造注入IDialogService/logger;如需页面加载则实现IPageLifecycle) - 创建
Views/NewPageView.axaml+.axaml.cs(根元素设x:DataType,ViewLocator按命名约定解析) - 在桌面与浏览器启动壳的
Program.cs中注册 ViewModel:services.AddSingleton<NewPageViewModel>() - 在
Views/MainView.axaml侧边栏添加导航按钮(桌面MainWindow复用同一外壳) - 在
Data/page_navigation.json中添加页面启/禁用状态(禁用时按Opacity+ToolTip.Tip约定处理) - 用脚本添加资源键:
python3 scripts/i18n.py add Nav_NewPage --zh "..." --en "..." - 若页面需要引导演示数据,实现
IGuideSeedTarget并在AddGuideSeedTargets()中注册
添加新策略
- 实现
ISeatingStrategy(独立)或IDependentSeatingStrategy(依赖) - 创建 Manifest JSON 文件:
SeatFlow.Core/Strategies/Manifests/{StrategyId}.json - 在
ServiceCollectionExtensions中注册 - 添加测试
新策略以内置方式加入代码库。如需提议尚未支持的新策略,可通过 .github/ISSUE_TEMPLATE/new-strategy.md 模板提交建议。
详见 策略管道深度解析。
添加文件版本迁移
- 创建
Migrator类(实现IFileMigrator) - 注册到 DI
- 更新
file_versions.json - 更新 Model 默认 Version
- 添加迁移测试
详见 版本与迁移系统。
国际化
添加新语言时:
- 创建
Lang/Resources.xx-XX.resx并翻译全部键 - 运行
python3 scripts/i18n.py check校验一致性 - 在
AppSettings.Language可选值中加入对应语言代码(设置页选项) - 浏览器端语言切换依赖卫星资源预加载(
UseSystemResourceKeys=false+main.js的loadAllSatelliteResources: true),详见 国际化系统
新增资源键时使用 scripts/i18n.py(自动同步 .resx 三文件与 Designer.cs):
python3 scripts/i18n.py add KeyName --zh "中文" --en "English"
python3 scripts/i18n.py check
详见 国际化系统。
发布流程
- 确保所有测试通过(
dotnet test448 用例 + 脚本测试),CHANGELOG.md与根目录RELEASE.md已更新 - 运行
python3 scripts/version.py bump-app patch --force更新版本号(唯一来源version.json,勿手改commitId/buildDate) - 将
version.json变更推送/合并到main(只有该文件变更会触发发布) - CI 自动执行:
release.yml多平台 + vpk 打包(稳定版从 OSS 同步打包历史并缓存,保证 delta 链完整)→publish.yml创建 GitHub Release / OSS 分发 →publish-web.yml发布在线版(仅正式版) - 发布说明来自
RELEASE.md(publish.yml会校验其存在并附加 SHA256 校验表);手动触发发布(workflow_dispatch)始终按 pre-release 处理且不上传 OSS
本地需要一键编排(构建 + 打包 + OSS/GitHub Release)时可用:
python3 scripts/release/release.py --dry-run
python3 scripts/release/release.py
本地
dotnet r build/test等任务仅限开发使用,禁止进入 CI/CD。详见 构建与发布 与 CI/CD 工作流。