Сбытовая деятельность на рынке автомобильных запчастей и её программная поддержка
Разработка информационных систем с использованием современных средств управления базами данных. Разработка сертификационного реинжиниринга процессов предприятий. Проектирование и создание таблиц для хранения данных. Редактирование и вывод информации.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.08.2016 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
78
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
“БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ”
Сбытовая деятельность на рынке автомобильных запчастей и её программная поддержка
по дисциплине: «Современные технологии обработки экономической информации (Технологии автоматизации делопроизводства)»
Исполнитель: Е.А. Семенихин
МИНСК, 2016
СОДЕРЖАНИЕ
- Введение
- 1. Описание предметной области
- 2. Постановка задачи
- 3. Модели представления системы и их описание
- 4. Информационная модель системы
- 5. Описание алгоритмов реализующих бизнес-логику серверной части проектируемой системы
- 6. Руководство пользователя
- 7. Результаты тестирования разработанной системы и оценка выполнения задач
- Выводы и заключения
- Литература
- Приложения
- Введение
- Одним из наиболее прогрессирующих направлений в области информационных технологий является разработка и внедрение информационных систем с использованием современных средств управления базами данных. Развитие компьютерной техники и, что более важно, развитие коммуникационных технологий, в последнее время является мощным двигателем использования информационных систем.
- Люди давно стремились систематизировать данные любого типа для облегчения работы и использования информации. В наши дни проще всего систематизировать данные с помощью автоматизации. Если учесть, что этот процесс во много раз упрощает любой бизнес, то о необходимости его должен задуматься каждый коммерсант.
- Основная цель курсового проекта - разработка системы сертификационного реинжиниринга процессов предприятий.
- Достижение цели осуществляется посредствам комплекса следующих задач:
- изучение сферы реинжиниринга сбытовой деятельности на рынке автомобильных запчастей и её программная поддержка;
- проектирование и создания таблиц для хранения данных;
- ввод данных;
- разработка других элементов базы, предназначенных для просмотра, редактирования и вывода информации.
В пояснительной записке будут рассмотрены разделы, которые перечислены ниже.
Раздел «Описание предметной области» включает функциональную модель IDEF0 и описание требований к системе с точки зрения предметной области.
В разделе «Постановка задачи» описывается формулировка задачи и требования к программе.
Раздел «Модели представления системы и их описание» включает диаграммы UML, которые позволяют рассмотреть бизнес-процесс и создать систему.
В разделе «Информационная модель системы» описывается доказательство приведения модели данных к 3-ей нормальной форме.
Раздел «Блок схема программы» включает бизнес-логику серверной части проектируемой системы.
В разделе «Руководство пользователя» описываются способ установки программного продукта.
Раздел «Результаты тестирования» содержит информацию о разработанной системе и способе её использования, а так же оценку выполнения задач.
В разделе «Выводы и заключения» подводится итог разработки программного продукта, указывается объем выполнения задачи, степень соответствия проекта его реализации.
В пояснительной записке предусмотрены приложения, в которых содержатся диаграммы UML и листинг программы.
1. Описание предметной области
Сбытовая деятельность на рынке автомобильных запчастей и ее программная поддержка. С внедрением системы программной поддержки рынка сбытовой деятельности автомобильных запчастей, процесс работы значительно упростится. Многие действия, которые требовали внимания и отнимали время, будут автоматизированы. Администратор будет иметь возможность просмотреть список заказав, организовать доставку, отредактировать данные о том или ином заказе, после чего выполненный заказ поместить в архив выполненных и т.д. Для пользователя также имеется всё необходимое для удобного и понятного оформления заказа.
Все это упростит процесс и избавит от ненужной работы. Авторизация позволит предотвратить несанкционированный доступ извне.
2. Постановка задачи
Требуется разработать подсистему учёта и регистрации доставки пиццы.
Система должна быть реализована в виде web-приложения на языке Java c использованием технологий JSP, Servlet, XML/XSLT. Архитектура приложения должна быть выполнена в архитектуре паттерна MVC. Интерфейс приложения должен быть оформлен с использованием каскадных таблиц стилей(CSS).
При разработке пользовательского интерфейса необходимо предусмотреть элемент «меню», пункты которого должны храниться в виде XML документа, который будет трансформироваться в html представление с помощью технологии XSLT.
Приложение должно быть выполнено в системе IntelliJ IDEA 10.5.
База данных должна содержать следующие таблицы:
- таблица «Товаров»;
- таблица «Заказов»;
- таблица «Заказчиков»;
- таблица «Категорий»;
- таблица «Изображение товаров»;
Разрабатываемое приложение должно обеспечивать добавление, редактирование и удаление записей в базе данных.
Программа должна быть устойчивой к самым различным ошибкам, которые могут возникнуть в процессе работы.
Приложение может быть применено в соответствующей организации и при необходимости может быть модифицировано.
3. Модели представления системы и их описание
Ниже рассматриваются диаграммы стандарта UML2.0.
Диаграмма вариантов использования отображает поведение системы или ее части под тем углом, под каким её видит пользователь (Приложение A). На диаграмме изображен актер: заказчик. Так же изображены варианты использования. Цель варианта использования заключается в том, чтобы определить законченный аспект или фрагмент поведения некоторой сущности без раскрытия её внутренней структуры.
Диаграмма последовательности (Приложение Б) -- диаграмма, на которой показаны взаимодействия объектов, упорядоченные по времени их проявления. При рассмотрении предметной области для диаграммы последовательности были выделены таблицы. Так же на диаграмме изображены соответствующие сообщения, линии жизни и фокусы управления.
Диаграмма состояний в UML описывает все возможные состояния одного экземпляра определенного класса и возможные последовательности его переходов из одного состояния в другое, то есть моделирует все изменения состояний объекта как его реакцию на внешние воздействия.
Диаграмма развёртывания в UML моделирует физическое развертывание артефактов на узлах (Приложение Г).
Диаграмма компонентов -- статическая структурная диаграмма, показывает разбиение программной системы на структурные компоненты и связи (зависимости) между компонентами (Приложение Д). На данной диаграмме показаны база данных и её составляющие, так как база данных и является структурным составляющими рассмотренной предметной области.
Диаграмма классов представляет собой граф, вершинами которого являются элементы типа «классификатор», связанные различными типами структурных отношений. Диаграмма классов может также содержать интерфейсы, пакеты, отношения и даже отдельные экземпляры, такие как объекты и связи (Приложение Е).
В приложении изображены диаграммы методологии IDEF0. В IDEF0 реализованы идеи системного анализа, под которыми понимают исследования, начинающиеся с общего обзора системы, а затем детализируют ее в виде иерархической структуры с определенным числом уровней, на каждом из которых не более 8 элементов. В результате система разбивается на функциональные части, дается их описание, исследуются информационные потоки и формализуется структура данных. В основе структурного анализа используются два базовых принципа: принцип «разделяй и властвуй» и принцип иерархического упорядочения (Приложение Ж).
4. Информационная модель системы
Процесс нормализации заключается в приведении таблиц в так называемые нормальные формы. Существует несколько видов нормальных форм: первая нормальная форма (1НФ), вторая нормальная форма (2НФ), третья нормальная форма (3НФ), нормальная форма Бойса-Кодда (НФБК), четвертая нормальная форма (4НФ), пятая нормальная форма (5НФ). С практической точки зрения, достаточно трех первых форм - следует учитывать время, необходимое системе для "соединения" таблиц при отображении их на экране. Поэтому мы ограничимся приведением отношений к первым трем формам.
Переменная отношения находится в первой нормальной форме тогда и только тогда, когда в любом допустимом значении отношения каждый его кортеж содержит только одно значение для каждого из атрибутов.
В реляционной модели отношение всегда находится в первой нормальной форме по определению понятия отношение.
Что же касается различных таблиц, то они могут не быть правильными представлениями отношений и, соответственно, могут не находиться в 1NF. В соответствии с определением К. Дж. Дейта для такого случая, таблица нормализована (эквивалентно -- находится в первой нормальной форме) тогда и только тогда, когда она является прямым и верным представлением некоторого отношения.
Конкретнее, рассматриваемая таблица должна удовлетворять следующим пяти условиям:
- Нет упорядочивания строк сверху-вниз (другими словами, порядок строк не несет в себе никакой информации).
- Нет упорядочивания столбцов слева-направо (другими словами, порядок столбцов не несет в себе никакой информации).
- Нет повторяющихся строк.
- Каждое пересечение строки и столбца содержит ровно одно значение из соответствующего домена (и больше ничего).
- Все столбцы являются обычными.
«Обычность» всех столбцов таблицы означает, что в таблице нет «скрытых» компонентов, которые могут быть доступны только в вызове некоторого специального оператора взамен ссылок на имена регулярных столбцов, или которые приводят к побочным эффектам для строк или таблиц при вызове стандартных операторов. Таким образом, например, строки не имеют идентификаторов кроме обычных значений потенциальных ключей (без скрытых «идентификаторов строк» или «идентификаторов объектов»). Они также не имеют скрытых временных меток.
Переменная отношения находится во второй нормальной форме тогда и только тогда, когда она находится в первой нормальной форме и каждый неключевой атрибут неприводимо зависит от ее потенциального ключа.
Неприводимость означает, что в составе потенциального ключа отсутствует меньшее подмножество атрибутов, от которого можно также вывести данную функциональную зависимость. Для неприводимой функциональной зависимости часто используется эквивалентное понятие «полная функциональная зависимость».
Если потенциальный ключ является простым, то есть состоит из единственного атрибута, то любая функциональная зависимость от него является неприводимой (полной). Если потенциальный ключ является составным, то согласно определению второй нормальной формы в отношении не должно быть неключевых атрибутов, зависящих от части составного потенциального ключа.
Вторая нормальная форма по определению запрещает наличие неключевых атрибутов, которые вообще не зависят от потенциального ключа. Таким образом, вторая нормальная форма запрещает создавать отношения как несвязанные (хаотические, случайные) наборы атрибутов.
В отличие от первой нормальной формы, так же как и вторая нормальная форма, третья - подразумевает задание вместе с отношением системы функциональных зависимостей. Определение. Базовое отношение находится в третьей нормальной форме относительно заданного множества функциональных зависимостей тогда и только тогда, когда оно находится во второй нормальной форме и каждый неключевой атрибут полностью функционально зависит только от ключей.
Методы приведения к 3NF: удаление полей не зависящих от ключа.
Таким образом, требования, предъявляемые третьей нормальной формой, сильнее требований, накладываемых первой и второй нормальной формой, даже вместе взятых. Фактически в третьей нормальной форме каждый неключевой атрибут зависит от ключа, причем от всего ключа целиком и ни от чего другого, кроме как от ключа.
В рассматриваемой предметной области все таблицы в базе данных приведены к 3-й нормальной форме, так как они находятся во второй нормальной форме и любые неключевые атрибуты зависят только от первичного ключа, т.е. все ключевые поля, содержимое которых может относиться к нескольким записям таблицы вынесены в отдельные таблицы.
На рисунке 4.1 показана Структура таблиц и связи между ними.
Рисунок 4.1 - Структура таблиц БД и связи между ними
5. Описание алгоритмов реализующих бизнес-логику серверной части проектируемой системы
Нет
Да
Блок - схема 1 - Основной алгоритм работы программы
6. Руководство пользователя
Для установки исполнительного файла приложения необходимо выполнить следующие пункты.
1) Установить JDK.
2) Установить в папку c:\Program Files apache.
3) Установить MySql. При установке указать пароль на пользователя root - 1234568.
4) Импортировать в MySql скрипт с БД.
5) В папке, где установлен apache, надо зайти в webapps, создать там папку ROOT.
6) Далее надо распаковать свой проект. Затем в папке target зайти в war архив и скопировать содержимое в созданную папку ROOT.
7) В папке, где установлен apache, есть папка bin, оттуда необходимо запустить startup.bat
8) В проекте найти файл \webapp\WEB-INF\web.xml. Открыть его и скопировать url-pattern.
9) Затем необходимо открыть браузер, например, Mozilla Firefox. Ввести http://localhost:8080/НАЗВАНИЕ ИЗ url-pattern/.
Получится http://localhost:8080/cosmSalon/. Нажать Enter.
7. Результаты тестирования разработанной системы и оценка выполнения задач
Этап тестирования и отладки является важным шагом на пути создания программных средств.
Данная программа была протестирована в операционной системе - Windows 7. При создании данной программы возникали проблемы и ошибки, которые были исправлены, например, часто в каком-либо компоненте нужно было изменять свойства для правильной работы программы. В общем, значительных ошибок не было, и компоненты работают исправно. Некоторые процедуры и функции ни хотели выполнять свои действия, т.к. отсутствовало подключение связи форм. В целом все ошибки были исправлены, и программа функционирует без проблем.
После запуска программного средства откроется главное окно программы (меню пользователя):
Рисунок 7.1 - Главное окно
Слева имеется меню, где представлены категории товаров имеющихся на данный момент. При выборе определённой категории: шины, аккумуляторы, диски и т.д., на экране отобразится соответствующие данной категории список товаров, с указанием наименования, цены, сроков доставки, а так же имеется возможность добавления выбранного товара в корзину. В корзине имеется возможность непосредственно оформить заказ.
Рисунок 7.2 - Корзина
Для оформления заказа, необходимо нажать соответствующую кнопку, открывается следующее окно (Рисунок 7.3):
Рисунок 7.3 - Оформление заказа
Панель администратора:
При авторизации в программе, необходимо ввести логин пользователя и пароль (Рисунок 7.4 - Окно авторизации)
Рисунок 7.4 - Окно авторизации
При авторизации в программе, как администратор, откроется следующее окно (Рисунок 7.5):
Рисунок 7.5 - Консоль
В данном окне имеется возможность добавления новой категории, с указанием названия, а так же краткого описания (Рисунок 7.6). После этого имеется возможность добавления товара в данную категорию (Рисунок 7.7). При переходе на вкладку «Заказы», откроется следующее окно (Рисунок 7.8), с указанием с указанием даты заказа, покупателя и т.д.
Рисунок 7.6 - Добавление категории
Рисунок 7.7 - Добавление товара
Рисунок 7.8 - Заказы
Выводы и заключения
В результате курсового проекта была создана система программной поддержки рынка сбытовой деятельности автомобильных запчастей
Поставленная задача выполнена с использованием наиболее актуальных технологий разработки программного обеспечения.
Информационная система реализована в виде web-приложения на языке Java. Интерфейс приложения оформлен с использованием каскадных таблиц стилей (CSS). В приложении предусмотрена проверка данных, вводимых пользователем. Для создания интуитивного и удобного интерфейса применен набор стандартных элементов управления.
Взаимодействие между программой и пользователем максимально удобно. Программа отлажена, протестирована и готова для демонстрации и практического использования.
В ходе выполнения курсового проекта усовершенствованы знания в области проектирования и создания баз данных на языке Java, приобретены навыки использования научно-технической информации.
Программное средство разработано для функционирования под управлением операционной среды Windows, так как большинство пользователей работают в этой системе, следовательно, имеется больше шансов для распространения программного продукта.
Программа положительно реагирует на все возникающие в процессе работы программы ситуации и также надежно функционирует на ПК любой приемлемой конфигурации.
В целом задача была выполнена в полной мере, и программа может быть использована на практике.
Данный программный продукт выполнен в соответствии с ГОСТами и требованиями, предъявляемыми к технической документации.
Литература
1. UML. Классика CS. 2-у изд./Пер. с англ.; Под общей редакцией проф. С.Орлова - СПб.: Питер, 2014. - 736 с.: ил.
2. Блинов И.Н. , Романчик В.С. Java. Промышленное программирование - УниверсалПресс, 2007. - 704с.
3. Басс Л., Клементс П., Кацман Р. Архитектура программного обеспечения на практике. 2-е издание. - СПб.: Питер, 2006. - 575 с.: ил.
Приложение A. Диаграмма вариантов использования
Приложение Б. Диаграмма последовательности
Приложение В. Диаграмма состояния
Приложение Г. Диаграмма развертывания
Приложение Д. Диаграмма компонентов
Приложение Е. Диаграмма классов
Приложение Ж. Диаграммы методологии IDEF0
Приложение З. Листинг программы
package by.partsstore.configuration;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.ErrorPage;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.UNAUTHORIZED, "/view/error/401.html"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/view/error/404.html"));
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/view/error/500.html"));
container.addErrorPages(new ErrorPage(HttpStatus.SERVICE_UNAVAILABLE, "/view/error/500.html"));
}
}
package by.partsstore.controller.admin;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;
@Controller
public class AdminHomeController {
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String home(ModelMap model) {
return "admin/adminHome";
}
@RequestMapping(value = "/orders", method = RequestMethod.GET)
public String orders(ModelMap model) {
return "admin/orders";
}
@RequestMapping(value = "/admin/access", method = RequestMethod.GET)
public String accessDeniedPage(ModelMap model) {
model.put("user", getPrincipal());
return "admin/access";
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage() {
return "login";
}
@RequestMapping(value="/admin/logout", method = RequestMethod.GET)
public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null){
new SecurityContextLogoutHandler().logout(request, response, auth);
}
return "redirect:/login?logout";
}
private String getPrincipal(){
String userName = null;
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
userName = ((UserDetails)principal).getUsername();
} else {
userName = principal.toString();
}
return userName;
}
}
package by.partsstore.controller.admin;
import by.partsstore.model.Category;
import by.partsstore.model.Item;
import by.partsstore.service.admin.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/admin_category")
public class CategoryAdminController {
@Autowired
private CategoryService service;
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<Category> getAll() {
return service.getAll();
}
@RequestMapping(value="/{id}/items", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<Item> getAllCategoryItems(@PathVariable Long id) {
return service.getAllCategoryItems(id);
}
@RequestMapping(method = RequestMethod.POST)
public Long save(@RequestBody Category model) {
return service.save(model);
}
@RequestMapping(method = RequestMethod.PUT)
@ResponseStatus(value = HttpStatus.OK)
public Long update(@RequestBody Category model) {
return service.updateCategory(model);
}
}
package by.partsstore.controller.admin;
import by.partsstore.service.admin.ItemImageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/images")
public class ImagesController {
@Autowired
private ItemImageService itemImageService;
@RequestMapping(method = RequestMethod.POST)
public Long uploadImage(@RequestBody byte[] data) {
return itemImageService.save(data);
}
@RequestMapping(method = RequestMethod.GET, value = "/{imageId}", produces="image/jpg")
public byte[] getItemImage(@PathVariable Integer imageId) {
return itemImageService.getById(imageId).getData();
}
}
package by.partsstore.controller.admin;
import by.partsstore.model.temp.NewItem;
import by.partsstore.service.admin.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/admin_item")
public class ItemAdminController {
@Autowired
private CategoryService service;
@RequestMapping(method = RequestMethod.POST)
public Long save(@RequestBody NewItem model) {
return service.addNewItem(model);
}
@RequestMapping(method = RequestMethod.PUT)
@ResponseStatus(value = HttpStatus.OK)
public Long update(@RequestBody NewItem model) {
return service.updateItem(model);
}
}
package by.partsstore.controller;
import by.partsstore.model.Category;
import by.partsstore.service.admin.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/category")
public class CategoryController {
@Autowired
private CategoryService service;
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<Category> getAll() {
return service.getAllForUser();
}
}
package by.partsstore.controller;
import by.partsstore.model.Order;
import by.partsstore.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.websocket.server.PathParam;
import java.util.List;
@RestController
@RequestMapping("/api/orders")
public class OrderController {
@Autowired
private OrderService service;
@RequestMapping(method = RequestMethod.POST)
public void orderItems(@RequestBody Order order) {
service.orderItems(order);
}
@RequestMapping(method = RequestMethod.GET)
public List<Order> getOrders() {
return service.getAll();
}
@RequestMapping(value = "/{id}",method = RequestMethod.PUT)
public void finishOrder(@PathVariable Integer id) {
service.finishOrder(id);
}
}
package by.partsstore.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Date;
import java.util.Map;
@Controller
public class UserHomeController {
@RequestMapping(value = { "/", "/home", "/index" }, method = RequestMethod.GET)
public String home(Map<String, Object> model) {
return "index";
}
@RequestMapping(value = { "/test" }, method = RequestMethod.GET)
public String testPage(Map<String, Object> model) {
model.put("title", "Test page");
return "test";
}
}
package by.partsstore.db.repository;
import by.partsstore.model.Category;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {
public List<Category> findByActiveTrue();
public List<Category> findByActiveFalse();
}
package by.partsstore.db.repository;
import by.partsstore.model.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long> {
}
package by.partsstore.db.repository;
import by.partsstore.model.Item;
import by.partsstore.model.ItemImage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemImageRepository extends JpaRepository<ItemImage, Long> {
}
package by.partsstore.db.repository;
import by.partsstore.model.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {
}
package by.partsstore.db.repository;
import by.partsstore.model.OrderItem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {
}
package by.partsstore.db.repository;
import by.partsstore.model.Order;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}
package by.partsstore.db;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DatabaseConfig {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new org.apache.tomcat.jdbc.pool.DataSource();
}
}
package by.partsstore.model.comparator;
import by.partsstore.model.Category;
import java.util.Comparator;
public class CategoryComparator implements Comparator<Category> {
@Override
public int compare(Category o1, Category o2) {
return (o1.getId() < o2.getId()) ? -1 : (o1.getId() > o2.getId()) ? 1 : 0;
}
}
package by.partsstore.model;
import javax.persistence.*;
import java.util.List;
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private String description;
private Boolean active;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "item_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "category_id", referencedColumnName = "id"))
private List<Item> items;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
}
package by.partsstore.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String phone;
private String address;
private boolean active;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
package by.partsstore.model;
import by.partsstore.model.temp.NewItem;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private String description;
private double price;
private Integer imageId;
private Boolean active;
public Item(){
}
public Item(NewItem newItem){
setId(newItem.getId());
setName(newItem.getName());
setDescription(newItem.getDescription());
setPrice(newItem.getPrice());
setImageId(newItem.getImageId());
setActive(newItem.getActive());
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Integer getImageId() {
return imageId;
}
public void setImageId(Integer imageId) {
this.imageId = imageId;
}
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
}
package by.partsstore.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class ItemImage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private byte[] data;
public ItemImage() {
}
public ItemImage(byte[] data) {
this.data = data;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
}
package by.partsstore.model;
import javax.persistence.*;
import java.util.List;
@Entity(name = "customers_orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private long date;
@ManyToOne
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
@OneToMany
// @Transient
private List<OrderItem> orderItems;
private boolean active;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public List<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<OrderItem> orderItems) {
this.orderItems = orderItems;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
package by.partsstore.model;
import javax.persistence.*;
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private int count;
@ManyToOne
@JoinColumn(name = "item_id", nullable = false)
private Item item;
@ManyToOne
@JoinColumn(name = "order_id", nullable = true)
private Order order;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
package by.partsstore.model;
public enum UserRole {
ADMIN, USER;
}
package by.partsstore.service.admin;
import by.partsstore.db.repository.CategoryRepository;
import by.partsstore.model.Category;
import by.partsstore.model.Item;
import by.partsstore.model.comparator.CategoryComparator;
import by.partsstore.model.temp.NewItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Service
public class CategoryService {
@Autowired
private CategoryRepository repository;
public List<Category> getAllForUser() {
List<Category> categories = repository.findByActiveTrue();
Collections.sort(categories, new CategoryComparator());
for (Category category : categories) {
category.getItems().stream().filter(item -> !item.getActive()).forEach(item -> {
category.getItems().remove(item);
});
}
return categories;
}
public List<Item> getAllCategoryItems(final Long id) {
Category category = repository.findOne(id);
return category.getItems();
}
public List<Category> getAll() {
List<Category> categories = repository.findAll();
Collections.sort(categories, new CategoryComparator());
return categories;
}
public List<Category> findByActive(boolean active) {
if (active) {
return repository.findByActiveTrue();
} else {
return repository.findByActiveFalse();
}
}
public Long save(final Category category) {
category.setActive(true);
return repository.save(category).getId();
}
public Category getById(final long id) {
return repository.findOne(id);
}
public long addNewItem(NewItem model) {
Category category = getById(model.getCategoryId());
Item item = new Item(model);
if (category.getItems() == null) {
category.setItems(new ArrayList<>());
}
category.getItems().add(item);
updateCategory(category);
category = getById(model.getCategoryId());
long newItemId = 0;
for (Item obj : category.getItems()) {
if (obj.getId() > newItemId) {
newItemId = obj.getId();
}
}
return newItemId;
}
public Long updateCategory(Category category) {
return repository.save(category).getId();
}
public Long updateItem(NewItem model) {
Category category = getById(model.getCategoryId());
for (Item obj : category.getItems()) {
if (obj.getId() == model.getId()) {
obj.setName(model.getName());
obj.setDescription(model.getDescription());
obj.setImageId(model.getImageId());
obj.setPrice(model.getPrice());
obj.setActive(model.getActive());
updateCategory(category);
return model.getId();
}
}
return 0L;
}
}
реинжиниринг информационный база данных
package by.partsstore.service.admin;
import by.partsstore.db.repository.ItemImageRepository;
import by.partsstore.model.ItemImage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ItemImageService {
@Autowired
private ItemImageRepository repository;
public Long save(final byte[] data) {
ItemImage image = new ItemImage(data);
return repository.save(image).getId();
}
public ItemImage getById(final long id) {
return repository.findOne(id);
}
}
package by.partsstore.service.admin;
import by.partsstore.db.repository.ItemRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ItemService {
@Autowired
private ItemRepository repository;
}
package by.partsstore.service;
import by.partsstore.db.repository.CustomerRepository;
import by.partsstore.db.repository.OrderItemRepository;
import by.partsstore.db.repository.OrderRepository;
import by.partsstore.model.Customer;
import by.partsstore.model.Order;
import by.partsstore.model.OrderItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class OrderService {
@Autowired
OrderRepository repository;
@Autowired
CustomerRepository customerRepository;
@Autowired
OrderItemRepository orderItemRepository;
public void orderItems(Order order) {
Customer c = order.getCustomer();
c.setActive(true);
customerRepository.save(c);
for(OrderItem oi : order.getOrderItems()) {
orderItemRepository.save(oi);
}
repository.save(order);
}
public List<Order> getAll() {
return repository.findAll();
}
public void finishOrder(Integer orderId) {
Order order = repository.getOne(Long.valueOf(orderId));
order.setActive(!order.isActive());
repository.save(order);
}
}
var app = angular.module('app', [
'ui.router',
'restangular',
'ngAnimate',
'ui.bootstrap',
'ngFileUpload',
'ngStorage'
]);
app.config(function (RestangularProvider) {
RestangularProvider.setBaseUrl('http://parts-store.herokuapp.com/api');
//RestangularProvider.setBaseUrl('http://localhost:8080/api');
RestangularProvider.setDefaultHeaders({'Content-Type': 'application/json'});
});
'use strict';
var CategoryAdminController = function ($scope, $uibModal, CategoryAdminApiService, CategoryAdminDataService) {
$scope.getAllCategories = function () {
CategoryAdminApiService.getAll().then(function (result) {
CategoryAdminDataService.setNew(result.plain());
$scope.allCategories = CategoryAdminDataService.getModels();
});
};
$scope.AllStatusCategoryClick = function () {
$scope.allCategories = CategoryAdminDataService.getModels();
}
$scope.AllActiveCategoryClick = function () {
$scope.allCategories = CategoryAdminDataService.getActiveModels();
}
$scope.AllInactiveCategoryClick = function () {
$scope.allCategories = CategoryAdminDataService.getInactiveModels();
}
$scope.AddRootCategoryClick = function () {
$scope.newCategory = {
id: 0,
name: '',
description: '',
active: true
};
var modalInstance = $uibModal.open({
animation: true,
templateUrl: 'addRootCategoryView.html',
controller: 'AddRootCategoryCtrl',
size: 'sm',
resolve: {
category: function () {
return $scope.newCategory;
}
}
});
};
$scope.CategoryTrClick = function (category) {
$scope.editCategory = {
id: category.id,
name: category.name,
description: category.description,
active: category.active
};
getCategoryItems();
};
var getCategoryItems = function() {
CategoryAdminApiService.getAllItems($scope.editCategory.id).then(function(data) {
$scope.editCategory.items = data;
}, function() {
$scope.editCategory.items = [];
});
};
$scope.$on('itemUpdated', getCategoryItems);
$scope.UpdateCategoryClick = function (category) {
CategoryAdminApiService.update(category).then(function () {
CategoryAdminDataService.update(category);
});
};
$scope.AddItemClick = function (categoryId) {
$scope.newItem = {
categoryId: categoryId,
name: "",
description: "",
price: 0,
active: true,
imageId: ""
};
var modalInstance = $uibModal.open({
animation: true,
templateUrl: 'addItemView.html',
controller: 'AddItemCtrl',
size: 'lg',
resolve: {
item: function () {
return $scope.newItem;
}
}
});
};
$scope.ItemTrClick = function (categoryId, item) {
console.log(categoryId);
$scope.newItem = {
categoryId: categoryId,
name: item.name,
description: item.description,
price: item.price,
active: item.active,
imageId: item.imageId
};
var modalInstance = $uibModal.open({
animation: true,
templateUrl: 'addItemView.html',
controller: 'UpdateItemCtrl',
size: 'lg',
resolve: {
item: function () {
return $scope.newItem;
}
}
});
};
$scope.getAllCategories();
};
app.controller('CategoryAdminController', CategoryAdminController);
app.controller('AddRootCategoryCtrl', function ($scope, $uibModalInstance, CategoryAdminApiService, CategoryAdminDataService, category, $rootScope) {
$scope.newCategory = category;
$scope.ok = function (newCategory) {
CategoryAdminApiService.add(newCategory).then(function (result) {
newCategory.id = result;
CategoryAdminDataService.add(newCategory);
$uibModalInstance.close($scope.newCategory);
});
};
$scope.cancel = function () {
$uibModalInstance.dismiss('cancel');
$scope.newCategory.name = '';
$scope.newCategory.description = '';
};
});
app.controller('AddItemCtrl', function ($scope, $uibModalInstance, CategoryAdminApiService, ItemAdminApiService, CategoryAdminDataService, item, $rootScope) {
$scope.newItem = item;
$scope.onFileSelect = function($files) {
if($files.length > 0) {
var file = $files[0];
ItemAdminApiService.uploadImage(file).then(function(response) {
$scope.newItem.imageId = response;
});
}
};
$scope.ok = function (newItem) {
ItemAdminApiService.add(newItem).then(function (result) {
newItem.id = result;
CategoryAdminDataService.addNewItem(newItem);
$scope.$root.$broadcast('itemUpdated');
$uibModalInstance.close($scope.newItem);
});
};
$scope.cancel = function () {
$uibModalInstance.dismiss('cancel');
};
});
app.controller('UpdateItemCtrl', function ($scope, $uibModalInstance, CategoryAdminApiService, ItemAdminApiService, CategoryAdminDataService, item, $rootScope) {
$scope.newItem = item;
$scope.onFileSelect = function($files) {
if($files.length > 0) {
var file = $files[0];
ItemAdminApiService.uploadImage(file).then(function(response) {
$scope.newItem.imageId = response;
});
}
};
$scope.ok = function (newItem) {
ItemAdminApiService.update(newItem).then(function (result) {
CategoryAdminDataService.updateItem(newItem);
$scope.$root.$broadcast('itemUpdated');
$uibModalInstance.close($scope.newItem);
});
};
$scope.cancel = function () {
$uibModalInstance.dismiss('cancel');
};
});
app.controller('OrdersAdminCtrl', function($scope, CategoryAdminApiService, $uibModal) {
$scope.orders = [];
$scope.getAllOrders = function() {
CategoryAdminApiService.getAllOrders().then(function(data) {
$scope.orders = data;
});
};
$scope.OrderTrClick = function(order) {
var modalInstance = $uibModal.open({
animation: true,
templateUrl: 'adminViewOrder.html',
controller: 'OrdersItemsAdminCtrl',
size: 'lg',
resolve: {
order: function () {
return order;
}
}
});
};
$scope.getAllOrders();
});
app.controller('OrdersItemsAdminCtrl', function ($scope, $uibModalInstance, CategoryAdminApiService, ItemAdminApiService, CategoryAdminDataService, order) {
$scope.order = angular.copy(order);
$scope.ok = function() {
CategoryAdminApiService.changeOrderStatus($scope.order.id);
};
$scope.cancel = function () {
$uibModalInstance.dismiss('cancel');
};
$scope.UpdateFullPrice = function () {
var fullPrice = 0;
for (var i = 0; i < $scope.order.orderItems.length; i++) {
fullPrice += $scope.order.orderItems[i].count * $scope.order.orderItems[i].item.price;
}
$scope.fullPrice = fullPrice;
};
$scope.UpdateFullPrice();
});
'use strict';
var CategoryController = function ($scope, $localStorage, $uibModal, CategoryApiService, UserBasketDataService, CategoryDataService, Restangular) {
$scope.getUserCategories = function () {
CategoryApiService.getAllUserCategories().then(function (result) {
CategoryDataService.setNewUserCategories(result.plain());
$scope.userCategories = CategoryDataService.getUserCategories();
$scope.currentCategory = CategoryDataService.getCurrentCategory($scope.userCategories[0].id);
});
};
$scope.CategoryTrClick = function (category) {
$scope.currentCategory = CategoryDataService.getCurrentCategory(category.id);
...Подобные документы
Создание автоматизированной системы – "Агентство по трудоустройству". Проектирование таблиц для хранения данных. Разработка запросов и отчетов, предназначенных для просмотра, редактирования и вывода информации. Разработка пользовательского интерфейса.
курсовая работа [4,9 M], добавлен 29.01.2011Проектирование и разработка информационных систем – баз данных. Запросы в MS Access и в MS Excel. Добавление, удаление и редактирование полей таблиц. Конструирование многотаблиц, форм, запросов, отчетов. Создание сводных таблиц и диаграмм в MS Excel.
курсовая работа [4,5 M], добавлен 25.03.2015Основные понятия и классификация систем управления базами данных, общие требования к их разработке. Инфологическое проектирование, обоснование информационных объектов. Составление инфологической организованной модели. Создание таблиц. Листинг программы.
дипломная работа [3,7 M], добавлен 20.05.2015Проектирование системы управления базой данных "Почтовые отделения" для создания единой информационной системы: создание таблиц для хранения данных, ввод данных, разработка элементов базы, предназначенных для просмотра, редактирования и вывода информации.
курсовая работа [1,4 M], добавлен 31.03.2010Хранение и обработка данных. Компоненты системы баз данных. Физическая структура данных. Создание таблиц в MS Access. Загрузка данных, запросы к базе данных. Разработка информационной системы с применением системы управления базами данных MS Access.
курсовая работа [694,0 K], добавлен 17.12.2016Процесс создания и определение задач полнофункциональной системы управления базами данных. Разработка структуры таблиц, хранящих данные и формирование запросов. Построение форм для ввода и просмотра информации в запросах и создание необходимых отчетов.
курсовая работа [1,1 M], добавлен 11.09.2010Общее описание разрабатываемого веб-сайта. Создание модуля учета средств для разработки программного продукта. Разработка дизайна. Редактирование веб-сайта в CMS Worspress. Разработка методических указаний для продукта. Система управления базами данных.
дипломная работа [1,8 M], добавлен 10.07.2017Формы представляемой информации. Основные типы используемой модели данных. Уровни информационных процессов. Поиск информации и поиск данных. Сетевое хранилище данных. Проблемы разработки и сопровождения хранилищ данных. Технологии обработки данных.
лекция [15,5 K], добавлен 19.08.2013Создание таблиц и проектирование систем управления базами данных. Инфологическое проектирование. Реляционная схема базы данных. Прикладное значение систем: отчет о поставщиках и поставляемых ими товарах. Выписка о наличии товара в магазине.
курсовая работа [596,1 K], добавлен 01.12.2008Исследование характеристик и функциональных возможностей системы управления базами данных Microsoft Office Access. Определение основных классов объектов. Разработка базы данных "Делопроизводство". Создание таблиц, форм, запросов, отчетов и схем данных.
реферат [1,3 M], добавлен 05.12.2014Информатизация различных областей и применение систем, использующих базу данных. Системы управления базами данных. Программирование в Access и создание структуры базы данных. Хранение и редактирование информации о заказах, поиске нужной информации.
курсовая работа [1,0 M], добавлен 01.10.2011Выделение информационных объектов и их инфологическая модель. Логическая структура реляционной базы данных. Разработка таблиц в системе управления базами данных Access. Создание запросов, форм и отчетов в СУБД Access. Разработка приложения пользователя.
курсовая работа [2,8 M], добавлен 05.02.2018Основные понятия базы данных и систем управления базами данных. Типы данных, с которыми работают базы Microsoft Access. Классификация СУБД и их основные характеристики. Постреляционные базы данных. Тенденции в мире современных информационных систем.
курсовая работа [46,7 K], добавлен 28.01.2014Создание баз данных с использованием Database Desktop. Проведение автоматизации рабочего места кассира. Описание входной и выходной информации. Выбор среды реализации, состава и параметров технических средств. Проектирование интерфейса программы.
курсовая работа [1021,5 K], добавлен 22.01.2015Понятие баз данных и принципы проектирования информационных систем. Разработка программы для отслеживания финансовой стороны работы компании в среде Delphi 7. Создание таблиц и схемы данных. Разработка клиентского приложения и процедуры добавления данных.
курсовая работа [1,4 M], добавлен 25.04.2012Классификации баз данных по характеру сберегаемой информации, способу хранения данных и структуре их организации. Современные системы управления базами данных и программы для их создания: Microsoft Office Access, Cronos Plus, Base Editor, My SQL.
презентация [244,3 K], добавлен 03.06.2014Базы данных - важнейшая составная часть информационных систем. Проектирование базы данных на примере предметной области "Оргтехника". Сбор информации о предметной области. Построение информационно-логической модели данных. Разработка логической структуры.
курсовая работа [318,6 K], добавлен 24.12.2014Создание таблиц базы данных с помощью MS Access "Страны Азии". Форма базы данных и запросы к выборкам данных. Модификация структуры таблиц, создания связей между главными таблицами, редактирование данных и проектирование форм для реальной базы данных.
контрольная работа [723,9 K], добавлен 25.11.2012Особенности разработки инфологической модели и создание структуры реляционной базы данных. Основы проектирования базы данных. Разработка таблиц, форм, запросов для вывода информации о соответствующей модели. Работа с базами данных и их объектами.
курсовая работа [981,4 K], добавлен 05.11.2011Анализ баз данных и систем управления ими. Проектирование и создание реляционной базы данных в среде MS Access для ресторана "Дельфин": построение информационно логической модели, разработка структур таблиц базы данных и схемы данных, создание Web-узла.
курсовая работа [3,7 M], добавлен 15.11.2010