Files
site_for_glpi/README.md

188 lines
9.3 KiB
Markdown

# 🧙‍♂️ Чинилыч – интеграция с 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. Клонирование репозитория
```bash
git clone https://your-repo/service-desk.git
cd service-desk
```
### 2. Настройка базы данных
Создайте базу данных и импортируйте структуру:
```sql
-- Выполните 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`:
```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/` созданы и доступны для записи:
```bash
mkdir -p uploads uploads/kb
chmod 755 uploads uploads/kb
```
### 4. Настройка веб-сервера (Nginx/Apache)
Пример для Nginx (корневая директория `/var/www/html`):
```nginx
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`):
```sql
INSERT INTO users (username, password, email, role, last_name, first_name)
VALUES ('admin', '$2y$10$...hash...', 'admin@example.com', 'superadmin', 'Admin', 'Администратор');
```
Для генерации хеша можно использовать скрипт:
```php
<?php echo password_hash('your_password', PASSWORD_DEFAULT); ?>
```
## 🚀 Использование
### Панель пользователя
- **Создание заявки**: выберите тип, заполните поля, прикрепите файл.
- **Список заявок**: отображаются все заявки текущего пользователя с актуальным статусом.
- **Подробности**: кнопка «Подробнее» открывает модальное окно с полной информацией и комментариями.
### База знаний
- **Поиск статей** (полнотекстовый)
- **Сортировка** (по дате или по названию)
- **Просмотр статьи** (с сохранённым HTML-форматированием)
- **Скачивание файлов** (при наличии документов в GLPI)
### Для администратора
- Кнопка **«Обновить базу»** на странице знаний – выполняет инкрементальную синхронизацию статей и документов из GLPI.
- Можно настроить cron для автоматической синхронизации:
```bash
*/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` (сейчас синхронизация только по кнопке) |