feat: LocalPro Finder — продакшн проект (отзывы, рейтинги, чат, AI-оценка, диагностика, подписки)

This commit is contained in:
2026-07-03 14:39:56 +00:00
commit d85c2051b9
22 changed files with 1390 additions and 0 deletions
+6
View File
@@ -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"
+23
View File
@@ -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"
}
}
+77
View File
@@ -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>
)
}