Интернет-магазин цифровых ключей компьютерных игр
Выбор архитектуры приложения и средств разработки. Проектирование пользовательского интерфейса и базы данных. Реализация серверной и клиентской частей системы. Привязка доменного имени. Настройка инструментов для автоматического развертывания приложения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 14.12.2019 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Для разработанного приложения было принято решение создать домен третьего уровня на личном доменном имени - discoverivan.ru. Для этого в панели управления DNS сервером показанной на рисунке 5.2 была создана A запись с IP адресом виртуального сервера.
Рисунок 5.2 - Настройка А записи домена
Итоговый адрес приложения, а также и виртуального сервера, на котором оно работает.
5.3 Настройка инструментов для автоматического развертывания приложения
Для хранения исходного кода, а также непрерывного процесса развертывания приложения использована платформа GitLab.
GitLab [8] -- это платформа управления Git-репозиториями [8], анализа кода, отслеживания ошибок, тестирования, деплоя, ведения каналов и вики-страниц. GitLab помогает разработчикам вести непрерывный процесс развертывания для тестирования, создания и деплоя кода, следить за ходом тестов, повышать контроль над качеством, фокусирования на построении продукта вместо настройки инструментов.
В репозитории было создано две ветки: master и release. Такое количество веток оптимально, так как приложение разрабатывает один человек. На ветке master идет основная разработка приложения. На ветку release сливаются стабильные этапы развития проекта.
Для того чтобы активировать процесс непрерывного развертывания необходимо настроить и активировать систему CI/CD. Принцип действия CI/CD похож на конвейер: методика выполняет интеграционную функцию, включая различные типы автоматических тестов на каждом этапе, с последующей доставкой и развёртыванием завершённого кода в готовый продукт для конечного пользователя. Содержимое файла с настройками CI/CD расположено в приложении 2. Давайте подробно рассмотрим параметры в данном файле:
· Image - данный параметр отвечает за выбор образа, с которым автоматический сборщик начнет работу;
· Stages - данный содержит в себе список стадий, которые будут выполнены автоматическим сборщиком;
· Variables - здесь указываются переменные среды;
· Cache - данный параметр содержит информацию о папках, которые будут сохранены при переходе между стадиями. Кеширование необходимо, так как разные стадии могут исполнять разные сборщики;
· Test, deploy - в данных разделах описываются действия, которые необходимо совершить автоматическому сборщику. У стадии deploy есть условие, которое разрешает ее исполнение только если идет сборка кода на ветке release.
После того как была произведена настройка CI/CD. При каждом новом коммите будет запускаться автоматическая сборка и тестирование приложения. Если изменения будут добавлены на ветку release, то произойдет сборка, тестирование и загрузка приложения на сервер. Благодаря платформе GitLab данные процессы показаны наглядно. На рисунке 5.3 показан запрос слияния ветки master с веткой release.
интерфейс серверный доменный приложение
Рисунок 5.3 - Запрос слияния с веткой release
Разработанное приложение доступно для тестирования по адресу vps.discoverivan.ru. Благодаря процессам непрерывного развертывания, внесение изменений в проект проходит автоматическую проверку и загрузку на сервер.
Заключение
Целью дипломного проекта стала разработка интернет-магазина цифровых ключей компьютерных игр. Для достижения цели был проведен аналитический обзор, в ходе которого были поставлены задачи, которые будет решать данный продукт, проведен анализ существующих решений, определены категории пользователей и бизнес-правила. В ходе проектирования была создана use-case диаграмма, выбраны средства разработки, спроектирована схема базы данных, а также произведено проектирование пользовательского интерфейса. Разработка программного продукта проходила в два этапа. Первым этапом была разработка серверной части, в которой содержится бизнес-логика и работа с базой данных. Вторым этапом была разработана клиентская часть, которая обрабатывает взаимодействие с пользователем. Тестирование программного продукта состояло из четырех частей: модульного тестирования серверной части, тестирования верстки клиентской части, системного тестирования, нагрузочного тестирования. Благодаря процессам непрерывного развертывания, внесение изменений в проект проходит автоматическую проверку и загрузку на сервер.
Разработанный программный продукт выполняет поставленные задачи. В разработанном интернет-магазине удачно сочетается интерфейс магазина с его функциональностью и простотой использования. Разбитые по категориям товары, имеющие подробное описание с иллюстрациями, просмотр «новинок» и самых продаваемых товаров улучшат внешний вид сайта и его положение в поисковых системах. Для обеспечения защиты передаваемых данных используется 128-битный протокол безопасности SSL.
Список использованных источников
1. Брюс Эккель Философия Java / Брюс Эккель - Санкт - Петербург: Питер,2009 - 640 с.
2. С.Ю. Ржеуцкая Базы данных. Теоретические и языковые основы: Учеб. пособие. - Вологда: ВоГУ, 2016. - 112 с.
Приложение
(Обязательное)
SQL-схема базы данных
CREATE TABLE IF NOT EXISTS `game` (
`id` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
`description` text NOT NULL,
`release_date` date DEFAULT NULL,
`poster_image_url` varchar(255) NOT NULL,
`developer` varchar(255) NOT NULL,
`price` float NOT NULL DEFAULT '0',
`amount` int(11) NOT NULL DEFAULT '0',
`views` int(11) NOT NULL DEFAULT '0',
`status` int(11) NOT NULL,
`publish_date` datetime NOT NULL,
`order_count` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `game_genre` (
`id` int(11) NOT NULL,
`game_id` int(11) NOT NULL,
`genre_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `game_language` (
`id` int(11) NOT NULL,
`game_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `game_platform` (
`id` int(11) NOT NULL,
`game_id` int(11) NOT NULL,
`platform_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `game_screenshot` (
`id` int(11) NOT NULL,
`game_id` int(11) NOT NULL,
`image_url` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `genre` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `language` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `orders` (
`id` int(11) NOT NULL,
`date` datetime NOT NULL,
`customer_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `order_product` (
`id` int(11) NOT NULL,
`order_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `platform` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `product` (
`id` int(11) NOT NULL,
`game_id` int(11) NOT NULL,
`license_key` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL,
`discriminator` varchar(255) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `user_role` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`role` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `game`
ADD PRIMARY KEY (`id`);
ALTER TABLE `game_genre`
ADD PRIMARY KEY (`id`),
ADD KEY `game_genre_fk0` (`game_id`),
ADD KEY `game_genre_fk1` (`genre_id`);
ALTER TABLE `game_language`
ADD PRIMARY KEY (`id`),
ADD KEY `game_language_fk0` (`game_id`),
ADD KEY `game_language_fk1` (`language_id`);
LTER TABLE `game_platform`
ADD PRIMARY KEY (`id`),
ADD KEY `game_platform_fk0` (`game_id`),
ADD KEY `game_platform_fk1` (`platform_id`);
ALTER TABLE `game_screenshot`
ADD PRIMARY KEY (`id`),
ADD KEY `game_screenshot_fk0` (`game_id`);
ALTER TABLE `genre`
ADD PRIMARY KEY (`id`);
ALTER TABLE `language`
ADD PRIMARY KEY (`id`);
ALTER TABLE `orders`
ADD PRIMARY KEY (`id`),
ADD KEY `orders_fk0` (`customer_id`);
ALTER TABLE `order_product`
ADD PRIMARY KEY (`id`),
ADD KEY `game_id` (`order_id`),
ADD KEY `product_id` (`product_id`);
ALTER TABLE `platform`
ADD PRIMARY KEY (`id`);
ALTER TABLE `product`
ADD PRIMARY KEY (`id`),
ADD KEY `game_id` (`game_id`);
ALTER TABLE `user`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `username` (`username`),
ADD UNIQUE KEY `email` (`email`);
ALTER TABLE `user_role`
ADD PRIMARY KEY (`id`),
ADD KEY `user_role_fk0` (`user_id`);
ALTER TABLE `game`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `game_genre`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `game_language`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `game_platform`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `game_screenshot`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `genre`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `language`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `orders`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `order_product`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `platform`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `product`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `user`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `user_role`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `game_genre`
ADD CONSTRAINT `game_genre_fk0` FOREIGN KEY (`game_id`) REFERENCES `game` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `game_genre_fk1` FOREIGN KEY (`genre_id`) REFERENCES `genre` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `game_language`
ADD CONSTRAINT `game_language_fk0` FOREIGN KEY (`game_id`) REFERENCES `game` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `game_language_fk1` FOREIGN KEY (`language_id`) REFERENCES `language` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `game_platform`
ADD CONSTRAINT `game_platform_fk0` FOREIGN KEY (`game_id`) REFERENCES `game` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `game_platform_fk1` FOREIGN KEY (`platform_id`) REFERENCES `platform` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `game_screenshot`
ADD CONSTRAINT `game_screenshot_fk0` FOREIGN KEY (`game_id`) REFERENCES `game` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `orders`
ADD CONSTRAINT `orders_fk0` FOREIGN KEY (`customer_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `order_product`
ADD CONSTRAINT `order_product_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `order_product_ibfk_2` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `product`
ADD CONSTRAINT `product_ibfk_1` FOREIGN KEY (`game_id`) REFERENCES `game` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE;
ALTER TABLE `user_role`
ADD CONSTRAINT `user_role_fk0` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Настройки GitLab CI/CD
image: maven:latest
stages:
- test
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- target/
test:
stage: test
script:
- mvn clean
- mvn test
deploy:
stage: deploy
script:
- mvn tomcat7:deploy
environment:
name: production
only:
- release
Исходный код серверной части проекта
private AppLoader appLoader;
private AdminService adminService;
private StatsService statsService;
private PaginationService<Game> gamePaginationService;
private GameDAO gameDAO;
private OrderDAO orderDAO;
private CustomerDAO customerDAO;
private LanguageDAO languageDAO;
private PlatformDAO platformDAO;
private GenreDAO genreDAO;
private AdminDAO adminDAO;
private ProductDAO productDAO;
@RequestMapping(value = "")
public String showIndex() {
return "admin/index";
}
@RequestMapping(value = "game")
public String showGames(ModelMap model) {
model.addAttribute("gameDAO", gameDAO);
model.addAttribute("genreDAO", genreDAO);
model.addAttribute("languageDAO", languageDAO);
model.addAttribute("platformDAO", platformDAO);
model.addAttribute("gamePaginationService", gamePaginationService);
return "admin/game/game";
}
@RequestMapping(value = "game", method = RequestMethod.POST)
public String gameAddHandler(
@RequestParam(name = "game-add-submit") Object submit,
@RequestParam(name = "title") String title,
@RequestParam(name = "description") String description,
@RequestParam(name = "poster-image-url") String posterImageUrl,
@RequestParam(name = "languages") String[] languages,
@RequestParam(name = "genres") String[] genres,
@RequestParam(name = "platforms") String[] platforms,
@RequestParam(name = "price") Float price,
@RequestParam(name = "developer") String developer,
@RequestParam(name = "release-date") String releaseDate,
@RequestParam(name = "screenshot") String[] screenshots
) {
if (submit != null){
Game game = new Game();
game.setTitle(title);
game.setDescription(description);
game.setPosterImageUrl(posterImageUrl);
game.setGenres(convertGenreIdListToSet(genres));
game.setLanguages(convertLanguagesIdListToSet(languages));
game.setPlatforms(convertPlatformsIdListToSet(platforms));
game.setPrice(price);
game.setDeveloper(developer);
game.setReleaseDate(parseDateFromString(releaseDate));
game.setScreenshotsUrls(new HashSet<>(Arrays.asList(screenshots)));
adminService.addGame(game);
}
return "redirect:/admin/game";
}
@RequestMapping(value = "game/remove", method = RequestMethod.POST)
public String gameRemoveHandler(
ModelMap model,
@RequestParam(name = "game-delete") Object submit,
@RequestParam(name = "id") Integer id
) {
if (submit != null){
adminService.deleteGame(id);
}
return "redirect:/admin/game";
}
@RequestMapping(value = "game/edit/{id}", method = RequestMethod.GET)
public String showGameEdit(ModelMap model, @PathVariable(value = "id") int id) {
model.addAttribute("urlParam1", id);
model.addAttribute("gameDAO", gameDAO);
model.addAttribute("genreDAO", genreDAO);
model.addAttribute("languageDAO", languageDAO);
model.addAttribute("platformDAO", platformDAO);
return "admin/game/edit";
}
@RequestMapping(value = "game/edit/{id}", method = RequestMethod.POST)
public String gameEditHandler(
@RequestParam(name = "game-edit-submit") Object submit,
@RequestParam(name = "id") Integer id,
@RequestParam(name = "title") String title,
@RequestParam(name = "description") String description,
@RequestParam(name = "poster-image-url") String posterImageUrl,
@RequestParam(name = "languages") String[] languages,
@RequestParam(name = "genres") String[] genres,
@RequestParam(name = "platforms") String[] platforms,
@RequestParam(name = "price") Float price,
@RequestParam(name = "developer") String developer,
@RequestParam(name = "release-date") String releaseDate,
@RequestParam(name = "screenshot") String[] screenshots
) {
if (submit != null){
Game game = new Game();
game.setTitle(title);
game.setDescription(description);
game.setPosterImageUrl(posterImageUrl);
game.setGenres(convertGenreIdListToSet(genres));
game.setLanguages(convertLanguagesIdListToSet(languages));
game.setPlatforms(convertPlatformsIdListToSet(platforms));
game.setPrice(price);
game.setDeveloper(developer);
game.setReleaseDate(parseDateFromString(releaseDate));
game.setScreenshotsUrls(new HashSet<>(Arrays.asList(screenshots)));
adminService.editGame(id, game);
}
return "redirect:/admin/game";
}
@RequestMapping(value = "order", method = RequestMethod.GET)
public String showOrders(ModelMap model) {
model.addAttribute("orderDAO", orderDAO);
return "admin/order/order";
}
@RequestMapping(value = "order", method = RequestMethod.POST)
public String deleteOrder(
@RequestParam(name="order-delete") Object submit,
@RequestParam(name = "id") Integer id
) {
if (submit != null){
Order o = orderDAO.get(id);
adminService.deleteOrder(id);
}
return "redirect:/admin/order";
}
@RequestMapping(value = "customer", method = RequestMethod.GET)
public String showCustomers(ModelMap model) {
model.addAttribute("customerDAO", customerDAO);
return "admin/customer/customer";
}
@RequestMapping(value = "customer", method = RequestMethod.POST)
public String deleteCustomer(
@RequestParam(name="customer-delete") Object submit,
@RequestParam(name = "id") Integer id
) {
if (submit != null){
adminService.deleteCustomer(id);
}
return "redirect:/admin/customer";
}
@RequestMapping(value = "stats")
public String showStats(ModelMap model) {
return "admin/stats/stats";
}
@RequestMapping(value = "stats/short", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
ShortStats getShortStats(){
return statsService.getShortStats();
}
@RequestMapping(value = "stats/full", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
FullStats getFullStats(@RequestParam(name = "time-interval") String timeInterval
){
return statsService.getFullStats(timeInterval);
}
@RequestMapping(value = "language", method = RequestMethod.GET)
public String showLanguages(ModelMap model) {
model.addAttribute("languageDAO", languageDAO);
return "admin/language/language";
}
@RequestMapping(value = "language", method = RequestMethod.POST)
public String addLanguage(
@RequestParam(name = "language-add-submit") Object submit,
@RequestParam(name = "name") String name
) {
if (submit != null){
Language language = new Language();
language.setName(name);
adminService.addLanguage(language);
}
return "redirect:/admin/language";
}
@RequestMapping(value = "language/edit/{id}", method = RequestMethod.GET)
public String showEditLanguage(ModelMap model, @PathVariable(name = "id") int id) {
model.addAttribute("urlParam1", id);
model.addAttribute("languageDAO", languageDAO);
return "admin/language/edit";
}
@RequestMapping(value = "language/edit/{id}", method = RequestMethod.POST)
public String editLanguageHandler(
@RequestParam(name = "language-edit-submit") Object submit,
@RequestParam(name = "id") Integer id,
@RequestParam(name = "name") String name
) {
if (submit != null){
Language language = new Language();
language.setName(name);
adminService.editLanguage(id, language);
}
return "redirect:/admin/language";
}
@RequestMapping(value = "language/remove", method = RequestMethod.POST)
public String deleteLanguage(
@RequestParam(name="language-delete") Object submit,
@RequestParam(name = "id") Integer id
) {
if (submit != null){
adminService.deleteLanguage(id);
}
return "redirect:/admin/language";
}
@RequestMapping(value = "genre", method = RequestMethod.GET)
public String showGenres(ModelMap model) {
model.addAttribute("genreDAO", genreDAO);
return "admin/genre/genre";
}
@RequestMapping(value = "genre", method = RequestMethod.POST)
public String addGenre(
@RequestParam(name = "genre-add-submit") Object submit,
@RequestParam(name = "name") String name
) {
if (submit != null){
Genre genre = new Genre();
genre.setName(name);
adminService.addGenre(genre);
}
return "redirect:/admin/genre";
}
@RequestMapping(value = "genre/edit/{id}", method = RequestMethod.GET)
public String showEditGenre(ModelMap model, @PathVariable(name = "id") int id) {
model.addAttribute("urlParam1", id);
model.addAttribute("genreDAO", genreDAO);
return "admin/genre/edit";
}
@RequestMapping(value = "genre/edit/{id}", method = RequestMethod.POST)
public String editGenreHandler(
@RequestParam(name = "genre-edit-submit") Object submit,
@RequestParam(name = "id") Integer id,
@RequestParam(name = "name") String name
) {
if (submit != null){
Genre genre = new Genre();
genre.setName(name);
adminService.editGenre(id, genre);
}
return "redirect:/admin/genre";
}
@RequestMapping(value = "genre/remove", method = RequestMethod.POST)
public String deleteGenre(
@RequestParam(name="genre-delete") Object submit,
@RequestParam(name = "id") Integer id
) {
if (submit != null){
adminService.deleteGenre(id);
}
return "redirect:/admin/genre";
}
@RequestMapping(value = "platform", method = RequestMethod.GET)
public String showPlatforms(ModelMap model) {
model.addAttribute("platformDAO", platformDAO);
return "admin/platform/platform";
}
@RequestMapping(value = "platform", method = RequestMethod.POST)
public String addPlatform(
@RequestParam(name = "platform-add-submit") Object submit,
@RequestParam(name = "name") String name
) {
if (submit != null){
Platform platform = new Platform();
platform.setName(name);
adminService.addPlatform(platform);
}
return "redirect:/admin/platform";
}
@RequestMapping(value = "platform/edit/{id}", method = RequestMethod.GET)
public String showEditPlatform(ModelMap model, @PathVariable(name = "id") int id) {
model.addAttribute("urlParam1", id);
model.addAttribute("platformDAO", platformDAO);
return "admin/platform/edit";
}
@RequestMapping(value = "platform/edit/{id}", method = RequestMethod.POST)
public String editPlatformHandler(
@RequestParam(name = "platform-edit-submit") Object submit,
@RequestParam(name = "id") Integer id,
@RequestParam(name = "name") String name
) {
if (submit != null){
Platform platform = new Platform();
platform.setName(name);
adminService.editPlatform(id, platform);
}
return "redirect:/admin/platform";
}
@RequestMapping(value = "platform/remove", method = RequestMethod.POST)
public String deletePlatform(
@RequestParam(name="platform-delete") Object submit,
@RequestParam(name = "id") Integer id
) {
if (submit != null){
adminService.deletePlatform(id);
}
return "redirect:/admin/platform";
}
private Date parseDateFromString(String s) {
Date releaseDate = new Date();
try {
releaseDate = new SimpleDateFormat("yyyy-MM-dd").parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return releaseDate;
}
@RequestMapping(value = "settings", method = RequestMethod.GET)
public String showSettings(ModelMap model) {
model.addAttribute("adminDAO", adminDAO);
return "admin/settings";
}
@RequestMapping(value = "product/import", method = RequestMethod.GET)
public String showProductImport(ModelMap model) {
model.addAttribute("adminDAO", adminDAO);
model.addAttribute("gameDAO", gameDAO);
return "admin/products/import";
}
@RequestMapping(value = "product/list", method = RequestMethod.GET)
public String showProductList(ModelMap model) {
model.addAttribute("adminDAO", adminDAO);
model.addAttribute("gameDAO", gameDAO);
return "admin/products/list";
}
@RequestMapping(value = "product/list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<Product> getProductList(
@RequestParam(name = "game") Integer gameId) {
System.out.println(gameDAO.get(gameId).getTitle());
return productDAO.getAllProductsByGame(gameDAO.get(gameId));
}
@RequestMapping(value = "product/import", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Integer getExternalKeys(
@RequestParam(name = "game") Integer gameId,
@RequestParam(name = "url") String urlString) {
String pageText = getPageContentFromUrl(urlString);
List<ExternalProduct> products = getExternalProductsListFromPageContent(pageText);
return products.size();
}
private List<ExternalProduct> getExternalProductsListFromPageContent(String pageText) {
List<ExternalProduct> products = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
try {
products = mapper.readValue(pageText, mapper.getTypeFactory().constructCollectionType(List.class, ExternalProduct.class));
} catch (IOException e) {
e.printStackTrace();
}
return products;
}
private String getPageContentFromUrl(@RequestParam(name = "url") String urlString) {
String pageText = "";
URL url = null;
try {
url = new URL(urlString);
URLConnection conn = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
pageText = reader.lines().collect(Collectors.joining("\n"));
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return pageText;
}
@RequestMapping(value = "settings", method = RequestMethod.POST)
public String settingsHandler(
@RequestParam(name = "base-init", required = false) Object baseInit,
@RequestParam(name = "load-test-base", required = false) Object loadTestBase,
@RequestParam(name = "count", required = false) Integer loadTestBaseCount
) {
if (baseInit != null){
appLoader.initBase();
}
if (loadTestBase != null){
if (loadTestBaseCount > 100000){
loadTestBaseCount = 100000;
}
appLoader.loadTest(loadTestBaseCount);
}
return "admin/settings";
}
@RequestMapping(value = "settings/admin/add", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE)
public @ResponseBody String addAdminAccount(@RequestParam(name = "username") String username,
@RequestParam(name = "password") String password,
@RequestParam(name = "password-confirm") String passwordConfirm
){
if (!password.equals(passwordConfirm)) {
return "0";
}
Admin admin = new Admin();
admin.setUsername(username);
admin.setPassword(password);
adminService.registerNewAdmin(admin);
return "1";
}
@RequestMapping(value = "settings/admin/delete", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE)
public @ResponseBody String removeAdminAccount(@RequestParam(name = "id") Integer id
){
if (adminDAO.count() > 1) {
adminService.removeAdmin(id);
return "1";
}
return "0";
}
private Set<Platform> convertPlatformsIdListToSet(String[] platforms) {
Set<Platform> platformSet = new HashSet<>();
for (String platform : platforms) {
platformSet.add(platformDAO.get(Integer.parseInt(platform)));
}
return platformSet;
}
private Set<Language> convertLanguagesIdListToSet(String[] languages) {
Set<Language> languageSet = new HashSet<>();
for (String language : languages) {
languageSet.add(languageDAO.get(Integer.parseInt(language)));
}
return languageSet;
}
private Set<Genre> convertGenreIdListToSet(String[] genres) {
Set<Genre> genresSet = new HashSet<>();
for (String genre : genres) {
genresSet.add(genreDAO.get(Integer.parseInt(genre)));
}
return genresSet;
}
@Autowired
public void setAdminDAO(AdminDAO adminDAO) {
this.adminDAO = adminDAO;
}
@Autowired
public void setAdminService(AdminService adminService) {
this.adminService = adminService;
}
@Autowired
public void setAppLoader(AppLoader appLoader) {
this.appLoader = appLoader;
}
@Autowired
public void setStatsService(StatsService statsService) {
this.statsService = statsService;
}
@Autowired
public void setGamePaginationService(PaginationService<Game> gamePaginationService) {
this.gamePaginationService = gamePaginationService;
}
@Autowired
public void setGameDAO(GameDAO gameDAO) {
this.gameDAO = gameDAO;
}
@Autowired
public void setOrderDAO(OrderDAO orderDAO) {
this.orderDAO = orderDAO;
}
@Autowired
public void setCustomerDAO(CustomerDAO customerDAO) {
this.customerDAO = customerDAO;
}
@Autowired
public void setLanguageDAO(LanguageDAO languageDAO) {
this.languageDAO = languageDAO;
}
@Autowired
public void setPlatformDAO(PlatformDAO platformDAO) {
this.platformDAO = platformDAO;
}
@Autowired
public void setGenreDAO(GenreDAO genreDAO) {
this.genreDAO = genreDAO;
}
@Autowired
public void setProductDAO(ProductDAO productDAO) {
this.productDAO = productDAO;
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\controller\ShopController.java
package ru.discoverivan.gameshop.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import ru.discoverivan.gameshop.db.dao.GameDAO;
import ru.discoverivan.gameshop.db.dao.GenreDAO;
import ru.discoverivan.gameshop.db.dao.OrderDAO;
import ru.discoverivan.gameshop.db.entity.Customer;
import ru.discoverivan.gameshop.db.entity.Order;
import ru.discoverivan.gameshop.db.entity.Product;
import ru.discoverivan.gameshop.domain.*;
import ru.discoverivan.gameshop.validation.RegisterForm;
import ru.discoverivan.gameshop.validation.RegisterFormValidator;
import ru.discoverivan.gameshop.validation.ValidationResult;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Controller
@RequestMapping(value = "")
public class ShopController {
private ShopService shopService;
private CartService cartService;
private UserService userService;
private SecurityService securityService;
private RegisterFormValidator registerFormValidator;
private GameDAO gameDAO;
private GenreDAO genreDAO;
private OrderDAO orderDAO;
@RequestMapping(value = "")
public String showIndex(ModelMap model) {
model.addAttribute("gameDAO", gameDAO);
model.addAttribute("genreDAO", genreDAO);
return "site/index";
}
@RequestMapping(value = "account")
public String showAccountPage(ModelMap model) {
model.addAttribute("userService", userService);
model.addAttribute("orderDAO", orderDAO);
return "site/account/index";
}
@RequestMapping(value = "account/order/{id}")
public String showAccountOrderPage(ModelMap model, @PathVariable(value = "id") int id) {
model.addAttribute("urlParam1", id);
model.addAttribute("orderDAO", orderDAO);
model.addAttribute("userService", userService);
return "site/account/order";
}
@RequestMapping(value = "login", method = RequestMethod.GET)
public String showLoginPage() {
return "site/login";
}
@RequestMapping(value = "register", method = RequestMethod.GET)
public ModelAndView showRegisterPage(Model model) {
return new ModelAndView("site/register","registerForm", new RegisterForm());
}
@RequestMapping(value = "register", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ValidationResult processRegister(
@ModelAttribute("register") RegisterForm registerForm
) {
ValidationResult validationResult = registerFormValidator.validate(registerForm);
if (validationResult.getSuccess()){
Customer customer = new Customer();
customer.setName(registerForm.getName());
customer.setEmail(registerForm.getEmail());
customer.setUsername(registerForm.getUsername());
customer.setPassword(registerForm.getPassword());
userService.registerNewCustomer(customer);
securityService.autoLogin(registerForm.getUsername(), registerForm.getPassword());
}
return validationResult;
}
@RequestMapping(value = "/game/{id}", method = RequestMethod.GET)
public String showFullGame(ModelMap model,
@CookieValue(value = "cart", required = false) String cartCookie,
@PathVariable(value = "id") int id) {
model.addAttribute("cart", cartService.getCartFromCookie(cartCookie));
model.addAttribute("urlParam1", id);
model.addAttribute("gameDAO", gameDAO);
model.addAttribute("shopService", shopService);
return "site/game-full";
}
@RequestMapping(value = "/game/{id}", method = RequestMethod.POST)
public String addGameToCart(HttpServletResponse response,
@CookieValue(value = "cart",required = false) String cartCookie,
@PathVariable(value = "id") int id) {
cartCookie = cartService.addGameToCartCookie(cartCookie, id);
setCartCookie(response, cartCookie);
return "redirect:/game/"+id;
}
@RequestMapping(value = "/cart", method = RequestMethod.GET)
public String showCartPage(ModelMap model,
HttpServletResponse response,
@CookieValue(value = "cart", required = false) String cartCookie) {
Set<Integer> cart = cartService.getCartFromCookie(cartCookie);
cart = cartService.validateCart(cart);
setCartCookie(response, cartService.getCookieFromCart(cart));
model.addAttribute("cart", cart);
model.addAttribute("gameDAO", gameDAO);
return "site/cart";
}
private void setCartCookie(HttpServletResponse response, String cookieFromCart) {
Cookie cookie = new Cookie("cart", cookieFromCart);
cookie.setMaxAge(3024000);
cookie.setPath("/");
response.addCookie(cookie);
}
@RequestMapping(value = "/cart", method = RequestMethod.POST)
public String deleteFromCart(HttpServletResponse response,
@CookieValue(value = "cart", required = false) String cartCookie,
@RequestParam(name = "game-id") Integer id) {
cartCookie = cartService.removeGameFromCartCookie(cartCookie, id);
setCartCookie(response, cartCookie);
return "redirect:/cart";
}
@RequestMapping(value = "/buy", method = RequestMethod.POST)
public String processOrder(
HttpServletResponse response,
@CookieValue(value = "cart", required = false) String cartCookie,
Principal principal
) {
Set<Integer> cartGames = cartService.getCartFromCookie(cartCookie);
Customer customer = userService.findByUsername(principal.getName());
Order order = shopService.createOrder(cartGames, customer);
shopService.processOrder(order);
setCartCookie(response, "");
return "site/buy-success";
}
@Autowired
public void setRegisterFormValidator(RegisterFormValidator registerFormValidator) {
this.registerFormValidator = registerFormValidator;
}
@Autowired
public void setCartService(CartService cartService) {
this.cartService = cartService;
}
@Autowired
public void setOrderDAO(OrderDAO orderDAO) {
this.orderDAO = orderDAO;
}
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@Autowired
public void setSecurityService(SecurityService securityService) {
this.securityService = securityService;
}
@Autowired
public void setShopService(ShopService shopService) {
this.shopService = shopService;
}
@Autowired
public void setGameDAO(GameDAO gameDAO) {
this.gameDAO = gameDAO;
}
@Autowired
public void setGenreDAO(GenreDAO genreDAO) {
this.genreDAO = genreDAO;
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\AdminDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Admin;
import java.util.List;
public interface AdminDAO {
void add(Admin admin);
Admin get(int id);
Admin findByUsername(String username);
List<Admin> getAll();
void delete(int id);
void update(Admin updatedAdmin);
int count();
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\CartDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.additional.Cart;
import java.util.List;
public interface CartDAO {
void add(Cart cart);
Cart get(int id);
List<Cart> getAll();
void delete(int id);
void update(Cart updatedCart);
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\CustomerDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Customer;
import ru.discoverivan.gameshop.db.entity.Order;
import ru.discoverivan.gameshop.db.entity.User;
import java.util.List;
public interface CustomerDAO {
void add(Customer customer);
Customer get(int id);
Customer findByEmail(String email);
List<Customer> getAll();
void delete(int id);
void update(Customer updatedCustomer);
int count();
void clear();
Customer findByUsername(String username);
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\GameDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Game;
import java.util.List;
public interface GameDAO {
void add(Game game);
Game get(int id);
List<Game> getAll();
List<Game> getOrderedList(String fieldName, int limit);
List<Game> selectListByField(String fieldName, String fieldValue, int limit);
void delete(int id);
void update(Game updatedGame);
int count();
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\GenreDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Genre;
import ru.discoverivan.gameshop.db.entity.Language;
import java.util.List;
public interface GenreDAO {
void add(Genre genre);
Genre get(int id);
List<Genre> getAll();
void delete(int id);
void update(Genre updatedGenre);
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\LanguageDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Game;
import ru.discoverivan.gameshop.db.entity.Language;
import java.util.List;
public interface LanguageDAO {
void add(Language language);
Language get(int id);
List<Language> getAll();
void delete(int id);
void update(Language updatedLanguage);
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\OrderDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Order;
import java.util.Date;
import java.util.List;
public interface OrderDAO {
void add(Order order);
Order get(int id);
List<Order> getAll();
List<Order> getOrdersInTimeInterval(Date from, Date to);
void delete(int id);
void update(Order updatedOrder);
int count();
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\PlatformDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Language;
import ru.discoverivan.gameshop.db.entity.Platform;
import java.util.List;
public interface PlatformDAO {
void add(Platform platform);
Platform get(int id);
List<Platform> getAll();
void delete(int id);
void update(Platform updatedPlatform);
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\ProductDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.Game;
import ru.discoverivan.gameshop.db.entity.Product;
import java.util.List;
public interface ProductDAO {
void add(Product product);
Product get(int id);
List<Product> getAllProductsByGame(Game game);
List<Product> getAll();
void delete(int id);
void update(Product updatedProduct);
int count();
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\UserDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.User;
import java.util.List;
public interface UserDAO {
void add(User user);
User get(int id);
User findByUsername(String username);
List<User> getAll();
void delete(int id);
void update(User updatedUser);
void clear();
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\H2AdminDAO.java
package ru.discoverivan.gameshop.db.dao;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import ru.discoverivan.gameshop.db.HibernateUtil;
import ru.discoverivan.gameshop.db.entity.Admin;
import ru.discoverivan.gameshop.db.entity.User;
import java.util.List;
@Repository
public class H2AdminDAO implements AdminDAO {
private H2EntityDAO<Admin> entityDAO;
@Autowired
public void setEntityDAO(H2EntityDAO<Admin> entityDAO) {
this.entityDAO = entityDAO;
}
@Override
public void add(Admin admin) {
entityDAO.add(admin);
}
@Override
public Admin get(int id) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Admin where id=:id");
query.setParameter("id", id);
Admin admin= (Admin) query.uniqueResult();
session.getTransaction().commit();
session.close();
return admin;
}
@Override
public Admin findByUsername(String username) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Admin where username=:username");
query.setParameter("username", username);
Admin admin = (Admin) query.uniqueResult();
session.getTransaction().commit();
session.close();
return admin;
}
@Override
public List<Admin> getAll() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
List<Admin> admins = (List<Admin>) session.createQuery("from Admin").list();
session.getTransaction().commit();
session.close();
return admins;
}
@Override
public void delete(int id) {
Session session=HibernateUtil.getSession();
session.beginTransaction();
Query query=session.createQuery("from Admin where id=:id");
query.setParameter("id",id);
Admin admin= (Admin) query.uniqueResult();
session.delete(admin);
session.getTransaction().commit();
session.close();
}
@Override
public void update(Admin updatedAdmin) {
entityDAO.update(updatedAdmin);
}
@Override
public int count() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Long count = (Long) session.createQuery("select count(*) from Admin ").uniqueResult();
session.getTransaction().commit();
session.close();
return count.intValue();
}
@Override
public void clear() {
Session session=HibernateUtil.getSession();
session.beginTransaction();
session.createQuery("delete from Admin ").executeUpdate();
session.getTransaction().commit();
session.close();
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\H2CartDAO.java
package ru.discoverivan.gameshop.db.dao;
import ru.discoverivan.gameshop.db.entity.additional.Cart;
import ru.discoverivan.gameshop.db.entity.Language;
import java.util.List;
public class H2CartDAO implements CartDAO {
H2EntityDAO<Language> entityDAO;
@Override
public void add(Cart cart) {
}
@Override
public Cart get(int id) {
return null;
}
@Override
public List<Cart> getAll() {
return null;
}
@Override
public void delete(int id) {
}
@Override
public void update(Cart updatedCart) {
}
@Override
public void clear() {
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\H2CustomerDAO.java
package ru.discoverivan.gameshop.db.dao;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import ru.discoverivan.gameshop.db.HibernateUtil;
import ru.discoverivan.gameshop.db.entity.Customer;
import ru.discoverivan.gameshop.db.entity.User;
import java.util.List;
@Repository
public class H2CustomerDAO implements CustomerDAO {
private H2EntityDAO<Customer> entityDAO;
@Autowired
public void setEntityDAO(H2EntityDAO<Customer> entityDAO) {
this.entityDAO = entityDAO;
}
@Override
public void add(Customer customer) {
entityDAO.add(customer);
}
@Override
public Customer get(int id) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Customer where id=:id");
query.setParameter("id", id);
Customer customer= (Customer) query.uniqueResult();
session.getTransaction().commit();
session.close();
return customer;
}
@Override
public Customer findByEmail(String email) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Customer where email=:email");
query.setParameter("email", email);
Customer customer= (Customer) query.uniqueResult();
session.getTransaction().commit();
session.close();
return customer;
}
@Override
public List<Customer> getAll() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
List<Customer> customers = (List<Customer>) session.createQuery("from Customer").list();
session.getTransaction().commit();
session.close();
return customers;
}
@Override
public void delete(int id) {
Session session=HibernateUtil.getSession();
session.beginTransaction();
Query query=session.createQuery("from Customer where id=:id");
query.setParameter("id",id);
Customer customer= (Customer) query.uniqueResult();
session.delete(customer);
session.getTransaction().commit();
session.close();
}
@Override
public void update(Customer updatedCustomer) {
entityDAO.update(updatedCustomer);
}
@Override
public int count() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Long count = (Long) session.createQuery("select count(*) from Customer ").uniqueResult();
session.getTransaction().commit();
session.close();
return count.intValue();
}
@Override
public void clear() {
Session session=HibernateUtil.getSession();
session.beginTransaction();
session.createQuery("delete from Customer").executeUpdate();
session.getTransaction().commit();
session.close();
}
@Override
public Customer findByUsername(String username) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Customer where username=:username");
query.setParameter("username", username);
Customer customer= (Customer) query.uniqueResult();
session.getTransaction().commit();
session.close();
return customer;
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\H2EntityDAO.java
package ru.discoverivan.gameshop.db.dao;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;
import ru.discoverivan.gameshop.db.HibernateUtil;
import ru.discoverivan.gameshop.db.entity.Game;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
@Repository
public class H2EntityDAO<T> {
public void add(T entity) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
session.save(entity);
session.getTransaction().commit();
session.close();
}
public void update(T entity){
Session session=HibernateUtil.getSession();
session.beginTransaction();
session.update(entity);
session.getTransaction().commit();
session.close();
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\H2GameDAO.java
package ru.discoverivan.gameshop.db.dao;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import ru.discoverivan.gameshop.db.HibernateUtil;
import ru.discoverivan.gameshop.db.entity.Game;
import ru.discoverivan.gameshop.db.entity.Genre;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.List;
@Repository
public class H2GameDAO implements GameDAO {
private H2EntityDAO<Game> entityDAO;
@Override
public String toString() {
return "entitydao class: " + entityDAO.getClass().getName();
}
@Override
public void add(Game game) {
entityDAO.add(game);
}
@Override
public Game get(int id) {
Session session= HibernateUtil.getSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Game> criteria = builder.createQuery(Game.class);
Root<Game> root = criteria.from(Game.class);
criteria.select(root);
criteria.where(builder.equal( root.get("id") ,id));
Game game = session.createQuery(criteria).uniqueResult();
session.close();
return game;
}
@Autowired
public void setEntityDAO(H2EntityDAO<Game> entityDAO) {
this.entityDAO = entityDAO;
}
@Override
public List<Game> getAll() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
List<Game> games = (List<Game>) session.createQuery("from Game").list();
session.getTransaction().commit();
session.close();
return games;
}
@Override
public List<Game> getOrderedList(String fieldName, int limit) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery(String.format("from Game order by %s desc", fieldName));
query.setMaxResults(limit);
List<Game> games = (List<Game>) query.list();
session.getTransaction().commit();
session.close();
return games;
}
@Override
public List<Game> selectListByField(String fieldName, String fieldValue, int limit) {
return null;
}
public List<Game> selectListByGenre(Genre genre, int limit){
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Game game where :genre member of game.genres");
query.setMaxResults(limit);
query.setParameter("genre", genre);
List<Game> games = (List<Game>) query.list();
session.getTransaction().commit();
session.close();
return games;
}
@Override
public void delete(int id) {
Session session=HibernateUtil.getSession();
session.beginTransaction();
Query query=session.createQuery("from Game where id=:id");
query.setParameter("id",id);
Game game= (Game) query.uniqueResult();
session.delete(game);
session.getTransaction().commit();
session.close();
}
@Override
public void update(Game updatedGame) {
entityDAO.update(updatedGame);
}
@Override
public int count() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Long count = (Long) session.createQuery("select count(*) from Game").uniqueResult();
session.getTransaction().commit();
session.close();
return count.intValue();
}
@Override
public void clear() {
List<Game> games = getAll();
for (Game game : games) {
delete(game.getId());
}
}
}
Файл: gameshop\src\main\java\ru\discoverivan\gameshop\db\dao\H2GenreDAO.java
package ru.discoverivan.gameshop.db.dao;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import ru.discoverivan.gameshop.db.HibernateUtil;
import ru.discoverivan.gameshop.db.entity.Game;
import ru.discoverivan.gameshop.db.entity.Genre;
import ru.discoverivan.gameshop.db.entity.Language;
import java.util.List;
@Repository
public class H2GenreDAO implements GenreDAO {
private H2EntityDAO<Genre> entityDAO;
@Autowired
public void setEntityDAO(H2EntityDAO<Genre> entityDAO) {
this.entityDAO = entityDAO;
}
@Override
public void add(Genre genre) {
entityDAO.add(genre);
}
@Override
public Genre get(int id) {
Session session= HibernateUtil.getSession();
session.beginTransaction();
Query query = session.createQuery("from Genre where id=:id");
query.setParameter("id", id);
Genre genre= (Genre) query.uniqueResult();
session.getTransaction().commit();
session.close();
return genre;
}
@Override
public List<Genre> getAll() {
Session session= HibernateUtil.getSession();
session.beginTransaction();
List<Genre> genres = (List<Genre>) session.createQuery("from Genre").list();
session.getTransaction().commit();
session.close();
return genres;
}
@Override
public void delete(in...
Подобные документы
Интернет-магазин – программное обеспечение для удобства покупок и продаж с веб-сайта. Характеристика существующих средств проектирования и разработки информационных систем. Описание особенностей интерфейса разрабатываемого программного приложения.
курсовая работа [703,3 K], добавлен 07.05.2019Проектирование базы данных для автоматизации деятельности по учету автотранспорта ГИБДД Вяземского района. Выбор инструментария для разработки базы данных и приложения по её ведению. Описание интерфейса и физической структуры приложения баз данных.
курсовая работа [2,2 M], добавлен 28.06.2011Изучение предметной области и выявление основных задач Интернет-магазинов. Выбор средств разработки системы, базы данных, инфологической и даталогической моделей. Разработка программного приложения, программных модулей, представленных экранными формами.
дипломная работа [4,2 M], добавлен 22.04.2015Процесс разработки базы данных для хранения и обработки информации. Ключи, индексы, триггеры, хранимые процедуры. Разработка пользовательского интерфейса и базы данных. Основные инструментальные средства для разработки клиентской и серверной частей.
дипломная работа [225,0 K], добавлен 18.05.2013Обзор мобильной ОС Android. Выбор инструментов и технологий. Проектирование прототипа графического интерфейса. Характеристика и описание пользовательского интерфейса. Проектирование и разработка базы данных. Определение списка необходимых разрешений.
курсовая работа [376,6 K], добавлен 13.09.2017Постановка задач и требований к проектируемому интернет-приложению. Обоснование выбора системы управления базы данных и языков программирования. Разработка архитектуры заданного интернет-приложения, технико-экономическое обоснование его эффективности.
дипломная работа [461,3 K], добавлен 24.02.2013Моделирование бизнес-процессов AS-IS и TO-BE. Построение логической и физической модели данных. Взаимодействие объектов и экранные формы к прецедентам. Диаграммы классов пользовательского интерфейса и компонентов клиентской и серверной части приложения.
курсовая работа [1,5 M], добавлен 19.12.2015Реализация приложения "Книжный магазин" средствами систем управления базами данных. Проектирование структуры базы данных, определение сущности и атрибутов. Логическое проектирование базы данных и реализация базы данных в СУБД Microsoft Office Access.
курсовая работа [7,8 M], добавлен 13.02.2023Проектирование информационной модели данных, серверной и клиентской частей приложения. Обеспечение коллективного доступа. Составление оптимального набора тестов. Разработка инструкций по сопровождению и эксплуатации клиент–серверного приложения.
дипломная работа [2,7 M], добавлен 07.07.2012Разработка сетевой карточной игры "King" для операционной системы Windows XP. Реализация приложения с помощью интерфейса прикладного программирования Win32 API. Назначение серверной и клиентской части. Анализ исходных данных, тестирование приложения.
курсовая работа [209,3 K], добавлен 24.01.2016- Создание защищенного приложения для ведения учета продаж и закупок, ориентированного на малый бизнес
Проектирование модели базы данных в соответствии с предметной областью "Торговля". Разработка архитектуры системы безопасности приложения по ведению базы данных. Реализация приложения, обеспечивающего учет продаж и закупок предприятия. Способы его защиты.
дипломная работа [2,5 M], добавлен 05.02.2017 Формирование входных и выходных данных, SQL–скрипт генерации таблиц базы данных. Создание интерфейса программного приложения и проектирование форм базы данных. Требования к аппаратно–программному обеспечению. Инструкции по установке и эксплуатации.
курсовая работа [1,6 M], добавлен 08.02.2013Разработка приложения, которое содержит информацию о гостях, о номерах, об оплате с целью автоматизации процесса регистрации в гостинице. Проектирование базы данных по технологии "Клиент-сервер". Специфика разработки пользовательского интерфейса.
курсовая работа [1,5 M], добавлен 29.12.2013Анализ создания удобного инструмента, максимально упрощающего процесс осуществления заказа клиентом ювелирных изделий. Изучение принципов построения web-сайта, структуры базы данных, проектирования архитектуры приложения и пользовательского интерфейса.
дипломная работа [7,0 M], добавлен 11.02.2012Разработка приложения для проверки использования времен глаголов в английском языке. Создание базы данных. Анализ используемых средств для реализации автоматического разбора текста. Проектирование мобильного приложения с помощью диаграмм деятельности.
дипломная работа [2,6 M], добавлен 13.09.2017Среды передачи данных, топологии локальных сетей. Сравнение средств разработки Microsoft, выбор системы управления базами данных. Описание серверной и клиентской части приложения. Внедрение системы оперативного документооборота на данное предприятие.
дипломная работа [3,5 M], добавлен 12.01.2012Описание особенностей функционирования магазина. Проектирование системы: инфологическое моделирование и построение диаграммы потоков данных. Моделирование и программная реализация информационной системы. Проектирование пользовательского интерфейса.
курсовая работа [1,6 M], добавлен 18.02.2013Проектирование удобного приложения для комфортной навигации по файлам облачного хранилища в одном файловом менеджере. Выбор интегрированной среды разработки. Выбор инструментов для визуализации приложения. Выбор средств отслеживания HTTPзапросов.
курсовая работа [3,6 M], добавлен 16.07.2016Принципы построения Интернет-магазинов. Система Интернет-платежей. Структура электронного магазина, разработка его архитектуры, операционной, серверной, администраторской и клиентской частей. Алгоритма работы магазина. Экономическое обоснование проекта.
дипломная работа [2,4 M], добавлен 12.04.2012Обзор подходов к разработке музейных приложений с элементами дополненной реальности, формирование требований к ним. Выбор методов разработки приложения, разработка пользовательского интерфейса. Принципы тестирования. Реализация раздела "Распознавание".
дипломная работа [2,8 M], добавлен 03.07.2017