Похожие презентации:
Quiz App
1.
Quiz AppВыполнил: Захаров А. А.
2.
Введение проектаМобильное приложение для интерактивных викторин, реализованное на Kotlin. Цель — надежный, отзывчивый клиент с
системой аутентификации, аналитикой результатов и административной панелью для управления контентом.
Технологии: Kotlin, Jetpack Compose, ViewModel, Navigation, Room, Coroutines / Flow
Ключевые функции: регистрация/авторизация, игровой процесс, статистика, админ-панель
Нефункциональные требования: быстрый отклик, устойчивость к поворотам экрана, реактивный UI
3.
Архитектура — MVVM + чистая архитектураPresentation
Domain
Jetpack Compose UI + ViewModel; StateFlow для
Интерфейсы репозиториев и бизнес-логика.
состояния; NavGraph для навигации между composable.
Независимость от реализации данных для
тестируемости.
Data
DI & Навигация
Room + DAO, реализации репозиториев, TypeConverters
Ручная инъекция зависимостей через Factory/Provider;
(List ↔ JSON), Coroutines + Flow для реактивных
NavGraph с composable destinations и аргументами для
потоков.
передачи state.
4.
Основные экраны и навигацияНавигация реализована через NavHost с пятью основными точками входа:
1
AuthScreen
Регистрация и вход; валидация; переход к MenuScreen после успешного логина.
2
MenuScreen
Выбор категории, переход в GameScreen или AdminScreen (по правам).
3
GameScreen
Показ вопросов, таймер, подсказки, подсчет очков, переход к Results.
4
AdminScreen
CRUD для вопросов и категорий, управление пользователями, очистка БД.
5
Results
Индивидуальная статистика, таблица лидеров, экспорт результатов.
5.
Модели данных — Room EntitiesUser
Question
id: Long; username: String; passwordHash: String; isAdmin:
id: Long; text: String; options: List<String>; correctAnswerIndex:
Boolean; дата регистрации.
Int; category: String; createdBy: userId.
GameResult
LeaderboardEntry (Projection)
id: Long; userId: Long; score: Int; date: Long; category: String;
ViewModel-объект с JOIN: username, totalScore, bestScore,
durationSec: Int.
gamesPlayed. TypeConverters для List<String> → JSON.
6.
Аутентификация и безопасностьРегистрация
Авторизация
Валидация: пароль ≥4 символов, подтверждение
Username + хешированный пароль (SHA-256).
пароля; минимальные проверки на уникальность
Хранение хеша в Room; сравнение при входе.
username.
Роли и права
Побочные меры
Первый пользователь → admin. Разделение ролей: UI и
Выход из системы: удаление токенов/сессионных
операции CRUD зависят от isAdmin.
данных; для админа — возможность очистки БД.
7.
Игровой процесс (GameScreen)Состояние в GameViewModel
Пользователь выбирает категорию → набор случайных
вопросов. Каждый вопрос: 4 варианта (A–D). Таймер 20 с с
questions: List<Question>
прогресс-индикатором и цветовой градацией
currentQuestionIndex, score
(зелёный→оранжевый→красный). Подсказка 50/50 убирает
timeRemaining, selectedAnswerIndex
два неверных варианта, доступна один раз за игру.
isAnswerRevealed, eliminatedOptions, fiftyFiftyUsed,
isGameOver
Баллы: +10 за правильный ответ
Немедленная обратная связь: цветовая индикация
(правильно/неправильно)
Статистика в UI: номер вопроса, счёт, прогресс-бар
8.
Админ-панель (AdminScreen)Управление вопросами
Управление категориями
Таблица всех вопросов с возможностью фильтрации
Создание/удаление категорий; контроль видимости в
по категории; CRUD: добавление, редактирование,
MenuScreen.
удаление.
Управление пользователями
Админ-операции
Просмотр списка пользователей,
Очистка всей БД (с подтверждением),
повышение/понижение прав (admin flag), блокировка
импорт/экспорт вопросов для массовых изменений.
при необходимости.
9.
Работа с данными — Repository & DAOАбстракция репозиториев
DAO и методы
Специальные методы
Единый интерфейс: UserRepository,
@Query, @Insert, @Update, @Delete;
QuestionRepository,
Flow<List<T>> для реактивного
возвращает случайный набор
GameResultRepository — упрощает
обновления UI; сложные JOIN-запросы
вопросов
тестирование и замену источников
для таблицы лидеров.
данных.
getRandomQuestions(limit):
getLeaderboardWithUsernames():
JOIN для отображения username +
totalScore
getTotalScoreByUser(userId):
агрегатный запрос
importQuestions / exportQuestions:
массовые операции с транзакциями
10.
Управление состоянием — ViewModel2
StateFlow
AuthViewModel
Все ViewModel публикуют UI state через StateFlow
Поля: isLoading, error, isLoggedIn, currentUser; методы:
(immutable state + single events через
login(), register(), logout().
SharedFlow/Channel).
4
GameViewModel
Побочные эффекты и сохранение
Поля: questions, currentQuestionIndex, score,
LaunchedEffect / coroutineScope для таймера и
timeRemaining, selectedAnswerIndex, isAnswerRevealed,
эффектов; ViewModel обеспечивает восстановление
eliminatedOptions, fiftyFiftyUsed, isGameOver; логика
состояния при конфигурационных изменениях.
таймера и подсказок.
Маркетинг