');
-}
\ No newline at end of file
diff --git a/punkrock-react/src/pages/PunkRockPage.jsx b/punkrock-react/src/pages/PunkRockPage.jsx
deleted file mode 100644
index e97d1e6..0000000
--- a/punkrock-react/src/pages/PunkRockPage.jsx
+++ /dev/null
@@ -1,174 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import Header from '../components/Header';
-import Footer from '../components/Footer';
-import ArtistList from '../components/ArtistList';
-import ArtistForm from '../components/ArtistForm';
-import { getArtists, getCountries, getEpochs, createArtist, updateArtist, deleteArtist } from '../services/api';
-
-const PunkRockPage = () => {
- const [artists, setArtists] = useState([]);
- const [countries, setCountries] = useState([]);
- const [epochs, setEpochs] = useState([]);
- const [loading, setLoading] = useState(true);
- const [editingArtist, setEditingArtist] = useState(null);
- const [sortDirection, setSortDirection] = useState('asc'); // 'asc' для А-Я, 'desc' для Я-А
-
- useEffect(() => {
- const fetchData = async () => {
- try {
- const [artistsData, countriesData, epochsData] = await Promise.all([
- getArtists(),
- getCountries(),
- getEpochs()
- ]);
- console.log('Fetched Artists:', artistsData);
- console.log('Fetched Countries:', countriesData);
- console.log('Fetched Epochs:', epochsData);
- setArtists(artistsData);
- setCountries(countriesData.map(country => ({
- ...country,
- id: parseInt(country.id)
- })));
- setEpochs(epochsData.map(epoch => ({
- ...epoch,
- id: parseInt(epoch.id)
- })));
- setLoading(false);
- } catch (error) {
- console.error('Error fetching data:', error);
- setLoading(false);
- }
- };
- fetchData();
- }, []);
-
- const handleAddArtist = async (artistData) => {
- try {
- // Проверка уникальности имени
- const isDuplicate = artists.some(artist => artist.name.toLowerCase() === artistData.name.toLowerCase());
- if (isDuplicate) {
- alert('Исполнитель с таким именем уже существует!');
- return;
- }
-
- const newArtist = await createArtist(artistData);
- console.log('Added Artist:', newArtist);
- setArtists(prevArtists => {
- const enrichedArtist = {
- ...newArtist,
- epoch: epochs.find(epoch => epoch.id === parseInt(newArtist.epochId)),
- country: countries.find(country => country.id === parseInt(newArtist.countryId))
- };
- return [...prevArtists, enrichedArtist].sort((a, b) =>
- sortDirection === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name)
- );
- });
- } catch (error) {
- console.error('Error adding artist:', error);
- throw error;
- }
- };
-
- const handleUpdateArtist = async (artistData) => {
- try {
- // Проверка уникальности имени (кроме текущего исполнителя)
- const isDuplicate = artists.some(artist =>
- artist.name.toLowerCase() === artistData.name.toLowerCase() && artist.id !== editingArtist.id
- );
- if (isDuplicate) {
- alert('Исполнитель с таким именем уже существует!');
- return;
- }
-
- const updatedArtist = await updateArtist(editingArtist.id, artistData);
- console.log('Updated Artist:', updatedArtist);
- setArtists(prevArtists => {
- const enrichedArtist = {
- ...updatedArtist,
- epoch: epochs.find(epoch => epoch.id === parseInt(updatedArtist.epochId)),
- country: countries.find(country => country.id === parseInt(updatedArtist.countryId))
- };
- return prevArtists.map(a => (a.id === updatedArtist.id ? enrichedArtist : a))
- .sort((a, b) =>
- sortDirection === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name)
- );
- });
- setEditingArtist(null);
- } catch (error) {
- console.error('Error updating artist:', error);
- throw error;
- }
- };
-
- const handleDeleteArtist = async (id) => {
- try {
- await deleteArtist(id);
- setArtists(artists.filter(artist => artist.id !== id)
- .sort((a, b) =>
- sortDirection === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name)
- ));
- } catch (error) {
- console.error('Error deleting artist:', error);
- throw error;
- }
- };
-
- const toggleSortDirection = () => {
- setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');
- };
-
- if (loading) {
- return
Загрузка...
;
- }
-
- const enrichedArtists = artists.map(artist => ({
- ...artist,
- epoch: epochs.find(epoch => epoch.id === parseInt(artist.epochId)),
- country: countries.find(country => country.id === parseInt(artist.countryId))
- })).sort((a, b) =>
- sortDirection === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name)
- );
-
- return (
- <>
-
-
-
-
-
-
- Перечень исполнителей панк-рока
-
-
- Список культовых групп жанра
-
-
- Сортировать {sortDirection === 'asc' ? 'А-Я' : 'Я-А'}
-
-
-
-
-
-
-
-
-
- >
- );
-};
-
-export default PunkRockPage;
\ No newline at end of file
diff --git a/punkrock-react/src/services/api.js b/punkrock-react/src/services/api.js
deleted file mode 100644
index 9bfcd23..0000000
--- a/punkrock-react/src/services/api.js
+++ /dev/null
@@ -1,47 +0,0 @@
-const API_URL = 'http://localhost:3000';
-
-export const getArtists = async () => {
- const response = await fetch(`${API_URL}/artists`);
- if (!response.ok) throw new Error('Ошибка загрузки исполнителей');
- return await response.json();
-};
-
-export const getCountries = async () => {
- const response = await fetch(`${API_URL}/countries`);
- if (!response.ok) throw new Error('Ошибка загрузки стран');
- return await response.json();
-};
-
-export const getEpochs = async () => {
- const response = await fetch(`${API_URL}/epochs`);
- if (!response.ok) throw new Error('Ошибка загрузки эпох');
- return await response.json();
-};
-
-export const createArtist = async (artist) => {
- const response = await fetch(`${API_URL}/artists`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(artist)
- });
- if (!response.ok) throw new Error('Ошибка создания исполнителя');
- return await response.json();
-};
-
-export const updateArtist = async (id, artist) => {
- const response = await fetch(`${API_URL}/artists/${id}`, {
- method: 'PATCH',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(artist)
- });
- if (!response.ok) throw new Error('Ошибка обновления исполнителя');
- return await response.json();
-};
-
-export const deleteArtist = async (id) => {
- const response = await fetch(`${API_URL}/artists/${id}`, {
- method: 'DELETE'
- });
- if (!response.ok) throw new Error('Ошибка удаления исполнителя');
- return true;
-};
\ No newline at end of file
diff --git a/punkrock-react/src/styles.css b/punkrock-react/src/styles.css
deleted file mode 100644
index ab21862..0000000
--- a/punkrock-react/src/styles.css
+++ /dev/null
@@ -1,192 +0,0 @@
-:root {
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
- line-height: 1.5;
- font-weight: 400;
-
- color-scheme: light dark;
- color: rgba(255, 255, 255, 0.87);
- background-color: #242424;
-
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- --punk-primary: blueviolet;
- --punk-dark: #121212;
-}
-.btn-outline-secondary{
- --bs-btn-color: blueviolet;
- --bs-btn-border-color: blueviolet;
-}
-a {
- font-size: 16px;
- font-weight: 500;
- color: blueviolet;
- text-decoration: inherit;
-}
-a:hover {
- color: #535bf2;
-}
-
-body {
- margin: 0;
-
-
- min-width: 320px;
- min-height: 100vh;
- background-color: var(--punk-dark);
- color: white;
-}
-
-h1 {
- font-size: 3.2em;
- line-height: 1.1;
- text-align: center;
-}
-.lyrics {
- text-align: center;
- line-height: 1.8;
- font-size: 1.1rem;
-}
-
-.chorus {
- font-weight: bold;
- margin: 1.5rem 0;
-}
-
-#app {
- width: 100%;
- margin: 0;
- padding: 2rem;
- text-align: center;
-}
-
-.logo {
- height: 6em;
- padding: 1.5em;
- will-change: filter;
- transition: filter 300ms;
-}
-.logo:hover {
- filter: drop-shadow(0 0 2em #646cffaa);
-}
-.logo.vanilla:hover {
- filter: drop-shadow(0 0 2em #f7df1eaa);
-}
-/* Анимация карточек */
-.catalog-item {
- transition: transform 0.3s;
-}
-.catalog-item:hover {
- transform: translateY(-5px);
- box-shadow: 0 5px 15px rgba(138, 43, 226, 0.3);
-}
-.btn-punk {
- background-color: blueviolet;
- color: white;
- border: none;
-}
-
-.btn-punk:hover {
- background-color: #9d4edd;
- color: white;
-}
-
-.artist-card {
- transition: all 0.3s;
-}
-
-.artist-card:hover {
- transform: translateY(-5px);
- box-shadow: 0 5px 15px rgba(138, 43, 226, 0.4);
-}
-
-.bg-punk {
- background-color: blueviolet !important;
-}
-/* Стиль кнопок */
-.btn-outline-punk {
- color: blueviolet;
- border-color: blueviolet;
-}
-.btn-outline-punk:hover {
- background-color: blueviolet;
- color: white;
-}
-
-.card {
- padding: 2em;
- color: blueviolet;
-}
-
-.read-the-docs {
- color: #888;
-}
-
-button {
- border-radius: 8px;
- border: 1px solid transparent;
- padding: 0.6em 1.2em;
- font-size: 1em;
- font-weight: 500;
- font-family: inherit;
- background-color: #1a1a1a;
- cursor: pointer;
- transition: border-color 0.25s;
-}
-button:hover {
- border-color: #646cff;
-}
-button:focus,
-button:focus-visible {
- outline: 4px auto -webkit-focus-ring-color;
-}
-.bg-punk {
- background-color: var(--punk-primary) !important;
-}
-
-.text-punk {
- color: var(--punk-primary) !important;
-}
-.border-punk {
- border-color: var(--punk-primary) !important;
-}
-.nav-link:hover, .dropdown-item:hover {
- color: white !important;
- background-color: var(--punk-primary) !important;
-}
-.list-group-item-action:hover {
- transform: translateX(5px);
- transition: transform 0.3s;
-}
-.lead{
- color: blueviolet;
- text-align: center;
- font-size: 20pt;
-}
-
-.navbar {
- box-shadow: 0 0 15px rgba(138, 43, 226, 0.4);
-}
-
-.dropdown-menu {
- background-color: #000 !important;
-}
-
-.nav-link:hover,
-.nav-link:focus {
- text-shadow: 0 0 8px blueviolet;
-}
-
-@media (prefers-color-scheme: light) {
- :root {
- color: #213547;
- background-color: #ffffff;
- }
- a:hover {
- color: #747bff;
- }
- button {
- background-color: #f9f9f9;
- }
-}
diff --git a/~$bWork4Report.docx b/~$bWork4Report.docx
deleted file mode 100644
index 289d252..0000000
Binary files a/~$bWork4Report.docx and /dev/null differ