Маркетплейс предметов Minecraft для приватного сервера WIND.
- Авторизация только через Discord OAuth2.
- Ник на сайте автоматически синхронизируется с Discord.
- Общая онлайн-доска заявок на покупку (
взяться / вернуть / завершить / отменить). - Каталог предметов с ценами в валюте Ары.
- Базовые предметы + пользовательские товары.
- Зарегистрированные пользователи могут публиковать свои товары:
- название
- описание
- категория
- цена
- картинка (URL или загрузка файла)
- Профили игроков:
- статистика сделок
- успешные сделки
- отзывы
- Админ-функции:
- пользователь
nertin0получает рольADMIN - админ может банить/разбанивать пользователей
- админ может редактировать/удалять любые товары
- пользователь
- Next.js 14 (App Router)
- Tailwind CSS
- Lucide React
- Prisma + PostgreSQL
npm installСоздай .env на основе .env.example и заполни переменные:
DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/DBNAME?sslmode=require"
SESSION_COOKIE_NAME="wind_session"
DISCORD_CLIENT_ID="..."
DISCORD_CLIENT_SECRET="..."
DISCORD_REDIRECT_URI="http://localhost:3000/api/auth/discord/callback"
# PRISMA_DB_PUSH_ACCEPT_DATA_LOSS="false"Синхронизация схемы БД:
npm run db:pushЗапуск:
npm run dev- Залей весь проект в GitHub (без
node_modulesи.next). - Импортируй репозиторий в Vercel как Next.js проект.
- В
Project Settings -> Environment Variablesдобавь:DATABASE_URL(или подключи Vercel Postgres)SESSION_COOKIE_NAME(опционально)DISCORD_CLIENT_IDDISCORD_CLIENT_SECRETDISCORD_REDIRECT_URI(напримерhttps://your-domain.vercel.app/api/auth/discord/callback)PRISMA_DB_PUSH_ACCEPT_DATA_LOSS(опционально:true/false)
- Деплой.
buildCommand использует npm run db:push && npm run build.
Если DATABASE_URL не задан, db:push будет пропущен (с предупреждением), чтобы сборка не падала.
На Vercel db:push по умолчанию запускается с --accept-data-loss (если переменная не задана).
/— маркет/login— вход через Discord/requests— заявки на покупку/profile/[username]— профиль игрока
GET /api/auth/discordGET /api/auth/discord/callbackPOST /api/auth/logoutGET /api/auth/meGET /api/listingsPOST /api/listingsPATCH /api/listings/:idDELETE /api/listings/:idGET /api/requests?status=active|allPOST /api/requestsPOST /api/requests/:id/claimPOST /api/requests/:id/releasePOST /api/requests/:id/completePOST /api/requests/:id/cancelGET /api/profiles/:usernameGET/PATCH /api/profiles/meGET/POST /api/profiles/:username/reviewsPOST /api/admin/users/:username/ban