Skip to content

Commit

Permalink
fix 5
Browse files Browse the repository at this point in the history
  • Loading branch information
AlinaMoon123 committed Dec 19, 2024
1 parent 9740f48 commit 47d464f
Show file tree
Hide file tree
Showing 14 changed files with 204 additions and 75 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@

<a href=" ./../../../actions/workflows/7_app_is_ready.yml" >![7. App is ready]( ./../../actions/workflows/7_app_is_ready.yml/badge.svg)</a>

## Данные для входа в приложение

Логин: [email protected]
Пароль: 123

Логин: [email protected]
Пароль: oksana
Binary file added backups/neo4j.dump
Binary file not shown.
Binary file removed db-init/neo4j.dump
Binary file not shown.
11 changes: 11 additions & 0 deletions db/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM neo4j:5.12

ENV NEO4J_AUTH=neo4j/neo4jneo4j

WORKDIR /var/lib/neo4j

COPY restore-script.sh /restore-script.sh

RUN chmod +x /restore-script.sh

CMD ["/bin/bash", "/restore-script.sh", "&&", "neo4j", "console"]
38 changes: 38 additions & 0 deletions db/restore-script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/bash
set -e

# Указываем путь к дампу
DUMP_PATH="/backups/neo4j.dump"
DATABASE_NAME="neo4j"
DATABASE_PATH="/var/lib/neo4j/data/databases/$DATABASE_NAME"

# Проверка наличия дампа
if [ -f "$DUMP_PATH" ]; then
echo "Дамп найден: $DUMP_PATH"

# Останавливаем сервер Neo4j перед восстановлением
echo "Останавливаем сервер Neo4j..."
neo4j stop || echo "Сервер уже остановлен или не работает"

# Если база данных существует, удаляем ее
if [ -d "$DATABASE_PATH" ]; then
echo "Удаляем старую базу данных..."
rm -rf "$DATABASE_PATH"
fi

# Восстанавливаем базу данных из дампа
echo "Восстанавливаем базу данных из дампа..."
neo4j-admin database load --from-path="/backups" --overwrite-destination=true "$DATABASE_NAME"

echo "База данных восстановлена успешно."
else
echo "Дамп не найден. Пропуск восстановления."
fi

# Настройка пароля для пользователя neo4j (можно настроить через переменные окружения)
echo "Настроим пароль пользователя neo4j..."
neo4j-admin dbms set-initial-password "${NEO4J_PASSWORD:-neo4jneo4j}" || echo "Пароль уже настроен"

# Запуск Neo4j в консольном режиме
echo "Запускаем Neo4j..."
exec neo4j console
12 changes: 8 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ services:
- '127.0.0.1:8080:8080'
depends_on:
db:
condition: service_healthy
condition: service_healthy
environment:
SPRING_APPLICATION_NAME: lake-catalog
SPRING_NEO4J_URI: ${SPRING_NEO4J_URI}
Expand All @@ -21,22 +21,26 @@ services:
- app-network

db:
image: neo4j:5.7.0
image: neo4j:5.12 # Указываем нужную версию Neo4j
environment:
NEO4J_AUTH: neo4j/neo4jneo4j
NEO4J_AUTH: neo4j/neo4jneo4j # Устанавливаем пароль для базы данных
volumes:
- db_data:/data
- db_data:/data # Монтируем том для хранения данных базы данных
- ./backups:/backups
- ./db/restore-script.sh:/restore-script.sh # Монтируем скрипт восстановления
healthcheck:
test: ["CMD-SHELL", "cypher-shell -u neo4j -p neo4jneo4j 'RETURN 1' || exit 1"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
command: ["bash", "/restore-script.sh"] # Выполняем скрипт восстановления, а затем запускаем Neo4j

volumes:
db_data:
app_data:

networks:
app-network:
driver: bridge
Binary file removed neo4j_dumps/neo4j.dump
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,22 @@ public LakeController(LakeService lakeService) {
public String showMainPage(Model model,
@RequestParam(defaultValue = "0") int page,
@RequestParam(required = false) String name,
@RequestParam(required = false) String depth,
@RequestParam(required = false) String square,
@RequestParam(required = false) String min_depth,
@RequestParam(required = false) String max_depth,
@RequestParam(required = false) String min_square,
@RequestParam(required = false) String max_square,
@RequestParam(required = false) String city,
@RequestParam(required = false) String region,
@RequestParam(required = false) String rating,
HttpSession session) {
if(lakeRepository.count()==0){
lakeService.initialize();
}
// if(lakeRepository.count()==0){
// lakeService.initialize();
// }

int pageSize = 8; // Количество озер на одной странице

// Вызываем метод фильтрации
Page<Lake> lakePage = lakeService.filterLakes(name, depth, square, city, region, rating, page, pageSize);
Page<Lake> lakePage = lakeService.filterLakes(name, min_depth, max_depth, min_square, max_square, city, region, rating, page, pageSize);

// Параметры пагинации
int totalPages = lakePage.getTotalPages();
Expand All @@ -79,8 +81,10 @@ public String showMainPage(Model model,
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
model.addAttribute("name", name);
model.addAttribute("depth", depth);
model.addAttribute("square", square);
model.addAttribute("min_depth", min_depth);
model.addAttribute("max_depth", max_depth);
model.addAttribute("min_square", min_square);
model.addAttribute("max_square", max_square);
model.addAttribute("city", city);
model.addAttribute("region", region);
model.addAttribute("rating", rating);
Expand Down
16 changes: 9 additions & 7 deletions src/main/java/com/example/lake_catalog/service/LakeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public void addLake(Lake lake) {
lakeRepository.save(lake);
}

public Page<Lake> filterLakes(String name, String depth, String square, String city, String region, String rating, int page, int pageSize) {
public Page<Lake> filterLakes(String name, String min_depth, String max_depth, String min_square, String max_square, String city, String region, String rating, int page, int pageSize) {
List<Lake> lakes = lakeRepository.findAll(); // Загружаем все озера

// Фильтруем по имени, если указано
Expand All @@ -141,18 +141,20 @@ public Page<Lake> filterLakes(String name, String depth, String square, String c
}

// Фильтруем по глубине, если указано
if (depth != null && !depth.isEmpty()) {
Double depthValue = Double.parseDouble(depth); // Преобразуем глубину в число
if (max_depth != null && min_depth != null && !min_depth.isEmpty() && !max_depth.isEmpty()) {
Double min_depthValue = Double.parseDouble(min_depth); // Преобразуем глубину в число
Double max_depthValue = Double.parseDouble(max_depth);
lakes = lakes.stream()
.filter(lake -> lake.getDepth() <= depthValue)
.filter(lake -> lake.getDepth() <= max_depthValue && lake.getDepth() >= min_depthValue)
.collect(Collectors.toList());
}

// Фильтруем по площади, если указано
if (square != null && !square.isEmpty()) {
Double squareValue = Double.parseDouble(square); // Преобразуем площадь в число
if (min_square != null && !min_square.isEmpty() && max_square != null && !max_square.isEmpty()) {
Double min_squareValue = Double.parseDouble(min_square); // Преобразуем площадь в число
Double max_squareValue = Double.parseDouble(max_square);
lakes = lakes.stream()
.filter(lake -> lake.getSquare() <= squareValue)
.filter(lake -> lake.getSquare() <= max_squareValue && lake.getSquare() >= min_squareValue)
.collect(Collectors.toList());
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
spring.application.name=lake-catalog

spring.neo4j.uri=neo4j://127.0.0.1::7687
spring.neo4j.uri=bolt://db:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=neo4jneo4j
server.servlet.encoding.charset=UTF-8
112 changes: 83 additions & 29 deletions src/main/resources/static/JavaScript/filtration_script.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ document.addEventListener("DOMContentLoaded", () => {
const returnButton = document.getElementById("returnButton");
const applyFiltersButton = document.getElementById("applyFilters");

const depthRange = document.getElementById("depthRange");
const depthInput = document.getElementById("depthInput");
const areaRange = document.getElementById("areaRange");
const areaInput = document.getElementById("areaInput");
const depthInputMin = document.getElementById("depthInputMin");
const depthInputMax = document.getElementById("depthInputMax");
const areaInputMin = document.getElementById("areaInputMin");
const areaInputMax = document.getElementById("areaInputMax");
const regionInput = document.getElementById("regionInput");
const regionList = document.getElementById("regionList");
const regionSearch = document.getElementById("regionSearch");
Expand Down Expand Up @@ -58,34 +58,52 @@ document.addEventListener("DOMContentLoaded", () => {
}
});
// Обработчик для синхронизации значения глубины (range и input)
depthRange.addEventListener("input", () => {
depthInput.value = depthRange.value;
});
// depthRange.addEventListener("input", () => {
// depthInput.value = depthRange.value;
// });

depthInput.addEventListener("input", () => {
// Проверка, чтобы значение было в допустимых пределах
if (depthInput.value < depthRange.min) {
depthInput.value = depthRange.min;
} else if (depthInput.value > depthRange.max) {
depthInput.value = depthRange.max;
}
depthRange.value = depthInput.value;
});
// depthInput.addEventListener("input", () => {
// // Проверка, чтобы значение было в допустимых пределах
// if (depthInput.value < depthRange.min) {
// depthInput.value = depthRange.min;
// } else if (depthInput.value > depthRange.max) {
// depthInput.value = depthRange.max;
// }
// depthRange.value = depthInput.value;
// });

// Обработчик для синхронизации значения площади (range и input)
areaRange.addEventListener("input", () => {
areaInput.value = areaRange.value;
});
// areaRange.addEventListener("input", () => {
// areaInput.value = areaRange.value;
// });

// areaInput.addEventListener("input", () => {
// // Проверка, чтобы значение было в допустимых пределах
// if (areaInput.value < areaRange.min) {
// areaInput.value = areaRange.min;
// } else if (areaInput.value > areaRange.max) {
// areaInput.value = areaRange.max;
// }
// areaRange.value = areaInput.value;
// });

function validateRange(minInput, maxInput) {
const minValue = parseFloat(minInput.value);
const maxValue = parseFloat(maxInput.value);

areaInput.addEventListener("input", () => {
// Проверка, чтобы значение было в допустимых пределах
if (areaInput.value < areaRange.min) {
areaInput.value = areaRange.min;
} else if (areaInput.value > areaRange.max) {
areaInput.value = areaRange.max;
if (minValue > maxValue) {
maxInput.setCustomValidity("Максимальное значение должно быть больше минимального.");
} else {
maxInput.setCustomValidity("");
}
areaRange.value = areaInput.value;
});
}

// Обработчики для валидации
depthInputMin.addEventListener("input", () => validateRange(depthInputMin, depthInputMax));
depthInputMax.addEventListener("input", () => validateRange(depthInputMin, depthInputMax));

areaInputMin.addEventListener("input", () => validateRange(areaInputMin, areaInputMax));
areaInputMax.addEventListener("input", () => validateRange(areaInputMin, areaInputMax));

// Обработчик кнопки поиска
// searchButton.addEventListener("click", () => {
Expand All @@ -109,9 +127,11 @@ document.addEventListener("DOMContentLoaded", () => {
}
};

addInput('depth', document.getElementById('depthInput').value || document.getElementById('depthRange').value);
addInput('min_depth', document.getElementById('depthInputMin').value);
addInput('max_depth', document.getElementById('depthInputMax').value);
addInput('region', Array.from(document.querySelectorAll('#regionList input:checked')).map(input => input.value).join(','));
addInput('square', document.getElementById('areaInput').value || document.getElementById('areaRange').value);
addInput('min_square', document.getElementById('areaInputMin').value);
addInput('max_square', document.getElementById('areaInputMax').value);
addInput('rating', Array.from(document.querySelectorAll('.rating input:checked')).map(input => input.id).join(','));
addInput('city', Array.from(document.querySelectorAll('#cityList input:checked')).map(input => input.value).join(','));
addInput('name', document.getElementById('searchInput').value.trim());
Expand All @@ -123,5 +143,39 @@ document.addEventListener("DOMContentLoaded", () => {
returnButton.addEventListener("click", () => {
window.location.href = '/main';
});

const map = L.map("map").setView([60.0, 30.0], 7); // Центр карты
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png").addTo(map);

let drawnRectangle;
map.on("click", (e) => {
if (drawnRectangle) map.removeLayer(drawnRectangle);
const bounds = [[e.latlng.lat - 0.1, e.latlng.lng - 0.1], [e.latlng.lat + 0.1, e.latlng.lng + 0.1]];
drawnRectangle = L.rectangle(bounds, { color: "blue", weight: 1 }).addTo(map);
});

document.getElementById("searchByArea").addEventListener("click", () => {
if (drawnRectangle) {
const bounds = drawnRectangle.getBounds();
const area = {
north: bounds.getNorth(),
south: bounds.getSouth(),
east: bounds.getEast(),
west: bounds.getWest(),
};
fetch("/api/lakes/searchByArea", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(area),
})
.then((response) => response.json())
.then((data) => {
console.log("Найденные озера:", data);
})
.catch((error) => console.error("Ошибка поиска:", error));
} else {
alert("Выделите область на карте.");
}
});
});

17 changes: 17 additions & 0 deletions src/main/resources/static/css/filtration_styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,18 @@ input[type="number"] {
font-family: 'Century Gothic', Arial, sans-serif;
}

.input-range {
display: flex;
gap: 10px;
margin-top: 5px;
}

.input-range input {
width: 100px;
padding: 5px;
border: 1px solid #ccc;
border-radius: 4px;
}
input[type="text"] {
font-family: 'Century Gothic', Arial, sans-serif;
}
Expand Down Expand Up @@ -149,8 +161,13 @@ input[type="text"] {
display: flex;
flex-direction: column;
padding: 10px;
z-index: 1;
}

.map {
z-index: 2;

}
.checkbox-container label {
margin: 5px 0;
}
Expand Down
Loading

0 comments on commit 47d464f

Please sign in to comment.