esoe 2 weeks ago
parent
commit
b26d6f1fad
  1. 24
      docs/erd.puml
  2. 85
      docs/usecase.puml
  3. 28
      main/api-swagger/components.yaml
  4. 9
      main/api-swagger/main.yaml
  5. 45
      main/api-swagger/organizations.yaml
  6. 23
      main/api-swagger/positions.yml
  7. 43
      main/src/main/java/gsp/technologies/main/api/organization/OrganizationController.java
  8. 22
      main/src/main/java/gsp/technologies/main/api/organization/OrganizationEntity.java
  9. 9
      main/src/main/java/gsp/technologies/main/api/organization/OrganizationRepository.java
  10. 12
      main/src/main/java/gsp/technologies/main/api/organization/OrganizationService.java
  11. 2
      main/src/main/java/gsp/technologies/main/api/position/PositionController.java
  12. 13
      main/src/main/java/gsp/technologies/main/api/position/PositionEntity.java
  13. 12
      main/src/main/resources/static/content/courses/1/main.md
  14. BIN
      main/src/main/resources/static/content/courses/1/pictures/erd.png
  15. BIN
      main/src/main/resources/static/content/courses/1/pictures/main.png
  16. BIN
      main/src/main/resources/static/content/courses/1/pictures/usecase.png
  17. 18
      main/src/main/resources/static/content/md/hello.md
  18. 28
      main/src/main/resources/static/hello/main.md
  19. BIN
      main/src/main/resources/static/hello/pictures/erd.png
  20. BIN
      main/src/main/resources/static/hello/pictures/states.png
  21. BIN
      main/src/main/resources/static/hello/pictures/usecase.png
  22. BIN
      out/docs/erd/erd.png
  23. BIN
      out/docs/usecase/usecase.png

24
docs/erd/main.puml → docs/erd.puml

@ -12,33 +12,26 @@ title "Entity Relationship Diagram (ERD): exam (пополнение и пров @@ -12,33 +12,26 @@ title "Entity Relationship Diagram (ERD): exam (пополнение и пров
table(account) #eaa {
primary_key(id): LONGSERIAL >>"Идентификатор"
column(code): String >>"35-ичный код (логин)"
foreign_key(orgstructure_id): LONGSERIAL >>"идентификатор места работы"
foreign_key(position_id): LONGSERIAL >>"идентификатор должности"
}
' Оргструктура
table(orgstructure) #eaa {
primary_key(id): LONGSERIAL >>"Идентификатор"
foreign_key(organization_id): LONGSERIAL>>"Идентификатор организации"
foreign_key(position_id): LONGSERIAL>>"Идентификатор должности"
}
orgstructure --{ account
' Организации
table(organization) #eaa {
primary_key(id): LONGSERIAL >>"Идентификатор"
column(name): STRING >>"Наименование"
}
organization --{ orgstructure
' Должности
table(position) #eaa {
primary_key(id): LONGSERIAL >>"Идентификатор"
column(name): STRING >>"Наименование"
foreign_key(organization_id): LONGSERIAL >>"Идентификатор организации"
column(name): STRING >>"Наименование должности"
}
position --{ orgstructure
position --{ account
organization --{ position
' Курсы
' По идентификатору курса определяется положение соответствующего курса
@ -89,7 +82,7 @@ theme --{ scheme @@ -89,7 +82,7 @@ theme --{ scheme
' Список задач
table(target) #eaa {
primary_key(id): LONGSERIAL >>"Идентификатор задачи"
foreign_key(orgstructure_id): LONGSERIAL >>"Идентификатор категории должности"
foreign_key(positione_id): LONGSERIAL >>"Идентификатор должности"
foreign_key(course_id): LONGSERIAL >>"Идентификатор курса"
column(questions_count): INTEGER >>"Количество вопросов для тестирования"
column(limit): INTEGER >>"Количество вопросов, для успешного завершения опроса"
@ -102,8 +95,7 @@ note top @@ -102,8 +95,7 @@ note top
далее вопросы берутся случайным образом из тем, относящихся к курсу в равных пропорциях
end note
orgstructure --{ target
position --{ target
course --{ target
' Вопросы

85
docs/usecase.puml

@ -0,0 +1,85 @@ @@ -0,0 +1,85 @@
@startuml
left to right direction
actor "Пользователь" as user
note top of user : Основной пользователь приложения - обучаемый
actor "Администратор" as admin
note top of admin : Администратор учебного центра (загрузка контента)
actor "Монитор" as monitor
note top of monitor : Заказчик, проверяющий результаты обучений и тестирований
rectangle exam-service {
usecase "Создание курса" as courseCreate
usecase "Создание теста" as testCreate
courseCreate <-- admin
testCreate <-- admin
usecase "Назначение задания" as target
target <-- admin
usecase "Подробный просмотр результатов" as resultsView
monitor --> resultsView
usecase "Авторизация" as auth
rectangle "Авторизация" as examServiceAuth {
usecase "Внесение сведений об организации" as organization
usecase "Внесение сведений о должности" as position
usecase "внесение кода действующей учетной записи" as code35
auth ..> organization
auth ..> position
auth ..> code35
}
usecase "Просмотр перечня доступных курсов" as task
usecase "Просмотр статусов о прохождении курса" as status
usecase "Изучение контента курса" as learn
rectangle "Обучение" as examServiceLearn {
usecase "Просмотр текста" as text
usecase "Скачивание документов" as doc
usecase "Просмотр изображений" as image
usecase "Просмотр видео" as video
learn ..> text
learn ..> doc
learn ..> image
learn ..> video
text <.. courseCreate
doc <.. courseCreate
image <.. courseCreate
video <.. courseCreate
}
usecase "Прохождение проверки знаний" as test
rectangle "Проверка знаний" as examServiceTest {
usecase "Просмотр вопросов и доступных ответов" as quiz
usecase "Выбор ответов" as answer
usecase "Отправка ответов в базу" as postAttampt
test ..> quiz
test ..> answer
test ..> postAttampt
quiz <.. testCreate
answer <.. testCreate
postAttampt <.. testCreate
}
user --> auth
user --> task
user --> learn
user --> test
user --> status
monitor --> status
examServiceTest <.. target
examServiceLearn <.. target
}
@enduml

28
main/api-swagger/components.yaml

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
components:
schemas:
position:
type: object
required:
- id
- name
- organization
properties:
id:
type: integer
name:
type: string
organization:
type: object
properties:
id:
type: integer
organization:
type: object
required:
- id
- name
properties:
id:
type: integer
name:
type: string

9
main/api-swagger/main.yaml

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
openapi: '3.0.3'
info:
title: exam-api
description: API for exam
termsOfService: 'http://localhost:100/hello'
version: '1.0'
servers:
- url: http://localhost:100

45
main/api-swagger/organizations.yaml

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
openapi: '3.0.3'
info:
title: exam-api
description: API for exam
termsOfService: 'http://localhost:100/hello'
version: '1.0'
servers:
- url: http://localhost:100
paths:
/hello:
get:
responses:
'200':
description: OK
/api/v1/organizations:
get:
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: "./components.yaml#/components/schemas/organization"
description: Get all organizations
post:
summary: repo.createOrganization() Возвращает полный список организаци в базе
description: Создание новой должности
requestBody:
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: "./components.yaml#/components/schemas/organization"

23
main/api-swagger/positions.yml

@ -20,9 +20,10 @@ paths: @@ -20,9 +20,10 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/position"
$ref: "./components.yaml#/components/schemas/position"
description: Get all positions
post:
summary: repo.create() Возвращает полный список должностей в базе
description: Создание новой должности
requestBody:
content:
@ -31,25 +32,19 @@ paths: @@ -31,25 +32,19 @@ paths:
type: object
required:
- name
- organization
properties:
name:
type: string
organization:
type: object
properties:
id:
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/position"
components:
schemas:
position:
type: object
required:
- id
- name
properties:
id:
type: integer
name:
type: string
$ref: "./components.yaml#/components/schemas/position"

43
main/src/main/java/gsp/technologies/main/api/organization/OrganizationController.java

@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
package gsp.technologies.main.api.organization;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import gsp.technologies.main.api.position.PositionEntity;
@RestController
@RequestMapping(path = "/api/v1/organizations")
public class OrganizationController {
private static final Logger log = LoggerFactory.getLogger(OrganizationController.class);
@Autowired
private OrganizationRepository organizationRepo;
@CrossOrigin
@GetMapping("")
public ResponseEntity<?> getOrganizations() {
log.info("GET /organizations");
return new ResponseEntity<>(organizationRepo.findAll(), HttpStatus.OK);
}
@CrossOrigin
@PostMapping(path = "",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> saveOrganization(@RequestBody OrganizationEntity organization) {
log.info("POST /organization, organization: {}", organization);
organizationRepo.save(organization);
return new ResponseEntity<>(organization, HttpStatus.CREATED);
}
}

22
main/src/main/java/gsp/technologies/main/api/organization/OrganizationEntity.java

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
package gsp.technologies.main.api.organization;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class OrganizationEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name; //наименование организации
}

9
main/src/main/java/gsp/technologies/main/api/organization/OrganizationRepository.java

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
package gsp.technologies.main.api.organization;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrganizationRepository extends JpaRepository<OrganizationEntity, Long> {
}

12
main/src/main/java/gsp/technologies/main/api/organization/OrganizationService.java

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
package gsp.technologies.main.api.organization;
import org.springframework.stereotype.Service;
@Service
public class OrganizationService {
private final OrganizationRepository repo;
public OrganizationService(OrganizationRepository repo) {
this.repo = repo;
}
}

2
main/src/main/java/gsp/technologies/main/api/position/PositionController.java

@ -31,7 +31,7 @@ public class PositionController { @@ -31,7 +31,7 @@ public class PositionController {
@PostMapping(path = "",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> savePost(@RequestBody PositionEntity position) {
public ResponseEntity<?> savePosition(@RequestBody PositionEntity position) {
log.info("POST /position, position: {}", position);
positionRepo.save(position);
return new ResponseEntity<>(position, HttpStatus.CREATED);

13
main/src/main/java/gsp/technologies/main/api/position/PositionEntity.java

@ -1,14 +1,22 @@ @@ -1,14 +1,22 @@
package gsp.technologies.main.api.position;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import gsp.technologies.main.api.organization.OrganizationEntity;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ -21,4 +29,9 @@ public class PositionEntity { @@ -21,4 +29,9 @@ public class PositionEntity {
private Long id;
private String name; //наименование должности работника
@OneToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "organization", referencedColumnName = "id")
@OnDelete(action = OnDeleteAction.CASCADE)
private OrganizationEntity organization;
}

12
main/src/main/resources/static/content/courses/1/main.md

@ -1,9 +1,19 @@ @@ -1,9 +1,19 @@
# Курс: Охрана труда
## диаграмма usecase
Устанавливает роли и основные способы использования приложения
![диаграмма usecase](/content/courses/1/pictures/usecase.png)
## Структура фреймов интерфейса
Определяет основные элементы пользовательского интерфейса приложения
![структура фреймов интерфейса](/content/courses/1/pictures/states.png)
## Структура базы данных
![структура базы данных](/content/courses/1/pictures/main.png)
Устанавливает состав и структуру таблиц используемых для хранения данных приложения
![структура базы данных](/content/courses/1/pictures/erd.png)
## Посмотрите поучительное видео про медоедов!
<!-- <video src='/content/courses/1/video/Медоеду похер.mp4' width=180/> -->

BIN
main/src/main/resources/static/content/courses/1/pictures/erd.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

BIN
main/src/main/resources/static/content/courses/1/pictures/main.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

BIN
main/src/main/resources/static/content/courses/1/pictures/usecase.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

18
main/src/main/resources/static/content/md/hello.md

@ -1,16 +1,2 @@ @@ -1,16 +1,2 @@
# Учебный центр ООО "ГСП-Технологии"
Предлагаем Вам пройти оценку знаний по основным рабочим компетенциям.
# Порядок прохождения проверки знаний
Укажите пожалуйста наименование компании где Вы работаете и свою должность, чтобы мы могли сформировать набор необходимых для Вас курсов
**Нажав кнопку "перейти к курсу", Вы:**
* попадете на основную страницу курса, где сможете повторить необходимый материал;
* сможете перейти далее к проверке знаний.
# Мы не собираем и не храним Ваши персональные данные
**Для подтверждения прохождения необходимых тестов - Вам нужно запомнить цифры указанные в верхней части экрана.**
Они являются Вашим идентификатором в системе и по ним можно будет в последствии узнать результаты прохождения Вами курсов.
Этот код Вам будет необходим при заезде на вахту, для подтверждения готовности исполнять свои основные должностные обязанности.
# Пояснения для пользователей
- Запомни номер своей учетной записи!!!

28
main/src/main/resources/static/hello/main.md

@ -1 +1,27 @@ @@ -1 +1,27 @@
# hello
# Курс: Охрана труда
## диаграмма usecase
Устанавливает роли и основные способы использования приложения
![диаграмма usecase](/hello/pictures/usecase.png)
## Структура фреймов интерфейса
Определяет основные элементы пользовательского интерфейса приложения
![структура фреймов интерфейса](/hello/pictures/states.png)
## Структура базы данных
Устанавливает состав и структуру таблиц используемых для хранения данных приложения
![структура базы данных](/hello/pictures/erd.png)
## Посмотрите поучительное видео про медоедов!
<!-- <video src='/content/courses/1/video/Медоеду похер.mp4' width=180/> -->
<video controls src="/content/courses/1/video/001.mp4" title="Title"></video>
## Документы на скачивание
[скачать](/content/courses/1/download/7.xlsx)
## документ на просмотр в новой вкладке
<a href="/content/courses/1/docs/horstman_k_sovremennii_javascript_dlya_neterpelivih_2021.pdf" target="_blank">javascript_dlya_neterpelivih_2021 в новой вкладке</a>

BIN
main/src/main/resources/static/hello/pictures/erd.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

BIN
main/src/main/resources/static/hello/pictures/states.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
main/src/main/resources/static/hello/pictures/usecase.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
out/docs/erd/erd.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

BIN
out/docs/usecase/usecase.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Loading…
Cancel
Save