Инструменты пользователя

Инструменты сайта


tmp_27.06.2026

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
tmp_27.06.2026 [2026/06/27 14:46] – [backend/config/salt.php] VladPolskiytmp_27.06.2026 [2026/06/27 15:35] (текущий) VladPolskiy
Строка 1: Строка 1:
-====== Файл менеджер ====== +// assets/js/app.js
-===== 🗺️ Общая архитектурная схема проекта ===== +
-<code> +
-       [ ПОЛЬЗОВАТЕЛЬ БОТ ХАКЕР ] +
-                     │ +
-                     ▼ +
-  ┌────────────────────────────────────────────────────────┐ +
-  │ 1. index.php (Главный шлюз приложения)                 │ +
-  │    - Проверяет сессию                                  │ +
-  │    - Если первый запуск ➔ перенаправляет на установку │ +
-  └──────────────────┬─────────────────────────────────────┘ +
-                     │ +
-                     ▼ +
-  ┌────────────────────────────────────────────────────────┐ +
-  │ 2. backend/core/initializer.php (Динамический корень)  │ +
-  │    - Вычисляет APP_ROOT через __DIR__                  │ +
-  │    - Создает папки: config/, storage/, system_logs/    │ +
-  └──────────────────┬─────────────────────────────────────┘ +
-                     │ +
-                     ▼ +
-  ┌────────────────────────────────────────────────────────┐ +
-  │ 3. backend/auth/check_ip.php (Первый рубеж защиты)     │ +
-  │    - Сверяет IP с config/ip_blacklist.txt              │ +
-  │    - Бан на месте: die()                               │ +
-  └──────────────────┬─────────────────────────────────────┘ +
-                     │ +
-                     ├────────────────────────┐ +
-                     ▼ (Если не авторизован)  ▼ (Если авторизован) +
-  ┌────────────────────────────────────────┐ ┌──────────────────────────────────────┐ +
-  │ 4. ЭКРАН АВТОРИЗАЦИИ / ИНИЦИАЛИЗАЦИИ   │ │ 5. ГЛАВНЫЙ ИНТЕРФЕЙС (ДВА ОКНА)      │ +
-  │    - Поля: Логин / Пароль              │ │                                      │ +
-  │    - Скрытое поле: Honeypot (Ловушка)  │ │ ┌──────────────────────────────────┐ │ +
-  │    - Восстановление: Строка из книги   │ │ │ ВЕРХНЕЕ ОКНО                     │ │ +
-  │                                        │ │ │ [Имя / Путь] [Релизы ▼] [ZIP]    │ │ +
-  │    backend/auth/validate_input.php     │ │ ├──────────────────────────────────┤ │ +
-  │    - Вырезает XSS / Path Traversal     │ │ │ Список файлов релиза             │ │ +
-  │                                        │ │ │ (Имя | Примечание | Дата/Время)  │ │ +
-  │    backend/auth/login.php/ register.php│ │ └──────────────────────────────────┘ │ +
-  │    - Хэширует пароли и текст книги     │ │ ┌──────────────────────────────────┐ │ +
-  │    - Генерирует случайный 8-значный ID │ │ │ НИЖНЕЕ ОКНО                      │ │ +
-  │    - Сортирует и перетасовывает базу   │ │ │ [README] [Лицензия] [Комментарий]│ │ +
-  │                                        │ │ │ [Лог действий (для админа)]      │ │ +
-  │                                        │ │ ├──────────────────────────────────┤ │ +
-  │                                        │ │ │ Динамический текст (Fetch API)   │ │ +
-  │                                        │ │ └──────────────────────────────────┘ │ +
-  └────────────────────────────────────────┘ └──────────────────┬───────────────────┘ +
-                                                                │ +
-                                                                ▼ (Любое действие) +
-                                             ┌──────────────────────────────────────┐ +
-                                             │ 6. backend/router.php                │ +
-                                             │    - Принимает AJAX / Fetch          │ +
-                                             │    - Ставит "Маяки" при затыках      │ +
-                                             └──────────────────┬───────────────────┘ +
-                                                                │ +
-                                            ┌───────────────────┴───────────────────┐ +
-                                            ▼ (Действия Админа)                     ▼ (Логи системы) +
-                               ┌─────────────────────────┐             ┌─────────────────────────┐ +
-                               │ backend/actions/        │             │ storage/system_logs/    │ +
-                               │ - list.php              │             │ - app_errors.log        │ +
-                               │ - mkdir.php             │             │  (Маяки отладки для нас)│ +
-                               │ - delete.php            │             │ - admins_activity.log   │ +
-                               └─────────────────────────┘             └─────────────────────────┘+
  
-</code>+document.addEventListener('DOMContentLoaded', function() { 
 +     // --- НАДЕЖНОЕ УПРАВЛЕНИЕ МОДАЛКОЙ С ДЕБАГ-МАЯКОМ --- 
 +    // --- УПРАВЛЕНИЕ ЗАГРУЗЧИКОМ ПРОЕКТОВ --- 
 +    const btnCreateProject   = document.getElementById('btn-create-project'); 
 +    const projectModal       = document.getElementById('project-modal'); 
 +    const btnModalCancel     = document.getElementById('btn-modal-cancel'); 
 +    const btnModalSubmit     = document.getElementById('btn-modal-submit'); 
 +    const newProjectName     = document.getElementById('new-project-name'); 
 +    const modalErrorBox      = document.getElementById('modal-error-box'); 
 +     
 +    const folderInput        = document.getElementById('project-folder-input'); 
 +    const btnSelectFolder    = document.getElementById('btn-select-folder'); 
 +    const folderStatus       = document.getElementById('selected-folder-status');
  
-===== 🧩 Карта маскировки данных в backend/config/ ===== +    if (btnCreateProject && projectModal) { 
-Поскольку мы закладываем параноидальную защиту, вот схема того, как скрыты наши конфигурационные файлы, к которым имеет доступ только серверный PHP:+         
 +        // Функция проверки условий для активации кнопки агрузить" 
 +        function checkInputsValidity() { 
 +            const nameVal = newProjectName.value.trim(); 
 +            const hasFiles = folderInput.files && folderInput.files.length > 0; 
 +             
 +            if (nameVal !== "" && hasFiles) { 
 +                btnModalSubmit.disabled = false; // Включаем кнопку 
 +                btnModalSubmit.style.opacity = "1"; 
 +            } else { 
 +                btnModalSubmit.disabled = true;  // Выключаем кнопку 
 +                btnModalSubmit.style.opacity = "0.6"; 
 +            } 
 +        }
  
-<code> +        // Следим за вводом имени 
-backend/config+        newProjectName.addEventListener('input', checkInputsValidity); 
-│ + 
-├── salt.php           ───► [Возвращает: Секретный токен Супера (16 симв.)] +        // Клик по кастомной кнопке -> триггерим скрытый системный инпут выбора папки 
-│                                    Секретный токен Админа  (16 симв.)] +        btnSelectFolder.addEventListener('click', function({ 
-│                           (Хакер в коде видит только шум, роли замаскированы) +            folderInput.click(); 
- +        }); 
-├── email.php          ───► озвращает: настоящий_email@супера.com] + 
-│                           (Спрятан от парсеров, выводится только при ошибке админа) +        // Следим за тем, что пользователь выбрал папку на ПК 
- +        folderInput.addEventListener('change'function() { 
-├── ip_blacklist.txt   ───► [Список забаненных IP-адресов] +            if (this.files && this.files.length > 0) { 
- +                // Берем имя корневой папки, которую выбрал юзер 
-└── users.json         ───► [ База данных Перетасованный массив ] +                const firstFile = this.files[0]; 
-                            ┌──────────────────────────────────────────────┐ +                const rootFolderName = firstFile.webkitRelativePath.split('/')[0]; 
-                            │ ID: 85910432 (Рандомный, отсортирован      │ +                folderStatus.innerHTML = `Выбрано файлов: <strong>${this.files.length}</strong><br><span style="font-size:11px; color:#2da44e;">(из папки: ${rootFolderName})</span>`; 
-                            │ Пароль: $2y$10$... (Защищенный хэш)          │ +            } else { 
-                            │ Роль: x7R9wQ2pM4zL1vK8 (Случайный шум      │ +                folderStatus.textContent = "Папка не выбрана"; 
-                            │ Книга: $2y$10$... (Хэш контрольной строки  │ +            } 
-                            └──────────────────────────────────────────────┘+            checkInputsValidity(); 
 +        }); 
 + 
 +        // Открытие модалки 
 +        btnCreateProject.addEventListener('click', function({ 
 +            newProjectName.value = ''; 
 +            folderInput.value = ''; // Сбрасываем выбранные файлы 
 +            folderStatus.textContent = "Папка не выбрана"; 
 +            if (modalErrorBox) modalErrorBox.classList.add('hidden'); 
 +            btnModalSubmit.disabled = true; 
 +            btnModalSubmit.style.opacity = "0.6"; 
 +            projectModal.classList.remove('hidden'); 
 +            newProjectName.focus(); 
 +        }); 
 + 
 +        // Отмена 
 +        btnModalCancel.addEventListener('click', function() { 
 +            projectModal.classList.add('hidden'); 
 +        }); 
 + 
 +        // Нажатие на кнопку "Загрузить" -> отправка терабайтов кода по AJAX 
 +        btnModalSubmit.addEventListener('click', async function() { 
 +            const projectName = newProjectName.value.trim(); 
 +            if (modalErrorBox) modalErrorBox.classList.add('hidden'); 
 + 
 +            const formData = new FormData(); 
 +            formData.append('name', projectName); 
 + 
 +            // КРИТИЧЕСКИ ВАЖНО: Пакуем файлы вместе с их путями вложения 
 +            for (let i = 0; i < folderInput.files.length; i++) { 
 +                let file = folderInput.files[i]; 
 +                formData.append('project_files[]', file); 
 +                // Передаем бэкенду относительный путь (например: "my_proj/src/main.php"
 +                formData.append('project_paths[]'file.webkitRelativePath); 
 +            } 
 + 
 +            // Меняем статус кнопки на время тяжелой загрузки 
 +            btnModalSubmit.disabled = true; 
 +            btnModalSubmit.textContent = "Загрузка..."; 
 + 
 +            try { 
 +                const response = await fetch('backend/router.php?action=create_project',
 +                    method: 'POST', 
 +                    body: formData 
 +                }); 
 +                const result = await response.json(); 
 +                 
 +                if (result.success) { 
 +                    projectModal.classList.add('hidden'); 
 +                    btnModalSubmit.textContent = "Загрузить"; 
 +                    location.reload(); 
 +                } else { 
 +                    btnModalSubmit.disabled = false; 
 +                    btnModalSubmit.textContent = "Загрузить"; 
 +                    if (modalErrorBox) { 
 +                        modalErrorBox.textContent = result.error; 
 +                        modalErrorBox.classList.remove('hidden'); 
 +                    } 
 +                } 
 +            } catch (error) { 
 +                // Возвращаем кнопку в исходное рабочее состояние 
 +                btnModalSubmit.disabled = false; 
 +                btnModalSubmit.textContent = "Загрузить"; 
 +                 
 +                // КРАСИВО ВЫВОДИМ ОШИБКУ СЕТИ В ТВОЮ ПЛАШКУ БЕЗ ВСЯКИХ АЛЕРТОВ 
 +                if (modalErrorBox{ 
 +                    modalErrorBox.textContent = "Критическая ошибка отправки файлов на сервер."; 
 +                    modalErrorBox.classList.remove('hidden'); 
 +                } 
 +            } 
 +        }); 
 +    }
  
-</code> 
  
-===== 📂 Карта песочницы на диске (storage/) ===== 
-Абсолютно безликая структура. Никаких названий компаний и имен. Только цифровые идентификаторы, сгенерированные нашей системой тасования. 
-<code> 
-storage/ 
- 
-├── 85910432/                 ───► Личная папка Супер-админа (или Главного Админа) 
-│   ├── .system/ 
-│   │   └── activity.log      ───► Локальный лог действий на 100 строк (Ротация) 
-│   │ 
-│   ├── Релиз_v1.0_Стабильный/ ───► Папка, которая отобразится в выпадающем списке 
-│   │   ├── app.exe           ───► Файл для скачивания 
-│   │   ├── readme.txt        ───► Текст для вкладки README 
-│   │   ├── license.txt       ───► Текст для вкладки Лицензия 
-│   │   ├── comment.txt       ───► Текст для вкладки Комментарий 
-│   │   └── .meta.json        ───► Кто, что и когда правил в этом релизе 
-│   │ 
-│   └── Релиз_v2.0_Бета/ 
- 
-├── 10294811/                 ───► Личная папка Обычного Администратора №2 
-│   └── ... 
- 
-└── system_logs/              ───► Доступ только для Токена Супер-админа 
-    ├── admins_activity.log   ───► Кто из админов что делал в системе 
-    └── app_errors.log        ───► Все наши технические маяки для отладки 
  
-</code> 
  
-===== Создаем файл backend/config/paths.php===== 
-Этот файл использует магические константы PHP и глобальные массивы сервера, чтобы автоматически подстроиться под любое окружение. 
-<code> 
-</code> 
  
-===== test ===== 
-// assets/js/app.js 
  
-document.addEventListener('DOMContentLoaded', function() { 
-    const releasesDropdown = document.getElementById('releases-dropdown'); 
-    const btnDownloadZip   = document.getElementById('btn-download-zip'); 
-    const filesList        = document.getElementById('files-list'); 
-    const textEditor       = document.getElementById('text-editor'); 
-    const tabButtons       = document.querySelectorAll('.tab-btn'); 
  
     // Локальное хранилище для текстов текущего выбранного релиза,     // Локальное хранилище для текстов текущего выбранного релиза,
Строка 221: Строка 218:
     });     });
 }); });
 +
 +
tmp_27.06.2026.1782560760.txt.gz · Последнее изменение: VladPolskiy

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki