Add files via upload

v0.1(front)
This commit is contained in:
cyrteL
2025-07-28 14:15:31 +03:00
committed by GitHub
commit 0308719223
7 changed files with 2312 additions and 0 deletions

327
README.md Normal file
View File

@ -0,0 +1,327 @@
# Система управления складом "Склад-Менеджер"
Современная веб-система для управления товарными запасами и операциями склада с разными уровнями доступа.
## 🚀 Возможности системы
### Основной функционал
- **Управление товарами**: добавление, редактирование, удаление товаров
- **Операции склада**: приход и расход товаров
- **Каталог товаров**: удобный просмотр с фильтрами и поиском
- **История операций**: полный учет всех операций со складом
- **Поиск**: быстрый поиск товаров и операций
- **Отчеты**: генерация различных отчетов
- **Экспорт данных**: выгрузка в CSV и JSON форматах
### Система безопасности
- **Многоуровневая авторизация** с разными ролями
- **Контроль доступа** к функциям системы
- **Безопасные сессии** пользователей
- **Валидация данных** на всех уровнях
### Уровни доступа
#### 🔧 Администратор (admin/admin123)
- Полный доступ ко всем функциям
- Управление пользователями
- Настройка системы
- Просмотр всех отчетов
#### 👔 Менеджер (manager/manager123)
- Чтение и запись данных
- Управление товарами
- Оформление операций
- Просмотр отчетов
#### 👷 Оператор (operator/operator123)
- Только чтение данных
- Просмотр каталога и истории
- Ограниченный доступ к функциям
#### 👁️ Наблюдатель (viewer/viewer123)
- Ограниченный просмотр
- Только чтение данных
- Минимальный доступ
## 📁 Структура проекта
```
warehouse-system/
├── index.html # Главная страница
├── login.html # Страница авторизации
├── catalog.html # Каталог товаров
├── history.html # История операций
├── search.html # Поиск
├── profile.html # Профиль пользователя
├── css/
│ └── style.css # Основные стили
├── js/
│ ├── auth.js # Система авторизации
│ ├── main.js # Основная логика
│ ├── warehouse.js # Управление складом
│ ├── catalog.js # Каталог товаров
│ ├── history.js # История операций
│ ├── search.js # Поиск
│ └── profile.js # Профиль пользователя
└── README.md # Документация
```
## 🛠️ Технологии
- **HTML5** - семантическая разметка
- **CSS3** - современные стили с CSS переменными
- **Bootstrap 5** - адаптивный дизайн
- **JavaScript (ES6+)** - интерактивность
- **jQuery** - упрощение работы с DOM
- **Font Awesome** - иконки
- **LocalStorage** - локальное хранение данных
## 🚀 Быстрый старт
### 1. Установка
1. Скачайте или клонируйте проект
2. Откройте `index.html` в браузере
3. Или запустите локальный сервер:
```bash
# Python 3
python -m http.server 8000
# Node.js
npx http-server
# PHP
php -S localhost:8000
```
### 2. Первый вход
1. Откройте `login.html`
2. Используйте тестовые учетные записи:
- **Администратор**: `admin` / `admin123`
- **Менеджер**: `manager` / `manager123`
- **Оператор**: `operator` / `operator123`
- **Наблюдатель**: `viewer` / `viewer123`
### 3. Начальная настройка
1. Войдите как администратор
2. Добавьте первые товары через главную страницу
3. Настройте категории товаров
4. Создайте пользователей с нужными правами
## 📖 Руководство пользователя
### Главная страница
- **Быстрые действия**: добавление товаров, приход/расход
- **Статистика**: общая информация о складе
- **Последние операции**: мониторинг активности
### Каталог товаров
- **Просмотр**: все товары с фильтрами
- **Поиск**: по названию, описанию, штрих-коду
- **Фильтры**: по категории, цене, наличию
- **Редактирование**: изменение информации о товарах
### История операций
- **Просмотр**: все операции с детализацией
- **Фильтры**: по типу, дате, товару, сотруднику
- **Отчеты**: генерация различных отчетов
- **Экспорт**: выгрузка данных
### Поиск
- **Универсальный поиск**: товары и операции
- **Расширенные фильтры**: точная настройка
- **Результаты**: с подсветкой найденного
- **Экспорт результатов**: сохранение найденного
### Профиль пользователя
- **Информация**: личные данные и права
- **Статистика**: активность пользователя
- **Настройки**: персонализация интерфейса
- **Безопасность**: смена пароля
## 🔧 Администрирование
### Управление пользователями
1. Войдите как администратор
2. Перейдите в раздел "Администрирование"
3. Выберите "Управление пользователями"
4. Создавайте, редактируйте, удаляйте пользователей
### Настройка категорий
1. Откройте "Категории товаров"
2. Добавьте нужные категории
3. Настройте иконки и описания
### Генерация отчетов
1. Выберите тип отчета
2. Укажите период
3. Настройте параметры
4. Экспортируйте в нужном формате
## 📊 Структура данных
### Товар
```javascript
{
id: 1,
name: "Название товара",
category: "electronics",
price: 1000,
quantity: 50,
description: "Описание товара",
barcode: "1234567890123",
minQuantity: 10,
location: "Стеллаж A-1",
supplier: "Поставщик",
createdAt: "2024-01-15T10:00:00Z",
updatedAt: "2024-01-15T10:00:00Z"
}
```
### Операция
```javascript
{
id: 1,
type: "incoming", // или "outgoing"
itemId: 1,
itemName: "Название товара",
quantity: 10,
employeeId: 1,
employeeName: "Имя сотрудника",
date: "2024-01-15T10:00:00Z",
status: "completed",
supplier: "Поставщик",
recipient: "Получатель",
notes: "Примечания"
}
```
### Пользователь
```javascript
{
id: 1,
username: "admin",
name: "Администратор",
email: "admin@company.com",
roles: ["admin"],
permissions: ["read", "write", "delete", "admin"],
department: "IT",
position: "Системный администратор"
}
```
## 🎨 Кастомизация
### Изменение цветовой схемы
Отредактируйте CSS переменные в `css/style.css`:
```css
:root {
--primary-color: #0d6efd;
--secondary-color: #6c757d;
--success-color: #198754;
--warning-color: #ffc107;
--danger-color: #dc3545;
--info-color: #0dcaf0;
}
```
### Добавление новых категорий
В файле `js/warehouse.js` найдите функцию `loadCategories()` и добавьте новые категории:
```javascript
{
id: 'new-category',
name: 'Новая категория',
icon: 'fas fa-icon-name'
}
```
### Настройка прав доступа
В файле `js/auth.js` измените массив пользователей или добавьте новые роли и разрешения.
## 🔒 Безопасность
### Рекомендации по безопасности
1. **Измените пароли по умолчанию** при первом входе
2. **Используйте HTTPS** в продакшене
3. **Регулярно обновляйте** права доступа
4. **Ведите логи** всех операций
5. **Делайте резервные копии** данных
### Настройка HTTPS
Для продакшена обязательно используйте SSL-сертификат:
```bash
# Пример с Let's Encrypt
sudo certbot --nginx -d your-domain.com
```
## 📈 Производительность
### Оптимизация
- Используйте современный браузер
- Включите кэширование
- Минимизируйте количество одновременных операций
- Регулярно очищайте старые данные
### Масштабирование
- Для больших объемов данных используйте базу данных
- Добавьте серверную часть (PHP, Node.js, Python)
- Используйте CDN для статических файлов
- Настройте кэширование на сервере
## 🐛 Устранение неполадок
### Частые проблемы
#### Не работает авторизация
- Проверьте правильность логина/пароля
- Очистите кэш браузера
- Проверьте консоль на ошибки JavaScript
#### Не сохраняются данные
- Проверьте доступ к LocalStorage
- Убедитесь, что JavaScript включен
- Проверьте права доступа пользователя
#### Медленная работа
- Закройте лишние вкладки
- Очистите кэш браузера
- Проверьте количество товаров/операций
### Логи и отладка
Откройте консоль разработчика (F12) для просмотра ошибок и логов.
## 🤝 Поддержка
### Сообщение об ошибках
При обнаружении ошибок:
1. Опишите проблему подробно
2. Укажите версию браузера
3. Приложите скриншот ошибки
4. Опишите шаги для воспроизведения
### Запросы функций
Для добавления новых функций:
1. Опишите требуемую функциональность
2. Укажите приоритет
3. Приведите примеры использования
## 📄 Лицензия
Этот проект распространяется под лицензией MIT. См. файл LICENSE для подробностей.
## 👥 Авторы
- Разработка: [Ваше имя]
- Дизайн: [Имя дизайнера]
- Тестирование: [Имя тестировщика]
## 📞 Контакты
- Email: support@warehouse-system.com
- Телефон: +7 (XXX) XXX-XX-XX
- Веб-сайт: https://warehouse-system.com
---
**Версия**: 1.0.0
**Дата**: Январь 2024
**Последнее обновление**: 15.01.2024

403
catalog.html Normal file
View File

@ -0,0 +1,403 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Каталог товаров - Склад-Менеджер</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<!-- Навигационная панель -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="index.html">
<i class="fas fa-warehouse me-2"></i>
Склад-Менеджер
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="index.html">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="catalog.html">
<i class="fas fa-boxes me-1"></i>Каталог
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="history.html">
<i class="fas fa-history me-1"></i>История
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="search.html">
<i class="fas fa-search me-1"></i>Поиск
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown" id="adminDropdown" style="display: none;">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cog me-1"></i>Администрирование
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="admin/users.html">Управление пользователями</a></li>
<li><a class="dropdown-item" href="admin/categories.html">Категории товаров</a></li>
<li><a class="dropdown-item" href="admin/reports.html">Отчеты</a></li>
</ul>
</li>
<li class="nav-item dropdown" id="profileDropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-user me-1"></i>Профиль
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="profile.html">Мой профиль</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" id="logoutBtn">Выйти</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Основной контент -->
<main class="container mt-4">
<!-- Заголовок страницы -->
<div class="row mb-4">
<div class="col-12">
<div class="d-flex justify-content-between align-items-center">
<div>
<h1 class="mb-1">
<i class="fas fa-boxes me-2"></i>
Каталог товаров
</h1>
<p class="text-muted mb-0">Управление товарными позициями склада</p>
</div>
<div class="d-flex gap-2">
<button class="btn btn-outline-primary" id="exportBtn">
<i class="fas fa-download me-1"></i>Экспорт
</button>
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addItemModal" id="addItemBtn">
<i class="fas fa-plus me-1"></i>Добавить товар
</button>
</div>
</div>
</div>
</div>
<!-- Фильтры и поиск -->
<div class="catalog-filters">
<div class="row">
<div class="col-md-4 mb-3">
<label for="searchInput" class="form-label">Поиск товаров</label>
<div class="input-group">
<span class="input-group-text">
<i class="fas fa-search"></i>
</span>
<input type="text" class="form-control" id="searchInput" placeholder="Название, описание или штрих-код">
</div>
</div>
<div class="col-md-3 mb-3">
<label for="categoryFilter" class="form-label">Категория</label>
<select class="form-select" id="categoryFilter">
<option value="">Все категории</option>
</select>
</div>
<div class="col-md-2 mb-3">
<label for="priceMin" class="form-label">Цена от</label>
<input type="number" class="form-control" id="priceMin" placeholder="0">
</div>
<div class="col-md-2 mb-3">
<label for="priceMax" class="form-label">Цена до</label>
<input type="number" class="form-control" id="priceMax" placeholder="∞">
</div>
<div class="col-md-1 mb-3">
<label class="form-label">&nbsp;</label>
<div class="d-grid">
<button class="btn btn-outline-secondary" id="clearFiltersBtn">
<i class="fas fa-times"></i>
</button>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inStockFilter">
<label class="form-check-label" for="inStockFilter">
Только в наличии
</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="lowStockFilter">
<label class="form-check-label" for="lowStockFilter">
Заканчивается
</label>
</div>
</div>
</div>
</div>
<!-- Статистика каталога -->
<div class="row mb-4">
<div class="col-md-3 mb-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalItemsCount">0</h4>
<p class="card-text">Всего товаров</p>
</div>
<i class="fas fa-boxes fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="inStockCount">0</h4>
<p class="card-text">В наличии</p>
</div>
<i class="fas fa-check-circle fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="lowStockCount">0</h4>
<p class="card-text">Заканчивается</p>
</div>
<i class="fas fa-exclamation-triangle fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="categoriesCount">0</h4>
<p class="card-text">Категорий</p>
</div>
<i class="fas fa-tags fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Переключатель вида -->
<div class="row mb-3">
<div class="col-12">
<div class="btn-group" role="group">
<input type="radio" class="btn-check" name="viewMode" id="gridView" checked>
<label class="btn btn-outline-primary" for="gridView">
<i class="fas fa-th-large me-1"></i>Сетка
</label>
<input type="radio" class="btn-check" name="viewMode" id="listView">
<label class="btn btn-outline-primary" for="listView">
<i class="fas fa-list me-1"></i>Список
</label>
</div>
</div>
</div>
<!-- Каталог товаров -->
<div class="row" id="catalogContainer">
<!-- Товары будут загружены через JavaScript -->
</div>
<!-- Пагинация -->
<div class="row mt-4">
<div class="col-12">
<nav aria-label="Навигация по страницам">
<ul class="pagination justify-content-center" id="pagination">
<!-- Пагинация будет создана через JavaScript -->
</ul>
</nav>
</div>
</div>
</main>
<!-- Модальное окно добавления товара -->
<div class="modal fade" id="addItemModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-plus-circle me-2"></i>
Добавить новый товар
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="addItemForm">
<div class="row">
<div class="col-md-6 mb-3">
<label for="itemName" class="form-label">Название товара *</label>
<input type="text" class="form-control" id="itemName" required>
</div>
<div class="col-md-6 mb-3">
<label for="itemCategory" class="form-label">Категория *</label>
<select class="form-select" id="itemCategory" required>
<option value="">Выберите категорию</option>
</select>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="itemPrice" class="form-label">Цена (₽) *</label>
<input type="number" class="form-control" id="itemPrice" min="0" step="0.01" required>
</div>
<div class="col-md-6 mb-3">
<label for="itemQuantity" class="form-label">Количество *</label>
<input type="number" class="form-control" id="itemQuantity" min="0" required>
</div>
</div>
<div class="mb-3">
<label for="itemDescription" class="form-label">Описание</label>
<textarea class="form-control" id="itemDescription" rows="3"></textarea>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="itemBarcode" class="form-label">Штрих-код</label>
<input type="text" class="form-control" id="itemBarcode">
</div>
<div class="col-md-6 mb-3">
<label for="itemLocation" class="form-label">Местоположение</label>
<input type="text" class="form-control" id="itemLocation" placeholder="Стеллаж A-1">
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="itemSupplier" class="form-label">Поставщик</label>
<input type="text" class="form-control" id="itemSupplier">
</div>
<div class="col-md-6 mb-3">
<label for="itemMinQuantity" class="form-label">Минимальный запас</label>
<input type="number" class="form-control" id="itemMinQuantity" min="0">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" id="saveItemBtn">
<i class="fas fa-save me-1"></i>Сохранить
</button>
</div>
</div>
</div>
</div>
<!-- Модальное окно редактирования товара -->
<div class="modal fade" id="editItemModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-edit me-2"></i>
Редактировать товар
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="editItemForm">
<input type="hidden" id="editItemId">
<div class="row">
<div class="col-md-6 mb-3">
<label for="editItemName" class="form-label">Название товара *</label>
<input type="text" class="form-control" id="editItemName" required>
</div>
<div class="col-md-6 mb-3">
<label for="editItemCategory" class="form-label">Категория *</label>
<select class="form-select" id="editItemCategory" required>
<option value="">Выберите категорию</option>
</select>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="editItemPrice" class="form-label">Цена (₽) *</label>
<input type="number" class="form-control" id="editItemPrice" min="0" step="0.01" required>
</div>
<div class="col-md-6 mb-3">
<label for="editItemQuantity" class="form-label">Количество *</label>
<input type="number" class="form-control" id="editItemQuantity" min="0" required>
</div>
</div>
<div class="mb-3">
<label for="editItemDescription" class="form-label">Описание</label>
<textarea class="form-control" id="editItemDescription" rows="3"></textarea>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="editItemBarcode" class="form-label">Штрих-код</label>
<input type="text" class="form-control" id="editItemBarcode">
</div>
<div class="col-md-6 mb-3">
<label for="editItemLocation" class="form-label">Местоположение</label>
<input type="text" class="form-control" id="editItemLocation">
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="editItemSupplier" class="form-label">Поставщик</label>
<input type="text" class="form-control" id="editItemSupplier">
</div>
<div class="col-md-6 mb-3">
<label for="editItemMinQuantity" class="form-label">Минимальный запас</label>
<input type="number" class="form-control" id="editItemMinQuantity" min="0">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" id="updateItemBtn">
<i class="fas fa-save me-1"></i>Обновить
</button>
</div>
</div>
</div>
</div>
<!-- Подвал -->
<footer class="bg-dark text-white mt-5 py-4">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>Система управления складом</h5>
<p class="mb-0">Эффективное управление товарными запасами</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">&copy; 2024 Склад-Менеджер. Все права защищены.</p>
</div>
</div>
</div>
</footer>
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/auth.js"></script>
<script src="js/warehouse.js"></script>
<script src="js/catalog.js"></script>
</body>
</html>

380
history.html Normal file
View File

@ -0,0 +1,380 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>История операций - Склад-Менеджер</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<!-- Навигационная панель -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="index.html">
<i class="fas fa-warehouse me-2"></i>
Склад-Менеджер
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="index.html">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="catalog.html">
<i class="fas fa-boxes me-1"></i>Каталог
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="history.html">
<i class="fas fa-history me-1"></i>История
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="search.html">
<i class="fas fa-search me-1"></i>Поиск
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown" id="adminDropdown" style="display: none;">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cog me-1"></i>Администрирование
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="admin/users.html">Управление пользователями</a></li>
<li><a class="dropdown-item" href="admin/categories.html">Категории товаров</a></li>
<li><a class="dropdown-item" href="admin/reports.html">Отчеты</a></li>
</ul>
</li>
<li class="nav-item dropdown" id="profileDropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-user me-1"></i>Профиль
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="profile.html">Мой профиль</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" id="logoutBtn">Выйти</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Основной контент -->
<main class="container mt-4">
<!-- Заголовок страницы -->
<div class="row mb-4">
<div class="col-12">
<div class="d-flex justify-content-between align-items-center">
<div>
<h1 class="mb-1">
<i class="fas fa-history me-2"></i>
История операций
</h1>
<p class="text-muted mb-0">Просмотр всех операций со складом</p>
</div>
<div class="d-flex gap-2">
<button class="btn btn-outline-primary" id="exportBtn">
<i class="fas fa-download me-1"></i>Экспорт
</button>
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#reportModal">
<i class="fas fa-chart-bar me-1"></i>Отчет
</button>
</div>
</div>
</div>
</div>
<!-- Фильтры -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-filter me-2"></i>
Фильтры
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-3 mb-3">
<label for="operationType" class="form-label">Тип операции</label>
<select class="form-select" id="operationType">
<option value="">Все типы</option>
<option value="incoming">Приход</option>
<option value="outgoing">Расход</option>
</select>
</div>
<div class="col-md-3 mb-3">
<label for="startDate" class="form-label">Дата начала</label>
<input type="date" class="form-control" id="startDate">
</div>
<div class="col-md-3 mb-3">
<label for="endDate" class="form-label">Дата окончания</label>
<input type="date" class="form-control" id="endDate">
</div>
<div class="col-md-3 mb-3">
<label for="itemFilter" class="form-label">Товар</label>
<select class="form-select" id="itemFilter">
<option value="">Все товары</option>
</select>
</div>
</div>
<div class="row">
<div class="col-md-3 mb-3">
<label for="employeeFilter" class="form-label">Сотрудник</label>
<select class="form-select" id="employeeFilter">
<option value="">Все сотрудники</option>
</select>
</div>
<div class="col-md-3 mb-3">
<label for="statusFilter" class="form-label">Статус</label>
<select class="form-select" id="statusFilter">
<option value="">Все статусы</option>
<option value="completed">Завершено</option>
<option value="pending">В обработке</option>
<option value="cancelled">Отменено</option>
</select>
</div>
<div class="col-md-6 mb-3 d-flex align-items-end">
<div class="d-flex gap-2">
<button class="btn btn-primary" id="applyFiltersBtn">
<i class="fas fa-search me-1"></i>Применить
</button>
<button class="btn btn-outline-secondary" id="clearFiltersBtn">
<i class="fas fa-times me-1"></i>Очистить
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Статистика операций -->
<div class="row mb-4">
<div class="col-md-3 mb-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalOperations">0</h4>
<p class="card-text">Всего операций</p>
</div>
<i class="fas fa-list fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="incomingOperations">0</h4>
<p class="card-text">Приходы</p>
</div>
<i class="fas fa-box-open fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="outgoingOperations">0</h4>
<p class="card-text">Расходы</p>
</div>
<i class="fas fa-truck fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalQuantity">0</h4>
<p class="card-text">Общее количество</p>
</div>
<i class="fas fa-cubes fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Таблица операций -->
<div class="card">
<div class="card-header">
<div class="d-flex justify-content-between align-items-center">
<h5 class="mb-0">
<i class="fas fa-table me-2"></i>
Операции
</h5>
<div class="d-flex gap-2">
<select class="form-select form-select-sm" id="sortBy" style="width: auto;">
<option value="date">По дате</option>
<option value="type">По типу</option>
<option value="itemName">По товару</option>
<option value="quantity">По количеству</option>
</select>
<select class="form-select form-select-sm" id="sortOrder" style="width: auto;">
<option value="desc">По убыванию</option>
<option value="asc">По возрастанию</option>
</select>
</div>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover" id="operationsTable">
<thead>
<tr>
<th>Дата</th>
<th>Тип</th>
<th>Товар</th>
<th>Количество</th>
<th>Сотрудник</th>
<th>Статус</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
<!-- Данные будут загружены через JavaScript -->
</tbody>
</table>
</div>
</div>
</div>
<!-- Пагинация -->
<div class="row mt-4">
<div class="col-12">
<nav aria-label="Навигация по страницам">
<ul class="pagination justify-content-center" id="pagination">
<!-- Пагинация будет создана через JavaScript -->
</ul>
</nav>
</div>
</div>
</main>
<!-- Модальное окно деталей операции -->
<div class="modal fade" id="operationDetailsModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-info-circle me-2"></i>
Детали операции
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body" id="operationDetailsContent">
<!-- Содержимое будет загружено через JavaScript -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
</div>
</div>
</div>
</div>
<!-- Модальное окно отчета -->
<div class="modal fade" id="reportModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-chart-bar me-2"></i>
Создать отчет
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="reportForm">
<div class="row">
<div class="col-md-6 mb-3">
<label for="reportStartDate" class="form-label">Дата начала *</label>
<input type="date" class="form-control" id="reportStartDate" required>
</div>
<div class="col-md-6 mb-3">
<label for="reportEndDate" class="form-label">Дата окончания *</label>
<input type="date" class="form-control" id="reportEndDate" required>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="reportType" class="form-label">Тип отчета</label>
<select class="form-select" id="reportType">
<option value="summary">Сводный отчет</option>
<option value="detailed">Детальный отчет</option>
<option value="movement">Отчет по движению товаров</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="reportItem" class="form-label">Товар (опционально)</label>
<select class="form-select" id="reportItem">
<option value="">Все товары</option>
</select>
</div>
</div>
<div class="mb-3">
<label for="reportFormat" class="form-label">Формат отчета</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="reportFormat" id="formatCsv" value="csv" checked>
<label class="form-check-label" for="formatCsv">
CSV файл
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="reportFormat" id="formatPdf" value="pdf">
<label class="form-check-label" for="formatPdf">
PDF документ
</label>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" id="generateReportBtn">
<i class="fas fa-download me-1"></i>Создать отчет
</button>
</div>
</div>
</div>
</div>
<!-- Подвал -->
<footer class="bg-dark text-white mt-5 py-4">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>Система управления складом</h5>
<p class="mb-0">Эффективное управление товарными запасами</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">&copy; 2024 Склад-Менеджер. Все права защищены.</p>
</div>
</div>
</div>
</footer>
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/auth.js"></script>
<script src="js/warehouse.js"></script>
<script src="js/history.js"></script>
</body>
</html>

402
index.html Normal file
View File

@ -0,0 +1,402 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Система управления складом</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<!-- Навигационная панель -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="index.html">
<i class="fas fa-warehouse me-2"></i>
Склад-Менеджер
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link active" href="index.html">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="catalog.html">
<i class="fas fa-boxes me-1"></i>Каталог
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="history.html">
<i class="fas fa-history me-1"></i>История
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="search.html">
<i class="fas fa-search me-1"></i>Поиск
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown" id="adminDropdown" style="display: none;">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cog me-1"></i>Администрирование
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="admin/users.html">Управление пользователями</a></li>
<li><a class="dropdown-item" href="admin/categories.html">Категории товаров</a></li>
<li><a class="dropdown-item" href="admin/reports.html">Отчеты</a></li>
</ul>
</li>
<li class="nav-item dropdown" id="profileDropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-user me-1"></i>Профиль
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="profile.html">Мой профиль</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" id="logoutBtn">Выйти</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Основной контент -->
<main class="container mt-4">
<!-- Приветственный блок -->
<div class="row mb-4">
<div class="col-12">
<div class="card bg-gradient-primary text-white">
<div class="card-body">
<h1 class="card-title">
<i class="fas fa-warehouse me-3"></i>
Добро пожаловать в систему управления складом
</h1>
<p class="card-text">Эффективное управление товарными запасами и операциями склада</p>
</div>
</div>
</div>
</div>
<!-- Быстрые действия -->
<div class="row mb-4">
<div class="col-12">
<h2 class="mb-3">Быстрые действия</h2>
</div>
<div class="col-md-3 mb-3">
<div class="card h-100 quick-action-card">
<div class="card-body text-center">
<i class="fas fa-plus-circle fa-3x text-primary mb-3"></i>
<h5 class="card-title">Добавить товар</h5>
<p class="card-text">Добавить новый товар в каталог</p>
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addItemModal">
Добавить
</button>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card h-100 quick-action-card">
<div class="card-body text-center">
<i class="fas fa-box-open fa-3x text-success mb-3"></i>
<h5 class="card-title">Приход</h5>
<p class="card-text">Оформить приход товара</p>
<button class="btn btn-success" data-bs-toggle="modal" data-bs-target="#incomingModal">
Оформить
</button>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card h-100 quick-action-card">
<div class="card-body text-center">
<i class="fas fa-truck fa-3x text-warning mb-3"></i>
<h5 class="card-title">Расход</h5>
<p class="card-text">Оформить расход товара</p>
<button class="btn btn-warning" data-bs-toggle="modal" data-bs-target="#outgoingModal">
Оформить
</button>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card h-100 quick-action-card">
<div class="card-body text-center">
<i class="fas fa-search fa-3x text-info mb-3"></i>
<h5 class="card-title">Поиск</h5>
<p class="card-text">Найти товар или операцию</p>
<a href="search.html" class="btn btn-info">Найти</a>
</div>
</div>
</div>
</div>
<!-- Статистика -->
<div class="row mb-4">
<div class="col-12">
<h2 class="mb-3">Статистика склада</h2>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalItems">0</h4>
<p class="card-text">Всего товаров</p>
</div>
<i class="fas fa-boxes fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalValue">0 ₽</h4>
<p class="card-text">Общая стоимость</p>
</div>
<i class="fas fa-ruble-sign fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="lowStock">0</h4>
<p class="card-text">Заканчивается</p>
</div>
<i class="fas fa-exclamation-triangle fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="todayOperations">0</h4>
<p class="card-text">Операций сегодня</p>
</div>
<i class="fas fa-chart-line fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Последние операции -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title mb-0">
<i class="fas fa-clock me-2"></i>
Последние операции
</h3>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover" id="recentOperationsTable">
<thead>
<tr>
<th>Дата</th>
<th>Тип</th>
<th>Товар</th>
<th>Количество</th>
<th>Сотрудник</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
<!-- Данные будут загружены через JavaScript -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Модальные окна -->
<!-- Модальное окно добавления товара -->
<div class="modal fade" id="addItemModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-plus-circle me-2"></i>
Добавить новый товар
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="addItemForm">
<div class="row">
<div class="col-md-6 mb-3">
<label for="itemName" class="form-label">Название товара *</label>
<input type="text" class="form-control" id="itemName" required>
</div>
<div class="col-md-6 mb-3">
<label for="itemCategory" class="form-label">Категория *</label>
<select class="form-select" id="itemCategory" required>
<option value="">Выберите категорию</option>
<option value="electronics">Электроника</option>
<option value="clothing">Одежда</option>
<option value="tools">Инструменты</option>
<option value="office">Офисные принадлежности</option>
</select>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="itemPrice" class="form-label">Цена (₽) *</label>
<input type="number" class="form-control" id="itemPrice" min="0" step="0.01" required>
</div>
<div class="col-md-6 mb-3">
<label for="itemQuantity" class="form-label">Количество *</label>
<input type="number" class="form-control" id="itemQuantity" min="0" required>
</div>
</div>
<div class="mb-3">
<label for="itemDescription" class="form-label">Описание</label>
<textarea class="form-control" id="itemDescription" rows="3"></textarea>
</div>
<div class="mb-3">
<label for="itemBarcode" class="form-label">Штрих-код</label>
<input type="text" class="form-control" id="itemBarcode">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" id="saveItemBtn">
<i class="fas fa-save me-1"></i>Сохранить
</button>
</div>
</div>
</div>
</div>
<!-- Модальное окно прихода -->
<div class="modal fade" id="incomingModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-box-open me-2"></i>
Оформить приход
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="incomingForm">
<div class="mb-3">
<label for="incomingItem" class="form-label">Товар *</label>
<select class="form-select" id="incomingItem" required>
<option value="">Выберите товар</option>
</select>
</div>
<div class="mb-3">
<label for="incomingQuantity" class="form-label">Количество *</label>
<input type="number" class="form-control" id="incomingQuantity" min="1" required>
</div>
<div class="mb-3">
<label for="incomingSupplier" class="form-label">Поставщик</label>
<input type="text" class="form-control" id="incomingSupplier">
</div>
<div class="mb-3">
<label for="incomingNotes" class="form-label">Примечания</label>
<textarea class="form-control" id="incomingNotes" rows="2"></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-success" id="saveIncomingBtn">
<i class="fas fa-check me-1"></i>Оформить
</button>
</div>
</div>
</div>
</div>
<!-- Модальное окно расхода -->
<div class="modal fade" id="outgoingModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-truck me-2"></i>
Оформить расход
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="outgoingForm">
<div class="mb-3">
<label for="outgoingItem" class="form-label">Товар *</label>
<select class="form-select" id="outgoingItem" required>
<option value="">Выберите товар</option>
</select>
</div>
<div class="mb-3">
<label for="outgoingQuantity" class="form-label">Количество *</label>
<input type="number" class="form-control" id="outgoingQuantity" min="1" required>
</div>
<div class="mb-3">
<label for="outgoingRecipient" class="form-label">Получатель</label>
<input type="text" class="form-control" id="outgoingRecipient">
</div>
<div class="mb-3">
<label for="outgoingNotes" class="form-label">Примечания</label>
<textarea class="form-control" id="outgoingNotes" rows="2"></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-warning" id="saveOutgoingBtn">
<i class="fas fa-check me-1"></i>Оформить
</button>
</div>
</div>
</div>
</div>
<!-- Подвал -->
<footer class="bg-dark text-white mt-5 py-4">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>Система управления складом</h5>
<p class="mb-0">Эффективное управление товарными запасами</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">&copy; 2024 Склад-Менеджер. Все права защищены.</p>
</div>
</div>
</div>
</footer>
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/auth.js"></script>
<script src="js/main.js"></script>
<script src="js/warehouse.js"></script>
</body>
</html>

108
login.html Normal file
View File

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Вход в систему - Склад-Менеджер</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<div class="login-container">
<div class="login-card">
<div class="login-header">
<i class="fas fa-warehouse fa-3x mb-3"></i>
<h2>Склад-Менеджер</h2>
<p class="mb-0">Система управления складом</p>
</div>
<div class="login-body">
<form id="loginForm">
<div class="mb-3">
<label for="username" class="form-label">
<i class="fas fa-user me-2"></i>Имя пользователя
</label>
<input type="text" class="form-control" id="username" required>
</div>
<div class="mb-4">
<label for="password" class="form-label">
<i class="fas fa-lock me-2"></i>Пароль
</label>
<input type="password" class="form-control" id="password" required>
</div>
<button type="submit" class="btn btn-primary w-100 mb-3">
<i class="fas fa-sign-in-alt me-2"></i>Войти в систему
</button>
</form>
<!-- Информация о тестовых пользователях -->
<div class="mt-4">
<h6 class="text-muted mb-3">
<i class="fas fa-info-circle me-2"></i>Тестовые учетные записи:
</h6>
<div class="row">
<div class="col-12 mb-2">
<small class="text-muted">
<strong>Администратор:</strong> admin / admin123
</small>
</div>
<div class="col-12 mb-2">
<small class="text-muted">
<strong>Менеджер:</strong> manager / manager123
</small>
</div>
<div class="col-12 mb-2">
<small class="text-muted">
<strong>Оператор:</strong> operator / operator123
</small>
</div>
<div class="col-12">
<small class="text-muted">
<strong>Наблюдатель:</strong> viewer / viewer123
</small>
</div>
</div>
</div>
<!-- Информация о правах доступа -->
<div class="mt-4 p-3 bg-light rounded">
<h6 class="text-muted mb-2">
<i class="fas fa-shield-alt me-2"></i>Уровни доступа:
</h6>
<div class="row">
<div class="col-6">
<small class="text-muted">
<strong>Администратор:</strong><br>
Полный доступ ко всем функциям
</small>
</div>
<div class="col-6">
<small class="text-muted">
<strong>Менеджер:</strong><br>
Чтение и запись данных
</small>
</div>
<div class="col-6 mt-2">
<small class="text-muted">
<strong>Оператор:</strong><br>
Только чтение данных
</small>
</div>
<div class="col-6 mt-2">
<small class="text-muted">
<strong>Наблюдатель:</strong><br>
Ограниченный просмотр
</small>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/auth.js"></script>
</body>
</html>

400
profile.html Normal file
View File

@ -0,0 +1,400 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Профиль - Склад-Менеджер</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<!-- Навигационная панель -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="index.html">
<i class="fas fa-warehouse me-2"></i>
Склад-Менеджер
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="index.html">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="catalog.html">
<i class="fas fa-boxes me-1"></i>Каталог
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="history.html">
<i class="fas fa-history me-1"></i>История
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="search.html">
<i class="fas fa-search me-1"></i>Поиск
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown" id="adminDropdown" style="display: none;">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cog me-1"></i>Администрирование
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="admin/users.html">Управление пользователями</a></li>
<li><a class="dropdown-item" href="admin/categories.html">Категории товаров</a></li>
<li><a class="dropdown-item" href="admin/reports.html">Отчеты</a></li>
</ul>
</li>
<li class="nav-item dropdown" id="profileDropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-user me-1"></i>Профиль
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item active" href="profile.html">Мой профиль</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" id="logoutBtn">Выйти</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Заголовок профиля -->
<div class="profile-header">
<div class="container">
<div class="row align-items-center">
<div class="col-md-3 text-center">
<div class="profile-avatar">
<i class="fas fa-user"></i>
</div>
</div>
<div class="col-md-9">
<h1 id="userName">Загрузка...</h1>
<p class="mb-2" id="userPosition">Загрузка...</p>
<p class="mb-0" id="userDepartment">Загрузка...</p>
</div>
</div>
</div>
</div>
<!-- Основной контент -->
<main class="container mt-4">
<div class="row">
<!-- Боковая панель -->
<div class="col-md-3">
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-user-circle me-2"></i>
Информация
</h5>
</div>
<div class="card-body">
<div class="mb-3">
<small class="text-muted">Email</small>
<div id="userEmail">Загрузка...</div>
</div>
<div class="mb-3">
<small class="text-muted">Роли</small>
<div id="userRoles">Загрузка...</div>
</div>
<div class="mb-3">
<small class="text-muted">Разрешения</small>
<div id="userPermissions">Загрузка...</div>
</div>
<div class="mb-3">
<small class="text-muted">Дата регистрации</small>
<div id="userRegistrationDate">Загрузка...</div>
</div>
</div>
</div>
<!-- Быстрые действия -->
<div class="card mt-3">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-bolt me-2"></i>
Быстрые действия
</h5>
</div>
<div class="card-body">
<div class="d-grid gap-2">
<button class="btn btn-outline-primary btn-sm" onclick="profileManager.changePassword()">
<i class="fas fa-key me-1"></i>Сменить пароль
</button>
<button class="btn btn-outline-secondary btn-sm" onclick="profileManager.editProfile()">
<i class="fas fa-edit me-1"></i>Редактировать профиль
</button>
<button class="btn btn-outline-info btn-sm" onclick="profileManager.viewActivity()">
<i class="fas fa-chart-line me-1"></i>Моя активность
</button>
</div>
</div>
</div>
</div>
<!-- Основная область -->
<div class="col-md-9">
<!-- Статистика пользователя -->
<div class="row mb-4">
<div class="col-md-3 mb-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalOperations">0</h4>
<p class="card-text">Всего операций</p>
</div>
<i class="fas fa-list fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="thisMonthOperations">0</h4>
<p class="card-text">В этом месяце</p>
</div>
<i class="fas fa-calendar fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="todayOperations">0</h4>
<p class="card-text">Сегодня</p>
</div>
<i class="fas fa-clock fa-2x"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="lastLogin">-</h4>
<p class="card-text">Последний вход</p>
</div>
<i class="fas fa-sign-in-alt fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Последние операции пользователя -->
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-history me-2"></i>
Мои последние операции
</h5>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover" id="userOperationsTable">
<thead>
<tr>
<th>Дата</th>
<th>Тип</th>
<th>Товар</th>
<th>Количество</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
<!-- Данные будут загружены через JavaScript -->
</tbody>
</table>
</div>
</div>
</div>
<!-- Настройки -->
<div class="card mt-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-cog me-2"></i>
Настройки
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h6>Уведомления</h6>
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" id="emailNotifications" checked>
<label class="form-check-label" for="emailNotifications">
Email уведомления
</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" id="lowStockAlerts" checked>
<label class="form-check-label" for="lowStockAlerts">
Уведомления о низком запасе
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="operationReports">
<label class="form-check-label" for="operationReports">
Еженедельные отчеты
</label>
</div>
</div>
<div class="col-md-6">
<h6>Интерфейс</h6>
<div class="mb-3">
<label for="themeSelect" class="form-label">Тема оформления</label>
<select class="form-select" id="themeSelect">
<option value="light">Светлая</option>
<option value="dark">Темная</option>
<option value="auto">Автоматически</option>
</select>
</div>
<div class="mb-3">
<label for="languageSelect" class="form-label">Язык</label>
<select class="form-select" id="languageSelect">
<option value="ru">Русский</option>
<option value="en">English</option>
</select>
</div>
</div>
</div>
<div class="mt-3">
<button class="btn btn-primary" onclick="profileManager.saveSettings()">
<i class="fas fa-save me-1"></i>Сохранить настройки
</button>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Модальное окно смены пароля -->
<div class="modal fade" id="changePasswordModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-key me-2"></i>
Смена пароля
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="changePasswordForm">
<div class="mb-3">
<label for="currentPassword" class="form-label">Текущий пароль</label>
<input type="password" class="form-control" id="currentPassword" required>
</div>
<div class="mb-3">
<label for="newPassword" class="form-label">Новый пароль</label>
<input type="password" class="form-control" id="newPassword" required>
</div>
<div class="mb-3">
<label for="confirmPassword" class="form-label">Подтвердите новый пароль</label>
<input type="password" class="form-control" id="confirmPassword" required>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" onclick="profileManager.savePassword()">
<i class="fas fa-save me-1"></i>Сохранить
</button>
</div>
</div>
</div>
</div>
<!-- Модальное окно редактирования профиля -->
<div class="modal fade" id="editProfileModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-edit me-2"></i>
Редактирование профиля
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="editProfileForm">
<div class="row">
<div class="col-md-6 mb-3">
<label for="editName" class="form-label">Имя</label>
<input type="text" class="form-control" id="editName" required>
</div>
<div class="col-md-6 mb-3">
<label for="editEmail" class="form-label">Email</label>
<input type="email" class="form-control" id="editEmail" required>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="editDepartment" class="form-label">Отдел</label>
<input type="text" class="form-control" id="editDepartment">
</div>
<div class="col-md-6 mb-3">
<label for="editPosition" class="form-label">Должность</label>
<input type="text" class="form-control" id="editPosition">
</div>
</div>
<div class="mb-3">
<label for="editPhone" class="form-label">Телефон</label>
<input type="tel" class="form-control" id="editPhone">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary" onclick="profileManager.saveProfile()">
<i class="fas fa-save me-1"></i>Сохранить
</button>
</div>
</div>
</div>
</div>
<!-- Подвал -->
<footer class="bg-dark text-white mt-5 py-4">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>Система управления складом</h5>
<p class="mb-0">Эффективное управление товарными запасами</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">&copy; 2024 Склад-Менеджер. Все права защищены.</p>
</div>
</div>
</div>
</footer>
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/auth.js"></script>
<script src="js/warehouse.js"></script>
<script src="js/profile.js"></script>
</body>
</html>

292
search.html Normal file
View File

@ -0,0 +1,292 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Поиск - Склад-Менеджер</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<!-- Навигационная панель -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="index.html">
<i class="fas fa-warehouse me-2"></i>
Склад-Менеджер
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="index.html">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="catalog.html">
<i class="fas fa-boxes me-1"></i>Каталог
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="history.html">
<i class="fas fa-history me-1"></i>История
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="search.html">
<i class="fas fa-search me-1"></i>Поиск
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown" id="adminDropdown" style="display: none;">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cog me-1"></i>Администрирование
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="admin/users.html">Управление пользователями</a></li>
<li><a class="dropdown-item" href="admin/categories.html">Категории товаров</a></li>
<li><a class="dropdown-item" href="admin/reports.html">Отчеты</a></li>
</ul>
</li>
<li class="nav-item dropdown" id="profileDropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-user me-1"></i>Профиль
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="profile.html">Мой профиль</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" id="logoutBtn">Выйти</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Основной контент -->
<main class="container mt-4">
<!-- Заголовок страницы -->
<div class="row mb-4">
<div class="col-12">
<h1 class="mb-1">
<i class="fas fa-search me-2"></i>
Поиск
</h1>
<p class="text-muted mb-0">Быстрый поиск товаров и операций</p>
</div>
</div>
<!-- Поисковая форма -->
<div class="search-container">
<div class="row">
<div class="col-md-8">
<div class="input-group">
<span class="input-group-text">
<i class="fas fa-search"></i>
</span>
<input type="text" class="form-control search-input" id="searchQuery" placeholder="Введите название товара, описание, штрих-код или любые другие данные для поиска...">
<button class="btn btn-primary" type="button" id="searchBtn">
<i class="fas fa-search me-1"></i>Найти
</button>
</div>
</div>
<div class="col-md-4">
<select class="form-select" id="searchType">
<option value="all">Все</option>
<option value="items">Только товары</option>
<option value="operations">Только операции</option>
</select>
</div>
</div>
<!-- Расширенные фильтры -->
<div class="row mt-3" id="advancedFilters" style="display: none;">
<div class="col-md-3 mb-3">
<label for="categoryFilter" class="form-label">Категория товара</label>
<select class="form-select" id="categoryFilter">
<option value="">Все категории</option>
</select>
</div>
<div class="col-md-3 mb-3">
<label for="priceRange" class="form-label">Диапазон цен</label>
<div class="input-group">
<input type="number" class="form-control" id="minPrice" placeholder="От">
<span class="input-group-text">-</span>
<input type="number" class="form-control" id="maxPrice" placeholder="До">
</div>
</div>
<div class="col-md-3 mb-3">
<label for="dateRange" class="form-label">Период</label>
<div class="input-group">
<input type="date" class="form-control" id="startDate">
<span class="input-group-text">-</span>
<input type="date" class="form-control" id="endDate">
</div>
</div>
<div class="col-md-3 mb-3">
<label class="form-label">&nbsp;</label>
<div class="d-grid">
<button class="btn btn-outline-secondary" id="clearFiltersBtn">
<i class="fas fa-times me-1"></i>Очистить
</button>
</div>
</div>
</div>
<!-- Кнопка расширенных фильтров -->
<div class="row mt-3">
<div class="col-12">
<button class="btn btn-link" id="toggleAdvancedFilters">
<i class="fas fa-filter me-1"></i>Расширенные фильтры
</button>
</div>
</div>
</div>
<!-- Результаты поиска -->
<div id="searchResults" style="display: none;">
<!-- Статистика результатов -->
<div class="row mb-3">
<div class="col-12">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 id="resultsCount">Найдено результатов: 0</h5>
</div>
<div class="d-flex gap-2">
<select class="form-select form-select-sm" id="sortResults" style="width: auto;">
<option value="relevance">По релевантности</option>
<option value="name">По названию</option>
<option value="date">По дате</option>
<option value="price">По цене</option>
</select>
<button class="btn btn-outline-primary btn-sm" id="exportResultsBtn">
<i class="fas fa-download me-1"></i>Экспорт
</button>
</div>
</div>
</div>
</div>
<!-- Переключатель вкладок -->
<ul class="nav nav-tabs mb-3" id="resultsTabs">
<li class="nav-item">
<a class="nav-link active" id="items-tab" data-bs-toggle="tab" href="#itemsResults">
<i class="fas fa-boxes me-1"></i>Товары <span class="badge bg-secondary" id="itemsCount">0</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="operations-tab" data-bs-toggle="tab" href="#operationsResults">
<i class="fas fa-history me-1"></i>Операции <span class="badge bg-secondary" id="operationsCount">0</span>
</a>
</li>
</ul>
<!-- Содержимое вкладок -->
<div class="tab-content" id="resultsTabContent">
<!-- Вкладка товаров -->
<div class="tab-pane fade show active" id="itemsResults">
<div class="row" id="itemsResultsContainer">
<!-- Результаты товаров будут загружены через JavaScript -->
</div>
</div>
<!-- Вкладка операций -->
<div class="tab-pane fade" id="operationsResults">
<div class="table-responsive">
<table class="table table-hover" id="operationsResultsTable">
<thead>
<tr>
<th>Дата</th>
<th>Тип</th>
<th>Товар</th>
<th>Количество</th>
<th>Сотрудник</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
<!-- Результаты операций будут загружены через JavaScript -->
</tbody>
</table>
</div>
</div>
</div>
<!-- Пагинация -->
<div class="row mt-4">
<div class="col-12">
<nav aria-label="Навигация по результатам">
<ul class="pagination justify-content-center" id="resultsPagination">
<!-- Пагинация будет создана через JavaScript -->
</ul>
</nav>
</div>
</div>
</div>
<!-- Пустое состояние -->
<div id="emptyState" class="text-center py-5">
<i class="fas fa-search fa-3x text-muted mb-3"></i>
<h4>Начните поиск</h4>
<p class="text-muted">Введите запрос в поле поиска выше, чтобы найти товары или операции</p>
</div>
<!-- Состояние загрузки -->
<div id="loadingState" class="text-center py-5" style="display: none;">
<div class="loading-spinner text-primary mb-3"></div>
<p class="text-muted">Поиск...</p>
</div>
</main>
<!-- Модальное окно деталей товара -->
<div class="modal fade" id="itemDetailsModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-box me-2"></i>
Детали товара
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body" id="itemDetailsContent">
<!-- Содержимое будет загружено через JavaScript -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
<button type="button" class="btn btn-primary" id="editItemBtn">
<i class="fas fa-edit me-1"></i>Редактировать
</button>
</div>
</div>
</div>
</div>
<!-- Подвал -->
<footer class="bg-dark text-white mt-5 py-4">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>Система управления складом</h5>
<p class="mb-0">Эффективное управление товарными запасами</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">&copy; 2024 Склад-Менеджер. Все права защищены.</p>
</div>
</div>
</div>
</footer>
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/auth.js"></script>
<script src="js/warehouse.js"></script>
<script src="js/search.js"></script>
</body>
</html>