Shelpy помогает бездомным животным найти любящий дом. Мы объединяем информацию о питомцах из приютов по всей России: карта, каталог, фильтры, чат с приютами, пожертвования.
npm install
npm startСервер: http://localhost:3000
Пароль везде: 123456
| Роль | Приют | |
|---|---|---|
admin@laskovy.ru |
Приют | Приют «Ласковый дом» (Москва) |
admin@verny.ru |
Приют | Центр «Верный друг» (СПб) |
admin@kotopes.ru |
Приют | Фонд «КотоПёс» (Казань) |
user@demo.ru |
Пользователь | Демо-пользователь |
| Слой | Технология |
|---|---|
| Backend | Node.js + Express 4.21 |
| Хранение | JSON-файлы (data/) — легко мигрировать на SQLite/PostgreSQL |
| Безопасность | bcryptjs (хеширование паролей), Helmet, rate-limit, валидация |
| Фронтенд | Vanilla JS SPA, Tailwind CSS (CDN), Leaflet (карты) |
| Загрузка | Multer (изображения питомцев) |
Shelpy/
├── server.js # Точка входа — Express-сервер
├── .env / .env.example # Переменные окружения (PORT, NODE_ENV)
├── data/ # JSON-хранилище (персистентные данные)
├── src/
│ ├── config/db.js # Слой доступа к данным (JSON-read/write API)
│ ├── middleware/
│ │ ├── auth.js # Аутентификация (shelter/user/chat)
│ │ ├── rateLimiter.js # Rate-limiting для логина
│ │ └── upload.js # Multer — загрузка фото
│ ├── routes/
│ │ ├── auth.js # /api/auth/* — логин, регистрация, профиль
│ │ ├── shelters.js # /api/shelters/* — список и детали приютов
│ │ ├── pets.js # /api/pets/* — CRUD питомцев + upload
│ │ ├── favorites.js # /api/users/favorites/* — избранное
│ │ ├── chat.js # /api/chats/* — чат (отправка, удаление, правка)
│ │ └── donate.js # /api/donate — пожертвования (заглушка)
│ ├── validators/index.js # Валидация email, телефона, паролей
│ └── seed.js # Заполнение тестовыми данными (26 приютов, 21 питомец)
├── public/
│ └── index.html # SPA-фронтенд (Vanilla JS, Tailwind, Leaflet)
├── Images/ # Статические изображения (лого, иконки, фото)
├── Fonts/ # Шрифты (Akt, Russo One, Playpen Sans)
├── Sounds/ # Звуки животных (для peeking animals)
└── uploads/ # Загруженные пользователями фото
POST /api/auth/login— вход приюта{email, password}→{token, shelter}POST /api/auth/register— регистрация приютаPOST /api/auth/user/login— вход пользователяPOST /api/auth/user/register— регистрация пользователяGET /api/auth/me— текущий профиль (auth)PUT /api/auth/me— редактирование профиля (auth)
GET /api/shelters— список всех приютовGET /api/shelters/:id— детали приюта
GET /api/pets?type=dog&breed=хаски&maxAge=12&shelterId=1— с фильтрамиGET /api/pets/:id— детали питомцаPOST /api/pets— добавить питомца (auth)PATCH /api/pets/:id/status— сменить статус (available/adopted)
GET /api/chats— список чатовGET /api/chats/:role/:id— история сообщенийPOST /api/chats— отправить сообщениеPATCH /api/chats/message/:id— редактироватьDELETE /api/chats/message/:id— удалить сообщение
POST /api/users/favorites— добавить в избранноеDELETE /api/users/favorites/:type/:id— убрать из избранногоPOST /api/donate— пожертвованиеPOST /api/upload— загрузка фото (auth)
Hash-based роутинг:
#catalog— карта + список приютов с поиском по городам#shelter/:id— страница приюта с фильтрами питомцев#pet/:id— карточка питомца#dashboard— личный кабинет (приют или пользователь)#chats— чаты с приютами#about— о проекте
Фичи: тёмная тема, Liquid Glass UI, кастомный курсор-лапка, «выглядывающие» питомцы со звуками, анимации раскрытия, донаты.
- Пароли хешируются через bcryptjs (10 раундов)
- Helmet — защитные HTTP-заголовки
- Rate-limit на логин (10 попыток / 15 мин)
- Валидация всех входных данных (email, телефон, длина строк)
multerс ограничением размера и типов файлов- Переменные окружения через
.env
# Запуск
npm start
# Пересоздать тестовые данные (удалить data/*.json и перезапустить)
rm data/*.json && npm startMIT. Создано с ❤️ для хакатона.