<!-- 게시판 글 리스트업 -->
<div class="card text-center">
<div class="card-body">
<table class="table table-striped">
<thead>
<tr id="listHead">
<th class="col-1">글번호</th>
<th class="col-1" id="cateHeadText">카테고리</th>
<th class="col-auto">제목</th>
<th class="col-1">닉네임</th>
<th class="col-1">작성 날짜</th>
<th class="col-1">조회수</th>
<th class="col-1">추천수</th>
</tr>
</thead>
<tbody>
<c:forEach var="db" items="${list}" varStatus="vs">
<tr>
<td><span class="badge bg-info"><c:out value="${db.boardNum}"/></span></td>
<td><span class="badge bg-secondary"><c:out value="${db.category}"/></span></td>
<td class="text-start"><span id="titleText" class="link-primary" onclick="submitForm(${db.boardNum})">${db.title}</span></td>
<td id="nameText"><c:out value="${db.nickname}"/></td>
<td id="timeText"><c:out value="${db.edittedDate}"/></td>
<td><span class="badge bg-warning text-dark"><c:out value="${db.viewCount > 9999 ? '9999+' : db.viewCount}"/></span></td>
<td><span class="badge bg-success"><c:out value="${Math.min(Math.max(db.recommendNum - db.disRecommendNum, -999), 999)}"/></span></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
//게시판 글 목록 보기
@GetMapping("/viewDBoardList")
public ModelAndView viewDBoardList(
@RequestParam(defaultValue = "1") int currentPage,
@RequestParam(defaultValue = "10") int perPage,
String orderBy, HttpServletRequest request, HttpServletResponse response) throws ParseException {
// 전체 글 개수 가져오기 (페이지네이션에 사용될 수 있음)
List<DebugBoardDTO> allPosts = serv.viewDBoardList(orderBy);
int totalPosts = allPosts.size();
// 현재 페이지에 해당하는 글 목록 생성
List<DebugBoardDTO> list = new ArrayList<>();
int startIndex = (currentPage - 1) * perPage;
int endIndex = Math.min(startIndex + perPage, totalPosts);
for (int i = startIndex; i < endIndex; i++) {
list.add(allPosts.get(i));
}
//리스트의 날짜 형식 변경
for (DebugBoardDTO debugBoardDTO : list) {
debugBoardDTO.setEdittedDate(chooseDateForm(debugBoardDTO.getEdittedDate()));
}
ModelAndView mav = new ModelAndView();
mav.addObject("currentPage", currentPage);
mav.addObject("perPage", perPage);
mav.addObject("orderBy", orderBy);
mav.addObject("totalPosts", totalPosts);
mav.addObject("list", list);
mav.setViewName("member/Board/viewDBoardList");
return mav;
}
<!-- 게시판 목록 출력 -->
<select id="viewDBoardList" resultType="DebugBoardDTO">
SELECT
boardNum, nickname, title, category, edittedDate, viewCount, recommendNum, disRecommendNum
FROM
debugBoardDB
<choose>
<when test="orderBy == 'boardNum'"> <!-- 기본정렬 -->
ORDER BY boardNum desc
</when>
<when test="orderBy == 'viewCount'"> <!-- 인기글 -->
WHERE viewcount > 100
ORDER BY viewCount desc
</when>
<when test="orderBy == 'recommendNum'"> <!-- 추천글 -->
WHERE recommendNum-disRecommendNum >= 20
ORDER BY recommendNum desc
</when>
<when test="orderBy == '정보'"> <!-- 정보 카테고리 -->
WHERE category = '정보'
ORDER BY boardNum desc
</when>
<when test="orderBy == '문제'"> <!-- 문제 카테고리 -->
WHERE category = '문제'
ORDER BY boardNum desc
</when>
<when test="orderBy == '질문'"> <!-- 질문 카테고리 -->
WHERE category = '질문'
ORDER BY boardNum desc
</when>
<when test="orderBy == '정리'"> <!-- 정리 카테고리 -->
WHERE category = '정리'
ORDER BY boardNum desc
</when>
<when test="orderBy == '잡담'"> <!-- 잡담 카테고리 -->
WHERE category = '잡담'
ORDER BY boardNum desc
</when>
<otherwise>
ORDER BY boardNum desc <!-- 기본정렬 -->
</otherwise>
</choose>
</select>
<!-- 게시판, 글 네비게이션 -->
<div class="row">
<!-- 글 정렬 -->
<div class="col">
<div class="btn-group" role="group" aria-label="글 정렬">
<button type="button" class="btn btn-outline-primary" name="orderBy" value="boardNum" onClick="changeList(this)">일반</button>
<button type="button" class="btn btn-outline-primary" name="orderBy" value="viewCount" onClick="changeList(this)">인기</button>
<button type="button" class="btn btn-outline-primary" name="orderBy" value="recommendNum" onClick="changeList(this)">추천</button>
</div>
</div>
<!-- 카테고리 검색 -->
<div class="col-auto">
<div class="mb-3">
<span class="badge bg-secondary" onClick="changeTab(this)">정보</span>
<span class="badge bg-secondary" onClick="changeTab(this)">문제</span>
<span class="badge bg-secondary" onClick="changeTab(this)">질문</span>
<span class="badge bg-secondary" onClick="changeTab(this)">정리</span>
<span class="badge bg-secondary" onClick="changeTab(this)">잡담</span>
</div>
</div>
</div>
//게시판 리스트 변경
function changeList(e) {
var orderBy = e.value
window.location.href ="<c:url value='/viewDBoardList'/>?orderBy="+orderBy;
}
//게시판 탭 변경
function changeTab(e) {
var orderBy = e.innerText
window.location.href ="<c:url value='/viewDBoardList'/>?orderBy="+orderBy;
}
<!-- 글 검색 -->
<form action="<c:url value='/searchPost'/>" method="post" class="d-flex">
<input type="hidden" name="orderBy" value="${orderBy}">
<select class="col-auto" name="searchTag" style="height: 38px;">
<option value="title_contents">제목 + 내용</option>
<option value="title">제목</option>
<option value="contents">내용</option>
<option value="nickname">닉네임</option>
</select>
<div class="col-auto"> </div>
<input class="col-auto" type="text" name="searchData" style="height: 38px;">
<div class="col-auto"> </div>
<button class="btn btn-primary col-auto" type="submit">검색</button>
</form>
//게시판 글 검색하기
@PostMapping("/searchPost")
public ModelAndView searchPost(
@RequestParam(defaultValue = "1") int currentPage,
@RequestParam(defaultValue = "10") int perPage,
String orderBy, String searchTag, String searchData) throws ParseException {
HashMap<String, String> map = new HashMap<>();
map.put("searchTag", searchTag);
map.put("searchData", searchData);
map.put("category", orderBy);
List<DebugBoardDTO> allPosts = serv.searchList(map);
int totalPosts = allPosts.size();
// 현재 페이지에 해당하는 글 목록 생성
List<DebugBoardDTO> list = new ArrayList<>();
int startIndex = (currentPage - 1) * perPage;
int endIndex = Math.min(startIndex + perPage, totalPosts);
for (int i = startIndex; i < endIndex; i++) {
list.add(allPosts.get(i));
}
//리스트의 날짜 형식 변경
for (DebugBoardDTO debugBoardDTO : list) {
debugBoardDTO.setEdittedDate(chooseDateForm(debugBoardDTO.getEdittedDate()));
}
ModelAndView mav = new ModelAndView();
mav.addObject("currentPage", currentPage);
mav.addObject("perPage", perPage);
mav.addObject("orderBy", orderBy);
mav.addObject("totalPosts", totalPosts);
mav.addObject("list", list);
mav.setViewName("member/Board/viewDBoardList");
return mav;
}
<!-- 게시판 글 검색 -->
<select id="searchList" resultType="DebugBoardDTO" parameterType="hashmap">
SELECT *
FROM debugBoardDB
<where>
<if test="searchTag == 'title_contents'"> <!-- 제목 + 내용 -->
AND (title LIKE '%'||#{searchData}||'%' OR content LIKE '%'||#{searchData}||'%')
</if>
<if test="searchTag == 'title'"> <!-- 제목 -->
AND title LIKE '%'||#{searchData}||'%'
</if>
<if test="searchTag == 'contents'"> <!-- 내용 -->
AND content LIKE '%'||#{searchData}||'%'
</if>
<if test="searchTag == 'nickname'"> <!-- 닉네임 -->
AND nickname = #{searchData}
</if>
</where>
ORDER BY boardNum desc
</select>
<!-- 페이지 번호 표시 -->
<nav aria-label="페이지 네비게이션">
<ul class="pagination justify-content-center">
<!-- 이전 버튼 -->
<li class="page-item">
<c:if test="${currentPage > 1}">
<c:url var="prevPageURL" value="/viewDBoardList">
<c:param name="currentPage" value="${currentPage - 1}"/>
<c:param name="perPage" value="${perPage}"/>
<c:param name="orderBy" value="${orderBy}"/>
</c:url>
<a class="page-link" href="${prevPageURL}" aria-label="Previous">이전</a>
</c:if>
</li>
<!-- 페이지 번호 -->
<c:choose>
<c:when test="${currentPage <= 5}">
<c:set var="startPage" value="1" />
</c:when>
<c:otherwise>
<c:set var="startPage" value="${currentPage - 5}" />
</c:otherwise>
</c:choose>
<c:forEach begin="${startPage}" end="${startPage + 9}" var="pageNum">
<c:if test="${pageNum > 0 && pageNum <= (totalPosts + perPage - 1) / perPage}">
<li class="page-item">
<c:url var="pageURL" value="/viewDBoardList">
<c:param name="currentPage" value="${pageNum}"/>
<c:param name="perPage" value="${perPage}"/>
<c:param name="orderBy" value="${orderBy}"/>
</c:url>
<a class="page-link" href="${pageURL}">${pageNum}</a>
</li>
</c:if>
</c:forEach>
<!-- 다음 버튼 -->
<li class="page-item">
<c:if test="${currentPage < (totalPosts + perPage - 1) / perPage -1}">
<c:url var="nextPageURL" value="/viewDBoardList">
<c:param name="currentPage" value="${currentPage + 1}"/>
<c:param name="perPage" value="${perPage}"/>
<c:param name="orderBy" value="${orderBy}"/>
</c:url>
<a class="page-link" href="${nextPageURL}" aria-label="Next">다음</a>
</c:if>
</li>
</ul>
</nav>
<!-- 익명게시판 -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">익명 게시판(정렬🤮🤮🤮)</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList'/>">메인</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=viewCount'/>">인기글</a></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=recommendNum'/>">추천글</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=정보'/>">정보</a></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=문제'/>">문제</a></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=질문'/>">질문</a></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=정리'/>">정리</a></li>
<li><a class="dropdown-item" href="<c:url value='/viewDBoardList?orderBy=잡담'/>">잡담</a></li>
</ul>
</li>
- onClick 이벤트로 작동하게 만드는 편이 현명할 것 같다.
//글을 게시한 날짜와 오늘 날짜를 비교하는 함수
public String chooseDateForm(String date) throws ParseException {
String str = date;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date edittedDate = format.parse(str); //등록, 수정된 날짜
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy. MM. dd."); //연월일 Format
SimpleDateFormat timeFormat = new SimpleDateFormat("HH시 mm분"); //시분 Format
String todayForm = dateFormat.format(new Date()); //현재 시간의 연월일
String edittedDateForm = dateFormat.format(edittedDate); //등록, 수정된 날짜의 연월일
String edittedDateTime = timeFormat.format(edittedDate); //등록, 수정된 날짜의 시분초
if(todayForm.equals(edittedDateForm)) { //오늘이 글을 쓴 날짜일 경우
return edittedDateTime; //jsp에 시분초 전송
} else {
return edittedDateForm; //jsp에 연월일 전송
}
}
<div id="header">
<jsp:include page="/WEB-INF/views/common/navibarForMember.jsp" flush="true"></jsp:include><br>
</div>
<hr>
<input type="hidden" id="userBylike" name="userBylike" value="${userBylike}">
<input type="hidden" id="userBydislike" name="userBydislike" value="${userBydislike}">
<input type="hidden" id="boardNum" name="boardNum" value="${dto.boardNum}">
<input type="hidden" id="userKey" name="userKey" value="${userKey}">
<input type="hidden" id="recommendNum" name="recommendNum" value="${dto.recommendNum}">
<input type="hidden" id="disRecommendNum" name="disRecommendNum" value="${dto.disRecommendNum}">
<div class="card">
<div class="card-body">
<!-- 글 제목과 카테고리 -->
<h5 class="card-title">[${dto.category}] ${dto.title}</h5>
<div class="row">
<!-- 글 작성자 / 작성 날짜(수정 날짜) / 조회수 / 추천수 -->
<div class="col">
<div class="card-subtitle mb-2 text-muted">작성자: ${dto.nickname}</div>
</div>
<div class="col-auto">
<div class="mb-3">
<div class="card-subtitle mb-2 text-muted">
<span>작성 날짜: ${dto.edittedDate}</span> |
<span>조회수: ${dto.viewCount > 9999 ? '9999+' : dto.viewCount}</span> |
<span>추천수: <span id="resultRecommendNum">${Math.min(Math.max(dto.recommendNum - dto.disRecommendNum, -999), 999)}</span></span>
</div>
</div>
</div>
<hr>
</div>
<!-- 글 내용 -->
<div class="card-text">${dto.content}</div>
</div>
<!-- 추천 / 비추천 -->
<div class="text-center mt-3">
<img src="<c:url value='/resources/images/member/well.svg'/>" width="50" height="50" id="recommendVal" data-val="like">
<img src="<c:url value='/resources/images/member/well.svg'/>" width="50" height="50" id="disrecommendVal" data-val="dislike">
</div>
<br>
</div>
<!-- 글 수정 / 글 삭제 / 글 목록 -->
<div class="button-container d-flex justify-content-end">
<form action="<c:url value='/checkUpdatePost'/>/${dto.boardNum}" method="post" style="display: inline-block;">
<input type="submit" id="update" value="글 수정" class="button-style">
</form>
<form action="<c:url value='/checkDeletePost'/>/${dto.boardNum}" method="post" style="display: inline-block;">
<input type="submit" id="delete" value="글 삭제" class="button-style">
</form>
<form action="<c:url value='/viewDBoardList'/>" method="get" style="display: inline-block;">
<input type="submit" id="list" value="글 목록" class="button-style">
</form>
</div>
//게시판 글 보기
@GetMapping("/viewDBoardContent")
public ModelAndView viewDBoardContent(int boardNum, HttpServletRequest request, HttpServletResponse response) throws ParseException {
//쿠키에 user 식별 key 있는지 확인
String userKey = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
// System.out.println("userKey 탐색");
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userKey")) {
userKey = cookie.getValue();
break; // 찾았으면 루프 종료
}
}
//글로 바로 들어왔을 경우, 사용자 식별을 위한 값을 쿠키에 저장
if(userKey == "") {
userKey = getNum();
Cookie key= new Cookie("userKey", userKey);
key.setMaxAge(60*60*24);
response.addCookie(key);
//System.out.println("====userKey Cookie 생성====");
}
}
//System.out.println("userKey: " + userKey);
//현재 게시판에 접속한 유저가 추천을 눌렀는지 쿠키에서 출력
String LikeCookieKey = "K"+userKey+"N"+boardNum+"Like";
String userBylike = "";
cookies = request.getCookies();
if (cookies != null) {
// System.out.println("CookieKey 탐색");
for (Cookie cookie : cookies) {
if (cookie.getName().equals(LikeCookieKey)) {
userBylike = cookie.getValue();
break;
}
}
}
//System.out.println("recommendVal: "+ userBylike);
//현재 게시판에 접속한 유저가 비추천을 눌렀는지 쿠키에서 출력
String disLikeCookieKey = "K"+userKey+"N"+boardNum+"disLike";
String userBydislike = "";
cookies = request.getCookies();
if (cookies != null) {
// System.out.println("CookieKey 탐색");
for (Cookie cookie : cookies) {
if (cookie.getName().equals(disLikeCookieKey)) {
userBydislike = cookie.getValue();
break;
}
}
}
//System.out.println("disRecommendVal: "+ userBydislike);
//이전글 | 다음글 가져오기
DebugBoardDTO prev = prevPost(boardNum);
if(prev != null) { //마지막 글은 prev가 null값
prev.setEdittedDate(chooseDateForm(prev.getEdittedDate()));
}
DebugBoardDTO next = nextPost(boardNum);
if(next != null) { //가장 최신 글은 next가 null값
next.setEdittedDate(chooseDateForm(next.getEdittedDate()));
}
//조회수 증가
serv.updateDBoardViewCount(boardNum);
//날짜 형식 변경
DebugBoardDTO dto = serv.viewDBoardContent(boardNum);
dto.setEdittedDate(chooseDateForm(dto.getEdittedDate()));
ModelAndView mav = new ModelAndView();
mav.addObject("userBylike", userBylike);
mav.addObject("userBydislike", userBydislike);
mav.addObject("userKey", userKey);
mav.addObject("dto", dto);
mav.addObject("prev", prev);
mav.addObject("next", next);
mav.setViewName("member/Board/viewDBoardContent");
return mav;
}
<!-- 게시판 글 출력 -->
<select id="viewDBoardContent" resultType="DebugBoardDTO" parameterType="int">
SELECT
boardNum, nickname, password, title, category, content, edittedDate, viewCount, recommendNum, disRecommendNum
FROM
debugBoardDB
WHERE
boardNum = #{boardNum}
</select>
<!-- 게시판글 조회수 수정 -->
<update id="updateDBoardViewCount" parameterType="Integer">
UPDATE debugBoardDB
SET viewCount = viewCount + 1
WHERE boardNum = #{boardNum}
</update>
<!-- 이전 글과 다음 글(없을 경우, 출력되지 않음) -->
<table width="100%">
<colgroup>
<col width="9%">
<col width="5%">
<col width="5%">
<col width="30%">
<col width="10%">
<col width="10%">
<col width="5%">
<col width="5%">
</colgroup>
<div class="prev-next">
<c:if test="${prev != null}">
<tr>
<td>이전 글:</td>
<td><span class="badge bg-info">${prev.boardNum}</span></td>
<td><span class="badge bg-secondary">${prev.category}</span></td>
<td><span class="text-start"><span id="titleText" class="link-primary" onclick="submitForm(${prev.boardNum})">${prev.title}</span></span></td>
<td><span class="nameText">${prev.nickname}</span></td>
<td><span class="timeText">${prev.edittedDate}</span></td>
<td><span class="badge bg-warning text-dark">${prev.viewCount > 9999 ? '9999+' : prev.viewCount}</span></td>
<td><span class="badge bg-success">${Math.min(Math.max(prev.recommendNum - prev.disRecommendNum, -999), 999)}</span></td>
</tr>
</c:if>
<c:if test="${next != null}">
<tr>
<td>다음 글:</td>
<td><span class="badge bg-info">${next.boardNum}</span></td>
<td><span class="badge bg-secondary">${next.category}</span></td>
<td><span class="text-start"><span id="titleText" class="link-primary" onclick="submitForm(${next.boardNum})">${next.title}</span></span></td>
<td><span class="nameText">${next.nickname}</span></td>
<td><span class="timeText">${next.edittedDate}</span></td>
<td><span class="badge bg-warning text-dark">${next.viewCount > 9999 ? '9999+' : next.viewCount}</span></td>
<td><span class="badge bg-success">${Math.min(Math.max(next.recommendNum - next.disRecommendNum, -999), 999)}</span></td>
</tr>
</c:if>
</div>
</table>
//현재 글의 이전 글 보기
public DebugBoardDTO prevPost(int boardNum) throws ParseException {
DebugBoardDTO prevPost = serv.prevPost(boardNum);
return prevPost;
}
//현재 글의 다음 글 보기
public DebugBoardDTO nextPost(int boardNum) throws ParseException {
DebugBoardDTO nextPost = serv.nextPost(boardNum);
return nextPost;
}
<!-- 현재 글의 이전 글 목록 -->
<select id="prevPost" parameterType="int" resultType="DebugBoardDTO">
select boardNum, nickname, title, category, edittedDate, viewCount, recommendNum, disRecommendNum
from debugboarddb
where boardNum =(
select max(boardnum)
from debugboarddb
where #{boardnum} > boardNum
)
</select>
<!-- 현재 글의 다음 글 목록 -->
<select id="nextPost" parameterType="int" resultType="DebugBoardDTO">
select boardNum, nickname, title, category, edittedDate, viewCount, recommendNum, disRecommendNum
from debugboarddb
where boardNum =(
select min(boardnum)
from debugboarddb
where boardnum > #{boardnum}
)
</select>
<!-- 추천 / 비추천 -->
<div class="text-center mt-3">
<img src="<c:url value='/resources/images/member/well.svg'/>" width="50" height="50" id="recommendVal" data-val="like">
<img src="<c:url value='/resources/images/member/well.svg'/>" width="50" height="50" id="disrecommendVal" data-val="dislike">
</div>
//익명 유저가 추천/비추천을 했을 경우, 그 상태 유지
$(function(){
if($("#userBylike").val() == "like"){
$("#recommendVal").attr("data-val", "likeChecked");
$("#recommendVal").attr("src", "<c:url value='/resources/images/member/like.svg'/>");
}
if($("#userBydislike").val() == "dislike"){
$("#disrecommendVal").attr("data-val", "dislikeChecked");
$("#disrecommendVal").attr("src", "<c:url value='/resources/images/member/dislike.svg'/>");
}
})
//추천을 위한 이미지 클릭 시 추천 숫자 변경 및 이미지 변경을 위한 ajax
$("#recommendVal").on("click", function(){
var userKey = $("#userKey").val();
var boardNum = $("#boardNum").val();
var recommendVal = $(this).attr("data-val");
if (recommendVal === "like") {
$.ajax({
type: "POST",
url: "<c:url value='/increaseDBoardRecommendNum'/>",
data: {
userKey: userKey,
boardNum: boardNum,
recommendVal: recommendVal
},
success: function(response) {
console.log(response)
$("#recommendNum").val(response)
$("#resultRecommendNum").text($("#recommendNum").val()-$("#disRecommendNum").val())
$("#recommendVal").attr("data-val", "likeChecked");
$("#recommendVal").attr("src", "<c:url value='/resources/images/member/like.svg'/>");
},
error: function(error) {
console.error("추천 기능 에러:", error);
}
})
} else (
alert("좋아요는 1일 1회만 가능합니다.")
)
})
//비추천을 위한 이미지 클릭 시 추천 숫자 변경 및 이미지 변경을 위한 ajax
$("#disrecommendVal").on("click", function(){
var userKey = $("#userKey").val();
var boardNum = $("#boardNum").val();
var disrecommendVal = $(this).attr("data-val");
if (disrecommendVal === "dislike") {
$.ajax({
type: "POST",
url: "<c:url value='/decreaseDBoardRecommendNum'/>",
data: {
userKey: userKey,
boardNum: boardNum,
disrecommendVal: disrecommendVal
},
success: function(response) {
$("#disRecommendNum").val(response)
$("#resultRecommendNum").text($("#recommendNum").val()-$("#disRecommendNum").val())
$("#disrecommendVal").attr("data-val", "dislikeChecked");
$("#disrecommendVal").attr("src", "<c:url value='/resources/images/member/dislike.svg'/>");
},
error: function(error) {
console.error("비추천 기능 에러:", error);
}
})
} else (
alert("싫어요는 1일 1회만 가능합니다.")
)
})
//익명 유저가 게시판에 추천을 했는지 여부를 쿠키로 저장
@PostMapping("/increaseDBoardRecommendNum")
public int increaseDBoardRecommendNum(String userKey, int boardNum, String recommendVal, HttpServletRequest request, HttpServletResponse response) {
DebugBoardDTO dto = dServ.viewDBoardContent(boardNum);
int recommendNum = dto.getRecommendNum();
//페이지에서 불러온 현재 접속한 유저Key | 페이지 번호 | 좋아요 상태
//System.out.println("userKey: " + userKey);
//System.out.println("boardNum: "+ boardNum);
//System.out.println("recommendVal: "+recommendVal);
String LikeCookieKey = "K"+userKey+"N"+boardNum+"Like";
//System.out.println(LikeCookieKey);
if(recommendVal.equals("like")) {
dServ.increaseDBoardRecommendNum(boardNum);
dto = dServ.viewDBoardContent(boardNum);
recommendNum = dto.getRecommendNum();
Cookie key= new Cookie(LikeCookieKey, recommendVal);
key.setMaxAge(60*60*24);
response.addCookie(key);
//System.out.println("userKey에 따른 페이지 좋아요 Cookie 생성");
}
return recommendNum;
}
//익명 유저가 게시판에 비추천을 했는지 여부를 쿠키로 저장
@PostMapping("/decreaseDBoardRecommendNum")
public int decreaseDBoardRecommendNum(String userKey, int boardNum, String disrecommendVal, HttpServletRequest request, HttpServletResponse response) {
DebugBoardDTO dto = dServ.viewDBoardContent(boardNum);
int disRecommendNum = dto.getDisRecommendNum();
//페이지에서 불러온 현재 접속한 유저Key | 페이지 번호 | 좋아요 상태
//System.out.println("userKey: " + userKey);
//System.out.println("boardNum: "+ boardNum);
//System.out.println("disrecommendVal: "+disrecommendVal);
String disLikeCookieKey = "K"+userKey+"N"+boardNum+"disLike";
//System.out.println(disLikeCookieKey);
if(disrecommendVal.equals("dislike")) {
dServ.decreaseDBoardRecommendNum(boardNum);
dto = dServ.viewDBoardContent(boardNum);
disRecommendNum = dto.getDisRecommendNum();
Cookie key= new Cookie(disLikeCookieKey, disrecommendVal);
key.setMaxAge(60*60*24);
response.addCookie(key);
// System.out.println("userKey에 따른 페이지 싫어요 Cookie 생성");
}
return disRecommendNum;
}
<!-- 게시판글 추천수 증가 -->
<update id="increaseDBoardRecommendNum" parameterType="Integer">
UPDATE debugBoardDB
SET
recommendNum = recommendNum+1
WHERE boardNum = #{boardNum}
</update>
<!-- 게시판글 비추천수 증가 -->
<update id="decreaseDBoardRecommendNum" parameterType="Integer">
UPDATE debugBoardDB
SET
disRecommendNum = disRecommendNum+1
WHERE boardNum = #{boardNum}
</update>
//게시판 글 쓰기 화면으로 이동
@PostMapping("/newPost")
public ModelAndView newPost() {
ModelAndView mav = new ModelAndView();
mav.setViewName("member/Board/newPost");
return mav;
}
<script type="text/javascript">
$(function(){
//카테고리 변경 시 db에 저장할 카테고리 name의 value에 반영
$("#categorySelect").on("change", function(){
$("#category").val($("#categorySelect").val());
})
//제출 시 입력된 정보를 컨트롤러로 전송
$("form").on("submit", function(){
$("#content").val( $("#txtContent").val());
})
})
</script>
</head>
<body>
<!-- 헤더 네비게이션바 -->
<div id="header">
<jsp:include page="/WEB-INF/views/common/navibarForMember.jsp" flush="true"></jsp:include><br>
</div>
<form id="board" action="insertPost" method="POST">
<input type="hidden" id="category" name="category" value="정보">
<input type="hidden" id="content" name="content">
<div class="mb-3">
<label for="title" class="form-label">제목:</label>
<input type="text" id="title" name="title" class="form-control" required="required" maxlength="35">
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="nickname" class="form-label">닉네임:</label>
<input type="text" id="nickname" name="nickname" class="form-control" required="required"
pattern="^[가-힣]{1,6}$|^[a-zA-Z0-9]{1,12}$"
title="한글 6글자 또는 영어+숫자 12글자 이내로 입력해주세요.">
</div>
<div class="col-md-6 mb-3">
<label for="password" class="form-label">비밀번호:</label>
<input type="password" id="password" name="password" class="form-control" maxlength="10" required="required">
</div>
</div>
<div class="mb-3">
<label for="txtContent" class="form-label">내용:</label>
<textarea id="txtContent" name="txtContent" class="form-control">내용을 입력해주세요</textarea>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="categorySelect" class="form-label">카테고리:</label>
<jsp:include page="/WEB-INF/views/common/categoryForDBoard.jsp" flush="true"></jsp:include>
</div>
<div class="col-md-6 mb-3">
<div class="text-end">
<input type="submit" value="제출">
</div>
</div>
</div>
</form>
<script src="${pageContext.request.contextPath}/resources/js/member/ckeditor.js"></script>
//게시판 글 등록(PRG 패턴을 통해 중복 등록 방지)
@PostMapping("/insertPost")
public ModelAndView insertPost(DebugBoardDTO dto) {
//추천|비추천 입력
dto.setRecommendNum(0);
dto.setDisRecommendNum(0);
dto.setViewCount(0);
//날짜 형식 변경
Date nowDate = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = format.format(nowDate);
dto.setPostDate(now);
serv.insertPost(dto);
List<DebugBoardDTO> list = serv.viewDBoardList("boardNum");
ModelAndView mav = new ModelAndView();
mav.addObject("list", list);
mav.setViewName("redirect:/viewDBoardList");
return mav;
}
<!-- 게시판글 입력-->
<insert id="insertPost" parameterType="DebugBoardDTO">
INSERT INTO debugBoardDB (
boardNum, nickname, password, title, category, content,
postDate, edittedDate)
VALUES (
DEBUGBOARD_SEQ.nextval, #{nickname}, #{password}, #{title}, #{category}, #{content},
#{postDate}, #{postDate})
</insert>
//게시판 글 수정하기 전 비밀번호 확인
@PostMapping("/checkUpdatePost/{bNum}")
public ModelAndView checkUpdatePost(@PathVariable("bNum") int boardNum) {
DebugBoardDTO dto = serv.viewDBoardContent(boardNum);
ModelAndView mav = new ModelAndView("member/Board/checkUpdatePost");
mav.addObject("dto", dto);
return mav;
}
//글 수정 / 글 삭제 시 비밀번호 확인
@PostMapping("/checkPostPW")
public String checkPostPW(int boardNum, String password) {
DebugBoardDTO dto = dServ.viewDBoardContent(boardNum);
if(dto.getPassword().equals(password)) {
return "yes";
} else {
return "no";
}
}
//게시판 글 수정화면으로 이동
@PostMapping("/checkUpdatePost/modifyPost")
public ModelAndView modifyPost(int boardNum) {
DebugBoardDTO dto = serv.viewDBoardContent(boardNum);
ModelAndView mav = new ModelAndView();
mav.addObject("dto", dto);
mav.setViewName("member/Board/modifyPost");
return mav;
}
<script>
$(function(){
//카테고리 select DB 반영
$("#categorySelect").val($("#category").val());
//카테고리 변경 시 db에 저장할 카테고리 name의 value에 반영
$("#categorySelect").on("change", function(){
$("#category").val($("#categorySelect").val());
})
//제출 시 입력된 정보를 컨트롤러로 전송
$("form").on("submit", function(){
$("#content").val( $("#txtContent").val());
})
})
</script>
</head>
<body>
<!-- 헤더 네비게이션바 -->
<div id="header">
<jsp:include page="/WEB-INF/views/common/navibarForMember.jsp" flush="true"></jsp:include><br>
</div>
<form id="board" action="<c:url value='/checkUpdatePost/updateDBoard'/>" method="post">
<input type="hidden" id="boardNum" name="boardNum" value="${dto.boardNum}">
<input type="hidden" id="category" name="category" value="${dto.category}">
<input type="hidden" id="content" name="content" value="">
<div class="mb-3">
<label for="title" class="form-label">제목:</label>
<input type="text" name="title" value="${dto.title}" class="form-control" required="required" maxlength="10" maxlength="35">
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="nickname" class="form-label">닉네임:</label>
<input type="text" name="nickname" value="${dto.nickname}" class="form-control" required="required"
pattern="^[가-힣]{1,6}$|^[a-zA-Z0-9]{1,12}$"
title="한글 6글자 또는 영어+숫자 12글자 이내로 입력해주세요.">
</div>
<div class="col-md-6 mb-3">
<label for="password" class="form-label">비밀번호:</label>
<input type="password" name="password" value="${dto.password}" class="form-control" required="required">
</div>
</div>
<div class="mb-3">
<label for="txtContent" class="form-label">내용:</label>
<textarea id="txtContent" name="txtContent" class="form-control">${dto.content}</textarea>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="categorySelect" class="form-label">카테고리:</label>
<jsp:include page="/WEB-INF/views/common/categoryForDBoard.jsp" flush="true"></jsp:include>
</div>
<div class="col-md-6 mb-3">
<div class="text-end">
<input type="submit" value="제출">
</div>
</div>
</div>
</form>
<script src="${pageContext.request.contextPath}/resources/js/member/ckeditor.js"></script>
//게시판 글 수정하기
@PostMapping("/checkUpdatePost/updateDBoard")
public String updateDBoard(DebugBoardDTO dto) {
// 현재 날짜와 시간을 dto에 입력
Date nowDate = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = format.format(nowDate);
dto.setEdittedDate(now);
serv.updateDBoard(dto);
return "redirect:/viewDBoardContent/?boardNum="+dto.getBoardNum();
}
//게시판 글 삭제 전 비밀번호 확인
@PostMapping("/checkDeletePost/{bNum}")
public ModelAndView checkDeletePost(@PathVariable("bNum") int boardNum) {
DebugBoardDTO dto = serv.viewDBoardContent(boardNum);
ModelAndView mav = new ModelAndView("member/Board/checkDeletePost");
mav.addObject("dto", dto);
return mav;
}
//게시판 글 삭제하기
@PostMapping("/deletePost")
public String deletePost(String nickname, int boardNum) {
serv.deleteDBoard(boardNum);
return "redirect:/viewDBoardList/";
}
'팀프로젝트 > SpringBoot' 카테고리의 다른 글
스프링부트 팀플) 20240328 카카오톡 로그인 (0) | 2024.03.28 |
---|---|
스프링부트 팀플) 20240327 구글로그인 기능 구현 (0) | 2024.03.27 |
스프링부트 팀플) 20240321_익명 게시판의 익명 유저가 추천/비추천했는지를 저장하고 출력 (0) | 2024.03.21 |
스프링부트 팀플) 20240320_날짜 형식 변경 (0) | 2024.03.20 |
스프링부트 팀플) 20240319 사용자가 게시판 접속 시 랜덤값 생성 (0) | 2024.03.19 |