07. 개발 : 구독 OTT 정보 (FullCalendar에 DB내용 출력하기)
○ 구독 OTT 정보
- 파티매칭 서비스에 가입하면 OTT 구독 정보가 DB에 저장되고,
이를 마이페이지에서 확인할 수 있는데,
FullCalendar를 이용해서 구독종료일을 한 눈에 확인할 수 있도록 보여주고자 함
○ FullCalendar 사용하기
- FullCalendar : 자바스크립트 기반 오픈소스 라이브러리
- 참고 : FullCalendar 공식 홈페이지
① CDN
<link href='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/main.min.css' rel='stylesheet' />
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/main.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/locales-all.min.js'></script>
② FullCalendar 표시될 영역
<div id='calendar-container'>
<div id='calendar'></div>
</div>
③ FullCalendar 관련 설정
- 구독 정보를 dto가 담긴 arraylist로 들고오는데, <c:forEach> 반복문을 이용해서 출력해주면 됨
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',//캘린더 형식
events: [//캘린더에 표시할 이벤트
<c:forEach var="dto" items="${list}">
{
title : "${ dto.ott_name } 구독 종료" ,
start : "${ fn:substring(dto.subscribe_end, 0, 10)}"
},
</c:forEach>
]
});
calendar.render();
calendar.addEvent(events);
});
</script>
○ 전체코드 : DAO/DTO
① SubscribeInfoDTO.java
package kr.co.opot.member;
public class SubscribeInfoDTO {
private String subscribe_no;
private String mem_id;
private String party_id;
private String party_role;
private String subscribe_start;
private String subscribe_end;
private String ott_name;
private int ott_price;
private String ott_id;
private String ott_pw;
public SubscribeInfoDTO() {}
//Getters Setters 생략
}//class end
② SubscribeInfoDAO.java : mySubread(), totalPay()
public ArrayList<SubscribeInfoDTO> mySubread(String mem_id) {
ArrayList<SubscribeInfoDTO> sublist=null;
SubscribeInfoDTO dto=null;
try {
con=dbopen.getConnection();//DB연결
sql=new StringBuilder();
sql.append(" SELECT subscribe_no, A.mem_id, A.party_id, party_role, ");
sql.append(" subscribe_start, subscribe_end, ott_name, ott_id, ott_pw, ott_price ");
sql.append(" FROM subscribe_info A JOIN party_info B ");
sql.append(" ON A.party_id=B.party_id ");
sql.append(" WHERE A.mem_id=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, mem_id);
rs = pstmt.executeQuery();
if(rs.next()) {
sublist= new ArrayList<SubscribeInfoDTO>();
do {
dto = new SubscribeInfoDTO();
dto.setSubscribe_no(rs.getString("subscribe_no"));
dto.setMem_id(rs.getString("A.mem_id"));
dto.setParty_id(rs.getString("A.party_id"));
dto.setParty_role(rs.getString("party_role"));
dto.setSubscribe_start(rs.getString("subscribe_start"));
dto.setSubscribe_end(rs.getString("subscribe_end"));
dto.setOtt_name(rs.getString("ott_name"));
dto.setOtt_id(rs.getString("ott_id"));
dto.setOtt_pw(rs.getString("ott_pw"));
dto.setOtt_price(rs.getInt("ott_price"));
sublist.add(dto);
}while(rs.next());
}//if end
}catch (Exception e) {
System.out.println("구독정보 상세보기 실패: " + e);
}finally{
DBclose.close(con, pstmt, rs);
}//try end
return sublist;
}
public int totalPay(String mem_id) {
int totalOttFee=0;
try {
con=dbopen.getConnection();//DB연결
sql=new StringBuilder();
sql.append(" SELECT SUM(ott_price) ");
sql.append(" FROM subscribe_info A JOIN party_info B ");
sql.append(" ON A.party_id=B.party_id ");
sql.append(" WHERE A.mem_id=? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, mem_id);
rs = pstmt.executeQuery();
if(rs.next()) {
totalOttFee=rs.getInt("SUM(ott_price)");
}//if end
}catch (Exception e) {
System.out.println("총 이용금액 조회 실패: " + e);
}finally{
DBclose.close(con, pstmt, rs);
}//try end
return totalOttFee;
}
○ 전체코드 : 뷰단
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ include file="../header.jsp"%>
<link href='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/main.min.css' rel='stylesheet' />
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/main.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/locales-all.min.js'></script>
<!-- 본문시작 mysubscribe.jsp -->
<!-- 구독OTT/파티 관리 -->
<div class="container text-center">
<div class="pagetitle">
<br>
<span><img src="/images/pot_icon.png" alt="OPOT" width="50px"></span>
<span><strong> 구독OTT/파티정보 </strong></span>
<br>
</div>
<h4><strong>${ s_mem_id }</strong> 님의 구독정보입니다 </h4>
<div id='calendar-container'>
<div id='calendar'></div>
</div>
<hr>
<table class="table">
<tr>
<th>구독OTT</th>
<th>이용금액</th>
<th>이용역할</th>
<th>구독시작일</th>
<th>구독종료일</th>
<th>OTT계정ID</th>
<th>OTT계정PW</th>
<th>파티탈퇴하기</th>
</tr>
<c:set var="savedFee" value="${ 0 }"></c:set>
<c:forEach var="dto" items="${list}">
<c:choose>
<c:when test="${dto.party_role eq '파티장' }">
<c:set var="serviceFee" value="${ 400 }"></c:set>
</c:when>
<c:when test="${dto.party_role eq '파티원' }">
<c:set var="serviceFee" value="${ 500 }"></c:set>
</c:when>
</c:choose>
<tr>
<td>${ dto.ott_name }</td>
<td>${ fn:substringBefore(dto.ott_price/4+serviceFee, '.') }</td>
<td>${ dto.party_role }</td>
<td>${ dto.subscribe_start }</td>
<td>${ dto.subscribe_end }</td>
<td>${ dto.ott_id }</td>
<td>${ dto.ott_pw }</td>
<c:choose>
<c:when test="${dto.party_role eq '파티장' }">
<td>
<form name="frm" id="frm" action="partyexit.do" method="post" onsubmit="return IDlog()">
<input type="submit" value="파티장 탈퇴" class="btn btn-default">
<input type="hidden" id="party_id" name="party_id" value="${ dto.party_id }">
<input type="hidden" id="mem_id" name="mem_id" value="${ s_mem_id }">
<input type="hidden" id="ott_name" name="ott_name" value="${ dto.ott_name }">
</form>
</td>
</c:when>
<c:when test="${dto.party_role eq '파티원' }">
<td>
<form name="frm" id="frm" action="partymemexit.do" method="post" onsubmit="return IDlog()">
<input type="submit" value="파티원 탈퇴" class="btn btn-default">
<input type="hidden" id="party_id" name="party_id" value="${ dto.party_id }">
<input type="hidden" id="mem_id" name="mem_id" value="${ s_mem_id }">
</form>
</td>
</c:when>
</c:choose>
</tr>
<tr style="display: none;">
<td colspan="8">${ savedFee=savedFee+dto.ott_price/4+serviceFee }</td>
</tr>
</c:forEach>
<tr>
<td colspan="3">혼자 사용시 결제했을 금액</td>
<td colspan="5">${ totalOttFee }</td>
</tr>
<tr>
<td colspan="3">OPOT 파티에서 결제한 금액</td>
<td colspan="5">${ fn:substringBefore(savedFee, '.') }</td>
</tr>
<tr>
<td colspan="3">OPOT으로 절약한 금액</td>
<td colspan="5">
<strong>${ fn:substringBefore(totalOttFee-savedFee, '.') }</strong>
</td>
</tr>
</table>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: [
<c:forEach var="dto" items="${list}">
{
title : "${ dto.ott_name } 구독 종료" ,
start : "${ fn:substring(dto.subscribe_end, 0, 10)}"
},
</c:forEach>
]
});
calendar.render();
calendar.addEvent(events);
});
</script>
</div>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>
○ 전체코드 : 컨트롤러 (MemberCont.java)
@RequestMapping({"/m_manage/mysubscribe.do", "/mysubscribe.do"})
public ModelAndView mysubscribe(HttpServletRequest req, HttpServletResponse resp, SubscribeInfoDTO dto) {
ModelAndView mav = new ModelAndView();
SubscribeInfoDAO subdao =new SubscribeInfoDAO();
HttpSession session = req.getSession();
String mem_id=(String) session.getAttribute("s_mem_id");
mav.addObject("totalOttFee", subdao.totalPay(mem_id));
mav.addObject("list", subdao.mySubread(mem_id));
mav.addObject("dto", dto);
mav.setViewName("m_manage/mysubscribe");
return mav;
}
○ 프로젝트 전체 보기
https://github.com/jaebin0817/SOLDESK_FinalProject
GitHub - jaebin0817/SOLDESK_FinalProject
Contribute to jaebin0817/SOLDESK_FinalProject development by creating an account on GitHub.
github.com
http://opot.cafe24.com/home.do
OPOT
#어드벤처 #사랑스러운 #한획을 그은 #속도감있는 #스릴러 #예능 #애니메이션 #휴먼 볼까말까 고민된다면⁉ 오늘 이거 볼까요? 👀 범죄도시2 ★★★☆☆ 3.2 종이의 집
opot.cafe24.com