ImageBoard - это веб-приложение для публикации и просмотра изображений с системой рейтинга, тегов и пользовательскими профилями. Проект разработан на Node.js с использованием Express.js, MySQL и Handlebars шаблонов.
- Регистрация и аутентификация пользователей с ролевой системой (пользователь/редактор/администратор)
- Загрузка изображений с описаниями и тегами
- Галерея изображений с фильтрацией и поиском
- Система рейтинга (лайки/дизлайки) для изображений
- Управление постами (редактирование, удаление)
- Профили пользователей с персональной статистикой
- Рекламная система для показа баннеров
- Диаграммы аналитики количества постов по дням
- Экспорт данных в CSV формате
- Многоуровневая система прав доступа
- Безопасная загрузка файлов с валидацией
- Rate limiting для защиты от злоупотреблений
- Обработка ошибок с подробным логированием
- Node.js - JavaScript runtime
- Express.js - Веб-фреймворк
- MySQL - База данных
- Knex.js - SQL query builder (не используется активно)
- bcrypt - Хеширование паролей
- express-session - Управление сессиями
- multer - Загрузка файлов
- express-rate-limit - Ограничение запросов
- Handlebars (HBS) - Шаблонизатор
- Vanilla JavaScript - Клиентский JavaScript
- CSS3 - Стилизация
- D3.js - Создание диаграмм
- dotenv - Управление переменными окружения
- Nodemon - Автоматический перезапуск сервера
- ESLint - Линтинг кода
ImageBoard/
├── app.js # Главный файл приложения
├── package.json # Зависимости и скрипты
├── create_site.sql # Схема базы данных
├── middleware/ # Промежуточное ПО
│ ├── errorHandler.js # Обработка ошибок
│ ├── rateLimiter.js # Ограничение запросов
│ └── validation.js # Валидация данных
├── controllers/ # Контроллеры приложения
│ ├── homeController.js # Главная страница
│ ├── userController.js # Управление пользователями
│ ├── postController.js # Управление постами
│ ├── imageController.js # API изображений
│ └── advController.js # Рекламная система
├── routes/ # Маршрутизаторы
│ ├── homeRouter.js # Маршруты главной страницы
│ ├── userRouter.js # Маршруты пользователей
│ ├── postRouter.js # Маршруты постов
│ ├── imageRouter.js # API маршруты изображений
│ └── advRouter.js # Маршруты рекламы
├── views/ # Шаблоны Handlebars
│ ├── data.hbs # Главная страница
│ ├── post.hbs # Просмотр поста
│ ├── upload.hbs # Загрузка изображения
│ ├── auth/ # Формы аутентификации
│ └── profile/ # Страницы профиля
├── public/ # Статические файлы
│ ├── css/ # Стили
│ ├── js/ # Клиентский JavaScript
│ └── imgs/ # Изображения интерфейса
├── imgs/ # Загруженные изображения
│ ├── uploads/ # Пользовательские изображения
│ └── advertisements/ # Рекламные баннеры
├── dataBase/ # Конфигурация БД
│ └── db.js # Подключение к MySQL
├── models/ # Модели данных (пока не используется)
├── selenium_tests/ # Автоматизированные тесты
├── UnitTests/ # Модульные тесты
└── exports/ # Экспортированные файлы
- Node.js (версия 14 или выше)
- MySQL (версия 5.7 или выше)
- npm или yarn
git clone https://github.com/sava11/ImageBoard.git
cd ImageBoardnpm install# Создайте базу данных MySQL
mysql -u root -p < create_site.sqlСоздайте файл .env в корне проекта:
# Настройки базы данных
DB_HOST=localhost
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=site
# Секретный ключ для сессий и JWT
SECRET_KEY=your_super_secret_key_here
# Настройки сервера
PORT=3000
NODE_ENV=development
# Папка для загрузки изображений
UPLOAD_DIR=imgs/uploads# Режим разработки
npm start
# Или с автоматической перезагрузкой
npx nodemon app.jsСервер будет доступен по адресу: http://localhost:3000
- Пользователь (User) - базовая роль, может загружать и оценивать изображения
- Редактор (Editor) - может редактировать и удалять любые посты
- Администратор (Admin) - полный доступ ко всем функциям
После выполнения create_site.sql будут созданы следующие тестовые пользователи:
| Логин | Пароль | Роль | |
|---|---|---|---|
| user1 | 1@1 | password123 | Пользователь |
| editor1 | 2@1 | password123 | Редактор |
| admin1 | 3@1 | password123 | Администратор |
GET /user/register- Форма регистрацииPOST /user/register- Регистрация пользователяGET /user/login- Форма входаPOST /user/login- Вход в системуGET /user/:id- Просмотр профиляPOST /user/logout- Выход из системы
GET /post/upload- Форма загрузки изображенияPOST /post/upload- Загрузка изображенияGET /post/:id- Просмотр постаGET /post/edit/:id- Форма редактированияPOST /post/edit/:id- Редактирование постаGET /post/delete/:id- Удаление поста
GET /image/- Получение изображений с фильтрамиGET /image/:id- Получение файла изображенияGET /image/from-user/:id- Изображения пользователяGET /image/tags/search- Поиск тегов
GET /post/diagram- Диаграмма постов по днямGET /post/diagram-data- Данные для диаграммыGET /post/diagram-data-download- Скачать CSV
- SQL Injection защита - использование prepared statements
- XSS защита - санитизация входных данных
- CSRF защита - HttpOnly куки
- Rate limiting - ограничение количества запросов
- Валидация файлов - проверка типа и размера файлов
- Пароль хеширование - bcrypt с salt rounds
- Сессионная безопасность - secure cookies в продакшене
- API запросы: 100 запросов за 15 минут
- Аутентификация: 5 попыток за 15 минут
- Загрузка файлов: 10 файлов за час
cd UnitTests
npm install
npm test# Установите Python и Selenium
pip install selenium webdriver-manager
python selenium_tests/test.py- Database indexing - индексы на часто используемых полях
- Connection pooling - пул соединений MySQL
- File caching - кеширование статических файлов
- Lazy loading - отложенная загрузка изображений
- Error logging - подробное логирование ошибок
- Request monitoring - отслеживание запросов
- Database query optimization - оптимизированные запросы
- Создайте контроллер в папке
controllers/ - Добавьте маршруты в
routes/ - Создайте шаблоны в
views/ - Добавьте стили в
public/css/
- ES6+ синтаксис для JavaScript
- JSDoc комментарии для документирования
- async/await для асинхронных операций
- Prepared statements для SQL запросов
- Middleware pattern для переиспользуемой логики
ISC License - см. файл LICENSE для подробностей.
- sava11 - Разработчик
- Fork проект
- Создайте feature branch (
git checkout -b feature/AmazingFeature) - Commit изменения (
git commit -m 'Add some AmazingFeature') - Push в branch (
git push origin feature/AmazingFeature) - Откройте Pull Request
Если у вас возникли вопросы или проблемы:
- Проверьте Issues
- Создайте новый issue с подробным описанием проблемы
- Свяжитесь с разработчиком
Примечание: Это учебный проект для демонстрации навыков разработки веб-приложений на Node.js. Не используйте в продакшене без дополнительной настройки безопасности и оптимизации.