diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..36dc125 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,31 @@ +name: Deploy to EC2 Tomcat + +on: + push: + branches: + - develop # develop 브랜치에 push 또는 merge될 때 실행 + +jobs: + deploy: + runs-on: ubuntu-latest # GitHub Action이 실행될 환경 + + steps: + - name: Checkout repository + uses: actions/checkout@v2 # 코드 체크아웃 + + # sshpass 설치 + - name: Install sshpass + run: | + sudo apt-get update + sudo apt-get install -y sshpass + + # EC2에 ssh 접속 및 배포 + - name: Deploy to EC2 + run: | + sshpass -p "close_DBMS_4" ssh -o StrictHostKeyChecking=no ubuntu@3.34.192.234 << 'EOF' + cd /home/ubuntu/project/Reservation + git pull origin develop + ./mvnw clean install -DskipTests + mv target/team4.war /opt/tomcat/webapps/ROOT.war + sudo systemctl restart tomcat + EOF \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 290b8ea..9c21f7c 100644 --- a/pom.xml +++ b/pom.xml @@ -215,12 +215,13 @@ - junit - junit - 4.12 + org.junit.jupiter + junit-jupiter-api + 5.11.4 test + @@ -242,8 +243,18 @@ quartz-jobs 2.3.0 - - + + org.junit.jupiter + junit-jupiter + RELEASE + test + + + org.junit.jupiter + junit-jupiter + RELEASE + test + @@ -254,7 +265,6 @@ maven-clean-plugin 3.1.0 - maven-resources-plugin 3.0.2 @@ -293,6 +303,38 @@ 11 + + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + + prepare-agent + report + + test + + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + + html + xml + + + + + + diff --git a/src/main/java/Interceptor/CommonDataInterceptor.java b/src/main/java/Interceptor/CommonDataInterceptor.java new file mode 100644 index 0000000..b800c11 --- /dev/null +++ b/src/main/java/Interceptor/CommonDataInterceptor.java @@ -0,0 +1,53 @@ +package Interceptor; + +import com.fasterxml.jackson.databind.ObjectMapper; +import kr.co.team4.model.dto.SellerDTO; +import kr.co.team4.model.service.SellerPageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.math.BigInteger; + +/** + * 생성자 : JDeok + * 기 능 : 세션체크 및 숙소명 보여주기 + * 변경사항 + * - 2025.01.10 : JDeok(최초생성) + */ + +@Component +public class CommonDataInterceptor implements HandlerInterceptor { + + @Autowired + private SellerPageService sellerPageService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HttpSession session = request.getSession(); + Object sellerSession = session.getAttribute("sellersession"); + + if (sellerSession != null) { + String lodgmentName = (String) session.getAttribute("lodgmentName"); + if (lodgmentName == null) { + + SellerDTO seller = (SellerDTO) sellerSession; + int seller_idx = seller.getSELLER_IDX().intValue(); + + Integer lod_idx = sellerPageService.getLod(seller_idx); + if (lod_idx != null && lod_idx > 0) { + lodgmentName = sellerPageService.getLodgmentName(lod_idx); + session.setAttribute("lodgmentName", lodgmentName); + } + } + request.setAttribute("lodgmentName", lodgmentName); // JSP에서 사용할 데이터 + } + return true; + } +} + + diff --git a/src/main/java/Interceptor/SellerInterceptor.java b/src/main/java/Interceptor/SellerInterceptor.java new file mode 100644 index 0000000..691b912 --- /dev/null +++ b/src/main/java/Interceptor/SellerInterceptor.java @@ -0,0 +1,48 @@ +package Interceptor; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +/** + * 생성자 : JDeok + * 기 능 : 세션체크 및 숙소명 보여주기 + * 변경사항 + * - 2025.01.10 : JDeok(최초생성) + */ +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +@Component +public class SellerInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect("/sellerlogin"); + return false; // 요청 진행 중단 + }else{ + return true; + } + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + // 컨트롤러 처리 후, 뷰 렌더링 전에 실행 + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + // 뷰 렌더링 후 실행 (리소스 정리 등에 사용) + } +} + diff --git a/src/main/java/config/MvcConfig.java b/src/main/java/config/MvcConfig.java index eb2da3e..badc9ca 100644 --- a/src/main/java/config/MvcConfig.java +++ b/src/main/java/config/MvcConfig.java @@ -1,16 +1,21 @@ package config; +import Interceptor.CommonDataInterceptor; +import Interceptor.SellerInterceptor; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; +import kr.co.team4.model.service.SellerPageService; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import org.springframework.core.convert.converter.Converter; import org.springframework.core.io.ClassPathResource; import org.springframework.mail.javamail.JavaMailSender; @@ -18,6 +23,8 @@ import java.util.Properties; import org.springframework.format.FormatterRegistry; import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.transaction.TransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.multipart.MultipartResolver; @@ -31,13 +38,18 @@ import javax.sql.DataSource; import java.awt.*; import java.util.Date; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @ComponentScan(basePackages = {"kr.co"}) @EnableWebMvc @MapperScan(basePackages = {"kr.co.team4.model.mapper"}, annotationClass = Mapper.class) @EnableTransactionManagement +@EnableScheduling +@ComponentScan(basePackages = {"kr.co", "Interceptor"}) public class MvcConfig implements WebMvcConfigurer { + // ViewResolver - 포워딩할 경로 앞/뒤 설정 @Override public void configureViewResolvers(ViewResolverRegistry registry) { @@ -70,6 +82,15 @@ public DataSourceTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } + @Bean // 배치작업 빈 등록 + public ThreadPoolTaskScheduler taskScheduler(){ + ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + scheduler.setPoolSize(10); // 스케줄러의 스레드 풀 크기 설정 + scheduler.setThreadNamePrefix("scheduled-task-"); + scheduler.initialize(); + return scheduler; + } + @Bean public DataSource dataSource(){ @@ -168,6 +189,26 @@ public JavaMailSender javaMailService() { return javaMailSender; } + /*2025.01.10 JDeok 추가 */ + private final SellerInterceptor sellerInterceptor; + private final CommonDataInterceptor commonDataInterceptor; + + public MvcConfig(@Lazy SellerInterceptor sellerInterceptor, @Lazy CommonDataInterceptor commonDataInterceptor) { + this.sellerInterceptor = sellerInterceptor; + this.commonDataInterceptor = commonDataInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 1. LoginInterceptor 등록 + registry.addInterceptor(sellerInterceptor) + .addPathPatterns("/lodgment/**") // 로그인 필수 URL + .excludePathPatterns("/auth/**", "/static/**"); // 제외 URL + + // 2. CommonDataInterceptor 등록 + registry.addInterceptor(commonDataInterceptor) + .addPathPatterns("/lodgment/**"); // 공통 데이터 적용 URL + } } diff --git a/src/main/java/filter/LoginSessionFilter.java b/src/main/java/filter/LoginSessionFilter.java new file mode 100644 index 0000000..5f612d7 --- /dev/null +++ b/src/main/java/filter/LoginSessionFilter.java @@ -0,0 +1,52 @@ +package filter; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +public class LoginSessionFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { + + // HttpServletRequest로 형변환 + HttpServletRequest httpRequest = (HttpServletRequest) request; + + // 세션 가져오기 + HttpSession session = httpRequest.getSession(false); // 세션이 존재하지 않으면 null 반환 + + // /userlogin 경로는 필터에서 제외 + if (httpRequest.getRequestURI().equals("common/alert")) { + filterChain.doFilter(request, response); + return; + } + + if (session == null || session.getAttribute("usersession") == null) { + + // 현재 요청 URL과 GET 파라미터를 세션에 저장 + String requestedUrl = httpRequest.getRequestURL().toString(); + String queryString = httpRequest.getQueryString(); // 쿼리 파라미터 가져오기 + // 쿼리 파라미터 존재하는 경우만 추가로 더해서 기억 + String returnUrl = (queryString != null) ? requestedUrl + "?" + queryString : requestedUrl; + session.setAttribute("redirectUrl", returnUrl); + + request.setAttribute("msg", "로그인이 필요합니다"); + // 세션에 사용자 정보가 없으면 로그인 페이지로 리다이렉트 + request.getRequestDispatcher("/userlogin").forward(request, response); + } else { + // 세션에 사용자 정보가 있으면 다음 필터 또는 서블릿으로 진행 + filterChain.doFilter(request, response); + } + } + + @Override + public void destroy() { + + } +} diff --git a/src/main/java/filter/SessionListener.java b/src/main/java/filter/SessionListener.java new file mode 100644 index 0000000..983abc1 --- /dev/null +++ b/src/main/java/filter/SessionListener.java @@ -0,0 +1,25 @@ +package filter; + +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.http.*; +import java.io.IOException; +import java.util.Map; + +public class SessionListener implements HttpSessionListener { + + @Override + public void sessionCreated(HttpSessionEvent httpSessionEvent) { + HttpSession session = httpSessionEvent.getSession(); + // 세션 유지 시간 1시간 +// session.setMaxInactiveInterval(60 * 60); + System.out.println("새로운 세션 생성: 세션 ID: " + session.getId()); + session.setMaxInactiveInterval(60 * 60); + } + + @Override + public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { + HttpSession session = httpSessionEvent.getSession(); + System.out.println("세션이 종료되었습니다. 세션 ID: " + session.getId()); + } +} diff --git a/src/main/java/kr/co/team4/controller/BoardController.java b/src/main/java/kr/co/team4/controller/BoardController.java new file mode 100644 index 0000000..15234ab --- /dev/null +++ b/src/main/java/kr/co/team4/controller/BoardController.java @@ -0,0 +1,104 @@ +package kr.co.team4.controller; + +import kr.co.team4.model.dto.BoardDTO; +import kr.co.team4.model.dto.CommentDTO; +import kr.co.team4.model.dto.CommentResDTO; +import kr.co.team4.model.dto.UserDTO; +import kr.co.team4.model.service.BoardService; +import org.apache.ibatis.annotations.Param; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpSession; +import java.math.BigInteger; +import java.util.List; + +@Controller +public class BoardController { + + @Autowired + private BoardService boardService; + + @GetMapping("/gather") + public String list(Model model) throws Exception{ + List boardList = boardService.getBoardList(); + model.addAttribute("list", boardList); + return "board/gather"; + } + + @GetMapping("/write") + public String showWriteForm() { + return "board/write"; + } + + @PostMapping("/write") + public String writepost(@ModelAttribute BoardDTO board, HttpSession session) throws Exception { + UserDTO usersession = (UserDTO) session.getAttribute("usersession"); + if(usersession == null) { + System.out.println("No Session."); + return "redirect:/userlogin"; + } + + BigInteger USER_IDX = usersession.getUSER_IDX(); + if(USER_IDX == null) { + System.out.println("No Session USER_IDX."); + return "redirect:/userlogin"; + } + + System.out.println("세션 USER_IDX : " + USER_IDX); + board.setUSER_IDX(USER_IDX); + + boardService.write(board); + + return "redirect:/gather"; + } + + @GetMapping("/detail") + public String detail(@RequestParam("BOARD_IDX") int BOARD_IDX, Model model) throws Exception { + BoardDTO detail = boardService.detail(BOARD_IDX); + model.addAttribute("detail", detail); + List commentResDTOList = boardService.selectComment(BOARD_IDX); + model.addAttribute("commentResDTOList", commentResDTOList); + return "board/detail"; + } + + + @PostMapping("/comment/write") + public String PostComment(@ModelAttribute CommentResDTO commentResDTO, HttpSession session, @RequestParam("BOARD_IDX") int BOARD_IDX) throws Exception { + // 세션에서 사용자 정보 가져오기 + UserDTO usersession = (UserDTO) session.getAttribute("usersession"); + + // 로그인하지 않은 경우 리디렉션 + if (usersession == null) { + System.out.println("No Session."); + return "redirect:/userlogin"; + } + + // 사용자 ID 가져오기 + BigInteger userIdx = usersession.getUSER_IDX(); + + // 세션에 사용자 ID가 없을 경우 리디렉션 + if (userIdx == null) { + System.out.println("No Session USER_IDX."); + return "redirect:/userlogin"; + } + + // 댓글 DTO에 사용자 정보 설정 + commentResDTO.setUSER_IDX(userIdx); + commentResDTO.setBOARD_IDX(BigInteger.valueOf(BOARD_IDX)); // 게시글 번호 설정 + + // 댓글 삽입 서비스 호출 + boardService.insertComment(commentResDTO); + + // 댓글 작성 후 동일한 게시글 상세보기 페이지로 리디렉션 + return "redirect:/detail?BOARD_IDX=" + BOARD_IDX; + } + + +} diff --git a/src/main/java/kr/co/team4/controller/FunController.java b/src/main/java/kr/co/team4/controller/FunController.java new file mode 100644 index 0000000..0196b1a --- /dev/null +++ b/src/main/java/kr/co/team4/controller/FunController.java @@ -0,0 +1,25 @@ +package kr.co.team4.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class FunController { + + @GetMapping("/fun.do") + public String showFun() { + return "fun/fun"; + } + + @GetMapping("/event1") + public String showevent1() { return "fun/event1"; } + + @GetMapping("/event2") + public String showevent2() { return "fun/event2"; } + + @GetMapping("/event3") + public String showevent3() { return "fun/event3"; } + + +} diff --git a/src/main/java/kr/co/team4/controller/HomeController.java b/src/main/java/kr/co/team4/controller/HomeController.java index 46d1ec1..9afdf35 100644 --- a/src/main/java/kr/co/team4/controller/HomeController.java +++ b/src/main/java/kr/co/team4/controller/HomeController.java @@ -1,12 +1,28 @@ package kr.co.team4.controller; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.servlet.http.HttpSession; +import java.math.BigInteger; @Controller public class HomeController { - @GetMapping("/home.do") - public String index() { - return "home"; - } + // @GetMapping("/home.do") + // public String index() { + // return "home"; + // } + @GetMapping("/home.do") + public String home(@RequestParam(value = "user_idx", required = false) BigInteger userIdx, HttpSession session, Model model) { + // 세션에서 user_idx 가져 옴 (로그인하지 않았으면 null) + BigInteger sessionUserIdx = (BigInteger) session.getAttribute("user_idx"); + + // 세션 또는 쿼리 파라미터로 전달된 user_idx를 모델에 추가 + model.addAttribute("user_idx", sessionUserIdx != null ? sessionUserIdx : userIdx); + + return "home"; + } + } diff --git a/src/main/java/kr/co/team4/controller/LodLikeController.java b/src/main/java/kr/co/team4/controller/LodLikeController.java new file mode 100644 index 0000000..33fdd0d --- /dev/null +++ b/src/main/java/kr/co/team4/controller/LodLikeController.java @@ -0,0 +1,82 @@ +package kr.co.team4.controller; + +import kr.co.team4.model.dto.LodLikeDTO; +import kr.co.team4.model.dto.LodgmentDTO; +import kr.co.team4.model.service.LodLikeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpSession; +import java.math.BigInteger; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Controller +@RequestMapping("/lodlike") +public class LodLikeController { + + @Autowired + private LodLikeService lodLikeService; + + /** + * 찜 상태 토글 (추가/삭제) + */ + @PostMapping("/toggle") + @ResponseBody + public ResponseEntity> toggleLike(HttpSession session, @RequestBody Map requestBody) { + Map response = new HashMap<>(); + + try { + int lod_idx = (int)requestBody.get("lod_idx"); + + String redirectUrl = (String)requestBody.get("redirectUrl"); + // 세션에서 로그인 정보 가져오기 + BigInteger sessionUserIdx = (BigInteger) session.getAttribute("user_idx"); + if (sessionUserIdx == null) { + response.put("status", "not_login"); + session.setAttribute("redirectUrl", redirectUrl); + return ResponseEntity.ok(response); + } + + LodLikeDTO lodLikeDTO = new LodLikeDTO(); + + // 세션 사용자 ID를 DTO에 설정 + lodLikeDTO.setUser_idx(sessionUserIdx); + lodLikeDTO.setLod_idx(lod_idx); + + // 디버깅 로그 추가 + System.out.println("요청 데이터: USER_IDX = " + lodLikeDTO.getUser_idx() + ", lod_idx = " + lodLikeDTO.getLod_idx()); + + boolean isAdded = lodLikeService.toggleLike(lodLikeDTO); + response.put("status", isAdded ? "added" : "removed"); + + return ResponseEntity.ok(response); + } catch (Exception e) { + e.printStackTrace(); // 예외 로그 출력 + response.put("error", "요청 처리 중 오류가 발생했습니다."); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); + } + } + + @GetMapping("/lodwish.do") + public String goWish(HttpSession session, Model model) { + BigInteger sessionUserIdx = (BigInteger) session.getAttribute("user_idx"); + if (sessionUserIdx == null) { + session.setAttribute("redirectUrl", "/lodlike/lodwish.do"); + return "redirect:/userlogin"; + } + + List wishlist = lodLikeService.getLikeList(sessionUserIdx); + + model.addAttribute("wishlist", wishlist); + return "like/like"; + } + + +} diff --git a/src/main/java/kr/co/team4/controller/LodRecentController.java b/src/main/java/kr/co/team4/controller/LodRecentlyController.java similarity index 89% rename from src/main/java/kr/co/team4/controller/LodRecentController.java rename to src/main/java/kr/co/team4/controller/LodRecentlyController.java index 571d00b..a6e2427 100644 --- a/src/main/java/kr/co/team4/controller/LodRecentController.java +++ b/src/main/java/kr/co/team4/controller/LodRecentlyController.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller -public class LodRecentController { +public class LodRecentlyController { @RequestMapping("recently/recently.do") public String recent() { return "recently/recently"; // recently.jsp로 연결 diff --git a/src/main/java/kr/co/team4/controller/LodgmentController.java b/src/main/java/kr/co/team4/controller/LodgmentController.java index 460872b..45047f9 100644 --- a/src/main/java/kr/co/team4/controller/LodgmentController.java +++ b/src/main/java/kr/co/team4/controller/LodgmentController.java @@ -1,9 +1,7 @@ package kr.co.team4.controller; import kr.co.team4.model.dto.*; -import kr.co.team4.model.service.LodFacilityService; -import kr.co.team4.model.service.LodgmentService; -import kr.co.team4.model.service.LodReviewService; +import kr.co.team4.model.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -12,6 +10,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,14 +21,20 @@ public class LodgmentController { @Autowired private LodgmentService lodgmentService; + @Autowired + private RoomService roomService; + @Autowired private LodReviewService lodReviewService; // LodReviewService 추가 @Autowired private LodFacilityService lodFacilityService; // LodFacilityService 추가 + @Autowired + private LodLikeService lodLikeService; + @GetMapping("/lodgment.do") - public String index(Model model, LodgmentDTO lodgmentDTO, + public String index(Model model, LodgmentDTO lodgmentDTO, HttpSession session, @RequestParam int lod_idx, @RequestParam String checkinDate, @RequestParam String checkoutDate, @@ -76,18 +81,31 @@ public String index(Model model, LodgmentDTO lodgmentDTO, model.addAttribute("guestCount", guestCount); model.addAttribute("petCount", petCount); + // 좋아요 정보 가져오기 + LodLikeDTO lodLikeDTO = new LodLikeDTO(); + lodLikeDTO.setLod_idx(lod_idx); + + if (session.getAttribute("usersession") != null) { + UserDTO user = (UserDTO)session.getAttribute("usersession"); + lodLikeDTO.setUser_idx(user.getUSER_IDX()); + lodLikeDTO = lodLikeService.findByUserAndLod(lodLikeDTO) != null + ? lodLikeService.findByUserAndLod(lodLikeDTO) + : lodLikeDTO; + } + model.addAttribute("lodLikeDTO", lodLikeDTO); + return "lodgment/lodgment"; // "lodgment" 페이지로 이동 } @GetMapping("/lodgment/availableRooms.do") @ResponseBody - public List getAvailableRooms(@RequestParam int lod_idx, + public Map getAvailableRooms(@RequestParam int lod_idx, @RequestParam String checkinDate, @RequestParam String checkoutDate, @RequestParam int guestCount, @RequestParam int petCount) { - + Map rooms = new HashMap<>(); Map params = new HashMap<>(); params.put("lod_idx", lod_idx); params.put("checkinDate", checkinDate); @@ -95,7 +113,14 @@ public List getAvailableRooms(@RequestParam int lod_idx, params.put("guestCount", guestCount); params.put("petCount", petCount); + LodgmentDTO lodgmentDTO = roomService.getRoomLodDetail(lod_idx); + List roomList = lodgmentService.getAvailableRooms(params); + + rooms.put("roomList", roomList); + rooms.put("checkinTime", lodgmentDTO.getFormattedLodCheckIn()); + rooms.put("checkoutTime", lodgmentDTO.getFormattedLodCheckOut()); + // Service를 호출하여 예약 가능한 객실 리스트를 가져옴 - return lodgmentService.getAvailableRooms(params); + return rooms; } } \ No newline at end of file diff --git a/src/main/java/kr/co/team4/controller/LoginController.java b/src/main/java/kr/co/team4/controller/LoginController.java index 35831d2..b2a7206 100644 --- a/src/main/java/kr/co/team4/controller/LoginController.java +++ b/src/main/java/kr/co/team4/controller/LoginController.java @@ -39,15 +39,18 @@ public String showSellerRegisterForm() { } @PostMapping("/userregister") - public String UserRegister(UserDTO dto) throws Exception { + public String UserRegister(UserDTO dto, Model model) throws Exception { logger.info("사용자 회원가입 진입"); + try { + // 회원가입 서비스 실행 + service.userregister(dto); + logger.info("register Service 성공"); - // 회원가입 서비스 실행 - service.userregister(dto); - - logger.info("register Service 성공"); - - return "login/userlogin"; + // 회원가입 성공 후 로그인 페이지로 리다이렉트 + return "login/usersuccess"; + } catch (Exception e) { + throw new Exception("비밀번호 암호화에 실패하였습니다."+ e.getMessage()); // 에러 메시지 전달 + } } @PostMapping("/sellerregister") @@ -58,7 +61,7 @@ public String SellerRegister(SellerDTO dto) throws Exception { logger.info("register Service 성공"); - return "sellersuccess"; + return "login/sellersuccess"; } @GetMapping("/userlogin") @@ -67,6 +70,37 @@ public String showLoginForm() { return "login/userlogin"; } + /** 유저 로그아웃 **/ + @GetMapping("/userlogout") + public String userlogout(HttpServletRequest request) throws Exception { + try { + HttpSession session = request.getSession(false); // 세션 존재 확인 + if (session != null) { + session.invalidate(); + System.out.println("회원 로그아웃 성공"); + } + return "redirect:/home.do"; + } catch (Exception e) { + throw new Exception("회원 로그아웃 실패."); + } + } + + + /** 사장님 로그아웃 **/ + @GetMapping("/sellerlogout") + public String sellerlogout(HttpServletRequest request) throws Exception { + try { + HttpSession session = request.getSession(false); // 세션 존재 확인 + if (session != null) { + session.invalidate(); + System.out.println("사장님 로그아웃 성공"); + } + return "redirect:/lodgment/sellerMain.do"; //(변경 할 거)리다이렉트 페이지는 사장님페이지 첫 화면으로 이동 + } catch (Exception e) { + throw new Exception("사장님 로그아웃 실패."); + } + } + @GetMapping("/sellerlogin") public String showSellerLoginForm() { logger.info("사장님 로그인 페이지 진입"); @@ -85,9 +119,21 @@ public String userlogin(HttpServletRequest request, UserDTO dto, RedirectAttribu return "redirect:/userlogin"; } - session.setAttribute("dto", user); // 일치하는 아이디, 비밀번호 입력(로그인 성공) + session.setAttribute("usersession", user); // 일치하는 아이디, 비밀번호 입력(로그인 성공) + session.setAttribute("user_idx", user.getUSER_IDX()); // 세션에 USER_IDX 저장 + + // 로그인 성공 후 만약 필터링을 통해 로그인 화면을 왔다면 + String redirectUrl = (String) request.getSession().getAttribute("redirectUrl"); + if(redirectUrl != null){ + // 기존의 리다이렉트 세션 삭제 + request.getSession().removeAttribute("redirectUrl"); // 세션에서 redirectUrl 삭제 + return "redirect:" + redirectUrl; + } + // 서버 콘솔에 user_idx 출력 + System.out.println("로그인 성공: user_idx = " + user.getUSER_IDX()); + + return "redirect:/home.do"; - return "login/main"; } @PostMapping("/sellerlogin") @@ -102,9 +148,10 @@ public String sellerlogin(HttpServletRequest request, SellerDTO dto, RedirectAtt return "redirect:/sellerlogin"; } - session.setAttribute("dto", seller); // 일치하는 아이디, 비밀번호 입력(로그인 성공) - return "login/main"; + session.setAttribute("sellersession", seller); // 일치하는 아이디, 비밀번호 입력(로그인 성공) + + return "redirect:/lodgment/lodRegister.do"; } @GetMapping("/main") @@ -117,14 +164,6 @@ public String main(HttpSession session, Model model) { return "login/main"; } -// @GetMapping("/dupUSER_ID") -// public ResponseEntity> dupUSER_ID(@RequestParam String USER_ID) { -// boolean exists = service.dupUSER_ID(USER_ID); -// Map response = new HashMap<>(); -// response.put("exists", exists); -// return ResponseEntity.ok(response); -// } - @PostMapping("/ID_CHECK") @ResponseBody public String ID_CHECK(String USER_ID) throws Exception { @@ -235,33 +274,4 @@ public int SelleremailAuth(String SELLER_EMAIL) { } -// @GetMapping("/EMAIL_CHECK") -// @ResponseBody -// public void emailCheck(String USER_EMAIL) throws Exception{ -// -// // 인증번호 난수 생성 -// Random random = new Random(); -// int checkNum = random.nextInt(888888) + 111111; -// -// // 이메일 전송 -// String setFrom = "hjm8565@naver.com"; -// String toMail = USER_EMAIL; -// String title = "같이가개 회원가입 인증 이메일입니다."; -// String content = "인증 번호는 " + checkNum + "입니다." + "
" + "해당 인증 번호를 인증 번호 입력란에 입력해주세요."; -// -// try { -// MimeMessage msg = mailSender.createMimeMessage(); -// MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8"); -// helper.setFrom(setFrom); -// helper.setTo(toMail); -// helper.setSubject(title); -// helper.setText(content, true); -// mailSender.send(msg); -// -// } catch (Exception e) { -// e.printStackTrace(); -// } -// -// } - } diff --git a/src/main/java/kr/co/team4/controller/MyPageController.java b/src/main/java/kr/co/team4/controller/MyPageController.java index 9da0d8d..c25ba8b 100644 --- a/src/main/java/kr/co/team4/controller/MyPageController.java +++ b/src/main/java/kr/co/team4/controller/MyPageController.java @@ -1,5 +1,6 @@ package kr.co.team4.controller; +import kr.co.team4.model.dto.UserDTO; import kr.co.team4.model.dto.UserReservedDTO; import kr.co.team4.model.service.review.ReviewService; import org.springframework.beans.factory.annotation.Autowired; @@ -25,14 +26,26 @@ public class MyPageController { */ @GetMapping("/mypage.do") public String index(HttpSession session, Model model) { - BigInteger user_Idx = new BigInteger("1"); // 예시로 1로 설정 + // 세션에서 usersession 가져오기 + UserDTO user = (UserDTO) session.getAttribute("usersession"); + + if (user == null) { + // 로그인하지 않은 사용자라면 로그인 페이지로 리다이렉트 + return "redirect:/userlogin"; + } + + // 로그인한 사용자 정보 사용 + BigInteger user_Idx = user.getUSER_IDX(); // 예시로 UserDTO에서 userIdx를 가져옴 session.setAttribute("user_Idx", user_Idx); // 세션에 user_Idx 저장 + + // 모델에 user_Idx 추가 model.addAttribute("user_Idx", user_Idx.toString()); + + // 추가적인 사용자 정보 처리 (예시로 getUserName 호출) UserReservedDTO userReservedDTO = reviewService.getUserName(user_Idx.intValue()); model.addAttribute("userReservedDTO", userReservedDTO); + return "mypage"; } - - } diff --git a/src/main/java/kr/co/team4/controller/ReservationController.java b/src/main/java/kr/co/team4/controller/ReservationController.java index 3fc37c5..747089a 100644 --- a/src/main/java/kr/co/team4/controller/ReservationController.java +++ b/src/main/java/kr/co/team4/controller/ReservationController.java @@ -9,18 +9,13 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; -import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.math.BigInteger; -import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -88,12 +83,16 @@ public class ReservationController { @GetMapping("/reservation/list") public String listReservationList(HttpSession session, Model model) { // 세션에서 user_Idx 값 가져오기 - BigInteger user_Idx = (BigInteger) session.getAttribute("user_Idx"); - if (user_Idx == null) { - user_Idx = BigInteger.valueOf(0); + BigInteger user_idx = (BigInteger) session.getAttribute("user_idx"); + if (user_idx == null) { + user_idx = BigInteger.valueOf(0); } UserReservedDTO dto = new UserReservedDTO(); - dto.setUser_idx(user_Idx); // 세션에서 가져온 user_Idx 값 설정 + dto.setUser_idx(user_idx); // 세션에서 가져온 user_Idx 값 설정 + + // 현재 시간 가져오기 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String currentTime = LocalDateTime.now().format(formatter); // 예약 목록 가져오기 (Map을 반환받음) Map resultMap = reservationService.list(dto); @@ -101,6 +100,8 @@ public String listReservationList(HttpSession session, Model model) { // 결과에서 List를 추출 List userReservedDTOList = (List) resultMap.get("list"); // "list"는 Map의 키값에 맞게 수정 + model.addAttribute("currentTime", currentTime); // 현재 시간 전달 + // S3에서 숙소 이미지 URL을 추가하는 로직 try { for (UserReservedDTO myReservation : userReservedDTOList) { @@ -123,6 +124,10 @@ public String listReservationList(HttpSession session, Model model) { return "GetReservationListPage"; } + @GetMapping("/reservation/list/redirect") + public String redirectReservationList(){ + return "redirect:/reservation/list"; + } /** @@ -173,8 +178,8 @@ public String getResDetail( } // room_idx를 이용해 방정보를 가져오고 이를 이용한 예약 화면 화면 출력 - @GetMapping("/reserve/reservation.do") - public String goReservtion(Model model, + @GetMapping("/reservation/reservation.do") + public String goReservtion(Model model, HttpSession session, @RequestParam int room_idx, @RequestParam String checkinDate, @RequestParam String checkoutDate, @@ -183,30 +188,30 @@ public String goReservtion(Model model, ReservationDTO reservationDTO = new ReservationDTO(); - // String으로 들어온 날짜를 Date 타입으로 변환 - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try{ - Date res_str_date = sdf.parse(checkinDate); - Date res_end_date = sdf.parse(checkoutDate); + // 세션에 저장되어 있는 유저 idx 정보를 통해 유저 정보 가져오기 + UserDTO userSession = (UserDTO) session.getAttribute("usersession"); + + // 방 정보 가져오기 + RoomDTO roomDTO = roomService.getRoomDetail(room_idx); + // 숙소 정보 가져오기 + LodgmentDTO lodDTO = roomService.getRoomLodDetail(roomDTO.getLod_idx()); + // 예약 정보 세팅 + reservationDTO.setUser_idx(userSession.getUSER_IDX()); + reservationDTO.setLod_idx(BigInteger.valueOf(lodDTO.getLod_idx())); reservationDTO.setRoom_idx(BigInteger.valueOf(room_idx)); - reservationDTO.setRes_str_date(res_str_date); - reservationDTO.setRes_end_date(res_end_date); + reservationDTO.setRes_str_date(checkinDate); + reservationDTO.setRes_end_date(checkoutDate); reservationDTO.setRes_people_cnt(res_people_cnt); reservationDTO.setRes_pets_cnt(res_pets_cnt); - RoomDTO roomDTO = roomService.getRoomDetail(room_idx); - // 세션에 저장되어 있는 유저 idx 정보를 통해 유저 정보 가져오기 - // reservationDTO.setUser_idx(BigInteger.valueOf(1)); + // 숙박 기간에 따른 총 가격 roomDTO에 세팅 + roomDTO.setTotal_room_price(reservationService.getReservationPayment(reservationDTO)); - LodgmentDTO lodDTO = roomService.getRoomLodDetail(roomDTO.getLod_idx()); UserDTO userDTO = reservationService.getUserInform(reservationDTO); - - model.addAttribute("formattedCheckinTime", lodDTO.getFormattedLodCheckIn()); model.addAttribute("formattedCheckoutTime", lodDTO.getFormattedLodCheckOut()); - model.addAttribute("formattedCheckinDate", reservationDTO.getFormattedCheckinDate()); - model.addAttribute("formattedCheckoutDate", reservationDTO.getFormattedCheckoutDate()); model.addAttribute("formattedRoomPrice", roomDTO.getFormattedRoomPrice()); model.addAttribute("dayDifference", reservationDTO.getDateDifferenceDays()); model.addAttribute("reservationDTO", reservationDTO); @@ -249,11 +254,12 @@ public ResponseEntity> saveReservationPayment(@RequestBody R paymentDTO.setStatus("pending"); reservationDTO.setStatus("A"); reservationService.saveReservationPayment(paymentDTO, reservationDTO); + UserDTO userDTO = reservationService.getUserInform(reservationPaymentDTO.getReservationDTO()); // PaymentDTO, ReservationDTO 리턴 (merchant_id 필요함, completePayment에 ) response.put("success", true); response.put("message", "예약 정보와 결제 정보가 저장되었습니다."); - response.put("userDTO", reservationService.getUserInform(reservationPaymentDTO.getReservationDTO())); + response.put("email", userDTO.getUSER_EMAIL()); response.put("reservationPaymentDTO", reservationPaymentDTO); return ResponseEntity.ok(response); @@ -288,7 +294,7 @@ public ResponseEntity> deleteReservationPayment(@RequestBody } // 결제 정보 db와 실제 결제한 사이트의 결제 정보와 비교 - @CrossOrigin(origins = "http://localhost:8090") + @CrossOrigin(origins = {"http://localhost:8090", "https://shinhan.me"}) @PostMapping("/payment/complete") public ResponseEntity> completePayment(@RequestBody Map portonePayload){ Map response = new HashMap<>(); diff --git a/src/main/java/kr/co/team4/controller/ReviewController.java b/src/main/java/kr/co/team4/controller/ReviewController.java index 47361c1..1b83b37 100644 --- a/src/main/java/kr/co/team4/controller/ReviewController.java +++ b/src/main/java/kr/co/team4/controller/ReviewController.java @@ -12,9 +12,11 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpSession; +import java.io.InputStream; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.CompletableFuture; @Controller @RequestMapping("/review") @@ -32,14 +34,13 @@ public class ReviewController { */ @GetMapping("/list") public String listReviewController(HttpSession session, Model model) { - BigInteger user_Idx = (BigInteger) session.getAttribute("user_Idx"); - if (user_Idx == null) { - user_Idx = BigInteger.valueOf(0); + BigInteger user_idx = (BigInteger) session.getAttribute("user_idx"); + if (user_idx == null) { + user_idx = BigInteger.valueOf(0); } ReviewDTO dto = new ReviewDTO(); - dto.setUser_idx(user_Idx); + dto.setUser_idx(user_idx); model.addAttribute("count",reviewService.getReviewCount(dto)); -// System.out.println("Total review count: " + reviewService.getReviewCount(dto)); model.addAttribute("map",reviewService.getReviewList(dto)); // reviewListPage.jsp로 이동 @@ -86,6 +87,84 @@ public String showReviewWritePage(@RequestParam int user_idx, * * @return */ +// @PostMapping("") +// @ResponseBody +// public ResponseEntity> postReviewController( +// @RequestParam("user_idx") int user_idx, +// @RequestParam("reservation_idx") int reservation_idx, +// @RequestParam("room_idx") int room_idx, +// @RequestParam("user_comment") String user_comment, +// @RequestParam("rating") float rating, +// @RequestParam(value = "review_img_url", required = false) MultipartFile reviewImgFile) { +// Map response = new HashMap<>(); +// try { +// String reviewImgUrl = null; +// +// // DTO 생성 및 데이터 설정 +// ReviewDTO reviewDTO = new ReviewDTO(); +// reviewDTO.setUser_idx(BigInteger.valueOf(user_idx)); +// reviewDTO.setReservation_idx(reservation_idx); +// reviewDTO.setRoom_idx(room_idx); +// reviewDTO.setUser_comment(user_comment); +// reviewDTO.setRating(rating); +// reviewDTO.setReview_img_url(reviewImgUrl); +// +// // 리뷰 등록 처리 +// int result = reviewService.insertReview(reviewDTO); +// if (result == 1) { +// // 예약 상태 업데이트 +// reviewService.updateReservationStatus( +// reviewDTO.getUser_idx(), +// reviewDTO.getReservation_idx(), +// reviewDTO.getRoom_idx() +// ); +// +// // 이미지가 있을 경우 비동기적으로 파일 업로드 및 URL 업데이트 처리 +// if (reviewImgFile != null && !reviewImgFile.isEmpty()) { +// // 비동기적으로 이미지 업로드 처리 +// CompletableFuture.runAsync(() -> { +// try { +// // S3에 업로드할 파일 Key 생성 +// String fileExtension = ""; +// String originalFileName = reviewImgFile.getOriginalFilename(); +// if (originalFileName != null && originalFileName.contains(".")) { +// fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); +// } +// String imgKey = String.format("review/%d%s", reservation_idx, fileExtension); +// +// // S3에 파일 업로드 +// boolean uploadSuccess = s3Service.uploadFileToS3(imgKey, reviewImgFile); +// if (uploadSuccess) { +// // 업로드된 파일의 URL 생성 +// String finalReviewImgUrl = s3Service.getFileFromS3(imgKey); +// +// // 리뷰 이미지 URL 업데이트 처리 +// reviewService.updateReviewImageUrl(reservation_idx, finalReviewImgUrl); +// } else { +// throw new RuntimeException("S3 파일 업로드 실패"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// }); +// } +// // 리뷰가 성공적으로 등록되었으므로 사용자에게 성공 메시지 전송 +// response.put("status", "success"); +// response.put("message", "리뷰가 성공적으로 등록되었습니다."); +// +// } else { +// response.put("status", "fail"); +// response.put("message", "리뷰 등록에 실패했습니다."); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// response.put("status", "error"); +// response.put("message", "서버 오류가 발생했습니다."); +// } +// return ResponseEntity.ok(response); +// } + + @PostMapping("") @ResponseBody public ResponseEntity> postReviewController( @@ -97,37 +176,12 @@ public ResponseEntity> postReviewController( @RequestParam(value = "review_img_url", required = false) MultipartFile reviewImgFile) { Map response = new HashMap<>(); try { - String reviewImgUrl = null; - - //파일 업로드 부분 - if (reviewImgFile != null && !reviewImgFile.isEmpty()) { - // S3에 업로드할 파일 Key 생성 - String fileExtension = ""; - String originalFileName = reviewImgFile.getOriginalFilename(); - if (originalFileName != null && originalFileName.contains(".")) { - fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); - } - String imgKey = String.format("review/%d%s", reservation_idx, fileExtension); - - // S3에 파일 업로드 - boolean uploadSuccess = s3Service.uploadFileToS3(imgKey, reviewImgFile); - if (uploadSuccess) { - // 업로드된 파일의 URL 생성 - reviewImgUrl = s3Service.getFileFromS3(imgKey); - } else { - throw new RuntimeException("S3 파일 업로드 실패"); - } - } - // DTO 생성 및 데이터 설정 ReviewDTO reviewDTO = new ReviewDTO(); reviewDTO.setUser_idx(BigInteger.valueOf(user_idx)); reviewDTO.setReservation_idx(reservation_idx); reviewDTO.setRoom_idx(room_idx); reviewDTO.setUser_comment(user_comment); reviewDTO.setRating(rating); - reviewDTO.setReview_img_url(reviewImgUrl); - - // 리뷰 등록 처리 int result = reviewService.insertReview(reviewDTO); if (result == 1) { reviewService.updateReservationStatus( @@ -137,6 +191,37 @@ public ResponseEntity> postReviewController( ); response.put("status", "success"); response.put("message", "리뷰가 성공적으로 등록되었습니다."); + if (reviewImgFile != null && !reviewImgFile.isEmpty()) { + CompletableFuture uploadFuture = CompletableFuture.supplyAsync(() -> { + try { + String fileExtension = ""; + String originalFileName = reviewImgFile.getOriginalFilename(); + if (originalFileName != null && originalFileName.contains(".")) { + fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); + } + String imgKey = String.format("review/%d%s", reservation_idx, fileExtension); + boolean uploadSuccess = s3Service.uploadFileToS3(imgKey, reviewImgFile); + if (uploadSuccess) { + return s3Service.getFileFromS3(imgKey); + } else { + throw new RuntimeException("S3 파일 업로드 실패"); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + }); + String finalReviewImgUrl = uploadFuture.get(); + if (finalReviewImgUrl != null) { + reviewDTO.setReview_img_url(finalReviewImgUrl); + reviewService.updateReviewImageUrl(reservation_idx, finalReviewImgUrl); + } else { + response.put("status", "fail"); + response.put("message", "이미지 업로드 실패"); + return ResponseEntity.ok(response); + } + } + response.put("reviewImgUrl", reviewDTO.getReview_img_url()); // 이미지 URL 반환 } else { response.put("status", "fail"); response.put("message", "리뷰 등록에 실패했습니다."); @@ -149,4 +234,5 @@ public ResponseEntity> postReviewController( return ResponseEntity.ok(response); } + } diff --git a/src/main/java/kr/co/team4/controller/SearchController.java b/src/main/java/kr/co/team4/controller/SearchController.java index 785c278..255b452 100644 --- a/src/main/java/kr/co/team4/controller/SearchController.java +++ b/src/main/java/kr/co/team4/controller/SearchController.java @@ -2,6 +2,7 @@ import kr.co.team4.model.dto.LodgmentDTO; import kr.co.team4.model.dto.SearchFilterDTO; +import kr.co.team4.model.service.LodReviewService; import kr.co.team4.model.service.SearchService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -22,6 +23,9 @@ public class SearchController { @Autowired private SearchService searchService; + @Autowired + private LodReviewService lodReviewService; // LodReviewService 추가 + @GetMapping("/search/search.do") public String search(@RequestParam(value = "checkinDate", required = false) String checkinDate, @RequestParam(value = "checkoutDate", required = false) String checkoutDate, @@ -38,6 +42,16 @@ public String search(@RequestParam(value = "checkinDate", required = false) Stri // 필터 조건에 맞는 숙소 검색 List lodgments = searchService.searchLodgments(filter); + // 각 숙소에 대한 리뷰 통계 추가 + for (LodgmentDTO lodgment : lodgments) { + Map statistics = lodReviewService.getReviewStatistics(lodgment.getLod_idx()); + int reviewCount = statistics.get("REVIEW_COUNT") != null ? ((Long) statistics.get("REVIEW_COUNT")).intValue() : 0; + double avgRating = statistics.get("AVG_RATING") != null ? ((Double) statistics.get("AVG_RATING")) : 0.0; + + lodgment.setReviewCount(reviewCount); + lodgment.setAvgRating(avgRating); + } + // 검색 결과를 모델에 추가 model.addAttribute("lodgments", lodgments); return "search/search"; @@ -45,17 +59,17 @@ public String search(@RequestParam(value = "checkinDate", required = false) Stri @GetMapping("/search/updateUI.do") @ResponseBody - public Map searchUpdate(@RequestParam(value = "checkinDate", required = false) String checkinDate, - @RequestParam(value = "checkoutDate", required = false) String checkoutDate, - @RequestParam(value = "guestCount", required = false, defaultValue = "2") int guestCount, - @RequestParam(value = "petCount", required = false, defaultValue = "1") int petCount, - @RequestParam(value = "type", required = false, defaultValue = "0") int type, - @RequestParam(value = "weight", required = false, defaultValue = "0") int weight, - @RequestParam(value = "region", required = false, defaultValue = "0") int region, - Model model) { + public Map searchUpdate(Model model, + @RequestParam(value = "checkinDate", required = false) String checkinDate, + @RequestParam(value = "checkoutDate", required = false) String checkoutDate, + @RequestParam(value = "guestCount", required = false, defaultValue = "2") int guestCount, + @RequestParam(value = "petCount", required = false, defaultValue = "1") int petCount, + @RequestParam(value = "type", required = false, defaultValue = "0") int type, + @RequestParam(value = "weight", required = false, defaultValue = "0") int weight, + @RequestParam(value = "region", required = false, defaultValue = "0") int region + ) { Map response = new HashMap<>(); - // 필터 DTO 생성 SearchFilterDTO filter = new SearchFilterDTO(checkinDate, checkoutDate, guestCount, petCount, type, weight, region); @@ -65,12 +79,22 @@ public Map searchUpdate(@RequestParam(value = "checkinDate", req // 검색 결과를 모델에 추가 model.addAttribute("lodgments", lodgments); + // 각 숙소에 대한 리뷰 통계 추가 + for (LodgmentDTO lodgment : lodgments) { + Map statistics = lodReviewService.getReviewStatistics(lodgment.getLod_idx()); + int reviewCount = statistics.get("REVIEW_COUNT") != null ? ((Long) statistics.get("REVIEW_COUNT")).intValue() : 0; + double avgRating = statistics.get("AVG_RATING") != null ? ((Double) statistics.get("AVG_RATING")) : 0.0; + + lodgment.setReviewCount(reviewCount); + lodgment.setAvgRating(avgRating); + } + // 응답에 추가 response.put("lodgments", lodgments); - response.put("checkinDate",checkinDate); - response.put("checkoutDate",checkoutDate); - response.put("guestCount",guestCount); - response.put("petCount",petCount); + response.put("checkinDate", checkinDate); + response.put("checkoutDate", checkoutDate); + response.put("guestCount", guestCount); + response.put("petCount", petCount); return response; } } diff --git a/src/main/java/kr/co/team4/controller/SellerPageController.java b/src/main/java/kr/co/team4/controller/SellerPageController.java index 905772c..0a7c4b7 100644 --- a/src/main/java/kr/co/team4/controller/SellerPageController.java +++ b/src/main/java/kr/co/team4/controller/SellerPageController.java @@ -4,19 +4,45 @@ import kr.co.team4.model.service.SellerPageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpSession; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.regex.Pattern; @Controller @RequestMapping("/lodgment") public class SellerPageController { + + /* @ModelAttribute + public void addCommonAttributes(HttpSession session, Model model) { + // 로그인 상태 확인 + Object sellerSession = session.getAttribute("sellersession"); + if (sellerSession == null) { + return; // 로그인하지 않았으면 실행하지 않음 + } + + // 숙소명 설정 (로그인한 경우에만) + String lodgmentName = (String) session.getAttribute("lodgmentName"); + if (lodgmentName == null) { + Integer lod_idx = (Integer) session.getAttribute("lod_idx"); + if (lod_idx != null) { + lodgmentName = sellerPageService.getLodgmentName(lod_idx); + session.setAttribute("lodgmentName", lodgmentName); + } + } + + // 모델에 추가 (모든 JSP에서 사용 가능) + if (lodgmentName != null) { + model.addAttribute("lodgmentName", lodgmentName); + } + }*/ + /** * 생성자 : JDeok * 기 능 : 사장님 숙소등록 로직 @@ -30,7 +56,6 @@ public class SellerPageController { public String lodRegister(@ModelAttribute LodRegisterDTO dto, HttpSession session) throws IOException { dto.setSeller_idx((int) session.getAttribute("seller_idx")); - dto.setLod_img_url(""); sellerPageService.registerLod(dto); @@ -51,18 +76,29 @@ public String lodRegister(@ModelAttribute LodRegisterDTO dto, HttpSession sessio * - 2024.12.30 : JDeok(최초생성) */ @PostMapping("/insertRoom") - public String insertRoom(@ModelAttribute RoomListDTO roomListDto, HttpSession session) throws IOException { - List rooms = roomListDto.getRooms(); - // 각 객실 정보 처리 - for (RoomRegisterDTO roomDto : rooms) { - //객실 예약 - sellerPageService.registerRoom(roomDto); - - // 객실 이미지 저장 - sellerPageService.registerRoomImg(roomDto); + public String insertRoom(@ModelAttribute RoomListDTO roomListDto, HttpSession session, Model model) throws IOException { + + + try { + List rooms = roomListDto.getRooms(); + // 각 객실 정보 처리 + for (RoomRegisterDTO roomDto : rooms) { + //객실 예약 + sellerPageService.registerRoom(roomDto); + + // 객실 이미지 저장 + sellerPageService.registerRoomImg(roomDto); + } + + // 성공 상태를 Model에 추가 + model.addAttribute("success", true); + }catch (Exception e){ + + model.addAttribute("success", false); + model.addAttribute("errorMessage", "처리 중 오류가 발생했습니다."); } - return "redirect:/lodgment/roomRegister"; + return "seller/roomRegister"; } /** @@ -84,7 +120,8 @@ public String sellerDetailMain(Model model) { * - 2024.12.23 : JDeok(최초생성) */ @GetMapping("/sellerMain.do") - public String sellerMain() { + public String sellerMain(HttpSession session) { + session.removeAttribute("seller_idx"); /** * [check] 로그인상태인지 확인 * 로그인 상태이면 들어올 필요 X @@ -100,9 +137,15 @@ public String sellerMain() { */ @GetMapping("/lodRegister.do") public String lodRegister(HttpSession session) { - session.setAttribute("seller_idx", 10); - int seller_idx = (int) session.getAttribute("seller_idx"); - /*[check] 여기서 숙소테이블에 존재 여부 확인 후 if else로 나눠서 없으면 숙소등록 아니면 바로 숙소메인페이지 */ + + /*session.setAttribute("seller_idx", 2);*/ + System.out.println("start lodRegister"); + + SellerDTO seller = (SellerDTO) session.getAttribute("sellersession"); + int seller_idx = seller.getSELLER_IDX().intValue(); + session.setAttribute("seller_idx", seller_idx); + + /* 여기서 숙소테이블에 존재 여부 확인 후 if else로 나눠서 없으면 숙소등록 아니면 바로 숙소메인페이지 */ String checkYn = sellerPageService.lodCheck(seller_idx); if ("Y".equals(checkYn)) { @@ -123,6 +166,9 @@ public String lodRegister(HttpSession session) { */ @GetMapping("/roomRegister") public String roomRegister(HttpSession session) { + int lod_idx = (int)session.getAttribute("lod_idx"); + + /*sellerPageService.getRoomInformation(lod_idx);*/ return "seller/roomRegister"; } @@ -158,7 +204,7 @@ public List> getPeakPriceEvents(HttpSession session, Model m Map peakEvent = new HashMap<>(); peakEvent.put("title", "성수기"); peakEvent.put("start", dto.getPeak_str_dt()); - peakEvent.put("end", dto.getPeak_end_dt()); + peakEvent.put("end", LocalDate.parse(dto.getPeak_end_dt()).plusDays(1).toString()); peakEvent.put("color", "#8A5642"); events.add(peakEvent); } @@ -168,7 +214,7 @@ public List> getPeakPriceEvents(HttpSession session, Model m Map highPeakEvent = new HashMap<>(); highPeakEvent.put("title", "극성수기"); highPeakEvent.put("start", dto.getHpeak_str_dt()); - highPeakEvent.put("end", dto.getHpeak_end_dt()); + highPeakEvent.put("end", LocalDate.parse(dto.getHpeak_end_dt()).plusDays(1).toString()); highPeakEvent.put("color", "#DDAC7E"); events.add(highPeakEvent); } @@ -193,7 +239,7 @@ public String sellerPeakPrice(HttpSession session) { /** * 생성자 : JDeok - * 기 능 : 사장님 상세페이지 조회 + * 기 능 : 사장님 성수기기간 조회 * 변경사항 * - 2024.12.24 : JDeok(최초생성) */ @@ -208,17 +254,223 @@ public String sellerPeakInq(HttpSession session, Model model) { /** * 생성자 : JDeok - * 기 능 : 사장님 상세페이지 조회 + * 기능 : 예약현황 조회 + */ + @GetMapping("/sellerGetReservation") + public String sellerGetReservation( + @RequestParam(value = "dateRange", required = false) String dateRange, + @RequestParam(value = "ajax", required = false, defaultValue = "false") boolean ajax, + HttpSession session, Model model) { + Integer lod_idx = (int) session.getAttribute("lod_idx"); + + // 날짜 범위를 파싱 + String[] dates = dateRange != null ? dateRange.split(" ~ ") : new String[0]; + String startDate = dates.length > 0 ? dates[0] : null; + String endDate = dates.length > 1 ? dates[1] : null; + + // 파라미터를 Map으로 생성 + Map paramMap = new HashMap<>(); + paramMap.put("lod_idx" , lod_idx); + paramMap.put("startDate", startDate); + paramMap.put("endDate" , endDate); + + List reservations = sellerPageService.sellerGetReservation(paramMap); + + // 날짜 형식 변환 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy년 MM월 dd일 a hh시 mm분"); + SimpleDateFormat periodFormat = new SimpleDateFormat("yyyy년 MM월 dd일(E)"); // local.korean 추가 + + for (LodReservationDTO reservation : reservations) { + try { + // 예약 일자 변환 + if (reservation.getCreated() != null) { + Date createdDate; + if (reservation.getCreated().length() > 10) { + createdDate = dateTimeFormat.parse(reservation.getCreated()); + } else { + createdDate = dateFormat.parse(reservation.getCreated()); + } + reservation.setCreated(outputFormat.format(createdDate)); + } + + // 예약 기간 변환 + if (reservation.getRes_str_date() != null && reservation.getRes_end_date() != null) { + Date startPeriod = dateFormat.parse(reservation.getRes_str_date()); + Date endPeriod = dateFormat.parse(reservation.getRes_end_date()); + String startFormatted = periodFormat.format(startPeriod); + String endFormatted = periodFormat.format(endPeriod); + reservation.setRes_str_date(startFormatted); + reservation.setRes_end_date(endFormatted); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + // 응답 데이터 생성 + model.addAttribute("reservations", reservations); + + if (ajax) { + return "seller/sellerReservationList"; + } + return "seller/sellerShowReservation"; + } + + /** + * 생성자 : JDeok + * 기 능 : 리뷰 조회 * 변경사항 * - 2024.12.24 : JDeok(최초생성) */ - @GetMapping("/sellerGetReservation") - public String sellerGetReservation(HttpSession session, Model model) { + @GetMapping("/sellerGetReview") + public String sellerGetReview(HttpSession session, Model model) { - SavePeakPriceDTO dto = sellerPageService.getPeakDate((int) session.getAttribute("lod_idx")); - model.addAttribute("dto", dto); + int lod_idx = (int) session.getAttribute("lod_idx"); - return "seller/sellerShowReservation"; + Map review = sellerPageService.getrating(lod_idx); + + model.addAttribute("review", review); + + List dto = sellerPageService.getReview(lod_idx); + model.addAttribute("reviews", dto); + return "seller/sellerShowReview"; + } + /** + * 생성자 : JDeok + * 기 능 : 리뷰 조회 + * 변경사항 + * - 2024.12.24 : JDeok(최초생성) + */ + @PostMapping("/sellerReviewList") + public String addReply(@RequestBody Map requestBody, HttpSession session, Model model) { + + int lod_idx = (int) session.getAttribute("lod_idx"); + + Map reviewMap = new HashMap<>(); + reviewMap.put("review_idx", (int)requestBody.get("review_idx")); + reviewMap.put("replycontent", (String)requestBody.get("replycontent")); + sellerPageService.updateReview(reviewMap); + + List dto = sellerPageService.getReview(lod_idx); + model.addAttribute("reviews", dto); + + return "seller/sellerReviewList"; + } + + /** + * 생성자 : JDeok + * 기 능 : 사장님 매출관리 + * 변경사항 + * - 2024.12.24 : JDeok(최초생성) + */ + @GetMapping("/sellerGetSales") + public String getSalesManagement(Model model, HttpSession session) { + int lod_idx = (int) session.getAttribute("lod_idx"); + + Map salesMap = sellerPageService.getSales(lod_idx); + + model.addAttribute("month_date" , salesMap.get("month_date" )); // 월 날짜 + model.addAttribute("total_money", salesMap.get("total_money")); // 매출 금액 + + return "seller/sellerSales"; + } + + /** + * 생성자 : JDeok + * 기 능 : 숙소 정보 수정 + * 변경사항 + * - 2024.12.24 : JDeok(최초생성) + */ + @GetMapping("/sellerGetLodUpdate") + public String sellerGetLodUpdate(Model model, HttpSession session) { + int lod_idx = (int) session.getAttribute("lod_idx"); + + /* 숙소 데이터 가져오기 */ + Map lodMap = sellerPageService.getLodInformation(lod_idx); + /* 시설/서비스 가져오기 */ + List service = sellerPageService.getLodService(lod_idx); + + + model.addAttribute("lodMap", lodMap); + model.addAttribute("service", service); + + return "seller/sellerLodUpdate"; + } + + /** + * 생성자 : JDeok + * 기 능 : 숙소 업데이트 + * 변경사항 + * - 2025.01.06 : JDeok(최초생성) + */ + @PostMapping("/UpdateLod") + @Transactional // 트랜잭션 적용 + public String UpdateLod(@ModelAttribute LodRegisterDTO dto, HttpSession session, Model model) throws IOException { + try { + int lod_idx = (int) session.getAttribute("lod_idx"); + dto.setLod_idx(lod_idx); + + // 숙소 업데이트 로직 + sellerPageService.UpdateLod(dto); + + // 시설/서비스 업데이트 로직 + sellerPageService.UpdateFacility(dto); + + // 성공 상태를 Model에 추가 + model.addAttribute("success", true); + } catch (Exception e) { + e.printStackTrace(); // 로그 출력 + // 실패 상태를 Model에 추가 + model.addAttribute("success", false); + model.addAttribute("errorMessage", "처리 중 오류가 발생했습니다."); + } + + + return "seller/sellerLodUpdate"; + } + + /** + * 생성자 : JDeok + * 기 능 : 사장님 객실정보 + * 변경사항 + * - 2025.01.07 : JDeok(최초생성) + */ + @GetMapping("/sellerGetRoomUpdate") + public String sellerGetRoomUpdate(Model model, HttpSession session) { + int lod_idx = (int) session.getAttribute("lod_idx"); + + List roomList = sellerPageService.getRoomInformation(lod_idx); + + + model.addAttribute("roomList", roomList); + + return "seller/sellerRoomUpdate"; + } + + /** + * 생성자 : JDeok + * 기 능 : 사장님 객실정보 + * 변경사항 + * - 2025.01.07 : JDeok(최초생성) + */ + @PostMapping("/updateRoom") + public String UpdateLod(@ModelAttribute RoomListDTO dto, HttpSession session, Model model) { + List rooms = dto.getRooms(); + + try { + sellerPageService.updateRoom(rooms); + + // 성공 상태를 Model에 추가 + model.addAttribute("success", true); + }catch (Exception e){ + + model.addAttribute("success", false); + model.addAttribute("errorMessage", "처리 중 오류가 발생했습니다."); + } + + + return "seller/sellerRoomUpdate"; } -} +} \ No newline at end of file diff --git a/src/main/java/kr/co/team4/model/SHA256.java b/src/main/java/kr/co/team4/model/SHA256.java new file mode 100644 index 0000000..5335ae9 --- /dev/null +++ b/src/main/java/kr/co/team4/model/SHA256.java @@ -0,0 +1,34 @@ +package kr.co.team4.model; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Base64; + +import java.security.MessageDigest; + +public class SHA256 { + public SHA256() {} + + // 비밀번호 암호화 메서드 (SALT 없이 SHA-256만 사용) + public static String encrypt(String plainText) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + md.update(plainText.getBytes()); // 비밀번호를 바이트 배열로 변환하여 업데이트 + byte[] byteData = md.digest(); // 해시 값을 계산 + + // 계산된 바이트 데이터를 16진수로 변환하여 반환 + StringBuilder hexString = new StringBuilder(); + for (byte b : byteData) { + String hex = Integer.toHexString(0xFF & b); // 바이트 값을 16진수로 변환 + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); // 최종적으로 암호화된 해시값 반환 + } catch (Exception e) { + throw new RuntimeException("SHA-256 encryption failed", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/kr/co/team4/model/dto/BoardDTO.java b/src/main/java/kr/co/team4/model/dto/BoardDTO.java new file mode 100644 index 0000000..4a16c50 --- /dev/null +++ b/src/main/java/kr/co/team4/model/dto/BoardDTO.java @@ -0,0 +1,20 @@ +package kr.co.team4.model.dto; + +import lombok.Data; + +import java.math.BigInteger; +import java.sql.Timestamp; + +@Data +public class BoardDTO { + private BigInteger BOARD_IDX; + private String BOARD_TITLE; + private String BOARD_CONTENT; + private Timestamp CREATED; + private Timestamp UPDATED; + private String STATUS; + private String WRITER_NAME; + private BigInteger USER_IDX; + private String USER_NAME; + private String NICK_NAME; +} diff --git a/src/main/java/kr/co/team4/model/dto/CommentDTO.java b/src/main/java/kr/co/team4/model/dto/CommentDTO.java index 607ede0..855ca90 100644 --- a/src/main/java/kr/co/team4/model/dto/CommentDTO.java +++ b/src/main/java/kr/co/team4/model/dto/CommentDTO.java @@ -1,8 +1,6 @@ package kr.co.team4.model.dto; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.math.BigInteger; diff --git a/src/main/java/kr/co/team4/model/dto/CommentResDTO.java b/src/main/java/kr/co/team4/model/dto/CommentResDTO.java new file mode 100644 index 0000000..62661ba --- /dev/null +++ b/src/main/java/kr/co/team4/model/dto/CommentResDTO.java @@ -0,0 +1,16 @@ +package kr.co.team4.model.dto; +import lombok.*; + +import java.math.BigInteger; +import java.sql.Timestamp; +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CommentResDTO { + private BigInteger COMMENT_IDX; + private BigInteger BOARD_IDX; + private BigInteger USER_IDX; + private String NICK_NAME; + private String COMMENT; + private Timestamp CREATED; +} diff --git a/src/main/java/kr/co/team4/model/dto/LodLikeDTO.java b/src/main/java/kr/co/team4/model/dto/LodLikeDTO.java new file mode 100644 index 0000000..073b13e --- /dev/null +++ b/src/main/java/kr/co/team4/model/dto/LodLikeDTO.java @@ -0,0 +1,17 @@ +package kr.co.team4.model.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import java.math.BigInteger; +import java.sql.Timestamp; + +@Data +public class LodLikeDTO { + private BigInteger like_idx; + private BigInteger user_idx; + private int lod_idx; + private Timestamp created; + private Timestamp updated; + private String status; +} diff --git a/src/main/java/kr/co/team4/model/dto/LodReservationDTO.java b/src/main/java/kr/co/team4/model/dto/LodReservationDTO.java new file mode 100644 index 0000000..fe664a8 --- /dev/null +++ b/src/main/java/kr/co/team4/model/dto/LodReservationDTO.java @@ -0,0 +1,21 @@ +package kr.co.team4.model.dto; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class LodReservationDTO { + Integer lod_idx; // 숙소IDX + String created; // 예약일자 + String res_name; // 예약자 명 + String room_name; // 객실명 + BigDecimal paid_money; // 결제금액 + String res_str_date; // 예약시작일자 + String res_end_date; // 예약종료일자 + Integer res_people_cnt; // 예약한 인원수 + Integer res_pets_cnt; // 예약한 마릿수 + String request; // 예약자 요청사항 +} diff --git a/src/main/java/kr/co/team4/model/dto/LodgmentDTO.java b/src/main/java/kr/co/team4/model/dto/LodgmentDTO.java index fc6bdcb..0a92424 100644 --- a/src/main/java/kr/co/team4/model/dto/LodgmentDTO.java +++ b/src/main/java/kr/co/team4/model/dto/LodgmentDTO.java @@ -4,7 +4,9 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigInteger; import java.sql.Date; +import java.util.Map; @Data // @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 포함 @NoArgsConstructor // 기본 생성자 자동 생성 @@ -24,19 +26,17 @@ public class LodgmentDTO { private String reservation_notice; // 숙소 예약공지 private String lod_check_in; private String lod_check_out; - private double avg_rating; private double x; // 숙소 위도 private double y; // 숙소 경도 private Date created; private Date updated; private String status; + private BigInteger like_idx; // 찜 상태 (null이면 찜하지 않은 상태) + // 숙소 최소 가격 private int min_room_price; - // 리뷰 수 - private int count_reviews; - public String getFormattedLodCheckIn(){ if(lod_check_in != null && lod_check_in.length() >= 8){ return lod_check_in.substring(0,5); // 15:00:00 -> 15:00 반환 @@ -50,4 +50,8 @@ public String getFormattedLodCheckOut(){ return getFormattedLodCheckIn(); } + private int reviewCount; + private double avgRating; + + } diff --git a/src/main/java/kr/co/team4/model/dto/PriceDTO.java b/src/main/java/kr/co/team4/model/dto/PriceDTO.java new file mode 100644 index 0000000..18b9761 --- /dev/null +++ b/src/main/java/kr/co/team4/model/dto/PriceDTO.java @@ -0,0 +1,22 @@ +package kr.co.team4.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.sql.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PriceDTO { + private int price_idx; + private int lod_idx; + private Date peak_str_dt; + private Date peak_end_dt; + private Date hpeak_str_dt; + private Date hpeak_end_dt; + private Date created; + private Date updated; + private String status; +} diff --git a/src/main/java/kr/co/team4/model/dto/ReservationDTO.java b/src/main/java/kr/co/team4/model/dto/ReservationDTO.java index f767131..c9b2b2f 100644 --- a/src/main/java/kr/co/team4/model/dto/ReservationDTO.java +++ b/src/main/java/kr/co/team4/model/dto/ReservationDTO.java @@ -3,6 +3,7 @@ import lombok.Data; import java.math.BigInteger; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -15,24 +16,19 @@ public class ReservationDTO { private String res_merchant_id; private String res_name; private String res_phone_number; - private Date res_str_date; - private Date res_end_date; + private String res_str_date; + private String res_end_date; private int res_people_cnt; private int res_pets_cnt; private String request; private String status; - public String getFormattedCheckinDate(){ - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - return dateFormat.format(res_str_date); - } - public String getFormattedCheckoutDate(){ - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - return dateFormat.format(res_end_date); - } - public String getDateDifferenceDays(){ + public String getDateDifferenceDays() throws ParseException { // 두 날짜 차이 계산 - long differenceInMilliseconds = res_end_date.getTime() - res_str_date.getTime(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date res_str = dateFormat.parse(res_str_date); + Date res_end = dateFormat.parse(res_end_date); + long differenceInMilliseconds = res_end.getTime() - res_str.getTime(); // 밀리초를 일수로 변환 long differenceInDays = differenceInMilliseconds / (1000 * 60 * 60 * 24); diff --git a/src/main/java/kr/co/team4/model/dto/ReviewDTO.java b/src/main/java/kr/co/team4/model/dto/ReviewDTO.java index 0a0fae8..87bfb8c 100644 --- a/src/main/java/kr/co/team4/model/dto/ReviewDTO.java +++ b/src/main/java/kr/co/team4/model/dto/ReviewDTO.java @@ -25,6 +25,4 @@ public class ReviewDTO { private String room_name; private String lod_name; private String formattedDate; // 변환된 날짜 포맷 - - } diff --git a/src/main/java/kr/co/team4/model/dto/RoomDTO.java b/src/main/java/kr/co/team4/model/dto/RoomDTO.java index e56ff35..ae3cee6 100644 --- a/src/main/java/kr/co/team4/model/dto/RoomDTO.java +++ b/src/main/java/kr/co/team4/model/dto/RoomDTO.java @@ -27,11 +27,13 @@ public class RoomDTO { // 이미지 URL 리스트 private List room_img_urls; + private int total_room_price; + public String getFormattedRoomPrice(){ // 가격을 1,000 단위로 쉼표를 추가하는 포맷터 설정 DecimalFormat decimalFormat = new DecimalFormat("#,###"); // 가격을 쉼표 형식으로 포맷팅 - return decimalFormat.format(room_price); + return decimalFormat.format(total_room_price); } } diff --git a/src/main/java/kr/co/team4/model/dto/SellerDTO.java b/src/main/java/kr/co/team4/model/dto/SellerDTO.java index 1dd5073..daa4f51 100644 --- a/src/main/java/kr/co/team4/model/dto/SellerDTO.java +++ b/src/main/java/kr/co/team4/model/dto/SellerDTO.java @@ -5,7 +5,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; - import java.sql.Timestamp; import java.math.BigInteger; diff --git a/src/main/java/kr/co/team4/model/dto/SellerGetReviewDTO.java b/src/main/java/kr/co/team4/model/dto/SellerGetReviewDTO.java new file mode 100644 index 0000000..83e7fb0 --- /dev/null +++ b/src/main/java/kr/co/team4/model/dto/SellerGetReviewDTO.java @@ -0,0 +1,16 @@ +package kr.co.team4.model.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class SellerGetReviewDTO { + String user_name; // 사용자이름 + BigDecimal rating; // 평점 + String room_name; // 객실 명 + String user_comment; // 리뷰내용 + String review_img_url; // 리뷰 이미지url + String comment_status; // 사장님 답글 + Integer review_idx; // 리뷰idx +} diff --git a/src/main/java/kr/co/team4/model/mapper/BoardMapper.java b/src/main/java/kr/co/team4/model/mapper/BoardMapper.java new file mode 100644 index 0000000..246e7f8 --- /dev/null +++ b/src/main/java/kr/co/team4/model/mapper/BoardMapper.java @@ -0,0 +1,28 @@ +package kr.co.team4.model.mapper; + +import kr.co.team4.model.dto.BoardDTO; +import kr.co.team4.model.dto.CommentDTO; +import kr.co.team4.model.dto.CommentResDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigInteger; +import java.util.List; + +@Mapper +public interface BoardMapper { + + // 게시글 작성 + void write(BoardDTO board); + + // 게시글 목록 + List getBoardList(); + + // 특정글 조회 + BoardDTO detail(@Param("BOARD_IDX") int BOARD_IDX); + + void insertComment(CommentResDTO commentResDTO); // 파라미터 추가 + + List selectComment(@Param("BOARD_IDX") int BOARD_IDX); + +} diff --git a/src/main/java/kr/co/team4/model/mapper/LodLikeMapper.java b/src/main/java/kr/co/team4/model/mapper/LodLikeMapper.java new file mode 100644 index 0000000..395c77b --- /dev/null +++ b/src/main/java/kr/co/team4/model/mapper/LodLikeMapper.java @@ -0,0 +1,28 @@ +package kr.co.team4.model.mapper; + +import kr.co.team4.model.dto.LodLikeDTO; + +import kr.co.team4.model.dto.LodgmentDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigInteger; +import java.util.List; + +@Mapper +public interface LodLikeMapper { + + // 찜 추가 + int insertLike(LodLikeDTO lodLikeDTO); + + // 찜 삭제 + int deleteLike(@Param("user_idx") BigInteger user_idx, @Param("lod_idx") int lod_idx); + + // 특정 유저와 숙소 ID로 찜 상태 조회 + LodLikeDTO findByUserAndLod(LodLikeDTO dto); + + // 유저의 찜한 숙소 리스트 가져오기 + List getLikeList(BigInteger userIdx); +} + + diff --git a/src/main/java/kr/co/team4/model/mapper/ReservationMapper.java b/src/main/java/kr/co/team4/model/mapper/ReservationMapper.java index e3a581d..c3e5b1d 100644 --- a/src/main/java/kr/co/team4/model/mapper/ReservationMapper.java +++ b/src/main/java/kr/co/team4/model/mapper/ReservationMapper.java @@ -21,9 +21,15 @@ public interface ReservationMapper { List getUserReservations(UserReservedDTO dto); // 결제 관련 + int calcReservePayment(ReservationDTO dto); void paymentAdd(PaymentDTO dto); void paymentRemove(PaymentDTO dto); PaymentDTO getPaymentInform(String res_merchant_id); void updatePayment(PaymentDTO dto); + + // 배치 관련 + List getExpiredReservationIdxs(); + void deleteExpiredReservations(List reservations); + void deleteExpiredPayments(Listreservations); } diff --git a/src/main/java/kr/co/team4/model/mapper/ReviewMapper.java b/src/main/java/kr/co/team4/model/mapper/ReviewMapper.java index f7ee6b7..546f7a8 100644 --- a/src/main/java/kr/co/team4/model/mapper/ReviewMapper.java +++ b/src/main/java/kr/co/team4/model/mapper/ReviewMapper.java @@ -16,6 +16,7 @@ void updateReservationStatus(@Param("userIdx") BigInteger userIdx, @Param("reservationIdx") int reservationIdx, @Param("roomIdx") int roomIdx); + UserReservedDTO getRoomAndLodgmentName(@Param("room_Idx") int room_Idx); UserReservedDTO getUserName(@Param("user_Idx")int user_Idx); @@ -24,6 +25,16 @@ void updateReservationStatus(@Param("userIdx") BigInteger userIdx, int getReviewCount(ReviewDTO dto); + /** + * 리뷰 이미지 URL 업데이트 + * + * @param reservationIdx 예약 ID + * @param reviewImgUrl 리뷰 이미지 URL + * @return 업데이트된 행의 수 + */ + int updateReviewImageUrl(@Param("reservationIdx") int reservationIdx, + @Param("reviewImgUrl") String reviewImgUrl); + diff --git a/src/main/java/kr/co/team4/model/mapper/SellerPageMapper.java b/src/main/java/kr/co/team4/model/mapper/SellerPageMapper.java index 8ae12be..8aba88d 100644 --- a/src/main/java/kr/co/team4/model/mapper/SellerPageMapper.java +++ b/src/main/java/kr/co/team4/model/mapper/SellerPageMapper.java @@ -1,31 +1,54 @@ package kr.co.team4.model.mapper; -import kr.co.team4.model.dto.LodRegisterDTO; -import kr.co.team4.model.dto.RoomRegisterDTO; -import kr.co.team4.model.dto.SavePeakPriceDTO; +import kr.co.team4.model.dto.*; import org.apache.ibatis.annotations.Mapper; +import java.util.List; +import java.util.Map; + @Mapper public interface SellerPageMapper { - //사장님 페이지 String checkLod(int seller_idx); // 숙소존재여부 체크 int getLod (int seller_idx); // 숙소IDX 가져오기 //숙소등록 - void insertLod(LodRegisterDTO dto); // 숙소테이블 저장 - String checktFacility(String Facitlity); // 시설/서비스 보유여부 체크 - void insertLodMapSer(LodRegisterDTO dto); // 숙소매핑서비스테이블 저장 - void insertLodFacility(String facility ); // 시설/서비스테이블 저장 - int serviceIdxSearch(String Facitlity ); // 시설/서비스IDX 조회 - void updateLodImgUrl(LodRegisterDTO dto); // 숙소테이블-숙소이미지경로UPDATE - + void insertLod(LodRegisterDTO dto); // 숙소테이블 저장 + String checktFacility(String Facitlity); // 시설/서비스 보유여부 체크 + void insertLodMapSer(LodRegisterDTO dto); // 숙소매핑서비스테이블 저장 + void insertLodFacility(String facility ); // 시설/서비스테이블 저장 + int serviceIdxSearch(String Facitlity ); // 시설/서비스IDX 조회 + void updateLodImgUrl(LodRegisterDTO dto); // 숙소테이블-숙소이미지경로UPDA // 방 등록 - void insertRoom(RoomRegisterDTO dto); // 방테이블 저장 - void insertPhoto(RoomRegisterDTO dto); // 포토테이블 저장 + void insertRoom(RoomRegisterDTO dto); // 방테이블 저장 + void insertPhoto(RoomRegisterDTO dto); // 포토테이블 + // 성수기 페이지 + String checkPeak(SavePeakPriceDTO dto); // 성수기일정관리 테이블 보유여부 체크 + void updatePeak(SavePeakPriceDTO dto); // 성수기일정관리 테이블 Update + void insertPeak(SavePeakPriceDTO dto); // 성수기일정관리 테이블 Insert + SavePeakPriceDTO getPeakDate(int lod_idx); // 성수기일정관리 테이블 조회 + + // 예약현황조회 + List sellerGetReservation(Map paramMap); // 예약현황 조회 + + // 리뷰조회 + Map getrating(int lodIdx); // 리뷰 총 평점 조회 + List sellerGetReview(int lodIdx); // 리뷰 현황 조회 + void updateReview(Map reviewMap); // 사장님 답글 업데이트 + + // 매출관리 + Map getSales(int lodIdx); // 사장님 매출관리 + + // 숙소 수정 + Map getLodInformation(int lodIdx); // 숙소정보 가져오기 + List getLodService(int lodIdx); // 숙소 서비스 가져오기 + void UpdateLod(LodRegisterDTO dto); // 숙소정보 Update + void deleteLodMapper(int lod_idx); // 숙소매핑서비스 전체delete + + // 객실 수정 + List getRoomInformation(int lodIdx); // 객실정보 가져오기 + void updateRoom(RoomRegisterDTO dto); // 객실정보 변경 - String checkPeak(SavePeakPriceDTO dto); // 성수기일정관리 테이블 보유여부 체크 - void updatePeak(SavePeakPriceDTO dto); // 성수기일정관리 테이블 Update - void insertPeak(SavePeakPriceDTO dto); // 성수기일정관리 테이블 Insert - SavePeakPriceDTO getPeakDate(int lod_idx); // 성수기일정관리 테이블 조회 + // 숙소명 가져오기 + String getLodgmentName(int lodIdx); // 숙소명 가져오기 } diff --git a/src/main/java/kr/co/team4/model/service/BoardService.java b/src/main/java/kr/co/team4/model/service/BoardService.java new file mode 100644 index 0000000..dfb1a0c --- /dev/null +++ b/src/main/java/kr/co/team4/model/service/BoardService.java @@ -0,0 +1,26 @@ +package kr.co.team4.model.service; + +import kr.co.team4.model.dto.BoardDTO; +import kr.co.team4.model.dto.CommentDTO; +import kr.co.team4.model.dto.CommentResDTO; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public interface BoardService { + + // 게시글 작성 + void write(BoardDTO board) throws Exception; + + // 게시판 조회 + List getBoardList() throws Exception; + + // 특정글 조회 + BoardDTO detail(int BOARD_IDX) throws Exception; + + void insertComment(CommentResDTO commentResDTO) throws Exception; + + List selectComment(int BOARD_IDX) throws Exception; +} + diff --git a/src/main/java/kr/co/team4/model/service/BoardServiceImpl.java b/src/main/java/kr/co/team4/model/service/BoardServiceImpl.java new file mode 100644 index 0000000..3044165 --- /dev/null +++ b/src/main/java/kr/co/team4/model/service/BoardServiceImpl.java @@ -0,0 +1,51 @@ +package kr.co.team4.model.service; + +import kr.co.team4.model.dto.BoardDTO; +import kr.co.team4.model.dto.CommentDTO; +import kr.co.team4.model.dto.CommentResDTO; +import kr.co.team4.model.mapper.BoardMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class BoardServiceImpl implements BoardService { + + @Autowired + private BoardMapper boardMapper; + + @Override + public void write(BoardDTO board) throws Exception { + System.out.println("Service에서 전달받은 BoardDTO : " + board); + boardMapper.write(board); + } + + @Override + public List getBoardList() throws Exception { + + return boardMapper.getBoardList(); + } + + @Override + public BoardDTO detail(int BOARD_IDX) throws Exception{ + + return boardMapper.detail(BOARD_IDX); + } + + @Override + public void insertComment(CommentResDTO commentResDTO) throws Exception { + try { + boardMapper.insertComment(commentResDTO); // 댓글 삽입 + } catch (Exception e) { + throw new Exception("댓글 등록 오류", e); // 예외 처리 + } + } + + @Override + public List selectComment(int BOARD_IDX) throws Exception { + return boardMapper.selectComment(BOARD_IDX); + } +} diff --git a/src/main/java/kr/co/team4/model/service/LodLikeService.java b/src/main/java/kr/co/team4/model/service/LodLikeService.java new file mode 100644 index 0000000..9063b65 --- /dev/null +++ b/src/main/java/kr/co/team4/model/service/LodLikeService.java @@ -0,0 +1,18 @@ +package kr.co.team4.model.service; + +import kr.co.team4.model.dto.*; +import java.math.BigInteger; +import java.util.List; + + +public interface LodLikeService { + + // 찜 상태 토글 + boolean toggleLike(LodLikeDTO lodLikeDTO); + + // 찜한 숙소 리스트 가져오기 + List getLikeList(BigInteger userIdx); + + LodLikeDTO findByUserAndLod(LodLikeDTO dto); +} + diff --git a/src/main/java/kr/co/team4/model/service/LodLikeServiceImpl.java b/src/main/java/kr/co/team4/model/service/LodLikeServiceImpl.java new file mode 100644 index 0000000..7d5f5d1 --- /dev/null +++ b/src/main/java/kr/co/team4/model/service/LodLikeServiceImpl.java @@ -0,0 +1,54 @@ +package kr.co.team4.model.service; + +import kr.co.team4.model.dto.LodLikeDTO; +import kr.co.team4.model.dto.LodgmentDTO; +import kr.co.team4.model.mapper.LodLikeMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.math.BigInteger; +import java.util.List; + +@Service +public class LodLikeServiceImpl implements LodLikeService { + + @Autowired + private LodLikeMapper lodLikeMapper; + + @Override + public boolean toggleLike(LodLikeDTO lodLikeDTO) { + try { + // 기존 찜 상태 확인 + LodLikeDTO existing = lodLikeMapper.findByUserAndLod(lodLikeDTO); + + if (existing == null) { // 찜 추가 + System.out.println("찜 추가: USER_IDX = " + lodLikeDTO.getUser_idx() + ", lod_idx = " + lodLikeDTO.getLod_idx()); + lodLikeMapper.insertLike(lodLikeDTO); + return true; // 추가됨 + } else { // 찜 제거 + System.out.println("찜 제거: USER_IDX = " + lodLikeDTO.getUser_idx() + ", lod_idx = " + lodLikeDTO.getLod_idx()); + lodLikeMapper.deleteLike(lodLikeDTO.getUser_idx(), lodLikeDTO.getLod_idx()); + return false; // 제거됨 + } + } catch (Exception e) { + e.printStackTrace(); // 예외 로그 출력 + throw new RuntimeException("찜 상태 토글 중 오류 발생", e); + } + } + + + + @Override + public List getLikeList(BigInteger userIdx) { + return lodLikeMapper.getLikeList(userIdx); + } + + @Override + public LodLikeDTO findByUserAndLod(LodLikeDTO dto) { + + return lodLikeMapper.findByUserAndLod(dto); + } +} + + + + diff --git a/src/main/java/kr/co/team4/model/service/LoginServiceImpl.java b/src/main/java/kr/co/team4/model/service/LoginServiceImpl.java index 0db2f53..c79c0ab 100644 --- a/src/main/java/kr/co/team4/model/service/LoginServiceImpl.java +++ b/src/main/java/kr/co/team4/model/service/LoginServiceImpl.java @@ -1,5 +1,6 @@ package kr.co.team4.model.service; +import kr.co.team4.model.SHA256; import kr.co.team4.model.dto.SellerDTO; import kr.co.team4.model.dto.UserDTO; import kr.co.team4.model.mapper.LoginMapper; @@ -11,6 +12,8 @@ import java.util.Random; +import static java.security.spec.MGF1ParameterSpec.SHA256; + @Service public class LoginServiceImpl implements LoginService { @@ -22,6 +25,16 @@ public class LoginServiceImpl implements LoginService { // 회원가입 @Override public void userregister(UserDTO dto) throws Exception{ + try{ + // 비밀번호 암호화 (SHA-256만 사용) + String encryptedPwd = new SHA256().encrypt(dto.getUSER_PWD()); + dto.setUSER_PWD(encryptedPwd); + + }catch (Exception e){ + e.printStackTrace(); + throw new Exception("비밀번호 암호화에 실패하였습니다."); // 에러 메시지 전달 + + } mapper.userinsert(dto); } @@ -29,16 +42,21 @@ public void userregister(UserDTO dto) throws Exception{ // 사장님 회원가입 @Override public void sellerregister(SellerDTO dto) throws Exception { - + try{ + String encryptedPwd = new SHA256().encrypt(dto.getSELLER_PWD()); + dto.setSELLER_PWD(encryptedPwd); + + }catch (Exception e){ + e.printStackTrace(); + throw new Exception("비밀번호 암호화에 실패하였습니다."); + } mapper.sellerinsert(dto); } // 아이디 중복 검사 @Override public int ID_CHECK(String USER_ID) throws Exception { - return mapper.ID_CHECK(USER_ID); - } // 사장님 아이디 중복 검사 @@ -51,15 +69,33 @@ public int SELLER_ID_CHECK(String SELLER_ID) throws Exception { // 로그인 @Override public UserDTO userlogin(UserDTO dto) throws Exception { - - return mapper.userlogin(dto); + try { + // 입력된 비밀번호를 SHA-256으로 암호화 + String encryptedPassword = new SHA256().encrypt(dto.getUSER_PWD()); + + // 암호화된 비밀번호를 다시 dto에 설정 + dto.setUSER_PWD(encryptedPassword); + + // 로그인 시도 + return mapper.userlogin(dto); + } catch (Exception e) { + // 기타 예외 처리 + throw new Exception("로그인 처리 중 오류가 발생하였습니다.", e); + } } // 사장님 로그인 @Override public SellerDTO sellerlogin(SellerDTO dto) throws Exception { + try{ + String encryptedPassword = new SHA256().encrypt(dto.getSELLER_PWD()); + dto.setSELLER_PWD(encryptedPassword); + return mapper.sellerlogin(dto); + + }catch (Exception e){ + throw new Exception("로그인 처리 중 오류가 발생하였습니다.", e); + } - return mapper.sellerlogin(dto); } // 이메일 전송 diff --git a/src/main/java/kr/co/team4/model/service/ReservationService.java b/src/main/java/kr/co/team4/model/service/ReservationService.java index 3ad3ac6..a7716dd 100644 --- a/src/main/java/kr/co/team4/model/service/ReservationService.java +++ b/src/main/java/kr/co/team4/model/service/ReservationService.java @@ -27,4 +27,8 @@ public interface ReservationService { List getUserReservations(UserReservedDTO dto); ReservationDTO getReservationInform(ReservationDTO dto); UserDTO getUserInform(ReservationDTO dto); + int getReservationPayment(ReservationDTO dto); + + // 배치 작업 + void runBatchJob(); } diff --git a/src/main/java/kr/co/team4/model/service/ReservationServiceImpl.java b/src/main/java/kr/co/team4/model/service/ReservationServiceImpl.java index aa9ab6f..824e2e4 100644 --- a/src/main/java/kr/co/team4/model/service/ReservationServiceImpl.java +++ b/src/main/java/kr/co/team4/model/service/ReservationServiceImpl.java @@ -12,8 +12,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.web.client.RestTemplate; import java.time.LocalDate; @@ -29,6 +33,9 @@ public class ReservationServiceImpl implements ReservationService { @Autowired private ReservationMapper reservationMapper; + @Autowired + private PlatformTransactionManager transactionManager; + @Override public List getUserReservations(UserReservedDTO dto) { return reservationMapper.getUserReservations(dto); @@ -127,6 +134,11 @@ public UserDTO getUserInform(ReservationDTO dto) { return reservationMapper.getUserInform(dto); } + @Override + public int getReservationPayment(ReservationDTO dto) { + return reservationMapper.calcReservePayment(dto); + } + @Override @Transactional public boolean saveReservationPayment(PaymentDTO paymentDTO, ReservationDTO reservationDTO) { @@ -252,4 +264,29 @@ public Map verifyPayment(String impUid, String merchantUid){ } return response; } + + @Scheduled(cron = "${db.batch.clean}") + @Override + public void runBatchJob() { + + // Transaction 처리 + TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); + try{ + // 조건에 부합하는 삭제할 예약 인덱스들 가져오기 + List expired = reservationMapper.getExpiredReservationIdxs(); + + if(expired != null && !expired.isEmpty()) { + reservationMapper.deleteExpiredPayments(expired); + reservationMapper.deleteExpiredReservations(expired); + } + + // 트랜잭션 커밋 + transactionManager.commit(status); + System.out.println("배치작업으로 삭제된 예약 인덱스들: " + expired); + } catch (Exception e){ + // 트랜잭션 롤백 + transactionManager.rollback(status); + System.out.println("배치작업 실패: " + e.getMessage()); + } + } } diff --git a/src/main/java/kr/co/team4/model/service/RoomServiceImpl.java b/src/main/java/kr/co/team4/model/service/RoomServiceImpl.java index 39de4ba..c0b2388 100644 --- a/src/main/java/kr/co/team4/model/service/RoomServiceImpl.java +++ b/src/main/java/kr/co/team4/model/service/RoomServiceImpl.java @@ -15,7 +15,15 @@ public class RoomServiceImpl implements RoomService { @Override public RoomDTO getRoomDetail(int room_idx) { - return roomMapper.getRoomDetail(room_idx); // Mapper 호출 + RoomDTO room = roomMapper.getRoomDetail(room_idx); + + // room_notice 포맷팅 (줄바꿈 ->
) + if (room.getRoom_notice() != null) { + String formattedNotice = room.getRoom_notice().replace("\n", "
"); + room.setRoom_notice(formattedNotice); + } + + return room; } @Override diff --git a/src/main/java/kr/co/team4/model/service/SellerPageService.java b/src/main/java/kr/co/team4/model/service/SellerPageService.java index 57020cc..60d7929 100644 --- a/src/main/java/kr/co/team4/model/service/SellerPageService.java +++ b/src/main/java/kr/co/team4/model/service/SellerPageService.java @@ -1,26 +1,51 @@ package kr.co.team4.model.service; -import kr.co.team4.model.dto.LodRegisterDTO; -import kr.co.team4.model.dto.RoomRegisterDTO; -import kr.co.team4.model.dto.SavePeakPriceDTO; +import kr.co.team4.model.dto.*; import java.io.IOException; +import java.util.List; +import java.util.Map; public interface SellerPageService { /* 사장님페이지 메인 */ - String lodCheck(int seller_idx); // 숙소보유여부 체크 - int getLod (int seller_idx); // 숙소IDX 가져오기 + String lodCheck(int seller_idx); // 숙소보유여부 체크 + int getLod (int seller_idx); // 숙소IDX 가져오기 /* 숙소 등록 */ - void registerLod (LodRegisterDTO dto); // 숙소 등록 - void registerFacility(LodRegisterDTO dto); // 시설/서비스 등록 - void registerLodImg (LodRegisterDTO dto) throws IOException; // Amazon S3 이미지 등록 + void registerLod (LodRegisterDTO dto); // 숙소 등록 + void registerFacility(LodRegisterDTO dto); // 시설/서비스 등록 + void registerLodImg (LodRegisterDTO dto) throws IOException; // Amazon S3 이미지 등록 /* 객실 등록 */ - void registerRoom(RoomRegisterDTO roomDto); // 객실등록 - void registerRoomImg(RoomRegisterDTO dto) throws IOException; // 객실 이미지 등록 + void registerRoom(RoomRegisterDTO roomDto); // 객실등록 + void registerRoomImg(RoomRegisterDTO dto) throws IOException; // 객실 이미지 등록 - void savePeekPrice(SavePeakPriceDTO dto); // 성수기 일정등록 - SavePeakPriceDTO getPeakDate(int lodIdx); + /*성수기 페이지*/ + void savePeekPrice(SavePeakPriceDTO dto); // 성수기 일정등록 + SavePeakPriceDTO getPeakDate(int lodIdx); // 성수기 일정 조회 + + /* 예약현황 조회 */ + List sellerGetReservation(Map paramMap); // 예약현황 조회 + + /* 리뷰 조회 */ + Map getrating(int lodIdx); // 평균평점, 평가 수 조회 + List getReview(int lod_idx); // 리뷰 조회 + void updateReview(Map reviewMap); // 사장님 답글 업데이트 + + /* 매출 관리 */ + Map getSales(int lodIdx); // 사장님 매출관리 + + /* 숙소정보 수정 */ + Map getLodInformation(int lodIdx); // 숙소정보 조회 + List getLodService(int lodIdx); // 숙소서비스 조회 + void UpdateLod(LodRegisterDTO dto); // 숙소정보 수정 + void UpdateFacility(LodRegisterDTO dto); // 시설/서비스 수정 + + /* 객실정보 조회및변경 */ + List getRoomInformation(int lodIdx); // 객실정보 조회 + void updateRoom(List rooms); // 객실 수정 + + // 숙소명 조회 + String getLodgmentName(int lod_idx); // 숙소명 조회 } diff --git a/src/main/java/kr/co/team4/model/service/SellerPageServiceImpl.java b/src/main/java/kr/co/team4/model/service/SellerPageServiceImpl.java index a93bf03..47a1a97 100644 --- a/src/main/java/kr/co/team4/model/service/SellerPageServiceImpl.java +++ b/src/main/java/kr/co/team4/model/service/SellerPageServiceImpl.java @@ -1,9 +1,8 @@ package kr.co.team4.model.service; -import kr.co.team4.model.dto.LodRegisterDTO; -import kr.co.team4.model.dto.RoomRegisterDTO; -import kr.co.team4.model.dto.SavePeakPriceDTO; +import kr.co.team4.model.dto.*; import kr.co.team4.model.mapper.SellerPageMapper; +import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,7 +10,12 @@ import javax.servlet.http.HttpSession; import java.io.IOException; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; @Service public class SellerPageServiceImpl implements SellerPageService { @@ -26,8 +30,8 @@ public class SellerPageServiceImpl implements SellerPageService { * 생성자 : JDeok * 기 능 : 숙소보유여부 체크 * 변경사항 - * - 2024.12.30 : JDeok(최초생성) - * */ + * - 2024.12.30 : JDeok(최초생성) + */ @Override public String lodCheck(int seller_idx) { String checkYn = sellerPageMapper.checkLod(seller_idx); @@ -39,20 +43,21 @@ public String lodCheck(int seller_idx) { * 생성자 : JDeok * 기 능 : 숙소IDX 가져오기 * 변경사항 - * - 2024.12.31 : JDeok(최초생성) - * */ + * - 2024.12.31 : JDeok(최초생성) + */ @Override public int getLod(int seller_idx) { int lod_idx = sellerPageMapper.getLod(seller_idx); + return lod_idx; } /** * 생성자 : JDeok - * 기 능 : 숙소등록 + * 기 능 : 숙소등록 * 변경사항 - * - 2024.12.26 : JDeok(최초생성) - * */ + * - 2024.12.26 : JDeok(최초생성) + */ @Override @Transactional // 트랜잭션 적용 /* 숙소 등록 */ @@ -63,16 +68,16 @@ public void registerLod(LodRegisterDTO dto) { /** * 생성자 : JDeok - * 기 능 : 숙소대표이미지 S3 Upload + * 기 능 : 숙소대표이미지 S3 Upload * 변경사항 - * - 2024.12.30 : JDeok(최초생성) - * */ + * - 2024.12.30 : JDeok(최초생성) + */ @Override /* 숙소이미지 등록 */ public void registerLodImg(LodRegisterDTO dto) throws IOException { - String fileName = dto.getLod_img().getOriginalFilename(); // 파일명 ex) 001.png + String fileName = dto.getLod_img().getOriginalFilename(); // 파일명 ex) 001.png String FileExtension = fileName.substring(fileName.indexOf(".") + 1); // 파일확장자 ex) png - String imgKey = "lodgment/" + dto.getLod_idx() + "." +FileExtension; // lodgement/IDX.png + String imgKey = "lodgment/" + dto.getLod_idx() + "." + FileExtension; // lodgement/IDX.png MultipartFile multipartFile = dto.getLod_img(); s3Service.uploadFileToS3(imgKey, multipartFile); @@ -83,19 +88,20 @@ public void registerLodImg(LodRegisterDTO dto) throws IOException { sellerPageMapper.updateLodImgUrl(dto); } + /** * 생성자 : JDeok * 기 능 : 객실등록 * 변경사항 - * - 2024.12.30 : JDeok(최초생성) - * */ + * - 2024.12.30 : JDeok(최초생성) + */ @Override @Transactional // 트랜잭션 적용 public void registerRoom(RoomRegisterDTO roomDto) { System.out.println("roomDto : " + roomDto); - roomDto.setLod_idx((int)session.getAttribute("lod_idx")); + roomDto.setLod_idx((int) session.getAttribute("lod_idx")); /* 객실 정보 insert */ sellerPageMapper.insertRoom(roomDto); } @@ -104,22 +110,22 @@ public void registerRoom(RoomRegisterDTO roomDto) { * 생성자 : JDeok * 기 능 : 객실이미지 저장 * 변경사항 - * - 2024.12.31 : JDeok(최초생성) - * */ + * - 2024.12.31 : JDeok(최초생성) + */ @Override public void registerRoomImg(RoomRegisterDTO roomDto) throws IOException { List room_photos = roomDto.getRoom_photos(); int room_img_cnt = 0; - for(MultipartFile room_photo : room_photos){ + for (MultipartFile room_photo : room_photos) { /* 객실 img insert photo table */ - String fileName = room_photo.getOriginalFilename(); // 파일명 ex) 001.png + String fileName = room_photo.getOriginalFilename(); // 파일명 ex) 001.png String FileExtension = fileName.substring(fileName.indexOf(".") + 1); // 파일확장자 ex) png - String imgKey = "Room/" + - roomDto.getLod_idx() + // 숙소 IDX - roomDto.getRoom_idx() + // 객실 IDX - room_img_cnt + // 객실 이미지 채번 - "." +FileExtension; // Room/lod_idx + room_idx + 0.png + String imgKey = "Room/" + + roomDto.getLod_idx() + // 숙소 IDX + roomDto.getRoom_idx() + // 객실 IDX + room_img_cnt + // 객실 이미지 채번 + "." + FileExtension; // Room/lod_idx + room_idx + 0.png s3Service.uploadFileToS3(imgKey, room_photo); @@ -132,12 +138,13 @@ public void registerRoomImg(RoomRegisterDTO roomDto) throws IOException { } } + /** * 생성자 : JDeok * 기 능 : 시설/서비스 등록 * 변경사항 - * - 2024.12.26 : JDeok(최초생성) - * */ + * - 2024.12.26 : JDeok(최초생성) + */ @Override @Transactional // 트랜잭션 적용 자동롤백 /* 시설/서비스 등록 */ @@ -145,14 +152,14 @@ public void registerFacility(LodRegisterDTO dto) { /* 시설/서비스 체크 후 insert */ List facilities = dto.getLod_facility(); - if(facilities != null && facilities.isEmpty() == false){ - for(String facility : facilities){ - try{ + if (facilities != null && facilities.isEmpty() == false) { + for (String facility : facilities) { + try { String checkYn = sellerPageMapper.checktFacility(facility); - /* 시설/서비스 테이블에 같은 시설/서비스 명이 있는 경우 */ - /* 1. 숙소매핑서비스테이블(LOGMENT_MAPPING_SERVICE)에 INSERT함 */ - if("Y".equals(checkYn)){ + /* 시설/서비스 테이블에 같은 시설/서비스 명이 있는 경우 */ + /* 1. 숙소매핑서비스테이블(LOGMENT_MAPPING_SERVICE)에 INSERT함 */ + if ("Y".equals(checkYn)) { int service_idx = sellerPageMapper.serviceIdxSearch(facility); dto.setLod_facility_idx(service_idx); sellerPageMapper.insertLodMapSer(dto); @@ -160,15 +167,15 @@ public void registerFacility(LodRegisterDTO dto) { /* 시설/서비스 테이블에 같은 시설/서비스 명이 없는 경우 */ /* 1. 시설/서비스테이블에 INSERT 함 */ /* 2. 숙소매핑서비스테이블(LOGMENT_MAPPING_SERVICE)에 INSERT함 */ - else if("N".equals(checkYn)){ + else if ("N".equals(checkYn)) { sellerPageMapper.insertLodFacility(facility); int service_idx = sellerPageMapper.serviceIdxSearch(facility); dto.setLod_facility_idx(service_idx); sellerPageMapper.insertLodMapSer(dto); - }else{ + } else { System.out.println(checkYn); } - }catch (Exception e){ + } catch (Exception e) { // 예외 처리 System.err.println("시설/서비스 처리 중 오류 발생(lodRegisterServiceImpl.java): " + facility); e.printStackTrace(); // 상세 예외 출력 (로그 시스템을 활용하는 것을 권장) @@ -177,21 +184,22 @@ else if("N".equals(checkYn)){ } } } + /** * 생성자 : JDeok * 기 능 : 시설/서비스 등록 * 변경사항 - * - 2024.12.26 : JDeok(최초생성) - * */ + * - 2024.12.26 : JDeok(최초생성) + */ @Transactional // 트랜잭션 적용 자동롤백 @Override public void savePeekPrice(SavePeakPriceDTO dto) { String checkYn = sellerPageMapper.checkPeak(dto); - if("Y".equals(checkYn)){ + if ("Y".equals(checkYn)) { /* 보유 중이라면 일자 UPDATE*/ sellerPageMapper.updatePeak(dto); - }else if("N".equals(checkYn)){ + } else if ("N".equals(checkYn)) { /* 보유 중이 아니라면 새로 INSERT*/ sellerPageMapper.insertPeak(dto); } @@ -210,4 +218,202 @@ public SavePeakPriceDTO getPeakDate(int lodIdx) { return sellerPageMapper.getPeakDate(lodIdx); } + + /** + * 생성자 : JDeok + * 기 능 : 예약현황 조회 + * 변경사항 + * - 2025.01.03 : JDeok(최초생성) + */ + @Override + public List sellerGetReservation(Map paramMap) { + return sellerPageMapper.sellerGetReservation(paramMap); + } + + /** + * 생성자 : JDeok + * 기 능 : 리뷰 평점 + * 변경사항 + * - 2025.01.03 : JDeok(최초생성) + */ + @Override + public Map getrating(int lod_idx) { + + return sellerPageMapper.getrating(lod_idx); + } + + /** + * 생성자 : JDeok + * 기 능 : 리뷰 데이터 + * 변경사항 + * - 2025.01.03 : JDeok(최초생성) + */ + @Override + public List getReview(int lod_idx) { + return sellerPageMapper.sellerGetReview(lod_idx); + } + + /** + * 생성자 : JDeok + * 기 능 : 리뷰 사장님 답글 업데이트 + * 변경사항 + * - 2025.01.03 : JDeok(최초생성) + */ + @Override + public void updateReview(Map reviewMap) { + sellerPageMapper.updateReview(reviewMap); + } + + /** + * 생성자 : JDeok + * 기 능 : 매출관리 + * 변경사항 + * - 2025.01.03 : JDeok(최초생성) + */ + @Override + public Map getSales(int lodIdx) { + Map salesData = sellerPageMapper.getSales(lodIdx); + + List month_date = new ArrayList<>(Arrays.asList( + (String) salesData.get("min6_month_date"), // 6개월 전 달 + (String) salesData.get("min5_month_date"), // 5개월 전 달 + (String) salesData.get("min4_month_date"), // 4개월 전 달 + (String) salesData.get("min3_month_date"), // 3개월 전 달 + (String) salesData.get("min2_month_date"), // 2개월 전 달 + (String) salesData.get("min1_month_date"), // 1개월 전 달 + (String) salesData.get("current_month" ) // 이번달 + + + + )); + + ArrayList total_money = new ArrayList<>(Arrays.asList( + (BigDecimal) salesData.get("min6_month_money"), // 6개월 전 합산금액 + (BigDecimal) salesData.get("min5_month_money"), // 5개월 전 합산금액 + (BigDecimal) salesData.get("min4_month_money"), // 4개월 전 합산금액 + (BigDecimal) salesData.get("min3_month_money"), // 3개월 전 합산금액 + (BigDecimal) salesData.get("min2_month_money"), // 2개월 전 합산금액 + (BigDecimal) salesData.get("min1_month_money"), // 1개월 전 합산금액 + (BigDecimal) salesData.get("month_money" ), // 이번 달 합산금액 + (BigDecimal) salesData.get("total_money" ) // 이번달 + )); + + salesData.put("month_date", month_date); + salesData.put("total_money", total_money); + + return salesData; + } + + /** + * 생성자 : JDeok + * 기 능 : 숙소정보 가져오기 + * 변경사항 + * - 2025.01.06 : JDeok(최초생성) + */ + @Override + public Map getLodInformation(int lod_idx) { + return sellerPageMapper.getLodInformation(lod_idx); + } + + /** + * 생성자 : JDeok + * 기 능 : 시설/서비스 가져오기 + * 변경사항 + * - 2025.01.06 : JDeok(최초생성) + */ + @Override + public List getLodService(int lod_idx) { + return sellerPageMapper.getLodService(lod_idx); + } + + /** + * 생성자 : JDeok + * 기 능 : 변경된 숙소정보 Update + * 변경사항 + * - 2025.01.06 : JDeok(최초생성) + */ + @Override + public void UpdateLod(LodRegisterDTO dto) { + sellerPageMapper.UpdateLod(dto); + } + /** + * 생성자 : JDeok + * 기 능 : 변경된 시설/서비스 Update + * 변경사항 + * - 2025.01.06 : JDeok(최초생성) + */ + @Override + public void UpdateFacility(LodRegisterDTO dto) { + + List facilities = dto.getLod_facility(); + /* 매핑테이블 전부 삭제 후 insert */ + sellerPageMapper.deleteLodMapper(dto.getLod_idx()); + + if (facilities != null && !facilities.isEmpty()) { + for (String facility : facilities) { + try{ + String checkYn = sellerPageMapper.checktFacility(facility); + + + + if("Y".equals(checkYn)) { + /* 시설/서비스가 기존에 있는 데이터라면 mapper테이블만 insert */ + int service_idx = sellerPageMapper.serviceIdxSearch(facility); + dto.setLod_facility_idx(service_idx); + sellerPageMapper.insertLodMapSer(dto); + }else if("N".equals(checkYn)) { + /* 시설/서비스가 신규라면 새로 insert 후 mapper테이블도 inser */ + sellerPageMapper.insertLodFacility(facility); + int service_idx = sellerPageMapper.serviceIdxSearch(facility); + dto.setLod_facility_idx(service_idx); + sellerPageMapper.insertLodMapSer(dto); + }else{ + + } + }catch (Exception e){ + + } + } + } + } + + /** + * 생성자 : JDeok + * 기 능 : 방정보 가져오기 + * 변경사항 + * - 2025.01.08 : JDeok(최초생성) + */ + @Override + public List getRoomInformation(int lod_idx) { + + return sellerPageMapper.getRoomInformation(lod_idx); + } + + /** + * 생성자 : JDeok + * 기 능 : 방 정보 update + * 변경사항 + * - 2025.01.08 : JDeok(최초생성) + */ + @Override + public void updateRoom(List rooms) { + + for(RoomRegisterDTO dto : rooms) { + if(dto.getRoom_idx() != null){ + sellerPageMapper.updateRoom(dto); + } + } + + } + + /** + * 생성자 : JDeok + * 기 능 : 숙소명 가져오기 + * 변경사항 + * - 2025.01.08 : JDeok(최초생성) + */ + @Override + public String getLodgmentName(int lod_idx) { + return sellerPageMapper.getLodgmentName(lod_idx); + } } diff --git a/src/main/java/kr/co/team4/model/service/review/ReviewService.java b/src/main/java/kr/co/team4/model/service/review/ReviewService.java index 33e77ce..b0fe661 100644 --- a/src/main/java/kr/co/team4/model/service/review/ReviewService.java +++ b/src/main/java/kr/co/team4/model/service/review/ReviewService.java @@ -30,6 +30,9 @@ void updateReservationStatus(@Param("userIdx") BigInteger userIdx, int getReviewCount(ReviewDTO dto); + int updateReviewImageUrl(@Param("reservationIdx") int reservationIdx, + @Param("reviewImgUrl") String reviewImgUrl); + diff --git a/src/main/java/kr/co/team4/model/service/review/ReviewServiceImpl.java b/src/main/java/kr/co/team4/model/service/review/ReviewServiceImpl.java index e242662..a61583d 100644 --- a/src/main/java/kr/co/team4/model/service/review/ReviewServiceImpl.java +++ b/src/main/java/kr/co/team4/model/service/review/ReviewServiceImpl.java @@ -96,6 +96,16 @@ public int getReviewCount(ReviewDTO dto){ + /** + * 리뷰 이미지 URL 업데이트 + * + * @param reservationIdx 예약 ID + * @param reviewImgUrl 리뷰 이미지 URL + * @return 업데이트된 행의 수 + */ + public int updateReviewImageUrl(int reservationIdx, String reviewImgUrl) { + return reviewMapper.updateReviewImageUrl(reservationIdx, reviewImgUrl); // 업데이트된 행의 수 반환 + } diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties index 8ea6755..70ba15f 100644 --- a/src/main/resources/db.properties +++ b/src/main/resources/db.properties @@ -3,4 +3,7 @@ db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://database-1.cxqyiocqwn1m.ap-northeast-2.rds.amazonaws.com:3306/team4?useSSL=false&logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true db.username=admin -db.password=close_DBMS_4 \ No newline at end of file +db.password=close_DBMS_4 + +# 1시간 마다 배치 작업 실행 +db.batch.clean = 0 0 * * * ? \ No newline at end of file diff --git a/src/main/resources/kr/co/team4/model/mapper/BoardMapper.xml b/src/main/resources/kr/co/team4/model/mapper/BoardMapper.xml new file mode 100644 index 0000000..f821a0f --- /dev/null +++ b/src/main/resources/kr/co/team4/model/mapper/BoardMapper.xml @@ -0,0 +1,50 @@ + + + + + + + INSERT INTO BOARD (BOARD_TITLE, BOARD_CONTENT, USER_IDX) + VALUES (#{BOARD_TITLE}, #{BOARD_CONTENT}, #{USER_IDX}) + + + + + + + + + + INSERT INTO COMMENT (BOARD_IDX, USER_IDX, COMMENT) + VALUES (#{BOARD_IDX}, #{USER_IDX}, #{COMMENT}) + + + + + \ No newline at end of file diff --git a/src/main/resources/kr/co/team4/model/mapper/LodLikeMapper.xml b/src/main/resources/kr/co/team4/model/mapper/LodLikeMapper.xml new file mode 100644 index 0000000..af27748 --- /dev/null +++ b/src/main/resources/kr/co/team4/model/mapper/LodLikeMapper.xml @@ -0,0 +1,30 @@ + + + + + + + INSERT INTO LOD_LIKE (user_idx, lod_idx, status) + VALUES (#{user_idx}, #{lod_idx}, 'B') + + + + + DELETE FROM LOD_LIKE WHERE user_idx = #{user_idx} AND lod_idx = #{lod_idx} + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/kr/co/team4/model/mapper/LodgmentMapper.xml b/src/main/resources/kr/co/team4/model/mapper/LodgmentMapper.xml index 23c4d63..6e79b14 100644 --- a/src/main/resources/kr/co/team4/model/mapper/LodgmentMapper.xml +++ b/src/main/resources/kr/co/team4/model/mapper/LodgmentMapper.xml @@ -45,37 +45,64 @@ \ No newline at end of file diff --git a/src/main/resources/kr/co/team4/model/mapper/LoginMapper.xml b/src/main/resources/kr/co/team4/model/mapper/LoginMapper.xml index 5fadf97..544b0d2 100644 --- a/src/main/resources/kr/co/team4/model/mapper/LoginMapper.xml +++ b/src/main/resources/kr/co/team4/model/mapper/LoginMapper.xml @@ -23,12 +23,12 @@ \ No newline at end of file diff --git a/src/main/resources/kr/co/team4/model/mapper/ReservationMapper.xml b/src/main/resources/kr/co/team4/model/mapper/ReservationMapper.xml index eb7c9c7..102914f 100644 --- a/src/main/resources/kr/co/team4/model/mapper/ReservationMapper.xml +++ b/src/main/resources/kr/co/team4/model/mapper/ReservationMapper.xml @@ -22,9 +22,9 @@ WHERE R.USER_IDX = #{user_idx} AND P.STATUS = 'paid' + ORDER BY R.RES_STR_DATE DESC - - select user_name, user_email, user_phone_number + select USER_IDX, USER_NAME, USER_EMAIL, USER_PHONE_NUMBER from USERS - where user_idx = #{user_idx} + where USER_IDX = #{user_idx} + + insert into PAYMENT ( reservation_idx, paid_money, status @@ -148,4 +182,29 @@ set status = #{status} where payment_idx = #{payment_idx} + + + + + DELETE FROM RESERVATION + WHERE reservation_idx IN ( + + #{idx} + + ); + + + + DELETE FROM PAYMENT + WHERE reservation_idx IN ( + + #{idx} + + ); + \ No newline at end of file diff --git a/src/main/resources/kr/co/team4/model/mapper/ReviewMapper.xml b/src/main/resources/kr/co/team4/model/mapper/ReviewMapper.xml index db6c65d..809fa43 100644 --- a/src/main/resources/kr/co/team4/model/mapper/ReviewMapper.xml +++ b/src/main/resources/kr/co/team4/model/mapper/ReviewMapper.xml @@ -15,6 +15,12 @@ AND room_idx = #{roomIdx} + + UPDATE REVIEW + SET review_img_url = #{reviewImgUrl} + WHERE reservation_idx = #{reservationIdx} + + diff --git a/src/main/resources/kr/co/team4/model/mapper/SearchMapper.xml b/src/main/resources/kr/co/team4/model/mapper/SearchMapper.xml index c7002ed..3aabed7 100644 --- a/src/main/resources/kr/co/team4/model/mapper/SearchMapper.xml +++ b/src/main/resources/kr/co/team4/model/mapper/SearchMapper.xml @@ -25,21 +25,62 @@ + ( + SELECT MIN(calculated.room_price) + FROM ( + WITH RECURSIVE DateSeries AS ( + SELECT #{checkinDate} AS stay_date + UNION ALL + SELECT DATE_ADD(stay_date, INTERVAL 1 DAY) + FROM DateSeries + WHERE #{checkoutDate} > stay_date + ) + SELECT + r.room_idx, + FLOOR(SUM( + CASE + WHEN DAYOFWEEK(d.stay_date) IN (6, 7, 1) THEN + CASE + WHEN d.stay_date BETWEEN p.hpeak_str_dt AND p.hpeak_end_dt THEN r.room_price * 1.50 + WHEN d.stay_date BETWEEN p.peak_str_dt AND p.peak_end_dt THEN r.room_price * 1.30 + ELSE r.room_price * 1.10 + END + ELSE + CASE + WHEN d.stay_date BETWEEN p.hpeak_str_dt AND p.hpeak_end_dt THEN r.room_price * 1.40 + WHEN d.stay_date BETWEEN p.peak_str_dt AND p.peak_end_dt THEN r.room_price * 1.20 + ELSE r.room_price * 1.00 + END + END + )) AS room_price + FROM ROOM r LEFT JOIN PRICE p + ON p.lod_idx = r.lod_idx JOIN DateSeries d + ON d.stay_date >= #{checkinDate} AND #{checkoutDate} > d.stay_date + WHERE + r.lod_idx = B.LOD_IDX + AND NOT EXISTS ( + SELECT 1 + FROM RESERVATION res + WHERE res.room_idx = r.room_idx + AND res.lod_idx = r.lod_idx + AND res.res_end_date > #{checkinDate} + AND #{checkoutDate} > res.res_str_date + ) + GROUP BY r.room_idx + ) AS calculated + ) AS MIN_ROOM_PRICE, + NUMBER_OF_REVIEW AS COUNT_REVIEWS + FROM ROOM A JOIN LODGMENT B + ON A.LOD_IDX = B.LOD_IDX + LEFT JOIN RESERVATION C ON A.LOD_IDX = C.LOD_IDX + AND (#{checkinDate} NOT BETWEEN C.RES_STR_DATE AND C.RES_END_DATE + AND #{checkoutDate} NOT BETWEEN C.RES_STR_DATE AND C.RES_END_DATE) + WHERE 1=1 + AND A.MAX_PEOPLE_CNT >= #{guestCount} + AND A.MAX_PET_CNT >= #{petCount} + + GROUP BY B.LOD_IDX + ORDER BY B.LOD_NAME + diff --git a/src/main/resources/kr/co/team4/model/mapper/SellerPageMapper.xml b/src/main/resources/kr/co/team4/model/mapper/SellerPageMapper.xml index 32f0925..c4eadde 100644 --- a/src/main/resources/kr/co/team4/model/mapper/SellerPageMapper.xml +++ b/src/main/resources/kr/co/team4/model/mapper/SellerPageMapper.xml @@ -125,6 +125,7 @@ ************************************************************* */ UPDATE LODGMENT SET LOD_IMG_URL = #{lod_img_url} + , UPDATED = NOW() WHERE 1=1 AND LOD_IDX = #{lod_idx} @@ -186,8 +187,9 @@ * 기 능 : 숙소IDX 가져오기 * 변경사항 * - 2024.12.31 : JDeok(최초작성) + * - 2025.01.10 : JDeok(if문 추가) ************************************************************* */ - SELECT A.LOD_IDX + SELECT IF(COUNT(A.LOD_IDX) > 0, A.LOD_IDX, 0) AS lod_idx FROM LODGMENT A , SELLER B WHERE 1=1 @@ -243,6 +245,7 @@ , PEAK_END_DT = #{peak_end_dt} , HPEAK_STR_DT = #{hpeak_str_dt} , HPEAK_END_DT = #{hpeak_end_dt} + , UPDATED = NOW() WHERE 1=1 AND LOD_IDX = #{lod_idx} @@ -289,4 +292,306 @@ WHERE 1=1 AND LOD_IDX = #{lod_idx} + + + + + /* ************************************************************ + * 생성자 : JDeok + * 날 짜 : 2025.01.05 + * 시 간 : 오후 12:44 + * 기 능 : 사장님 답글 업데이트 (리뷰) + * 변경사항 + * - 2024.01.05 : JDeok(최초작성) + ************************************************************* */ + UPDATE REVIEW + SET LOD_COMMENT = #{replycontent} + , UPDATED = NOW() + WHERE 1=1 + AND REVIEW_IDX = #{review_idx} + + + + + + /* ************************************************************ + * 생성자 : JDeok + * 날 짜 : 2025.01.06 + * 시 간 : 오후 06:20 + * 기 능 : 숙소정보 Update + * 변경사항 + * - 2025.01.06 : JDeok(최초작성) + ************************************************************* */ + UPDATE LODGMENT + SET SELLER_NOTICE = #{seller_notice} -- 사장님알려주개 + , RESERVATION_NOTICE = #{reservation_notice} -- 예약공지 + , LOD_CHECK_IN = #{lod_check_in} -- 체크인시간 + , LOD_CHECK_OUT = #{lod_check_out} -- 체크아웃시간 + , UPDATED = NOW() + WHERE 1=1 + AND LOD_IDX = #{lod_idx} + + + /* ************************************************************ + * 생성자 : JDeok + * 날 짜 : 2025.01.07 + * 시 간 : 오전 10:39 + * 기 능 : 매핑테이블 삭제 + * 변경사항 + * - 2025.01.07 : JDeok(최초작성) + ************************************************************* */ + DELETE + FROM LODGMENT_MAPPING_SERVICE + WHERE 1=1 + AND LOD_IDX = #{lod_idx} + + + + /* ************************************************************ + * 생성자 : JDeok + * 날 짜 : 2025.01.08 + * 시 간 : 오전 10:28 + * 기 능 : 객실정보 Update + * 변경사항 + * - 2025.01.08 : JDeok(최초작성) + ************************************************************* */ + UPDATE ROOM + SET ROOM_NAME = #{room_name} + , ROOM_PRICE = #{room_price} + , MAX_PEOPLE_CNT = #{max_people_cnt} + , MAX_PET_CNT = #{max_pet_cnt} + , ROOM_NOTICE = #{room_notice} + , MAX_PETS_WEIGHT = #{max_pets_weight} + , UPDATED = NOW() + WHERE 1=1 + AND ROOM_IDX = #{room_idx} + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/GetReservationDetail.jsp b/src/main/webapp/WEB-INF/views/GetReservationDetail.jsp index 00bbce6..06e9c09 100644 --- a/src/main/webapp/WEB-INF/views/GetReservationDetail.jsp +++ b/src/main/webapp/WEB-INF/views/GetReservationDetail.jsp @@ -17,11 +17,11 @@ 같이가개 - 예약상세 - + +<%-- --%> <%@ include file="/WEB-INF/views/include/header.jsp" %>
- + 예약내역
-
- -
- <%-- 숙소 이미지--%> - 숙소 이미지 -
+
+ + + +
+ + 숙소 이미지 +
${dto.res_str_date} ~ ${dto.res_end_date}
- <%--
${dto.lod_name}
--%> - <%--
--%> - <%--
${dto.lod_name}
--%> - <%-- --%> - <%--
--%>
${dto.lod_name}
- +
- - - - 발자국 - 리뷰쓰기 - + + + + 발자국 + 리뷰쓰기 + + + + + 발자국 + 리뷰쓰기 + + +
- <%@ include file="/WEB-INF/views/include/footer.jsp" %> +
+ +
+ 예약 내역 없음 +<%--

현재 예약된 내역이 없습니다.

--%> +
+
+
+<%@ include file="/WEB-INF/views/include/footer.jsp" %> diff --git a/src/main/webapp/WEB-INF/views/GetReviewListPage.jsp b/src/main/webapp/WEB-INF/views/GetReviewListPage.jsp index f733386..a808c38 100644 --- a/src/main/webapp/WEB-INF/views/GetReviewListPage.jsp +++ b/src/main/webapp/WEB-INF/views/GetReviewListPage.jsp @@ -18,7 +18,9 @@ - + + +<%-- --%> @@ -183,12 +209,18 @@ <%@ include file="/WEB-INF/views/include/header.jsp" %>
- + 리뷰내역
+ 내가 쓴 총 리뷰 수 ${count} + +
+ -
+
숙소 이미지 @@ -199,19 +231,27 @@ ${dto.lod_name} ${dto.formattedDate}
- +<%-- --%> +
${dto.room_name}
- = 1}">filled">★ - = 2}">filled">★ - = 3}">filled">★ - = 4}">filled">★ - = 5}">filled">★ + + + + + + + + + +
- +
${dto.user_comment}
@@ -223,9 +263,14 @@
- - <%@ include file="/WEB-INF/views/include/footer.jsp" %> + + +
+ 리뷰 내역 없음 +
+
+
- +<%@ include file="/WEB-INF/views/include/footer.jsp" %> diff --git a/src/main/webapp/WEB-INF/views/PostReviewPage.jsp b/src/main/webapp/WEB-INF/views/PostReviewPage.jsp index 9f37801..4616765 100644 --- a/src/main/webapp/WEB-INF/views/PostReviewPage.jsp +++ b/src/main/webapp/WEB-INF/views/PostReviewPage.jsp @@ -5,7 +5,7 @@ Time: 오후 3:30 To change this template use File | Settings | File Templates. --%> -<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> @@ -14,9 +14,11 @@ 리뷰 작성 - - +<%-- --%> + +<%-- --%> + + + diff --git a/src/main/webapp/WEB-INF/views/board/gather.jsp b/src/main/webapp/WEB-INF/views/board/gather.jsp new file mode 100644 index 0000000..f0c5815 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/board/gather.jsp @@ -0,0 +1,163 @@ +<%-- + Created by IntelliJ IDEA. + User: User + Date: 2024-12-31 + Time: 오후 4:53 + To change this template use File | Settings | File Templates. +--%> +<%@ page language="java" contentType="text/html; charset=UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + + + + 모여보개 + + + + + <%@ include file="/WEB-INF/views/include/header.jsp" %> +
+
+

모여보개

+

자유롭게 반려동물 이야기를 나눠보개

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
번호제목글쓴이작성일자
게시글이 없습니다.
${row.BOARD_IDX} ${row.BOARD_TITLE}${row.WRITER_NAME}
+
+ <%@ include file="/WEB-INF/views/include/footer.jsp" %> +
+ + diff --git a/src/main/webapp/WEB-INF/views/board/write.jsp b/src/main/webapp/WEB-INF/views/board/write.jsp new file mode 100644 index 0000000..ef7fc8e --- /dev/null +++ b/src/main/webapp/WEB-INF/views/board/write.jsp @@ -0,0 +1,179 @@ +<%@ page import="kr.co.team4.model.dto.UserDTO" %><%-- + Created by IntelliJ IDEA. + User: User + Date: 2025-01-02 + Time: 오전 10:09 + To change this template use File | Settings | File Templates. +--%> +<%@ page language="java" contentType="text/html; charset=UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<% + UserDTO user = (UserDTO) session.getAttribute("usersession"); + + if(user == null) { + response.sendRedirect("/userlogin"); + return; + } + + String USER_NAME = user.getUSER_NAME(); +%> + + + 게시글 작성 + + + + + + + + <%@ include file="/WEB-INF/views/include/header.jsp" %> +
+
+
+
+
+

게시글 작성

+ + 목록으로 돌아가기 +
+
+
+
+
+ 글쓴이 : <%= USER_NAME != null ? USER_NAME : "알 수 없음" %> +
+
+ 제목 : +
+
+ +
+
+
+
+
+ <%@ include file="/WEB-INF/views/include/footer.jsp" %> + + + diff --git a/src/main/webapp/WEB-INF/views/fun/event1.jsp b/src/main/webapp/WEB-INF/views/fun/event1.jsp new file mode 100644 index 0000000..7fdc7ae --- /dev/null +++ b/src/main/webapp/WEB-INF/views/fun/event1.jsp @@ -0,0 +1,137 @@ +<%-- + Created by IntelliJ IDEA. + User: User + Date: 2025-01-07 + Time: 오전 10:40 + To change this template use File | Settings | File Templates. +--%> +<%@ page language="java" contentType="text/html; charset=UTF-8"%> + + + 너와 함께하개! 미션 스탬프 투어 + + + + + <%@ include file="/WEB-INF/views/include/header.jsp" %> +
+
+
+ +
🐾 너와 함께하개! 미션 스탬프 투어 이벤트 🐾
+
+ 목록으로 돌아가기 +
+
+
+ +
+
+

+ 🐾 너와 함께하개! 미션 스탬프 투어 이벤트 🐾

+ 반려견과 함께 특별한 추억을 쌓을 절호의 기회! 같이가개!에서 준비한 미션 스탬프 투어 이벤트에 참여하고 푸짐한 혜택을 받아보세요!
+ 여행도 즐기고, 미션도 클리어하며 추억을 기록하세요.
+ 무작위 추첨을 통해 특별한 선물도 기다리고 있습니다! 🎁

+ + 이벤트 상세 안내
+ 📅 참여 신청 기간
+ 2025년 1월 15일(수) ~ 2025년 2월 15일(토)

+ + 🗺️ 여행 기간
+ 2025년 2월 21일(금) ~ 2025년 2월 23일(일)

+ + 📝 후기 작성
+ 여행을 다녀오신 후 7일 이내에 후기를 남겨주세요.

+ + 모집 대상
+ ✨ 같이가개! 사이트를 통해 숙소를 예약한 모든 이용객
+ ⚡ 1박 2일 이상 숙박 여행객만 참여 가능

+ + 참여 방법
+ 같이가개! 사이트를 통해 숙소를 예약해주세요.
+ 여행 기간 동안 반려견과 함께한 사진을 매일매일 올리며 스탬프를 찍으세요!
+ 여행을 마치고 7일 이내에 후기까지 작성하면 참여 완료!

+ + 이벤트 당첨 안내
+ 📌 스탬프 15개 이상 찍고 여행 후 후기를 작성한 이용객 중
+ 무작위로 추첨하여 특별한 선물을 드립니다! 🎉
+ ✔️ 발표일: 2025년 2월 28일(금)

+ + 반려견과 함께 행복한 순간을 남기고, 이벤트 참여로 특별한 혜택도 받아보세요!
+ 지금 바로 참여 신청하고 멋진 추억을 만들어보세요! 🐶💕 +

+
+
+ <%@ include file="/WEB-INF/views/include/footer.jsp" %> + + diff --git a/src/main/webapp/WEB-INF/views/fun/event2.jsp b/src/main/webapp/WEB-INF/views/fun/event2.jsp new file mode 100644 index 0000000..e39bc47 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/fun/event2.jsp @@ -0,0 +1,136 @@ +<%-- + Created by IntelliJ IDEA. + User: User + Date: 2025-01-07 + Time: 오전 10:40 + To change this template use File | Settings | File Templates. +--%> +<%@ page language="java" contentType="text/html; charset=UTF-8"%> + + + 너와 함께하개! 미션 스탬프 투어 + + + + + <%@ include file="/WEB-INF/views/include/header.jsp" %> +
+
+
+ +
누가 누가 제일 잘 달리나 시합하개
+
+ 목록으로 돌아가기 +
+
+
+ +
+
+

+ 🐾 누가 누가 제일 잘 달리나 시합하개 🐾

+ 반려견과 함께 특별한 하루를 보내고, 소중한 추억을 만들어 보세요!

+ + 📅 일정 안내
+ 운동회 날짜: 2025년 2월 8일(토) 오전 10시 ~ 오후 6시
+ 모집 기간: 2025년 1월 15일(수) ~ 2025년 1월 31일(금)

+ + 👨‍👩‍👧‍👦 모집 대상
+ 반려동물과 특별한 경험을 하고 싶으신 분들
+ 귀여운 반려견과 함께 예쁜 사진과 추억을 만들고 싶은 모든 가족

+ + 📍 행사 장소
+ 어린이대공원 (서울 광진구 능동로 216)
+ 자연 속에서 반려견과 함께 뛰어놀며 잊지 못할 추억을 만들어 보세요!

+ + 🎡 체험 부스 소개
+ - 견생네컷: 반려견과 함께 특별한 사진을 남겨보세요~
+ - 청결미용: 반려견을 위한 미니 청결 관리 체험!
+ - 펫타로: 재미로 보는 반려견의 미래 운세!
+ - 예쁜 포토존: 소중한 순간을 사진으로 기록하세요!!

+ + 🎒 준비물
+ - 돗자리
+ - 간식
+ - 귀여운 반려견
+ - 반려견을 사랑하는 마음 ♥

+ + ⚠️ 주의사항
+ - 입마개 착용: 입마개가 필요한 견종은 반드시 준비해 주세요.
+ - 행사장 내 질서를 위해 반려인의 적극적인 협조 부탁드립니다.
+

+
+
+ <%@ include file="/WEB-INF/views/include/footer.jsp" %> + + diff --git a/src/main/webapp/WEB-INF/views/fun/event3.jsp b/src/main/webapp/WEB-INF/views/fun/event3.jsp new file mode 100644 index 0000000..3801f9d --- /dev/null +++ b/src/main/webapp/WEB-INF/views/fun/event3.jsp @@ -0,0 +1,136 @@ +<%-- + Created by IntelliJ IDEA. + User: User + Date: 2025-01-07 + Time: 오전 10:40 + To change this template use File | Settings | File Templates. +--%> +<%@ page language="java" contentType="text/html; charset=UTF-8"%> + + + 너와 함께하개! 미션 스탬프 투어 + + + + + <%@ include file="/WEB-INF/views/include/header.jsp" %> +
+
+
+ +
누가 더 잘 어울리개, 내가 싸게 줄개
+
+ 목록으로 돌아가기 +
+
+
+ +
+
+

+ 🐾 누가 더 잘 어울리개, 내가 싸게 줄개 🐾

+ 반려동물을 위한 특별한 바자회에 여러분을 초대합니다!
+ 함께 나누고, 돕고, 추억을 만들어가는 뜻깊은 하루를 만들어 보세요.

+ + 📅 일정 안내
+ 참여 신청 기간: 2025년 1월 1일(금) 오전 9시 ~ 2025년 2월 28일(금) 오후 6시
+ 바자회 날짜: 2025년 3월 15일(토) 오전 9시 ~ 오후 6시

+ + 👨‍👩‍👧‍👦 모집 대상
+ 반려동물과 함께 바자회 물품을 나눔하고 싶으신 모든 반려인♥

+ + 📦 바자회 지원 물품
+ - 반려동물 관련 물품: 장난감, 옷, 사료, 하우스 등
+ - 생활용품: 반려인들이 함께 나눌 수 있는 소형 가전, 주방용품 등

+ + 🚫 금지 물품 안내
+ - 거래가 불가능한 물품
+ - 반려동물 및 반려인에게 위협적이거나 안전하지 않은 물품

+ + 💝 바자회 수익금 이용 안내
+ 바자회를 통해 발생한 모든 수익금은 종합 유기견 보호 센터에 전액 기부됩니다.
+ 반려동물을 돕는 따뜻한 나눔의 손길을 함께해주세요!

+ + ⚠️ 주의사항
+ - 입마개 필수: 입마개가 필요한 견종은 반드시 준비해 주세요.
+ - 바자회 현장에서는 참여자와 반려동물 모두의 안전을 위해 행사 규칙을 꼭 준수해주세요.

+ + 🐕 따뜻한 마음을 나누는 특별한 하루
+ 이번 바자회는 단순한 나눔을 넘어, 유기견 보호와 반려동물 문화를 돕는 소중한 기회입니다.
+ 반려동물과 함께 나눔의 가치를 실천하며 따뜻한 추억을 만들어 보세요!
+

+
+
+ <%@ include file="/WEB-INF/views/include/footer.jsp" %> + + diff --git a/src/main/webapp/WEB-INF/views/fun/fun.jsp b/src/main/webapp/WEB-INF/views/fun/fun.jsp new file mode 100644 index 0000000..4c4197e --- /dev/null +++ b/src/main/webapp/WEB-INF/views/fun/fun.jsp @@ -0,0 +1,262 @@ +<%-- + Created by IntelliJ IDEA. + User: User + Date: 2024-12-31 + Time: 오후 3:43 + To change this template use File | Settings | File Templates. +--%> +<%@ page language="java" contentType="text/html; charset=UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + 재미나개 + + + + + + + + + +<%@ include file="/WEB-INF/views/include/header.jsp" %> +
+

재미나개

+

운동회 / 바자회 / 스탬프 투어 등 다양한 이벤트에 참여해 보개

+
+
+ 이벤트1 +
+
+
+ 알림판 +
+ +
+

+ 1. 참여 신청기간: 2025년 1월 15일(수) ~ 2025년 2월 15일(토)
+ 2. 여행기간: 2025년 2월 21일(금) ~ 2025년 2월 23일(일)
+ 3. 후기 작성 : 여행 후 7일 이내...
+ 4. 모집대상 : ✨ 같이가개! 사이트를 통해 숙소를 예약한 모든 이용객... +

+
+
+
+
+
+ 이벤트2 +
+
+
+ 운동회 +
+ +
+

+ 1. 운동회 날짜: 2025년 2월 8일(토) 오전 10시 ~ 오후 6시
+ 2. 모집기간: 2025년 1월 15일(수) ~ 2025년 1월 31일(금)
+ 3. 모집대상: 반려동물과 특별한 경험을 하고 싶으신 분들...
+ 4. 운동회 장소 : 어린이대공원 (서울 광진구 능동로 216)... +

+
+
+
+
+
+ 이벤트3 +
+
+
+ 이벤트3 +
+ +
+

+ 1. 참여 신청기간 : 2025년 1월 1일(금) 오전 9시 ~ 2025년 2월 28일(금) 오후 6시
+ 2. 바자회 기간 : 2025년 3월 15일(토) 오전 9시 ~ 오후6시
+ 3. 모집대상 : 반려동물과 함께 바자회 물품을 나눔하고 싶으신 모든 반려인♥
+ 4. 바자회 수익금 이용 안내 : 바자회를 통해 발생한 모든 수익금은 종합 유기견 보호 센터에 전액 기부됩니다... +

+
+
+
+
+<%@ include file="/WEB-INF/views/include/footer.jsp" %> + + diff --git a/src/main/webapp/WEB-INF/views/home.jsp b/src/main/webapp/WEB-INF/views/home.jsp index 0dce185..569fa61 100644 --- a/src/main/webapp/WEB-INF/views/home.jsp +++ b/src/main/webapp/WEB-INF/views/home.jsp @@ -35,8 +35,12 @@
-
-
+
+ +
+
+ +
@@ -81,27 +85,27 @@
- +
diff --git a/src/main/webapp/WEB-INF/views/include/header.jsp b/src/main/webapp/WEB-INF/views/include/header.jsp index 4464a82..9ba9830 100644 --- a/src/main/webapp/WEB-INF/views/include/header.jsp +++ b/src/main/webapp/WEB-INF/views/include/header.jsp @@ -6,12 +6,13 @@ @@ -32,6 +33,15 @@ active + + active + + + active + + + active + '' @@ -39,8 +49,44 @@ 구경하개 -
  • 모여보개
  • -
  • 재미나개
  • +
  • + active + + + active + + + active + + + '' + + ">모여보개
  • +
  • + active + + + active + + + active + + + active + + + '' + + ">재미나개
  • + diff --git a/src/main/webapp/WEB-INF/views/include/sellerHeader.jsp b/src/main/webapp/WEB-INF/views/include/sellerHeader.jsp index bece73f..e55d8a1 100644 --- a/src/main/webapp/WEB-INF/views/include/sellerHeader.jsp +++ b/src/main/webapp/WEB-INF/views/include/sellerHeader.jsp @@ -10,6 +10,7 @@ --%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    같이가개

    로고 @@ -19,11 +20,27 @@ String pageName = (String) request.getAttribute("currentPage"); if (pageName != null && "lodRegister".equals(pageName)) { %> - 숙소 등록 + 숙소 등록 <% } %> -
    + <% + String lod_name = (String) request.getAttribute("lodgmentName"); + if(lod_name != null && !lod_name.equals("")){ + %> + ${lodgmentName} + 로그아웃 + <% + } + %> + + diff --git a/src/main/webapp/WEB-INF/views/include/sellerSiderbar.jsp b/src/main/webapp/WEB-INF/views/include/sellerSiderbar.jsp index 20513b6..7003306 100644 --- a/src/main/webapp/WEB-INF/views/include/sellerSiderbar.jsp +++ b/src/main/webapp/WEB-INF/views/include/sellerSiderbar.jsp @@ -11,20 +11,20 @@ + + + + +
    + <%@ include file="/WEB-INF/views/include/header.jsp" %> + +
    +
    + +
    찜 한 숙소
    +
    +
    + +
    + 찜한 숙소 없음 +
    +
    +
    + +
    + + ${lodgment.lod_name} + +
    +

    ${lodgment.lod_name}

    + Heart Icon +
    +
    +
    +
    +
    + <%@ include file="/WEB-INF/views/include/footer.jsp" %> +
    +
    + + diff --git a/src/main/webapp/WEB-INF/views/lodgment/lodgment.jsp b/src/main/webapp/WEB-INF/views/lodgment/lodgment.jsp index db8c060..20db384 100644 --- a/src/main/webapp/WEB-INF/views/lodgment/lodgment.jsp +++ b/src/main/webapp/WEB-INF/views/lodgment/lodgment.jsp @@ -1,3 +1,4 @@ +<%@ page import="java.math.BigInteger" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> @@ -9,6 +10,8 @@ + + @@ -21,224 +24,215 @@ + <%-- 판매자 팝업 --%> - -
    <%@ include file="/WEB-INF/views/include/header.jsp" %> -
    - +
    + <%-- 세션에서 user_idx 가져오기 --%> + <% + BigInteger userIdx = (BigInteger) session.getAttribute("user_idx"); + %> + "> +
    - 객실 상세 - - ${lodgmentDTO.lod_name} -

    ${lodgmentDTO.lod_name}

    -
    - - 결과 없음 - +
    + +
    숙소 상세
    +
    + +
    + + +
    + ${lodgmentDTO.lod_name} + + Heart Icon +
    + +
    - -
    - -
    -
    -
    -

    리뷰 수: ${statistics['REVIEW_COUNT']}

    -

    - - - - ☆ (평점: ${statistics['AVG_RATING']}) - - - ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ ⭐ ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - -

    -
    - - 리뷰 더보기 > - + + + +
    + +
    +
    +
    +
    + +

    ${statistics['AVG_RATING']}

    +

    (${statistics['REVIEW_COUNT']})

    -
    -
    - - - +
    + -
    + + +

    등록된 리뷰가 없습니다.

    +
    +
    +
    -

    객실 선택

    -
    - -
    -
    +

    객실 + 선택

    +
    + +
    +
    calendar ${checkinDate} ~ ${checkoutDate} -
    - -
    - -
    + +
    + + - - - +
    +
    + - - - <%@ include file="/WEB-INF/views/room/roomcard.jsp" %> - - - -

    예약 가능한 방이 없습니다!

    -
    + +
    +

    체크인:

    +

    체크아웃:

    +
    + + -
    -

    위치/교통

    - - - - - - - - +
    +
    위치/교통
    + + + + + + + + - <%@ include file="/WEB-INF/views/lodgment/map.jsp" %> -
    + <%@ include file="/WEB-INF/views/lodgment/map.jsp" %> +
    - -
    - 숙소 주소 아이콘 - ${lodgmentDTO.lod_address} -
    + +
    + 숙소 주소 아이콘 + ${lodgmentDTO.lod_address} +
    - -
    -

    사장님이 알려주개

    -

    ${lodgmentDTO.seller_notice}

    -
    + +
    +

    사장님이 알려주개

    +

    ${lodgmentDTO.seller_notice}

    +
    - -
    -

    예약 공지

    -

    ${lodgmentDTO.reservation_notice}

    -
    + +
    +

    예약 공지

    +

    ${lodgmentDTO.reservation_notice}

    +
    -
    -

    시설/서비스

    +
    +

    시설/서비스

    * ${facility.lod_facility_name}

    @@ -247,31 +241,27 @@

    등록된 시설 정보가 없습니다.

    +
    + <%-- 판매자 정보 --%> +
    + - <%-- 판매자 정보 --%> -
    - -
    - +
    <%@ include file="/WEB-INF/views/include/footer.jsp" %>
    diff --git a/src/main/webapp/WEB-INF/views/lodgment/lodreview.jsp b/src/main/webapp/WEB-INF/views/lodgment/lodreview.jsp index 14e247e..1df4420 100644 --- a/src/main/webapp/WEB-INF/views/lodgment/lodreview.jsp +++ b/src/main/webapp/WEB-INF/views/lodgment/lodreview.jsp @@ -1,83 +1,106 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> -<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" isELIgnored="false" %> 리뷰 페이지 + + -
    - -
    -

    숙소 리뷰 페이지

    -

    리뷰 통계

    -

    리뷰 수: ${statistics['REVIEW_COUNT']}

    -

    평균 평점: - - ☆ (평점: ${statistics['AVG_RATING']}) - - - ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - - - ⭐ ⭐ ⭐ ⭐ ⭐ (평점: ${statistics['AVG_RATING']}) - -

    -
    - -
    - 리뷰 이미지 +
    + <%@ include file="/WEB-INF/views/include/header.jsp" %> +
    +
    + +
    리뷰 모아보기
    +
    +
    +
    + +
    +
    + +

    ${statistics['AVG_RATING']}

    +

    (${statistics['REVIEW_COUNT']})

    +
    +
    +
    + + + + + +
    + + 리뷰 이미지 +
    + + +
    + + +
    + + + +
    + +
    ${lodreview.reviewer_created}
    +
    + + +
    + ${lodreview.reviewer_nickname} +
    + + +
    ${lodreview.reviewer_content}
    + + + +
    +
    사장님
    +
    ${lodreview.manager_reply}
    +
    +
    +
    +
    +
    +
    + + +
    + 리뷰 없음 +
    +
    +
    -
    -
    -
    - - - ☆ - - - ⭐ - - - ⭐ ⭐ - - - ⭐ ⭐ ⭐ - - - ⭐ ⭐ ⭐ ⭐ - - - ⭐ ⭐ ⭐ ⭐ ⭐ - - -
    -
    ${lodreview.reviewer_created}
    -
    - -
    ${lodreview.reviewer_content}
    - -
    -
    사장님
    -
    ${lodreview.manager_reply}
    -
    -
    - +
    + <%@ include file="/WEB-INF/views/include/footer.jsp" %>
    \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/lodgment/map.jsp b/src/main/webapp/WEB-INF/views/lodgment/map.jsp index bfdaaed..2ef86c7 100644 --- a/src/main/webapp/WEB-INF/views/lodgment/map.jsp +++ b/src/main/webapp/WEB-INF/views/lodgment/map.jsp @@ -11,12 +11,12 @@ + src="https://dapi.kakao.com/v2/maps/sdk.js?appkey=1d380a4ab6f52b94fa5c601a140044ca&autoload=false&libraries=clusterer,services"> + + + -
    - logo -<%--

    같이가개 🐾

    --%> -
    +<%@ include file="/WEB-INF/views/include/sellerHeader.jsp" %>

    로그인