Reorganize project structure and cleanup root directory
All checks were successful
continuous-integration/drone/push Build is passing

 Major improvements:
- Created organized folder structure with utils/, scripts/, backups/, temp/
- Moved Python scripts to scripts/ folder for better organization
- Moved utility files (start, stop, update, cli, logs, drone) to utils/ folder
- Moved backup files to backups/ folder for cleaner root directory
- Added comprehensive README.md files for each new folder
- Updated main README.md with new project structure documentation
- Enhanced .gitignore with rules for new folders
- Added real-time career vacancy counter on homepage
- Improved homepage career stats styling with better visibility

🗂️ New folder structure:
- utils/ - Project management utilities and tools
- scripts/ - Python helper scripts for banners and data
- backups/ - Configuration and file backups
- temp/ - Temporary files and development data

🎨 UI improvements:
- Fixed white text visibility issues on homepage career section
- Added dynamic vacancy count from database
- Implemented glassmorphism design for career stats card
- Better color contrast and hover effects

This reorganization makes the project more maintainable and professional.
This commit is contained in:
2025-11-25 18:00:50 +09:00
parent bcd01a5d3e
commit 6fe0780113
59 changed files with 192 additions and 213 deletions

12
.gitignore vendored
View File

@@ -110,6 +110,11 @@ sent_emails/
# 🌍 Translation files
*.pot
# 📋 Temporary files and folders
temp/
*.tmp
*.temp
# 🚫 Exclude test files from root
response_*.json
test_*.html
@@ -121,4 +126,9 @@ qr_success_animation_demo.html
# 📋 Temporary documentation files that moved to docs/
BACKUP_SETUP_COMPLETE.md
COMMIT_SUMMARY.md
SCRIPTS_README.md
SCRIPTS_README.md
# 🔧 Utils and scripts (keep tracked but ignore development versions)
utils/*.log
scripts/*.log
backups/*.tmp

View File

@@ -1,6 +1,6 @@
# 🚀 SmartSolTech
[![Build Status](https://drone.smartsoltech.kr/api/badges/smartsoltech/smartsoltech.kr/status.svg)](https://drone.smartsoltech.kr/smartsoltech/smartsoltech.kr)
[![Build Status](https://drone.smartsoltech.kr/api/badges/trevor/smartsoltech_site/status.svg)](https://drone.smartsoltech.kr/trevor/smartsoltech_site)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)
[![Django 4.2](https://img.shields.io/badge/django-4.2-green.svg)](https://docs.djangoproject.com/en/4.2/)
@@ -71,7 +71,7 @@ cd smartsoltech.kr
### Основные команды
```bash
./cli shell # Django shell
.utils/cli shell # Django shell
./cli migrate # Применить миграции
./update # Полное обновление проекта
./stop # Остановка сервисов
@@ -181,6 +181,35 @@ pip install -r requirements.txt
./cli status
```
## 📂 Структура проекта
```
smartsoltech/
├── 🐍 smartsoltech/ # Основное Django приложение
├── 🎨 frontend/ # Статические фронтенд файлы
├── 🐳 bin/ # Скрипты развертывания
├── 📋 docs/ # Документация проекта
├── 🧩 patch/ # Патчи и исправления
├── 🛠️ utils/ # Утилиты и инструменты
│ ├── start # Запуск проекта
│ ├── stop # Остановка сервисов
│ ├── update # Обновление проекта
│ ├── cli # CLI интерфейс
│ ├── logs # Просмотр логов
│ └── drone # CI/CD бинарий
├── 🐍 scripts/ # Вспомогательные скрипты
│ ├── create_hero_banner.py # Создание баннеров
│ └── hero_script.py # Скрипты для баннеров
├── 💾 backups/ # Резервные копии
│ ├── .drone.yml.backup # Бэкап CI конфигурации
│ └── original_home_modern.html # Оригинал главной страницы
├── 🗂️ temp/ # Временные файлы
├── 🐳 docker-compose.yml # Docker конфигурация
├── 🚀 .drone.yml # CI/CD конфигурация
├── 📄 requirements.txt # Python зависимости
└── 📖 README.md # Этот файл
```
### Мониторинг
- **Веб-сайт**: http://localhost:8000

19
backups/README.md Normal file
View File

@@ -0,0 +1,19 @@
# 💾 Backups
Папка для хранения резервных копий конфигурационных файлов и важных данных.
## Содержимое:
- `.drone.yml.backup` - Резервная копия конфигурации CI/CD
- `original_home_modern.html` - Оригинальная версия главной страницы
## Правила:
1. Все файлы в этой папке не должны влиять на работу проекта
2. Файлы служат для восстановления при необходимости
3. Регулярно очищайте старые файлы
4. Добавляйте дату к именам файлов при создании бэкапов
## Автоматические бэкапы:
Система CI/CD автоматически создает бэкапы перед деплоем в продакшн.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -1 +0,0 @@
!function(){"use strict";var e=document.querySelector("#mainNav");if(e){var o=e.querySelector(".navbar-collapse");if(o){var n=new bootstrap.Collapse(o,{toggle:!1}),t=o.querySelectorAll("a");for(var a of t)a.addEventListener("click",(function(e){n.hide()}))}var r=function(){(void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop)>100?e.classList.add("navbar-shrink"):e.classList.remove("navbar-shrink")};r(),document.addEventListener("scroll",r);var d=document.querySelectorAll(".portfolio-modal");for(var s of d)s.addEventListener("shown.bs.modal",(function(o){e.classList.add("d-none")})),s.addEventListener("hidden.bs.modal",(function(o){e.classList.remove("d-none")}))}}();

View File

@@ -1,75 +0,0 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Home - Brand</title>
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="500x500" href="/assets/img/photo_2024-10-06_10-06-15.jpg" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="500x500" href="/assets/img/photo_2024-10-06_10-06-15.jpg" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.12.0/css/all.css">
<link rel="stylesheet" href="/assets/css/styles.min.css">
</head>
<body id="page-top" data-bs-spy="scroll" data-bs-target="#mainNav" data-bs-offset="54">
<!-- Start: footer -->
<footer class="text-light bg-dark pt-5 pb-4">
<div class="container text-md-left">
<div class="row text-md-left">
<div class="col-md-3 col-lg-3 col-xl-3 mx-auto mt-3">
<h5 class="text-uppercase text-warning mb-4 font-weight-bold">Company Name</h5>
<p>Here you can use rows and columns to organize your footer content. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
</div>
<div class="col-md-2 col-lg-2 col-xl-2 mx-auto mt-3">
<h5 class="text-uppercase text-warning mb-4 font-weight-bold">Products</h5>
<p><a href="#" class="text-light" style="text-decoration:none;">Product 1</a></p>
<p><a href="#" class="text-light" style="text-decoration:none;">Product 2</a></p>
<p><a href="#" class="text-light" style="text-decoration:none;">Product 3</a></p>
<p><a href="#" class="text-light" style="text-decoration:none;">Product 4</a></p>
</div>
<div class="col-md-3 col-lg-2 col-xl-2 mx-auto mt-3">
<h5 class="text-uppercase text-warning mb-4 font-weight-bold">Useful Links</h5>
<p><a href="#" class="text-light" style="text-decoration:none;">Your Account</a></p>
<p><a href="#" class="text-light" style="text-decoration:none;">Become an Affiliate</a></p>
<p><a href="#" class="text-light" style="text-decoration:none;">Shipping Rates</a></p>
<p><a href="#" class="text-light" style="text-decoration:none;">Help</a></p>
</div>
<div class="col-md-4 col-lg-3 col-xl-3 mx-auto mt-3">
<h5 class="text-uppercase text-warning mb-4 font-weight-bold">Contact</h5>
<p><i class="fas fa-home mr-3"></i> 123 Street, City, State</p>
<p><i class="fas fa-envelope mr-3"></i> info@example.com</p>
<p><i class="fas fa-phone mr-3"></i> + 01 234 567 88</p>
<p><i class="fas fa-print mr-3"></i> + 01 234 567 89</p>
</div>
</div>
<hr class="mb-4">
<div class="row align-items-center">
<div class="col-md-7 col-lg-8">
<p class="text-md-left">© 2024 Company Name. All rights reserved.</p>
</div>
<div class="col-md-5 col-lg-4">
<div class="text-md-right">
<ul class="list-unstyled list-inline">
<li class="list-inline-item"><a href="#" class="btn-floating btn-sm text-light" style="font-size:23px;"><i class="fab fa-facebook"></i></a></li>
<li class="list-inline-item"><a href="#" class="btn-floating btn-sm text-light" style="font-size:23px;"><i class="fab fa-twitter"></i></a></li>
<li class="list-inline-item"><a href="#" class="btn-floating btn-sm text-light" style="font-size:23px;"><i class="fab fa-google-plus"></i></a></li>
<li class="list-inline-item"><a href="#" class="btn-floating btn-sm text-light" style="font-size:23px;"><i class="fab fa-linkedin-in"></i></a></li>
</ul>
</div>
</div>
</div>
</div>
</footer><!-- End: footer -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="/assets/js/script.min.js"></script>
</body>
</html>

View File

@@ -1,41 +0,0 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Home - Brand</title>
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="500x500" href="/assets/img/photo_2024-10-06_10-06-15.jpg" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="500x500" href="/assets/img/photo_2024-10-06_10-06-15.jpg" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<link rel="stylesheet" href="/assets/css/styles.min.css">
</head>
<body id="page-top" data-bs-spy="scroll" data-bs-target="#mainNav" data-bs-offset="54">
<!-- Start: Navbar Right Links (Dark) -->
<nav class="navbar navbar-expand-md bg-dark py-3" data-bs-theme="dark">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-bezier">
<path fill-rule="evenodd" d="M0 10.5A1.5 1.5 0 0 1 1.5 9h1A1.5 1.5 0 0 1 4 10.5v1A1.5 1.5 0 0 1 2.5 13h-1A1.5 1.5 0 0 1 0 11.5zm1.5-.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5zm10.5.5A1.5 1.5 0 0 1 13.5 9h1a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1-1.5 1.5h-1a1.5 1.5 0 0 1-1.5-1.5zm1.5-.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5zM6 4.5A1.5 1.5 0 0 1 7.5 3h1A1.5 1.5 0 0 1 10 4.5v1A1.5 1.5 0 0 1 8.5 7h-1A1.5 1.5 0 0 1 6 5.5zM7.5 4a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5z"></path>
<path d="M6 4.5H1.866a1 1 0 1 0 0 1h2.668A6.517 6.517 0 0 0 1.814 9H2.5c.123 0 .244.015.358.043a5.517 5.517 0 0 1 3.185-3.185A1.503 1.503 0 0 1 6 5.5zm3.957 1.358A1.5 1.5 0 0 0 10 5.5v-1h4.134a1 1 0 1 1 0 1h-2.668a6.517 6.517 0 0 1 2.72 3.5H13.5c-.123 0-.243.015-.358.043a5.517 5.517 0 0 0-3.185-3.185z"></path>
</svg></span><span>Brand</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-5"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navcol-5">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="#">First Item</a></li>
<li class="nav-item"><a class="nav-link" href="#">Second Item</a></li>
<li class="nav-item"><a class="nav-link" href="#">Third Item</a></li>
</ul>
</div>
</div>
</nav><!-- End: Navbar Right Links (Dark) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="/assets/js/script.min.js"></script>
</body>
</html>

View File

@@ -1 +0,0 @@
{"short_name":"sst","name":"smartsoltech","icons":[{"src":"/assets/img/photo_2024-10-06_10-06-08.jpg","type":"image/jpeg","sizes":"1011x702"},{"src":"/assets/img/photo_2024-10-06_10-06-08.jpg","type":"image/jpeg","sizes":"1011x702"}],"start_url":"smartsoltech.kr","display":"fullscreen"}

View File

@@ -1,82 +0,0 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>SmartSoltech</title>
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="500x500" href="/assets/img/photo_2024-10-06_10-06-15.jpg" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="500x500" href="/assets/img/photo_2024-10-06_10-06-15.jpg" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="icon" type="image/jpeg" sizes="1011x702" href="/assets/img/photo_2024-10-06_10-06-08.jpg">
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<link rel="stylesheet" href="/assets/css/styles.min.css">
</head>
<body>
<!-- Start: Articles Cards -->
<div class="container py-4 py-xl-5">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<h2>Heading</h2>
<p class="w-lg-50">Curae hendrerit donec commodo hendrerit egestas tempus, turpis facilisis nostra nunc. Vestibulum dui eget ultrices.</p>
</div>
</div>
<div class="row gy-4 row-cols-1 row-cols-md-2 row-cols-xl-3">
<div class="col">
<div class="card"><img class="card-img-top w-100 d-block fit-cover" style="height: 200px;" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<div class="card-body p-4">
<p class="text-primary card-text mb-0">Article</p>
<h4 class="card-title">Lorem libero donec</h4>
<p class="card-text">Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus.</p>
<div class="d-flex"><img class="rounded-circle flex-shrink-0 me-3 fit-cover" width="50" height="50" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<div>
<p class="fw-bold mb-0">John Smith</p>
<p class="text-muted mb-0">Erat netus</p>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="card"><img class="card-img-top w-100 d-block fit-cover" style="height: 200px;" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<div class="card-body p-4">
<p class="text-primary card-text mb-0">Article</p>
<h4 class="card-title">Lorem libero donec</h4>
<p class="card-text">Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus.</p>
<div class="d-flex"><img class="rounded-circle flex-shrink-0 me-3 fit-cover" width="50" height="50" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<div>
<p class="fw-bold mb-0">John Smith</p>
<p class="text-muted mb-0">Erat netus</p>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="card"><img class="card-img-top w-100 d-block fit-cover" style="height: 200px;" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<div class="card-body p-4">
<p class="text-primary card-text mb-0">Article</p>
<h4 class="card-title">Lorem libero donec</h4>
<p class="card-text">Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus.</p>
<div class="d-flex"><img class="rounded-circle flex-shrink-0 me-3 fit-cover" width="50" height="50" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<div>
<p class="fw-bold mb-0">John Smith</p>
<p class="text-muted mb-0">Erat netus</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div><!-- End: Articles Cards -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="/assets/js/script.min.js"></script>
</body>
</html>

23
scripts/README.md Normal file
View File

@@ -0,0 +1,23 @@
# 🐍 Scripts
Папка содержит вспомогательные скрипты для проекта SmartSolTech.
## Файлы:
- `create_hero_banner.py` - Скрипт для создания героических баннеров
- `hero_script.py` - Дополнительный скрипт для работы с баннерами
## Использование:
Запуск скриптов должен производиться из корневой директории проекта:
```bash
cd smartsoltech/
python ../scripts/create_hero_banner.py
```
или через Django management команды из папки smartsoltech/:
```bash
python manage.py shell < ../scripts/script_name.py
```

View File

@@ -538,10 +538,10 @@
</div>
<div class="text-center">
<div class="career-stats bg-gradient rounded-4 p-4 text-white mb-4" style="max-width: 300px; margin: 0 auto;">
<h3 class="display-4 fw-bold mb-2">0</h3>
<h6 class="mb-2">Открыто вакансий</h6>
<p class="small mb-0 opacity-75">Найдите свою идеальную позицию</p>
<div class="career-stats-home bg-white rounded-4 p-4 shadow-lg mb-4" style="max-width: 320px; margin: 0 auto; border: 2px solid #667eea;">
<h3 class="display-4 fw-bold mb-2 text-primary">{{ total_open_positions|default:0 }}</h3>
<h6 class="mb-2 text-dark fw-semibold">Открыто вакансий</h6>
<p class="small mb-0 text-muted">Найдите свою идеальную позицию</p>
</div>
<a href="{% url 'career' %}" class="btn btn-primary-modern btn-lg me-3">
@@ -1112,6 +1112,66 @@ document.addEventListener('DOMContentLoaded', function() {
display: inline-block;
margin: 0.5rem;
}
.career-stats-home {
max-width: 280px !important;
padding: 1.5rem !important;
}
.career-stats-home h3 {
font-size: 2.5rem !important;
}
}
/* Career Stats Home Styles */
.career-stats-home {
background: linear-gradient(145deg, #ffffff 0%, #f8f9fa 100%);
border: 2px solid #667eea !important;
box-shadow: 0 10px 30px rgba(102, 126, 234, 0.15) !important;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.career-stats-home::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%);
z-index: 1;
}
.career-stats-home:hover {
transform: translateY(-5px);
box-shadow: 0 20px 50px rgba(102, 126, 234, 0.25) !important;
border-color: #5a67d8;
}
.career-stats-home > * {
position: relative;
z-index: 2;
}
.career-stats-home h3 {
color: #667eea !important;
text-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);
font-size: 3rem;
font-weight: 800;
}
.career-stats-home h6 {
color: #2d3748 !important;
font-weight: 600;
font-size: 1.1rem;
letter-spacing: 0.5px;
}
.career-stats-home p {
color: #6b7280 !important;
font-size: 0.9rem;
}
</style>
{% endblock %}

View File

@@ -45,6 +45,9 @@ def home(request):
team_members = Team.objects.filter(is_active=True, show_on_about=True).order_by('display_order')[:4] # Показываем топ-4 участников команды
featured_careers = Career.objects.filter(status='active', is_featured=True).order_by('-created_at')[:3] # Топ-3 рекомендуемые вакансии
# Подсчет открытых вакансий
total_open_positions = Career.objects.filter(status='active').count()
return render(request, 'web/home_modern.html', {
'services': services,
'hero_banners': hero_banners,
@@ -53,6 +56,7 @@ def home(request):
'reviews': reviews,
'team_members': team_members,
'featured_careers': featured_careers,
'total_open_positions': total_open_positions,
})
def service_detail(request, pk):

40
utils/README.md Normal file
View File

@@ -0,0 +1,40 @@
# 🛠️ Utils
Папка содержит утилиты и вспомогательные инструменты для управления проектом.
## Файлы:
- `start` - Запуск проекта в режиме разработки
- `stop` - Остановка всех сервисов проекта
- `update` - Обновление и перезапуск проекта
- `cli` - Интерфейс командной строки
- `logs` - Просмотр логов системы
- `drone` - Бинарный файл CI/CD системы Drone
## Использование:
Все утилиты должны запускаться из корневой директории проекта:
```bash
# Запуск проекта
./utils/start
# Остановка проекта
./utils/stop
# Обновление проекта
./utils/update
# Просмотр логов
./utils/logs
# CLI интерфейс
./utils/cli
```
## Важно:
Убедитесь что файлы имеют права на выполнение:
```bash
chmod +x utils/*
```

View File

View File

View File

View File

View File