21.01.13 상세페이지 markup 입력시 오류 수정 및 private, setter, getter 도입
2021. 1. 13. 19:43ㆍJAVA/Blog 사이트 프로젝트
<Article.java>
package com.sbs.example.mysqlTextBoard.dto;
import java.util.Map;
import lombok.Data;
@Data
public class Article {
public Article(Map<String, Object> articlesMap) {
this.id = (int) articlesMap.get("id");
this.regDate = (String) articlesMap.get("regDate");
this.updateDate = (String) articlesMap.get("updateDate");
this.title = (String) articlesMap.get("title");
this.body = (String) articlesMap.get("body");
this.boardId = (int) articlesMap.get("boardId");
this.memberId = (int) articlesMap.get("memberId");
this.likesCount = (int) articlesMap.get("likesCount");
this.commentsCount = (int) articlesMap.get("commentsCount");
this.hitCount = (int) articlesMap.get("hitCount");
if (articlesMap.containsKey("extra_memberName")) {
this.extra_memberName = (String) articlesMap.get("extra_memberName");
}
}
public Article() {
}
private int id;
private String regDate;
private String updateDate;
private String title;
private String body;
private int boardId;
private int memberId;
private String extra_memberName;
private int likesCount;
private int commentsCount;
private int hitCount;
public int getId() {
return id;
}
}
<BuildService.java>
// 게시판 별 게시물 상세페이지 생성
private void buildArticleDetailPages() {
List<Board> boards = articleService.getBoards();
for (Board board : boards) {
List<Article> articles = articleService.getBoardArticlesByCodeForPrint(board.getCode());
int articlesSize = articles.size();
if (articlesSize <= 0) {
continue;
}
int beforeArticleIndex = 0;
int x = beforeArticleIndex;
int beforeArticleId = articles.get(x).getId();
// String head = getHeadHtml("article_detail");
String sideBar = getSideBarHtml();
String topButton = Util.getFileContents("site_template/top-button.html");
String foot = Util.getFileContents("site_template/foot.html");
String template = Util.getFileContents("site_template/detail.html");
System.out.println("= article 상세페이지 생성 =");
for (Article article : articles) {
String head = getHeadHtml("article_detail", article);
StringBuilder html = new StringBuilder();
html.append(head);
String articleBody = article.getBody();
articleBody = articleBody.replaceAll("script", "t-script");
StringBuilder body = new StringBuilder();
body.append("<div class=\"article-detail-cell__board-name\">");
body.append("<div>");
body.append("<span>게시판 : </span><span>" + board.getName() + " 게시판</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__id\">");
body.append("<div>");
body.append("<span>번호 : </span><span>" + article.getId() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__member-id\">");
body.append("<div>");
body.append("<span>작성자 : </span><span>" + article.getExtra_memberName() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__reg-date\">");
body.append("<div>");
body.append("<span>작성일 : </span><span>" + article.getRegDate() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__update-date\">");
body.append("<div>");
body.append("<span>수정일 : </span><span>" + article.getUpdateDate() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__hitsCount\">");
body.append("<div>");
body.append("<span>조회수 : </span><span>" + article.getHitCount() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__likesCount\">");
body.append("<div>");
body.append("<span>추천수 : </span><span>" + article.getLikesCount() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__commentsCount\">");
body.append("<div>");
body.append("<span>댓글수 : </span><span>" + article.getCommentsCount() + "</span>");
body.append("</div><br>");
body.append("</div>");
body.append("<div class=\"article-detail-cell__title\">");
body.append("<div>");
body.append("<span>제목 : </span><span>" + article.getTitle() + "</span>");
body.append("</div>");
body.append("</div>");
body.append("<script type\"text/x-template\">");
body.append(articleBody);
body.append("</script>");
body.append("<div class=\"article-detail-cell__body height-70p toast-ui-viewer\">");
body.append("<div>");
//body.append("<span>" + article.getBody() + "</span>");
body.append("</div>");
body.append("</div><br>");
body.append("<div class=\"article-detail-cell__tag\">");
body.append("<nav># <a href=\"#\" target=\"_blank\">" + "tag.title" + "</a></nav>");
body.append("</div><br><br>");
// discus에게 정확한 페이지 경로 알려주기
String domainUrl = Container.appConfig.getSiteDomain();
String pageUrl = getArticleFileName(article);
// 상세페이지 하단 메뉴
StringBuilder pageMenuBody = new StringBuilder();
if (article.getId() > beforeArticleId) {
pageMenuBody.append("<div class=\"./\"><a href=\"article_detail_" + articles.get(x - 1).getId() + ".html"
+ "\" class=\"hover-underline\">< 이전글</a></div>");
}
pageMenuBody.append("<div class=\"./\"><i class=\"fas fa-th-list\"></i><a href=\"" + board.getCode()
+ "-list-1.html" + "\" class=\"hover-underline\"> 목록 </a></div>");
if (x < articlesSize - 1) {
pageMenuBody.append("<div class=\"./\"><a href=\"article_detail_" + articles.get(x + 1).getId() + ".html"
+ "\"class=\"hover-underline\">다음글 ></a></div>");
}
String bodyTemplate = template.replace("[상세페이지 블록]", body); // list 템플릿에 mainBody 끼워넣고
bodyTemplate = bodyTemplate.replace("[사이트 도메인]", domainUrl);
bodyTemplate = bodyTemplate.replace("[사이트 이름.html]", pageUrl);
html.append(bodyTemplate.replace("[상세페이지 하단 메뉴 블록]", pageMenuBody)); // bodyTemplate에 다시 pageMenuBody
// 끼워넣기
html.append(sideBar);
html.append(topButton);
html.append(foot);
String fileName = getArticleFileName(article);
String path = "site/" + fileName;
Util.writeFile(path, html.toString());
System.out.println(path + " 생성");
x++;
beforeArticleId = articles.get(x - 1).getId();
}
System.out.println("= article 상세페이지 생성 종료 =");
}
}
<app.js>
function ArticleDetail__Body__init() {
if (toastui === undefined) {
return;
}
/* 유튜브 함수 시작 */
//유튜브 영상임을 감지하고 공간을 형성하는 함수
function youtubePlugin() {
toastui.Editor.codeBlockManager.setReplacer('youtube', youtubeId => {
// Indentify multiple code blocks
const wrapperId = `yt${Math.random()
.toString(36)
.substr(2, 10)}`;
// Avoid sanitizing iframe tag
setTimeout(renderYoutube.bind(null, wrapperId, youtubeId), 0);
return `<div id="${wrapperId}"></div>`;
});
}
//유튜브 영상 렌더링 함수
function renderYoutube(wrapperId, youtubeId) {
const el = document.querySelector(`#${wrapperId}`);
el.innerHTML = `<div class="toast-ui-youtube-plugin-wrap"><iframe src="https://www.youtube.com/embed/${youtubeId}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>`;
}
/* 유튜브 함수 끝 */
/* codepen 함수 시작 */
function codepenPlugin() {
toastui.Editor.codeBlockManager.setReplacer('codepen', url => {
const wrapperId = `yt${Math.random().toString(36).substr(2, 10)}`;
// Avoid sanitizing iframe tag
setTimeout(renderCodepen.bind(null, wrapperId, url), 0);
return `<div id="${wrapperId}"></div>`;
});
}
function renderCodepen(wrapperId, url) {
const el = document.querySelector(`#${wrapperId}`);
var urlParams = new URLSearchParams(url.split('?')[1]);
var height = urlParams.get('height');
el.innerHTML = `<div class="toast-ui-codepen-plugin-wrap"><iframe height="${height}" scrolling="no" src="${url}" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"></iframe></div>`;
}
/* codepen 함수 끝 */
/* toastui-viewr 함수 시작 */
function EditorViewer__init() {
$('.toast-ui-viewer').each(function(index, node) {
var initialValue = $(node).prev().html().trim().replace(/t-script/gi, 'script');
// var body = document.querySelector('.article-detail-cell__body > div > span');
// var initValue = body.innerHTML.trim();
var viewer = new toastui.Editor.factory({
el: node,
initialValue: initialValue,
viewer: true,
plugins: [toastui.Editor.plugin.codeSyntaxHighlight, youtubePlugin, codepenPlugin]
});
});
}
EditorViewer__init();
}
ArticleDetail__Body__init();
/* toastui-viewr 함수 끝 */
/* top-button 옵션 시작 */
$(function() {
// 보이기 | 숨기기
$(window).scroll(function() {
if ($(this).scrollTop() < 200) {
//200 넘으면 버튼이 보임
$('.top-button').fadeOut();
} else {
$('.top-button').fadeIn();
}
});
// 버튼 클릭시 0 까지 animation 이동합니다.
$(".top-button").click(function() {
$('html, body').animate({
scrollTop : 0 }, 200); // 속도 200
return false;
});
});
/* top-button 옵션 끝 */
'JAVA > Blog 사이트 프로젝트' 카테고리의 다른 글
21.01.06 ajax 통신 연계 통한 블로그 게시물 검색 페이지 생성(+인덱스 게시판 디자인 개편) (0) | 2021.01.06 |
---|---|
21.01.05 템플릿에 검색어 구현 연습 (0) | 2021.01.05 |
20.12.31 GoogleAnalytics API 도입 테스트(feat.Maven) (0) | 2020.12.31 |
20.12.30 Disqus api 적용 - 댓글수, 추천수 동기화 기능 추가( + 이모지 적용)(feat.jackson) (0) | 2020.12.30 |
20.12.27 사이트 메타태그 적용(상세페이지 내용 나오게 하기 등) (0) | 2020.12.27 |