diff --git a/build.gradle b/build.gradle index a804775..53b7de7 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.mariadb.jdbc:mariadb-java-client:2.2.0' + //Mail + implementation 'org.springframework.boot:spring-boot-starter-mail' + implementation 'jakarta.mail:jakarta.mail-api' + implementation 'jakarta.activation:jakarta.activation-api' //Securité implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' @@ -40,6 +44,8 @@ dependencies { //test testImplementation 'org.springframework.security:spring-security-test' testImplementation 'org.springframework.boot:spring-boot-starter-test' + //data + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } tasks.named('test') { diff --git a/src/main/java/fr/eni/enchere/bll/ArticleService.java b/src/main/java/fr/eni/enchere/bll/ArticleService.java index c64477d..f87c72b 100644 --- a/src/main/java/fr/eni/enchere/bll/ArticleService.java +++ b/src/main/java/fr/eni/enchere/bll/ArticleService.java @@ -2,6 +2,8 @@ package fr.eni.enchere.bll; import fr.eni.enchere.bo.Article; import fr.eni.enchere.bo.SearchArticleCritere; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; @@ -13,5 +15,5 @@ public interface ArticleService { void deleteArticle(int id); void updateArticle(int id); List
findArticleByTitle(String title); - List
searchArticle(SearchArticleCritere critere); + Page
searchArticlePageable(SearchArticleCritere critere, Pageable pageable); } diff --git a/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java b/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java index ffdf089..7f22302 100644 --- a/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java +++ b/src/main/java/fr/eni/enchere/bll/ArticleServiceImpl.java @@ -3,6 +3,8 @@ package fr.eni.enchere.bll; import fr.eni.enchere.bo.Article; import fr.eni.enchere.bo.SearchArticleCritere; import fr.eni.enchere.dal.ArticleRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.List; @@ -45,8 +47,9 @@ public class ArticleServiceImpl implements ArticleService{ return articleRepository.findArticleByTitle(title); } + @Override - public List
searchArticle(SearchArticleCritere critere) { - return articleRepository.searchArticle(critere); + public Page
searchArticlePageable(SearchArticleCritere critere, Pageable pageable) { + return articleRepository.searchArticlePageable(critere, pageable); } } diff --git a/src/main/java/fr/eni/enchere/bll/ForgotPasswordService.java b/src/main/java/fr/eni/enchere/bll/ForgotPasswordService.java new file mode 100644 index 0000000..0cb80c2 --- /dev/null +++ b/src/main/java/fr/eni/enchere/bll/ForgotPasswordService.java @@ -0,0 +1,12 @@ +package fr.eni.enchere.bll; + +import fr.eni.enchere.bo.ForgotPassword; + +import java.util.List; + +public interface ForgotPasswordService { + + ForgotPassword getForgotPassword(String link); + void setForgotPassword(String email); + +} diff --git a/src/main/java/fr/eni/enchere/bll/ForgotPasswordServiceImpl.java b/src/main/java/fr/eni/enchere/bll/ForgotPasswordServiceImpl.java new file mode 100644 index 0000000..129421a --- /dev/null +++ b/src/main/java/fr/eni/enchere/bll/ForgotPasswordServiceImpl.java @@ -0,0 +1,27 @@ +package fr.eni.enchere.bll; + +import fr.eni.enchere.bo.ForgotPassword; +import fr.eni.enchere.dal.ForgotPasswordRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("ForgotPasswordService") +public class ForgotPasswordServiceImpl implements ForgotPasswordService { + + private ForgotPasswordRepository forgotPasswordRepository; + + public ForgotPasswordServiceImpl(ForgotPasswordRepository forgotPasswordRepository) { + this.forgotPasswordRepository = forgotPasswordRepository; + } + + @Override + public ForgotPassword getForgotPassword(String link) { + return forgotPasswordRepository.getForgotPasswordByLink(link); + } + + @Override + public void setForgotPassword(String email) { + forgotPasswordRepository.setForgotPasswords(email); + } +} diff --git a/src/main/java/fr/eni/enchere/bll/UserService.java b/src/main/java/fr/eni/enchere/bll/UserService.java index ac4a39a..9ef0f83 100644 --- a/src/main/java/fr/eni/enchere/bll/UserService.java +++ b/src/main/java/fr/eni/enchere/bll/UserService.java @@ -1,6 +1,7 @@ package fr.eni.enchere.bll; import fr.eni.enchere.bo.UserProfil; +import org.apache.catalina.User; import java.util.List; @@ -8,8 +9,10 @@ public interface UserService { List listeUtilisateurs(); UserProfil utilisateurById(int id); UserProfil utilisateurByName(String username); + UserProfil utilisateurByEmail(String email); List listPseudo(); List listEmail(); + String getUserByMail(String mail); void setUtilisateur(UserProfil utilisateur); void setCredit(float credit, int id); void deleteUtilisateur(int id); diff --git a/src/main/java/fr/eni/enchere/bll/UserServiceImpl.java b/src/main/java/fr/eni/enchere/bll/UserServiceImpl.java index 4bae2df..52a4140 100644 --- a/src/main/java/fr/eni/enchere/bll/UserServiceImpl.java +++ b/src/main/java/fr/eni/enchere/bll/UserServiceImpl.java @@ -30,6 +30,11 @@ public class UserServiceImpl implements UserService { return userRepository.findByUsername(username); } + @Override + public UserProfil utilisateurByEmail(String email) { + return userRepository.findUserByEmail(email); + } + @Override public List listPseudo() { return userRepository.findAllUsernames(); @@ -40,6 +45,11 @@ public class UserServiceImpl implements UserService { return userRepository.findAllEmail(); } + @Override + public String getUserByMail(String mail) { + return userRepository.findByEmail(mail); + } + @Override public void setUtilisateur(UserProfil utilisateur) { userRepository.save(utilisateur); diff --git a/src/main/java/fr/eni/enchere/bo/ForgotPassword.java b/src/main/java/fr/eni/enchere/bo/ForgotPassword.java new file mode 100644 index 0000000..0a16389 --- /dev/null +++ b/src/main/java/fr/eni/enchere/bo/ForgotPassword.java @@ -0,0 +1,64 @@ +package fr.eni.enchere.bo; + +import java.time.LocalDate; +import java.util.Calendar; + +public class ForgotPassword { + + private int id; + private String email; + private String link; + private Calendar dateCreate; + private Calendar dateExpire; + + public ForgotPassword() {} + + public ForgotPassword(int id, String email, String link, Calendar dateCreate, Calendar dateExpire) { + setId(id); + setEmail(email); + setLink(link); + setDateCreate(dateCreate); + setDateExpire(dateExpire); + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Calendar getDateCreate() { + return dateCreate; + } + + public void setDateCreate(Calendar dateCreate) { + this.dateCreate = dateCreate; + } + + public Calendar getDateExpire() { + return dateExpire; + } + + public void setDateExpire(Calendar dateExpire) { + this.dateExpire = dateExpire; + } + +} diff --git a/src/main/java/fr/eni/enchere/config/WebConfig.java b/src/main/java/fr/eni/enchere/config/WebConfig.java index 74388f7..c1e2bfd 100644 --- a/src/main/java/fr/eni/enchere/config/WebConfig.java +++ b/src/main/java/fr/eni/enchere/config/WebConfig.java @@ -4,14 +4,9 @@ import com.google.i18n.phonenumbers.PhoneNumberUtil; import org.apache.commons.validator.routines.EmailValidator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.filter.RequestContextFilter; import org.springframework.web.servlet.LocaleResolver; -import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; -import org.springframework.context.annotation.Bean; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.web.servlet.i18n.SessionLocaleResolver; diff --git a/src/main/java/fr/eni/enchere/controllers/AccueilController.java b/src/main/java/fr/eni/enchere/controllers/AccueilController.java index 21fb32c..31c1773 100644 --- a/src/main/java/fr/eni/enchere/controllers/AccueilController.java +++ b/src/main/java/fr/eni/enchere/controllers/AccueilController.java @@ -10,6 +10,8 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; @@ -44,7 +46,7 @@ public class AccueilController { } @GetMapping({"/", "/accueil"}) - public String viewAccueil(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails, @RequestParam(required = false) String searchTitle, @RequestParam(required = false) Integer searchCategory, Model model, @RequestParam(value = "venteOption", required = false) String[] venteOptions, @RequestParam(value = "achatOption", required = false) String[] achatOptions) { + public String viewAccueil(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails, @RequestParam(required = false) String searchTitle, @RequestParam(required = false) Integer searchCategory, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "6") int size, Model model, @RequestParam(value = "venteOption", required = false) String[] venteOptions, @RequestParam(value = "achatOption", required = false) String[] achatOptions) { model.addAttribute("categories", categorieService.findAllCategories()); model.addAttribute("requestURI", request.getRequestURI()); SearchArticleCritere critere = new SearchArticleCritere(); @@ -55,15 +57,21 @@ public class AccueilController { } critere.setVenteOptions(venteOptions); critere.setAchatOptions(achatOptions); - model.addAttribute("articles", articleService.searchArticle(critere)); + + // Pagination + Page
articlePage = articleService.searchArticlePageable(critere, PageRequest.of(page, size)); + model.addAttribute("articles", articlePage.getContent()); + model.addAttribute("currentPage", page); + model.addAttribute("totalPages", articlePage.getTotalPages()); + return "accueil"; } @PostMapping("/accueil") - public String handleSearch(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails, @RequestParam("searchTitle") String searchTitle, @RequestParam(value = "searchCategory", required = false) Integer searchCategory, Model model, @RequestParam(value = "venteOption", required = false) String[] venteOptions, @RequestParam(value = "achatOption", required = false) String[] achatOptions ) { + public String handleSearch(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails, @RequestParam(required = false) String searchTitle, @RequestParam(required = false) Integer searchCategory, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "6") int size, Model model, @RequestParam(value = "venteOption", required = false) String[] venteOptions, @RequestParam(value = "achatOption", required = false) String[] achatOptions) { - return viewAccueil(request, userDetails, searchTitle, searchCategory, model, venteOptions, achatOptions); + return viewAccueil(request, userDetails, searchTitle, searchCategory, page, size, model, venteOptions, achatOptions); } diff --git a/src/main/java/fr/eni/enchere/controllers/ArticleController.java b/src/main/java/fr/eni/enchere/controllers/ArticleController.java index 2dbf051..9f0d968 100644 --- a/src/main/java/fr/eni/enchere/controllers/ArticleController.java +++ b/src/main/java/fr/eni/enchere/controllers/ArticleController.java @@ -68,6 +68,12 @@ public class ArticleController { Optional maxMontantEnchere = lastEnchere.stream() .map(Enchere::getMontantEnchere) // Récupère seulement les montants d'enchère .max(Float::compareTo); + UserProfil currentUser = userService.utilisateurByName(authentication.getName()); + boolean isArticleCurrentUser = false; + if (currentUser.getId() == user.getId()) { + isArticleCurrentUser = true; + } + model.addAttribute("isArticleCurrentUser", isArticleCurrentUser); model.addAttribute("article", article); model.addAttribute("username", user); model.addAttribute("cate", cate.getLibelle()); diff --git a/src/main/java/fr/eni/enchere/controllers/BankController.java b/src/main/java/fr/eni/enchere/controllers/BankController.java new file mode 100644 index 0000000..bb3b740 --- /dev/null +++ b/src/main/java/fr/eni/enchere/controllers/BankController.java @@ -0,0 +1,44 @@ +package fr.eni.enchere.controllers; + +import fr.eni.enchere.bll.ArticleService; +import fr.eni.enchere.bll.UserService; +import fr.eni.enchere.bo.UserProfil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller() +@RequestMapping("/bank") +public class BankController { + + @Autowired + private final UserService userService; + + public BankController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/home") + public String homeCredit(Model model) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!authentication.getName().equals("anonymousUser")){ + return "redirect:/accueil"; + } + String username = authentication.getName(); + UserProfil userProfile = userService.utilisateurByName(username); + model.addAttribute("userProfile", userProfile); + return "bank"; + } + + @PostMapping("/checkout") + public String addCreditCheckout() { + + return "bank"; + } + +} diff --git a/src/main/java/fr/eni/enchere/controllers/ForgotPasswordController.java b/src/main/java/fr/eni/enchere/controllers/ForgotPasswordController.java new file mode 100644 index 0000000..e1b1dca --- /dev/null +++ b/src/main/java/fr/eni/enchere/controllers/ForgotPasswordController.java @@ -0,0 +1,153 @@ +package fr.eni.enchere.controllers; + +import fr.eni.enchere.bll.ForgotPasswordService; +import fr.eni.enchere.bll.UserService; +import fr.eni.enchere.bo.ForgotPassword; +import fr.eni.enchere.bo.UserProfil; +import org.apache.commons.validator.routines.EmailValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Calendar; +import java.util.regex.Pattern; + +@Controller() +@RequestMapping("/forgotPassword") +public class ForgotPasswordController { + + @Autowired + private final UserService userService; + private EmailValidator emailValidator; + private ForgotPasswordService forgotPasswordService; + + public ForgotPasswordController(EmailValidator emailValidator, ForgotPasswordService forgotPasswordService, UserService userService) { + this.userService = userService; + this.emailValidator = emailValidator; + this.forgotPasswordService = forgotPasswordService; + } + + @GetMapping + public String forgotPassword(Model model, @RequestParam(value = "link", required = false) String link) { + // Vérifier si l'utilisateur est déjà authentifié + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!authentication.getName().equals("anonymousUser")){ + return "redirect:/accueil"; + } + if (link != null) { + ForgotPassword forgotPassword = forgotPasswordService.getForgotPassword(link); + if (forgotPassword != null) { + Calendar dateNow = Calendar.getInstance(); + if (dateNow.before(forgotPassword.getDateExpire())){ + return "redirect:/forgotPassword/changePassword?link=" + forgotPassword.getLink(); + }else{ + return "redirect:/forgotPassword/changePasswordExpired?link=" + forgotPassword.getLink(); + } + }else{ + return "redirect:/security/forgotPassword"; + } + }else{ + return "security/forgotPassword"; + } + } + + @PostMapping + public String createLinkForgotPassword(@RequestParam("email") String email) { + if (email.isEmpty()){ + return "redirect:/forgotPassword?error"; + }else{ + if (!emailValidator.isValid(email)) { + return "redirect:/forgotPassword?error"; + } + } + //Vérification de l'email dans la base de donnée + if (userService.getUserByMail(email) == null){ + return "redirect:/forgotPassword?error"; + } + forgotPasswordService.setForgotPassword(email); + return "redirect:/forgotPassword?mailSend"; + } + + @GetMapping("/changePassword") + public String forgotPasswordChangePassword(Model model, @RequestParam(value = "link", required = true) String link) { + // Vérifier si l'utilisateur est déjà authentifié + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!authentication.getName().equals("anonymousUser")){ + return "redirect:/accueil"; + } + ForgotPassword forgotPassword = forgotPasswordService.getForgotPassword(link); + if (forgotPassword != null) { + Calendar dateNow = Calendar.getInstance(); + if (dateNow.before(forgotPassword.getDateExpire())){ + return "security/changePassword"; + }else{ + return "redirect:/forgotPassword/changePasswordExpired?link=" + forgotPassword.getLink(); + } + }else{ + return "security/forgotPassword"; + } + } + + @PostMapping("/changePassword/check") + public String changePassword(@RequestParam("email") String email, + @RequestParam("password") String password, + @RequestParam("confirmPassword") String confirmPassword, + @RequestParam("link") String link) { + ForgotPassword forgotPassword = forgotPasswordService.getForgotPassword(link); + if (forgotPassword != null) { + Calendar dateNow = Calendar.getInstance(); + if (dateNow.before(forgotPassword.getDateExpire())){ + if (email.equalsIgnoreCase(forgotPassword.getEmail())){ + if (password.equals(confirmPassword)){ + String passwordRegex = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@?*#$%^&+=_!\\-])(?=\\S+$).{8,}$"; + Pattern pattern = Pattern.compile(passwordRegex); + // Vérifier si le mot de passe correspond à l'expression régulière + if (pattern.matcher(password).matches()){ + UserProfil userForgotPassword = userService.utilisateurByEmail(email); + userForgotPassword.setNewPassword(password); + userService.setUtilisateur(userForgotPassword); + return "redirect:/login"; + }else{ + return "redirect:/forgotPassword/changePassword?link=" + forgotPassword.getLink() + "&passwordSecurity"; + } + }else{ + return "redirect:/forgotPassword/changePassword?link=" + forgotPassword.getLink() + "&passwordNotIdentique"; + } + }else{ + return "redirect:/forgotPassword/changePassword?link=" + forgotPassword.getLink() + "&emailError"; + } + }else{ + return "redirect:/forgotPassword/changePasswordExpired?link=" + forgotPassword.getLink(); + } + }else{ + return "security/forgotPassword"; + } + } + + @GetMapping("/changePasswordExpired") + public String forgotPasswordLinkExpired(Model model, @RequestParam(value = "link", required = true) String link) { + // Vérifier si l'utilisateur est déjà authentifié + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!authentication.getName().equals("anonymousUser")){ + return "redirect:/accueil"; + } + ForgotPassword forgotPassword = forgotPasswordService.getForgotPassword(link); + if (forgotPassword != null) { + Calendar dateNow = Calendar.getInstance(); + if (dateNow.before(forgotPassword.getDateExpire())){ + return "redirect:/forgotPassword/changePassword?link=" + forgotPassword.getLink(); + }else{ + return "security/changePasswordExpired"; + } + }else{ + return "security/forgotPassword"; + } + } + +} diff --git a/src/main/java/fr/eni/enchere/controllers/LanguageController.java b/src/main/java/fr/eni/enchere/controllers/LanguageController.java index 71f4eb3..90549ad 100644 --- a/src/main/java/fr/eni/enchere/controllers/LanguageController.java +++ b/src/main/java/fr/eni/enchere/controllers/LanguageController.java @@ -23,7 +23,6 @@ public class LanguageController { @GetMapping("/change-language") public String changeLanguage(HttpServletRequest request, HttpServletResponse response, Locale locale) { LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); - System.out.println(locale.getLanguage()); if (localeResolver != null) { if (locale.getLanguage().equals("en")) { localeResolver.setLocale(request, response, Locale.FRENCH); // Changer la langue en français @@ -31,7 +30,15 @@ public class LanguageController { localeResolver.setLocale(request, response, Locale.ENGLISH); // Changer la langue en anglais } } - return "redirect:/"; + + String referer = request.getHeader("Referer"); + + if (referer != null && !referer.isEmpty()) { + return "redirect:" + referer; + } else { + return "redirect:/"; + } } + } diff --git a/src/main/java/fr/eni/enchere/dal/ArticleRepository.java b/src/main/java/fr/eni/enchere/dal/ArticleRepository.java index 61a1bcb..5d6c084 100644 --- a/src/main/java/fr/eni/enchere/dal/ArticleRepository.java +++ b/src/main/java/fr/eni/enchere/dal/ArticleRepository.java @@ -2,12 +2,14 @@ package fr.eni.enchere.dal; import fr.eni.enchere.bo.Article; import fr.eni.enchere.bo.SearchArticleCritere; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; public interface ArticleRepository { List
findAllArticle(); - List
searchArticle(SearchArticleCritere critere); + Page
searchArticlePageable(SearchArticleCritere critere, Pageable pageable); Article findArticleById(int id); List
findArticleByTitle(String title); int saveArticle(Article article); diff --git a/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java b/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java index dc9f0f6..016c4f4 100644 --- a/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java +++ b/src/main/java/fr/eni/enchere/dal/ArticleRepositoryImpl.java @@ -8,6 +8,9 @@ import fr.eni.enchere.controllers.AccueilController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Primary; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -87,7 +90,7 @@ public class ArticleRepositoryImpl implements ArticleRepository { } @Override - public List
searchArticle(SearchArticleCritere critere) { + public Page
searchArticlePageable(SearchArticleCritere critere, Pageable pageable) { StringBuilder sql = new StringBuilder("SELECT DISTINCT a.*, u.* FROM ARTICLES_VENDUS a "); sql.append("JOIN UTILISATEURS u ON a.no_utilisateur = u.no_utilisateur "); sql.append("LEFT JOIN ENCHERES e ON a.no_article = e.no_article "); @@ -165,8 +168,104 @@ public class ArticleRepositoryImpl implements ArticleRepository { sql.append(")"); } + System.out.println(); + // Compte le nombre total d'articles + int totalCount = countArticlePageable(critere); + + // Ajoute la pagination à la requête SQL + sql.append(" LIMIT ? OFFSET ?"); + params.add(pageable.getPageSize()); + params.add(pageable.getOffset()); + + // Exécute la requête paginée List
articles = jdbcTemplate.query(sql.toString(), new HomeArticleRowMapper(), params.toArray()); + // Crée une Page
à partir des résultats et des informations de pagination + return new PageImpl<>(articles, pageable, totalCount); + } + + public int countArticlePageable(SearchArticleCritere critere) { + StringBuilder sql = new StringBuilder("SELECT COUNT(a.no_article) FROM ARTICLES_VENDUS a "); + sql.append("JOIN UTILISATEURS u ON a.no_utilisateur = u.no_utilisateur "); + sql.append("LEFT JOIN ENCHERES e ON a.no_article = e.no_article "); + sql.append("WHERE 1 = 1 AND a.isDelete = 0"); + List params = new ArrayList<>(); + + if (critere.getNoCategorie() != null) { + sql.append(" AND a.no_categorie = ?"); + params.add(critere.getNoCategorie()); + } + if (critere.getTitle() != null && !critere.getTitle().isEmpty()) { + sql.append(" AND a.nom_article LIKE ?"); + params.add('%' + critere.getTitle() + '%'); + } + + if (critere.getVenteOptions() != null && critere.getVenteOptions().length > 0) { + sql.append(" AND ("); + boolean isFirstCondition = true; + for (String option : critere.getVenteOptions()) { + if (option.equals("venteEnCours")) { + if (!isFirstCondition) { + sql.append(" OR "); + } + sql.append(" (a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) "); + isFirstCondition = false; + } + if (option.equals("ventesNonDebutees")) { + if (!isFirstCondition) { + sql.append(" OR "); + } + sql.append(" (a.date_debut_encheres > NOW()) "); + isFirstCondition = false; + } + if (option.equals("ventesTerminees")) { + if (!isFirstCondition) { + sql.append(" OR "); + } + sql.append(" (a.date_fin_encheres < NOW()) "); + isFirstCondition = false; + } + } + sql.append(") AND a.no_utilisateur = ?"); + params.add(critere.getNoVendeur()); + } + + if (critere.getAchatOptions() != null && critere.getAchatOptions().length > 0) { + sql.append(" AND ("); + boolean isFirstCondition = true; + for (String option : critere.getAchatOptions()) { + if (option.equals("encheresOuvertes")) { + if (!isFirstCondition) { + sql.append(" OR "); + } + sql.append(" (a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) "); + isFirstCondition = false; + } + if (option.equals("enchereEnCours")) { + if (!isFirstCondition) { + sql.append(" OR "); + } + sql.append(" (e.no_utilisateur = ? AND a.date_debut_encheres <= NOW() AND a.date_fin_encheres >= NOW()) "); + isFirstCondition = false; + params.add(critere.getNoVendeur()); + } + if (option.equals("enchereRemportees")) { + if (!isFirstCondition) { + sql.append(" OR "); + } + sql.append(" (e.no_utilisateur = ? AND e.montant_enchere = (SELECT MAX(montant_enchere) FROM ENCHERES WHERE no_article = a.no_article)) "); + isFirstCondition = false; + params.add(critere.getNoVendeur()); + } + } + + sql.append(")"); + } + + // Exécute la requête paginée + int articles = jdbcTemplate.queryForObject(sql.toString(), Integer.class, params.toArray()); + + // Retourne le nombre d'articles return articles; } diff --git a/src/main/java/fr/eni/enchere/dal/ForgotPasswordRepository.java b/src/main/java/fr/eni/enchere/dal/ForgotPasswordRepository.java new file mode 100644 index 0000000..82a5f5f --- /dev/null +++ b/src/main/java/fr/eni/enchere/dal/ForgotPasswordRepository.java @@ -0,0 +1,12 @@ +package fr.eni.enchere.dal; + +import fr.eni.enchere.bo.ForgotPassword; + +import java.util.List; + +public interface ForgotPasswordRepository { + + ForgotPassword getForgotPasswordByLink(String link); + void setForgotPasswords(String email); + +} diff --git a/src/main/java/fr/eni/enchere/dal/ForgotPasswordRepositoryImpl.java b/src/main/java/fr/eni/enchere/dal/ForgotPasswordRepositoryImpl.java new file mode 100644 index 0000000..c65104f --- /dev/null +++ b/src/main/java/fr/eni/enchere/dal/ForgotPasswordRepositoryImpl.java @@ -0,0 +1,95 @@ +package fr.eni.enchere.dal; + +import fr.eni.enchere.bo.ForgotPassword; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Repository; + +import java.security.SecureRandom; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Calendar; + +@Repository +@Primary +public class ForgotPasswordRepositoryImpl implements ForgotPasswordRepository { + + static final String keychain = "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN" ; + static SecureRandom randomValue = new SecureRandom(); + + @Autowired + private JavaMailSender javaMailSender; + private final JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + public ForgotPasswordRepositoryImpl(JavaMailSender javaMailSender, JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.javaMailSender = javaMailSender; + this.jdbcTemplate = jdbcTemplate; + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + public class ForgotPasswordRowMapper implements RowMapper { + @Override + public ForgotPassword mapRow(ResultSet rs, int rowNum) throws SQLException { + ForgotPassword forgotPassword = new ForgotPassword(); + forgotPassword.setId(rs.getInt("id")); + forgotPassword.setEmail(rs.getString("email")); + forgotPassword.setLink(rs.getString("lien")); + Calendar dateCreated = Calendar.getInstance(); + Calendar dateExpired = Calendar.getInstance(); + dateCreated.setTime(rs.getDate("dateCreate")); + dateExpired.setTime(rs.getDate("dateExpire")); + forgotPassword.setDateCreate(dateCreated); + forgotPassword.setDateExpire(dateExpired); + return forgotPassword; + } + } + + @Override + public ForgotPassword getForgotPasswordByLink(String link) { + String sql = "SELECT * FROM FORGOT WHERE lien = ?"; + try { + return jdbcTemplate.queryForObject(sql, new ForgotPasswordRepositoryImpl.ForgotPasswordRowMapper(), link); + } catch (EmptyResultDataAccessException e) { + // Aucun résultat trouvé, retourne null + return null; + } + } + + @Override + public void setForgotPasswords(String email) { + //Générer un code + StringBuilder linkCreate = new StringBuilder(50); + for (int i = 0; i < 50; i ++){ + linkCreate.append(keychain.charAt(randomValue.nextInt(keychain.length()))); + } + //Récupérer la date actuelle plus 10 minutes en plus + Calendar dateNow = Calendar.getInstance(); + Calendar dateAgo = Calendar.getInstance(); + dateAgo.add(Calendar.MINUTE, 10); + //Ajouter en base de donnée + String sql = "INSERT INTO FORGOT (email, lien, dateCreate, dateExpire) VALUES (:email, :lien, :dateCreate, :dateExpire)"; + MapSqlParameterSource parameters = new MapSqlParameterSource(); + parameters.addValue("email", email); + parameters.addValue("lien", linkCreate.toString()); + parameters.addValue("dateCreate", dateNow.getTime()); + parameters.addValue("dateExpire", dateAgo.getTime()); + namedParameterJdbcTemplate.update(sql, parameters); + //Envoyer un email + String link = "https://eni.enchere.horya.fr/forgotPassword?link=" + linkCreate.toString(); + String linkLocal = "http://localhost:8800/forgotPassword?link=" + linkCreate.toString(); + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom("support@horya.fr"); + message.setTo(email); + message.setSubject("ENI Enchere - Demmande de changement de mot de passe"); + message.setText("Bonjour,\n\nVous avez demandé une réinitialisation de votre mot de passe. Veuillez utiliser le lien suivant pour procéder à la réinitialisation : " + link + "\n\n" + linkLocal); + javaMailSender.send(message); + } +} diff --git a/src/main/java/fr/eni/enchere/dal/UserRepository.java b/src/main/java/fr/eni/enchere/dal/UserRepository.java index b226700..fe97902 100644 --- a/src/main/java/fr/eni/enchere/dal/UserRepository.java +++ b/src/main/java/fr/eni/enchere/dal/UserRepository.java @@ -8,8 +8,10 @@ public interface UserRepository { List findAll(); UserProfil findById(int id); UserProfil findByUsername(String username); + UserProfil findUserByEmail(String email); List findAllUsernames(); List findAllEmail(); + String findByEmail(String email); void save(UserProfil utilisateur); void updateCredit(float credit, int id); void delete(int id); diff --git a/src/main/java/fr/eni/enchere/dal/UserRepositoryImpl.java b/src/main/java/fr/eni/enchere/dal/UserRepositoryImpl.java index 33ce019..af16ee6 100644 --- a/src/main/java/fr/eni/enchere/dal/UserRepositoryImpl.java +++ b/src/main/java/fr/eni/enchere/dal/UserRepositoryImpl.java @@ -3,6 +3,7 @@ package fr.eni.enchere.dal; import fr.eni.enchere.bo.UserProfil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -60,6 +61,13 @@ public class UserRepositoryImpl implements UserRepository { return user; } + @Override + public UserProfil findUserByEmail(String email) { + String sql = "SELECT * FROM UTILISATEURS WHERE email = ? AND isDelete = 0"; + UserProfil user = jdbcTemplate.queryForObject(sql, new UserRowMapper(), email); + return user; + } + @Override public List findAllUsernames() { String sql = "SELECT pseudo FROM UTILISATEURS WHERE isDelete = 0"; @@ -74,6 +82,18 @@ public class UserRepositoryImpl implements UserRepository { return email; } + @Override + public String findByEmail(String email) { + //Vérifie si un email existe dans la base et est valide + String sql = "SELECT email FROM UTILISATEURS WHERE isDisabled = 0 AND email = ?"; + try { + return jdbcTemplate.queryForObject(sql, new Object[]{email}, String.class); + } catch (EmptyResultDataAccessException e) { + // Aucun résultat trouvé, retourne null + return null; + } + } + @Override public List findAll() { String sql = "SELECT * FROM UTILISATEURS WHERE isDelete = 0"; diff --git a/src/main/java/fr/eni/enchere/security/WebSecurityConfig.java b/src/main/java/fr/eni/enchere/security/WebSecurityConfig.java index f1e366c..c48d70b 100644 --- a/src/main/java/fr/eni/enchere/security/WebSecurityConfig.java +++ b/src/main/java/fr/eni/enchere/security/WebSecurityConfig.java @@ -19,7 +19,7 @@ public class WebSecurityConfig{ @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((requests) -> requests - .requestMatchers("/","/accueil", "/login", "/inscription/**", "/searchArticle", "/article/show", "/change-language").permitAll() + .requestMatchers("/","/accueil", "/login", "/forgotPassword/**", "/inscription/**", "/searchArticle", "/article/show", "/change-language").permitAll() .requestMatchers("/css/**", "/images/**", "/assets/**", "/img/**", "/js/**", "/assets/**", "/i18n/**").permitAll() .requestMatchers("/profil/**", "/article/new/**", "/article/update", "/article/delete").authenticated() .requestMatchers("/admin").hasRole("ADMIN") diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 219e581..c493d38 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,15 @@ +spring.servlet.multipart.max-file-size=5MB spring.datasource.url=jdbc:mariadb://91.121.54.36:3306/eni_enchere spring.datasource.username=eni spring.datasource.password=Pa$$w0rd spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.messages.encoding=UTF-8 -server.port=8800 \ No newline at end of file +server.port=8800 +spring.mail.host=smtp.mail.ovh.net +spring.mail.port=465 +spring.mail.username=support@horya.fr +spring.mail.password=5AQyQR%zg3qDfnh +spring.mail.properties.mail.transport.protocol=smtp +spring.mail.properties.mail.smtp.port=465 +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.ssl.enable=true \ No newline at end of file diff --git a/src/main/resources/i18n/messages_en.properties b/src/main/resources/i18n/messages_en.properties index 55bde26..9df34e5 100644 --- a/src/main/resources/i18n/messages_en.properties +++ b/src/main/resources/i18n/messages_en.properties @@ -12,12 +12,17 @@ home.sell.finish = My completed sales home.button.search = Search home.button.lang = Passer en fran\u00E7ais home.button.lang2 = EN +home.button.first = First +home.button.end = End +home.button.next = Next +home.button.previous = Previous home.credit = My credits: home.nav.enchere = Auctions home.nav.vend = Sell an item home.nav.login = Register / Log in home.profil.profil = Profile home.profil.logout = Log out +home.profil.bank = Credit home.article.sellprice = Sale price: home.article.seller = Seller: home.article.end = End of auction: diff --git a/src/main/resources/i18n/messages_fr.properties b/src/main/resources/i18n/messages_fr.properties index 602209c..bb82d9f 100644 --- a/src/main/resources/i18n/messages_fr.properties +++ b/src/main/resources/i18n/messages_fr.properties @@ -12,15 +12,20 @@ home.sell.finish = Mes ventes termin\u00E9es home.button.search = Recherche home.button.lang = Switch to English home.button.lang2 = FR +home.button.first = D\u00e9but +home.button.end = Fin +home.button.next = Suivant +home.button.previous = Pr\u00e9cedent home.credit = Mes cr\u00e9dits : home.nav.enchere = Encheres home.nav.vend = Vendre un article home.nav.login = S'inscrire / Se connecter home.profil.profil = Profil home.profil.logout = D\u00e9connexion +home.profil.bank = Cr\u00e9diter home.article.sellprice = Prix de vente: home.article.seller = Vendeur: -home.article.end = Fin de l'ench\u00E8re: +home.article.end = Fin de l'ench\u00E8re: footer.desc = Cr\u00e9\u00e9e par l'association "Les objets sont nos amis", ENI-Ench\u00e9res a pour objectif d'aider ses membres \u00E0 vendre ou acheter des objets de tout genre. footer. diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index 1fc8f6f..5e6a048 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -30,3 +30,7 @@ .navbar-nav .nav-item.active .nav-link { color: white; } + +#container-main { + padding-bottom: 40px; +} diff --git a/src/main/resources/static/images/articles/1.jpg b/src/main/resources/static/images/articles/1.jpg new file mode 100644 index 0000000..13b7aa0 Binary files /dev/null and b/src/main/resources/static/images/articles/1.jpg differ diff --git a/src/main/resources/static/images/articles/10.jpg b/src/main/resources/static/images/articles/10.jpg new file mode 100644 index 0000000..a217b24 Binary files /dev/null and b/src/main/resources/static/images/articles/10.jpg differ diff --git a/src/main/resources/static/images/articles/100.jpg b/src/main/resources/static/images/articles/100.jpg new file mode 100644 index 0000000..cbabf97 Binary files /dev/null and b/src/main/resources/static/images/articles/100.jpg differ diff --git a/src/main/resources/static/images/articles/11.jpg b/src/main/resources/static/images/articles/11.jpg index e0c9e81..6e36332 100644 Binary files a/src/main/resources/static/images/articles/11.jpg and b/src/main/resources/static/images/articles/11.jpg differ diff --git a/src/main/resources/static/images/articles/12.jpg b/src/main/resources/static/images/articles/12.jpg index 73a0dfb..7497dd5 100644 Binary files a/src/main/resources/static/images/articles/12.jpg and b/src/main/resources/static/images/articles/12.jpg differ diff --git a/src/main/resources/static/images/articles/13.jpg b/src/main/resources/static/images/articles/13.jpg index 1877e01..5895895 100644 Binary files a/src/main/resources/static/images/articles/13.jpg and b/src/main/resources/static/images/articles/13.jpg differ diff --git a/src/main/resources/static/images/articles/14.jpg b/src/main/resources/static/images/articles/14.jpg index 9a7b54f..6648003 100644 Binary files a/src/main/resources/static/images/articles/14.jpg and b/src/main/resources/static/images/articles/14.jpg differ diff --git a/src/main/resources/static/images/articles/15.jpg b/src/main/resources/static/images/articles/15.jpg index 850c8e1..c1d061f 100644 Binary files a/src/main/resources/static/images/articles/15.jpg and b/src/main/resources/static/images/articles/15.jpg differ diff --git a/src/main/resources/static/images/articles/16.jpg b/src/main/resources/static/images/articles/16.jpg index ceae02c..e17969c 100644 Binary files a/src/main/resources/static/images/articles/16.jpg and b/src/main/resources/static/images/articles/16.jpg differ diff --git a/src/main/resources/static/images/articles/17.jpg b/src/main/resources/static/images/articles/17.jpg index 259c6ba..6c71105 100644 Binary files a/src/main/resources/static/images/articles/17.jpg and b/src/main/resources/static/images/articles/17.jpg differ diff --git a/src/main/resources/static/images/articles/18.jpg b/src/main/resources/static/images/articles/18.jpg index 744d455..0fe5edb 100644 Binary files a/src/main/resources/static/images/articles/18.jpg and b/src/main/resources/static/images/articles/18.jpg differ diff --git a/src/main/resources/static/images/articles/19.jpg b/src/main/resources/static/images/articles/19.jpg index c286b1d..e36546d 100644 Binary files a/src/main/resources/static/images/articles/19.jpg and b/src/main/resources/static/images/articles/19.jpg differ diff --git a/src/main/resources/static/images/articles/2.jpg b/src/main/resources/static/images/articles/2.jpg new file mode 100644 index 0000000..b4d49d7 Binary files /dev/null and b/src/main/resources/static/images/articles/2.jpg differ diff --git a/src/main/resources/static/images/articles/20.jpg b/src/main/resources/static/images/articles/20.jpg index 90d841d..7dac34e 100644 Binary files a/src/main/resources/static/images/articles/20.jpg and b/src/main/resources/static/images/articles/20.jpg differ diff --git a/src/main/resources/static/images/articles/21.jpg b/src/main/resources/static/images/articles/21.jpg index 60eb353..2396719 100644 Binary files a/src/main/resources/static/images/articles/21.jpg and b/src/main/resources/static/images/articles/21.jpg differ diff --git a/src/main/resources/static/images/articles/22.jpg b/src/main/resources/static/images/articles/22.jpg index 60eb353..fff3784 100644 Binary files a/src/main/resources/static/images/articles/22.jpg and b/src/main/resources/static/images/articles/22.jpg differ diff --git a/src/main/resources/static/images/articles/23.jpg b/src/main/resources/static/images/articles/23.jpg index 60eb353..c504f96 100644 Binary files a/src/main/resources/static/images/articles/23.jpg and b/src/main/resources/static/images/articles/23.jpg differ diff --git a/src/main/resources/static/images/articles/24.jpg b/src/main/resources/static/images/articles/24.jpg index 60eb353..cebf7a8 100644 Binary files a/src/main/resources/static/images/articles/24.jpg and b/src/main/resources/static/images/articles/24.jpg differ diff --git a/src/main/resources/static/images/articles/25.jpg b/src/main/resources/static/images/articles/25.jpg new file mode 100644 index 0000000..a51d858 Binary files /dev/null and b/src/main/resources/static/images/articles/25.jpg differ diff --git a/src/main/resources/static/images/articles/26.jpg b/src/main/resources/static/images/articles/26.jpg new file mode 100644 index 0000000..15446f9 Binary files /dev/null and b/src/main/resources/static/images/articles/26.jpg differ diff --git a/src/main/resources/static/images/articles/27.jpg b/src/main/resources/static/images/articles/27.jpg new file mode 100644 index 0000000..209d2b3 Binary files /dev/null and b/src/main/resources/static/images/articles/27.jpg differ diff --git a/src/main/resources/static/images/articles/28.jpg b/src/main/resources/static/images/articles/28.jpg new file mode 100644 index 0000000..c6fb893 Binary files /dev/null and b/src/main/resources/static/images/articles/28.jpg differ diff --git a/src/main/resources/static/images/articles/29.jpg b/src/main/resources/static/images/articles/29.jpg new file mode 100644 index 0000000..6961e77 Binary files /dev/null and b/src/main/resources/static/images/articles/29.jpg differ diff --git a/src/main/resources/static/images/articles/3.jpg b/src/main/resources/static/images/articles/3.jpg new file mode 100644 index 0000000..e9628f4 Binary files /dev/null and b/src/main/resources/static/images/articles/3.jpg differ diff --git a/src/main/resources/static/images/articles/30.jpg b/src/main/resources/static/images/articles/30.jpg new file mode 100644 index 0000000..69d35e5 Binary files /dev/null and b/src/main/resources/static/images/articles/30.jpg differ diff --git a/src/main/resources/static/images/articles/31.jpg b/src/main/resources/static/images/articles/31.jpg new file mode 100644 index 0000000..6db0959 Binary files /dev/null and b/src/main/resources/static/images/articles/31.jpg differ diff --git a/src/main/resources/static/images/articles/32.jpg b/src/main/resources/static/images/articles/32.jpg new file mode 100644 index 0000000..2261902 Binary files /dev/null and b/src/main/resources/static/images/articles/32.jpg differ diff --git a/src/main/resources/static/images/articles/33.jpg b/src/main/resources/static/images/articles/33.jpg new file mode 100644 index 0000000..f027253 Binary files /dev/null and b/src/main/resources/static/images/articles/33.jpg differ diff --git a/src/main/resources/static/images/articles/34.jpg b/src/main/resources/static/images/articles/34.jpg new file mode 100644 index 0000000..1e43f00 Binary files /dev/null and b/src/main/resources/static/images/articles/34.jpg differ diff --git a/src/main/resources/static/images/articles/35.jpg b/src/main/resources/static/images/articles/35.jpg new file mode 100644 index 0000000..1455946 Binary files /dev/null and b/src/main/resources/static/images/articles/35.jpg differ diff --git a/src/main/resources/static/images/articles/36.jpg b/src/main/resources/static/images/articles/36.jpg new file mode 100644 index 0000000..8e6b274 Binary files /dev/null and b/src/main/resources/static/images/articles/36.jpg differ diff --git a/src/main/resources/static/images/articles/37.jpg b/src/main/resources/static/images/articles/37.jpg new file mode 100644 index 0000000..c9e39ee Binary files /dev/null and b/src/main/resources/static/images/articles/37.jpg differ diff --git a/src/main/resources/static/images/articles/38.jpg b/src/main/resources/static/images/articles/38.jpg new file mode 100644 index 0000000..96a66aa Binary files /dev/null and b/src/main/resources/static/images/articles/38.jpg differ diff --git a/src/main/resources/static/images/articles/39.jpg b/src/main/resources/static/images/articles/39.jpg new file mode 100644 index 0000000..8230db8 Binary files /dev/null and b/src/main/resources/static/images/articles/39.jpg differ diff --git a/src/main/resources/static/images/articles/4.jpg b/src/main/resources/static/images/articles/4.jpg new file mode 100644 index 0000000..b14cc48 Binary files /dev/null and b/src/main/resources/static/images/articles/4.jpg differ diff --git a/src/main/resources/static/images/articles/40.jpg b/src/main/resources/static/images/articles/40.jpg new file mode 100644 index 0000000..8d49b8c Binary files /dev/null and b/src/main/resources/static/images/articles/40.jpg differ diff --git a/src/main/resources/static/images/articles/41.jpg b/src/main/resources/static/images/articles/41.jpg new file mode 100644 index 0000000..1a8c14c Binary files /dev/null and b/src/main/resources/static/images/articles/41.jpg differ diff --git a/src/main/resources/static/images/articles/42.jpg b/src/main/resources/static/images/articles/42.jpg new file mode 100644 index 0000000..9b6354b Binary files /dev/null and b/src/main/resources/static/images/articles/42.jpg differ diff --git a/src/main/resources/static/images/articles/43.jpg b/src/main/resources/static/images/articles/43.jpg new file mode 100644 index 0000000..eafca58 Binary files /dev/null and b/src/main/resources/static/images/articles/43.jpg differ diff --git a/src/main/resources/static/images/articles/44.jpg b/src/main/resources/static/images/articles/44.jpg new file mode 100644 index 0000000..eb54ef9 Binary files /dev/null and b/src/main/resources/static/images/articles/44.jpg differ diff --git a/src/main/resources/static/images/articles/45.jpg b/src/main/resources/static/images/articles/45.jpg new file mode 100644 index 0000000..dce1c0c Binary files /dev/null and b/src/main/resources/static/images/articles/45.jpg differ diff --git a/src/main/resources/static/images/articles/46.jpg b/src/main/resources/static/images/articles/46.jpg new file mode 100644 index 0000000..bc1c506 Binary files /dev/null and b/src/main/resources/static/images/articles/46.jpg differ diff --git a/src/main/resources/static/images/articles/47.jpg b/src/main/resources/static/images/articles/47.jpg new file mode 100644 index 0000000..37f86b0 Binary files /dev/null and b/src/main/resources/static/images/articles/47.jpg differ diff --git a/src/main/resources/static/images/articles/48.jpg b/src/main/resources/static/images/articles/48.jpg new file mode 100644 index 0000000..c0438af Binary files /dev/null and b/src/main/resources/static/images/articles/48.jpg differ diff --git a/src/main/resources/static/images/articles/49.jpg b/src/main/resources/static/images/articles/49.jpg new file mode 100644 index 0000000..702f857 Binary files /dev/null and b/src/main/resources/static/images/articles/49.jpg differ diff --git a/src/main/resources/static/images/articles/5.jpg b/src/main/resources/static/images/articles/5.jpg new file mode 100644 index 0000000..b09012f Binary files /dev/null and b/src/main/resources/static/images/articles/5.jpg differ diff --git a/src/main/resources/static/images/articles/50.jpg b/src/main/resources/static/images/articles/50.jpg new file mode 100644 index 0000000..79b0826 Binary files /dev/null and b/src/main/resources/static/images/articles/50.jpg differ diff --git a/src/main/resources/static/images/articles/51.jpg b/src/main/resources/static/images/articles/51.jpg new file mode 100644 index 0000000..9f1e08a Binary files /dev/null and b/src/main/resources/static/images/articles/51.jpg differ diff --git a/src/main/resources/static/images/articles/52.jpg b/src/main/resources/static/images/articles/52.jpg new file mode 100644 index 0000000..5c8ceb5 Binary files /dev/null and b/src/main/resources/static/images/articles/52.jpg differ diff --git a/src/main/resources/static/images/articles/53.jpg b/src/main/resources/static/images/articles/53.jpg new file mode 100644 index 0000000..54af4ae Binary files /dev/null and b/src/main/resources/static/images/articles/53.jpg differ diff --git a/src/main/resources/static/images/articles/54.jpg b/src/main/resources/static/images/articles/54.jpg new file mode 100644 index 0000000..97ac435 Binary files /dev/null and b/src/main/resources/static/images/articles/54.jpg differ diff --git a/src/main/resources/static/images/articles/55.jpg b/src/main/resources/static/images/articles/55.jpg new file mode 100644 index 0000000..635d7ac Binary files /dev/null and b/src/main/resources/static/images/articles/55.jpg differ diff --git a/src/main/resources/static/images/articles/56.jpg b/src/main/resources/static/images/articles/56.jpg new file mode 100644 index 0000000..6bfe35f Binary files /dev/null and b/src/main/resources/static/images/articles/56.jpg differ diff --git a/src/main/resources/static/images/articles/57.jpg b/src/main/resources/static/images/articles/57.jpg new file mode 100644 index 0000000..a8717ac Binary files /dev/null and b/src/main/resources/static/images/articles/57.jpg differ diff --git a/src/main/resources/static/images/articles/58.jpg b/src/main/resources/static/images/articles/58.jpg new file mode 100644 index 0000000..a2da26e Binary files /dev/null and b/src/main/resources/static/images/articles/58.jpg differ diff --git a/src/main/resources/static/images/articles/59.jpg b/src/main/resources/static/images/articles/59.jpg new file mode 100644 index 0000000..40b3877 Binary files /dev/null and b/src/main/resources/static/images/articles/59.jpg differ diff --git a/src/main/resources/static/images/articles/6.jpg b/src/main/resources/static/images/articles/6.jpg new file mode 100644 index 0000000..1810cd7 Binary files /dev/null and b/src/main/resources/static/images/articles/6.jpg differ diff --git a/src/main/resources/static/images/articles/60.jpg b/src/main/resources/static/images/articles/60.jpg new file mode 100644 index 0000000..ee852da Binary files /dev/null and b/src/main/resources/static/images/articles/60.jpg differ diff --git a/src/main/resources/static/images/articles/61.jpg b/src/main/resources/static/images/articles/61.jpg new file mode 100644 index 0000000..c844afb Binary files /dev/null and b/src/main/resources/static/images/articles/61.jpg differ diff --git a/src/main/resources/static/images/articles/62.jpg b/src/main/resources/static/images/articles/62.jpg new file mode 100644 index 0000000..ca81276 Binary files /dev/null and b/src/main/resources/static/images/articles/62.jpg differ diff --git a/src/main/resources/static/images/articles/63.jpg b/src/main/resources/static/images/articles/63.jpg new file mode 100644 index 0000000..23b2edc Binary files /dev/null and b/src/main/resources/static/images/articles/63.jpg differ diff --git a/src/main/resources/static/images/articles/64.jpg b/src/main/resources/static/images/articles/64.jpg new file mode 100644 index 0000000..4f6147e Binary files /dev/null and b/src/main/resources/static/images/articles/64.jpg differ diff --git a/src/main/resources/static/images/articles/65.jpg b/src/main/resources/static/images/articles/65.jpg new file mode 100644 index 0000000..2a847e7 Binary files /dev/null and b/src/main/resources/static/images/articles/65.jpg differ diff --git a/src/main/resources/static/images/articles/66.jpg b/src/main/resources/static/images/articles/66.jpg new file mode 100644 index 0000000..b191738 Binary files /dev/null and b/src/main/resources/static/images/articles/66.jpg differ diff --git a/src/main/resources/static/images/articles/67.jpg b/src/main/resources/static/images/articles/67.jpg new file mode 100644 index 0000000..e6aaad2 Binary files /dev/null and b/src/main/resources/static/images/articles/67.jpg differ diff --git a/src/main/resources/static/images/articles/68.jpg b/src/main/resources/static/images/articles/68.jpg new file mode 100644 index 0000000..39a45f2 Binary files /dev/null and b/src/main/resources/static/images/articles/68.jpg differ diff --git a/src/main/resources/static/images/articles/69.jpg b/src/main/resources/static/images/articles/69.jpg new file mode 100644 index 0000000..f877b84 Binary files /dev/null and b/src/main/resources/static/images/articles/69.jpg differ diff --git a/src/main/resources/static/images/articles/7.jpg b/src/main/resources/static/images/articles/7.jpg new file mode 100644 index 0000000..ccc2f86 Binary files /dev/null and b/src/main/resources/static/images/articles/7.jpg differ diff --git a/src/main/resources/static/images/articles/70.jpg b/src/main/resources/static/images/articles/70.jpg new file mode 100644 index 0000000..021c517 Binary files /dev/null and b/src/main/resources/static/images/articles/70.jpg differ diff --git a/src/main/resources/static/images/articles/71.jpg b/src/main/resources/static/images/articles/71.jpg new file mode 100644 index 0000000..0dae32d Binary files /dev/null and b/src/main/resources/static/images/articles/71.jpg differ diff --git a/src/main/resources/static/images/articles/72.jpg b/src/main/resources/static/images/articles/72.jpg new file mode 100644 index 0000000..33de5cf Binary files /dev/null and b/src/main/resources/static/images/articles/72.jpg differ diff --git a/src/main/resources/static/images/articles/73.jpg b/src/main/resources/static/images/articles/73.jpg new file mode 100644 index 0000000..34a90af Binary files /dev/null and b/src/main/resources/static/images/articles/73.jpg differ diff --git a/src/main/resources/static/images/articles/74.jpg b/src/main/resources/static/images/articles/74.jpg new file mode 100644 index 0000000..9c83fca Binary files /dev/null and b/src/main/resources/static/images/articles/74.jpg differ diff --git a/src/main/resources/static/images/articles/75.jpg b/src/main/resources/static/images/articles/75.jpg new file mode 100644 index 0000000..910c2a5 Binary files /dev/null and b/src/main/resources/static/images/articles/75.jpg differ diff --git a/src/main/resources/static/images/articles/76.jpg b/src/main/resources/static/images/articles/76.jpg new file mode 100644 index 0000000..b36a4b0 Binary files /dev/null and b/src/main/resources/static/images/articles/76.jpg differ diff --git a/src/main/resources/static/images/articles/77.jpg b/src/main/resources/static/images/articles/77.jpg new file mode 100644 index 0000000..df78458 Binary files /dev/null and b/src/main/resources/static/images/articles/77.jpg differ diff --git a/src/main/resources/static/images/articles/78.jpg b/src/main/resources/static/images/articles/78.jpg new file mode 100644 index 0000000..e39e4ad Binary files /dev/null and b/src/main/resources/static/images/articles/78.jpg differ diff --git a/src/main/resources/static/images/articles/79.jpg b/src/main/resources/static/images/articles/79.jpg new file mode 100644 index 0000000..4db61cb Binary files /dev/null and b/src/main/resources/static/images/articles/79.jpg differ diff --git a/src/main/resources/static/images/articles/8.jpg b/src/main/resources/static/images/articles/8.jpg new file mode 100644 index 0000000..7fd3dba Binary files /dev/null and b/src/main/resources/static/images/articles/8.jpg differ diff --git a/src/main/resources/static/images/articles/80.jpg b/src/main/resources/static/images/articles/80.jpg new file mode 100644 index 0000000..0ac4adf Binary files /dev/null and b/src/main/resources/static/images/articles/80.jpg differ diff --git a/src/main/resources/static/images/articles/81.jpg b/src/main/resources/static/images/articles/81.jpg new file mode 100644 index 0000000..fd4a9b1 Binary files /dev/null and b/src/main/resources/static/images/articles/81.jpg differ diff --git a/src/main/resources/static/images/articles/82.jpg b/src/main/resources/static/images/articles/82.jpg new file mode 100644 index 0000000..cc2bf72 Binary files /dev/null and b/src/main/resources/static/images/articles/82.jpg differ diff --git a/src/main/resources/static/images/articles/83.jpg b/src/main/resources/static/images/articles/83.jpg new file mode 100644 index 0000000..7248487 Binary files /dev/null and b/src/main/resources/static/images/articles/83.jpg differ diff --git a/src/main/resources/static/images/articles/84.jpg b/src/main/resources/static/images/articles/84.jpg new file mode 100644 index 0000000..6c26f37 Binary files /dev/null and b/src/main/resources/static/images/articles/84.jpg differ diff --git a/src/main/resources/static/images/articles/85.jpg b/src/main/resources/static/images/articles/85.jpg new file mode 100644 index 0000000..cfd413f Binary files /dev/null and b/src/main/resources/static/images/articles/85.jpg differ diff --git a/src/main/resources/static/images/articles/86.jpg b/src/main/resources/static/images/articles/86.jpg new file mode 100644 index 0000000..27f2c01 Binary files /dev/null and b/src/main/resources/static/images/articles/86.jpg differ diff --git a/src/main/resources/static/images/articles/87.jpg b/src/main/resources/static/images/articles/87.jpg new file mode 100644 index 0000000..a7c7337 Binary files /dev/null and b/src/main/resources/static/images/articles/87.jpg differ diff --git a/src/main/resources/static/images/articles/88.jpg b/src/main/resources/static/images/articles/88.jpg new file mode 100644 index 0000000..cbe2c3d Binary files /dev/null and b/src/main/resources/static/images/articles/88.jpg differ diff --git a/src/main/resources/static/images/articles/89.jpg b/src/main/resources/static/images/articles/89.jpg new file mode 100644 index 0000000..8ba1730 Binary files /dev/null and b/src/main/resources/static/images/articles/89.jpg differ diff --git a/src/main/resources/static/images/articles/9.jpg b/src/main/resources/static/images/articles/9.jpg new file mode 100644 index 0000000..20ed704 Binary files /dev/null and b/src/main/resources/static/images/articles/9.jpg differ diff --git a/src/main/resources/static/images/articles/90.jpg b/src/main/resources/static/images/articles/90.jpg new file mode 100644 index 0000000..c7e22c9 Binary files /dev/null and b/src/main/resources/static/images/articles/90.jpg differ diff --git a/src/main/resources/static/images/articles/91.jpg b/src/main/resources/static/images/articles/91.jpg new file mode 100644 index 0000000..47cacd4 Binary files /dev/null and b/src/main/resources/static/images/articles/91.jpg differ diff --git a/src/main/resources/static/images/articles/92.jpg b/src/main/resources/static/images/articles/92.jpg new file mode 100644 index 0000000..52bec4a Binary files /dev/null and b/src/main/resources/static/images/articles/92.jpg differ diff --git a/src/main/resources/static/images/articles/93.jpg b/src/main/resources/static/images/articles/93.jpg new file mode 100644 index 0000000..2a0ef45 Binary files /dev/null and b/src/main/resources/static/images/articles/93.jpg differ diff --git a/src/main/resources/static/images/articles/94.jpg b/src/main/resources/static/images/articles/94.jpg new file mode 100644 index 0000000..740ea03 Binary files /dev/null and b/src/main/resources/static/images/articles/94.jpg differ diff --git a/src/main/resources/static/images/articles/95.jpg b/src/main/resources/static/images/articles/95.jpg new file mode 100644 index 0000000..85f57f4 Binary files /dev/null and b/src/main/resources/static/images/articles/95.jpg differ diff --git a/src/main/resources/static/images/articles/96.jpg b/src/main/resources/static/images/articles/96.jpg new file mode 100644 index 0000000..bcc7a21 Binary files /dev/null and b/src/main/resources/static/images/articles/96.jpg differ diff --git a/src/main/resources/static/images/articles/97.jpg b/src/main/resources/static/images/articles/97.jpg new file mode 100644 index 0000000..64adcf2 Binary files /dev/null and b/src/main/resources/static/images/articles/97.jpg differ diff --git a/src/main/resources/static/images/articles/98.jpg b/src/main/resources/static/images/articles/98.jpg new file mode 100644 index 0000000..412b641 Binary files /dev/null and b/src/main/resources/static/images/articles/98.jpg differ diff --git a/src/main/resources/static/images/articles/99.jpg b/src/main/resources/static/images/articles/99.jpg new file mode 100644 index 0000000..224f1f5 Binary files /dev/null and b/src/main/resources/static/images/articles/99.jpg differ diff --git a/src/main/resources/templates/accueil.html b/src/main/resources/templates/accueil.html index 00ee2bc..9edeabf 100644 --- a/src/main/resources/templates/accueil.html +++ b/src/main/resources/templates/accueil.html @@ -143,6 +143,54 @@ + +
+
+ +
+
diff --git a/src/main/resources/templates/admin.html b/src/main/resources/templates/admin.html index d43feae..8f21436 100644 --- a/src/main/resources/templates/admin.html +++ b/src/main/resources/templates/admin.html @@ -5,57 +5,54 @@ -
-

Liste des catégories modifiées

- - - - - - - - - - - - - -
NomAction
-
- - - -
-
-
- - -
-
-
- - +
+

Liste des catégories modifiées

+
+ + + + + + + + + + + + + +
NomAction
+ + + + + + +
+ + +
+
+
+
+ +
-

Liste des utilisateurs

- - - - - - - - - - - - - - - - - - - + +

Liste des utilisateurs

+
+
IDPseudoNomPrénomEmailAction
+ + + + + + + + + + + @@ -64,31 +61,31 @@ - -
IDPseudoNomPrénomEmailAction
- + - +
- +
- +
- +
- + + +
diff --git a/src/main/resources/templates/article.html b/src/main/resources/templates/article.html index 74391d6..6a7e67e 100644 --- a/src/main/resources/templates/article.html +++ b/src/main/resources/templates/article.html @@ -4,9 +4,9 @@ -
-
-
+
+
+

@@ -46,7 +46,7 @@
-
+ @@ -57,10 +57,7 @@
-
- - -
+
diff --git a/src/main/resources/templates/bank.html b/src/main/resources/templates/bank.html new file mode 100644 index 0000000..b0c4d12 --- /dev/null +++ b/src/main/resources/templates/bank.html @@ -0,0 +1,93 @@ + + + + + + + +
+

Nouvelle vente

+
+
+ + +
Ce champ est requis.
+
+ +
+ + +
Ce champ est requis.
+
+ +
+ + +
Veuillez sélectionner une catégorie.
+
+ +
+ + +
+ +
+ + +
Ce champ est requis.
+
+ +
+ + +
Ce champ est requis.
+
+ +
+ + +
Ce champ est requis.
+
+ +

Retrait

+
+ + +
Ce champ est requis.
+
+
+ + +
Ce champ est requis.
+
+
+ + +
Ce champ est requis.
+
+ + + +
+

+
+
+
+ +
+ +
+ + + + diff --git a/src/main/resources/templates/modele-page.html b/src/main/resources/templates/modele-page.html index fc45ee0..d235d72 100644 --- a/src/main/resources/templates/modele-page.html +++ b/src/main/resources/templates/modele-page.html @@ -45,6 +45,8 @@
@@ -35,6 +35,9 @@
Vous avez été déconnecté
+
+ Vous devez entrée une adresse mail valide ! +