From a3ed375fe055cefb36be1a941e7e8424d932c9db Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Wed, 16 Nov 2022 22:45:42 +0700 Subject: [PATCH 1/8] feat: add dokter(http://localhost:8080/user/add/dokter) dan add apoteker(http://localhost:8080/user/add/apoteker) no tombol no list --- .../manage/controller/ManageController.java | 79 +++++++++++++++++++ .../manage/repository/ApotekerDb.java | 8 ++ .../manage/service/ApotekerService.java | 16 ++++ .../manage/service/ApotekerServiceImpl.java | 43 ++++++++++ .../manage/service/UserService.java | 14 ++++ .../manage/service/UserServiceImpl.java | 44 +++++++++++ .../templates/manage/form-add-apoteker.html | 40 ++++++++++ .../templates/manage/form-add-dokter.html | 43 ++++++++++ .../templates/manage/list-dokter.html | 10 +++ 9 files changed, 297 insertions(+) create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/repository/ApotekerDb.java create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerService.java create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerServiceImpl.java create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserService.java create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserServiceImpl.java create mode 100644 SpringTkApap/src/main/resources/templates/manage/form-add-apoteker.html create mode 100644 SpringTkApap/src/main/resources/templates/manage/form-add-dokter.html create mode 100644 SpringTkApap/src/main/resources/templates/manage/list-dokter.html diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java new file mode 100644 index 0000000..7eaa831 --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -0,0 +1,79 @@ +package spring.TK.SpringTkApap.manage.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import spring.TK.SpringTkApap.auth.model.RolesEnum; +import spring.TK.SpringTkApap.auth.model.UserModel; +import spring.TK.SpringTkApap.manage.service.ApotekerService; +import spring.TK.SpringTkApap.manage.service.UserService; +import spring.TK.SpringTkApap.user.model.ApotekerModel; +import spring.TK.SpringTkApap.user.model.DokterModel; +import spring.TK.SpringTkApap.user.service.DokterService; + +import java.util.ArrayList; +import java.util.List; + +@Controller +@RequestMapping("/user") +public class ManageController { + + @Autowired + private UserService userService; + + @Autowired + private DokterService dokterService; + + @Autowired + private ApotekerService apotekerService; + + @GetMapping(value="/add/dokter") + private String addDokterFormPage(Model model){ + DokterModel user = new DokterModel(); + List<Enum> listRole = new ArrayList<>(); + listRole.add(RolesEnum.DOKTER); + model.addAttribute("user",user); + model.addAttribute("listRole",listRole); + return "manage/form-add-dokter"; + } + + @PostMapping(value="/add/dokter") + private String addDokterSubmit(@ModelAttribute DokterModel user, Model model){ + dokterService.addDokter(user); + model.addAttribute("user",user); + return "redirect:/"; + } + @GetMapping(value="/add/apoteker") + private String addApotekerFormPage(Model model){ + ApotekerModel user = new ApotekerModel(); + user.setListResep(new ArrayList<>()); + List<Enum> listRole = new ArrayList<>(); + listRole.add(RolesEnum.APOTEKER); + model.addAttribute("user",user); + model.addAttribute("listRole",listRole); + return "manage/form-add-apoteker"; + } + @PostMapping(value="/add/apoteker") + private String addApotekerSubmit(@ModelAttribute ApotekerModel user, Model model){ + apotekerService.addApoteker(user); + model.addAttribute("user",user); + return "redirect:/"; + } + @GetMapping("/viewall") + public String listUser(Model model) { + List<UserModel> listUser = userService.getListUser(); + model.addAttribute("listUser", listUser); + model.addAttribute("onPage",2); + return "viewall-user"; + } + @GetMapping("/delete/{username}") + public String deleteCourse(@PathVariable String username, Model model){ + UserModel user = userService.getUserByUsername(username); + + userService.deleteUser(user); + return "home/home"; + + + } +} diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/repository/ApotekerDb.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/repository/ApotekerDb.java new file mode 100644 index 0000000..c9823b6 --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/repository/ApotekerDb.java @@ -0,0 +1,8 @@ +package spring.TK.SpringTkApap.manage.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import spring.TK.SpringTkApap.user.model.ApotekerModel; + + +public interface ApotekerDb extends JpaRepository<ApotekerModel, String> { +} diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerService.java new file mode 100644 index 0000000..ede9398 --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerService.java @@ -0,0 +1,16 @@ +package spring.TK.SpringTkApap.manage.service; + +import spring.TK.SpringTkApap.user.model.ApotekerModel; + + +import java.util.List; + +public interface ApotekerService { + ApotekerModel addApoteker(ApotekerModel apoteker); + + List<ApotekerModel> getAll(); + + ApotekerModel getApoteker(String uuid); + + void deleteApoteker(ApotekerModel apoteker); +} diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerServiceImpl.java new file mode 100644 index 0000000..9cca35d --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/ApotekerServiceImpl.java @@ -0,0 +1,43 @@ +package spring.TK.SpringTkApap.manage.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import spring.TK.SpringTkApap.manage.repository.ApotekerDb; +import spring.TK.SpringTkApap.user.model.ApotekerModel; +import spring.TK.SpringTkApap.user.model.DokterModel; +import spring.TK.SpringTkApap.user.repository.DokterDB; +import spring.TK.SpringTkApap.user.service.DokterService; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; + +@Service +@Transactional +public class ApotekerServiceImpl implements ApotekerService { + + @Autowired + ApotekerDb apotekerDb; + + @Override + public ApotekerModel addApoteker(ApotekerModel apoteker) { + apotekerDb.save(apoteker); + return null; + } + + @Override + public List<ApotekerModel> getAll() { + return apotekerDb.findAll(); + } + + @Override + public ApotekerModel getApoteker(String uuid) { + Optional<ApotekerModel> apoteker = apotekerDb.findById(uuid); + return apoteker.orElse(null); + } + + @Override + public void deleteApoteker(ApotekerModel apoteker) { + apotekerDb.delete(apoteker); + } +} diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserService.java new file mode 100644 index 0000000..a112aca --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserService.java @@ -0,0 +1,14 @@ +package spring.TK.SpringTkApap.manage.service; + +import spring.TK.SpringTkApap.auth.model.UserModel; + +import java.util.List; + +public interface UserService { + UserModel addUser(UserModel user); + public String encrypt(String password); + + UserModel getUserByUsername (String username); + void deleteUser(UserModel user); + List<UserModel> getListUser(); +} diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserServiceImpl.java new file mode 100644 index 0000000..5d2ed35 --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/service/UserServiceImpl.java @@ -0,0 +1,44 @@ +package spring.TK.SpringTkApap.manage.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import spring.TK.SpringTkApap.auth.model.UserModel; +import spring.TK.SpringTkApap.auth.repository.UserDb; + +import java.util.List; + +@Service +public class UserServiceImpl implements UserService{ + @Autowired + private UserDb userDb; + + @Override + public UserModel addUser(UserModel user){ + String pass = encrypt(user.getPassword()); + user.setPassword(pass); + return userDb.save(user); + } + + @Override + public String encrypt(String password){ + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + String hashedPassword = passwordEncoder.encode(password); + return hashedPassword; + } + @Override + public UserModel getUserByUsername (String username){ + UserModel user = userDb.findByUsername(username); + return user; + } + @Override + public void deleteUser(UserModel user){ + userDb.delete(user); + } + @Override + public List<UserModel> getListUser() { + return userDb.findAll(); + } + + +} diff --git a/SpringTkApap/src/main/resources/templates/manage/form-add-apoteker.html b/SpringTkApap/src/main/resources/templates/manage/form-add-apoteker.html new file mode 100644 index 0000000..84c95d2 --- /dev/null +++ b/SpringTkApap/src/main/resources/templates/manage/form-add-apoteker.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <title>Tambah User</title> + <object th:include="fragments/fragment :: css" th:remove="tag"></object> + <object th:include="fragments/fragment :: js" th:remove="tag"></object> +</head> +<body> +<div class = "container"> + <div class="card m-4 p-4"> + <div class="card-body"> + <div class="justify-content-center"> <h2>Tambah User Baru</h2> + <br> + <form th:action="@{/user/add/apoteker}" th:object="${user}" method="POST"> + <label>Username</label> + <input type="text" name="username" class="form-control"/> + <label>Nama</label> + <input type="text" name="nama" class="form-control"/> + <label>E-mail</label> + <input type="text" name="email" class="form-control"/> + <label>Password</label> + <input type="text" name="password" class="form-control"/> + <label>Role</label> + <select name="role" class="form-control"> + <option selected value="">--Pilih Role--</option> + <option th:each="role : ${listRole}" + th:value="${role}" + th:text="${role}"> + </option> + </select> + <br> + <button type="submit" class="btn btn-primary">Submit</button> + <a class="btn btn-link" href="/">Home</a> + </form> + </div> + </div> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/SpringTkApap/src/main/resources/templates/manage/form-add-dokter.html b/SpringTkApap/src/main/resources/templates/manage/form-add-dokter.html new file mode 100644 index 0000000..0e312ae --- /dev/null +++ b/SpringTkApap/src/main/resources/templates/manage/form-add-dokter.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <title>Tambah User</title> + <object th:include="fragments/fragment :: css" th:remove="tag"></object> + <object th:include="fragments/fragment :: js" th:remove="tag"></object> +</head> +<body> +<div class = "container"> + <div class="card m-4 p-4"> + <div class="card-body"> + <div class="justify-content-center"> <h2>Tambah User Baru</h2> + <br> + <form th:action="@{/user/add/dokter}" th:object="${user}" method="POST"> + <label>Username</label> + <input type="text" name="username" class="form-control"/> + <label>Nama</label> + <input type="text" name="nama" class="form-control"/> + <label>E-mail</label> + <input type="text" name="email" class="form-control"/> + <label>Password</label> + <input type="text" name="password" class="form-control"/> + <label>Role</label> + <select name="role" class="form-control"> + <option selected value="">--Pilih Role--</option> + <option th:each="role : ${listRole}" + th:value="${role}" + th:text="${role}"> + </option> + </select> + <br> + <label>tarif</label> + <input type="text" name="tarif" class="form-control"/> + <br> + <button type="submit" class="btn btn-primary">Submit</button> + <a class="btn btn-link" href="/">Home</a> + </form> + </div> + </div> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/SpringTkApap/src/main/resources/templates/manage/list-dokter.html b/SpringTkApap/src/main/resources/templates/manage/list-dokter.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/SpringTkApap/src/main/resources/templates/manage/list-dokter.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Title</title> +</head> +<body> + +</body> +</html> \ No newline at end of file -- GitLab From 828a7e8b76d4ce530ff01670618f4e35977abc02 Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Tue, 29 Nov 2022 17:00:14 +0700 Subject: [PATCH 2/8] jangan di push yang ini --- .../auth/security/WebSecurityConfig.java | 2 + .../manage/controller/ManageController.java | 23 ++++++- .../resources/static/img/user_management.png | Bin 0 -> 28554 bytes .../templates/manage/list-dokter.html | 10 --- .../templates/manage/viewall-user.html | 57 ++++++++++++++++++ 5 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 SpringTkApap/src/main/resources/static/img/user_management.png delete mode 100644 SpringTkApap/src/main/resources/templates/manage/list-dokter.html create mode 100644 SpringTkApap/src/main/resources/templates/manage/viewall-user.html diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java index cdf9c3e..2a8a9f9 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java @@ -43,6 +43,8 @@ public class WebSecurityConfig { .antMatchers("/logout-sso").permitAll() .antMatchers("/obat/viewall").hasAnyAuthority("APOTEKER", "ADMIN") .antMatchers("/obat/update/**").hasAuthority("APOTEKER") + .antMatchers("/user/add/**").hasAuthority("ADMIN") + .antMatchers("/user/delete/**").hasAuthority("ADMIN") .anyRequest().authenticated() .and( ) .formLogin() diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java index 7eaa831..bb108fb 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -9,6 +9,7 @@ import spring.TK.SpringTkApap.auth.model.UserModel; import spring.TK.SpringTkApap.manage.service.ApotekerService; import spring.TK.SpringTkApap.manage.service.UserService; import spring.TK.SpringTkApap.user.model.ApotekerModel; +import spring.TK.SpringTkApap.user.model.DokterDTO; import spring.TK.SpringTkApap.user.model.DokterModel; import spring.TK.SpringTkApap.user.service.DokterService; @@ -40,6 +41,7 @@ public class ManageController { @PostMapping(value="/add/dokter") private String addDokterSubmit(@ModelAttribute DokterModel user, Model model){ + user.setPassword(userService.encrypt(user.getPassword())); dokterService.addDokter(user); model.addAttribute("user",user); return "redirect:/"; @@ -56,16 +58,31 @@ public class ManageController { } @PostMapping(value="/add/apoteker") private String addApotekerSubmit(@ModelAttribute ApotekerModel user, Model model){ + user.setPassword(userService.encrypt(user.getPassword())); apotekerService.addApoteker(user); model.addAttribute("user",user); return "redirect:/"; } - @GetMapping("/viewall") - public String listUser(Model model) { + @GetMapping("/viewall/pasien") + public String listPasien(Model model) { List<UserModel> listUser = userService.getListUser(); model.addAttribute("listUser", listUser); + model.addAttribute("onPage",1); + return "manage/viewall-user"; + } + @GetMapping("/viewall/dokter") + public String listDokter(Model model) { + List<DokterDTO> listUser = dokterService.getAll(); + model.addAttribute("listUser", listUser); model.addAttribute("onPage",2); - return "viewall-user"; + return "manage/viewall-user"; + } + @GetMapping("/viewall/apoteker") + public String listApoteker(Model model) { + List<UserModel> listUser = userService.getListUser(); + model.addAttribute("listUser", listUser); + model.addAttribute("onPage",3); + return "manage/viewall-user"; } @GetMapping("/delete/{username}") public String deleteCourse(@PathVariable String username, Model model){ diff --git a/SpringTkApap/src/main/resources/static/img/user_management.png b/SpringTkApap/src/main/resources/static/img/user_management.png new file mode 100644 index 0000000000000000000000000000000000000000..284439438f95c16bc7f9932b5afa0015cd4d99b9 GIT binary patch literal 28554 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%0DpqKH}$pEGWFH?jAR_KLir%(5n`V_T^ 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 Z2Tj?n!@03LlYxPO!PC{xWt~$(698Q{2!;Rv literal 0 HcmV?d00001 diff --git a/SpringTkApap/src/main/resources/templates/manage/list-dokter.html b/SpringTkApap/src/main/resources/templates/manage/list-dokter.html deleted file mode 100644 index 566549b..0000000 --- a/SpringTkApap/src/main/resources/templates/manage/list-dokter.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>Title</title> -</head> -<body> - -</body> -</html> \ No newline at end of file diff --git a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html new file mode 100644 index 0000000..308e0e6 --- /dev/null +++ b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://thymeleaf.org"> +<head> + <title>BelajarBelajar</title> + <object th:include="fragments/fragment :: css" th:remove="tag"></object> + <object th:include="fragments/fragment :: js" th:remove="tag"></object> +</head> +<body> +<nav th:replace="fragments/fragment :: navbar"></nav> +<div class="container"> + <div class="card m-4 p-4"> + <div class="card-body"> + <div class="justify-content-center"> + <h2>List Course</h2> + <h2><a class="btn btn-primary" href="/">Beranda</a> + <div class="my-3 d-flex justify-content-left"> + <a th:href="@{/user/add}" class="mx-2 btn btn-outline-success">Tambah User Baru</a> + </div> + </h2> + <br> + <table class="table"> + <thead> + <tr> + <th class="text-center">No</th> + <th class="text-center">username</th> + <th class="text-center">role</th> + </tr> + </thead> + <tbody> + <tr th:each="user, iterationStatus : ${listUser}" + th:style="${iterationStatus.even} ? 'font-weight:bold;'"> + <td th:text="${iterationStatus.count}"></td> + <td th:text="${user.nama}"></td> + <td th:text="${user.username}"></td> + <div th:if="*{onPage == 1}"> + <td th:text="to be added"></td> + </div> + <div th:if="*{onPage == 2}"> + <td th:text="${user.tarif}"></td> + </div> + <td> + <div class="col"> + <a class="btn btn-danger" th:href="@{/}">Update Password(to be added maybe)</a> + <a class="btn btn-dark" th:href="@{/user/delete/} + ${user.username}">Delete user</a> + </div> + </td> + </tr> + </tbody> + </table> + <br> + </div> + </div> + </div> +</div> + +</body> +</html> \ No newline at end of file -- GitLab From b99b14395515ad70830a1fe10cc0fb3c9bb647e3 Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Thu, 1 Dec 2022 22:15:08 +0700 Subject: [PATCH 3/8] test --- .../java/spring/TK/SpringTkApap/auth/setting/Setting.java | 2 +- .../TK/SpringTkApap/manage/controller/ManageController.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java index bb285ca..718a96e 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java @@ -1,7 +1,7 @@ package spring.TK.SpringTkApap.auth.setting; public class Setting { - final public static String CLIENT_BASE_URL = "https://apap-053.cs.ui.ac.id"; + final public static String CLIENT_BASE_URL = "http://localhost:8080"; final public static String CLIENT_LOGIN = CLIENT_BASE_URL + "/validate-ticket"; diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java index bb108fb..35e3555 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -65,7 +65,7 @@ public class ManageController { } @GetMapping("/viewall/pasien") public String listPasien(Model model) { - List<UserModel> listUser = userService.getListUser(); + List<UserModel> listUser = userService.getListUser();//masih blm selesai model.addAttribute("listUser", listUser); model.addAttribute("onPage",1); return "manage/viewall-user"; @@ -79,7 +79,7 @@ public class ManageController { } @GetMapping("/viewall/apoteker") public String listApoteker(Model model) { - List<UserModel> listUser = userService.getListUser(); + List<ApotekerModel> listUser = apotekerService.getAll(); model.addAttribute("listUser", listUser); model.addAttribute("onPage",3); return "manage/viewall-user"; -- GitLab From 5098cf70d4678f4b979d10fddb938aa3cfff5d63 Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Thu, 1 Dec 2022 23:38:21 +0700 Subject: [PATCH 4/8] feat: udh bisa add dan delete user di page managemen user, password sudah encrypt --- .../manage/controller/ManageController.java | 6 ++++-- .../main/resources/templates/home/home.html | 13 ++++++++++++ .../templates/manage/viewall-user.html | 20 +++++++++++-------- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java index 35e3555..1a58bc0 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -87,9 +87,11 @@ public class ManageController { @GetMapping("/delete/{username}") public String deleteCourse(@PathVariable String username, Model model){ UserModel user = userService.getUserByUsername(username); - userService.deleteUser(user); - return "home/home"; + List<UserModel> listUser = userService.getListUser();//masih blm selesai + model.addAttribute("listUser", listUser); + model.addAttribute("onPage",1); + return "manage/viewall-user"; } diff --git a/SpringTkApap/src/main/resources/templates/home/home.html b/SpringTkApap/src/main/resources/templates/home/home.html index 6d4e2f9..7e6a6b0 100644 --- a/SpringTkApap/src/main/resources/templates/home/home.html +++ b/SpringTkApap/src/main/resources/templates/home/home.html @@ -75,6 +75,19 @@ </div> </div> + <div class="col-4"> + <div class="card mx-auto" style="border-color:#0d47a1; max-width: 18rem;"> + <div class="card-header text-center text-white" style="background-color:#0d47a1;" >Fitur managemen-user</div> + <div class="card-body"> + <div class="text-center mt-1"> + <img src="../img/user_management.png" width="60" height="60"> + <p class="card-text my-3">manage data user</p> + <a th:href="@{/user/viewall/pasien}" class="mx-2 mb-2 btn btn-sm btn-primary">lihat user</a> + </div> + </div> + </div> + </div> + </div> </div> diff --git a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html index 308e0e6..b2ef0a6 100644 --- a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html +++ b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html @@ -1,20 +1,21 @@ <!DOCTYPE html> <html lang="en" xmlns:th="http://thymeleaf.org"> <head> - <title>BelajarBelajar</title> + <title>manajemen user</title> <object th:include="fragments/fragment :: css" th:remove="tag"></object> <object th:include="fragments/fragment :: js" th:remove="tag"></object> </head> <body> -<nav th:replace="fragments/fragment :: navbar"></nav> +<object th:replace="fragments/fragment :: navbar('Beranda')"></object> <div class="container"> <div class="card m-4 p-4"> <div class="card-body"> <div class="justify-content-center"> - <h2>List Course</h2> + <h2>List User</h2> <h2><a class="btn btn-primary" href="/">Beranda</a> <div class="my-3 d-flex justify-content-left"> - <a th:href="@{/user/add}" class="mx-2 btn btn-outline-success">Tambah User Baru</a> + <a th:href="@{/user/add/dokter}" class="mx-2 btn btn-outline-success">Tambah Dokter Baru</a> + <a th:href="@{/user/add/apoteker}" class="mx-2 btn btn-outline-success">Tambah Apoteker Baru</a> </div> </h2> <br> @@ -23,24 +24,27 @@ <tr> <th class="text-center">No</th> <th class="text-center">username</th> - <th class="text-center">role</th> + <th class="text-center">nama</th> + <div th:if="*{onPage == 2}"> + <th class="text-center">tarif</th> + </div> </tr> </thead> <tbody> <tr th:each="user, iterationStatus : ${listUser}" th:style="${iterationStatus.even} ? 'font-weight:bold;'"> <td th:text="${iterationStatus.count}"></td> - <td th:text="${user.nama}"></td> <td th:text="${user.username}"></td> + <td th:text="${user.nama}"></td> <div th:if="*{onPage == 1}"> - <td th:text="to be added"></td> + <td>to be added</td> </div> <div th:if="*{onPage == 2}"> <td th:text="${user.tarif}"></td> </div> <td> <div class="col"> - <a class="btn btn-danger" th:href="@{/}">Update Password(to be added maybe)</a> + <a class="btn btn-danger" th:href="@{/}">Update Password(tba maybe)</a> <a class="btn btn-dark" th:href="@{/user/delete/} + ${user.username}">Delete user</a> </div> </td> -- GitLab From 1394d4fbfa70a5faec9d3e64953a11622e89662d Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Tue, 6 Dec 2022 10:44:01 +0700 Subject: [PATCH 5/8] kok loginnya jadi gabisa ya di localhost? --- .../manage/controller/ManageController.java | 3 ++- .../manage/model/CreateApotekerDTO.java | 4 +++ .../manage/model/CreateDokterDTO.java | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateDokterDTO.java diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java index 9e32209..8ca6a3d 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -6,6 +6,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import spring.TK.SpringTkApap.auth.model.RolesEnum; import spring.TK.SpringTkApap.auth.model.UserModel; +import spring.TK.SpringTkApap.manage.model.CreateDokterDTO; import spring.TK.SpringTkApap.manage.service.ApotekerService; import spring.TK.SpringTkApap.manage.service.UserService; import spring.TK.SpringTkApap.user.model.ApotekerModel; @@ -37,7 +38,7 @@ public class ManageController { @GetMapping(value="/add/dokter") public String addDokterFormPage(Model model){ - DokterModel user = new DokterModel(); + CreateDokterDTO user = new CreateDokterDTO(); List<RolesEnum> listRole = new ArrayList<>(); listRole.add(RolesEnum.DOKTER); model.addAttribute("user",user); diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java new file mode 100644 index 0000000..20a8545 --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java @@ -0,0 +1,4 @@ +package spring.TK.SpringTkApap.manage.model; + +public class CreateApotekerDTO { +} diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateDokterDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateDokterDTO.java new file mode 100644 index 0000000..33ef0b0 --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateDokterDTO.java @@ -0,0 +1,25 @@ +package spring.TK.SpringTkApap.manage.model; + +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.GenericGenerator; +import spring.TK.SpringTkApap.auth.model.RolesEnum; + +import javax.persistence.*; +import javax.validation.constraints.Size; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CreateDokterDTO { + private String nama; + private RolesEnum role; + private String username; + private String password; + private String email; + private Integer tarif; +} -- GitLab From 8bdeb7da2fa32e79b3395ce28a4e76767ebf526d Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Tue, 6 Dec 2022 14:13:56 +0700 Subject: [PATCH 6/8] create apoteker DTO --- .../manage/model/CreateApotekerDTO.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java index 20a8545..b73be54 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/model/CreateApotekerDTO.java @@ -1,4 +1,20 @@ package spring.TK.SpringTkApap.manage.model; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import spring.TK.SpringTkApap.auth.model.RolesEnum; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor public class CreateApotekerDTO { + private String nama; + private RolesEnum role; + private String username; + private String password; + private String email; + private Integer tarif; } -- GitLab From 96be16f0d57a8eab3f756ea27d26d5d3537ec8a2 Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Tue, 6 Dec 2022 15:10:11 +0700 Subject: [PATCH 7/8] harusnya manage-user udah selesai --- .../manage/controller/ManageController.java | 52 +++++++++++++------ .../templates/manage/viewall-user.html | 1 + 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java index 8ca6a3d..013abcc 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -6,13 +6,16 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import spring.TK.SpringTkApap.auth.model.RolesEnum; import spring.TK.SpringTkApap.auth.model.UserModel; +import spring.TK.SpringTkApap.manage.model.CreateApotekerDTO; import spring.TK.SpringTkApap.manage.model.CreateDokterDTO; import spring.TK.SpringTkApap.manage.service.ApotekerService; import spring.TK.SpringTkApap.manage.service.UserService; import spring.TK.SpringTkApap.user.model.ApotekerModel; import spring.TK.SpringTkApap.user.model.DokterDTO; import spring.TK.SpringTkApap.user.model.DokterModel; +import spring.TK.SpringTkApap.user.model.PasienModel; import spring.TK.SpringTkApap.user.service.DokterService; +import spring.TK.SpringTkApap.user.service.PasienService; import java.util.ArrayList; import java.util.List; @@ -24,6 +27,8 @@ public class ManageController { @Autowired private UserService userService; + @Autowired + private PasienService pasienService; @Autowired private DokterService dokterService; @@ -47,16 +52,23 @@ public class ManageController { } @PostMapping(value="/add/dokter") - public String addDokterSubmit(@ModelAttribute DokterModel user, Model model){ - user.setPassword(userService.encrypt(user.getPassword())); + private String addDokterSubmit(@ModelAttribute CreateDokterDTO dto, Model model){ + DokterModel user = new DokterModel(); + user.setUsername(dto.getUsername()); + user.setNama(dto.getNama()); + user.setPassword(userService.encrypt(dto.getPassword())); + user.setEmail(dto.getEmail()); + user.setRole(RolesEnum.DOKTER); + user.setTarif(dto.getTarif()); + user.setListAppointment(new ArrayList<>()); + dokterService.addDokter(user); model.addAttribute("user",user); return "redirect:/"; } @GetMapping(value="/add/apoteker") public String addApotekerFormPage(Model model){ - ApotekerModel user = new ApotekerModel(); - user.setListResep(new ArrayList<>()); + CreateApotekerDTO user = new CreateApotekerDTO(); List<RolesEnum> listRole = new ArrayList<>(); listRole.add(RolesEnum.APOTEKER); model.addAttribute("user",user); @@ -64,42 +76,52 @@ public class ManageController { return "manage/form-add-apoteker"; } @PostMapping(value="/add/apoteker") - public String addApotekerSubmit(@ModelAttribute ApotekerModel user, Model model){ - user.setPassword(userService.encrypt(user.getPassword())); + public String addApotekerSubmit(@ModelAttribute CreateApotekerDTO dto, Model model){ + ApotekerModel user = new ApotekerModel(); + user.setUsername(dto.getUsername()); + user.setNama(dto.getNama()); + user.setPassword(userService.encrypt(dto.getPassword())); + user.setEmail(dto.getEmail()); + user.setRole(RolesEnum.APOTEKER); + user.setListResep(new ArrayList<>()); apotekerService.addApoteker(user); model.addAttribute("user",user); return "redirect:/"; } @GetMapping("/viewall/pasien") public String listPasien(Model model) { - List<UserModel> listUser = userService.getListUser();//masih blm selesai + List<PasienModel> listUser = pasienService.getAll();//masih blm selesai model.addAttribute(LISTUSER, listUser); - model.addAttribute(ONPAGE,1); + model.addAttribute(ONPAGE,"PASIEN"); return VIEWALLUSER; } @GetMapping("/viewall/dokter") public String listDokter(Model model) { List<DokterDTO> listUser = dokterService.getAll(); model.addAttribute(LISTUSER, listUser); - model.addAttribute(ONPAGE,2); + model.addAttribute(ONPAGE,"DOKTER"); return VIEWALLUSER; } @GetMapping("/viewall/apoteker") public String listApoteker(Model model) { List<ApotekerModel> listUser = apotekerService.getAll(); model.addAttribute(LISTUSER, listUser); - model.addAttribute(ONPAGE,3); + model.addAttribute(ONPAGE,"APOTEKER"); return VIEWALLUSER; } @GetMapping("/delete/{username}") public String deleteCourse(@PathVariable String username, Model model){ UserModel user = userService.getUserByUsername(username); userService.deleteUser(user); - List<UserModel> listUser = userService.getListUser();//masih blm selesai - model.addAttribute(LISTUSER, listUser); - model.addAttribute(ONPAGE,1); - return VIEWALLUSER; - + if(user.getRole()==RolesEnum.DOKTER){ + return "redirect:/user/viewall/dokter"; + } + else if(user.getRole()==RolesEnum.APOTEKER){ + return "redirect:/user/viewall/apoteker"; + } + else { + return "redirect:/user/viewall/pasien"; + } } } diff --git a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html index 1eb170a..fb80d6f 100644 --- a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html +++ b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html @@ -19,6 +19,7 @@ </div> </h2> <br> + <h2 th:text="${onPage}"></h2> <table class="table"> <thead> <tr> -- GitLab From 4ee212f7c3407118f0b447d73f8d3c446732afb5 Mon Sep 17 00:00:00 2001 From: Teuku Shafwan Alim <teuku.shafwan@ui.ac.id> Date: Tue, 6 Dec 2022 16:07:00 +0700 Subject: [PATCH 8/8] feat:manage-user done harusnya --- .../auth/security/WebSecurityConfig.java | 1 + .../spring/TK/SpringTkApap/auth/setting/Setting.java | 2 +- .../manage/controller/ManageController.java | 4 ++-- .../src/main/resources/templates/home/home.html | 12 ++++++++++++ .../resources/templates/manage/viewall-user.html | 5 +++++ 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java index 34d174e..112eee9 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java @@ -51,6 +51,7 @@ public class WebSecurityConfig { .antMatchers("/obat/update/**").hasAuthority(APOTEKER) .antMatchers("/user/add/**").hasAuthority(ADMIN) .antMatchers("/user/delete/**").hasAuthority(ADMIN) + .antMatchers("/user/viewall/**").hasAuthority(ADMIN) .anyRequest().authenticated() .and( ) .formLogin() diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java index 1492155..23126f8 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java @@ -5,7 +5,7 @@ public class Setting { private Setting() { } - public static final String CLIENT_BASE_URL = "http://localhost:8080"; + public static final String CLIENT_BASE_URL = "https://apap-tk-53.cs.ui.ac.id"; public static final String CLIENT_LOGIN = CLIENT_BASE_URL + "/validate-ticket"; diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java index 013abcc..67ee80c 100644 --- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/manage/controller/ManageController.java @@ -64,7 +64,7 @@ public class ManageController { dokterService.addDokter(user); model.addAttribute("user",user); - return "redirect:/"; + return "redirect:/user/viewall/dokter"; } @GetMapping(value="/add/apoteker") public String addApotekerFormPage(Model model){ @@ -86,7 +86,7 @@ public class ManageController { user.setListResep(new ArrayList<>()); apotekerService.addApoteker(user); model.addAttribute("user",user); - return "redirect:/"; + return "redirect:/user/viewall/apoteker"; } @GetMapping("/viewall/pasien") public String listPasien(Model model) { diff --git a/SpringTkApap/src/main/resources/templates/home/home.html b/SpringTkApap/src/main/resources/templates/home/home.html index 9d78a19..5ecc91f 100644 --- a/SpringTkApap/src/main/resources/templates/home/home.html +++ b/SpringTkApap/src/main/resources/templates/home/home.html @@ -72,6 +72,18 @@ </div> </div> </div> + <div class="col-4"> + <div class="card mx-auto" style="border-color:#0d47a1; max-width: 18rem;"> + <div class="card-header text-center text-white" style="background-color:#0d47a1;" >Fitur managemen-user</div> + <div class="card-body"> + <div class="text-center mt-1"> + <img src="../img/user_management.png" width="60" height="60"> + <p class="card-text my-3">manage data user</p> + <a th:href="@{/user/viewall/pasien}" class="mx-2 mb-2 btn btn-sm btn-primary">lihat user</a> + </div> + </div> + </div> + </div> </div> diff --git a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html index fb80d6f..f9604e1 100644 --- a/SpringTkApap/src/main/resources/templates/manage/viewall-user.html +++ b/SpringTkApap/src/main/resources/templates/manage/viewall-user.html @@ -17,6 +17,11 @@ <a th:href="@{/user/add/dokter}" class="mx-2 btn btn-outline-success">Tambah Dokter Baru</a> <a th:href="@{/user/add/apoteker}" class="mx-2 btn btn-outline-success">Tambah Apoteker Baru</a> </div> + <div class="my-3 d-flex justify-content-left"> + <a th:href="@{/user/viewall/dokter}" class="mx-2 btn btn-outline-success">List Dokter</a> + <a th:href="@{/user/viewall/apoteker}" class="mx-2 btn btn-outline-success">List Apoteker</a> + <a th:href="@{/user/viewall/pasien}" class="mx-2 btn btn-outline-success">List Pasien</a> + </div> </h2> <br> <h2 th:text="${onPage}"></h2> -- GitLab