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