droovo/droovo-mobile-public

GitHub: droovo/droovo-mobile-public

Droovo 拼车应用的公开业务逻辑仓库,提供定价、座位分配、行程搜索等核心辅助类及测试,供社区贡献和修复已知缺陷。

Stars: 1 | Forks: 0

# Droovo 移动应用(公开版) [![Flutter CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/0c/0c46c6015aa4b70d4b6448702c25d1b43ffd617cf9da891defa56f1d0689949a.svg)](https://github.com/droovo/droovo-mobile-public/actions/workflows/flutter-ci.yml) 欢迎使用 **公开的 Droovo Flutter 应用仓库**!此仓库仅包含该 Flutter 应用的一个子集:外部贡献者可以参与开发和改进的辅助类及可测试代码。 📊 **[实时项目仪表板](https://public.droovo.tn/)** — 一目了然地查看分支、近期活动、Pull Request、CI 构建和下载。 🌐 [droovo.tn](https://droovo.tn/) • 📱 [在 Google Play 上获取](https://play.google.com/store/apps/details?id=tn.droovo.droovo_app) • ✉️ [联系我们](https://droovo.tn/contact) ## 目录 * [项目概述](#project-overview) * [仪表板](#dashboard) * [快速入门](#getting-started) * [贡献指南](#contributing) * [CI/CD 与测试](#cicd--testing) * [下载](#downloads) * [更新工作流](#workflow-for-updates) * [报告问题](#reporting-issues) * [许可证](#license) ## 项目概述 这是一个真实且可运行的 Flutter 项目 —— 它没有产品界面,仅包含纯粹的业务逻辑辅助类及其测试。它包含: * `lib/helpers/`:从私有应用中移植过来的纯逻辑辅助类。它们都不涉及 Firebase、HTTP 或平台插件,因此只要能在运行 `flutter test` 的地方,它们就能运行: | Helper | 功能说明 | | --- | --- | | `auth_validation_helper.dart` | 密码强度/反馈、邮箱验证、邮箱掩码 | | `car_helper.dart` | 车辆格式化/状态、座位设置检查、预订编辑时的座位重新锁定 | | `chat_helper.dart` | 消息截断、最新消息查找、群组差异对比、群组命名 | | `distance_helper.dart` | Haversine 距离、位置文本辅助方法 | | `pricing_calculator.dart` | 行程价格计算(距离 × 费率 × AC 倍数) | | `ride_filter_helper.dart` | 行程列表的列表过滤、排序、分组和去重 | | `ride_form_validation_helper.dart` | 行程创建表单字段验证 | | `ride_search_helper.dart` | 行程搜索/匹配算法:带回退层级的扩展半径搜索 | | `ride_validation_helper.dart` | 预订不变量、行程状态颜色标签、一致性报告 | | `seat_helper.dart` | 座位布局生成和预订的座位分配 | | `time_helper.dart` | 行程倒计时/相对时间和日期格式化,带有可注入的时钟 | | `feedback_helper.dart` | 从列表中挑选最佳(评分最高、最新)的反馈 | | `location_name_helper.dart` | 清理反向地理编码的地名以便显示 | | `request_helper.dart` | 座位请求状态标签和列表过滤 | | `settings_helper.dart` | 带有安全回退机制的存储语言键解析 | * `lib/models/`:纯 Dart 数据类(`Ride`, `Car`, `Seat`, `User`, `Message`, `Feedback`, `RequestOrder`, `Language`...),它们映射了私有应用实体的结构,但没有任何 Firestore/Hive 的连接代码。 * `lib/main_public.dart`:一个无界面的演示入口点,仅用于证明这些辅助类可以作为真实的 Flutter 应用运行 —— 请参阅[快速入门](#getting-started)。 * `test/`:每个辅助类对应一个测试文件,以及 `test/fixtures/sample_data.json` —— 包含虚构的行程、车辆、用户和聊天消息,所有测试都会使用这些数据;还有 `test/helpers/test_data.dart`,它负责将数据加载到上述强类型模型中。 完整的应用,包括敏感的业务逻辑、支付和后端集成,都在私有的 GitLab 仓库中。 ### 适合新手的贡献 有少数测试被刻意命名,以标记移植逻辑中真实存在且尚未解决的缺陷 —— 在测试套件中搜索 `BUG DETECTOR` 和 `BUG-COMPATIBLE` 即可找到它们(目前位于 `ride_search_helper_test.dart`、`seat_helper_test.dart` 和 `location_name_helper_test.dart` 中)。每一个都记录了从私有应用中原样移植过来的真实怪癖(例如:搜索结果去重的遗漏、在部分失败时无法回滚的座位分配函数、位置名称清理中无法到达的回退分支),而不是生造的例子。选择其中一个,理解它发生的原因,并提出修复方案(附带证明修复有效的测试),是最有价值的贡献方式之一 —— 此处确认的修复正是 Droovo 团队会移植回私有应用的内容。 ## 仪表板 **[public.droovo.tn](https://public.droovo.tn/)** 是一个实时、只读的项目仪表板 —— 一个纯静态站点(`dashboard/`),它直接从 GitHub API 读取公开数据并显示: * **活动** —— `main` 分支上的近期提交,让你能看到改动了什么以及是谁改动的。 * **Pull Request** —— 贡献者打开和近期更新的 PR。 * **分支** —— 每个分支及其最新提交。 * **构建** —— 近期 CI 运行及其通过/失败状态,并链接到 GitHub 上的每次运行(下载该运行的 artifact 仍需要登录 GitHub —— 这是 GitHub 自身的策略,本仪表板无法绕过)。 * **下载** —— 带有 APK/AAB/Web 构建附件的标签发布,可直接下载且**无需登录 GitHub**。 它托管在 Firebase Hosting 上,并通过 [`.github/workflows/firebase-hosting-merge.yml`](.github/workflows/firebase-hosting-merge.yml) 在每次推送到 `main` 分支时自动重新部署;Pull Request 也会通过 [`firebase-hosting-pull-request.yml`](.github/workflows/firebase-hosting-pull-request.yml) 获得各自的实时预览 URL(作为 PR 评论发布)。它不提供任何后端,也不 存储自身的数据 —— 显示的所有内容都是在 访客浏览器中从 `api.github.com` 实时获取的。 ## 快速入门 ### 前置条件 * [Flutter](https://flutter.dev/docs/get-started/install) ≥ 3.x * Android Studio / Xcode(用于设备构建) * Git ### 克隆仓库 ``` git clone https://github.com/droovo/droovo-mobile-public.git cd droovo-mobile-public ``` ### 安装依赖 ``` flutter pub get ``` ### 运行可测试应用 ``` flutter run -t lib/main_public.dart ``` 这将会使用公开的辅助代码启动应用,让你能够安全地测试更改。 ## CI/CD 与测试 每次推送和 Pull Request 都会在 GitHub Actions 上运行 [`.github/workflows/flutter-ci.yml`](.github/workflows/flutter-ci.yml): 1. **验证** —— `dart format --set-exit-if-changed .` 和 `flutter analyze`。 2. **测试** —— `flutter test`(`test/` 下的完整测试套件)。 3. **构建** —— 发布 **APK**、**AAB** (Android App Bundle) 和 **Web** 构建,并作为可下载的 artifact 上传到工作流运行的 *Summary* 页面(保留 30 天)。 由于这是一个社区演示应用,而非 Play Store 发布版本,因此 Android 发布版使用 Flutter 默认的 debug keystore 进行签名(参见 `android/app/build.gradle.kts`)—— 构建它们不需要任何签名密钥。 推送类似 `v1.0.0` 的标签会运行相同的流水线,并额外发布一个附带 APK/AAB/Web zip 文件的 **GitHub Release** —— 请参阅[下载](#downloads)。 ## 下载 有两种方法可以在不自行编译的情况下获取构建版本: * **最新的标签发布**(推荐,永久链接,无需登录 GitHub):请查看 [Releases 页面](../../releases) 获取最新的 `app-release.apk`、`app-release.aab` 和 `droovo-public-helpers-web.zip`。 * **任何特定的提交/PR 构建**:在 [Actions 选项卡](../../actions/workflows/flutter-ci.yml)下打开相应的运行记录,滚动到 *Artifacts*,并下载为该推送生成的 APK/AAB/Web zip(需要登录 GitHub;artifact 将在 30 天后过期)。 这些构建仅包含来自 `lib/main_public.dart` 的无界面演示应用 —— 这里没有可安装的产品 UI,它们的主要存在意义是为了证明流水线(以及辅助类)确实可以构建和运行。 ## 更新工作流 1. 贡献者向公开仓库提交 PR。 2. 经过审查和测试后,已获批准的辅助类更改会被手动合并到私有的 GitLab 仓库中。 3. `main_public.dart` 仅用于测试目的,**不会**被合并到私有仓库中。 此工作流确保贡献者能够在不暴露完整应用的情况下,安全地改进共享代码。 ## 报告问题 * 如果你在此仓库的辅助逻辑中发现 bug 或有改进建议,请提交 issue。 * 尽可能提供详细的描述、重现步骤和截图。 * 对于关于线上应用本身(账户/账单/行程问题)的任何事宜,请改用 [droovo.tn/contact](https://droovo.tn/contact) —— 此仓库的维护者无法通过 GitHub issue 处理这些问题。 ## 许可证 本项目由 **Droovo** 维护。贡献行为受 [LICENSE](LICENSE) 文件中条款的约束。 感谢你帮助让 Droovo 变得更好! 🚀
标签:Flutter, 业务逻辑, 出行服务, 单元测试, 拼车应用, 移动开发