Детальное описание архитектуры системы
CurRate-Go построен на многослойной архитектуре с четким разделением ответственности между слоями.
┌─────────────────────────────────────────────────────────┐
│ GUI Layer (Wails) │
│ HTML/CSS/JS → Go Backend (App.go) │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Business Logic Layer │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Converter │ │ Validator │ │ Formatter │ │
│ │ (главная │ │ (проверка │ │ (вывод │ │
│ │ логика) │ │ данных) │ │ результата) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ Data Access Layer │ │ Caching Layer │
│ │ │ │
│ ┌──────────────────┐ │ │ ┌──────────────────┐ │
│ │ Parser (XML) │ │ │ │ LRU Cache │ │
│ │ • ParseXML │ │ │ │ • 100 items │ │
│ │ • FetchRates │ │ │ │ • TTL 24h │ │
│ │ • HTTP Client │ │ │ │ • Thread-safe │ │
│ └──────────────────┘ │ │ └──────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ CBR XML API (ЦБ РФ) │
│ https://www.cbr.ru/scripts/XML_daily.asp │
└─────────────────────────────────────────────────────────┘
Назначение: Пользовательский интерфейс и взаимодействие с пользователем
Технологии:
- Wails v2.11.0 - Desktop UI фреймворк
- WebView2 - Нативный рендеринг (Windows 11)
- HTML/CSS/Vanilla JavaScript - Frontend без фреймворков
Компоненты:
frontend/index.html- Основная разметкаfrontend/styles/- Стили CSSfrontend/scripts/- JavaScript логикаmain_gui.go- Точка входа для GUIinternal/app/app.go- Go backend для Wails bindings
Взаимодействие:
- Frontend вызывает методы Go через Wails Runtime
- Go backend обрабатывает запросы и возвращает результаты
- Двусторонняя связь через события
Назначение: Основная бизнес-логика конвертации валют
Модули:
- Главный конвертер валют
- Координация работы всех компонентов
- Обработка результатов конвертации
- Валидация входных данных
- Проверка корректности суммы и даты
- Валидация валюты
- Форматирование результата конвертации
- Поддержка русского формата чисел
- Форматирование валют
Взаимодействие:
- Converter использует Validator для проверки входных данных
- Converter использует Formatter для форматирования результата
- Converter взаимодействует с Data Access Layer для получения курсов
Назначение: Получение данных о курсах валют из внешних источников
Модули:
- xml.go - XML парсер с поддержкой windows-1251
- client.go - HTTP клиент с retry логикой
- cbr.go - Публичный API для получения курсов
Особенности:
- Поддержка кодировки windows-1251 (конвертация в UTF-8)
- Exponential backoff retry (1s, 2s, 4s)
- Обработка HTTP редиректов
- Таймауты и обработка ошибок
Взаимодействие:
- Получает данные из CBR XML API
- Возвращает структурированные данные в Business Logic Layer
- НЕ занимается кэшированием (это ответственность Converter)
Назначение: Кэширование курсов валют для минимизации запросов к API
Модуль: internal/cache/
Особенности:
- LRU (Least Recently Used) алгоритм
- TTL (Time To Live) - 24 часа
- Thread-safe - безопасен для concurrent использования
- 100 items - максимальный размер кэша
Взаимодействие:
- Кэш используется Business Logic Layer (Converter) для хранения курсов
- Converter проверяет кэш перед запросом к Parser
- Converter сохраняет полученные курсы в кэш
- Автоматически инвалидирует устаревшие записи по TTL
internal/
├── models/ # Модели данных (Currency, ExchangeRate, RateData)
├── parser/ # Парсинг XML API ЦБ РФ
│ ├── xml.go # XML парсер (encoding/xml + windows-1251)
│ ├── parser.go # Общие функции парсинга
│ ├── client.go # HTTP клиент с retry
│ └── cbr.go # Публичный API
├── cache/ # LRU кэш с TTL
├── converter/ # Бизнес-логика конвертации
│ ├── converter.go # Главный конвертер
│ ├── validator.go # Валидация входных данных
│ └── formatter.go # Форматирование результата
├── telegram/ # Интеграция с Telegram Bot API
│ ├── telegram.go # Отправка уведомлений
│ └── userid.go # Генерация анонимного user ID
└── app/ # Wails backend (App.go)
- Пользователь вводит данные в GUI (сумма, валюта, дата)
- Frontend вызывает Go метод через Wails Runtime
- App.go получает запрос и передает в Converter
- Converter валидирует данные через Validator
- Converter проверяет кэш - если курс есть, использует его
- Если кэш пуст, Converter запрашивает данные через Parser
- Parser делает HTTP запрос к CBR XML API
- Parser парсит XML и возвращает структурированные данные
- Converter сохраняет полученный курс в кэш для последующих запросов
- Converter конвертирует валюту используя полученный курс
- Formatter форматирует результат для отображения
- Результат возвращается в Frontend через Wails Runtime
- GUI отображает результат пользователю
- Вызов API метода Converter.Convert()
- Converter валидирует данные через Validator
- Converter проверяет кэш - если курс есть, использует его
- Если кэш пуст, Converter запрашивает данные через Parser
- Parser получает данные из CBR XML API
- Converter сохраняет полученный курс в кэш
- Converter конвертирует и форматирует результат
- Результат возвращается вызывающему коду
- Каждый слой имеет четкую ответственность
- Минимальная связанность между слоями
- Высокая сплоченность внутри слоев
- Converter получает зависимости через конструктор
- Легко тестировать и мокировать
- Гибкость в замене компонентов
- Использование интерфейсов для абстракции
- Легкая замена реализаций
- Упрощенное тестирование
- Явная обработка ошибок
- Понятные сообщения об ошибках
- Graceful degradation
- 03-АРХИТЕКТУРНЫЙ-ДИЗАЙН.md - Детальный архитектурный дизайн
- 12-WAILS-GUI-АРХИТЕКТУРА.md - Архитектура GUI компонента
- README.md - Обзор проекта