- Добавлена кнопка открытия слайдера (☰) на мобильных устройствах - Реализован удобный боковой слайдер для мобильной версии - Слайдер содержит полностью функциональный календарь с навигацией - Поле поиска синхронизировано с ПК версией - Теги отображаются с количеством заметок - Возможность закрытия слайдера кнопкой или оверлеем - Все функции работают как в ПК версии - Добавлена синхронизация между мобильным и ПК календарями - Обновлена документация README с описанием мобильной версии
268 lines
14 KiB
Markdown
268 lines
14 KiB
Markdown
# NoteJS - Приложение для быстрых заметок
|
||
|
||
Простое веб-приложение для создания и управления заметками с поддержкой Markdown форматирования и системой аутентификации.
|
||
|
||
## Особенности
|
||
|
||
- 🚀 Создано на Node.js + Express
|
||
- 🔐 **Система регистрации и авторизации по логину и паролю**
|
||
- 🔒 Безопасное хранение паролей с bcrypt хешированием
|
||
- 💾 Хранение данных в SQLite базе данных
|
||
- 👥 **Изолированные заметки - каждый пользователь видит только свои заметки**
|
||
- 👤 **Личный кабинет с возможностью загрузки аватарки** (NEW!)
|
||
- 🖼️ **Управление аватаркой: загрузка, удаление, предварительный просмотр** (NEW!)
|
||
- 📝 Поддержка Markdown форматирования
|
||
- 🏷️ **Система тегов с автоматическим извлечением из заметок** (NEW!)
|
||
- 🔍 **Поиск по заметкам с подсветкой результатов** (NEW!)
|
||
- 📅 **Мини-календарь для навигации по датам заметок** (NEW!)
|
||
- 📱 **Адаптивный дизайн с боковым слайдером на мобильных** (NEW!)
|
||
- ☰ **Мобильный боковой слайдер с календарём, поиском и тегами** (NEW!)
|
||
- 🎨 Простой и интуитивный интерфейс
|
||
- 📱 Адаптивный дизайн
|
||
|
||
## Установка и запуск
|
||
|
||
### Предварительные требования
|
||
|
||
- Node.js (версия 14 или выше)
|
||
- npm
|
||
|
||
### Установка
|
||
|
||
1. Клонируйте репозиторий:
|
||
|
||
```bash
|
||
git clone <repository-url>
|
||
cd NoteJS
|
||
```
|
||
|
||
2. Установите зависимости:
|
||
|
||
```bash
|
||
npm install
|
||
```
|
||
|
||
3. Настройте переменные окружения:
|
||
- Откройте файл `.env`
|
||
- Установите секрет сессии в переменной `SESSION_SECRET`
|
||
- Установите порт в переменной `PORT` (по умолчанию 3000)
|
||
|
||
Пример файла `.env`:
|
||
|
||
```env
|
||
SESSION_SECRET=your_session_secret_here
|
||
PORT=3000
|
||
```
|
||
|
||
4. Запустите сервер:
|
||
|
||
```bash
|
||
npm start
|
||
```
|
||
|
||
5. Откройте браузер и перейдите по адресу `http://localhost:3000`
|
||
|
||
## Использование
|
||
|
||
### Регистрация
|
||
|
||
1. Нажмите на ссылку "Зарегистрируйтесь" на странице входа
|
||
2. Заполните форму регистрации:
|
||
- **Логин**: минимум 3 символа
|
||
- **Пароль**: минимум 6 символов
|
||
- **Подтвердите пароль**: повторите пароль
|
||
3. Нажмите кнопку "Зарегистрироваться"
|
||
4. Вы будете автоматически залогинены и перенаправлены на страницу заметок
|
||
|
||
### Вход в систему
|
||
|
||
1. Введите ваш логин
|
||
2. Введите ваш пароль
|
||
3. Нажмите кнопку "Войти"
|
||
4. После успешного входа вы попадете в интерфейс заметок
|
||
|
||
### Создание заметок
|
||
|
||
1. Введите текст заметки в поле ввода
|
||
2. Используйте кнопки форматирования для добавления Markdown элементов:
|
||
- **B** - жирный текст
|
||
- _I_ - курсив
|
||
- H - заголовок
|
||
- 📋 - элемент списка
|
||
- " - цитата
|
||
- `</>` - код
|
||
- 🔗 - ссылка
|
||
3. Нажмите кнопку "Сохранить"
|
||
|
||
### Редактирование заметок
|
||
|
||
1. Нажмите кнопку "Редактировать" рядом с заметкой
|
||
2. Отредактируйте текст в появившемся поле ввода
|
||
3. Нажмите кнопку "Сохранить"
|
||
|
||
### Удаление заметок
|
||
|
||
1. Нажмите кнопку "Удалить" рядом с заметкой
|
||
2. Подтвердите удаление в появившемся диалоговом окне
|
||
|
||
### Личный кабинет
|
||
|
||
1. Нажмите на ваше имя пользователя в верхней части страницы заметок
|
||
2. В личном кабинете вы можете:
|
||
- **Загрузить аватарку**: нажмите "Загрузить аватар" и выберите изображение (JPG, PNG, GIF до 5 МБ)
|
||
- **Удалить аватарку**: нажмите кнопку "Удалить" рядом с аватаркой
|
||
- **Изменить данные профиля**: отредактируйте логин и email
|
||
- **Изменить пароль**: введите текущий пароль и новый пароль
|
||
|
||
### Поиск и фильтрация
|
||
|
||
1. **Поиск по заметкам**: используйте поле поиска в левой панели для поиска по содержимому заметок
|
||
2. **Фильтрация по тегам**: кликайте на теги в левой панели для фильтрации заметок
|
||
3. **Навигация по календарю**: кликайте на даты в мини-календаре для просмотра заметок за определенный день
|
||
|
||
### Теги
|
||
|
||
- Теги автоматически извлекаются из заметок при использовании символа `#` (например: `#важное`)
|
||
- Теги отображаются в левой панели с количеством заметок
|
||
- Кликабельные теги в заметках позволяют быстро фильтровать контент
|
||
|
||
### Выход из системы
|
||
|
||
Нажмите кнопку "🚪 Выйти" в верхней части страницы заметок
|
||
|
||
## Мобильная версия
|
||
|
||
### Боковой слайдер на мобильных устройствах
|
||
|
||
На мобильных устройствах (ширина экрана до 768 пикселей) вместо постоянной левой панели появляется удобный **боковой слайдер** с кнопкой "☰" в левом верхнем углу.
|
||
|
||
**Функциональность мобильного слайдера:**
|
||
|
||
1. **Кнопка открытия** - нажмите на кнопку "☰" в левом верхнем углу экрана
|
||
2. **Содержимое слайдера** включает все основные инструменты:
|
||
- 📅 **Календарь** - полностью функциональный календарь месяца с навигацией
|
||
- 🔍 **Поле поиска** - синхронизировано с основным полем поиска
|
||
- 🏷️ **Теги** - все теги с количеством заметок
|
||
3. **Закрытие слайдера**:
|
||
- Нажмите кнопку ✕ в верхнем правом углу слайдера
|
||
- Нажмите на серую область (оверлей) справа
|
||
4. **Синхронизация** - изменения в слайдере (выбор даты, ввод текста, клик на тег) автоматически синхронизируются с основной ПК версией
|
||
|
||
**Преимущества мобильного слайдера:**
|
||
|
||
- ✅ Полная функциональность как в ПК версии
|
||
- ✅ Экономия места на экране мобильного устройства
|
||
- ✅ Легкое открытие/закрытие
|
||
- ✅ Удобная навигация по заметкам
|
||
- ✅ Не блокирует контент при открытии (использует оверлей)
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
NoteJS/
|
||
├── public/ # Статические файлы (клиентская часть)
|
||
│ ├── index.html # Страница входа
|
||
│ ├── register.html # Страница регистрации
|
||
│ ├── notes.html # Страница заметок
|
||
│ ├── profile.html # Страница личного кабинета (NEW!)
|
||
│ ├── login.js # Логика входа
|
||
│ ├── register.js # Логика регистрации
|
||
│ ├── profile.js # Логика личного кабинета (NEW!)
|
||
│ ├── app.js # Клиентский JavaScript (обновлен)
|
||
│ ├── style.css # Стили (обновлены)
|
||
│ └── uploads/ # Загруженные аватарки пользователей (NEW!)
|
||
├── server.js # Express сервер (обновлен)
|
||
├── .env # Конфигурация (не включать в git!)
|
||
├── .gitignore # Исключения для git (обновлен)
|
||
├── package.json # Зависимости проекта
|
||
├── notes.db # SQLite база данных (создается автоматически)
|
||
└── README.md # Документация
|
||
```
|
||
|
||
## API Endpoints
|
||
|
||
### Аутентификация
|
||
|
||
- `GET /` - страница входа
|
||
- `GET /register` - страница регистрации
|
||
- `POST /api/register` - регистрация нового пользователя
|
||
- `POST /api/login` - вход в систему
|
||
- `POST /logout` - выход из системы
|
||
- `GET /api/user` - получить информацию о текущем пользователе (требует аутентификации)
|
||
|
||
### Профиль пользователя (требует аутентификации)
|
||
|
||
- `GET /profile` - страница личного кабинета
|
||
- `PUT /api/user/profile` - обновить данные профиля или пароль
|
||
- `POST /api/user/avatar` - загрузить аватарку
|
||
- `DELETE /api/user/avatar` - удалить аватарку
|
||
|
||
### Заметки (требуют аутентификации)
|
||
|
||
- `GET /notes` - страница заметок
|
||
- `GET /api/notes` - получить все заметки пользователя
|
||
- `POST /api/notes` - создать новую заметку
|
||
- `PUT /api/notes/:id` - обновить заметку
|
||
- `DELETE /api/notes/:id` - удалить заметку
|
||
|
||
## Безопасность
|
||
|
||
- **Bcrypt хеширование** паролей при сохранении
|
||
- **Сессионная аутентификация** с express-session
|
||
- **Helmet** для защиты от распространенных уязвимостей
|
||
- **CORS** конфигурация
|
||
- **Body Parser** для безопасной обработки запросов
|
||
- **Multer** для безопасной загрузки файлов с валидацией
|
||
- Защищенные маршруты с проверкой аутентификации
|
||
- **Валидация загружаемых файлов**: проверка типа, размера и формата
|
||
- **Изоляция данных**: каждый пользователь видит только свои заметки и файлы
|
||
|
||
## Требования к паролям
|
||
|
||
- Минимум 6 символов при регистрации
|
||
- Пароли хешируются с использованием bcrypt (стандарт раундов: 10)
|
||
- Пароли не могут быть восстановлены из БД
|
||
|
||
## Требования к логину
|
||
|
||
- Минимум 3 символа
|
||
- Должен быть уникальным (нельзя создать два аккаунта с одинаковым логином)
|
||
|
||
## Требования к аватаркам
|
||
|
||
- **Максимальный размер**: 5 МБ
|
||
- **Поддерживаемые форматы**: JPG, PNG, GIF
|
||
- **Автоматическое изменение размера**: изображения автоматически обрезаются до квадратного формата
|
||
- **Безопасность**: проверка типа файла и размера перед загрузкой
|
||
|
||
## Разработка
|
||
|
||
Для разработки используйте:
|
||
|
||
```bash
|
||
npm run dev
|
||
```
|
||
|
||
Этот скрипт использует **nodemon** для автоматической перезагрузки сервера при изменении файлов. Больше не нужно вручную перезапускать сервер при каждом изменении кода!
|
||
|
||
## Лицензия
|
||
|
||
Этот проект создан Fovway.
|
||
|
||
## Календарь
|
||
|
||
На странице заметок слева расположен интерактивный календарь, который позволяет:
|
||
|
||
- 📅 **Просмотреть текущий месяц** с выделением сегодняшней даты
|
||
- ◀️ **Переключаться между месяцами** с помощью кнопок навигации
|
||
- 🔗 **Выбирать даты** для фильтрации заметок (функция может быть расширена)
|
||
- 📱 **Адаптивность** - на мобильных устройствах календарь располагается на всю ширину выше формы
|
||
|
||
### Характеристики календаря
|
||
|
||
- Сегодняшний день выделен синим цветом
|
||
- Выбранный день отмечен зелёным цветом
|
||
- Дни из соседних месяцев отображаются серым цветом
|
||
- Календарь использует русские названия месяцев и дней недели
|
||
- Полностью функционален без необходимости в дополнительных библиотеках
|