add: Django Management Command для генерации JavaScript-файлы отрисовки карт с геоданными ВСЕХ зданий типовых серий
This commit is contained in:
@@ -10,10 +10,11 @@
|
||||
## Каталог команд
|
||||
|
||||
1. `regenerate_seria_roots` — пересчет корневых серий (иерархия и консолидация).
|
||||
2. `generate_sitemaps` — оффлайн генерация sitemap-файлов.
|
||||
3. `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`.
|
||||
4. `populate_seo_fields` — автозаполнение SEO-полей блога из существующих данных.
|
||||
5. `make_rating` — пересчёт рейтингов профилей и стеклопакетов методом Манна-Уитни.
|
||||
2. `generate_map_js` — генерация JavaScript для карт с геоданными зданий.
|
||||
3. `generate_sitemaps` — оффлайн генерация sitemap-файлов.
|
||||
4. `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`.
|
||||
5. `populate_seo_fields` — автозаполнение SEO-полей блога из существующих данных.
|
||||
6. `make_rating` — пересчёт рейтингов профилей и стеклопакетов методом Манна-Уитни.
|
||||
|
||||
## Общие правила запуска
|
||||
|
||||
@@ -232,7 +233,117 @@ poetry run python oknardia/manage.py regenerate_seria_roots --verbosity 3
|
||||
"
|
||||
```
|
||||
|
||||
## 2) Команда `generate_sitemaps`
|
||||
## 2) Команда `generate_map_js`
|
||||
|
||||
Назначение:
|
||||
- сгенерировать JavaScript-файл для отрисовки карты всех зданий типовых серий в Яндекс.Картах.
|
||||
- файл содержит геоданные (latitude/longitude), ID адресов, привязку к сериям и информацию для balloon-окон на картах.
|
||||
|
||||
### Что происходит
|
||||
|
||||
1. **Сбор геоданных** — для всех корневых серий (где `id = kRoot_id`)
|
||||
- Запрашиваются здания из таблицы `Building_Info` с non-zero координатами
|
||||
- Для каждого здания собирается: широта, долгота, ID адреса, адрес в латинице, ID серии
|
||||
|
||||
2. **Генерация JavaScript** — на основе шаблона `service/JavaScript4AllSeriaMap.js.html`
|
||||
- Генерируется массив цветов для каждой серии
|
||||
- Объявляются переменные с ID и названиями серий
|
||||
- Инициализируется Yandex.Maps с PlaceMarks для каждого здания
|
||||
|
||||
3. **Минификация через Terser** — уменьшение размера JavaScript
|
||||
- Удаляются ненужные пробелы и переносы строк
|
||||
- Сокращаются имена переменных (mangling)
|
||||
- Удаляются console.log и debugger
|
||||
|
||||
4. **Запись в файлы**:
|
||||
- `public/static/js/4maps/_ALL_seria_on_map.js` — исходный форматированный файл (715 KB)
|
||||
- `public/static/js/4maps/_ALL_seria_on_map.mini.js` — минифицированный файл (639 KB)
|
||||
|
||||
### Оптимизация размера
|
||||
|
||||
Файл был оптимизирован в три этапа:
|
||||
|
||||
| Этап | Размер | Сжатие |
|
||||
|------|--------|--------|
|
||||
| Исходный (2016 год) | 2.5 MB | — |
|
||||
| **Уровень 1**: функция-фабрика `m()` | 715 KB | **71%** |
|
||||
| **Уровень 2**: Terser минификация | 639 KB | +10.6% |
|
||||
| **Уровень 3**: Gzip в браузере | 188 KB | +29.4% |
|
||||
| **Итого сжатие** | **188 KB** | **92.5%** |
|
||||
|
||||
> **Примечание**: Gzip применяется автоматически браузером и веб-сервером при наличии в заголовках `Content-Encoding: gzip`
|
||||
|
||||
Содержимое:
|
||||
- **Маркеры на карте**: 18,228 зданий
|
||||
- **Серии с цветами**: 31
|
||||
- **Корневые серии**: 31
|
||||
|
||||
### Базовый запуск
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py generate_map_js
|
||||
```
|
||||
|
||||
### Параметры запуска
|
||||
|
||||
**`--force`** — пересгенерировать файл (перезаписать если существует):
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py generate_map_js --force
|
||||
```
|
||||
|
||||
**`--verbosity 2`** — подробный вывод со статистикой:
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py generate_map_js --verbosity 2
|
||||
```
|
||||
|
||||
### Когда запускать
|
||||
|
||||
- **После первого развертывания** — создать файл карты один раз.
|
||||
- **После добавления новых зданий** в БД (через парсеры или импорт).
|
||||
- **По расписанию** (опционально, если здания редко добавляются):
|
||||
```bash
|
||||
0 3 * * 0 cd /home/user/app-path/2022-oknardia && poetry run python oknardia/manage.py generate_map_js >> /var/log/oknardia-map-js.log 2>&1
|
||||
```
|
||||
|
||||
### Пример вывода
|
||||
|
||||
```
|
||||
=== ГЕНЕРАЦИЯ JAVASCRIPT ДЛЯ КАРТ ===
|
||||
|
||||
Этап 1: Сбор информации о корневых сериях...
|
||||
✓ Найдено корневых серий: 31
|
||||
|
||||
Этап 2: Генерация единого JS-файла для ВСЕ серий...
|
||||
✓ Написан исходный файл: _ALL_seria_on_map.js
|
||||
Размер: 734.0 KB
|
||||
|
||||
Этап 3: Минификация JavaScript (rjsmin)...
|
||||
[*] Минификация успешна!
|
||||
Исходный файл: 734.015 KB
|
||||
Минифицированный: 732.952 KB
|
||||
Сжатие: 0.14%
|
||||
Время: 0.0017с
|
||||
[i] Полная статистика по сериям:
|
||||
- Жилых м²: 125,749,341
|
||||
- Муниципальных м²: 11,302,860
|
||||
- Жильцов: 6,342,742
|
||||
- Квартир: 2,769,800
|
||||
|
||||
=== РЕЗУЛЬТАТЫ ===
|
||||
✓ Серий обработано: 31
|
||||
✓ Зданий на карте: 18228
|
||||
✓ JS-файлов создано: 2 (исходный + минифицированный)
|
||||
✓ Исходный файл: _ALL_seria_on_map.js
|
||||
✓ Минифицированный: _ALL_seria_on_map.mini.js
|
||||
✓ Обфускация: Base64 кодирование координат
|
||||
|
||||
[OK] Генерация завершена! Время: 1.10с
|
||||
```
|
||||
|
||||
## 3) Команда `generate_sitemaps`
|
||||
|
||||
Назначение:
|
||||
- пересобрать `sitemap.xml` и chunk-файлы в `MEDIA_ROOT/_serv_sitemap`.
|
||||
@@ -280,7 +391,7 @@ location = /sitemap.xml {
|
||||
}
|
||||
```
|
||||
|
||||
## 3) Команда `regenerate_seria_prerender`
|
||||
## 4) Команда `regenerate_seria_prerender`
|
||||
|
||||
Назначение:
|
||||
- пересобрать pre-render шаблоны для страниц серий (`catalog_seria_info`) в каталоге `seria_info/prepared/`.
|
||||
@@ -318,7 +429,7 @@ poetry run python oknardia/manage.py regenerate_seria_prerender --seria-id 843 -
|
||||
- после массового обновления данных серий/окон/квартир;
|
||||
- после очистки `seria_info/prepared/`.
|
||||
|
||||
## 4) Команда `populate_seo_fields`
|
||||
## 5) Команда `populate_seo_fields`
|
||||
|
||||
Назначение:
|
||||
- автозаполнить SEO-поля (`sSlug`, `sMetaDescription`, `sMetaKeywords`) для всех существующих записей блога.
|
||||
@@ -430,7 +541,7 @@ print(f'Пусто sMetaKeywords: {posts.filter(sMetaKeywords=\"\").count()}')
|
||||
- ✅ **Откат через SQL** — если нужно очистить, используй: `UPDATE oknardia_blogposts SET sSlug='', sMetaDescription='', sMetaKeywords='';`
|
||||
- ✅ **Всегда используй `--dry-run`** перед первым запуском для проверки.
|
||||
|
||||
## 5) Команда `make_rating`
|
||||
## 6) Команда `make_rating`
|
||||
|
||||
Назначение:
|
||||
- пересчитать рейтинги оконных профилей, стеклопакетов и наборов услуг используя адаптированный метод Манна-Уитни (Mann-Whitney U Step Rank).
|
||||
|
||||
Reference in New Issue
Block a user