feat: LocalPro Finder — продакшн проект (отзывы, рейтинги, чат, AI-оценка, диагностика, подписки)
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
# LocalPro Finder — Frontend .env
|
||||
|
||||
NEXT_PUBLIC_API_URL="http://localhost:8000/api/v1"
|
||||
NEXT_PUBLIC_WS_URL="ws://localhost:8000/ws"
|
||||
NEXT_PUBLIC_APP_NAME="LocalPro Finder"
|
||||
NEXT_PUBLIC_VERSION="1.0.0"
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "localpro-frontend",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev -p 3000",
|
||||
"build": "next build",
|
||||
"start": "next start"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tanstack/react-query": "^5.62.11",
|
||||
"axios": "^1.7.9",
|
||||
"date-fns": "^4.1.0",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"socket.io-client": "^4.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.3.12",
|
||||
"next": "^15.0.3",
|
||||
"typescript": "^5.6.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import React from 'react'
|
||||
import { Star, MessageCircle, Clock, ShieldCheck } from 'lucide-react'
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<div className="min-h-screen bg-gradient-to-b from-blue-50 to-white">
|
||||
{/* Hero */}
|
||||
<section className="py-20 px-4 text-center">
|
||||
<h1 className="text-5xl font-bold mb-6">Мастер за час</h1>
|
||||
<p className="text-xl text-gray-600 max-w-2xl mx-auto mb-8">
|
||||
Найдите проверенного мастера за 3 минуты. AI-оценка стоимости, реальные отзывы, гарантия качества.
|
||||
</p>
|
||||
<button className="bg-blue-600 text-white px-8 py-4 rounded-xl text-lg font-semibold hover:bg-blue-700 transition">
|
||||
Найти мастера
|
||||
</button>
|
||||
</section>
|
||||
|
||||
{/* Features */}
|
||||
<section className="py-16 px-4 max-w-5xl mx-auto grid md:grid-cols-2 gap-8">
|
||||
{[
|
||||
{ icon: Star, title: 'Верифицированные отзывы', desc: 'Только после работы. AI-модерация.' },
|
||||
{ icon: MessageCircle, title: 'Чат с мастером', desc: 'Голосовые сообщения и фото процесса.' },
|
||||
{ icon: Clock, title: 'AI-оценка стоимости', desc: 'Узнайте цену до выезда мастера.' },
|
||||
{ icon: ShieldCheck, title: 'Подписка на обслуживание', desc: 'Базовый / Стандарт / Премиум.' },
|
||||
].map((f) => (
|
||||
<div key={f.title} className="p-6 rounded-xl bg-white shadow-sm">
|
||||
<f.icon className="w-8 h-8 text-blue-600 mb-4" />
|
||||
<h3 className="text-lg font-semibold mb-2">{f.title}</h3>
|
||||
<p className="text-gray-500">{f.desc}</p>
|
||||
</div>
|
||||
))}
|
||||
</section>
|
||||
|
||||
{/* Reviews */}
|
||||
<section className="py-16 px-4 max-w-5xl mx-auto">
|
||||
<h2 className="text-3xl font-bold text-center mb-8">Отзывы клиентов</h2>
|
||||
{[
|
||||
{ name: 'Ирина', rating: 5, text: 'Дмитрий прислал подробный перечень работ с ценами. Одно из самых выгодных предложений!' },
|
||||
{ name: 'Марина', rating: 4, text: 'Сделал всё быстро и профессионально, учёл все пожелания.' },
|
||||
].map((r) => (
|
||||
<div key={r.name} className="mb-6 p-6 rounded-xl bg-white shadow-sm">
|
||||
<div className="flex items-center mb-2">
|
||||
{[...Array(r.rating)].map((_, i) => <Star key={i} className="w-4 h-4 text-yellow-500 fill-current" />)}
|
||||
<span className="ml-3 font-semibold">{r.name}</span>
|
||||
</div>
|
||||
<p className="text-gray-600">{r.text}</p>
|
||||
</div>
|
||||
))}
|
||||
</section>
|
||||
|
||||
{/* Pricing */}
|
||||
<section className="py-16 px-4 max-w-5xl mx-auto">
|
||||
<h2 className="text-3xl font-bold text-center mb-8">Подписка на обслуживание</h2>
|
||||
<div className="grid md:grid-cols-3 gap-6">
|
||||
{[
|
||||
{ name: 'Базовый', price: 990, visits: 1, discount: 10 },
|
||||
{ name: 'Стандарт', price: 2490, visits: 3, discount: 20 },
|
||||
{ name: 'Премиум', price: 4990, visits: -1, discount: 30 },
|
||||
].map((p) => (
|
||||
<div key={p.name} className="p-6 rounded-xl bg-white shadow-sm text-center">
|
||||
<h3 className="text-lg font-semibold mb-2">{p.name}</h3>
|
||||
<p className="text-3xl font-bold mb-4">{p.price}₽/мес</p>
|
||||
<ul className="space-y-2 text-gray-600">
|
||||
{p.visits > 0 && <li>{p.visits} выезда в месяц</li>}
|
||||
{p.visits === -1 && <li>Безлимитные выезды</li>}
|
||||
<li>Скидка на доп. работы: {p.discount}%</li>
|
||||
</ul>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Footer */}
|
||||
<footer className="py-8 text-center text-gray-400">© 2026 LocalPro Finder. Все права защищены.</footer>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user