From c93685d8ad27d176f6a143dde1a13d9e4af60c58 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Fri, 16 Feb 2024 21:51:44 +0700 Subject: [PATCH 01/15] initial commit --- src/components/header.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/header.js b/src/components/header.js index 95ed85f..324b12c 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -26,6 +26,7 @@ function Header(){ Вход + ); From d59d6ea0ecd74c46ec8ecf25d9f33a659399bdff Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sun, 18 Feb 2024 00:49:48 +0700 Subject: [PATCH 02/15] =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=83=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 9 +++++++ package.json | 1 + src/components/header.js | 12 +++++---- src/components/login.js | 4 +-- src/components/userCard.js | 37 +++++++++++++++++++++++++++ src/components/users.js | 52 ++++++++++++++++++++++++++++++++++++++ src/router/router.js | 7 +++++ 7 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 src/components/userCard.js create mode 100644 src/components/users.js diff --git a/package-lock.json b/package-lock.json index 892300e..971a1fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "react-bootstrap": "^2.10.1", "react-bootstrap-icons": "^1.10.3", "react-dom": "^18.2.0", + "react-icons": "^5.0.1", "react-router-dom": "^6.22.0", "web-vitals": "^2.1.4" }, @@ -16284,6 +16285,14 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, + "node_modules/react-icons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", + "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/package.json b/package.json index 3ef7268..22b4d53 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "react-bootstrap": "^2.10.1", "react-bootstrap-icons": "^1.10.3", "react-dom": "^18.2.0", + "react-icons": "^5.0.1", "react-router-dom": "^6.22.0", "web-vitals": "^2.1.4" }, diff --git a/src/components/header.js b/src/components/header.js index 324b12c..3d36e61 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -19,11 +19,13 @@ function Header(){ TSU.Ключи - Заявки - Пользователи - Ключи - - Вход + Заявки + + Пользователи + + Ключи + + Вход diff --git a/src/components/login.js b/src/components/login.js index f419a5a..6feb4b8 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -11,11 +11,11 @@ export default function Login(){
Email - + Пароль - +
diff --git a/src/components/userCard.js b/src/components/userCard.js new file mode 100644 index 0000000..0aa7b7f --- /dev/null +++ b/src/components/userCard.js @@ -0,0 +1,37 @@ +import React from "react"; +import { Container, Row, Col, Button, Navbar, Image,Dropdown,DropdownButton, CardBody, Card, CardTitle, CardHeader, FormGroup, FormLabel, FormControl, FormSelect } from 'react-bootstrap'; +import { BsPencilFill } from "react-icons/bs"; + +export default function UserCard(props){ + const { name, role } = props; + + const roleClass = role === 'Студент' ? 'bg-success' : 'bg-info'; + + + return( +
+ + + + +
+ {name} +
+ + {role} + + +
+
+
+
+
+ + + ); +} \ No newline at end of file diff --git a/src/components/users.js b/src/components/users.js new file mode 100644 index 0000000..91e023f --- /dev/null +++ b/src/components/users.js @@ -0,0 +1,52 @@ +import React from "react"; +import { Container, Row, Col, Button, Navbar, Image,Dropdown,DropdownButton, CardBody, Card, CardTitle, CardHeader, FormGroup, FormLabel, FormControl, FormSelect } from 'react-bootstrap'; +import UserCard from '../components/userCard' +// import { BsPencilFill } from "react-icons/bs"; + +export default function UsersPage(){ + const data=[ + { + name: 'Иванов Иван', + role: 'Студент' + + }, + { + name: 'Чел Человский', + role: 'Преподаватель' + } + ] + return( + + + + + Фильтры + + + + Поиск по имени пользователя + + + + Сортировка по роли + + + + + + + + + +
+ {data.map((user)=>( + + ))} +
+ +
+ ); +} \ No newline at end of file diff --git a/src/router/router.js b/src/router/router.js index 481fe2d..73af4dc 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -2,6 +2,7 @@ import React from 'react'; import { Routes, Route} from 'react-router'; import Header from '../components/header'; import Login from '../components/login'; +import UsersPage from '../components/users'; export default function Router(){ return( @@ -13,6 +14,12 @@ export default function Router(){ }/> + +
+ + + }/> ); } \ No newline at end of file From 08751b365f9e24189568016389f10a9250d42cf6 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Mon, 19 Feb 2024 03:39:30 +0700 Subject: [PATCH 03/15] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9,=20?= =?UTF-8?q?=D0=B0=20=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=20=D1=80=D0=BE=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/userCard.js | 69 +++++++++++++++++++++++++++++--------- src/components/users.js | 13 +++++-- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/components/userCard.js b/src/components/userCard.js index 0aa7b7f..3303c0e 100644 --- a/src/components/userCard.js +++ b/src/components/userCard.js @@ -1,37 +1,74 @@ -import React from "react"; -import { Container, Row, Col, Button, Navbar, Image,Dropdown,DropdownButton, CardBody, Card, CardTitle, CardHeader, FormGroup, FormLabel, FormControl, FormSelect } from 'react-bootstrap'; +import React, {useState} from "react"; +import { Form, ModalHeader,ModalTitle,ModalBody, ModalFooter, Container, Row, Col, Button, Navbar, Image,Modal,CardBody, Card, CardTitle, CardHeader, FormGroup, FormLabel, FormControl, FormSelect } from 'react-bootstrap'; import { BsPencilFill } from "react-icons/bs"; export default function UserCard(props){ - const { name, role } = props; + const { name, role, email } = props; - const roleClass = role === 'Студент' ? 'bg-success' : 'bg-info'; + let roleClass; + if(role==='Студент'){ + roleClass='bg-success' + } + if(role==='Преподаватель'){ + roleClass='bg-info' + } + if(role==='Пользователь'){ + roleClass='bg-secondary' + } + const [showModal, setShowModal] = useState(false); + const [selectedRole, setSelectedRole] = useState(role); - return( + const handleClose = () => setShowModal(false); + const handleShow = () => setShowModal(true); + + const handleRoleChange = (e) => { + setSelectedRole(e.target.value); + }; + + return (
- - - + +
{name} -
- - {role} - - +
+ {email}
+ + + + Назначить роль + + +
+ + Выберите роль: + + + + + +
+
+ + + + +
- - ); } \ No newline at end of file diff --git a/src/components/users.js b/src/components/users.js index 91e023f..5916db0 100644 --- a/src/components/users.js +++ b/src/components/users.js @@ -7,19 +7,25 @@ export default function UsersPage(){ const data=[ { name: 'Иванов Иван', - role: 'Студент' + role: 'Студент', + email: 'exemple@gmail.com' }, { name: 'Чел Человский', - role: 'Преподаватель' + role: 'Преподаватель', + email: 'exemple@gmail.com' + }, + { + name: 'Рандом юзер', + role: 'Пользователь', + email: 'exemple@gmail.com' } ] return( - Фильтры @@ -43,6 +49,7 @@ export default function UsersPage(){ ))}
From 0278e17aca3c911666fe2c356fee9a48fe2a98f7 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Mon, 19 Feb 2024 21:41:12 +0700 Subject: [PATCH 04/15] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=BE=D0=B2,=20=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=84=D0=B8=D1=87=D1=83=20=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D0=B2=D0=B5=D1=82=D0=BA=D0=BE=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=83=D1=89=D0=B5=D0=B9=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header.js | 69 ++++++++++++++++++++++++++++------------ src/components/users.js | 10 ++++-- 2 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index 3d36e61..c8b2682 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -1,37 +1,66 @@ -import React from "react"; -import { Container, Row, Col, Button, Navbar, Image,Dropdown,DropdownButton } from 'react-bootstrap'; -import { Link } from "react-router-dom"; +import React, { useState, useEffect } from "react"; +import { Container, Row, Col, Button, Navbar, Image, Dropdown, DropdownButton } from 'react-bootstrap'; +import { Link, useLocation } from "react-router-dom"; +function Header() { + const location = useLocation(); + const [headerText, setHeaderText] = useState(""); + useEffect(() => { + + switch (location.pathname) { + case "/users": + setHeaderText("Пользователи"); + break; + case "/login": + setHeaderText("Вход"); + break; + case "/keys": + setHeaderText("Ключи"); + break; + case "/requests": + setHeaderText("Заявки"); + break; + + default: + setHeaderText(""); + break; + } + }, [location]); -function Header(){ return (
+ src="https://facultetus.ru/images/universities/fe528b970af8e7a11ee44374ecd12e24.png" + width="35" + height="35" + style={{ filter: 'brightness(0) invert(1)' }} + className="mb-2" + /> TSU.Ключи - - Заявки - - Пользователи + + + {headerText === "Заявки" ? Заявки : "Вход"} + - Ключи - - Вход + + {headerText === "Пользователи" ? Пользователи : "Пользователи"} + + + {headerText === "Ключи" ? Ключи : "Вход"} + - - + + {headerText === "Вход" ? Вход : "Вход"} + + +
); } -export default Header \ No newline at end of file +export default Header; diff --git a/src/components/users.js b/src/components/users.js index 5916db0..c1ee29d 100644 --- a/src/components/users.js +++ b/src/components/users.js @@ -6,17 +6,22 @@ import UserCard from '../components/userCard' export default function UsersPage(){ const data=[ { + key: '1', name: 'Иванов Иван', role: 'Студент', email: 'exemple@gmail.com' }, { + key: '2', + name: 'Чел Человский', role: 'Преподаватель', email: 'exemple@gmail.com' }, { + key: '3', + name: 'Рандом юзер', role: 'Пользователь', email: 'exemple@gmail.com' @@ -30,11 +35,11 @@ export default function UsersPage(){ - Поиск по имени пользователя + Поиск по имени пользователя - Сортировка по роли + Сортировка по роли @@ -47,6 +52,7 @@ export default function UsersPage(){
{data.map((user)=>( Date: Mon, 19 Feb 2024 23:16:34 +0700 Subject: [PATCH 05/15] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=85=D0=B5=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B5,=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D1=81?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=BA=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header.js | 4 ++-- src/components/userCard.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index c8b2682..8381077 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -43,14 +43,14 @@ function Header() { - {headerText === "Заявки" ? Заявки : "Вход"} + {headerText === "Заявки" ? Заявки : "Заявки"} {headerText === "Пользователи" ? Пользователи : "Пользователи"} - {headerText === "Ключи" ? Ключи : "Вход"} + {headerText === "Ключи" ? Ключи : "Ключи"} diff --git a/src/components/userCard.js b/src/components/userCard.js index 3303c0e..3832b12 100644 --- a/src/components/userCard.js +++ b/src/components/userCard.js @@ -42,7 +42,7 @@ export default function UserCard(props){ {email}
- + Назначить роль From e0991059ea58a54bc4f35b9f8f1fbcb361496b43 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Wed, 21 Feb 2024 23:51:37 +0700 Subject: [PATCH 06/15] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D1=84=D0=B8=D0=B4=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9,?= =?UTF-8?q?=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82?= =?UTF-8?q?=D0=B8=D0=B2=D0=BD=D1=8B=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/userCard.js | 88 ++++++++++++++++++++------------------ src/components/users.js | 27 +++++++----- 2 files changed, 63 insertions(+), 52 deletions(-) diff --git a/src/components/userCard.js b/src/components/userCard.js index 3832b12..6cf3de9 100644 --- a/src/components/userCard.js +++ b/src/components/userCard.js @@ -1,6 +1,6 @@ import React, {useState} from "react"; import { Form, ModalHeader,ModalTitle,ModalBody, ModalFooter, Container, Row, Col, Button, Navbar, Image,Modal,CardBody, Card, CardTitle, CardHeader, FormGroup, FormLabel, FormControl, FormSelect } from 'react-bootstrap'; -import { BsPencilFill } from "react-icons/bs"; +import { BsFillPersonFill } from "react-icons/bs"; export default function UserCard(props){ const { name, role, email } = props; @@ -27,48 +27,54 @@ export default function UserCard(props){ }; return ( -
- - - -
- {name} -
- {email} -
- - - - Назначить роль - - -
- - Выберите роль: - - - - - -
-
- - - - -
+ + + + + {/* Avatar */} + {/* */} + + {name} +
+ {email}
+ + + + + + + Назначить роль + + +
+ + Выберите роль: + + + + + +
+
+ + + + +
+
-
+ + ); } \ No newline at end of file diff --git a/src/components/users.js b/src/components/users.js index c1ee29d..207ead7 100644 --- a/src/components/users.js +++ b/src/components/users.js @@ -38,7 +38,7 @@ export default function UsersPage(){ Поиск по имени пользователя - + Сортировка по роли @@ -49,16 +49,21 @@ export default function UsersPage(){
-
- {data.map((user)=>( - - ))} -
+ + +
+ {data.map((user)=>( + + ))} +
+
+
+ ); From 9525107e8143bf03a9d162161b6c145e3324e7c3 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Fri, 23 Feb 2024 15:15:27 +0700 Subject: [PATCH 07/15] =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BA?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/requests/requestsMetods.js | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/requests/requestsMetods.js diff --git a/src/requests/requestsMetods.js b/src/requests/requestsMetods.js new file mode 100644 index 0000000..9cdab15 --- /dev/null +++ b/src/requests/requestsMetods.js @@ -0,0 +1,43 @@ +import React from "react"; + +export async function Login(data){ + try { + const response = await fetch('https://example.com/api/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + if (!response.ok) { + throw new Error('Ошибка входа: ' + response.statusText); + } + console.log('Успешный вход:', data); + return await response.json(); + } catch (error) { + console.error('Ошибка входа:', error.message); + throw error; + } +} +export async function Logout(urlToFetch, token){ + try { + const response = await fetch(urlToFetch, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + + } + }); + if (!response.ok) { + throw new Error('Ошибка входа: ' + response.statusText); + } + // const data = await response.json(); + + // console.log('Успешный вход:', data); + return response.status + } catch (error) { + console.error('Ошибка входа:', error.message); + throw error; + } +} \ No newline at end of file From 0136fbf85dd24195c41967ee309d776f34e51313 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Fri, 23 Feb 2024 15:17:59 +0700 Subject: [PATCH 08/15] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/login.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/login.js b/src/components/login.js index 6feb4b8..0d5831f 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -1,8 +1,16 @@ -import React from "react"; +import React, { useState } from "react"; import { Container, Row, Col, Button, Navbar, Image,Dropdown,DropdownButton, Card, CardBody, CardTitle,Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; export default function Login(){ + + const [data, setData]=useState({ + email: '', + password: '' + }) + + + return ( From 1f9e0e9afbdc2aacf8712b1ed790b9f5f85a7317 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sat, 24 Feb 2024 00:26:52 +0700 Subject: [PATCH 09/15] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=20=D0=BA=20=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 153 +++++++++++++++++++++++++++++++-- package.json | 1 + src/components/login.js | 60 +++++++++++-- src/requests/requestsMetods.js | 36 ++++---- 4 files changed, 219 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 971a1fb..d1578cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "react-bootstrap-icons": "^1.10.3", "react-dom": "^18.2.0", "react-icons": "^5.0.1", + "react-loader-spinner": "^6.1.6", "react-router-dom": "^6.22.0", "web-vitals": "^2.1.4" }, @@ -2443,6 +2444,24 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -4924,6 +4943,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, + "node_modules/@types/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" + }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.9", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", @@ -6511,6 +6535,14 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -6991,6 +7023,14 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -7193,6 +7233,16 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -13787,7 +13837,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -14361,8 +14410,7 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -15798,8 +15846,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -16303,6 +16350,27 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "node_modules/react-loader-spinner": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-6.1.6.tgz", + "integrity": "sha512-x5h1Jcit7Qn03MuKlrWcMG9o12cp9SNDVHVJTNRi9TgtGPKcjKiXkou4NRfLAtXaFB3+Z8yZsVzONmPzhv2ErA==", + "dependencies": { + "react-is": "^18.2.0", + "styled-components": "^6.1.2" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loader-spinner/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -17277,6 +17345,11 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -17374,7 +17447,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17854,6 +17926,70 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz", + "integrity": "sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==", + "dependencies": { + "@emotion/is-prop-valid": "1.2.1", + "@emotion/unitless": "0.8.0", + "@types/stylis": "4.2.0", + "css-to-react-native": "3.2.0", + "csstype": "3.1.2", + "postcss": "8.4.31", + "shallowequal": "1.1.0", + "stylis": "4.3.1", + "tslib": "2.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -17870,6 +18006,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", diff --git a/package.json b/package.json index 22b4d53..ac71717 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "react-bootstrap-icons": "^1.10.3", "react-dom": "^18.2.0", "react-icons": "^5.0.1", + "react-loader-spinner": "^6.1.6", "react-router-dom": "^6.22.0", "web-vitals": "^2.1.4" }, diff --git a/src/components/login.js b/src/components/login.js index 0d5831f..71cc2ce 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -1,31 +1,77 @@ import React, { useState } from "react"; -import { Container, Row, Col, Button, Navbar, Image,Dropdown,DropdownButton, Card, CardBody, CardTitle,Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - +import { Container, Row, Col, Button, Alert,Navbar, Image,Dropdown,DropdownButton, Card, CardBody, CardTitle,Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; +import { LoginFetch } from "../requests/requestsMetods"; +import { useNavigate } from "react-router-dom"; +import { LineWave as Loader} from "react-loader-spinner"; export default function Login(){ + const navigate = useNavigate(); const [data, setData]=useState({ email: '', password: '' }) + const [loading, setLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState('') + const handleEmailChange=(e)=>{ + setData({ + ...data, + email: e.target.value + }) + } + const handlePasswordChange=(e)=>{ + setData({ + ...data, + password: e.target.value + }) + } + const handleSubmit=async (e)=>{ + e.preventDefault() + setLoading(true); + const response=await LoginFetch(data) + const responseData=await response.json() + // console.log(response) + setTimeout(() => { + setLoading(false); + if (response.status === 200) { + localStorage.setItem('token', responseData.token) + navigate('/users'); + // console.log(responseData); + } + else { + setErrorMessage('Неправильный пароль или email'); + } + }, 1000); + + } return ( Вход -
+ Email - + - + Пароль - + - + {loading ? ( +
+ +
+ ) :} + + {errorMessage && {errorMessage}}
diff --git a/src/requests/requestsMetods.js b/src/requests/requestsMetods.js index 9cdab15..b938268 100644 --- a/src/requests/requestsMetods.js +++ b/src/requests/requestsMetods.js @@ -1,23 +1,23 @@ import React from "react"; -export async function Login(data){ - try { - const response = await fetch('https://example.com/api/login', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(data) - }); - if (!response.ok) { - throw new Error('Ошибка входа: ' + response.statusText); - } - console.log('Успешный вход:', data); - return await response.json(); - } catch (error) { - console.error('Ошибка входа:', error.message); - throw error; - } +export async function LoginFetch(data){ + // try { + const response = await fetch('https://blog.kreosoft.space/api/account/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + // if (!response.ok) { + // throw new Error('Ошибка входа: ' + response.statusText); + // } + // console.log('Успешный вход:', data); + return await response; + // } catch (error) { + // console.error('Ошибка входа:', error.message); + // throw error; + // } } export async function Logout(urlToFetch, token){ try { From 48b42cfae35628b6a76903573a9a7f6d4514c7b9 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sat, 24 Feb 2024 00:35:52 +0700 Subject: [PATCH 10/15] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=85=D0=B5=D0=B4=D0=B5=D1=80=20(=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=85=D0=BE?= =?UTF-8?q?=D0=B4/=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=20=D0=B2=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BE?= =?UTF-8?q?=D1=82=20=D0=B0=D1=83=D1=82=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=86=D0=B8=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index 8381077..f270b77 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -28,6 +28,12 @@ function Header() { } }, [location]); + const token=localStorage.getItem('token') + + const handleLogout = () => { + // Ваша логика для выхода + }; + return (
@@ -53,11 +59,16 @@ function Header() { {headerText === "Ключи" ? Ключи : "Ключи"} - - {headerText === "Вход" ? Вход : "Вход"} - - - + { + token ? ( + + Выход + + ) : + {headerText === "Вход" ? Вход : "Вход"} + + } +
); From 096079e12b6cb829a5c50362ebd86f2d513451d8 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sat, 24 Feb 2024 01:11:48 +0700 Subject: [PATCH 11/15] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header.js | 20 +++++++++++------ src/requests/requestsMetods.js | 39 ++++++++++------------------------ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/components/header.js b/src/components/header.js index f270b77..714b7d4 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; import { Container, Row, Col, Button, Navbar, Image, Dropdown, DropdownButton } from 'react-bootstrap'; -import { Link, useLocation } from "react-router-dom"; +import { Link, useLocation, useNavigate } from "react-router-dom"; +import { LogoutFetch } from "../requests/requestsMetods"; function Header() { const location = useLocation(); @@ -29,9 +30,15 @@ function Header() { }, [location]); const token=localStorage.getItem('token') + const navigate = useNavigate(); - const handleLogout = () => { - // Ваша логика для выхода + const handleLogout = async (e) => { + e.preventDefault() + const response=await LogoutFetch(token) + if (response){ + localStorage.clear() + navigate('/login') + } }; return ( @@ -61,9 +68,10 @@ function Header() { { token ? ( - - Выход - + Выход + // + // Выход + // ) : {headerText === "Вход" ? Вход : "Вход"} diff --git a/src/requests/requestsMetods.js b/src/requests/requestsMetods.js index b938268..8923552 100644 --- a/src/requests/requestsMetods.js +++ b/src/requests/requestsMetods.js @@ -9,35 +9,18 @@ export async function LoginFetch(data){ }, body: JSON.stringify(data) }); - // if (!response.ok) { - // throw new Error('Ошибка входа: ' + response.statusText); - // } - // console.log('Успешный вход:', data); + return await response; - // } catch (error) { - // console.error('Ошибка входа:', error.message); - // throw error; - // } + } -export async function Logout(urlToFetch, token){ - try { - const response = await fetch(urlToFetch, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${token}`, - 'Content-Type': 'application/json' - - } - }); - if (!response.ok) { - throw new Error('Ошибка входа: ' + response.statusText); - } - // const data = await response.json(); +export async function LogoutFetch(token){ - // console.log('Успешный вход:', data); - return response.status - } catch (error) { - console.error('Ошибка входа:', error.message); - throw error; - } + const response = await fetch('https://blog.kreosoft.space/api/account/logout', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + return response.json() } \ No newline at end of file From 315fda0782603249fc5f085cb84266e6649b1f53 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sun, 25 Feb 2024 00:26:41 +0700 Subject: [PATCH 12/15] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=85?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D1=80=D0=B0=20=D0=B2=20=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BE=D1=82?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 34 +++++++++++++--------------------- package.json | 1 + src/components/header.js | 20 +++++++++++++++++--- src/components/login.js | 8 +++++--- src/requests/requestsMetods.js | 7 ++++--- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1578cc..619dec2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "bootstrap": "^5.3.2", + "http-proxy-middleware": "^2.0.6", "react": "^18.2.0", "react-bootstrap": "^2.10.1", "react-bootstrap-icons": "^1.10.3", @@ -4406,7 +4407,7 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -4425,7 +4426,7 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*" } @@ -4470,7 +4471,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -4482,7 +4483,7 @@ "version": "4.17.43", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4509,13 +4510,12 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "devOptional": true }, "node_modules/@types/http-proxy": { "version": "1.17.14", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -4793,7 +4793,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "devOptional": true }, "node_modules/@types/node": { "version": "20.11.17", @@ -4839,13 +4839,13 @@ "version": "6.9.11", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true + "devOptional": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.2.55", @@ -4903,7 +4903,7 @@ "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -4922,7 +4922,7 @@ "version": "1.15.5", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -8926,8 +8926,7 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", @@ -9290,7 +9289,6 @@ "version": "1.15.5", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "dev": true, "funding": [ { "type": "individual", @@ -10155,7 +10153,6 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -10183,7 +10180,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -10544,7 +10540,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10598,7 +10593,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -10676,7 +10670,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, "engines": { "node": ">=10" }, @@ -16714,8 +16707,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { "version": "1.22.8", diff --git a/package.json b/package.json index ac71717..2d562ab 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "bootstrap": "^5.3.2", + "http-proxy-middleware": "^2.0.6", "react": "^18.2.0", "react-bootstrap": "^2.10.1", "react-bootstrap-icons": "^1.10.3", diff --git a/src/components/header.js b/src/components/header.js index 714b7d4..abcf543 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -55,7 +55,7 @@ function Header() { TSU.Ключи - + {/* {headerText === "Заявки" ? Заявки : "Заявки"} @@ -65,10 +65,24 @@ function Header() { {headerText === "Ключи" ? Ключи : "Ключи"} - + */} { token ? ( - Выход +
+ + {headerText === "Заявки" ? Заявки : "Заявки"} + + + + {headerText === "Пользователи" ? Пользователи : "Пользователи"} + + + {headerText === "Ключи" ? Ключи : "Ключи"} + + + Выход + +
// // Выход // diff --git a/src/components/login.js b/src/components/login.js index 71cc2ce..a3c9aaa 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -30,13 +30,15 @@ export default function Login(){ const handleSubmit=async (e)=>{ e.preventDefault() setLoading(true); + const response=await LoginFetch(data) - const responseData=await response.json() + debugger + //const responseData=await response.json() // console.log(response) setTimeout(() => { setLoading(false); - if (response.status === 200) { - localStorage.setItem('token', responseData.token) + if (response.token) { + localStorage.setItem('token', response.token) navigate('/users'); // console.log(responseData); } diff --git a/src/requests/requestsMetods.js b/src/requests/requestsMetods.js index 8923552..4fe0fdb 100644 --- a/src/requests/requestsMetods.js +++ b/src/requests/requestsMetods.js @@ -3,19 +3,20 @@ import React from "react"; export async function LoginFetch(data){ // try { const response = await fetch('https://blog.kreosoft.space/api/account/login', { + // mode: 'no-cors', method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); - - return await response; + debugger + return response.json(); } export async function LogoutFetch(token){ - const response = await fetch('https://blog.kreosoft.space/api/account/logout', { + const response = await fetch('http://89.111.174.112:8181/Logout', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, From f8d88bb0ba63458b9baf05cd600772b999e0c518 Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sun, 25 Feb 2024 01:17:04 +0700 Subject: [PATCH 13/15] =?UTF-8?q?=D0=B1=D1=8B=D1=81=D1=82=D1=80=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B0=D0=BF=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/login.js | 4 +--- src/requests/requestsMetods.js | 10 +++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/login.js b/src/components/login.js index a3c9aaa..f46d706 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -32,9 +32,7 @@ export default function Login(){ setLoading(true); const response=await LoginFetch(data) - debugger - //const responseData=await response.json() - // console.log(response) + setTimeout(() => { setLoading(false); if (response.token) { diff --git a/src/requests/requestsMetods.js b/src/requests/requestsMetods.js index 4fe0fdb..7217021 100644 --- a/src/requests/requestsMetods.js +++ b/src/requests/requestsMetods.js @@ -2,26 +2,26 @@ import React from "react"; export async function LoginFetch(data){ // try { - const response = await fetch('https://blog.kreosoft.space/api/account/login', { - // mode: 'no-cors', + const response = await fetch('http://89.111.174.112:8181/user/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); - debugger + return response.json(); } export async function LogoutFetch(token){ - const response = await fetch('http://89.111.174.112:8181/Logout', { + const response = await fetch('http://89.111.174.112:8181/user/logout', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); - return response.json() + + return response } \ No newline at end of file From dda5bb3c6baca0db5956f8d3d95656b75926eafb Mon Sep 17 00:00:00 2001 From: koteuka201 Date: Sun, 25 Feb 2024 16:21:55 +0700 Subject: [PATCH 14/15] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=20=D0=B2=D1=85=D0=BE=D0=B4=20=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BE=D1=82=20=D1=80=D0=BE=D0=BB=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/login.js | 16 ++++++++++++---- src/requests/requestsMetods.js | 12 ++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/login.js b/src/components/login.js index f46d706..d778fb8 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Container, Row, Col, Button, Alert,Navbar, Image,Dropdown,DropdownButton, Card, CardBody, CardTitle,Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import { LoginFetch } from "../requests/requestsMetods"; +import { LoginFetch, ProfileFetch } from "../requests/requestsMetods"; import { useNavigate } from "react-router-dom"; import { LineWave as Loader} from "react-loader-spinner"; @@ -33,11 +33,19 @@ export default function Login(){ const response=await LoginFetch(data) - setTimeout(() => { + setTimeout(async () => { setLoading(false); if (response.token) { - localStorage.setItem('token', response.token) - navigate('/users'); + const responseProfile=await ProfileFetch(response.token) + console.log('role',responseProfile.role) + if (responseProfile.role==='DeanTeacher' || responseProfile.role==='Dean' || responseProfile.role==='Administrator'){ + localStorage.setItem('token', response.token) + navigate('/users'); + } + else{ + setErrorMessage('У вас недостаточно прав доступа! Обратитесь к администратору'); + } + // console.log(responseData); } else { diff --git a/src/requests/requestsMetods.js b/src/requests/requestsMetods.js index 7217021..c8511eb 100644 --- a/src/requests/requestsMetods.js +++ b/src/requests/requestsMetods.js @@ -24,4 +24,16 @@ export async function LogoutFetch(token){ }); return response +} +export async function ProfileFetch(token){ + + const response = await fetch('http://89.111.174.112:8181/user/getProfile', { + method: 'GET', + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + return response.json() } \ No newline at end of file From e3ccf2f76c20165624d2e840e84e3e03d827d811 Mon Sep 17 00:00:00 2001 From: Dmitriy Reshchikov <99999dimka99999@gmail.com> Date: Tue, 27 Feb 2024 12:32:53 +0700 Subject: [PATCH 15/15] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 26 +++++------ package.json | 2 +- src/components/Requests/requestCard.jsx | 60 +++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 src/components/Requests/requestCard.jsx diff --git a/package-lock.json b/package-lock.json index 619dec2..4cfca3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "react-dom": "^18.2.0", "react-icons": "^5.0.1", "react-loader-spinner": "^6.1.6", - "react-router-dom": "^6.22.0", + "react-router-dom": "^6.22.1", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -3641,9 +3641,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", - "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz", + "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==", "engines": { "node": ">=14.0.0" } @@ -16374,11 +16374,11 @@ } }, "node_modules/react-router": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz", - "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==", + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz", + "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==", "dependencies": { - "@remix-run/router": "1.15.0" + "@remix-run/router": "1.15.1" }, "engines": { "node": ">=14.0.0" @@ -16388,12 +16388,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz", - "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==", + "version": "6.22.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz", + "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==", "dependencies": { - "@remix-run/router": "1.15.0", - "react-router": "6.22.0" + "@remix-run/router": "1.15.1", + "react-router": "6.22.1" }, "engines": { "node": ">=14.0.0" diff --git a/package.json b/package.json index 2d562ab..b91b4e5 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "react-dom": "^18.2.0", "react-icons": "^5.0.1", "react-loader-spinner": "^6.1.6", - "react-router-dom": "^6.22.0", + "react-router-dom": "^6.22.1", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/components/Requests/requestCard.jsx b/src/components/Requests/requestCard.jsx new file mode 100644 index 0000000..496823f --- /dev/null +++ b/src/components/Requests/requestCard.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import {Card, Container} from 'react-bootstrap'; + +const RequestCard = (props) => { + const {id, dateOfBooking, startTime, endTime, status, ownerRole, classroomNumber } = props; + + let roleType = ""; + switch (ownerRole) { + case 'User': + roleType = 'Пользователь'; + break; + case 'Teacher': + roleType = 'Учитель'; + break; + case 'DeanTeacher': + roleType = 'Учитель-работник деканата'; + break; + case 'Student': + roleType = 'Студент'; + break; + } + + const fullname = "Русик, добавь в апишку имя" + + let backgroundType = ''; + switch (status) { + case 'Pending': + backgroundType = 'secondary-subtle'; + break; + case 'Approved': + backgroundType = 'success-subtle'; + break; + case 'Rejected': + backgroundType = 'danger-subtle'; + break; + } + + + return ( +
+ + + + Заявка на бронирование кабинета №{classroomNumber} + +

Дата бронирования: {dateOfBooking}

+

Время бронирования: {startTime} - {endTime}

+

Автор: {roleType} {fullname}

+

Статус: {status}

+ +
+ +
+
+
+
+ ); +}; + +export default RequestCard; \ No newline at end of file