diff --git a/.gitignore b/.gitignore index c2065bc..476feae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ HELP.md .gradle build/ +database/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ diff --git a/build.gradle b/build.gradle index 2211a07..bb83a2e 100644 --- a/build.gradle +++ b/build.gradle @@ -27,8 +27,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' - + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + + implementation 'org.hibernate.orm:hibernate-community-dialects' + implementation 'org.xerial:sqlite-jdbc:3.46.1.3' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/ru/lionarius/isdojplab/controller/CartController.java b/src/main/java/ru/lionarius/isdojplab/controller/CartController.java new file mode 100644 index 0000000..de55654 --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/controller/CartController.java @@ -0,0 +1,17 @@ +package ru.lionarius.isdojplab.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import ru.lionarius.isdojplab.model.Cart; + +@Controller +@RequestMapping("/cart") +public class CartController { + + @GetMapping + public String showCart(Model model) { + return "cart"; + } +} diff --git a/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java b/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java index 425d656..e6860d7 100644 --- a/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java +++ b/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java @@ -1,24 +1,25 @@ package ru.lionarius.isdojplab.controller; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import ru.lionarius.isdojplab.model.Product; +import ru.lionarius.isdojplab.repository.ProductRepository; -import java.util.ArrayList; import java.util.List; @Controller public class HomeController { + + @Autowired + private ProductRepository productRepository; @GetMapping("/") public String home(Model model) { model.addAttribute("message", "Добро пожаловать в магазин электротоваров!"); - List products = new ArrayList<>(); - products.add(new Product("Электрический чайник", 900.0, "Высококачественный чайник с быстрой функцией закипания", "https://example.com/electro1.jpg")); - products.add(new Product("Утюг с парогенератором", 1000.0, "Мощный утюг с автоматической подачей пара", "https://example.com/electro2.jpg")); - products.add(new Product("Мультиварка", 400.0, "Универсальная мультиварка с множеством режимов приготовления", "https://example.com/electro3.jpg")); + List products = productRepository.findAll(); model.addAttribute("products", products); diff --git a/src/main/java/ru/lionarius/isdojplab/controller/RegisterFormController.java b/src/main/java/ru/lionarius/isdojplab/controller/RegisterFormController.java index 46ce511..7f55c5f 100644 --- a/src/main/java/ru/lionarius/isdojplab/controller/RegisterFormController.java +++ b/src/main/java/ru/lionarius/isdojplab/controller/RegisterFormController.java @@ -1,6 +1,7 @@ package ru.lionarius.isdojplab.controller; import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; @@ -8,9 +9,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import ru.lionarius.isdojplab.model.User; +import ru.lionarius.isdojplab.repository.UserRepository; @Controller public class RegisterFormController { + + @Autowired + private UserRepository userRepository; @GetMapping("/register") public String showForm(Model model) { @@ -25,6 +30,18 @@ public class RegisterFormController { return "register_form"; } + if (userRepository.findByEmail(user.getEmail()).isPresent()) { + bindingResult.rejectValue("email", "email.already.exists", "Электронная почта уже зарегистрирована"); + return "register_form"; + } + + if (userRepository.findByName(user.getName()).isPresent()) { + bindingResult.rejectValue("name", "name.already.exists", "Имя уже зарегистрировано"); + return "register_form"; + } + + userRepository.save(user); + model.addAttribute("message", "Пользователь успешно зарегистрирован"); return "register_form"; diff --git a/src/main/java/ru/lionarius/isdojplab/model/Cart.java b/src/main/java/ru/lionarius/isdojplab/model/Cart.java new file mode 100644 index 0000000..95f1193 --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/model/Cart.java @@ -0,0 +1,24 @@ +package ru.lionarius.isdojplab.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +public class Cart { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToMany(cascade = CascadeType.ALL) + private List items; + + private Double totalPrice; +} diff --git a/src/main/java/ru/lionarius/isdojplab/model/CartItem.java b/src/main/java/ru/lionarius/isdojplab/model/CartItem.java new file mode 100644 index 0000000..4b3c8cb --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/model/CartItem.java @@ -0,0 +1,21 @@ +package ru.lionarius.isdojplab.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +public class CartItem { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + private Product product; + + private int quantity; +} diff --git a/src/main/java/ru/lionarius/isdojplab/model/CartOrder.java b/src/main/java/ru/lionarius/isdojplab/model/CartOrder.java new file mode 100644 index 0000000..192824d --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/model/CartOrder.java @@ -0,0 +1,31 @@ +package ru.lionarius.isdojplab.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +public class CartOrder { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String customerName; + private String phoneNumber; + private String address; + private String email; + + @OneToMany(cascade = CascadeType.ALL) + private List items; + + private BigDecimal totalPrice; + private String paymentMethod; +} diff --git a/src/main/java/ru/lionarius/isdojplab/model/Product.java b/src/main/java/ru/lionarius/isdojplab/model/Product.java index 8c56076..9493666 100644 --- a/src/main/java/ru/lionarius/isdojplab/model/Product.java +++ b/src/main/java/ru/lionarius/isdojplab/model/Product.java @@ -1,16 +1,19 @@ package ru.lionarius.isdojplab.model; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; - -import java.util.List; +import lombok.NoArgsConstructor; @Data @AllArgsConstructor +@NoArgsConstructor +@Entity public class Product { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; private Double price; private String description; diff --git a/src/main/java/ru/lionarius/isdojplab/model/User.java b/src/main/java/ru/lionarius/isdojplab/model/User.java index 987a025..83d72c6 100644 --- a/src/main/java/ru/lionarius/isdojplab/model/User.java +++ b/src/main/java/ru/lionarius/isdojplab/model/User.java @@ -1,17 +1,28 @@ package ru.lionarius.isdojplab.model; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import lombok.Data; @Data +@Entity public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @NotBlank(message = "Поле не может быть пустым") - private String name; + private String name; + @NotBlank(message = "Поле не может быть пустым") @Email(message = "Неверный формат электронной почты") private String email; + @NotBlank(message = "Поле не может быть пустым") @Size(min = 6, message = "Пароль должен состоять не менее 6 символов") private String password; diff --git a/src/main/java/ru/lionarius/isdojplab/repository/ProductRepository.java b/src/main/java/ru/lionarius/isdojplab/repository/ProductRepository.java new file mode 100644 index 0000000..941aff5 --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/repository/ProductRepository.java @@ -0,0 +1,9 @@ +package ru.lionarius.isdojplab.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.lionarius.isdojplab.model.Product; + +@Repository +public interface ProductRepository extends JpaRepository { +} diff --git a/src/main/java/ru/lionarius/isdojplab/repository/UserRepository.java b/src/main/java/ru/lionarius/isdojplab/repository/UserRepository.java new file mode 100644 index 0000000..cbdae08 --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/repository/UserRepository.java @@ -0,0 +1,14 @@ +package ru.lionarius.isdojplab.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import ru.lionarius.isdojplab.model.User; + +import java.util.Optional; + +@Repository +public interface UserRepository extends JpaRepository { + + Optional findByEmail(String email); + Optional findByName(String name); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 87c09de..8edda93 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,7 @@ spring.application.name=isdojp-lab +spring.datasource.driver-class-name=org.sqlite.JDBC +spring.datasource.url=jdbc:sqlite:./database/data.db +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true \ No newline at end of file diff --git a/src/main/resources/templates/cart.html b/src/main/resources/templates/cart.html new file mode 100644 index 0000000..6179745 --- /dev/null +++ b/src/main/resources/templates/cart.html @@ -0,0 +1,97 @@ + + + + + + Корзина и Оформление заказа - Магазин электротоваров + + + + +
+

Магазин электротоваров

+

Все для вашего дома и офиса

+
+ +
+ + +

Ваша корзина

+
+
+

Ваша корзина пуста.

+
+ + + + + + + + + + + + + + + + + + + + +
ТоварКоличествоЦенаОбщая стоимостьУдалить
+ + + +
+ +
+

Итого к оплате:

+ +
+
+ + +

Оформление заказа

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ +
+

© 2024 Магазин электротоваров. Все права защищены.

+
+ + + diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index ff314f0..4120a3a 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -30,7 +30,7 @@ - +