feat(landing): ссылка на сайт продукта и реквизиты компании в подвале
Нужно для подтверждения принадлежности сайта компании: по реквизитам организацию проверяют контрагенты и магазины приложений, а ссылка связывает ООО «Умный Байт» с его продуктом АгроТО. - products.site_url (миграция 003), отдаётся в /api/content; - в карточке продукта — ссылка на сайт; - в подвале — ИНН, КПП, ОГРН, юр. адрес, генеральный директор, почта и телефон. Значения лежат в settings, правятся через админку без пересборки.
This commit is contained in:
@@ -14,7 +14,7 @@ publicRouter.get('/content', async (_req, res) => {
|
||||
),
|
||||
query<unknown>(
|
||||
`SELECT id, slug, title, subtitle, description,
|
||||
status, audience, icon_key, tags, sort_order
|
||||
status, audience, icon_key, tags, sort_order, site_url
|
||||
FROM products
|
||||
WHERE is_published = true
|
||||
ORDER BY sort_order ASC`
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
-- Ссылка на сайт продукта и реквизиты компании в подвале.
|
||||
-- Зачем: Apple при регистрации организации проверяет, что сайт принадлежит
|
||||
-- компании (реквизиты) и что продукт с ней связан (ссылка на agroto.ru).
|
||||
|
||||
ALTER TABLE products ADD COLUMN IF NOT EXISTS site_url VARCHAR(256);
|
||||
|
||||
UPDATE products SET site_url = 'https://agroto.ru' WHERE slug = 'agroto' AND site_url IS NULL;
|
||||
|
||||
INSERT INTO settings (key, value) VALUES
|
||||
('company_inn', '3528347856'),
|
||||
('company_kpp', '352801001'),
|
||||
('company_ogrn', '1263500003667'),
|
||||
('company_address', '162620, Вологодская обл., г. Череповец, ул. Центральная, д. 12'),
|
||||
('company_director', 'Блюма Сергей Николаевич')
|
||||
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = now();
|
||||
@@ -3,6 +3,7 @@ const API_BASE = import.meta.env.VITE_API_URL || '';
|
||||
export interface Product {
|
||||
id: number;
|
||||
slug: string;
|
||||
site_url?: string | null;
|
||||
title: string;
|
||||
subtitle: string | null;
|
||||
description: string;
|
||||
|
||||
@@ -133,6 +133,17 @@ export function Landing() {
|
||||
<span key={tag} className="text-xs bg-white border border-slate-200 px-2 py-1 rounded text-slate-600">{tag}</span>
|
||||
))}
|
||||
</div>
|
||||
{p.site_url && (
|
||||
<a
|
||||
href={p.site_url}
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
className="inline-flex items-center gap-1.5 mt-5 text-sm font-medium text-brand-900 border-b border-brand-900/30 hover:border-brand-900 transition-colors"
|
||||
>
|
||||
{p.site_url.replace(/^https?:\/\//, '')}
|
||||
<ArrowRightIcon size={14} />
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
@@ -184,12 +195,37 @@ export function Landing() {
|
||||
</section>
|
||||
|
||||
<footer className="bg-slate-50 py-7 border-t border-slate-200">
|
||||
<div className="container-x flex flex-wrap gap-3 justify-between items-center">
|
||||
<div className="flex items-center gap-2">
|
||||
<Logo size={20} />
|
||||
<span className="text-xs text-slate-600">© {new Date().getFullYear()} {settings.company_name_full || 'ООО «Умный Байт»'}</span>
|
||||
<div className="container-x">
|
||||
<div className="flex flex-wrap gap-3 justify-between items-center">
|
||||
<div className="flex items-center gap-2">
|
||||
<Logo size={20} />
|
||||
<span className="text-xs text-slate-600">© {new Date().getFullYear()} {settings.company_name_full || 'ООО «Умный Байт»'}</span>
|
||||
</div>
|
||||
<div className="text-xs text-slate-500">{settings.domain || 'umbyte.ru'} · {settings.region || 'Россия'}</div>
|
||||
</div>
|
||||
<div className="text-xs text-slate-500">{settings.domain || 'umbyte.ru'} · {settings.region || 'Россия'}</div>
|
||||
|
||||
{/* Реквизиты. Нужны, чтобы сайт подтверждал принадлежность компании:
|
||||
по ним проверяют организацию — от контрагентов до магазинов приложений. */}
|
||||
{(settings.company_inn || settings.company_ogrn) && (
|
||||
<div className="mt-5 pt-5 border-t border-slate-200 text-xs text-slate-500 leading-relaxed">
|
||||
<div className="text-slate-600 font-medium mb-1">{settings.company_name_full || 'ООО «Умный Байт»'}</div>
|
||||
<div className="flex flex-wrap gap-x-4 gap-y-1">
|
||||
{settings.company_inn && <span>ИНН {settings.company_inn}</span>}
|
||||
{settings.company_kpp && <span>КПП {settings.company_kpp}</span>}
|
||||
{settings.company_ogrn && <span>ОГРН {settings.company_ogrn}</span>}
|
||||
</div>
|
||||
{settings.company_address && <div className="mt-1">{settings.company_address}</div>}
|
||||
{settings.company_director && <div className="mt-1">Генеральный директор — {settings.company_director}</div>}
|
||||
<div className="mt-2 flex flex-wrap gap-x-4 gap-y-1">
|
||||
{settings.contact_email && (
|
||||
<a href={`mailto:${settings.contact_email}`} className="hover:text-brand-900 transition-colors">{settings.contact_email}</a>
|
||||
)}
|
||||
{settings.contact_phone && (
|
||||
<a href={`tel:${String(settings.contact_phone).replace(/[^+\d]/g, '')}`} className="hover:text-brand-900 transition-colors">{settings.contact_phone}</a>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"root":["./src/main.tsx","./src/vite-env.d.ts","./src/admin/AdminLayout.tsx","./src/admin/AdminLogin.tsx","./src/admin/ProductsAdmin.tsx","./src/admin/SectionsAdmin.tsx","./src/admin/SettingsAdmin.tsx","./src/api/client.ts","./src/components/Icons.tsx","./src/pages/Landing.tsx"],"errors":true,"version":"6.0.3"}
|
||||
Reference in New Issue
Block a user