298 lines
26 KiB
Plaintext
298 lines
26 KiB
Plaintext
<?xml version="1.0" encoding="UTF-8"?>
|
||
<PROJECT_SPECIFICATION>
|
||
<PROJECT_INFO>
|
||
<name>Homebox Lens</name>
|
||
<description>Android-клиент для системы управления инвентарем Homebox. Позволяет пользователям управлять своим инвентарем, взаимодействуя с экземпляром сервера Homebox.</description>
|
||
</PROJECT_INFO>
|
||
|
||
<TECHNICAL_DECISIONS>
|
||
<DECISION id="tech_logging">
|
||
<summary>Библиотека логирования</summary>
|
||
<description>В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_i18n" status="defined">
|
||
<summary>Интернационализация (Мультиязычность)</summary>
|
||
<description>
|
||
Приложение должно поддерживать несколько языков для обеспечения доступности для глобальной аудитории.
|
||
Реализация будет основана на стандартном механизме ресурсов Android.
|
||
- Все строки, видимые пользователю, должны быть вынесены в файл `app/src/main/res/values/strings.xml`. Использование жестко закодированных строк в коде запрещено.
|
||
- Язык по умолчанию - русский (ru). Файл `strings.xml` будет содержать русские строки.
|
||
- Для поддержки других языков (например, английского - en) будут создаваться соответствующие каталоги ресурсов (например, `app/src/main/res/values-en/strings.xml`).
|
||
- В коде для доступа к строкам необходимо использовать ссылки на ресурсы (например, `R.string.app_name`).
|
||
</description>
|
||
</DECISION>
|
||
<DECISION id="tech_ui_framework" status="defined">
|
||
<summary>UI Framework</summary>
|
||
<description>Пользовательский интерфейс приложения построен с использованием Jetpack Compose, современного декларативного UI-фреймворка от Google. Это обеспечивает быстрое создание, гибкость и поддержку динамических данных.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_di" status="defined">
|
||
<summary>Внедрение зависимостей (Dependency Injection)</summary>
|
||
<description>Для управления зависимостями в проекте используется Hilt. Он интегрирован с компонентами Jetpack и упрощает внедрение зависимостей в Android-приложениях.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_navigation" status="defined">
|
||
<summary>Навигация</summary>
|
||
<description>Навигация между экранами (Composable-функциями) реализована с помощью библиотеки Navigation Compose, которая является частью Jetpack Navigation.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_async" status="defined">
|
||
<summary>Асинхронные операции</summary>
|
||
<description>Все асинхронные операции, такие как сетевые запросы или доступ к базе данных, выполняются с использованием Kotlin Coroutines. Это обеспечивает эффективное управление фоновыми задачами без блокировки основного потока.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_networking" status="defined">
|
||
<summary>Сетевое взаимодействие</summary>
|
||
<description>Для взаимодействия с API сервера Homebox используется стек технологий: Retrofit для создания типобезопасных HTTP-клиентов, OkHttp в качестве HTTP-клиента и Moshi для парсинга JSON.</description>
|
||
</DECISION>
|
||
<DECISION id="tech_database" status="defined">
|
||
<summary>Локальное хранилище</summary>
|
||
<description>Для кэширования данных на устройстве используется библиотека Room. Она предоставляет абстракцию над SQLite и обеспечивает надежное локальное хранение данных.</description>
|
||
</DECISION>
|
||
</TECHNICAL_DECISIONS>
|
||
|
||
<FEATURES>
|
||
<FEATURE id="feat_dashboard" status="бэкенд_реализован">
|
||
<summary>Экран панели управления</summary>
|
||
<description>Отображает сводку по инвентарю, включая статистику, такую как общее количество товаров, общая стоимость и количество по местоположениям/меткам.</description>
|
||
<UI_COMPONENT ref_id="screen_dashboard" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_get_stats" status="реализовано">
|
||
<summary>Получение и отображение статистики</summary>
|
||
<description>Получает общую статистику по инвентарю с сервера.</description>
|
||
<implementation_ref id="uc_get_stats" />
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_inventory_list" status="бэкенд_реализован">
|
||
<summary>Экран списка инвентаря</summary>
|
||
<description>Отображает список всех инвентарных позиций с возможностью поиска и фильтрации.</description>
|
||
<UI_COMPONENT ref_id="screen_inventory_list" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_search_items" status="реализовано">
|
||
<summary>Поиск и фильтрация товаров</summary>
|
||
<description>Ищет товары по строке запроса и фильтрам. Результаты разбиты на страницы.</description>
|
||
<implementation_ref id="uc_search_items" />
|
||
</FUNCTION>
|
||
<FUNCTION id="func_sync_inventory" status="реализовано">
|
||
<summary>Синхронизация инвентаря</summary>
|
||
<description>Выполняет полную синхронизацию локального кэша инвентаря с сервером.</description>
|
||
<implementation_ref id="uc_sync_inventory" />
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_item_details" status="бэкенд_реализован">
|
||
<summary>Экран сведений о товаре</summary>
|
||
<description>Показывает все сведения о конкретном инвентарном товаре, включая его название, описание, изображения, вложения и настраиваемые поля.</description>
|
||
<UI_COMPONENT ref_id="screen_item_details" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_get_item_details" status="реализовано">
|
||
<summary>Получение сведений о товаре</summary>
|
||
<description>Получает полные сведения о конкретном товаре из репозитория.</description>
|
||
<implementation_ref id="uc_get_item_details" />
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_item_management" status="бэкенд_реализован">
|
||
<summary>Создание/редактирование/удаление товаров</summary>
|
||
<description>Позволяет пользователям создавать новые товары, обновлять существующие и удалять их.</description>
|
||
<UI_COMPONENT ref_id="screen_item_edit" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_create_item" status="реализовано">
|
||
<summary>Создать товар</summary>
|
||
<description>Создает новый инвентарный товар на сервере.</description>
|
||
<implementation_ref id="uc_create_item" />
|
||
</FUNCTION>
|
||
<FUNCTION id="func_update_item" status="реализовано">
|
||
<summary>Обновить товар</summary>
|
||
<description>Обновляет существующий инвентарный товар на сервере.</description>
|
||
<implementation_ref id="uc_update_item" />
|
||
</FUNCTION>
|
||
<FUNCTION id="func_delete_item" status="реализовано">
|
||
<summary>Удалить товар</summary>
|
||
<description>Удаляет инвентарный товар с сервера.</description>
|
||
<implementation_ref id="uc_delete_item" />
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_labels_locations" status="бэкенд_реализован">
|
||
<summary>Управление метками и местоположениями</summary>
|
||
<description>Позволяет пользователям просматривать списки всех доступных меток и местоположений.</description>
|
||
<UI_COMPONENT ref_id="screen_labels_list" />
|
||
<UI_COMPONENT ref_id="screen_locations_list" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_get_all_labels" status="реализовано">
|
||
<summary>Получить все метки</summary>
|
||
<description>Получает список всех меток из репозитория.</description>
|
||
<implementation_ref id="uc_get_all_labels" />
|
||
</FUNCTION>
|
||
<FUNCTION id="func_get_all_locations" status="реализовано">
|
||
<summary>Получить все местоположения</summary>
|
||
<description>Получает список всех местоположений из репозитория.</description>
|
||
<implementation_ref id="uc_get_all_locations" />
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
|
||
<FEATURE id="feat_search" status="бэкенд_реализован">
|
||
<summary>Экран поиска</summary>
|
||
<description>Предоставляет специальный пользовательский интерфейс для поиска товаров.</description>
|
||
<UI_COMPONENT ref_id="screen_search" />
|
||
<FUNCTIONALITY>
|
||
<FUNCTION id="func_search_items_dedicated" status="реализовано">
|
||
<summary>Поиск со специального экрана</summary>
|
||
<description>Использует ту же функцию поиска, но со специального экрана.</description>
|
||
<implementation_ref id="uc_search_items" />
|
||
</FUNCTION>
|
||
</FUNCTIONALITY>
|
||
</FEATURE>
|
||
</FEATURES>
|
||
|
||
<UI_SPECIFICATIONS>
|
||
<SCREEN id="screen_dashboard" status="defined">
|
||
<summary>Главный экран "Панель управления"</summary>
|
||
<description>
|
||
Экран предоставляет обзорную информацию и быстрый доступ к основным функциям. Компоновка должна быть чистой и интуитивно понятной, аналогично веб-интерфейсу HomeBox.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Верхняя панель приложения. Содержит иконку навигационного меню (гамбургер), название/логотип приложения и иконку для запуска сканера (например, QR-кода).</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="NavigationDrawer">
|
||
<description>Боковое навигационное меню. Открывается по нажатию на иконку в TopAppBar. Содержит основные разделы: Главная, Локации, Поиск, Профиль, Инструменты, а также кнопку "Выйти".</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical" scrollable="true">
|
||
<description>Основная область контента. Содержит несколько информационных блоков.</description>
|
||
<SUB_COMPONENT type="Section" title="Быстрая статистика">
|
||
<description>Сетка из 2x2 карточек, отображающих ключевые метрики.</description>
|
||
<ELEMENT type="Card" name="Общая стоимость" />
|
||
<ELEMENT type="Card" name="Всего вещей" />
|
||
<ELEMENT type="Card" name="Общее количество местоположений" />
|
||
<ELEMENT type="Card" name="Всего меток" />
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Section" title="Недавно добавлено">
|
||
<description>Горизонтально прокручиваемый список карточек недавно добавленных предметов. Если предметов нет, отображается сообщение "Элементы не найдены".</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Section" title="Места хранения">
|
||
<description>Сетка или гибкий контейнер (FlowRow) с кликабельными чипами, представляющими местоположения. Нажатие на чип ведет к списку предметов в этом местоположении.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="Section" title="Метки">
|
||
<description>Сетка или гибкий контейнер (FlowRow) с кликабельными чипами, представляющими метки. Нажатие на чип ведет к списку предметов с этой меткой.</description>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton_or_PrimaryButton" icon="add">
|
||
<description>
|
||
Вместо плавающей кнопки (FAB), в референсе используется заметная кнопка "Создать" в навигационном меню. Мы будем придерживаться этого подхода для консистентности. Эта кнопка инициирует процесс создания нового предмета.
|
||
</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
</SCREEN>
|
||
|
||
<!-- [ЯКОРЬ] Начало спецификации UI для экрана Локаций. Добавлено на основе референса HomeBox. -->
|
||
<SCREEN id="screen_locations_list" status="defined">
|
||
<summary>Экран "Локации"</summary>
|
||
<description>
|
||
Отображает вертикальный список всех доступных местоположений. Экран должен быть интегрирован в общую структуру навигации приложения (TopAppBar, NavigationDrawer).
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Общая верхняя панель приложения, аналогичная экрану "Панель управления".</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="NavigationDrawer">
|
||
<description>Общее боковое меню навигации.</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical">
|
||
<description>Основная область контента, занимающая все доступное пространство под TopAppBar.</description>
|
||
<SUB_COMPONENT type="Header" title="Локации">
|
||
<description>Заголовок экрана, расположенный вверху основной области контента.</description>
|
||
</SUB_COMPONENT>
|
||
<SUB_COMPONENT type="List" name="LocationsList">
|
||
<description>Вертикальный, прокручиваемый список (LazyColumn) всех местоположений.</description>
|
||
<ELEMENT type="ListItem">
|
||
<description>Элемент списка, представляющий одно местоположение. Состоит из иконки (например, 'place') и названия местоположения. Весь элемент является кликабельным и ведет на экран со списком предметов в данной локации.</description>
|
||
</ELEMENT>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton" icon="add">
|
||
<description>
|
||
Плавающая кнопка действия, расположенная в правом нижнем углу. Позволяет пользователю добавить новое местоположение. В веб-версии для этого используются иконки в углу, но FAB является более нативным паттерном для Android.
|
||
</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие на элемент списка локаций</action>
|
||
<reaction>Осуществляется навигация на экран списка инвентаря, отфильтрованного по выбранной локации.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие на FloatingActionButton</action>
|
||
<reaction>Открывается диалоговое окно или новый экран для создания нового местоположения.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
<!-- [ЯКОРЬ] Конец спецификации UI для экрана Локаций. -->
|
||
|
||
<!-- [ЯКОРЬ] Начало спецификации UI для экрана Меток. -->
|
||
<SCREEN id="screen_labels_list" status="defined">
|
||
<summary>Экран "Метки"</summary>
|
||
<description>
|
||
Отображает вертикальный список всех доступных меток. Экран должен быть интегрирован в общую структуру навигации приложения.
|
||
</description>
|
||
<LAYOUT>
|
||
<COMPONENT type="TopAppBar">
|
||
<description>Общая верхняя панель приложения с заголовком "Метки" и кнопкой "назад".</description>
|
||
</COMPONENT>
|
||
<COMPONENT type="MainContent" orientation="vertical">
|
||
<description>Основная область контента, занимающая все доступное пространство под TopAppBar.</description>
|
||
<SUB_COMPONENT type="List" name="LabelsList">
|
||
<description>Вертикальный, прокручиваемый список (LazyColumn) всех меток.</description>
|
||
<ELEMENT type="ListItem">
|
||
<description>Элемент списка, представляющий одну метку. Состоит из иконки (например, 'label') и названия метки. Весь элемент является кликабельным и ведет на экран со списком предметов с данной меткой.</description>
|
||
</ELEMENT>
|
||
</SUB_COMPONENT>
|
||
</COMPONENT>
|
||
<COMPONENT type="FloatingActionButton" icon="add">
|
||
<description>
|
||
Плавающая кнопка действия, расположенная в правом нижнем углу. Позволяет пользователю добавить новую метку.
|
||
</description>
|
||
</COMPONENT>
|
||
</LAYOUT>
|
||
<USER_INTERACTIONS>
|
||
<INTERACTION>
|
||
<action>Нажатие на элемент списка меток</action>
|
||
<reaction>Осуществляется навигация на экран списка инвентаря, отфильтрованного по выбранной метке.</reaction>
|
||
</INTERACTION>
|
||
<INTERACTION>
|
||
<action>Нажатие на FloatingActionButton</action>
|
||
<reaction>Открывается диалоговое окно или новый экран для создания новой метки.</reaction>
|
||
</INTERACTION>
|
||
</USER_INTERACTIONS>
|
||
</SCREEN>
|
||
<!-- [ЯКОРЬ] Конец спецификации UI для экрана Меток. -->
|
||
|
||
</UI_SPECIFICATIONS>
|
||
|
||
<IMPLEMENTATION_MAP>
|
||
<!-- Use Cases -->
|
||
<USE_CASE id="uc_get_stats" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" />
|
||
<USE_CASE id="uc_search_items" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" />
|
||
<USE_CASE id="uc_sync_inventory" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" />
|
||
<USE_CASE id="uc_get_item_details" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" />
|
||
<USE_CASE id="uc_create_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" />
|
||
<USE_CASE id="uc_update_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" />
|
||
<USE_CASE id="uc_delete_item" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" />
|
||
<USE_CASE id="uc_get_all_labels" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" />
|
||
<USE_CASE id="uc_get_all_locations" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" />
|
||
<USE_CASE id="uc_login" file_ref="domain/src/main/java/com/homebox/lens/domain/usecase/LoginUseCase.kt" />
|
||
|
||
<!-- UI Screens -->
|
||
<UI_SCREEN id="screen_dashboard" file_ref="app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" />
|
||
<UI_SCREEN id="screen_inventory_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" />
|
||
<UI_SCREEN id="screen_item_details" file_ref="app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" />
|
||
<UI_SCREEN id="screen_item_edit" file_ref="app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" />
|
||
<UI_SCREEN id="screen_labels_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" />
|
||
<UI_SCREEN id="screen_locations_list" file_ref="app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" />
|
||
<UI_SCREEN id="screen_search" file_ref="app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" />
|
||
<UI_SCREEN id="screen_setup" file_ref="app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" />
|
||
</IMPLEMENTATION_MAP>
|
||
</PROJECT_SPECIFICATION> |