Главная страница

Расчетно графическая работа субд. Расчетно-графическая работа Иванов. Вебприложение Sweater


Скачать 0.53 Mb.
НазваниеВебприложение Sweater
АнкорРасчетно графическая работа субд
Дата14.10.2021
Размер0.53 Mb.
Формат файлаdocx
Имя файлаРасчетно-графическая работа Иванов.docx
ТипРеферат
#247245

Федеральное государственное бюджетное образовательное учреждение

высшего образования

Омский государственный технический университет

Кафедра «Информатика и вычислительная техника»

Расчётно-Графическая работа

по дисциплине «СУБД»

на тему: «Веб-приложение «Sweater»»

Преподаватель,

канд. техн. наук, доцент

__________ О. Б. Малков

Разработал ст. гр. ИВТ-181:

__________ Иванов А. А.

Омск 2020

Содержание




Введение 3

1.Описание предметной области 4

2.Проектирование логической схемы базы данных 5

3.Проектирование физической схемы базы данных 6

4.Разработка прикладного программного обеспечения информационной системы 7

4.1. Разработка интерфейса пользователя 7

4.2 Разработка прикладного программного обеспечения информационной системы 11

Заключение 17

Библиографический список 18



Введение


База данных – это организованная структура, предназначенная для хранения данных. В настоящее время в большинстве вузов существуют базы данных, содержащие информацию о студентах, поэтому разработка базы данных будет актуальна. Это позволит автоматизировать деятельность вуза.

С понятием базы данных тесно связано понятие системы управления базой данных. Это комплекс программных средств, предназначенных для создания структуры новой базы, наполнения ее содержимым и визуализации информации. Под визуализацией информации понимается отбор отображаемых данных в соответствии с заданным критерием, их упорядочение, оформление и последующая выдача на устройства вывода или передачи по каналам связи.

1.Описание предметной области


Рассмотрим базу данных «Sweater» для аналога твитера. База данных должна содержать следующую информацию:

  • Информацию о пользователе: номер, наличие активации по почте, присутствие онлайн, почту, пароль, ник;

  • Информацию о ролях пользователей: номер пользователя, роль;

  • Информацию о сообщениях: номер, фото, тэг, текст, номер;


2.Проектирование логической схемы базы данных


Логическая модель данных предметной области в представлена на рисунке 1. Выделены сущности Пользователь, Сообщения, Сообщения которые кому то понравились, Описание, Роль.



Рисунок 1 – Логическая модель предметной области

3.Проектирование физической схемы базы данных


На данном этапе выполняется проектирование физической схемы базы данных на основе логической схемы, для каждой таблицы выбирается тип данных и длина.

Физическая схема базы данных представлена на рисунке 2.



Рисунок 2 – Физическая схема базы данных

База данных Message состоит из 4 таблиц:

  • Message_likes – список преподавателей;

  • User_role– список ролей для каждого юзера;

  • User_description– список подписок;

  • Message – список сообщений;

  • Usr – Данные пользователей;


4.Разработка прикладного программного обеспечения информационной системы


Для базы данных решено было разработать программное обеспечение на языке java в ide Intellij idea. Для работы с базой данных postgres использовалась библиотека Spring.

4.1. Разработка интерфейса пользователя


В верхнем навигационном меню расположены ссылки на таблицы с данными. Навигационное меню представлено на рисунке 3.



Рисунок 3 – Навигационное меню

Таблицы с данными показаны на рисунках 4-6.



Рисунок 4 –Таблица сообщений



Рисунок 5 – Таблица пользователей

В каждой таблице для каждого поля предусмотрены для редактирования. Также, в каждую таблицу можно добавлять в таблицу информацию. Например чтобы добавить пользователя нужно пройти регистрацию как показано на рисунке 6.



Рисунок 6 – Форма для добавления пользователя



Рисунок 7 – Форма для добавления авторизации



Рисунок 8 – Форма для добавления сообщения



Рисунок 8 – Форма для изменения роли определенного пользователя

4.2 Разработка прикладного программного обеспечения информационной системы


Интерфейс сообщений:

import com.example.sweater.domain.Message;

import com.example.sweater.domain.User;

import com.example.sweater.domain.dto.MessageDto;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.Pageable;

import org.springframework.data.jpa.repository.Query;

import org.springframework.data.repository.CrudRepository;

import org.springframework.data.repository.query.Param;
public interface MessageRepo extends CrudRepository {
@Query("select new com.example.sweater.domain.dto.MessageDto(" +

" m, " +

" count(ml), " +

" sum(case when ml = :user then 1 else 0 end) > 0" +

") " +

"from Message m left join m.likes ml " +

"group by m")

Page findAll(Pageable pageable, @Param("user") User user);
@Query("select new com.example.sweater.domain.dto.MessageDto(" +

" m, " +

" count(ml), " +

" sum(case when ml = :user then 1 else 0 end) > 0" +

") " +

"from Message m left join m.likes ml " +

"where m.tag = :tag " +

"group by m")

Page findByTag(@Param("tag") String tag, Pageable pageable, @Param("user") User user);
@Query("select new com.example.sweater.domain.dto.MessageDto(" +

" m, " +

" count(ml), " +

" sum(case when ml = :user then 1 else 0 end) > 0" +

") " +

"from Message m left join m.likes ml " +

"where m.author = :author " +

"group by m")

Page findByUser(Pageable pageable, @Param("author") User author, @Param("user") User user);

}

Контроллер сообщений:

package com.example.sweater.controller;
import com.example.sweater.domain.Message;

import com.example.sweater.domain.User;

import com.example.sweater.domain.dto.MessageDto;

import com.example.sweater.repos.MessageRepo;

import com.example.sweater.service.MessageService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.Pageable;

import org.springframework.data.domain.Sort;

import org.springframework.data.web.PageableDefault;

import org.springframework.security.core.annotation.AuthenticationPrincipal;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.util.StringUtils;

import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import org.springframework.web.util.UriComponents;

import org.springframework.web.util.UriComponentsBuilder;
import javax.validation.Valid;

import java.io.File;

import java.io.IOException;

import java.util.Map;

import java.util.Set;

import java.util.UUID;
@Controller

public class MessageController {

@Autowired

private MessageRepo messageRepo;
@Autowired

private MessageService messageService;
@Value("${upload.path}")

private String uploadPath;
@GetMapping("/")

public String greeting(Map model) {

return "greeting";

}
@GetMapping("/main")

public String main(

@RequestParam(required = false, defaultValue = "") String filter,

Model model,

@PageableDefault(sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable,

@AuthenticationPrincipal User user

) {

Page page = messageService.messageList(pageable, filter, user);
model.addAttribute("page", page);

model.addAttribute("url", "/main");

model.addAttribute("filter", filter);
return "main";

}
@PostMapping("/main")

public String add(

@AuthenticationPrincipal User user,

@Valid Message message,

BindingResult bindingResult,

Model model,

@RequestParam(required = false, defaultValue = "") String filter,

@PageableDefault(sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable,

@RequestParam("file") MultipartFile file

) throws IOException {

message.setAuthor(user);
if (bindingResult.hasErrors()) {

Map errorsMap = ControllerUtils.getErrors(bindingResult);
model.mergeAttributes(errorsMap);

model.addAttribute("message", message);

} else {

saveFile(message, file);
model.addAttribute("message", null);
messageRepo.save(message);

}
Page page = messageService.messageList(pageable, filter, user);

model.addAttribute("page", page);
return "main";

}
private void saveFile(@Valid Message message, @RequestParam("file") MultipartFile file) throws IOException {

if (file != null && !file.getOriginalFilename().isEmpty()) {

File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {

uploadDir.mkdir();

}
String uuidFile = UUID.randomUUID().toString();

String resultFilename = uuidFile + "." + file.getOriginalFilename();
file.transferTo(new File(uploadPath + "/" + resultFilename));
message.setFilename(resultFilename);

}

}
@GetMapping("/user-messages/{author}")

public String userMessges(

@AuthenticationPrincipal User currentUser,

@PathVariable User author,

Model model,

@RequestParam(required = false) Message message,

@PageableDefault(sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable

) {

Page page = messageService.messageListForUser(pageable, currentUser, author);
model.addAttribute("userChannel", author);

model.addAttribute("subscriptionsCount", author.getSubscriptions().size());

model.addAttribute("subscribersCount", author.getSubscribers().size());

model.addAttribute("isSubscriber", author.getSubscribers().contains(currentUser));

model.addAttribute("page", page);

model.addAttribute("message", message);

model.addAttribute("isCurrentUser", currentUser.equals(author));

model.addAttribute("url", "/user-messages/" + author.getId());
return "userMessages";

}
@PostMapping("/user-messages/{user}")

public String updateMessage(

@AuthenticationPrincipal User currentUser,

@PathVariable Long user,

@RequestParam("id") Message message,

@RequestParam("text") String text,

@RequestParam("tag") String tag,

@RequestParam("file") MultipartFile file

) throws IOException {

if (message.getAuthor().equals(currentUser)) {

if (!StringUtils.isEmpty(text)) {

message.setText(text);

}
if (!StringUtils.isEmpty(tag)) {

message.setTag(tag);

}
saveFile(message, file);
messageRepo.save(message);

}
return "redirect:/user-messages/" + user;

}
@GetMapping("/messages/{message}/like")

public String like(

@AuthenticationPrincipal User currentUser,

@PathVariable Message message,

RedirectAttributes redirectAttributes,

@RequestHeader(required = false) String referer

) {

Set likes = message.getLikes();
if (likes.contains(currentUser)) {

likes.remove(currentUser);

} else {

likes.add(currentUser);

}
UriComponents components = UriComponentsBuilder.fromHttpUrl(referer).build();
components.getQueryParams()

.entrySet()

.forEach(pair -> redirectAttributes.addAttribute(pair.getKey(), pair.getValue()));
return "redirect:" + components.getPath();

}

}
Контроллер регистрации:

package com.example.sweater.controller;
import com.example.sweater.domain.User;

import com.example.sweater.domain.dto.CaptchaResponseDto;

import com.example.sweater.service.UserSevice;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.util.StringUtils;

import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.client.RestTemplate;
import javax.validation.Valid;

import java.util.Collections;

import java.util.Map;
@Controller

public class RegistrationController {

//private final static String CAPTCHA_URL = "https://www.google.com/recaptcha/api/siteverify?secret=%s&response=%s";
@Autowired

private UserSevice userSevice;
@Value("${recaptcha.secret}")

private String secret;
@Autowired

private RestTemplate restTemplate;
@GetMapping("/registration")

public String registration() {

return "registration";

}
@PostMapping("/registration")

public String addUser(

@RequestParam("password2") String passwordConfirm,

//@RequestParam("g-recaptcha-response") String captchaResponce,

@Valid User user,

BindingResult bindingResult,

Model model

) {

//String url = String.format(CAPTCHA_URL, secret, captchaResponce);

//CaptchaResponseDto response = restTemplate.postForObject(url, Collections.emptyList(), CaptchaResponseDto.class);
boolean isConfirmEmpty = StringUtils.isEmpty(passwordConfirm);
if (user.getPassword() != null && !user.getPassword().equals(passwordConfirm)) {

model.addAttribute("passwordError", "Passwords are different!");

}
if (!userSevice.addUser(user)) {

model.addAttribute("usernameError", "User exists!");

return "registration";

}
return "redirect:/login";

}
@GetMapping("/activate/{code}")

public String activate(Model model, @PathVariable String code) {

boolean isActivated = userSevice.activateUser(code);
if (isActivated) {

model.addAttribute("messageType", "success");

model.addAttribute("message", "User successfully activated");

} else {

model.addAttribute("messageType", "danger");

model.addAttribute("message", "Activation code is not found!");

}
return "login";

}

}


Заключение


В результате выполнения расчетно-графической работы была спроектирована база данных для предмета «Sweater», а также разработано приложение для работы с этой базой. В приложении были реализованы: добавление, редактирование из таблиц. База данных была реализована средствами PostgresSQLAdmin, приложение разработано в Intellij Idea на языке программирования Java.


Библиографический список


  1. Дорошенко М.С. Базы данных. Разработка приложений в IDE Qt Creator: метод. указания/ М.С. Дорошенко, А.Р. Егоров, И.А. Сугоняк.

  2. Малков, О. Б. Работа с Transact-SQL : учеб. пособие / О. Б. Малков, М. В. Девятерикова ; Минобрнауки России, ОмГТУ. – Омск : Изд-во ОмГТУ, 2015.

  3. Хансен Г. Базы данных. Разработка и управление/ Г. Хансен. Дж. Хансен.­­ –М. : Бином,1999.


написать администратору сайта