diff --git a/db.json b/db.json
index 462bdcf..ee88b11 100644
--- a/db.json
+++ b/db.json
@@ -3,12 +3,72 @@
{
"id": "1a54",
"name": "новый товар",
- "price": 102
+ "price": 102,
+ "image": "images/fork.jpg"
},
{
"id": "f4f8",
- "name": " товарчик",
- "price": 111
+ "name": "товарчик",
+ "price": 111,
+ "image": "images/chery.jpg"
+ },
+ {
+ "id": "0fda",
+ "name": "ложка",
+ "price": 48,
+ "image": "images/bananas.jpg"
}
- ]
+ ],
+ "basket": [
+ {
+ "id": "0fda",
+ "name": "ложка",
+ "price": 48,
+ "image": "images/bananas.jpg"
+ }
+ ],
+ "favorites": [
+ {
+ "id": "1a54",
+ "name": "новый товар",
+ "price": 102,
+ "image": "images/fork.jpg"
+ }
+ ],
+ "orders": [
+ {
+ "id": "1",
+ "items": [
+ {
+ "name": "Ложка",
+ "image": "images/spoon.jpg"
+ },
+ {
+ "name": "Вилка",
+ "image": "images/fork.jpg"
+ }
+ ],
+ "status": "in-process"
+ },
+ {
+ "id": "2",
+ "items": [
+ {
+ "name": "Утюг",
+ "image": "images/iron.jpg"
+ },
+ {
+ "name": "Бананы",
+ "image": "images/bananas.jpg"
+ }
+ ],
+ "status": "completed"
+ }
+ ],
+ "profile": {
+ "id": 1,
+ "firstName": "Иван",
+ "lastName": "Иванов",
+ "image": "images/бананы.jpg"
+ }
}
\ No newline at end of file
diff --git a/images/bananas.jpg b/images/bananas.jpg
new file mode 100644
index 0000000..72253b2
Binary files /dev/null and b/images/bananas.jpg differ
diff --git a/images/chery.jpg b/images/chery.jpg
new file mode 100644
index 0000000..eb56566
Binary files /dev/null and b/images/chery.jpg differ
diff --git a/images/child.jpg b/images/child.jpg
new file mode 100644
index 0000000..0b43417
Binary files /dev/null and b/images/child.jpg differ
diff --git a/images/fork.jpg b/images/fork.jpg
new file mode 100644
index 0000000..403ac08
Binary files /dev/null and b/images/fork.jpg differ
diff --git a/images/glasses.jpg b/images/glasses.jpg
new file mode 100644
index 0000000..79537ea
Binary files /dev/null and b/images/glasses.jpg differ
diff --git a/images/gmail.png b/images/gmail.png
new file mode 100644
index 0000000..7bbfd84
Binary files /dev/null and b/images/gmail.png differ
diff --git a/images/iron.jpg b/images/iron.jpg
new file mode 100644
index 0000000..e89dc0d
Binary files /dev/null and b/images/iron.jpg differ
diff --git a/images/knife.jpg b/images/knife.jpg
new file mode 100644
index 0000000..f6972ac
Binary files /dev/null and b/images/knife.jpg differ
diff --git a/images/logo.jpg b/images/logo.jpg
new file mode 100644
index 0000000..0673796
Binary files /dev/null and b/images/logo.jpg differ
diff --git a/images/masha.jpg b/images/masha.jpg
new file mode 100644
index 0000000..c792e3b
Binary files /dev/null and b/images/masha.jpg differ
diff --git a/images/phone.png b/images/phone.png
new file mode 100644
index 0000000..1bab06e
Binary files /dev/null and b/images/phone.png differ
diff --git a/images/screwdriver.jpg b/images/screwdriver.jpg
new file mode 100644
index 0000000..e532741
Binary files /dev/null and b/images/screwdriver.jpg differ
diff --git a/images/skateboard.jpg b/images/skateboard.jpg
new file mode 100644
index 0000000..d2faa38
Binary files /dev/null and b/images/skateboard.jpg differ
diff --git a/images/spoon.jpg b/images/spoon.jpg
new file mode 100644
index 0000000..0872c47
Binary files /dev/null and b/images/spoon.jpg differ
diff --git a/images/telegram.png b/images/telegram.png
new file mode 100644
index 0000000..696e521
Binary files /dev/null and b/images/telegram.png differ
diff --git a/images/vanadiy.jpg b/images/vanadiy.jpg
new file mode 100644
index 0000000..4dca41c
Binary files /dev/null and b/images/vanadiy.jpg differ
diff --git a/images/vk.png b/images/vk.png
new file mode 100644
index 0000000..6846e74
Binary files /dev/null and b/images/vk.png differ
diff --git a/images/бананы.jpg b/images/бананы.jpg
new file mode 100644
index 0000000..712ae29
Binary files /dev/null and b/images/бананы.jpg differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..b22de0c
--- /dev/null
+++ b/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+ Интернет-магазин
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/newSite.html b/newSite.html
deleted file mode 100644
index a167e83..0000000
--- a/newSite.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- Интернет-магазин
-
-
-
- Рекомендуемые товары:
-
-
-
-
-
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 6bf09e2..940f73c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,8 @@
"bootstrap": "5.3.3",
"bootstrap-icons": "1.11.3",
"react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "react-dom": "^19.1.0",
+ "react-router-dom": "^7.6.0"
},
"devDependencies": {
"@vitejs/plugin-react": "^4.4.1",
@@ -2152,6 +2153,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/cookie": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
+ "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/corser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
@@ -5107,6 +5117,44 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-router": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz",
+ "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz",
+ "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
"node_modules/read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
@@ -5411,6 +5459,12 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+ "license": "MIT"
+ },
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
diff --git a/package.json b/package.json
index 1913939..22bdb7b 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
"bootstrap": "5.3.3",
"bootstrap-icons": "1.11.3",
"react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "react-dom": "^19.1.0",
+ "react-router-dom": "^7.6.0"
},
"devDependencies": {
"@vitejs/plugin-react": "^4.4.1",
diff --git a/src/App.jsx b/src/App.jsx
index 46a7e57..7ffacab 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -1,28 +1,26 @@
import React, { useState } from 'react';
-import useProducts from './hooks/useProducts';
-import ProductList from './components/ProductList';
-import ProductForm from './components/ProductForm';
+import { BrowserRouter, Routes, Route } from "react-router-dom";
+import Header from "./components/Header";
+import Footer from "./components/Footer";
+import MainPage from "./pages/MainPage";
+import BasketPage from "./pages/BasketPage";
+import FavoritesPage from "./pages/FavoritesPage";
+import OrderPage from "./pages/OrderPage";
+import AccountPage from "./pages/AccountPage";
export default function App() {
- const { products, add, update, remove } = useProducts();
- const [editing, setEditing] = useState(null);
- const [showForm, setShowForm] = useState(false);
-
- const handleAdd = () => { setEditing(null); setShowForm(true); };
- const handleEdit = prod => { setEditing(prod); setShowForm(true); };
- const handleDelete = id => remove(id);
- const handleSave = prod => {
- editing ? update({ ...prod, id: editing.id }) : add(prod);
- setShowForm(false);
- };
- const handleCancel = () => setShowForm(false);
return (
-
- {/*
Каталог товаров
*/}
-
- {showForm &&
}
-
-
+
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+
);
}
\ No newline at end of file
diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx
new file mode 100644
index 0000000..d1b52ce
--- /dev/null
+++ b/src/components/Footer.jsx
@@ -0,0 +1,29 @@
+import React from "react";
+
+export default function Footer() {
+ return (
+
+ );
+}
diff --git a/src/components/Header.jsx b/src/components/Header.jsx
new file mode 100644
index 0000000..566c2c4
--- /dev/null
+++ b/src/components/Header.jsx
@@ -0,0 +1,28 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+export default function Header() {
+ return (
+
+
+

+
+
Название магазина
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/ProductCard.jsx b/src/components/ProductCard.jsx
index 575c44c..e5f8ce5 100644
--- a/src/components/ProductCard.jsx
+++ b/src/components/ProductCard.jsx
@@ -1,16 +1,22 @@
import React from 'react';
-export default function ProductCard({ product, onEdit, onDelete }) {
+export default function ProductCard({ product, onEdit, onDelete, onAddToFavorites }) {
return (
+ {product.image && (
+

+ )}
{product.name}
Цена: {product.price} ₽
-
+
+
);
-}
\ No newline at end of file
+}
diff --git a/src/components/ProductForm.jsx b/src/components/ProductForm.jsx
index 0538c32..e2df644 100644
--- a/src/components/ProductForm.jsx
+++ b/src/components/ProductForm.jsx
@@ -1,32 +1,72 @@
import React, { useState, useEffect } from 'react';
export default function ProductForm({ initial, onSave, onCancel }) {
- const [form, setForm] = useState({ name: '', price: '' });
+ const [form, setForm] = useState({ name: '', price: '', image: '' });
useEffect(() => {
- if (initial) setForm({ name: initial.name, price: initial.price });
+ if (initial) {
+ setForm({
+ name: initial.name || '',
+ price: initial.price || '',
+ image: initial.image || ''
+ });
+ } else {
+ setForm({ name: '', price: '', image: '' });
+ }
}, [initial]);
const handleChange = e => setForm({ ...form, [e.target.name]: e.target.value });
const handleSubmit = e => {
e.preventDefault();
- onSave({ ...initial, name: form.name, price: Number(form.price) });
- setForm({ name: '', price: '' });
+ onSave({ ...initial, name: form.name, price: Number(form.price), image: form.image });
+ setForm({ name: '', price: '', image: '' });
};
return (
);
-}
\ No newline at end of file
+}
diff --git a/src/components/ProductList.jsx b/src/components/ProductList.jsx
index bd824c6..dbb72aa 100644
--- a/src/components/ProductList.jsx
+++ b/src/components/ProductList.jsx
@@ -1,11 +1,17 @@
import React from 'react';
import ProductCard from './ProductCard';
-export default function ProductList({ products, onEdit, onDelete }) {
+export default function ProductList({ products, onEdit, onDelete, onAddToFavorites }) {
return (
{products.map(prod => (
-
+
))}
);
diff --git a/src/hooks/useBasket.jsx b/src/hooks/useBasket.jsx
new file mode 100644
index 0000000..b84e77f
--- /dev/null
+++ b/src/hooks/useBasket.jsx
@@ -0,0 +1,35 @@
+import { useState, useEffect } from "react";
+
+export default function useBasket() {
+ const [basket, setBasket] = useState([]);
+
+ useEffect(() => {
+ fetch('http://localhost:5000/basket')
+ .then(res => res.json())
+ .then(setBasket);
+ }, []);
+
+ const addToBasket = async (item) => {
+ const res = await fetch('http://localhost:5000/basket', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(item)
+ });
+ const newItem = await res.json();
+ setBasket([...basket, newItem]);
+ };
+
+ const removeFromBasket = async (id) => {
+ await fetch(`http://localhost:5000/basket/${id}`, { method: 'DELETE' });
+ setBasket(basket.filter(item => item.id !== id));
+ };
+
+ const clearBasket = async () => {
+ for (let item of basket) {
+ await fetch(`http://localhost:5000/basket/${item.id}`, { method: 'DELETE' });
+ }
+ setBasket([]);
+ };
+
+ return { basket, addToBasket, removeFromBasket, clearBasket };
+}
diff --git a/src/hooks/useFavorites.jsx b/src/hooks/useFavorites.jsx
new file mode 100644
index 0000000..85dfe53
--- /dev/null
+++ b/src/hooks/useFavorites.jsx
@@ -0,0 +1,28 @@
+import { useState, useEffect } from "react";
+
+export default function useFavorites() {
+ const [favorites, setFavorites] = useState([]);
+
+ useEffect(() => {
+ fetch('http://localhost:5000/favorites')
+ .then(res => res.json())
+ .then(setFavorites);
+ }, []);
+
+ const addToFavorites = async (item) => {
+ const res = await fetch('http://localhost:5000/favorites', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(item)
+ });
+ const newItem = await res.json();
+ setFavorites([...favorites, newItem]);
+ };
+
+ const removeFromFavorites = async (id) => {
+ await fetch(`http://localhost:5000/favorites/${id}`, { method: 'DELETE' });
+ setFavorites(favorites.filter(item => item.id !== id));
+ };
+
+ return { favorites, addToFavorites, removeFromFavorites };
+}
diff --git a/src/hooks/useOrders.jsx b/src/hooks/useOrders.jsx
new file mode 100644
index 0000000..90d374e
--- /dev/null
+++ b/src/hooks/useOrders.jsx
@@ -0,0 +1,26 @@
+import { useState, useEffect } from "react";
+
+export default function useOrders() {
+ const [orders, setOrders] = useState([]);
+
+ useEffect(() => {
+ fetch('http://localhost:5000/orders')
+ .then(res => res.json())
+ .then(setOrders);
+ }, []);
+
+ const addOrder = async (order) => {
+ const res = await fetch('http://localhost:5000/orders', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(order)
+ });
+ const newOrder = await res.json();
+ setOrders([...orders, newOrder]);
+ };
+
+ const inProcess = orders.filter(o => o.status === "in-process");
+ const completed = orders.filter(o => o.status === "completed");
+
+ return { orders, addOrder, inProcess, completed };
+}
diff --git a/src/hooks/useProfile.jsx b/src/hooks/useProfile.jsx
new file mode 100644
index 0000000..73367f3
--- /dev/null
+++ b/src/hooks/useProfile.jsx
@@ -0,0 +1,24 @@
+import { useState, useEffect } from "react";
+
+export default function useProfile() {
+ const [profile, setProfile] = useState(null);
+
+ useEffect(() => {
+ fetch('http://localhost:5000/profile')
+ .then(res => res.json())
+ .then(setProfile);
+ }, []);
+
+ const updateProfile = async (newProfile) => {
+ // PATCH или PUT — по ситуации
+ const res = await fetch('http://localhost:5000/profile', {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(newProfile)
+ });
+ const updated = await res.json();
+ setProfile(updated);
+ };
+
+ return { profile, updateProfile };
+}
diff --git a/src/index.jsx b/src/index.jsx
index 47cc457..c0e4158 100644
--- a/src/index.jsx
+++ b/src/index.jsx
@@ -1,7 +1,8 @@
-import React from 'react'
-import { createRoot } from 'react-dom/client'
-import App from './App'
-import 'bootstrap/dist/css/bootstrap.min.css' // опционально
+import React from "react";
+import { createRoot } from "react-dom/client";
+import App from "./App";
+import "bootstrap/dist/css/bootstrap.min.css";
+import 'bootstrap/dist/js/bootstrap.bundle.min.js';
-const container = document.getElementById('root')
-createRoot(container).render()
\ No newline at end of file
+const container = document.getElementById("root");
+createRoot(container).render();
\ No newline at end of file
diff --git a/src/pages/AccountPage.jsx b/src/pages/AccountPage.jsx
new file mode 100644
index 0000000..acf7595
--- /dev/null
+++ b/src/pages/AccountPage.jsx
@@ -0,0 +1,76 @@
+import React, { useState } from "react";
+import useProfile from "../hooks/useProfile";
+
+export default function AccountPage() {
+ const { profile, updateProfile } = useProfile();
+ const [showEdit, setShowEdit] = useState(false);
+ const [form, setForm] = useState(null);
+
+ if (!profile) {
+ return Загрузка...
;
+ }
+
+ const handleEdit = () => {
+ setForm(profile);
+ setShowEdit(true);
+ };
+
+ const handleChange = e => {
+ setForm({ ...form, [e.target.name]: e.target.value });
+ };
+
+ const handleSave = async e => {
+ e.preventDefault();
+ await updateProfile(form);
+ setShowEdit(false);
+ };
+
+ const handleCancel = () => setShowEdit(false);
+
+ return (
+
+
+

+
+
{profile.firstName} {profile.lastName}
+
+
+
+
+ {showEdit && (
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/src/pages/BasketPage.jsx b/src/pages/BasketPage.jsx
new file mode 100644
index 0000000..f39fb6e
--- /dev/null
+++ b/src/pages/BasketPage.jsx
@@ -0,0 +1,45 @@
+import React from "react";
+import useBasket from "../hooks/useBasket";
+import useOrders from "../hooks/useOrders";
+
+export default function BasketPage() {
+
+ const { basket, removeFromBasket, clearBasket } = useBasket();
+ const { addOrder } = useOrders();
+
+ const handleCheckout = () => {
+ if (basket.length === 0) {
+ alert("Корзина пуста");
+ return;
+ }
+ // Сформируем заказ
+ addOrder({
+ items: basket,
+ status: "in-process"
+ });
+ clearBasket(); // Очищаем корзину
+ alert("Заказ оформлен!");
+ };
+
+ return (
+
+
+
Корзина
+
+ {basket.map(item => (
+ -
+
+ {item.name} {item.price} руб.
+
+
+ ))}
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/FavoritesPage.jsx b/src/pages/FavoritesPage.jsx
new file mode 100644
index 0000000..a050f7e
--- /dev/null
+++ b/src/pages/FavoritesPage.jsx
@@ -0,0 +1,34 @@
+import React from "react";
+import useBasket from "../hooks/useBasket";
+import useFavorites from "../hooks/useFavorites";
+
+export default function FavoritesPage() {
+ const { favorites, removeFromFavorites } = useFavorites();
+ const { basket, addToBasket } = useBasket();
+
+ const handleAddToBasket = (item) => {
+ addToBasket(item);
+ removeFromFavorites(item.id);
+ };
+
+ return (
+
+
Избранное
+
+ {favorites.map(item => (
+
+
+

+
+
{item.name}
+
{item.price}
+
+
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/src/pages/MainPage.jsx b/src/pages/MainPage.jsx
new file mode 100644
index 0000000..4eb2608
--- /dev/null
+++ b/src/pages/MainPage.jsx
@@ -0,0 +1,42 @@
+import React, { useState } from "react";
+import useProducts from "../hooks/useProducts";
+import useFavorites from "../hooks/useFavorites";
+import ProductList from "../components/ProductList";
+import ProductForm from "../components/ProductForm";
+
+export default function MainPage() {
+ const { products, add, update, remove } = useProducts();
+ const { favorites, addToFavorites } = useFavorites();
+ const [editing, setEditing] = useState(null);
+ const [showForm, setShowForm] = useState(false);
+
+ const handleAdd = () => { setEditing(null); setShowForm(true); };
+ const handleEdit = prod => { setEditing(prod); setShowForm(true); };
+ const handleDelete = id => remove(id);
+ const handleSave = prod => {
+ editing ? update({ ...prod, id: editing.id }) : add(prod);
+ setShowForm(false);
+ };
+ const handleCancel = () => setShowForm(false);
+
+ const handleAddToFavorites = product => {
+ if (!favorites.some(fav => fav.id === product.id)) {
+ addToFavorites(product);
+ }
+ else alert('Товар уже в избранном!');
+ };
+
+ return (
+
+
+ {showForm && }
+ Рекомендуемые товары:
+
+
+ );
+}
diff --git a/src/pages/OrderPage.jsx b/src/pages/OrderPage.jsx
new file mode 100644
index 0000000..b67176b
--- /dev/null
+++ b/src/pages/OrderPage.jsx
@@ -0,0 +1,58 @@
+import React from "react";
+import useOrders from "../hooks/useOrders";
+
+export default function OrderPage() {
+ const { inProcess, completed } = useOrders();
+
+ return (
+
+
Заказы
+
+
+
+
+
В процессе
+
+
+ {inProcess.length === 0 ? (
+
Нет заказов
+ ) : (
+ inProcess.map(order => (
+
+ {order.items.map((item, idx) => (
+ -
+
{item.name}
+
+ ))}
+
+ ))
+ )}
+
+
+
+
+
+
+
Завершённые
+
+
+ {completed.length === 0 ? (
+
Нет завершённых заказов
+ ) : (
+ completed.map(order => (
+
+ {order.items.map((item, idx) => (
+ -
+
{item.name}
+
+ ))}
+
+ ))
+ )}
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
index 1f83c39..0cb0850 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -18,7 +18,7 @@ export default defineConfig({
},
},
server: {
- open: '/newSite.html',
+ open: '/',
},
resolve: {
alias: {
diff --git a/Отчет4.docx b/Отчет4.docx
new file mode 100644
index 0000000..6465016
Binary files /dev/null and b/Отчет4.docx differ
diff --git a/Отчет5.docx b/Отчет5.docx
new file mode 100644
index 0000000..52c0839
Binary files /dev/null and b/Отчет5.docx differ
diff --git a/Отчет6.docx b/Отчет6.docx
new file mode 100644
index 0000000..a8c394d
Binary files /dev/null and b/Отчет6.docx differ