테마
BOARD
- 게시판을 선택하고 게시판 정보와 게시글 목록을 가져올 수 있어요.
- 게시판 설정 정보(댓글 사용 여부, 글 작성 권한 등)와 게시글 목록을 함께 제공해요.
- 게시판 목록, 공지사항, FAQ처럼 게시글을 표시하는 블록이나, 글을 작성하는 폼(Form) 등에도 사용할 수 있어요.
html
<template>
<h1>{{property.board.name}}</h1>
<!-- 태그 필터 탭 (태그가 있는 경우) -->
{{#if property.board.tags.length}}
<div class="tag-filters">
{{#each property.board.tags}}
<button class="tag-btn" data-tag-ids="{{id}}">{{name}}</button>
{{/each}}
</div>
{{/if}}
<!-- 게시글 목록 -->
{{#each property.board.posts.data}}
<div class="post">
<span class="post-title">{{title}}</span>
<span class="post-author">{{displayName}}</span>
<span class="post-date">{{datetime createdDate}}</span>
<!-- 조회 수 노출 여부 확인 -->
{{#if (eq ../property.board.viewCountStatus "ENABLED")}}
<span class="post-view-count">조회 {{viewCount}}</span>
{{/if}}
<!-- 좋아요 노출 여부 및 접속자 좋아요 여부 확인 -->
{{#if (eq ../property.board.likeStatus "ENABLED")}}
<span class="like-count {{#if liked}}liked{{/if}}">♥ {{likeCount}}</span>
{{/if}}
</div>
{{else}}
<p>게시글이 없어요.</p>
{{/each}}
<button class="more-btn">다음 페이지</button>
</template>
<script>
const container = bm.container;
// 활성 태그 버튼 표시
function updateActiveTag() {
const activeTagIds = bm.config('property:board.posts.tagIds') || '';
container.querySelectorAll('.tag-btn').forEach(btn => {
btn.classList.toggle('active', btn.dataset.tagIds === activeTagIds);
});
}
updateActiveTag();
bm.onContextChange = () => updateActiveTag();
container.addEventListener('click', (event) => {
// 태그 필터
if (event.target.matches('.tag-btn')) {
event.preventDefault();
bm.config('property:board.posts.tagIds', event.target.dataset.tagIds);
bm.config('property:board.posts.page', 1);
return bm.apply();
}
// 다음 페이지
if (event.target.matches('.more-btn')) {
event.preventDefault();
const currentPage = bm.config('property:board.posts.page');
bm.config('property:board.posts.page', currentPage + 1);
return bm.apply();
}
});
</script>jsx
"board": {
"id": 1, // 게시판 ID
"name": "공지사항", // 게시판 이름
"commentStatus": "ENABLED", // 댓글 사용 여부 (예: "ENABLED", "DISABLED")
"authorDisplayRole": "NAME", // 작성자 표시 정보 (예: "NAME", "EMAIL")
"commentWriteRole": "MEMBER", // 댓글 작성 권한 (예: "ALL", "MEMBER", "ADMIN")
"postWriteRole": "ALL", // 글 작성 권한 (예: "ALL", "MEMBER", "ADMIN")
"secretPostRole": "OPTIONAL", // 비밀글 허용 여부 (예: "NOT_USED", "REQUIRED", "OPTIONAL")
"postTemplate": { // 새 글 작성 템플릿
"title": "...",
"contents": "..."
},
"viewCountStatus": "ENABLED", // 조회 수 노출 여부 (예: "ENABLED", "DISABLED")
"likeStatus": "ENABLED", // 좋아요 수 노출 여부 (예: "ENABLED", "DISABLED")
"tagRequiredStatus": "OPTIONAL", // 글 작성 시 태그(카테고리) 필수 여부 (예: "REQUIRED", "OPTIONAL")
"guestAttachmentStatus": "ENABLED", // 비회원 첨부파일 업로드 허용 여부 (예: "ENABLED", "DISABLED")
"tags": [ // 게시판 내 지원 태그(카테고리) 목록
{
"id": "1,2", // "All" (전체) 필터: 콤마(,)로 연결된 태그 ID
"name": "All",
"sequence": -1
},
{
"id": 1, // 태그(카테고리) ID
"name": "공지", // 태그(카테고리) 이름
"sequence": 0 // 태그(카테고리) 순서
},
{
"id": 2,
"name": "질문",
"sequence": 1
}
],
"posts": { // 게시판 내 게시글
"data": [ // 게시글 목록
{
"id": 1, // 게시글 ID
"title": "게시글 제목", // 게시글 제목
"contents": "<p>내용</p>", // 게시글 본문
"displayName": "김**", // 작성자 표시명 (authorDisplayRole에 따라 다름)
"isNotice": false, // 공지글 여부
"status": "PUBLIC", // 게시글 상태 (예: "PUBLIC", "PRIVATE")
"accessType": "OPEN", // 접근 타입 (예: "OPEN", "SECRET")
"authorType": "ADMIN", // 작성자 타입 (예: "ADMIN", "MEMBER", "GUEST")
"commentsCount": 3, // 댓글 개수
"attachmentsCount": 1, // 첨부파일 개수
"thumbnails": [ // 첨부파일 썸네일 목록 (있는 경우)
"https://example.org/thumbnail.png"
],
"viewCount": 0, // 게시글 조회 수
"liked": false, // 접속자 기준 좋아요 여부
"likeCount": 0, // 게시글 좋아요 수
"tags": [ // 게시글 할당 태그(카테고리) 목록
{
"id": 1,
"name": "공지"
}
],
"createdDate": "2023-11-02T02:24:16.388791" // 게시글 작성일시
}
],
"count": 35 // 총 게시글 개수
}
}bm.config()
bm.config()를 통해 데이터를 가져오는 방식을 설정할 수 있어요.
js
bm.config('property:board.posts.page', page); // 페이지 번호 설정
bm.config('property:board.posts.limit', limit); // 가져올 게시글 개수 설정
bm.config('property:board.posts.sort', sort); // 정렬 설정 (예: 'createdDate', 'createdDate,desc', 'likeCount', 'likeCount,desc', 'viewCount', 'viewCount,desc')
bm.config('property:board.posts.viewCountMin', value); // 조회 수 최솟값 필터
bm.config('property:board.posts.viewCountMax', value); // 조회 수 최댓값 필터
bm.config('property:board.posts.likeCountMin', value); // 좋아요 수 최솟값 필터
bm.config('property:board.posts.likeCountMax', value); // 좋아요 수 최댓값 필터
bm.config('property:board.posts.createdDateMin', value); // 작성일 시작 필터 (ISO8601)
bm.config('property:board.posts.createdDateMax', value); // 작성일 종료 필터 (ISO8601)
bm.config('property:board.posts.searchKeyword', value); // 제목 키워드 검색 필터
bm.config('property:board.posts.tagIds', value); // 태그 필터 (예: '1' 또는 '1,2,3')