From 864614acead2d314c6f5173aa3c9470358b6bfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9?= Date: Sat, 6 May 2023 00:30:26 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=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=D1=8E=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F,=20=D0=B0=20=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D1=82=D1=8C=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D0=BA=D1=83=20=D0=BD=D0=B0=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=D1=85=20=D1=81=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=8F=D0=BC=D0=B8=20=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=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 --- build.gradle | 14 +- data.mv.db | Bin 851968 -> 892928 bytes data.trace.db | 274 ++++++++++++++++++ front/src/App.jsx | 65 +++-- front/src/Dto/user-singup-dto.js | 8 + front/src/Main/Catalog.jsx | 20 +- front/src/Main/CreatorAction.jsx | 18 +- front/src/Main/LoginPage.jsx | 90 ++++++ front/src/Main/MangaPage.jsx | 8 +- front/src/Main/ReaderAction.jsx | 26 +- front/src/Main/SingupPage.jsx | 88 ++++++ front/src/Main/UsersPage.jsx | 112 +++++++ front/src/MainS/Creator.jsx | 22 +- front/src/MainS/Reader.jsx | 29 +- front/src/components/Banner/Banner.jsx | 46 --- front/src/components/Banner/banner.css | 65 ----- front/src/components/Header.jsx | 45 ++- front/src/components/PrivateRoutes.jsx | 46 +++ .../controller/ReaderController.java | 13 +- .../app/MangaStore/service/UserService.java | 2 +- src/main/resources/application.properties | 2 + .../java/com/LabWork/app/JpaUserTests.java | 77 +++++ 22 files changed, 898 insertions(+), 172 deletions(-) create mode 100644 front/src/Dto/user-singup-dto.js create mode 100644 front/src/Main/LoginPage.jsx create mode 100644 front/src/Main/SingupPage.jsx create mode 100644 front/src/Main/UsersPage.jsx delete mode 100644 front/src/components/Banner/Banner.jsx delete mode 100644 front/src/components/Banner/banner.css create mode 100644 front/src/components/PrivateRoutes.jsx create mode 100644 src/test/java/com/LabWork/app/JpaUserTests.java diff --git a/build.gradle b/build.gradle index f144f0b..dd66f33 100644 --- a/build.gradle +++ b/build.gradle @@ -16,22 +16,18 @@ jar { } dependencies { implementation(project(':front')) + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springframework.boot:spring-boot-devtools' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' + implementation 'com.h2database:h2:2.1.210' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'com.auth0:java-jwt:4.4.0' - annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" - + implementation 'org.hibernate.validator:hibernate-validator' + implementation 'org.springframework.boot:spring-boot-devtools' + implementation 'org.springdoc:springdoc-openapi-ui:1.6.5' implementation 'org.webjars:bootstrap:5.1.3' implementation 'org.webjars:jquery:3.6.0' implementation 'org.webjars:font-awesome:6.1.0' - - implementation 'com.h2database:h2:2.1.210' - implementation 'org.hibernate.validator:hibernate-validator' - implementation 'org.springdoc:springdoc-openapi-ui:1.6.5' testImplementation 'org.springframework.boot:spring-boot-starter-test' //implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.5' diff --git a/data.mv.db b/data.mv.db index d7ac6438f5718a8827576f145c8021ab1055c70f..a1f0f8215be4bfaabd09c236009f710dd21a9a82 100644 GIT binary patch delta 318213 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 T&Cbb=WaOmzHTG$#3b+1$4XT{F delta 21511 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 Nrj1K2i=>Xy{{a#$ai0JH diff --git a/data.trace.db b/data.trace.db index 8eb71c0..52b1a1b 100644 --- a/data.trace.db +++ b/data.trace.db @@ -993,3 +993,277 @@ Caused by: org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikola at org.h2.mvstore.FileStore.open(FileStore.java:163) at org.h2.mvstore.MVStore.(MVStore.java:444) ... 62 more +2023-05-05 12:45:34 database: flush +org.h2.message.DbException: Внутренняя ошибка: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" [50000-210] + at org.h2.message.DbException.get(DbException.java:216) + at org.h2.message.DbException.convert(DbException.java:414) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:120) + at org.h2.mvstore.MVStore.handleException(MVStore.java:3296) + at org.h2.mvstore.MVStore.panic(MVStore.java:585) + at org.h2.mvstore.MVStore.(MVStore.java:461) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:4056) + at org.h2.mvstore.db.Store.(Store.java:129) + at org.h2.engine.Database.(Database.java:324) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:122) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.getConnectionUrl(H2ConsoleAutoConfiguration.java:94) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:395) + at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) + at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) + at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) + at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) + at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) + at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.logDataSources(H2ConsoleAutoConfiguration.java:86) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:69) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.withThreadContextClassLoader(H2ConsoleAutoConfiguration.java:78) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:69) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1324) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1161) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:208) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:199) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:94) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.(ServletContextInitializerBeans.java:85) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:261) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:235) + at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:52) + at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5144) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) + at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:886) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) + at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:252) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) + at org.apache.catalina.core.StandardService.startInternal(StandardService.java:430) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) + at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:926) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) + at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.(TomcatWebServer.java:104) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:486) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:210) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.LabWork.app.AppApplication.main(AppApplication.java:9) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Внутренняя ошибка: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" [50000-210] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:573) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) + ... 103 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:1004) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + at org.h2.mvstore.MVStore.(MVStore.java:444) + ... 97 more +2023-05-05 12:45:35 database: flush +org.h2.message.DbException: Внутренняя ошибка: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" [50000-210] + at org.h2.message.DbException.get(DbException.java:216) + at org.h2.message.DbException.convert(DbException.java:414) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:120) + at org.h2.mvstore.MVStore.handleException(MVStore.java:3296) + at org.h2.mvstore.MVStore.panic(MVStore.java:585) + at org.h2.mvstore.MVStore.(MVStore.java:461) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:4056) + at org.h2.mvstore.db.Store.(Store.java:129) + at org.h2.engine.Database.(Database.java:324) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:122) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:284) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:177) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:36) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:119) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:255) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:230) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:207) + at org.hibernate.boot.model.relational.Database.(Database.java:44) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:218) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:191) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:138) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1350) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1421) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1797) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1747) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1130) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:905) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.LabWork.app.AppApplication.main(AppApplication.java:9) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Внутренняя ошибка: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" [50000-210] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:573) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) + ... 64 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:1004) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + at org.h2.mvstore.MVStore.(MVStore.java:444) + ... 58 more +2023-05-05 12:45:37 database: flush +org.h2.message.DbException: Внутренняя ошибка: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" [50000-210] + at org.h2.message.DbException.get(DbException.java:216) + at org.h2.message.DbException.convert(DbException.java:414) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:120) + at org.h2.mvstore.MVStore.handleException(MVStore.java:3296) + at org.h2.mvstore.MVStore.panic(MVStore.java:585) + at org.h2.mvstore.MVStore.(MVStore.java:461) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:4056) + at org.h2.mvstore.db.Store.(Store.java:129) + at org.h2.engine.Database.(Database.java:324) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:122) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:284) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:41) + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcDatabaseMetaData(ImprovedExtractionContextImpl.java:70) + at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processTableResultSet(InformationExtractorJdbcDatabaseMetaDataImpl.java:64) + at org.hibernate.tool.schema.extract.internal.AbstractInformationExtractorImpl.getTables(AbstractInformationExtractorImpl.java:564) + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.getTablesInformation(DatabaseInformationImpl.java:122) + at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71) + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:225) + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:126) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:284) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:143) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:140) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:336) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:415) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1425) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1797) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1747) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1130) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:905) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.LabWork.app.AppApplication.main(AppApplication.java:9) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Внутренняя ошибка: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7]" [50000-210] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:573) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) + ... 68 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: D:/RaspaevNikolayPIbd-21/2_sem/IP/IP_PIbd-21_Raspaev_NI/data.mv.db [2.1.210/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:1004) + at org.h2.mvstore.FileStore.open(FileStore.java:163) + at org.h2.mvstore.MVStore.(MVStore.java:444) + ... 62 more diff --git a/front/src/App.jsx b/front/src/App.jsx index 582a7e6..52d850d 100644 --- a/front/src/App.jsx +++ b/front/src/App.jsx @@ -1,11 +1,15 @@ -import { useRoutes, Outlet, BrowserRouter } from 'react-router-dom'; +import { Routes, BrowserRouter, Route } from 'react-router-dom'; import Creator from './MainS/Creator'; import Reader from './MainS/Reader'; import Header from './components/Header'; import CreatorAction from './Main/CreatorAction'; import ReaderAction from './Main/ReaderAction'; -import MangaPage from './Main/MangaPage'; +import UsersPage from './Main/UsersPage'; import Catalog from './Main/Catalog'; +import LoginPage from './Main/LoginPage'; +import SingupPage from './Main/SingupPage'; +import PrivateRoutes from "./components/PrivateRoutes"; +import MangaPage from "./Main/MangaPage"; function Router(props) { return useRoutes(props.rootRoute); @@ -14,30 +18,41 @@ function Router(props) { export default function App() { const routes = [ { index: true, element: }, - { path: 'creator', element: , label: 'Creator' }, - { path: 'reader', element: , label: 'Reader' }, - { path: 'creatorAction', element: , label: 'CreatorAction' }, - { path: 'readerAction', element: , label: 'ReaderAction' }, - { path: 'catalog', element: , label: 'Catalog' }, - { path: 'mangapage', element: }, - ]; - const links = routes.filter(route => route.hasOwnProperty('label')); - const rootRoute = [ - { path: '/', element: render(links), children: routes } ]; - function render(links) { - return ( - <> -
- - - ); - } - + const links = [ + { path: 'catalog', label: "Catalog", userGroup: "AUTH" }, + { path: 'readerAction', label: "ReaderAction", userGroup: "USER" }, + { path: 'creatorAction', label: "CreatorAction", userGroup: "ADMIN" }, + { path: 'creator', label: "Creator", userGroup: "ADMIN" }, + { path: 'reader', label: "Reader", userGroup: "ADMIN" }, + { path: 'users', label: "Users", userGroup: "ADMIN" } + ]; return ( - - - + <> + +
+
+ + } path="/login" /> + } path="/singup" /> + }> + } path="/mangapage" /> + } path="/catalog" /> + } path="*" /> + + }> + } path="/readerAction" /> + + }> + } path="/users" /> + } path="/creator" /> + } path="/reader" /> + } path="/creatorAction" /> + + +
+
+ ); -} \ No newline at end of file +} diff --git a/front/src/Dto/user-singup-dto.js b/front/src/Dto/user-singup-dto.js new file mode 100644 index 0000000..dcec6a6 --- /dev/null +++ b/front/src/Dto/user-singup-dto.js @@ -0,0 +1,8 @@ +export default class UserSignupDto { + constructor(args) { + this.login = args.login; + this.email = args.email; + this.password = args.password; + this.passwordConfirm = args.passwordConfirm; + } +} \ No newline at end of file diff --git a/front/src/Main/Catalog.jsx b/front/src/Main/Catalog.jsx index 8e282cc..3747314 100644 --- a/front/src/Main/Catalog.jsx +++ b/front/src/Main/Catalog.jsx @@ -1,12 +1,9 @@ import React, { useEffect, useState } from 'react' -import '../components/Banner/banner.css' -import Banner from '../components/Banner/Banner.jsx' -import { Link, NavLink } from 'react-router-dom'; -import MangaDto from "../Dto/Manga-Dto"; +import { NavLink } from 'react-router-dom'; export default function Catalog() { - const host = "http://localhost:8080/api"; + const host = "http://localhost:8080/api/1.0"; const [mangs, setMangs] = useState([]); @@ -17,8 +14,18 @@ export default function Catalog() { console.log(mangs); },[]); + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } + const getMangs = async function () { - const response = await fetch(host + "/manga"); + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const response = await fetch(host + "/manga", requestParams); const _data = await response.json() console.log(_data); return _data; @@ -26,7 +33,6 @@ export default function Catalog() { return (
-

Каталог

diff --git a/front/src/Main/CreatorAction.jsx b/front/src/Main/CreatorAction.jsx index ca59d6a..1e5c63b 100644 --- a/front/src/Main/CreatorAction.jsx +++ b/front/src/Main/CreatorAction.jsx @@ -8,7 +8,7 @@ import EditMangaModal from "../components/Modal/EditMangaModal"; export default function CreatorAction() { - const host = "http://localhost:8080/api"; + const host = "http://localhost:8080/api/1.0"; const [creatorData, setCreatorData] = useState([]); @@ -24,13 +24,23 @@ export default function CreatorAction() { const [mangaModel, setMangaModel] = useState(new MangaDto({})); + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } + useEffect(() => { getCreatorData() .then(_data =>setCreatorData(_data)); },[]); const getCreatorData = async function () { - const response = await fetch(host + "/creator"); + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const response = await fetch(host + "/creator", requestParams); const _data = await response.json() return _data; } @@ -49,6 +59,7 @@ export default function CreatorAction() { method: "GET", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/creator/` + id, requestParams); @@ -79,6 +90,7 @@ export default function CreatorAction() { method: "PUT", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), }, body: JSON.stringify(mangaModel), }; @@ -108,6 +120,7 @@ export default function CreatorAction() { method: "DELETE", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/manga/` + id, requestParams); @@ -131,6 +144,7 @@ export default function CreatorAction() { method: "POST", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), }, body: JSON.stringify(mangaModel), }; diff --git a/front/src/Main/LoginPage.jsx b/front/src/Main/LoginPage.jsx new file mode 100644 index 0000000..be9701b --- /dev/null +++ b/front/src/Main/LoginPage.jsx @@ -0,0 +1,90 @@ +import { useState, useEffect } from "react"; +import { Link, useNavigate } from 'react-router-dom'; +import { useRef } from "react"; + +const hostURL = "http://localhost:8080"; + +const LoginPage = function () { + + const loginInput = useRef(); + const passwordInput = useRef(); + const navigate = useNavigate(); + + useEffect(() => { + }, []); + + const login = async function (login, password) { + const requestParams = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({login: login, password: password}), + }; + const response = await fetch(hostURL + "/jwt/login", requestParams); + const result = await response.text(); + if (response.status === 200) { + localStorage.setItem("token", result); + localStorage.setItem("user", login); + getRole(result); + } else { + localStorage.removeItem("token"); + localStorage.removeItem("user"); + localStorage.removeItem("role"); + } + } + + const getRole = async function (token) { + const requestParams = { + method: "GET", + headers: { + "Content-Type": "application/json" + } + }; + const requestUrl = hostURL + `/who_am_i?token=${token}`; + const response = await fetch(requestUrl, requestParams); + const result = await response.text(); + localStorage.setItem("role", result); + window.dispatchEvent(new Event("storage")); + navigate("/reader"); + } + + const loginFormOnSubmit = function (event) { + event.preventDefault(); + login(loginInput.current.value, passwordInput.current.value); + }; + + return ( + <> +
+
loginFormOnSubmit(event)}> +
+

Login

+ +
+
+

Password

+ +
+
+ +
+
+

+ Not a member yet?  + Sing Up here +

+
+
+
+ + ) +} + +export default LoginPage; \ No newline at end of file diff --git a/front/src/Main/MangaPage.jsx b/front/src/Main/MangaPage.jsx index b5ced11..812d205 100644 --- a/front/src/Main/MangaPage.jsx +++ b/front/src/Main/MangaPage.jsx @@ -8,7 +8,11 @@ export default function MangaPage() { const [readerData, setReaderData] = useState([]); - const host = "http://localhost:8080/api"; + const host = "http://localhost:8080/api/1.0"; + + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } useEffect(() => { const quryString = window.location.search; @@ -29,6 +33,7 @@ export default function MangaPage() { method: "GET", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/manga/` + id + `/readers`, requestParams); @@ -52,6 +57,7 @@ export default function MangaPage() { method: "GET", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/manga/` + id, requestParams); diff --git a/front/src/Main/ReaderAction.jsx b/front/src/Main/ReaderAction.jsx index efed1f5..89907e0 100644 --- a/front/src/Main/ReaderAction.jsx +++ b/front/src/Main/ReaderAction.jsx @@ -6,7 +6,7 @@ import AddMangaReaderModal from "../components/Modal/AddMangaReaderModal"; export default function ReaderAction() { - const host = "http://localhost:8080/api"; + const host = "http://localhost:8080/api/1.0"; const [mangaData, setMangaData] = useState([]); @@ -22,6 +22,10 @@ export default function ReaderAction() { const [mangaName, setMangaName] = useState(""); + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } + useEffect(() => { const quryString = window.location.search; const urlParams = new URLSearchParams(quryString); @@ -37,14 +41,26 @@ export default function ReaderAction() { },[]); const getReaderData = async function () { - const response = await fetch(host + "/reader"); + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const response = await fetch(host + "/reader", requestParams); const _data = await response.json() console.log(_data); return _data; } const getMangaData = async function () { - const response = await fetch(host + "/manga"); + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const response = await fetch(host + "/manga", requestParams); const _data = await response.json() console.log(_data); return _data; @@ -64,6 +80,7 @@ export default function ReaderAction() { method: "GET", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/reader/` + id, requestParams); @@ -93,6 +110,7 @@ export default function ReaderAction() { method: "PUT", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/manga/${mangaId}?chapterCount=${chapterCount}`, requestParams); @@ -120,6 +138,7 @@ export default function ReaderAction() { method: "PUT", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; console.log(host + `/reader/${readerId}/removeManga?mangaId=${id}`, requestParams); @@ -143,6 +162,7 @@ export default function ReaderAction() { method: "PUT", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; console.log(host + `/reader/${readerId}/addManga?mangaId=${mangaId}`, requestParams); diff --git a/front/src/Main/SingupPage.jsx b/front/src/Main/SingupPage.jsx new file mode 100644 index 0000000..f83bb13 --- /dev/null +++ b/front/src/Main/SingupPage.jsx @@ -0,0 +1,88 @@ +import { useState, useEffect } from "react"; +import { Link } from 'react-router-dom'; +import { useRef } from "react"; + +const hostURL = "http://localhost:8080"; + +const SingupPage = function () { + + const loginInput = useRef(); + const emailInput = useRef(); + const passwordInput = useRef(); + const passwordConfirmInput = useRef(); + + useEffect(() => { + }, []); + + const singup = async function (userSinginDto) { + const requestParams = { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(userSinginDto), + }; + console.log(hostURL + "/sing_up"); + console.log(userSinginDto); + const response = await fetch(hostURL + "/sing_up", requestParams); + const result = await response.text(); + alert(result); + } + + const singupFormOnSubmit = function (event) { + event.preventDefault(); + const userSinginDto = { + login: loginInput.current.value, + email: emailInput.current.value, + password: passwordInput.current.value, + passwordConfirm: passwordConfirmInput.current.value + } + singup(userSinginDto); + }; + + return ( + <> +
+
singupFormOnSubmit(event)}> +
+

Login

+ +
+
+

Email

+ +
+
+

Password

+ +
+
+

Confirm Password

+ +
+
+ +
+
+

+ Already have an account?  + Sing In here +

+
+
+
+ + ) +} + +export default SingupPage; \ No newline at end of file diff --git a/front/src/Main/UsersPage.jsx b/front/src/Main/UsersPage.jsx new file mode 100644 index 0000000..8dfd76d --- /dev/null +++ b/front/src/Main/UsersPage.jsx @@ -0,0 +1,112 @@ +import { useState, useEffect } from "react"; + +const hostURL = "http://localhost:8080"; +const host = hostURL + "/api/1.0"; + +const UsersPage = function () { + + const [users, setUsers] = useState([]); + const [pageNumbers, setPageNumbers] = useState([]); + const [pageNumber, setPageNumber] = useState(); + + useEffect(() => { + getUsers(1); + }, []); + + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } + + const getUsers = async function (page) { + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const requestUrl = host + `/users?page=${page}`; + const response = await fetch(requestUrl, requestParams); + const data = await response.json(); + setUsers(data.first.content); + setPageNumber(data.first.number); + setPageNumbers(data.second); + } + + const removeUser = async function (id) { + const requestParams = { + method: "DELETE", + headers: { + "Content-Type": "application/json", + "Authorization": getTokenForHeader(), + } + }; + const requestUrl = host + `/user/${id}`; + await fetch(requestUrl, requestParams); + } + + const pageButtonOnClick = function (page) { + getUsers(page); + } + + const removeButtonOnClick = function (id) { + const confirmResult = confirm("Are you sure you want to remove " + + "the selected user?"); + if (confirmResult === false) { + return; + } + removeUser(id).then(() => getUsers(pageNumber + 1)); + } + + return ( + <> +
+ + + + + + + + + + + + {users.map((user, index) => ( + + + + + + + {user.login !== localStorage.getItem("user") ? + : null} + + ))} + +
#IDLoginEmailRole
{index}{user.id}{user.login}{user.email}{user.role} + +
+
+
+ + ); +} + +export default UsersPage; diff --git a/front/src/MainS/Creator.jsx b/front/src/MainS/Creator.jsx index 4803c52..0109a60 100644 --- a/front/src/MainS/Creator.jsx +++ b/front/src/MainS/Creator.jsx @@ -4,7 +4,7 @@ import MangaDto from '../Dto/Manga-Dto'; export default function Creator() { - const host = "http://localhost:8080/api"; + const host = "http://localhost:8080/api/1.0"; const [creatorId, setCreatorId] = useState(0); @@ -16,6 +16,9 @@ export default function Creator() { const [data, setData] = useState([]); + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } const table = document.getElementById("tbody"); @@ -24,15 +27,23 @@ export default function Creator() { },[]); const getData = async function () { - const response = await fetch(host + "/creator"); + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const requestUrl = host + `/creator`; + const response = await fetch(requestUrl, requestParams); setData(await response.json()) console.log(data); - } + } const create = async function (){ const requestParams = { method: "POST", headers: { + "Authorization": getTokenForHeader(), "Content-Type": "application/json", } }; @@ -52,6 +63,7 @@ export default function Creator() { const requestParams = { method: "DELETE", headers: { + "Authorization": getTokenForHeader(), "Content-Type": "application/json", } }; @@ -69,6 +81,9 @@ export default function Creator() { } const requestParams = { method: "DELETE", + headers: { + "Authorization": getTokenForHeader(), + } }; await fetch(host + `/creator/`, requestParams); } @@ -81,6 +96,7 @@ export default function Creator() { const requestParams = { method: "PUT", headers: { + "Authorization": getTokenForHeader(), "Content-Type": "application/json", } }; diff --git a/front/src/MainS/Reader.jsx b/front/src/MainS/Reader.jsx index 7d16ad1..2522e97 100644 --- a/front/src/MainS/Reader.jsx +++ b/front/src/MainS/Reader.jsx @@ -3,7 +3,7 @@ import TableReader from '../components/Table/TableReader'; export default function ReaderS() { - const host = "http://localhost:8080/api"; + const host = "http://localhost:8080/api/1.0"; const [readerId, setReaderId] = useState(0); @@ -15,8 +15,9 @@ export default function ReaderS() { const [data, setData] = useState([]); - - + const getTokenForHeader = function () { + return "Bearer " + localStorage.getItem("token"); + } const table = document.getElementById("tbody"); @@ -25,21 +26,30 @@ export default function ReaderS() { console.log(2); },[]); - const getData = async function () { - const response = await fetch(host + "/reader"); + const requestParams = { + method: "GET", + headers: { + "Authorization": getTokenForHeader(), + } + }; + const requestUrl = host + `/reader`; + const response = await fetch(requestUrl, requestParams); setData(await response.json()) console.log(data); - } + } const create = async function (){ const requestParams = { method: "POST", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/reader?readerName=${readerName}&password=${password}`, requestParams); + alert(response); + console.log(response); getData(); } @@ -55,6 +65,7 @@ export default function ReaderS() { method: "DELETE", headers: { "Content-Type": "application/json", + "Authorization": getTokenForHeader(), } }; const response = await fetch(host + `/reader/` + id, requestParams); @@ -70,6 +81,9 @@ export default function ReaderS() { } const requestParams = { method: "DELETE", + headers: { + "Authorization": getTokenForHeader(), + } }; await fetch(host + `/reader/`, requestParams); getData(); @@ -83,6 +97,7 @@ export default function ReaderS() { const requestParams = { method: "PUT", headers: { + "Authorization": getTokenForHeader(), "Content-Type": "application/json", } }; @@ -100,6 +115,7 @@ export default function ReaderS() { const requestParams = { method: "PUT", headers: { + "Authorization": getTokenForHeader(), "Content-Type": "application/json", } }; @@ -112,6 +128,7 @@ export default function ReaderS() { const requestParams = { method: "PUT", headers: { + "Authorization": getTokenForHeader(), "Content-Type": "application/json", } }; diff --git a/front/src/components/Banner/Banner.jsx b/front/src/components/Banner/Banner.jsx deleted file mode 100644 index c56ea19..0000000 --- a/front/src/components/Banner/Banner.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import { useEffect, useState } from "react"; -import React from 'react' -import { useNavigate } from "react-router-dom"; -import banner1 from "../../../img/popular_1.jpg"; -import banner2 from "../../../img/popular_2.jpg"; -import banner3 from "../../../img/popular_3.jpg" - -export default function Banner() { - const length = 3; - var old = length - 1; - var current = 0; - const navigate = useNavigate(); - const [bannerState, setBannerState] = useState(["show", "hide", "hide"]); - - useEffect(() => { - const timer = window.setInterval(() => { - setBannerState([ - ...bannerState, - (bannerState[current] = "show"), - (bannerState[old] = "hide"), - ]); - //setBannerState([...bannerState, ]); - - console.info("Banner changed"); - - old = current; - current++; - - if (current === length) { - current = 0; - } - }, 2000); - - return () => { - window.clearInterval(timer); - }; - }, []); - - return ( - - ); -} \ No newline at end of file diff --git a/front/src/components/Banner/banner.css b/front/src/components/Banner/banner.css deleted file mode 100644 index 2eb43f7..0000000 --- a/front/src/components/Banner/banner.css +++ /dev/null @@ -1,65 +0,0 @@ - - -#banner { - margin: 15px; -} - -@keyframes newAnim { - from { opacity: 0; } - to { opacity: 1; } -} - -#banner img { - max-width: 90%; - border-radius: 5px; - animation: newAnim 1s forwards; -} - -#banner a.show { - text-align: center; - display: block; -} - -#banner a.hide { - display: none; -} - -img.show { - max-height: 200px; - width: auto; - opacity: 1; - transition: opacity 1s, visibility 0s; -} - -img.hide { - max-height: 0; - width: 0; - opacity: 0; - visibility: hidden; - transition: opacity 1s, visibility 0s 1s; -} - -@media (max-width: 700px){ - #banner{width: 0px;} - #banner_2{width: 0px;} - #banner img.show { - height: 0; - width: 0; - opacity: 0; - visibility: hidden; - transition: opacity 1s, visibility 0s 1s; - } - #banner h3{ - font-size: 0em; - } - #banner_2 h3{ - font-size: 0em; - } - #banner_2 img.show { - height: 0; - width: 0; - opacity: 0; - visibility: hidden; - transition: opacity 1s, visibility 0s 1s; - } - } \ No newline at end of file diff --git a/front/src/components/Header.jsx b/front/src/components/Header.jsx index 57f056f..95e9355 100644 --- a/front/src/components/Header.jsx +++ b/front/src/components/Header.jsx @@ -1,6 +1,34 @@ -import { NavLink } from 'react-router-dom'; +import {NavLink, useNavigate} from 'react-router-dom'; +import {useEffect, useState} from "react"; export default function Header(props) { + const navigate = useNavigate(); + const logoutButtonOnClick = function () { + localStorage.removeItem("token"); + localStorage.removeItem("user"); + localStorage.removeItem("role"); + window.dispatchEvent(new Event("storage")); + navigate("/login"); + } + + const [userRole, setUserRole] = useState("NONE"); + + useEffect(() => { + window.addEventListener("storage", () => { + getUserRole(); + }); + getUserRole(); + }, []) + + const getUserRole = function () { + const role = localStorage.getItem("role") || "NONE"; + setUserRole(role); + } + + const validate = function (userGroup) { + return (userGroup === "AUTH" && userRole !== "NONE") || (userGroup === userRole); + } +console.log(userRole); return (