Админ-панель Онлайн-ГрядкаRaspberry Pi: Оффлайн
// ПРОСТОЙ ПРОКСИ ЧЕРЕЗ JAVASCRIPT class RaspberryPiProxy { constructor() { this.baseUrl = 'http://192.168.1.105:5000'; this.corsProxy = 'https://cors-anywhere.herokuapp.com/'; // Публичный CORS прокси this.useCorsProxy = false; } async testConnection() { // Пробуем прямое подключение try { const response = await fetch(`${this.baseUrl}/api/widget/status`, { method: 'GET', mode: 'no-cors' // Пробуем no-cors режим }); console.log('Прямое подключение возможно'); this.useCorsProxy = false; return true; } catch (error) { console.log('Прямое подключение невозможно, используем CORS прокси'); this.useCorsProxy = true; return false; } } async fetch(endpoint, options = {}) { const url = this.useCorsProxy ? `${this.corsProxy}${this.baseUrl}${endpoint}` : `${this.baseUrl}${endpoint}`; try { const response = await fetch(url, { ...options, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', ...options.headers } }); if (response.ok) { return await response.json(); } else { throw new Error(`HTTP ${response.status}`); } } catch (error) { console.error('Ошибка запроса:', error); // Возвращаем мок-данные return this.getMockData(endpoint); } } getMockData(endpoint) { // Возвращаем тестовые данные if (endpoint.includes('/api/widget/status')) { return { system: 'online', camera_count: 2, telegram_bot: true, last_update: new Date().toISOString(), mode: 'mock' }; } if (endpoint.includes('/api/widget/cameras')) { return { success: true, cameras: [ { id: 'cam_1', name: 'Грядка #1', status: 'online', lastPhoto: new Date().toISOString(), ownerName: 'Администратор' }, { id: 'cam_2', name: 'Грядка #2', status: 'online', lastPhoto: new Date().toISOString(), ownerName: 'Садовод #1' } ], total: 2, timestamp: new Date().toISOString() }; } return { success: true, message: 'Mock response' }; } } // Использование const rpiProxy = new RaspberryPiProxy(); // При загрузке виджета document.addEventListener('DOMContentLoaded', async () => { await rpiProxy.testConnection(); // Загружаем камеры const data = await rpiProxy.fetch('/api/widget/cameras'); console.log('Камеры:', data); // ... остальной код виджета });