Первоначальная версия проекта chinilich-1.0
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
# 🧙♂️ Чинилыч – интеграция с 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` (сейчас синхронизация только по кнопке) |
|
||||
Reference in New Issue
Block a user