From 72057c7b99d2b8358977101ecd7a8e1650705ba1 Mon Sep 17 00:00:00 2001 From: IK Date: Mon, 7 Sep 2026 17:04:59 +0700 Subject: [PATCH] feat: add spot coordinate radar --- README.md | 2 +- apps/web/src/components/CoordinateRadar.astro | 14 ++++++++++++++ apps/web/src/layouts/Layout.astro | 1 + apps/web/src/pages/spots/[id].astro | 3 ++- apps/web/src/styles/coordinate-radar.css | 1 + docs/ROADMAP.md | 2 +- 6 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/components/CoordinateRadar.astro create mode 100644 apps/web/src/styles/coordinate-radar.css diff --git a/README.md b/README.md index f02f264..19d4f22 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ RF4DB/RF4-STAT/RF4MAP/RF4 Posts сначала принимаются в изо Базовый SEO-контур готов для `rf4spotter.ru`: страницы имеют уникальные метаданные, canonical, Open Graph/Twitter Card, фирменное изображение 1200×630 и JSON-LD; доступны динамические `/robots.txt` и `/sitemap.xml`, административные и ошибочные страницы закрыты от индексации, добавлена собственная страница 404. Индексируемые каталоги рыб и водоёмов, detail-страницы и сочетания водоём + рыба строятся из актуального разрешённого справочника и включаются в sitemap. Подключены фирменные favicon/app icons, web manifest и production-кэширование статических ресурсов. Карточки активности показывают единый паспорт данных: источники, свежесть, полноту и уровень доверия. На `/status` опубликована легенда цветов всех источников и статусов качества. -Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. +Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. На странице точки координаты дополнительно показаны фирменным радаром, который не имитирует отсутствующую географию водоёма. Все пять community-парсеров подключены к отдельному scheduler-процессу. Состояние запусков и ошибок хранится в PostgreSQL, параллельный запуск одного источника блокируется, минимальный интервал жёстко ограничен 1800 секундами. Локально процесс включается профилем `docker compose --profile scheduler up -d`; detail-URL RF4MAP/RF4 Posts задаются переменными окружения. diff --git a/apps/web/src/components/CoordinateRadar.astro b/apps/web/src/components/CoordinateRadar.astro new file mode 100644 index 0000000..0c770a4 --- /dev/null +++ b/apps/web/src/components/CoordinateRadar.astro @@ -0,0 +1,14 @@ +--- +const { x, y } = Astro.props as { x: number; y: number }; +--- + diff --git a/apps/web/src/layouts/Layout.astro b/apps/web/src/layouts/Layout.astro index ddbde87..004a393 100644 --- a/apps/web/src/layouts/Layout.astro +++ b/apps/web/src/layouts/Layout.astro @@ -4,6 +4,7 @@ import "../styles/catalog.css"; import "../styles/source-status.css"; import "../styles/data-passport.css"; import "../styles/data-legend.css"; +import "../styles/coordinate-radar.css"; import FishingIcon from "../components/FishingIcon.astro"; const { title = "RF4 Spotter — свежие точки клёва Russian Fishing 4", diff --git a/apps/web/src/pages/spots/[id].astro b/apps/web/src/pages/spots/[id].astro index 888a02b..73064dd 100644 --- a/apps/web/src/pages/spots/[id].astro +++ b/apps/web/src/pages/spots/[id].astro @@ -1,6 +1,7 @@ --- import Layout from "../../layouts/Layout.astro"; import SourceBadge from "../../components/SourceBadge.astro"; +import CoordinateRadar from "../../components/CoordinateRadar.astro"; import { activityLevel, api, kg, plural, type Activity, type Catch, type Spot } from "../../lib/api"; const { id } = Astro.params; let spot: Spot | null = null, catches: Catch[] = [], activity: Activity | null = null, unavailable = false; @@ -23,7 +24,7 @@ const breadcrumbs = spot ? { "@context": "https://schema.org", "@type": "Breadcr ← Все активные точки {unavailable || !spot ?

Точка недоступна

API не ответил или такой точки нет.

: <> -
{spot.waterbody}

Точка {spot.x}:{spot.y}

{spot.description}

{spot.x}:{spot.y}
+
{spot.waterbody}

Точка {spot.x}:{spot.y}

{spot.description}

{spot.catches_24h}за 24 часа
{spot.catches_3d}за 3 дня
{spot.catches_7d}за 7 дней

Последние уловы

{catches.length ?
{catches.map(item =>
{item.fish}{item.bait ?? "Приманка не указана"}
{kg(item.weight_g)}{item.player_name ?? "Анонимно"}
)}
:

Уловов пока нет

Для этой точки нет одобренных наблюдений.

}
} diff --git a/apps/web/src/styles/coordinate-radar.css b/apps/web/src/styles/coordinate-radar.css new file mode 100644 index 0000000..368867f --- /dev/null +++ b/apps/web/src/styles/coordinate-radar.css @@ -0,0 +1 @@ +.coordinate-radar{position:relative;flex:0 0 180px;width:180px;height:180px;display:grid;place-items:center;color:var(--lime)}.coordinate-radar svg{position:absolute;inset:0;width:100%;height:100%;fill:none;stroke:#ffffff20;stroke-width:1}.coordinate-radar .radar-sweep{fill:#c9f45b0d;stroke:#c9f45b38}.coordinate-radar .radar-mark{fill:var(--lime);stroke:none}.coordinate-radar .radar-pulse{stroke:var(--lime);stroke-width:2;opacity:.55}.coordinate-radar strong{position:relative;display:grid;grid-template-columns:auto auto 1px auto auto;align-items:baseline;gap:4px;padding:7px 10px;border-radius:7px;background:#082226d9;font:400 20px Georgia,serif}.coordinate-radar strong small{font:700 8px Inter,sans-serif;color:#9eb0ad}.coordinate-radar strong i{width:1px;height:14px;background:#ffffff35}.radar-north{position:absolute;top:3px;font-size:8px;letter-spacing:.15em}.radar-caption{position:absolute;bottom:1px;color:#91a5a1;font-size:8px;text-transform:uppercase;letter-spacing:.12em}@media(max-width:720px){.coordinate-radar{display:none}} diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 82bb764..1ffc4a9 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -124,7 +124,7 @@ ### Графические элементы и объяснение данных - [x] Подготовить фирменный знак «крючок + поплавок + координатная сетка» и согласованный набор favicon/app icons (7 сентября 2026). -- [ ] Добавить координатный радар или мини-карту на страницу точки. +- [x] Добавить честный координатный радар без имитации отсутствующей карты на страницу точки (7 сентября 2026). - [ ] Добавить временную шкалу активности 24/72 часа в рыболовной стилистике. - [ ] Добавить лёгкие силуэты видов рыб, не перегружая карточки результатов. - [x] Собрать единый визуальный «паспорт данных»: источник, свежесть, полнота и доверие; применить к карточкам активности (7 сентября 2026).