diff --git a/docs/erd/main.puml b/docs/erd.puml similarity index 88% rename from docs/erd/main.puml rename to docs/erd.puml index 0329fa9..af3921d 100644 --- a/docs/erd/main.puml +++ b/docs/erd.puml @@ -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 ' Список задач 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 далее вопросы берутся случайным образом из тем, относящихся к курсу в равных пропорциях end note - -orgstructure --{ target +position --{ target course --{ target ' Вопросы diff --git a/docs/usecase.puml b/docs/usecase.puml new file mode 100644 index 0000000..e4072d5 --- /dev/null +++ b/docs/usecase.puml @@ -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 \ No newline at end of file diff --git a/main/api-swagger/components.yaml b/main/api-swagger/components.yaml new file mode 100644 index 0000000..3334d8a --- /dev/null +++ b/main/api-swagger/components.yaml @@ -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 diff --git a/main/api-swagger/main.yaml b/main/api-swagger/main.yaml new file mode 100644 index 0000000..fe255f4 --- /dev/null +++ b/main/api-swagger/main.yaml @@ -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 + diff --git a/main/api-swagger/organizations.yaml b/main/api-swagger/organizations.yaml new file mode 100644 index 0000000..daba6b7 --- /dev/null +++ b/main/api-swagger/organizations.yaml @@ -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" + diff --git a/main/api-swagger/positions.yml b/main/api-swagger/positions.yml index 56f661d..959f426 100644 --- a/main/api-swagger/positions.yml +++ b/main/api-swagger/positions.yml @@ -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: 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" diff --git a/main/src/main/java/gsp/technologies/main/api/organization/OrganizationController.java b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationController.java new file mode 100644 index 0000000..3ff2177 --- /dev/null +++ b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationController.java @@ -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); + } + +} diff --git a/main/src/main/java/gsp/technologies/main/api/organization/OrganizationEntity.java b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationEntity.java new file mode 100644 index 0000000..f839741 --- /dev/null +++ b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationEntity.java @@ -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; //наименование организации +} diff --git a/main/src/main/java/gsp/technologies/main/api/organization/OrganizationRepository.java b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationRepository.java new file mode 100644 index 0000000..d01436c --- /dev/null +++ b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationRepository.java @@ -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 { + +} diff --git a/main/src/main/java/gsp/technologies/main/api/organization/OrganizationService.java b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationService.java new file mode 100644 index 0000000..aa30a98 --- /dev/null +++ b/main/src/main/java/gsp/technologies/main/api/organization/OrganizationService.java @@ -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; + } +} diff --git a/main/src/main/java/gsp/technologies/main/api/position/PositionController.java b/main/src/main/java/gsp/technologies/main/api/position/PositionController.java index 0b51600..6cadbfb 100644 --- a/main/src/main/java/gsp/technologies/main/api/position/PositionController.java +++ b/main/src/main/java/gsp/technologies/main/api/position/PositionController.java @@ -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); diff --git a/main/src/main/java/gsp/technologies/main/api/position/PositionEntity.java b/main/src/main/java/gsp/technologies/main/api/position/PositionEntity.java index da8d568..eac24e6 100644 --- a/main/src/main/java/gsp/technologies/main/api/position/PositionEntity.java +++ b/main/src/main/java/gsp/technologies/main/api/position/PositionEntity.java @@ -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 { private Long id; private String name; //наименование должности работника + @OneToOne(fetch = FetchType.EAGER, optional = false) + @JoinColumn(name = "organization", referencedColumnName = "id") + @OnDelete(action = OnDeleteAction.CASCADE) + private OrganizationEntity organization; + } diff --git a/main/src/main/resources/static/content/courses/1/main.md b/main/src/main/resources/static/content/courses/1/main.md index 6145749..2dbb6b6 100644 --- a/main/src/main/resources/static/content/courses/1/main.md +++ b/main/src/main/resources/static/content/courses/1/main.md @@ -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) ## Посмотрите поучительное видео про медоедов! diff --git a/main/src/main/resources/static/content/courses/1/pictures/erd.png b/main/src/main/resources/static/content/courses/1/pictures/erd.png new file mode 100644 index 0000000..34213eb Binary files /dev/null and b/main/src/main/resources/static/content/courses/1/pictures/erd.png differ diff --git a/main/src/main/resources/static/content/courses/1/pictures/main.png b/main/src/main/resources/static/content/courses/1/pictures/main.png deleted file mode 100644 index 37bca87..0000000 Binary files a/main/src/main/resources/static/content/courses/1/pictures/main.png and /dev/null differ diff --git a/main/src/main/resources/static/content/courses/1/pictures/usecase.png b/main/src/main/resources/static/content/courses/1/pictures/usecase.png new file mode 100644 index 0000000..8e3e921 Binary files /dev/null and b/main/src/main/resources/static/content/courses/1/pictures/usecase.png differ diff --git a/main/src/main/resources/static/content/md/hello.md b/main/src/main/resources/static/content/md/hello.md index 90e47a7..82425ef 100644 --- a/main/src/main/resources/static/content/md/hello.md +++ b/main/src/main/resources/static/content/md/hello.md @@ -1,16 +1,2 @@ -# Учебный центр ООО "ГСП-Технологии" -Предлагаем Вам пройти оценку знаний по основным рабочим компетенциям. - -# Порядок прохождения проверки знаний -Укажите пожалуйста наименование компании где Вы работаете и свою должность, чтобы мы могли сформировать набор необходимых для Вас курсов - -**Нажав кнопку "перейти к курсу", Вы:** -* попадете на основную страницу курса, где сможете повторить необходимый материал; -* сможете перейти далее к проверке знаний. - -# Мы не собираем и не храним Ваши персональные данные -**Для подтверждения прохождения необходимых тестов - Вам нужно запомнить цифры указанные в верхней части экрана.** - -Они являются Вашим идентификатором в системе и по ним можно будет в последствии узнать результаты прохождения Вами курсов. - -Этот код Вам будет необходим при заезде на вахту, для подтверждения готовности исполнять свои основные должностные обязанности. +# Пояснения для пользователей +- Запомни номер своей учетной записи!!! \ No newline at end of file diff --git a/main/src/main/resources/static/hello/main.md b/main/src/main/resources/static/hello/main.md index 3b43971..3da71f7 100644 --- a/main/src/main/resources/static/hello/main.md +++ b/main/src/main/resources/static/hello/main.md @@ -1 +1,27 @@ -# hello \ No newline at end of file +# Курс: Охрана труда + +## диаграмма usecase +Устанавливает роли и основные способы использования приложения + +![диаграмма usecase](/hello/pictures/usecase.png) + +## Структура фреймов интерфейса +Определяет основные элементы пользовательского интерфейса приложения + +![структура фреймов интерфейса](/hello/pictures/states.png) + +## Структура базы данных +Устанавливает состав и структуру таблиц используемых для хранения данных приложения + +![структура базы данных](/hello/pictures/erd.png) + +## Посмотрите поучительное видео про медоедов! + + + + +## Документы на скачивание +[скачать](/content/courses/1/download/7.xlsx) + +## документ на просмотр в новой вкладке +javascript_dlya_neterpelivih_2021 в новой вкладке \ No newline at end of file diff --git a/main/src/main/resources/static/hello/pictures/erd.png b/main/src/main/resources/static/hello/pictures/erd.png new file mode 100644 index 0000000..34213eb Binary files /dev/null and b/main/src/main/resources/static/hello/pictures/erd.png differ diff --git a/main/src/main/resources/static/hello/pictures/states.png b/main/src/main/resources/static/hello/pictures/states.png new file mode 100644 index 0000000..8ee1be6 Binary files /dev/null and b/main/src/main/resources/static/hello/pictures/states.png differ diff --git a/main/src/main/resources/static/hello/pictures/usecase.png b/main/src/main/resources/static/hello/pictures/usecase.png new file mode 100644 index 0000000..8e3e921 Binary files /dev/null and b/main/src/main/resources/static/hello/pictures/usecase.png differ diff --git a/out/docs/erd/erd.png b/out/docs/erd/erd.png new file mode 100644 index 0000000..34213eb Binary files /dev/null and b/out/docs/erd/erd.png differ diff --git a/out/docs/usecase/usecase.png b/out/docs/usecase/usecase.png new file mode 100644 index 0000000..8e3e921 Binary files /dev/null and b/out/docs/usecase/usecase.png differ