Files
site_for_glpi/README.md

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 (сейчас синхронизация только по кнопке)