Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
스페인 중고차 정보 카드, 엔진·고장·정비·실제 비용 제공, 브랜드·모델·세대·엔진코드로 검색
Fichas de coches usados en España con motores, averías conocidas, mantenimiento y coste real. Busca por marca, modelo, generación o código de motor.
커머스TypeScript · PLpgSQLGitHub @aamracorporation-gif온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기WEB + Adsense
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Base de conocimiento navegable sobre coches usados en España: buscar, entender, comparar y calcular. No es un blog: es un producto de datos estructurados con fuentes, herramientas y navegación por vehículo. Construido a partir del Plan Maestro CocheClaro (SEO orgánico → AdSense + afiliación). Nombre y marca provisionales. Validar antes de uso comercial.README 전문 보기 ↗
Base de conocimiento navegable sobre coches usados en España: buscar, entender, comparar y calcular. No es un blog: es un producto de datos estructurados con fuentes, herramientas y navegación por vehículo.
Construido a partir del Plan Maestro CocheClaro (SEO orgánico → AdSense + afiliación).
Nombre y marca provisionales. Validar antes de uso comercial.
qué motor lleva un golf 8).RECALLS_ENABLED=false.generateMetadata por entidad, canonical absoluto,
breadcrumbs + JSON-LD (Organization, WebSite, BreadcrumbList, FAQPage,
Article solo en comparativas), sitemap.xml solo con contenido publicado,
robots.txt, noindex en búsqueda/filtros/admin, 404 real.<AdSlot> con dimensiones reservadas (sin CLS),
desactivado por defecto (NEXT_PUBLIC_ADS_ENABLED=false) y que solo carga
el script real de AdSense cuando además hay NEXT_PUBLIC_ADSENSE_CLIENT
configurado y el usuario ha aceptado en <ConsentBanner>. Incluye
/ads.txt generado desde el publisher id.src/lib/consent.ts). Sustitúyelo por una CMP certificada (Google CMP
/ TCF) antes de activar anuncios personalizados en el EEE./admin, noindex, protegido por contraseña vía
middleware.ts + ADMIN_PASSWORD): estado del dataset y validaciones
siempre; con DATA_PROVIDER=supabase además CRUD real (generaciones,
averías, fuentes, comparativas) con flujo draft → needs_review → published, e importación CSV por lotes con preview y validación Zod.Next.js 15 (App Router, RSC) · TypeScript strict · Tailwind CSS · Zod · Vitest ·
Playwright. Datos: proveedor local (src/data/*.ts, por defecto) o
Supabase/PostgreSQL (src/lib/db/supabase.ts) conmutando con
DATA_PROVIDER (ver ARCHITECTURE.md).
npm install
cp .env.example .env.local
Edita .env.local y define al menos ADMIN_PASSWORD y ADMIN_SESSION_SECRET
(genera este último con openssl rand -base64 32) para poder entrar en
/admin. El resto de variables son opcionales para desarrollar: el dataset de
demostración vive en el repositorio y no hace falta ninguna base de datos.
npm run dev # http://localhost:3000
| Comando | Qué hace |
|---|---|
npm run dev | Servidor de desarrollo |
npm run build / npm start | Build de producción y arranque |
npm run typecheck | tsc --noEmit (strict) |
npm run lint | ESLint (config de Next) |
npm test | Tests unitarios (Vitest) |
npm run test:e2e | Tests E2E (Playwright; hace build + start) |
npm run data:validate | Valida el dataset (integridad, slugs, fuentes). Sale con código 1 si hay errores. |
npm run db:seed:generate | Genera supabase/seed/seed_demo.sql a partir de src/data/*.ts, para arrancar un proyecto Supabase nuevo con el mismo dataset de demostración. |
Regla de oro (§8 del Plan Maestro): no se inventan datos de coches. El dataset
incluido está marcado como dataStatus: "demo" y se muestra con un aviso visible.
Sustitúyelo por datos verificados con fuente antes de publicar en producción.
src/data/*.ts. Cada dato crítico debería apuntar a una source.npm run data:validate antes de subir cambios.draft → needs_review → published. Solo published genera URL
indexable y entra en el sitemap.DATA_IMPORT_TEMPLATE.csv
(también servida en /DATA_IMPORT_TEMPLATE.csv una vez desplegado). La
importación CSV de /admin/importar soporta hoy known_issue y
maintenance_item; otros tipos de fila se avisan pero no bloquean el resto
del fichero (edítalos con sus formularios dedicados).Ver .env.example. Las claves:
NEXT_PUBLIC_SITE_URL — URL canónica (metadatos, sitemap, JSON-LD).NEXT_PUBLIC_ADS_ENABLED / NEXT_PUBLIC_ADSENSE_CLIENT — anuncios
desactivados por defecto; con ambas puestas y consentimiento aceptado,
<AdSlot> carga el script real de AdSense.DATA_PROVIDER — local (por defecto, sin dependencias) o supabase.NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY /
SUPABASE_SERVICE_ROLE_KEY — solo si DATA_PROVIDER=supabase. La service
role key es secreta (bypassa RLS) y solo la usan las Server Actions de
/admin; nunca la prefijes con NEXT_PUBLIC_.ADMIN_PASSWORD / ADMIN_SESSION_SECRET — obligatorias para entrar en
/admin (protegido por middleware.ts, independientemente del proveedor de
datos). Sin ellas el login siempre falla; el panel no queda abierto.supabase/migrations/0001_init.sql (esquema +
Row Level Security: la clave anónima solo puede leer contenido
published).npm run db:seed:generate
psql "$DATABASE_URL" -f supabase/seed/seed_demo.sql
# o pega supabase/seed/seed_demo.sql en el editor SQL de Supabase
.env.local, pon DATA_PROVIDER=supabase y las tres claves de Supabase
(URL, anon key, service role key — esta última desde Project Settings →
API, y solo en el servidor de despliegue, nunca en el repositorio).npm run dev o vuelve a desplegar). El panel /admin pasa de
solo lectura a tener CRUD real: generaciones, averías, fuentes,
comparativas e importación CSV.dataStatus: "demo") por datos
verificados con fuente, uno a uno, antes de considerar el sitio listo para
producción (§8 del Plan Maestro: nunca presentes una avería como "común"
sin evidencia suficiente).npm run build debe pasar sin errores de TypeScript.NEXT_PUBLIC_SITE_URL con el dominio real y genera
ADMIN_PASSWORD / ADMIN_SESSION_SECRET de producción (distintos de los
de desarrollo).sitemap.xml.NEXT_PUBLIC_ADS_ENABLED=true): integra una
CMP certificada (Google CMP u otra compatible con TCF de IAB) en lugar del
<ConsentBanner> de ejemplo, añade tu NEXT_PUBLIC_ADSENSE_CLIENT
(ca-pub-...) para que /ads.txt se genere solo, y solicita la revisión
de AdSense con el dominio ya en producción.npm run build, npm test y una revisión manual en móvil sin errores.middleware.ts + ADMIN_PASSWORD).
Antes era de acceso público sin autenticación.src/lib/db/supabase.ts) + esquema SQL con
RLS (supabase/migrations/0001_init.sql) + generador de seed
(npm run db:seed:generate). El buscador (src/lib/search.ts) también
funciona sobre Supabase, no solo en local.scripts/seed-supabase.ts,
DATA_PROVIDER=supabase activo en Vercel. cocheclaro.vercel.app ya lee
de Postgres, no del código./admin con DATA_PROVIDER=supabase: generaciones y
comparativas (publicar/despublicar), averías y fuentes (crear/editar),
con Server Actions + Zod./admin/importar) para averías y mantenimiento, con
preview, avisos/errores por fila y validación Zod — probada con
DATA_IMPORT_TEMPLATE.csv real. Otros tipos de entidad quedan para los
formularios dedicados.<AdSlot> carga el script real de AdSense (gate: activado + client id +
consentimiento) y /ads.txt se genera desde el publisher id.generation_engines desde el panel (hoy
se gestionan por SQL directo o reimportando el seed). Es la pieza que
falta para no tocar código en ningún caso.Consulta ARCHITECTURE.md y SEO_CHECKLIST.md.
<ConsentBanner> actual es
un ejemplo funcional, no una CMP conforme a TCF).