Changeset a436340
- Timestamp:
- 02/05/23 19:55:10 (22 months ago)
- Branches:
- master
- Children:
- 2b0a4db
- Parents:
- cc52b09
- Location:
- src/main
- Files:
-
- 11 added
- 2 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
src/main/java/edu/gjoko/schedlr/config/AppSecurityConfig.java
rcc52b09 ra436340 45 45 http.csrf() 46 46 .disable() 47 .authorizeRequests()48 .antMatchers("/login").permitAll()49 .antMatchers("/register_customer").permitAll()50 .antMatchers("/register_business").permitAll()51 .antMatchers("/homepage").permitAll()52 .antMatchers("/css/**").permitAll()53 .antMatchers("/js/**").permitAll()54 .antMatchers("/anonymous*").anonymous()55 .anyRequest()56 .fullyAuthenticated()57 .and()58 47 .httpBasic() 59 48 .authenticationEntryPoint(new AppAuthenticationEntryPoint()) … … 64 53 .loginProcessingUrl("/login") 65 54 .successHandler(authenticationSuccessHandler) 66 .defaultSuccessUrl("/homepage"); 55 .defaultSuccessUrl("/homepage") 56 .and() 57 .authorizeRequests() 58 .antMatchers("/login").permitAll() 59 .antMatchers("/register_customer").permitAll() 60 .antMatchers("/register_business").permitAll() 61 .antMatchers("/api/nomenclatures/*").permitAll() 62 .antMatchers("/homepage").permitAll() 63 .antMatchers("/css/**").permitAll() 64 .antMatchers("/js/**").permitAll() 65 .antMatchers("/anonymous*").anonymous() 66 .anyRequest() 67 .fullyAuthenticated(); 67 68 } 68 69 } -
src/main/java/edu/gjoko/schedlr/controllers/HomePageController.java
rcc52b09 ra436340 1 1 package edu.gjoko.schedlr.controllers; 2 2 3 import edu.gjoko.schedlr.entity.Search;4 3 import org.springframework.stereotype.Controller; 5 4 import org.springframework.ui.Model; 6 5 import org.springframework.web.bind.annotation.GetMapping; 7 import org.springframework.web.bind.annotation.ModelAttribute;8 6 import org.springframework.web.bind.annotation.PostMapping; 7 8 import java.security.Principal; 9 9 10 10 @Controller … … 12 12 13 13 @GetMapping(name = "/homepage") 14 public String getHomePageTemplate(Model model, @ModelAttribute("search")Search search) {15 model.addAttribute("search", search);14 public String getHomePageTemplate(Model model, Principal principal) { 15 System.out.println(principal); 16 16 return "homepage"; 17 17 } 18 18 19 19 @PostMapping(name = "/homepage") 20 public String postHomePageTemplate(Model model, @ModelAttribute("search")Search search) { 21 model.addAttribute("search", search); 20 public String postHomePageTemplate(Model model) { 22 21 return "homepage"; 23 22 } -
src/main/java/edu/gjoko/schedlr/controllers/LoginController.java
rcc52b09 ra436340 12 12 13 13 @GetMapping(path = "/login") 14 public String getMapping(Model model) { 15 model.addAttribute("stakeholder", new Stakeholder()); 14 public String getMapping(@ModelAttribute Stakeholder customer, Model model) { 16 15 return "login"; 17 16 } -
src/main/java/edu/gjoko/schedlr/controllers/RegisterController.java
rcc52b09 ra436340 29 29 public String registerCustomer(@ModelAttribute Stakeholder customer, Model model) { 30 30 Stakeholder user = stakeholderService.saveStakeholder(customer); 31 model.addAttribute("user", user); 32 return "redirect:homepage"; 31 return "redirect:login"; 33 32 } 34 33 -
src/main/java/edu/gjoko/schedlr/entity/Business.java
rcc52b09 ra436340 1 1 package edu.gjoko.schedlr.entity; 2 2 3 import com.fasterxml.jackson.annotation.JsonManagedReference; 3 4 import lombok.AllArgsConstructor; 4 5 import lombok.Getter; … … 25 26 private String name; 26 27 27 @ Column(name = "business_type")28 @ Enumerated(EnumType.STRING)28 @OneToOne 29 @JoinColumn(name = "business_type_id", referencedColumnName = "id") 29 30 private BusinessType businessType; 30 31 … … 39 40 private Stakeholder owner; 40 41 42 @OneToMany(mappedBy = "business") 43 @JsonManagedReference 44 private List<Service> services; 45 41 46 @Column(name = "created") 42 47 private LocalDateTime created; … … 45 50 private LocalDateTime modified; 46 51 47 @OneToMany(mappedBy = "business") 48 private List<Service> services; 52 49 53 } -
src/main/java/edu/gjoko/schedlr/entity/BusinessType.java
rcc52b09 ra436340 1 1 package edu.gjoko.schedlr.entity; 2 2 3 public enum BusinessType { 4 TAILOR, 5 NAIL_SALON, 6 MASSAGE_PARLOR, 7 MAKEUP_STUDIO, 8 HAIRDRESSER, 9 BARBER 3 import com.fasterxml.jackson.annotation.JsonIgnore; 4 import com.fasterxml.jackson.annotation.JsonManagedReference; 5 import com.fasterxml.jackson.annotation.JsonProperty; 6 import lombok.AllArgsConstructor; 7 import lombok.Getter; 8 import lombok.NoArgsConstructor; 9 import lombok.Setter; 10 import org.springframework.data.annotation.CreatedDate; 11 import org.springframework.data.annotation.LastModifiedDate; 12 import org.springframework.data.jpa.domain.support.AuditingEntityListener; 13 14 import javax.persistence.*; 15 import java.time.LocalDateTime; 16 import java.util.List; 17 18 @Entity 19 @EntityListeners(AuditingEntityListener.class) 20 @Table(name = "business_type") 21 @Getter 22 @Setter 23 @NoArgsConstructor 24 @AllArgsConstructor 25 public class BusinessType { 26 27 @Id 28 @GeneratedValue(strategy = GenerationType.SEQUENCE) 29 @JsonProperty("value") 30 private Long id; 31 32 @Column(name = "name") 33 @JsonProperty("text") 34 private String name; 35 36 @OneToMany(mappedBy="businessType") 37 @JsonManagedReference 38 private List<ServiceType> serviceTypes; 39 40 @Column(name = "created") 41 @CreatedDate 42 @JsonIgnore 43 private LocalDateTime created; 44 45 @Column(name = "modified") 46 @LastModifiedDate 47 @JsonIgnore 48 private LocalDateTime modified; 10 49 } -
src/main/java/edu/gjoko/schedlr/entity/Service.java
rcc52b09 ra436340 1 1 package edu.gjoko.schedlr.entity; 2 2 3 import com.fasterxml.jackson.annotation.JsonBackReference; 3 4 import lombok.AllArgsConstructor; 4 5 import lombok.Getter; … … 35 36 private Float price; 36 37 38 @OneToOne 39 @JoinColumn(name = "service_type_id", referencedColumnName = "id") 40 private ServiceType serviceType; 41 37 42 @ManyToOne 38 @JoinColumn(name = "business_id") 43 @JoinColumn(name="business_fk") 44 @JsonBackReference 39 45 private Business business; 40 46 -
src/main/java/edu/gjoko/schedlr/services/StakeholderService.java
rcc52b09 ra436340 4 4 import edu.gjoko.schedlr.entity.StakeholderType; 5 5 import edu.gjoko.schedlr.repositories.StakeholderRepository; 6 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 6 7 import org.springframework.stereotype.Service; 7 8 … … 10 11 11 12 private StakeholderRepository stakeholderRepository; 13 private BCryptPasswordEncoder bCryptPasswordEncoder; 12 14 13 public StakeholderService(StakeholderRepository stakeholderRepository) { 15 public StakeholderService(StakeholderRepository stakeholderRepository, 16 BCryptPasswordEncoder bCryptPasswordEncoder) { 14 17 this.stakeholderRepository = stakeholderRepository; 18 this.bCryptPasswordEncoder = bCryptPasswordEncoder; 15 19 } 16 20 17 21 public Stakeholder saveStakeholder(Stakeholder stakeholder) { 22 stakeholder.setPassword(bCryptPasswordEncoder.encode(stakeholder.getPassword())); 18 23 stakeholder.setStakeholderType(StakeholderType.CUSTOMER); 19 24 return stakeholderRepository.save(stakeholder); -
src/main/resources/data.sql
rcc52b09 ra436340 4 4 insert into stakeholder (id, created, email, first_name, last_name, modified, password, stakeholder_type, username) 5 5 values (nextval('hibernate_sequence'), current_timestamp, 'user1@schedlr.com', 'gjoko', 'kostadinov', current_timestamp, '$2a$10$Zc28AcCpAgxB.e67UMF/2.FgchjH9QWB7z8nP0TdkrFneV4IHPXji','CUSTOMER', 'user'); 6 7 insert into business_type (id, created, modified, name) 8 values (1, current_timestamp, current_timestamp, 'tailor'), 9 (2, current_timestamp, current_timestamp, 'nail salon'), 10 (3, current_timestamp, current_timestamp, 'massage parlor'), 11 (4, current_timestamp, current_timestamp, 'makeup studio'), 12 (5, current_timestamp, current_timestamp, 'hairdresser'), 13 (6, current_timestamp, current_timestamp, 'barber'); 14 15 insert into service_type (id, created, modified, name, business_type_id) 16 values (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'haircut', 5), 17 (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'beard shaving', 6), 18 (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'eye brow plucking', 6), 19 (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'waxing', 6), 20 (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'nail extensions', 2), 21 (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'dress shortening', 1), 22 (nextval('hibernate_sequence'), current_timestamp, current_timestamp, 'holes fixing', 1); -
src/main/resources/static/css/fullcalendar.css
rcc52b09 ra436340 658 658 } 659 659 660 body {661 margin-top: 40px;662 text-align: center;663 font-size: 14px;664 font-family: "Helvetica Nueue",Arial,Verdana,sans-serif;665 background-color: #DDDDDD;666 }667 668 660 #wrap { 669 661 width: 1100px; -
src/main/resources/static/css/homepage.css
rcc52b09 ra436340 3 3 float:left; 4 4 } 5 6 .navbar { 7 margin-bottom: 50px; 8 } 9 10 body { 11 background-color: #dbdbdb; 12 } 13 header { 14 background-color: white; 15 } 16 17 .bd-placeholder-img { 18 font-size: 1.125rem; 19 text-anchor: middle; 20 -webkit-user-select: none; 21 -moz-user-select: none; 22 user-select: none; 23 } 24 25 @media (min-width: 768px) { 26 .bd-placeholder-img-lg { 27 font-size: 3.5rem; 28 } 29 } 30 31 .b-example-divider { 32 height: 3rem; 33 background-color: rgba(0, 0, 0, .1); 34 border: solid rgba(0, 0, 0, .15); 35 border-width: 1px 0; 36 box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15); 37 } 38 39 .b-example-vr { 40 flex-shrink: 0; 41 width: 1.5rem; 42 height: 100vh; 43 } 44 45 .bi { 46 vertical-align: -.125em; 47 fill: currentColor; 48 } 49 50 .nav-scroller { 51 position: relative; 52 z-index: 2; 53 height: 2.75rem; 54 overflow-y: hidden; 55 } 56 57 .nav-scroller .nav { 58 display: flex; 59 flex-wrap: nowrap; 60 padding-bottom: 1rem; 61 margin-top: -1px; 62 overflow-x: auto; 63 text-align: center; 64 white-space: nowrap; 65 -webkit-overflow-scrolling: touch; 66 } -
src/main/resources/templates/homepage.html
rcc52b09 ra436340 2 2 <html> 3 3 <head> 4 <title> FullCalendar by Creative Tim</title>4 <title>Schedlr</title> 5 5 6 6 <meta charset="utf-8"/> … … 16 16 <link href='css/fullcalendar.print.css' rel='stylesheet' media='print'/> 17 17 <link href="css/homepage.css" rel="stylesheet" /> 18 <link href="css/headers.css" rel="stylesheet"> 18 19 </head> 19 20 <body> 21 22 <!-- Navbar start --> 23 <header class="p-3 mb-3 border-bottom"> 24 <div class="container"> 25 <div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start"> 26 <a href="/" class="d-flex align-items-center mb-2 mb-lg-0 text-dark text-decoration-none"> 27 <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap"><use xlink:href="#bootstrap"/></svg> 28 </a> 29 30 <ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0"> 31 <li><a href="#" class="nav-link px-2 link-secondary">Overview</a></li> 32 <li><a href="#" class="nav-link px-2 link-dark">Inventory</a></li> 33 <li><a href="#" class="nav-link px-2 link-dark">Customers</a></li> 34 <li><a href="#" class="nav-link px-2 link-dark">Products</a></li> 35 </ul> 36 37 <form class="col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3" role="search"> 38 <input type="search" class="form-control" placeholder="Search..." aria-label="Search"> 39 </form> 40 41 <div class="dropdown text-end"> 42 <a href="#" class="d-block link-dark text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> 43 <img src="https://github.com/mdo.png" alt="mdo" width="32" height="32" class="rounded-circle"> 44 </a> 45 <ul class="dropdown-menu text-small"> 46 <li><a class="dropdown-item" href="#">New project...</a></li> 47 <li><a class="dropdown-item" href="#">Settings</a></li> 48 <li><a class="dropdown-item" href="#">Profile</a></li> 49 <li><hr class="dropdown-divider"></li> 50 <li><a class="dropdown-item" href="#">Sign out</a></li> 51 </ul> 52 </div> 53 </div> 54 </div> 55 </header> 56 <!-- Navbar end --> 57 20 58 <div id='wrap'> 21 59 <div id='calendar'></div> … … 40 78 <script src='js/fullcalendar.js' type="text/javascript"></script> 41 79 <script src="js/homepage.js" type="text/javascript"></script> 80 <script src="js/bootstrap.bundle.min.js"></script> 42 81 </body> 43 82 </html> -
src/main/resources/templates/login.html
rcc52b09 ra436340 3 3 <head> 4 4 <meta charset="UTF-8"> 5 <title> Login</title>5 <title>Schedlr</title> 6 6 7 7 <!-- Font Awesome --> … … 60 60 61 61 <div class="text-center"> 62 <p>No account? <a href="/register_customer" class="link-primary">Register</a></p> 62 <p>No account? <a href="/register_customer" class="link-primary">Register customer</a></p> 63 </div> 64 <div class="text-center"> 65 <p>Offering services? <a href="/register_business" class="link-primary">Register company</a></p> 63 66 </div> 64 67 <!-- Register buttons --> -
src/main/resources/templates/register_business.html
rcc52b09 ra436340 3 3 <head> 4 4 <meta charset="UTF-8"> 5 <title> Register business</title>5 <title>Schedlr</title> 6 6 7 7 <!-- Font Awesome --> … … 20 20 rel="stylesheet" 21 21 /> 22 <link rel="stylesheet" href="css/register.css"> 22 <link rel="stylesheet" href="css/login.css"> 23 23 24 </head> 24 25 <body> … … 40 41 <div class="card-body py-5 px-md-5"> 41 42 <form> 43 <div class="text-center"> 44 <p>Personal Info</p> 45 </div> 46 42 47 <!-- 2 column grid layout with text inputs for the first and last names --> 43 48 <div class="row"> 44 49 <div class="col-md-6 mb-4"> 45 50 <div class="form-outline"> 46 <input type="text" id="f orm3Example1" class="form-control" />47 <label class="form-label" for="f orm3Example1">First name</label>51 <input type="text" id="firstName" class="form-control" /> 52 <label class="form-label" for="firstName">First name</label> 48 53 </div> 49 54 </div> 50 55 <div class="col-md-6 mb-4"> 51 56 <div class="form-outline"> 52 <input type="text" id=" form3Example2" class="form-control" />53 <label class="form-label" for=" form3Example2">Last name</label>57 <input type="text" id="lastName" class="form-control" /> 58 <label class="form-label" for="lastName">Last name</label> 54 59 </div> 55 60 </div> … … 58 63 <!-- Email input --> 59 64 <div class="form-outline mb-4"> 60 <input type="email" id="form3Example3" class="form-control" /> 61 <label class="form-label" for="form3Example3">Email address</label> 65 <input type="email" id="email" class="form-control" /> 66 <label class="form-label" for="email">Email address</label> 67 </div> 68 69 <!-- Email input --> 70 <div class="form-outline mb-4"> 71 <input type="email" id="username" class="form-control" /> 72 <label class="form-label" for="username">Username</label> 62 73 </div> 63 74 64 75 <!-- Password input --> 65 76 <div class="form-outline mb-4"> 66 <input type="password" id=" form3Example4" class="form-control" />67 <label class="form-label" for=" form3Example4">Password</label>77 <input type="password" id="password" class="form-control" /> 78 <label class="form-label" for="password">Password</label> 68 79 </div> 69 80 70 <!-- Checkbox --> 71 <div class="form-check d-flex justify-content-center mb-4"> 72 <input class="form-check-input me-2" type="checkbox" value="" id="form2Example33" checked /> 73 <label class="form-check-label" for="form2Example33"> 74 Subscribe to our newsletter 75 </label> 81 <div class="text-center"> 82 <p>Company Info</p> 76 83 </div> 84 85 <div class="form-outline mb-4"> 86 <input type="email" id="companyName" class="form-control" /> 87 <label class="form-label" for="companyName">Company Name</label> 88 </div> 89 90 <div class="form-outline mb-4"> 91 <select class="form-select" id="companyType"> 92 <option value="" disabled selected hidden>Company Type</option> 93 </select> 94 </div> 95 96 <div class="form-group form-outline mb-4"> 97 <label for="services">Services</label> 98 <input type="text" class="form-control" placeholder="Services" list="list-timezone" id="services"> 99 <datalist id="list-timezone"> 100 </datalist> 101 </div> 102 77 103 78 104 <!-- Submit button --> … … 80 106 Sign up 81 107 </button> 82 83 <!-- Register buttons -->84 <div class="text-center">85 <p>or sign up with:</p>86 <button type="button" class="btn btn-link btn-floating mx-1">87 <i class="fab fa-facebook-f"></i>88 </button>89 90 <button type="button" class="btn btn-link btn-floating mx-1">91 <i class="fab fa-google"></i>92 </button>93 94 <button type="button" class="btn btn-link btn-floating mx-1">95 <i class="fab fa-twitter"></i>96 </button>97 98 <button type="button" class="btn btn-link btn-floating mx-1">99 <i class="fab fa-github"></i>100 </button>101 </div>102 108 </form> 103 109 </div> … … 107 113 </div> 108 114 </div> 109 <!-- Jumbotron --> 110 <!-- MDB --> 115 <script src='js/jquery-1.10.2.js' type="text/javascript"></script> 111 116 <script 112 117 type="text/javascript" 113 118 src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/5.0.0/mdb.min.js" 114 119 ></script> 120 <script src="js/register_business.js" type="text/javascript"></script> 121 <script src="js/bootstrap-autocomplete.min.js"></script> 115 122 </body> 116 123 </html> -
src/main/resources/templates/register_customer.html
rcc52b09 ra436340 3 3 <head> 4 4 <meta charset="UTF-8"> 5 <title>Register customer</title> 5 <title>Schedlr</title> 6 7 <meta charset="utf-8"/> 8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> 6 9 7 10 <!-- Font Awesome --> … … 20 23 rel="stylesheet" 21 24 /> 25 22 26 <link rel="stylesheet" href="css/register.css"> 23 27 </head> … … 110 114 </div> 111 115 </div> 112 <!-- Jumbotron -->113 <!-- MDB -->114 116 <script 115 117 type="text/javascript" 116 118 src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/5.0.0/mdb.min.js" 117 119 ></script> 120 118 121 </body> 119 122 </html>
Note:
See TracChangeset
for help on using the changeset viewer.