Расчетно графическая работа субд. Расчетно-графическая работа Иванов. Вебприложение Sweater
Скачать 0.53 Mb.
|
Федеральное государственное бюджетное образовательное учреждение высшего образования Омский государственный технический университет Кафедра «Информатика и вычислительная техника» Расчётно-Графическая работа по дисциплине «СУБД» на тему: «Веб-приложение «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 @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 @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 } Контроллер сообщений: 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 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 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 model.mergeAttributes(errorsMap); model.addAttribute("message", message); } else { saveFile(message, file); model.addAttribute("message", null); messageRepo.save(message); } Page 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 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 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. Библиографический списокДорошенко М.С. Базы данных. Разработка приложений в IDE Qt Creator: метод. указания/ М.С. Дорошенко, А.Р. Егоров, И.А. Сугоняк. Малков, О. Б. Работа с Transact-SQL : учеб. пособие / О. Б. Малков, М. В. Девятерикова ; Минобрнауки России, ОмГТУ. – Омск : Изд-во ОмГТУ, 2015. Хансен Г. Базы данных. Разработка и управление/ Г. Хансен. Дж. Хансен. –М. : Бином,1999. |