alor-broker / Astras-Trading-UI

Astras. The Angular's trading terminal from Alor Broker. https://alorbroker.ru/
Apache License 2.0
64 stars 20 forks source link

Astras – торговое веб-приложение с системой виджетов

Frame 93

🔹 Особенности

Динамическая система виджетов

Увеличивайте, уменьшайте, раздвигайте, добавляйте, в общем делайте то, что хотите.

Совместимость со всеми рынках

От ценных бумаг до криптовалюты и индексов.

Интегрированный технический анализ от TradingView

🔸 Architecture

Мы расмотрим общую архитектуру (backend+frontend) и архитектуру самого фронтенда

Whole picture

Для работы терминала необходимо WebSocket-API, а также Http Rest API. Вам необходимо реализовать backend самостоятельно. Спецификация API доступна тут. Для получения часто изменяющихся данных, используется WebSocket API. Через него передаются такие данные как, например, котировки, сделки, заявки, изменения позиций, средние цены, риск-параметры и так далее. Для данных которые не подразумевают частое изменение, таких как: данные об инструменте, данные о клиенте, справка, авторизация и так далее используется Http API. Авторизация реализована через редирект на SSO и обратно и jwt/refresh токены. В случае если у вас реализована другая система авторизации, вам необходимо отредактировать сервис auth.service. Если ваша схема авторизации такая же, то нужно поменять настройку ssoUrl.

Front-end part

Instruments

Терминал использует следующие инструменты.

Start

Чтобы запустить проект, необходимо установить пакеты

pnpm install

Запустить

pnpm start

И пройти по ссылке http://localhost:4200/dashboard

Project structure

Проект разбит на модули. Каждый виджет выделен в отдельный модуль. Функционал, который может быть использован в разных виджетах, находится в модуле Shared. Через него же осуществляется импорт общих зависимостей. Модуль shared импортируется почти во все виджеты.

Внутри каждого модуля есть 4 основных папки.

Так же есть дополнительные

Поподробней расмотрим структуру shared модуля. Если вам необходимо добавить какую-либо angular сущность, то скорее всего это лучше сделать именно в shared модуле. Пример: interceptors, guards, pipes. Если вам нужно добавить какой-либо визуальный компонент, импорт скорее всего лучше сделать из shared модуля, ведь вряд ли этот компонент будет использоваться только в одном единственном модуле.

Отдельно выделен store модуль. Он содержит определения частей (feature) глобального состояния в терминах ngrx. Модуль store уже импортирован в shared. Для каждой части глобального состояния необходимо создавать свою папку, которая содержит файлы с определениями actions, reducers, effects и selectors.

Другим важным модулем является dashboard. Это основной модуль, который клиенты видят. Именно тут они работают с терминалом. Именно тут они торгуют, смотрят графики, добавляют новые виджеты и так далее. В нём мы используем все остальные компоненты и именно на него прописан основной маршрут. Данный модуль адаптирован для работы на desktop и mobile устройствах.

Также проект содержит папку build-specifics с файлами ext-modules.ts и ext-modules.prod.ts. Данные файлы позволяют подключать функционал, наличие которого зависит от текущей конфигурации, используемой при сборке (development или production). Так в ext-modules.ts следует перечислять модули, которые должны быть доступны только в development конфирурации, например, dev tools. А в ext-modules.prod.ts - модули, доступные только в production. Обратите внимание, что содержимое данных файлов заменяется одно на другое, а не мержится.

Routing

На данный момент существует только один основной маршрут /dashboard. В зависимости от типа устройства, на котором запускается приложение, данный маршрут автоматически будет изменен на /dashboard/mobile для загрузки версии, адаптированной для mobile устройств.

Общие компоненты

В shared-модуле находятся общие компоненты, которые используются в разных местах приложения. Рассмотрим основные из них:

Key services

Опишем сервисы, которые считаем ключевыми в приложении. Все они находятся в модуле shared в папке services

Стили

В проекте используется less. Глобальные стили добавляются в styles.less.

В проекте реализованы две цветовые схемы: dark и light. Переменные и стили, специфичные для цветовой схемы, следует добавлять в файлы dark.less и default.less, расположенные в папке /src/styles/themes. При необходимости получить variables цветовой схемы или variables/mixins из библиотеки компонентов ng-zorro, например @primary-color и другие, нужно использовать themeMixin.

Общие стили, используемые разными компонентами, следует оформлять в виде mixins. Mixin должен быть расположен в папке styles/mixins.

Общие вспомогательные стили (utils) или кастомные стили для компонентов ng-zorro следует оформлять в виде отдельных файлов в папках /src/styles/utils и /src/styles/components соответственно. Все такие файлы должны быть импортированы в styles.less.

Environment настройки

Конфигурация бирж

Файл assets/marketSettings.json позволяет настроить список бирж, с которыми работает приложение, а также указать некоторые аспекты, необходимые при отображении информации и формировании запросов к API. В данном файле должно быть отмечено какая из бирж является биржей по умолчанию и какой инструмент должен быть выбран при первом запуске (сбросе настроек) приложения пользователем.

Конфигурация виджетов

Файл assets/widgets-meta.json содержит список всех доступных в приложении виджетов. Для каждого виджета в данном списке указана служебная информация (typeId и definition), которая не должна изменяться, и настройки отображения (widgetName, icons).

При удалении виджета из данного списка он перестанет отображаться в меню виджетов, а также на дашборде (даже если был добавлен ранее).

Чтобы скрыть виджет только в меню виджетов desktop версии, нужно указать значение false для параметра desktopMeta.enabled.

Чтобы скрыть виджет только в mobile версии, нужно указать значение false для параметра mobileMeta.enabled. Отсутсвие секции mobileMeta говорит о том, что виджет для mobile версии не применяется. Аналогично осутствие секции desktopMeta означает, что виджет не применим для desktop.

ВАЖНО: при добавлении нового виджета в приложение он должен быть описан в данном файле.

Конфигурация дашборда по умолчанию

Дашборд по умолчанию отображается:

Набор, расположение и порядок следования (в мобильной версии) виджетов определяется в файле assets/default-dashboard-config.json. Данный файл содержит раздельные настройки для desktop и mobile версий.

ВАЖНО: если какой-либо виджет отключен на desktop версии (см. предыдущую секцию), то его следует также убрать из конфигурации desktop дашборда, иначе при сбросе он будет появляться у пользователя.

Internationalization

В проекте используется библиотека transloco для интернационализации текста. Чтобы подключить новый язык переводов, необходимо описать его в transloco-root.module.ts, а так же в assets/i18n и всех вложенных директориях добавить JSON-файл именнованый, как язык, который был описан в transloco-root.module.ts, в котором будут описаны переводы. Для того, чтобы использовать переводы, описанные в assets/i18n в шаблонах компонентов, необходимо подключить структурную директиву transloco с описанным scope при вложенности директорий (например *transloco="let t; scope: 'blotter/settings'"), а затем описанную функцию, которая принимает строку с ключевым словом из JSON-файлов переводов, включая scope, перобразованный к camelCase (например, учитывая scope из прошлого примера: \

{{ t('blotterSettings.portfolioLabel') }}\

*). Чтобы использовать переводы внутри классов компонентов, был создан TranslatorService, в котором есть методы получения/изменения языка, а так же метод getTranslator, который принимает строку с scope и возвращает Observable с функцией, которая принимает массив строк ключей (для вложенных полей из JSON-файла переводов) и возвращает перевод по этим ключам.

PUSH-уведомления

Для показывания PUSH-уведомлений необходимо в файле firebase-messaging-sw.js исправить конфиг firebase на свой, а так же, при енобходимости, описать свою обработку сообщения в коллбеке messaging.onBackgroundMessage. Так же, для показывания firebase-уведомлений ng-zorro внутри приложения необходимо в environment исправить конфиг firebase на свой, и поправить обработку сообщений при необходимости в modules/push-notifications/services/push-notifications-provider.ts.

GraphQL

В некоторых сервисах для получения данных используется GraphQL API. Для таких запросов в проект была добавлена библиотека apollo-angular. Настроить url отправки запроса и прочие конфигурации можно в graphql.module.ts. В shared/services был добавлен сервис GraphQlService, в котором есть метод watchQuery, принимающий строку запроса, переменные и дополнительные опции (такие, как сохранение кэша). На бэкенде используется фреймворк chillicream. С более подробной информацией, как пользоваться GraphQL, вы можете ознакомиться здесь.

Тестирование

Самый мимимум, который должен быть в каждом компоненте и сервисе, это тест на успешное создание компонента. Он создается ng generate по умочанию, но необходимо поддерживать, добавлять моки и стабы для input и используемых сервисов. В shared/utils/testing.ts есть интрументы для создания моков компонентов, рандомных данных, а так же моки основных компонентов ng-zorro и модулей. В ключевых сервисах, покрытие тестами выше. Ну ладно, будет. В планах это есть, точно =)