diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98f3619 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +.idea/* +target/* diff --git a/README.md b/README.md new file mode 100644 index 0000000..3f795a7 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# car-repair-site +Learning purposes + +![Task](https://github.com/Prominence/car-repair-site/blob/master/java-task-1.1.jpg) + +![Task](https://github.com/Prominence/car-repair-site/blob/master/java-task-1.2.jpg) diff --git a/java-task-1.1.jpg b/java-task-1.1.jpg new file mode 100644 index 0000000..aac4fda Binary files /dev/null and b/java-task-1.1.jpg differ diff --git a/java-task-1.2.jpg b/java-task-1.2.jpg new file mode 100644 index 0000000..2e3f356 Binary files /dev/null and b/java-task-1.2.jpg differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..225d154 --- /dev/null +++ b/pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.2.RELEASE + + + com.github.prominence + car-repair + 0.0.1-SNAPSHOT + car-repair + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + nz.net.ultraq.thymeleaf + thymeleaf-layout-dialect + 2.3.0 + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + true + + + org.liquibase + liquibase-core + + + org.liquibase + liquibase-maven-plugin + 3.5.3 + + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.webjars + bootstrap + 3.4.0 + + + org.webjars + jquery + 3.3.1 + + + + + + + org.liquibase + liquibase-maven-plugin + 3.5.3 + + src/main/resources/liquibase.properties + + + + org.liquibase.ext + liquibase-hibernate5 + 3.6 + + + org.springframework + spring-beans + 4.1.7.RELEASE + + + org.springframework.data + spring-data-jpa + 1.7.3.RELEASE + + + org.springframework + spring-jdbc + 2.0.6 + + + javax.xml.bind + jaxb-api + 2.3.1 + + + org.yaml + snakeyaml + 1.19 + + + javax.validation + validation-api + 2.0.0.Final + + + + + + + diff --git a/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java b/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java new file mode 100644 index 0000000..f0394bf --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java @@ -0,0 +1,17 @@ +package com.github.prominence.carrepair; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@EnableJpaRepositories("com.github.prominence.carrepair.repository") +@EntityScan("com.github.prominence.carrepair.model") +@SpringBootApplication +public class CarRepairApplication { + + public static void main(String[] args) { + SpringApplication.run(CarRepairApplication.class, args); + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/carrepair/conf/ApplicationConfiguration.java b/src/main/java/com/github/prominence/carrepair/conf/ApplicationConfiguration.java new file mode 100644 index 0000000..8f1e90c --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/conf/ApplicationConfiguration.java @@ -0,0 +1,14 @@ +package com.github.prominence.carrepair.conf; + +import nz.net.ultraq.thymeleaf.LayoutDialect; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ApplicationConfiguration { + + @Bean + public LayoutDialect layoutDialect() { + return new LayoutDialect(); + } +} diff --git a/src/main/java/com/github/prominence/carrepair/controller/ClientController.java b/src/main/java/com/github/prominence/carrepair/controller/ClientController.java new file mode 100644 index 0000000..34c5489 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/controller/ClientController.java @@ -0,0 +1,16 @@ +package com.github.prominence.carrepair.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/client") +public class ClientController { + + @RequestMapping + public String index(Model model) { + + return "client/index"; + } +} diff --git a/src/main/java/com/github/prominence/carrepair/controller/HomeController.java b/src/main/java/com/github/prominence/carrepair/controller/HomeController.java new file mode 100644 index 0000000..37dc92b --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/controller/HomeController.java @@ -0,0 +1,14 @@ +package com.github.prominence.carrepair.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/") +public class HomeController { + + @RequestMapping + public String index() { + return "home"; + } +} diff --git a/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java b/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java new file mode 100644 index 0000000..5818eef --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java @@ -0,0 +1,23 @@ +package com.github.prominence.carrepair.controller.advice; + +import com.github.prominence.carrepair.service.CarRepairService; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ModelAttribute; + +@ControllerAdvice +public class GlobalInfoAdvice { + + private final CarRepairService carRepairService; + + public GlobalInfoAdvice(CarRepairService carRepairService) { + this.carRepairService = carRepairService; + } + + @ModelAttribute("globalInfo") + public void addBadgeInfo(Model model) { + model.addAttribute("clientsCount", carRepairService.getClientCount()); + model.addAttribute("mechanicsCount", carRepairService.getMechanicCount()); + model.addAttribute("ordersCount", carRepairService.getOrderCount()); + } +} diff --git a/src/main/java/com/github/prominence/carrepair/enums/OrderStatus.java b/src/main/java/com/github/prominence/carrepair/enums/OrderStatus.java new file mode 100644 index 0000000..55f8bbe --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/enums/OrderStatus.java @@ -0,0 +1,7 @@ +package com.github.prominence.carrepair.enums; + +public enum OrderStatus { + SCHEDULED, + DONE, + ACCEPTED +} \ No newline at end of file diff --git a/src/main/java/com/github/prominence/carrepair/model/Client.java b/src/main/java/com/github/prominence/carrepair/model/Client.java new file mode 100644 index 0000000..b146499 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/model/Client.java @@ -0,0 +1,29 @@ +package com.github.prominence.carrepair.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "client") +public class Client extends Person { + + @Column(name = "phoneNo") + private String phoneNo; + + public Client(String firstName, String middleName, String lastName, String phoneNo) { + super(firstName, middleName, lastName); + this.phoneNo = phoneNo; + } + + public Client() { + } + + public String getPhoneNo() { + return phoneNo; + } + + public void setPhoneNo(String phoneNo) { + this.phoneNo = phoneNo; + } +} diff --git a/src/main/java/com/github/prominence/carrepair/model/Mechanic.java b/src/main/java/com/github/prominence/carrepair/model/Mechanic.java new file mode 100644 index 0000000..531fd44 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/model/Mechanic.java @@ -0,0 +1,32 @@ +package com.github.prominence.carrepair.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Entity +@Table(name = "mechanic") +public class Mechanic extends Person { + + @NotNull + @Column(name = "hourlyPayment") + private BigDecimal hourlyPayment; + + public Mechanic(String firstName, String middleName, String lastName, BigDecimal hourlyPayment) { + super(firstName, middleName, lastName); + this.hourlyPayment = hourlyPayment; + } + + public Mechanic() { + } + + public BigDecimal getHourlyPayment() { + return hourlyPayment; + } + + public void setHourlyPayment(BigDecimal hourlyPayment) { + this.hourlyPayment = hourlyPayment; + } +} diff --git a/src/main/java/com/github/prominence/carrepair/model/Order.java b/src/main/java/com/github/prominence/carrepair/model/Order.java new file mode 100644 index 0000000..d5d5312 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/model/Order.java @@ -0,0 +1,119 @@ +package com.github.prominence.carrepair.model; + +import com.github.prominence.carrepair.enums.OrderStatus; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Table(name = "orders") +public class Order { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @NotNull + private String description; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "client_id", nullable = false) + private Client client; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "mechanic_id", nullable = false) + private Mechanic mechanic; + + @NotNull + @Column(name = "createdOn") + private LocalDateTime createdOn; + + @Column(name = "finishedOn") + private LocalDateTime finishedOn; + + @Column(name = "totalPrice") + private BigDecimal totalPrice; + + @NotNull + @Column(name = "orderStatus") + private String orderStatus = OrderStatus.SCHEDULED.toString(); + + public Order(String description, Client client, Mechanic mechanic, LocalDateTime createdOn, LocalDateTime finishedOn, BigDecimal totalPrice, String orderStatus) { + this.description = description; + this.client = client; + this.mechanic = mechanic; + this.createdOn = createdOn; + this.finishedOn = finishedOn; + this.totalPrice = totalPrice; + this.orderStatus = orderStatus; + } + + public Order() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Client getClient() { + return client; + } + + public void setClient(Client client) { + this.client = client; + } + + public Mechanic getMechanic() { + return mechanic; + } + + public void setMechanic(Mechanic mechanic) { + this.mechanic = mechanic; + } + + public LocalDateTime getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(LocalDateTime createdOn) { + this.createdOn = createdOn; + } + + public LocalDateTime getFinishedOn() { + return finishedOn; + } + + public void setFinishedOn(LocalDateTime finishedOn) { + this.finishedOn = finishedOn; + } + + public BigDecimal getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(BigDecimal totalPrice) { + this.totalPrice = totalPrice; + } + + public OrderStatus getOrderStatus() { + return OrderStatus.valueOf(orderStatus); + } + + public void setOrderStatus(OrderStatus orderStatus) { + this.orderStatus = orderStatus.toString(); + } +} diff --git a/src/main/java/com/github/prominence/carrepair/model/Person.java b/src/main/java/com/github/prominence/carrepair/model/Person.java new file mode 100644 index 0000000..28924d3 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/model/Person.java @@ -0,0 +1,64 @@ +package com.github.prominence.carrepair.model; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@MappedSuperclass +abstract public class Person { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @NotNull + @Column(name = "firstName") + private String firstName; + + @Column(name = "middleName") + private String middleName; + + @NotNull + @Column(name = "lastName") + private String lastName; + + public Person(String firstName, String middleName, String lastName) { + this.firstName = firstName; + this.middleName = middleName; + this.lastName = lastName; + } + + public Person() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java b/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java new file mode 100644 index 0000000..fc48478 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java @@ -0,0 +1,10 @@ +package com.github.prominence.carrepair.repository; + +import com.github.prominence.carrepair.model.Client; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ClientRepository extends JpaRepository { + +} diff --git a/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java b/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java new file mode 100644 index 0000000..0d6b0dd --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java @@ -0,0 +1,9 @@ +package com.github.prominence.carrepair.repository; + +import com.github.prominence.carrepair.model.Mechanic; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MechanicRepository extends JpaRepository { +} diff --git a/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java b/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java new file mode 100644 index 0000000..e56d1a6 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java @@ -0,0 +1,9 @@ +package com.github.prominence.carrepair.repository; + +import com.github.prominence.carrepair.model.Order; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderRepository extends JpaRepository { +} diff --git a/src/main/java/com/github/prominence/carrepair/service/CarRepairService.java b/src/main/java/com/github/prominence/carrepair/service/CarRepairService.java new file mode 100644 index 0000000..c0b8cc7 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/service/CarRepairService.java @@ -0,0 +1,34 @@ +package com.github.prominence.carrepair.service; + +import com.github.prominence.carrepair.repository.ClientRepository; +import com.github.prominence.carrepair.repository.MechanicRepository; +import com.github.prominence.carrepair.repository.OrderRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class CarRepairService { + + private ClientRepository clientRepository; + private MechanicRepository mechanicRepository; + private OrderRepository orderRepository; + + @Autowired + public CarRepairService(ClientRepository clientRepository, MechanicRepository mechanicRepository, OrderRepository orderRepository) { + this.clientRepository = clientRepository; + this.mechanicRepository = mechanicRepository; + this.orderRepository = orderRepository; + } + + public long getClientCount() { + return clientRepository.count(); + } + + public long getMechanicCount() { + return mechanicRepository.count(); + } + + public long getOrderCount() { + return orderRepository.count(); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..151c6c9 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,29 @@ +# =============================== +# DATABASE +# =============================== + +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/car_repair +spring.datasource.username=carrepair +spring.datasource.password=carrepair + +# =============================== +# JPA / HIBERNATE +# =============================== + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +#spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false +#spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl +#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.jpa.open-in-view=false + + +# liquibase +spring.liquibase.change-log=classpath:db/changelog/changelog-master.xml + +# thymeleaf +spring.thymeleaf.cache = false \ No newline at end of file diff --git a/src/main/resources/db/changelog/changelog-master.xml b/src/main/resources/db/changelog/changelog-master.xml new file mode 100644 index 0000000..3af3341 --- /dev/null +++ b/src/main/resources/db/changelog/changelog-master.xml @@ -0,0 +1,9 @@ + + + + diff --git a/src/main/resources/db/changelog/v1/changelog-initial.xml b/src/main/resources/db/changelog/v1/changelog-initial.xml new file mode 100644 index 0000000..6008a8e --- /dev/null +++ b/src/main/resources/db/changelog/v1/changelog-initial.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/v1/changelog-v.1.0-cumulative.xml b/src/main/resources/db/changelog/v1/changelog-v.1.0-cumulative.xml new file mode 100644 index 0000000..846249b --- /dev/null +++ b/src/main/resources/db/changelog/v1/changelog-v.1.0-cumulative.xml @@ -0,0 +1,9 @@ + + + + diff --git a/src/main/resources/liquibase.properties b/src/main/resources/liquibase.properties new file mode 100644 index 0000000..05318df --- /dev/null +++ b/src/main/resources/liquibase.properties @@ -0,0 +1,11 @@ +driver=com.mysql.cj.jdbc.Driver +url=jdbc:mysql://localhost:3306/car_repair +username=carrepair +password=carrepair +#referenceDriver=liquibase.ext.hibernate.database.connection.HibernateDriver +#referenceUrl=hibernate:spring:com.github.prominence.carrepair.model?dialect=org.hibernate.dialect.MySQL5Dialect +changeLogFile=src/main/resources/db/changelog/changelog-master.xml +#diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml + +# output of 'generateChangeLog' +#outputChangeLogFile=src/main/resources/db/changelog/v1/changelog-initial.xml \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties new file mode 100644 index 0000000..571338a --- /dev/null +++ b/src/main/resources/messages.properties @@ -0,0 +1,9 @@ +default.title = Car Repair Service + +badge.clients = Clients +badge.mechanics = Mechanics +badge.orders = Orders + +home.requirements.label = Requirements + +client.title = Clients \ No newline at end of file diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties new file mode 100644 index 0000000..571338a --- /dev/null +++ b/src/main/resources/messages_en.properties @@ -0,0 +1,9 @@ +default.title = Car Repair Service + +badge.clients = Clients +badge.mechanics = Mechanics +badge.orders = Orders + +home.requirements.label = Requirements + +client.title = Clients \ No newline at end of file diff --git a/src/main/resources/messages_ru.properties b/src/main/resources/messages_ru.properties new file mode 100644 index 0000000..2c12986 --- /dev/null +++ b/src/main/resources/messages_ru.properties @@ -0,0 +1,9 @@ +default.title = Автосервис + +badge.clients = Клиенты +badge.mechanics = Механики +badge.orders = Заказы + +home.requirements.label = Требования + +client.title = Клиенты \ No newline at end of file diff --git a/src/main/resources/static/css/main.css b/src/main/resources/static/css/main.css new file mode 100644 index 0000000..47e1dc8 --- /dev/null +++ b/src/main/resources/static/css/main.css @@ -0,0 +1,2 @@ +body { +} \ No newline at end of file diff --git a/src/main/resources/static/images/java-task-1.1.jpg b/src/main/resources/static/images/java-task-1.1.jpg new file mode 100644 index 0000000..aac4fda Binary files /dev/null and b/src/main/resources/static/images/java-task-1.1.jpg differ diff --git a/src/main/resources/static/images/java-task-1.2.jpg b/src/main/resources/static/images/java-task-1.2.jpg new file mode 100644 index 0000000..2e3f356 Binary files /dev/null and b/src/main/resources/static/images/java-task-1.2.jpg differ diff --git a/src/main/resources/templates/client/index.html b/src/main/resources/templates/client/index.html new file mode 100644 index 0000000..f6deaf3 --- /dev/null +++ b/src/main/resources/templates/client/index.html @@ -0,0 +1,14 @@ + + + + + + +
+

+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..c7bfc3c --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,18 @@ + + + + + + +
+

Car Repair test project

+

+ : +

+ Requirements + Requirements +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html new file mode 100644 index 0000000..bf6257d --- /dev/null +++ b/src/main/resources/templates/main.html @@ -0,0 +1,58 @@ + + + + + + + " + + + + + + + + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + © 2019 , Alexey Zinchenko +
+
+
+
+
+ +
+ +
+ + + \ No newline at end of file diff --git a/src/test/java/com/github/prominence/carrepair/CarRepairApplicationTests.java b/src/test/java/com/github/prominence/carrepair/CarRepairApplicationTests.java new file mode 100644 index 0000000..5ed0951 --- /dev/null +++ b/src/test/java/com/github/prominence/carrepair/CarRepairApplicationTests.java @@ -0,0 +1,17 @@ +package com.github.prominence.carrepair; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class CarRepairApplicationTests { + + @Test + public void contextLoads() { + } + +} +