Загрузка…
Загрузка…
Мобильное приложение Колледжа ДГУ для iOS и Android: расписание, оценки, пропуски, новости и сервисы для студентов.
Моя роль · Flutter iOS/Android: разработка клиента, интеграция API, публикация и сопровождение; поэтапная модернизация модулей (Repository + Cubit) и автотесты.
iOS · Android
Продуктовая задача: студентам, родителям и сотрудникам нужен удобный мобильный доступ к расписанию, оценкам, пропускам, новостям и сервисам колледжа без лишних звонков и поиска на сайте. Инженерная задача: в уже работающем Flutter-приложении часть крупных экранов одновременно управляла состоянием UI, запросами к API, кэшем и обработкой данных. Это усложняло безопасное развитие функций и автоматизированное тестирование. Приложение не было «сломанным» — его нужно было развивать без ломки UX и контрактов API.
Разработал мобильный клиент на Flutter для iOS и Android, подключил REST API колледжа и данные 1С, реализовал пользовательские сценарии (расписание, оценки, пропуски, новости, профиль и сервисы) и довёл приложение до публикации в магазинах. Параллельно поэтапно модернизировал выбранные модули: вынес работу с данными из UI в Repository и Cubit с constructor dependency injection через AppContainer, сохранил существующий UX и API contracts, добавил characterization / unit / Cubit / widget тесты и GitHub Actions (flutter analyze + flutter test).
Для модернизированных модулей (Schedule, Grades journal/session, News, Absences) данные и состояние вынесены из Page: Page → Cubit / State → Repository → API / JsonCache AppContainer — composition root с constructor injection (не get_it). Весь проект на Clean Architecture не переводился. Разделение ответственности: • Page — отображение и действия пользователя • Cubit — состояние, загрузка, координация • Repository — API и кэш • Domain — чистые функции обработки данных Absences собирает пропуски из двух источников: AbsencesPage → AbsencesCubit ├→ AbsencesRepository → Profile1cApi └→ GradesRepository → GradesApi + JsonCache AbsencesPage больше не пишет ключ grades:my напрямую: journal refresh идёт через GradesRepository (full bundle). LearningRoute, Events, Profile core, Messenger и другие экраны частично или полностью остаются на прежнем подходе и модернизируются постепенно.
Flutter · Dart · Cubit / flutter_bloc · Repository pattern · Dio · REST API · Firebase Cloud Messaging · WebSocket · GitHub Actions
Типы проверок: characterization (парсеры, cache contracts, domain helpers), repository unit (hand fakes), Cubit, widget (injection seam без Firebase / полного AppContainer.init). Подтверждённые наборы по модернизированным модулям (docs/engineering_progress.md, HEAD 45b145a): • Schedule — 26 тестов • Grades (журнал/сессия) — 95 тестов • News — 71 тест • Absences — 90 тестов (44 domain + 9 repository + 18 Cubit + 19 widget); плюс 10 shared merge-тестов Grades domain, не входящих в 90 337 — общее количество тестов Flutter-проекта (flutter test) на момент финальной проверки HEAD 45b145a. Это suite всего приложения, а не сумма тестов только четырёх модулей и не 100% coverage. CI: GitHub Actions — flutter analyze + flutter test (Flutter 3.44.8). Локально: flutter build apk --debug. Репозиторий приватный — публичная ссылка на Actions run не публикуется; доказательство CI — скриншот успешного прогона без секретов (если загружен).
Продукт: официальное мобильное приложение колледжа ДГУ опубликовано в подтверждённых магазинах (App Store, RuStore) и продолжает развиваться (lifecycle «Развивается»). Инженерия (Stage 5 Absences, measurable before→after): • AbsencesPage 1270 → 849 LOC • setState в Page 12 → 0 • прямые API/cache обращения из Page → 0 • Absences-specific tests 0 → 90 • project tests на старте Stage 5: 247 → после Stage 5: 337 Модернизированы выбранные модули при сохранении UX и API contracts. Не заявляется полное покрытие тестами всего приложения и не утверждается, что LOC всего репозитория «сократился на 421».
Колледж ДГУ — официальное мобильное приложение для студентов, абитуриентов, родителей и сотрудников. Клиент на Flutter (iOS и Android) работает с порталом college.…
Развивается
Нажмите на скриншот, чтобы открыть · листайте влево и вправо