Начало лаб5
This commit is contained in:
parent
855813a4d5
commit
57875bddcd
@ -43,6 +43,9 @@ dependencies {
|
|||||||
runtimeOnly 'org.webjars.npm:bootstrap-icons:1.11.3'
|
runtimeOnly 'org.webjars.npm:bootstrap-icons:1.11.3'
|
||||||
runtimeOnly 'org.webjars.npm:font-awesome:4.7.0'
|
runtimeOnly 'org.webjars.npm:font-awesome:4.7.0'
|
||||||
|
|
||||||
|
implementation 'org.springframework.boot:spring-boot-starter-security'
|
||||||
|
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
|
||||||
|
|
||||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BIN
data.mv.db
BIN
data.mv.db
Binary file not shown.
244
data.trace.db
244
data.trace.db
@ -29270,3 +29270,247 @@ Caused by: org.h2.mvstore.MVStoreException: The file is locked: D:/Study/Interne
|
|||||||
at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81)
|
at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81)
|
||||||
at org.h2.mvstore.MVStore.<init>(MVStore.java:286)
|
at org.h2.mvstore.MVStore.<init>(MVStore.java:286)
|
||||||
... 60 more
|
... 60 more
|
||||||
|
2024-06-03 21:28:31.369849+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 21:33:19.915269+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 21:33:32.128954+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 21:35:48.326428+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 21:38:04.615892+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 21:57:40.711140+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 22:02:50.958118+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 22:09:38.166530+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLDataException: Ошибка преобразования данных при конвертации "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"
|
||||||
|
Data conversion error converting "'user' (ENTRYS_DATA_COPY_3_0: ""ROLE"" TINYINT NOT NULL)"; SQL statement:
|
||||||
|
INSERT INTO "PUBLIC"."ENTRYS_DATA_COPY_3_0"("DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN") OVERRIDING SYSTEM VALUE SELECT "DEPARTMENT_ID", "ID", "ROLE", "PASSWORD", "LOGIN" FROM "PUBLIC"."ENTRYS_DATA" [22018-224]
|
||||||
|
2024-06-03 22:11:54.953897+04:00 jdbc[3]: exception
|
||||||
|
java.sql.SQLClientInfoException: Client info name 'ApplicationName' not supported.
|
||||||
|
at org.h2.jdbc.JdbcConnection.setClientInfo(JdbcConnection.java:1626)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericDataSource.populateClientAppName(GenericDataSource.java:199)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericDataSource.openConnection(GenericDataSource.java:162)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2DataSource.openConnection(H2DataSource.java:74)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext.connect(JDBCExecutionContext.java:106)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.initializeMainContext(JDBCRemoteInstance.java:102)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.<init>(JDBCRemoteInstance.java:61)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.initializeRemoteInstance(JDBCDataSource.java:119)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericDataSource.<init>(GenericDataSource.java:124)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2DataSource.<init>(H2DataSource.java:43)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createDataSourceImpl(H2MetaModel.java:55)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.GenericDataSourceProvider.openDataSource(GenericDataSourceProvider.java:106)
|
||||||
|
at org.jkiss.dbeaver.registry.DataSourceDescriptor.openDataSource(DataSourceDescriptor.java:1368)
|
||||||
|
at org.jkiss.dbeaver.registry.DataSourceDescriptor.connect0(DataSourceDescriptor.java:1245)
|
||||||
|
at org.jkiss.dbeaver.registry.DataSourceDescriptor.connect(DataSourceDescriptor.java:1035)
|
||||||
|
at org.jkiss.dbeaver.runtime.jobs.ConnectJob.run(ConnectJob.java:78)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
2024-06-03 22:12:02.819070+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден
|
||||||
|
Column "KEY_SEQ" not found [42122-224]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:500)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:114)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:869)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:178)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:360)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:251)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.getBestIdentifier(DBExecUtils.java:544)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.bindAttributes(DBExecUtils.java:886)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchEnd(ResultSetDataReceiver.java:166)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable.readData(JDBCTable.java:219)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:194)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5148)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
2024-06-03 22:12:02.820067+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден
|
||||||
|
Column "KEY_SEQ" not found [42122-224]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:500)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:114)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:869)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:178)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:360)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:251)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.getBestIdentifier(DBExecUtils.java:544)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.bindAttributes(DBExecUtils.java:886)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchEnd(ResultSetDataReceiver.java:166)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable.readData(JDBCTable.java:219)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:194)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5148)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
2024-06-03 22:12:02.821065+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден
|
||||||
|
Column "KEY_SEQ" not found [42122-224]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:500)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:114)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:869)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:178)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:360)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:251)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.getBestIdentifier(DBExecUtils.java:544)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.bindAttributes(DBExecUtils.java:886)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchEnd(ResultSetDataReceiver.java:166)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable.readData(JDBCTable.java:219)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:194)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5148)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
2024-06-03 22:12:02.821065+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден
|
||||||
|
Column "KEY_SEQ" not found [42122-224]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:500)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:114)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:869)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:178)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:360)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:251)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.getBestIdentifier(DBExecUtils.java:544)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.bindAttributes(DBExecUtils.java:886)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchEnd(ResultSetDataReceiver.java:166)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable.readData(JDBCTable.java:219)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:194)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5148)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
2024-06-03 22:12:02.826052+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден
|
||||||
|
Column "KEY_SEQ" not found [42122-224]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:500)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:114)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:869)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:178)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:360)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:251)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ForeignKeysCache.fetchObject(ForeignKeysCache.java:146)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ForeignKeysCache.fetchObject(ForeignKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:351)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getAssociations(GenericTableBase.java:282)
|
||||||
|
at org.jkiss.dbeaver.model.virtual.DBVUtils.getAllAssociations(DBVUtils.java:329)
|
||||||
|
at org.jkiss.dbeaver.model.DBUtils.getAttributeReferrers(DBUtils.java:1062)
|
||||||
|
at org.jkiss.dbeaver.model.data.DBDAttributeBindingMeta.lateBinding(DBDAttributeBindingMeta.java:267)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.bindAttributes(DBExecUtils.java:906)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchEnd(ResultSetDataReceiver.java:166)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable.readData(JDBCTable.java:219)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:194)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5148)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
2024-06-03 22:12:02.827049+04:00 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "KEY_SEQ" не найден
|
||||||
|
Column "KEY_SEQ" not found [42122-224]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)
|
||||||
|
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:337)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCResultSetImpl.getInt(JDBCResultSetImpl.java:500)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils.safeGetInt(JDBCUtils.java:114)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericUtils.safeGetInt(GenericUtils.java:84)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel.createConstraintColumnsImpl(GenericMetaModel.java:869)
|
||||||
|
at org.jkiss.dbeaver.ext.h2.model.H2MetaModel.createConstraintColumnsImpl(H2MetaModel.java:178)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:98)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ConstraintKeysCache.fetchObjectRow(ConstraintKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:360)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getConstraints(GenericTableBase.java:251)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ForeignKeysCache.fetchObject(ForeignKeysCache.java:146)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.ForeignKeysCache.fetchObject(ForeignKeysCache.java:1)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.loadObjects(JDBCCompositeCache.java:351)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache.getObjects(JDBCCompositeCache.java:120)
|
||||||
|
at org.jkiss.dbeaver.ext.generic.model.GenericTableBase.getAssociations(GenericTableBase.java:282)
|
||||||
|
at org.jkiss.dbeaver.model.virtual.DBVUtils.getAllAssociations(DBVUtils.java:329)
|
||||||
|
at org.jkiss.dbeaver.model.DBUtils.getAttributeReferrers(DBUtils.java:1062)
|
||||||
|
at org.jkiss.dbeaver.model.data.DBDAttributeBindingMeta.lateBinding(DBDAttributeBindingMeta.java:267)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.bindAttributes(DBExecUtils.java:906)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataReceiver.fetchEnd(ResultSetDataReceiver.java:166)
|
||||||
|
at org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable.readData(JDBCTable.java:219)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
|
||||||
|
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:194)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
|
||||||
|
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5148)
|
||||||
|
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:115)
|
||||||
|
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
|
||||||
|
@ -9,12 +9,12 @@ import org.springframework.boot.SpringApplication;
|
|||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
import com.example.demo.department.model.DepartmentEntity;
|
import com.example.demo.department.model.DepartmentEntity;
|
||||||
import com.example.demo.directions.model.DirectionsEntity;
|
|
||||||
import com.example.demo.news.model.NewsEntity;
|
|
||||||
import com.example.demo.entrysData.model.EntrysDataEntity;
|
|
||||||
import com.example.demo.department.service.DepartmentService;
|
import com.example.demo.department.service.DepartmentService;
|
||||||
|
import com.example.demo.directions.model.DirectionsEntity;
|
||||||
import com.example.demo.directions.service.DirectionsService;
|
import com.example.demo.directions.service.DirectionsService;
|
||||||
|
import com.example.demo.entrysData.model.EntrysDataEntity;
|
||||||
import com.example.demo.entrysData.service.EntrysDataService;
|
import com.example.demo.entrysData.service.EntrysDataService;
|
||||||
|
import com.example.demo.news.model.NewsEntity;
|
||||||
import com.example.demo.news.service.NewsService;
|
import com.example.demo.news.service.NewsService;
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
@ -47,9 +47,9 @@ public class DemoApplication implements CommandLineRunner {
|
|||||||
final var dep3 = departmentService.create(new DepartmentEntity("ИЯ"));
|
final var dep3 = departmentService.create(new DepartmentEntity("ИЯ"));
|
||||||
|
|
||||||
log.info("Create entrysData");
|
log.info("Create entrysData");
|
||||||
entrysDataService.create(new EntrysDataEntity("login", "password", "user", dep2));
|
entrysDataService.create(new EntrysDataEntity("login", "password", dep2));
|
||||||
entrysDataService.create(new EntrysDataEntity("login1", "password", "user", dep3));
|
entrysDataService.create(new EntrysDataEntity("login1", "password", dep3));
|
||||||
entrysDataService.create(new EntrysDataEntity("login2", "password", "user", dep1));
|
entrysDataService.create(new EntrysDataEntity("login2", "password", dep1));
|
||||||
|
|
||||||
log.info("Create directions");
|
log.info("Create directions");
|
||||||
|
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.example.demo.core.api;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
@ControllerAdvice
|
||||||
|
public class GlobalController {
|
||||||
|
|
||||||
|
public GlobalController() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@ModelAttribute("servletPath")
|
||||||
|
String getRequestServletPath(HttpServletRequest request) {
|
||||||
|
return request.getServletPath();
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,13 @@ public class Constants {
|
|||||||
|
|
||||||
public static final String REDIRECT_VIEW = "redirect:";
|
public static final String REDIRECT_VIEW = "redirect:";
|
||||||
|
|
||||||
|
public static final String ADMIN_PREFIX = "/admin";
|
||||||
|
|
||||||
|
public static final String LOGIN_URL = "/login";
|
||||||
|
public static final String LOGOUT_URL = "/logout";
|
||||||
|
|
||||||
|
public static final String DEFAULT_PASSWORD = "123456";
|
||||||
|
|
||||||
private Constants() {
|
private Constants() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,23 @@
|
|||||||
package com.example.demo.core.configuration;
|
package com.example.demo.core.configuration;
|
||||||
|
|
||||||
import org.modelmapper.ModelMapper;
|
import org.modelmapper.ModelMapper;
|
||||||
|
import org.modelmapper.PropertyMap;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import com.example.demo.core.model.BaseEntity;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MapperConfiguration {
|
public class MapperConfiguration {
|
||||||
@Bean
|
@Bean
|
||||||
ModelMapper modelMapper() {
|
ModelMapper modelMapper() {
|
||||||
return new ModelMapper();
|
final ModelMapper mapper = new ModelMapper();
|
||||||
|
mapper.addMappings(new PropertyMap<Object, BaseEntity>() {
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
skip(destination.getId());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return mapper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
package com.example.demo.core.configuration;
|
package com.example.demo.core.configuration;
|
||||||
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.lang.NonNull;
|
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class WebConfiguration implements WebMvcConfigurer {
|
public class WebConfiguration implements WebMvcConfigurer {
|
||||||
@Override
|
@Override
|
||||||
public void addCorsMappings(@NonNull CorsRegistry registry) {
|
public void addViewControllers(ViewControllerRegistry registry) {
|
||||||
registry.addMapping("/**")
|
registry.addViewController("/login").setViewName("login");
|
||||||
.allowedMethods("GET", "POST", "PUT", "DELETE");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package com.example.demo.core.security;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
||||||
|
import org.springframework.security.config.Customizer;
|
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
|
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
|
||||||
|
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer.FrameOptionsConfig;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
|
|
||||||
|
import com.example.demo.core.configuration.Constants;
|
||||||
|
import com.example.demo.entrysData.api.EntrysDataSignupController;
|
||||||
|
import com.example.demo.entrysData.model.EntrysDataRole;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableWebSecurity
|
||||||
|
public class SecurityConfiguration {
|
||||||
|
@Bean
|
||||||
|
SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
|
||||||
|
httpSecurity.headers(headers -> headers.frameOptions(FrameOptionsConfig::sameOrigin));
|
||||||
|
httpSecurity.csrf(AbstractHttpConfigurer::disable);
|
||||||
|
httpSecurity.cors(Customizer.withDefaults());
|
||||||
|
|
||||||
|
httpSecurity.authorizeHttpRequests(requests -> requests
|
||||||
|
.requestMatchers("/css/**", "/webjars/**", "/*.svg")
|
||||||
|
.permitAll());
|
||||||
|
|
||||||
|
httpSecurity.authorizeHttpRequests(requests -> requests
|
||||||
|
.requestMatchers(Constants.ADMIN_PREFIX + "/**").hasRole(EntrysDataRole.ADMIN.name())
|
||||||
|
.requestMatchers("/h2-console/**").hasRole(EntrysDataRole.ADMIN.name())
|
||||||
|
.requestMatchers(EntrysDataSignupController.URL).anonymous()
|
||||||
|
.requestMatchers(Constants.LOGIN_URL).anonymous()
|
||||||
|
.anyRequest().authenticated());
|
||||||
|
|
||||||
|
httpSecurity.formLogin(formLogin -> formLogin
|
||||||
|
.loginPage(Constants.LOGIN_URL));
|
||||||
|
|
||||||
|
httpSecurity.rememberMe(rememberMe -> rememberMe.key("uniqueAndSecret"));
|
||||||
|
|
||||||
|
httpSecurity.logout(logout -> logout
|
||||||
|
.deleteCookies("JSESSIONID"));
|
||||||
|
|
||||||
|
return httpSecurity.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
DaoAuthenticationProvider authenticationProvider(UserDetailsService userDetailsService) {
|
||||||
|
final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
|
||||||
|
authProvider.setUserDetailsService(userDetailsService);
|
||||||
|
authProvider.setPasswordEncoder(passwordEncoder());
|
||||||
|
return authProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
PasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
package com.example.demo.core.security;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
|
import com.example.demo.entrysData.model.EntrysDataEntity;
|
||||||
|
|
||||||
|
public class UserPrincipal implements UserDetails {
|
||||||
|
private final long id;
|
||||||
|
private final String username;
|
||||||
|
private final String password;
|
||||||
|
private final Set<? extends GrantedAuthority> roles;
|
||||||
|
private final boolean active;
|
||||||
|
|
||||||
|
public UserPrincipal(EntrysDataEntity user) {
|
||||||
|
this.id = user.getId();
|
||||||
|
this.username = user.getLogin();
|
||||||
|
this.password = user.getPassword();
|
||||||
|
this.roles = Set.of(user.getRole());
|
||||||
|
this.active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return active;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAccountNonExpired() {
|
||||||
|
return isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAccountNonLocked() {
|
||||||
|
return isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCredentialsNonExpired() {
|
||||||
|
return isEnabled();
|
||||||
|
}
|
||||||
|
}
|
@ -9,9 +9,6 @@ import org.springframework.ui.Model;
|
|||||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PutMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
@ -23,8 +20,6 @@ import com.example.demo.entrysData.model.EntrysDataGrouped;
|
|||||||
import com.example.demo.entrysData.model.EntrysDataGroupedDepartment;
|
import com.example.demo.entrysData.model.EntrysDataGroupedDepartment;
|
||||||
import com.example.demo.entrysData.service.EntrysDataService;
|
import com.example.demo.entrysData.service.EntrysDataService;
|
||||||
|
|
||||||
import jakarta.validation.Valid;
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping(EntrysDataController.URL)
|
@RequestMapping(EntrysDataController.URL)
|
||||||
public class EntrysDataController {
|
public class EntrysDataController {
|
||||||
@ -56,18 +51,10 @@ public class EntrysDataController {
|
|||||||
return modelMapper.map(entity, EntrysDataGroupedDepartmentDto.class);
|
return modelMapper.map(entity, EntrysDataGroupedDepartmentDto.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private EntrysDataEntity toEntity(EntrysDataDto dto) {
|
// private EntrysDataEntity toEntity(EntrysDataDto dto) {
|
||||||
final EntrysDataEntity entity = modelMapper.map(dto, EntrysDataEntity.class);
|
// final EntrysDataEntity entity = modelMapper.map(dto, EntrysDataEntity.class);
|
||||||
entity.setDepartment(departmentService.get(dto.getDepartmentId()));
|
// entity.setDepartment(departmentService.get(dto.getDepartmentId()));
|
||||||
return entity;
|
// return entity;
|
||||||
}
|
|
||||||
|
|
||||||
// @GetMapping
|
|
||||||
// public PageDto<EntrysDataDto> getAll(
|
|
||||||
// @RequestParam(name = "departmentId", defaultValue = "0") Long departmentId,
|
|
||||||
// @RequestParam(name = "page", defaultValue = "0") int page,
|
|
||||||
// @RequestParam(name = "size", defaultValue = Constants.DEFAULT_PAGE_SIZE) int size) {
|
|
||||||
// return PageDtoMapper.toDto(entrysDataService.getAll(departmentId, page, size), this::toDto);
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@ -88,28 +75,21 @@ public class EntrysDataController {
|
|||||||
return toDto(entrysDataService.get(id));
|
return toDto(entrysDataService.get(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping
|
// @PostMapping
|
||||||
public EntrysDataDto create(@RequestBody @Valid EntrysDataDto dto) {
|
// public EntrysDataDto create(@RequestBody @Valid EntrysDataDto dto) {
|
||||||
return toDto(entrysDataService.create(toEntity(dto)));
|
// return toDto(entrysDataService.create(toEntity(dto)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
@PutMapping("/{id}")
|
// @PutMapping("/{id}")
|
||||||
public EntrysDataDto update(@PathVariable(name = "id") Long id, @RequestBody EntrysDataDto dto) {
|
// public EntrysDataDto update(@PathVariable(name = "id") Long id, @RequestBody EntrysDataDto dto) {
|
||||||
return toDto(entrysDataService.update(id, toEntity(dto)));
|
// return toDto(entrysDataService.update(id, toEntity(dto)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
@DeleteMapping("/{id}")
|
@DeleteMapping("/{id}")
|
||||||
public EntrysDataDto delete(@PathVariable(name = "id") Long id) {
|
public EntrysDataDto delete(@PathVariable(name = "id") Long id) {
|
||||||
return toDto(entrysDataService.delete(id));
|
return toDto(entrysDataService.delete(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/{id}/password")
|
|
||||||
public EntrysDataDto updatePassword(@PathVariable(name = "id") Long id,
|
|
||||||
@RequestParam(name = "newPassword") String newPas,
|
|
||||||
@RequestParam(name = "oldPassword") String oldPas) {
|
|
||||||
return toDto(entrysDataService.updatePassword(id, newPas, oldPas));
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/count")
|
@GetMapping("/count")
|
||||||
public List<EntrysDataGroupedDto> getCount() {
|
public List<EntrysDataGroupedDto> getCount() {
|
||||||
return entrysDataService.getCount().stream().map(this::toDto).toList();
|
return entrysDataService.getCount().stream().map(this::toDto).toList();
|
||||||
|
@ -1,24 +1,15 @@
|
|||||||
package com.example.demo.entrysData.api;
|
package com.example.demo.entrysData.api;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
|
|
||||||
import jakarta.validation.constraints.Min;
|
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.Size;
|
||||||
|
|
||||||
public class EntrysDataDto {
|
public class EntrysDataDto {
|
||||||
private Long id;
|
private Long id;
|
||||||
@NotBlank
|
@NotBlank
|
||||||
|
@Size(min = 3, max = 20)
|
||||||
private String login;
|
private String login;
|
||||||
@NotNull
|
private String role;
|
||||||
private String role = "user";
|
|
||||||
@NotBlank
|
|
||||||
private String password;
|
|
||||||
@NotNull
|
|
||||||
@Min(1)
|
|
||||||
private Long departmentId;
|
|
||||||
|
|
||||||
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
@ -35,25 +26,7 @@ public class EntrysDataDto {
|
|||||||
this.login = login;
|
this.login = login;
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
|
|
||||||
public String getRole() {
|
public String getRole() {
|
||||||
return role;
|
return role;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPassword() {
|
|
||||||
return password;
|
|
||||||
}
|
|
||||||
|
|
||||||
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
|
|
||||||
public void setPassword(String password) {
|
|
||||||
this.password = password;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getDepartmentId() {
|
|
||||||
return departmentId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDepartmentId(Long departmentId) {
|
|
||||||
this.departmentId = departmentId;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
package com.example.demo.entrysData.api;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.modelmapper.ModelMapper;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import com.example.demo.core.configuration.Constants;
|
||||||
|
import com.example.demo.entrysData.model.EntrysDataEntity;
|
||||||
|
import com.example.demo.entrysData.service.EntrysDataService;
|
||||||
|
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping(EntrysDataSignupController.URL)
|
||||||
|
public class EntrysDataSignupController {
|
||||||
|
public static final String URL = "/signup";
|
||||||
|
|
||||||
|
private static final String SIGNUP_VIEW = "signup";
|
||||||
|
private static final String USER_ATTRIBUTE = "user";
|
||||||
|
|
||||||
|
private final EntrysDataService userService;
|
||||||
|
private final ModelMapper modelMapper;
|
||||||
|
|
||||||
|
public EntrysDataSignupController(
|
||||||
|
EntrysDataService userService,
|
||||||
|
ModelMapper modelMapper) {
|
||||||
|
this.userService = userService;
|
||||||
|
this.modelMapper = modelMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
private EntrysDataEntity toEntity(EntrysDataSignupDto dto) {
|
||||||
|
return modelMapper.map(dto, EntrysDataEntity.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public String getSignup(Model model) {
|
||||||
|
model.addAttribute(USER_ATTRIBUTE, new EntrysDataSignupDto());
|
||||||
|
return SIGNUP_VIEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping
|
||||||
|
public String signup(
|
||||||
|
@ModelAttribute(name = USER_ATTRIBUTE) @Valid EntrysDataSignupDto user,
|
||||||
|
BindingResult bindingResult,
|
||||||
|
Model model) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
return SIGNUP_VIEW;
|
||||||
|
}
|
||||||
|
if (!Objects.equals(user.getPassword(), user.getPasswordConfirm())) {
|
||||||
|
bindingResult.rejectValue("password", "signup:passwords", "Пароли не совпадают.");
|
||||||
|
model.addAttribute(USER_ATTRIBUTE, user);
|
||||||
|
return SIGNUP_VIEW;
|
||||||
|
}
|
||||||
|
userService.create(toEntity(user));
|
||||||
|
return Constants.REDIRECT_VIEW + Constants.LOGIN_URL + "?signup";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.example.demo.entrysData.api;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.Size;
|
||||||
|
|
||||||
|
public class EntrysDataSignupDto {
|
||||||
|
@NotBlank
|
||||||
|
@Size(min = 3, max = 20)
|
||||||
|
private String login;
|
||||||
|
@NotBlank
|
||||||
|
@Size(min = 3, max = 20)
|
||||||
|
private String password;
|
||||||
|
@NotBlank
|
||||||
|
@Size(min = 3, max = 20)
|
||||||
|
private String passwordConfirm;
|
||||||
|
|
||||||
|
public String getLogin() {
|
||||||
|
return login;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLogin(String login) {
|
||||||
|
this.login = login;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPasswordConfirm() {
|
||||||
|
return passwordConfirm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPasswordConfirm(String passwordConfirm) {
|
||||||
|
this.passwordConfirm = passwordConfirm;
|
||||||
|
}
|
||||||
|
}
|
@ -16,10 +16,9 @@ import jakarta.persistence.Table;
|
|||||||
public class EntrysDataEntity extends BaseEntity {
|
public class EntrysDataEntity extends BaseEntity {
|
||||||
@Column(nullable = false, unique = true, length = 30)
|
@Column(nullable = false, unique = true, length = 30)
|
||||||
private String login;
|
private String login;
|
||||||
@Column(nullable = false, unique = false, length = 25)
|
@Column(nullable = false, length = 25)
|
||||||
private String password;
|
private String password;
|
||||||
@Column(nullable = false, unique = false, length = 10)
|
private EntrysDataRole role;
|
||||||
private String role;
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "departmentId", nullable = false)
|
@JoinColumn(name = "departmentId", nullable = false)
|
||||||
private DepartmentEntity department;
|
private DepartmentEntity department;
|
||||||
@ -27,10 +26,10 @@ public class EntrysDataEntity extends BaseEntity {
|
|||||||
public EntrysDataEntity() {
|
public EntrysDataEntity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntrysDataEntity(String login, String password, String role, DepartmentEntity department) {
|
public EntrysDataEntity(String login, String password, DepartmentEntity department) {
|
||||||
this.login = login;
|
this.login = login;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.role = role;
|
this.role = EntrysDataRole.USER;
|
||||||
this.department = department;
|
this.department = department;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,10 +49,11 @@ public class EntrysDataEntity extends BaseEntity {
|
|||||||
this.password = password;
|
this.password = password;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRole() {
|
public EntrysDataRole getRole() {
|
||||||
return role;
|
return role;
|
||||||
}
|
}
|
||||||
public void setRole(String role){
|
|
||||||
|
public void setRole(EntrysDataRole role){
|
||||||
this.role = role;
|
this.role = role;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ public class EntrysDataEntity extends BaseEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(id, login);
|
return Objects.hash(id, login, password, role, department);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.example.demo.entrysData.model;
|
||||||
|
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
|
||||||
|
public enum EntrysDataRole implements GrantedAuthority {
|
||||||
|
ADMIN,
|
||||||
|
USER;
|
||||||
|
|
||||||
|
private static final String PREFIX = "ROLE_";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthority() {
|
||||||
|
return PREFIX + this.name();
|
||||||
|
}
|
||||||
|
}
|
@ -1,32 +1,40 @@
|
|||||||
package com.example.demo.entrysData.service;
|
package com.example.demo.entrysData.service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import com.example.demo.core.configuration.Constants;
|
||||||
import com.example.demo.core.error.NotFoundException;
|
import com.example.demo.core.error.NotFoundException;
|
||||||
import com.example.demo.entrysData.model.EntrysDataEntity;
|
import com.example.demo.entrysData.model.EntrysDataEntity;
|
||||||
import com.example.demo.entrysData.model.EntrysDataGrouped;
|
import com.example.demo.entrysData.model.EntrysDataGrouped;
|
||||||
import com.example.demo.entrysData.model.EntrysDataGroupedDepartment;
|
import com.example.demo.entrysData.model.EntrysDataGroupedDepartment;
|
||||||
|
import com.example.demo.entrysData.model.EntrysDataRole;
|
||||||
import com.example.demo.entrysData.repository.EntrysDataRepository;
|
import com.example.demo.entrysData.repository.EntrysDataRepository;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class EntrysDataService {
|
public class EntrysDataService {
|
||||||
private final EntrysDataRepository repository;
|
private final EntrysDataRepository repository;
|
||||||
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
public EntrysDataService(EntrysDataRepository repository) {
|
public EntrysDataService(EntrysDataRepository repository, PasswordEncoder passwordEncoder) {
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
|
this.passwordEncoder = passwordEncoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checklogin(String name) {
|
private void checklogin(Long id, String login) {
|
||||||
if (repository.findByloginIgnoreCase(name).isPresent()) {
|
final Optional<EntrysDataEntity> existsUser = repository.findByloginIgnoreCase(login);
|
||||||
|
if (existsUser.isPresent() && !existsUser.get().getId().equals(id)) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
String.format("Type with name %s is already exists", name));
|
String.format("User with login %s is already exists", login));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,17 +68,22 @@ public class EntrysDataService {
|
|||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
throw new IllegalArgumentException("Entity is null");
|
throw new IllegalArgumentException("Entity is null");
|
||||||
}
|
}
|
||||||
checklogin(entity.getLogin());
|
checklogin(null, entity.getLogin());
|
||||||
|
final String password = Optional.ofNullable(entity.getPassword()).orElse("");
|
||||||
|
entity.setPassword(
|
||||||
|
passwordEncoder.encode(
|
||||||
|
StringUtils.hasText(password.strip()) ? password : Constants.DEFAULT_PASSWORD));
|
||||||
|
entity.setRole(Optional.ofNullable(entity.getRole()).orElse(EntrysDataRole.USER));
|
||||||
|
repository.save(entity);
|
||||||
return repository.save(entity);
|
return repository.save(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public EntrysDataEntity update(Long id, EntrysDataEntity entity) {
|
public EntrysDataEntity update(Long id, EntrysDataEntity entity) {
|
||||||
final EntrysDataEntity existsEntity = get(id);
|
final EntrysDataEntity existsEntity = get(id);
|
||||||
checklogin(entity.getLogin());
|
checklogin(id, entity.getLogin());
|
||||||
existsEntity.setLogin(entity.getLogin());
|
existsEntity.setLogin(entity.getLogin());
|
||||||
existsEntity.setPassword(entity.getPassword());
|
repository.save(existsEntity);
|
||||||
existsEntity.setDepartment(entity.getDepartment());
|
|
||||||
return repository.save(existsEntity);
|
return repository.save(existsEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,26 +94,6 @@ public class EntrysDataService {
|
|||||||
return existsEntity;
|
return existsEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public Boolean AuthPassword(Long id, String pas) {
|
|
||||||
final EntrysDataEntity existsEntity = get(id);
|
|
||||||
String truePas = existsEntity.getPassword();
|
|
||||||
if (truePas.equals(pas)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public EntrysDataEntity updatePassword(Long id, String newPas, String oldPas) {
|
|
||||||
final EntrysDataEntity existsEntity = get(id);
|
|
||||||
String truePas = existsEntity.getPassword();
|
|
||||||
if (truePas.equals(oldPas) && !oldPas.equals(newPas)) {
|
|
||||||
existsEntity.setPassword(newPas);
|
|
||||||
}
|
|
||||||
return repository.save(existsEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public List<EntrysDataGrouped> getCount() {
|
public List<EntrysDataGrouped> getCount() {
|
||||||
return repository.getCountEntrysInDepartment();
|
return repository.getCountEntrysInDepartment();
|
||||||
|
@ -68,7 +68,7 @@ public class NewsEntity extends BaseEntity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(id, name);
|
return Objects.hash(id, name, description, date, department);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -81,6 +81,7 @@ public class NewsEntity extends BaseEntity {
|
|||||||
return Objects.equals(other.getId(), id)
|
return Objects.equals(other.getId(), id)
|
||||||
&& Objects.equals(other.getDate(), date)
|
&& Objects.equals(other.getDate(), date)
|
||||||
&& Objects.equals(other.getName(), name)
|
&& Objects.equals(other.getName(), name)
|
||||||
&& Objects.equals(other.getDescription(), description);
|
&& Objects.equals(other.getDescription(), description)
|
||||||
|
&& Objects.equals(other.getDepartment(), department);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
44
src/main/resources/templates/login.html
Normal file
44
src/main/resources/templates/login.html
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{default}">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Вход</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<main layout:fragment="content">
|
||||||
|
<form action="#" th:action="@{/login}" method="post">
|
||||||
|
<div th:if="${param.error}" class="alert alert-danger">
|
||||||
|
Неверный логин или пароль
|
||||||
|
</div>
|
||||||
|
<div th:if="${param.logout}" class="alert alert-success">
|
||||||
|
Выход успешно произведен
|
||||||
|
</div>
|
||||||
|
<div th:if="${param.signup}" class="alert alert-success">
|
||||||
|
Пользователь успешно создан
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="username" class="form-label">Имя пользователя</label>
|
||||||
|
<input type="text" id="username" name="username" class="form-control" required minlength="3"
|
||||||
|
maxlength="20">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="password" class="form-label">Пароль</label>
|
||||||
|
<input type="password" id="password" name="password" class="form-control" required minlength="3"
|
||||||
|
maxlength="20">
|
||||||
|
</div>
|
||||||
|
<div class="form-check mb-3">
|
||||||
|
<input class="form-check-input" type="checkbox" id="remember-me" name="remember-me" checked>
|
||||||
|
<label class="form-check-label" for="remember-me">Запомнить меня</label>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3 d-flex flex-row">
|
||||||
|
<button class="btn btn-primary me-2 button-fixed-width" type="submit">Войти</button>
|
||||||
|
<a class="btn btn-secondary button-fixed-width" href="/signup">Регистрация</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
|
||||||
|
</html>
|
37
src/main/resources/templates/signup.html
Normal file
37
src/main/resources/templates/signup.html
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{default}">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Вход</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<main layout:fragment="content">
|
||||||
|
<form action="#" th:action="@{/signup}" th:object="${user}" method="post">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="login" class="form-label">Имя пользователя</label>
|
||||||
|
<input type="text" th:field="*{login}" id="login" class="form-control">
|
||||||
|
<div th:if="${#fields.hasErrors('login')}" th:errors="*{login}" class="invalid-feedback"></div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="password" class="form-label">Пароль</label>
|
||||||
|
<input type="password" th:field="*{password}" id="password" class="form-control">
|
||||||
|
<div th:if="${#fields.hasErrors('password')}" th:errors="*{password}" class="invalid-feedback"></div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="passwordConfirm" class="form-label">Пароль (подтверждение)</label>
|
||||||
|
<input type="password" th:field="*{passwordConfirm}" id="passwordConfirm" class="form-control">
|
||||||
|
<div th:if="${#fields.hasErrors('passwordConfirm')}" th:errors="*{passwordConfirm}"
|
||||||
|
class="invalid-feedback"></div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3 d-flex flex-row">
|
||||||
|
<button class="btn btn-primary me-2 button-fixed-width" type="submit">Регистрация</button>
|
||||||
|
<a class="btn btn-secondary button-fixed-width" href="/">Отмена</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user