9.3 KiB
9.3 KiB
🧙♂️ Чинилыч – интеграция с GLPI API
Современный веб-интерфейс для создания и отслеживания заявок, интеграции с GLPI (версия 11+), с собственной базой знаний, тёмной темой и адаптивным дизайном.
📌 Основные возможности
- Авторизация пользователей (роли: user, admin)
- Создание заявок:
- ИТ-заявка (с выбором оборудования, категории, автоматической подстановкой локации)
- Анонимная жалоба
- Просмотр своих заявок с синхронизацией статусов из GLPI
- Детальный просмотр заявки с комментариями (ITILFollowup)
- База знаний (синхронизация статей и документов из GLPI)
- Полнотекстовый поиск (FULLTEXT)
- Ленивая загрузка документов (скачивание по требованию)
- Сортировка по дате/названию
- Тёмная тема (сохраняется в localStorage)
- Адаптивный интерфейс (мобильные устройства)
- Поддержка прикрепления файлов (изображения, PDF)
🛠 Технологии
- PHP 8.3+
- MySQL 8.0+
- GLPI API (REST)
- HTML5 / CSS3 (CSS-переменные)
- JavaScript (Fetch API, динамические формы)
📁 Установка и настройка
1. Клонирование репозитория
git clone https://your-repo/service-desk.git
cd service-desk
2. Настройка базы данных
Создайте базу данных и импортируйте структуру:
-- Выполните SQL из файла my_database.sql
-- Дополнительные колонки для знаний
ALTER TABLE knowledge_base ADD COLUMN glpi_updated_at DATETIME DEFAULT NULL;
ALTER TABLE knowledge_base ADD FULLTEXT INDEX ft_title_content (title, content);
-- Колонка для локации в формах (исправление ошибки)
ALTER TABLE forms ADD COLUMN location_id INT DEFAULT NULL;
3. Настройка конфигурации
Отредактируйте config.php:
// База данных
define('DB_HOST', '-');
define('DB_NAME', 'my_database');
define('DB_USER', 'root');
define('DB_PASS', 'your_password');
// GLPI API
define('GLPI_API_URL', '-');
define('GLPI_APP_TOKEN', 'your_app_token');
define('GLPI_USERNAME', 'api_user');
define('GLPI_PASSWORD', 'api_password');
// Папки для файлов
define('UPLOAD_DIR', __DIR__ . '/uploads/');
define('KB_CACHE_DIR', __DIR__ . '/uploads/kb/');
Убедитесь, что папки uploads/ и uploads/kb/ созданы и доступны для записи:
mkdir -p uploads uploads/kb
chmod 755 uploads uploads/kb
4. Настройка веб-сервера (Nginx/Apache)
Пример для Nginx (корневая директория /var/www/html):
server {
listen 80;
server_name service-desk.local;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(jpg|jpeg|png|gif|css|js|pdf)$ {
expires 30d;
}
}
5. Создание первого пользователя
Вставьте в БД администратора (пароль хешируется через password_hash):
INSERT INTO users (username, password, email, role, last_name, first_name)
VALUES ('admin', '$2y$10$...hash...', 'admin@example.com', 'superadmin', 'Admin', 'Администратор');
Для генерации хеша можно использовать скрипт:
<?php echo password_hash('your_password', PASSWORD_DEFAULT); ?>
🚀 Использование
Панель пользователя
- Создание заявки: выберите тип, заполните поля, прикрепите файл.
- Список заявок: отображаются все заявки текущего пользователя с актуальным статусом.
- Подробности: кнопка «Подробнее» открывает модальное окно с полной информацией и комментариями.
База знаний
- Поиск статей (полнотекстовый)
- Сортировка (по дате или по названию)
- Просмотр статьи (с сохранённым HTML-форматированием)
- Скачивание файлов (при наличии документов в GLPI)
Для администратора
- Кнопка «Обновить базу» на странице знаний – выполняет инкрементальную синхронизацию статей и документов из GLPI.
- Можно настроить cron для автоматической синхронизации:
*/30 * * * * php /var/www/html/admin_sync_kb.php
🔄 Синхронизация с GLPI
- Заявки: статусы и приоритеты синхронизируются из GLPI при каждом просмотре списка.
- База знаний: синхронизируются только изменённые статьи (по полю
date_mod). Документы скачиваются лениво – при первом запросе к файлу. - Для корректной работы у API-пользователя GLPI должны быть права на чтение
KnowbaseItem,Document,Ticket,ITILFollowup.
🎨 Тёмная тема
Переключатель в шапке сайта. Выбор сохраняется в localStorage и автоматически применяется при следующем визите.
📱 Адаптивность
Интерфейс корректно отображается на мобильных устройствах (ширина экрана < 640px): меню сгибается, таблицы получают горизонтальную прокрутку, модальные окна сужаются.
🧩 Структура проекта
├── config.php # Настройки БД, GLPI, константы
├── functions.php # Основные функции (аутентификация, работа с формами, знание)
├── glpi_api.php # Класс для работы с GLPI REST API
├── index.php # Страница входа
├── dashboard.php # Главная панель (заявки)
├── knowledge.php # База знаний
├── search_knowledge.php # AJAX-поиск по базе знаний
├── get_article.php # AJAX-получение статьи
├── get_document.php # Ленивая загрузка документа
├── get_ticket_details.php # Детали заявки (AJAX)
├── get_glpi_data.php # Справочные данные (локации, компьютеры, категории)
├── get_computer_location.php # Получение локации компьютера по ID
├── logout.php # Завершение сессии
├── style.css # Стили (светлая/тёмная темы)
├── admin_sync_kb.php # Скрипт для cron-синхронизации знаний
├── uploads/ # Папка для вложений пользователей
└── uploads/kb/ # Кеш документов из GLPI
⚠️ Возможные проблемы и решения
| Проблема | Решение |
|---|---|
Fatal error: Column not found 'glpi_updated_at' |
Выполните ALTER TABLE knowledge_base ADD COLUMN glpi_updated_at DATETIME |
Data truncated for column 'status' |
Исправлена в functions.php – маппинг статусов GLPI в допустимые значения pending/processing/completed/rejected |
| Файлы в базе знаний не скачиваются | Проверьте права на папку uploads/kb/ (755) и наличие у API-пользователя доступа к документам GLPI |
| Не работает автоподстановка локации | Убедитесь, что у компьютера в GLPI заполнено поле locations_id |
| Синхронизация долгая | Установите cron и уберите автоматический вызов syncKnowledgeBaseIncremental из knowledge.php (сейчас синхронизация только по кнопке) |