Job Tapper - это интерактивное приложение для автоматической отправки откликов на вакансии в форме увлекательной игры. Пользователи должны быстро нажимать на появляющиеся элементы, чтобы отправлять отклики через API HeadHunter.
Job Tapper предназначен для создания увлекательного и эффективного способа поиска работы. Комплекс объединяет игровую механику с реальным процессом отклика на вакансии, что делает поиск работы более интересным и мотивирующим. Основная цель комплекса — упростить и геймифицировать процесс отправки откликов на вакансии, повышая вовлеченность пользователей и эффективность поиска работы.
Веб-интерфейс, разработанный с использованием Vue 3 и TypeScript, предоставляет пользователю игровой интерфейс для взаимодействия с вакансиями.
Node.js сервер, обрабатывающий запросы клиента, взаимодействующий с API HeadHunter и управляющий игровой логикой.
Обеспечивает взаимодействие с API HeadHunter для получения вакансий и отправки откликов.
Отвечает за генерацию игровых элементов, подсчет очков и управление уровнями сложности.
Управляет авторизацией пользователей через HeadHunter OAuth.
Использует Socket.IO для обеспечения мгновенных обновлений игрового состояния.
Клиентское приложение предоставляет пользовательский интерфейс для игры и взаимодействия с вакансиями.
Основные компоненты:
GameView: Основной игровой экранResumeCard: Отображение информации о резюмеGameArea: Игровая область с появляющимися вакансиями
Пример использования игровой области:
<template>
<GameArea
@click="handleClick"
@vacancy-click="handleVacancyClick"
:start-countdown="startCountdown"
:get-vacancy-emoji="getVacancyEmoji"
/>
</template>Сервер обрабатывает запросы клиента, взаимодействует с API HeadHunter и управляет игровой логикой.
Основные модули:
vacancyController: Управление вакансиямиresumeController: Управление резюмеauthController: Аутентификация пользователей
Пример обработки запроса на получение похожих вакансий:
handleGetSimilarVacancies: async (socket: Socket, userSessions: Map<string, any>, data: { resumeId: string }) => {
const userData = userSessions.get(socket.id);
if (userData) {
try {
const vacancies = await vacancyService.getSimilarVacancies(userData.accessToken, data.resumeId);
socket.emit('similar-vacancies', vacancies);
} catch (error) {
console.error('Error fetching similar vacancies:', error);
socket.emit('error', { message: 'Ошибка при получении похожих вакансий' });
}
}
}- Frontend: Vue 3, TypeScript, Tailwind CSS, DaisyUI
- Backend: Node.js, Express, Socket.IO
- API: HeadHunter API
- Перейдите на официальную документацию HeadHunter API
- Зарегистрируйтесь как разработчик в личном кабинете HeadHunter
- Создайте новое приложение в разделе "Мои приложения"
- Получите
Client IDиClient Secret - Настройте
Redirect URIв соответствии с вашими доменами
-
Скопируйте файл-пример переменных окружения:
cd server cp .env.example .env -
Отредактируйте файл
.env, заполнив следующие переменные:# Обязательные переменные для работы с HeadHunter API HH_CLIENT_ID=ваш_client_id_из_hh HH_CLIENT_SECRET=ваш_client_secret_из_hh # Настройки приложения PORT=3000 CLIENT_URL=http://localhost:5173 HH_API_URL=https://api.hh.ru HH_REDIRECT_URI=http://localhost:5173/oauth/callback
-
Для разработки скопируйте файл-пример:
cd client cp .env.development.example .env.development -
Отредактируйте файл
.env.development:VITE_SERVER_URL=http://localhost:3000 VITE_HH_REDIRECT_URI=http://localhost:5173/oauth/callback
-
Для продакшн среды:
cp .env.production.example .env.production
И настройте соответствующие домены в
.env.production.
-
Перейдите в директорию клиента:
cd client -
Установите зависимости:
npm install
-
Убедитесь, что файл
.env.developmentнастроен (см. раздел "Настройка переменных окружения") -
Запустите клиент в режиме разработки:
npm run dev
-
Для запуска через Tuna (или Ngrok):
tuna http localhost:5173 --subdomain={ваш домен}
-
Перейдите в директорию сервера:
cd server -
Установите зависимости:
npm install
-
Убедитесь, что файл
.envнастроен с правильными ключами HeadHunter API (см. раздел "Настройка переменных окружения") -
Запустите сервер:
npm run dev
-
Для запуска через Tuna (или Ngrok):
tuna http localhost:3000 --subdomain={ваш домен}
- Интеграция с API HeadHunter для получения вакансий и отправки откликов
- Игровой процесс, стимулирующий быструю реакцию пользователя
- Система уровней и очков для повышения вовлеченности
- Реал-тайм обновления с использованием Socket.IO
- Убедитесь, что сервер запущен на правильном порту (по умолчанию 3000)
- Проверьте файл
.envв директорииserver/- все переменные должны быть заполнены - Проверьте файл
.env.developmentв директорииclient/- URL сервера должен быть правильным
- Убедитесь, что ключи
HH_CLIENT_IDиHH_CLIENT_SECRETкорректны - Проверьте, что
HH_REDIRECT_URIв .env файле совпадает с настройками в вашем приложении на hh.ru - Убедитесь, что ваше приложение одобрено в личном кабинете разработчика HeadHunter
- Убедитесь, что URL клиента добавлен в список разрешенных в
server/src/server.ts - При использовании доменов через Tuna/Ngrok обновите соответствующие настройки в коде
- Выполните
npm installв обеих директориях (client и server) - Убедитесь, что у вас установлена правильная версия Node.js (рекомендуется v18+)
✅ Исправлено! Все TypeScript ошибки в проекте устранены:
- Обновлена версия vue-tsc до совместимой
- Добавлен файл типов
vite-env.d.tsдля переменных окружения - Исправлена типизация в компонентах и сторах
- Проект теперь собирается без ошибок как на клиенте, так и на сервере
Job Tapper спроектирован с учетом возможности расширения функциональности. Разработчики могут создавать новые модули или расширять существующие для добавления новых возможностей.
- Создайте новую директорию в
client/src/modulesилиserver/src/modulesв зависимости от типа модуля. - Реализуйте необходимую логику и компоненты.
- Экспортируйте основные компоненты или функции модуля через
index.ts. - Интегрируйте новый модуль в основное приложение.
Мы приветствуем вклад в развитие проекта! Пожалуйста, ознакомьтесь с руководством по внесению вклада перед тем, как начать.
Этот проект лицензирован под MIT License - см. файл LICENSE для подробностей.