| |
내용 |
| 플러그인 ID |
dx-report |
| 버전 |
1.2.0 |
| 지원 PHP |
5.6 이상 (Windows 환경 포함) |
| 지원 DB |
MySQL 5.6+ / MariaDB 10.1+ |
| 제작사 |
DesignOneX (디자인원엑스) |
| 라이선스 |
디자인원엑스 라이선스 |
라이선스
| 항목 |
내용 |
| 재배포·판매 |
❌ 금지 (원천 소스 90% 이상 수정 시 재배포 및 판매 가능) |
| 플러그인 원천 시스템 |
DesignOneX 소유 |
| 상업적 사용 |
✅ 상업적 제작에만 허용, 학습용 |
| 라이선스 |
디자인원엑스 라이선스 |
⚠️ 플러그인 코어(plugin.php, core/, admin/) 자체의 재배포 및 판매는 금지됩니다.
1. 개요 및 주요 기능
DX Report는 DXCMS 게시판의 게시글과 댓글에 신고 기능을 추가하는 플러그인입니다. 신고 누적 시 자동 블라인드·삭제 처리, 관리자 알림, 포인트 지급, 독립 관리자 대시보드를 제공합니다.
| 기능 |
설명 |
| 신고 버튼 자동 삽입 |
게시글 본문 하단 또는 액션 바에 신고 버튼 자동 출력 |
| 댓글 신고 |
⋮ 드롭다운 메뉴에 신고 버튼 추가 |
| 신고 모달 |
사유 선택 + 기타 직접 입력 지원 |
| 자동 블라인드 |
신고 누적 임계값 도달 시 게시글·댓글 내용 자동 숨김 |
| 자동 삭제 |
임계값 초과 시 게시글 자동 삭제 |
| 포인트 지급 |
관리자 블라인드/삭제 처리 시 신고자에게 포인트 지급 (dx_point_log) |
| 관리자 알림 |
24시간 그만보기 + 신규 신고 발생 시 자동 재표시 |
| 신고 관리자 화면 |
대시보드, 신고 목록, 처리, 기각 기능 |
| 사유 한글화 |
관리자 화면에서 신고 사유 한글 표시 |
| 직접입력 보기 |
기타 사유 클릭 시 전체 내용 모달 팝업 |
파일 구조
plugins/dx-report/
├── plugin.php 메인 플러그인 파일 (훅 등록)
├── manifest.php 플러그인 메타 정보
├── core/
│ ├── install.php DB 테이블 자동 설치 및 업그레이드
│ └── helper.php 핵심 함수 모음
├── admin/
│ └── index.php 관리자 화면
└── assets/
└── report.css 버튼 및 모달 스타일
2. 설치 방법
2.1 파일 업로드
다운로드한 dx-report-v1.2.zip의 압축을 해제하고 아래 경로에 업로드합니다.
D:\www_dxcms_ext\plugins\dx-report\
⚠️ dx-report 폴더 안에 dx-report 폴더가 중첩되지 않도록 주의합니다.
2.2 플러그인 활성화
- DXCMS 관리자 → 플러그인 → dx-report 활성화
- 활성화 즉시 DB 테이블 3개 자동 생성
- 설치 완료 후 관리자 사이드바에 [신고 관리] 메뉴 추가
2.3 생성 테이블
| 테이블명 |
용도 |
| dx_report_settings |
신고 설정 (임계값, 포인트, 버튼 등) |
| dx_reports |
신고 기록 (신고자, 사유, 처리 상태) |
| dx_report_counts |
신고 집계 (블라인드/삭제 상태) |
💡 포인트는 별도 테이블 없이 DXCMS 기본 dx_point_log 테이블에 직접 기록됩니다.
3. 데이터베이스 구조
3.1 dx_report_settings
| 컬럼 |
타입 |
설명 |
| is_active |
TINYINT(1) |
기능 ON/OFF |
| auto_insert |
TINYINT(1) |
버튼 자동 삽입 여부 |
| insert_position |
VARCHAR(20) |
삽입 위치 (content_bottom / action_bar) |
| blind_threshold |
INT UNSIGNED |
블라인드 임계값 (신고 건수) |
| delete_threshold |
INT UNSIGNED |
삭제 임계값 (0=비활성) |
| report_point |
INT UNSIGNED |
채택 시 지급 포인트 (0=비활성) |
| btn_label |
VARCHAR(50) |
버튼 텍스트 |
| btn_style |
VARCHAR(20) |
버튼 스타일 (subtle/outline/solid) |
| notify_admin |
TINYINT(1) |
관리자 알림 ON/OFF |
| reasons |
TEXT |
신고 사유 목록 (JSON) |
3.2 dx_reports
| 컬럼 |
타입 |
설명 |
| target_type |
VARCHAR(20) |
post 또는 comment |
| target_id |
VARCHAR(20) |
신고 대상 ID (DXCMS BIGINT → string) |
| board_key |
VARCHAR(64) |
게시판 키 |
| post_id |
VARCHAR(20) |
댓글 신고 시 원글 ID |
| member_id |
INT UNSIGNED |
신고자 회원 ID (비회원=0) |
| reason_code |
VARCHAR(50) |
신고 사유 코드 |
| reason_text |
TEXT |
기타 직접 입력 내용 |
| status |
VARCHAR(20) |
pending / reviewed / dismissed |
| point_granted |
TINYINT(1) |
포인트 지급 완료 여부 (중복 방지) |
4. 관리자 설정
DXCMS 관리자 → 신고 관리 → 설정 변경 버튼에서 접근합니다.
| 설정 항목 |
기본값 |
설명 |
| 신고 기능 활성화 |
ON |
전체 신고 기능 ON/OFF |
| 자동 삽입 |
ON |
신고 버튼 자동 삽입 여부 |
| 삽입 위치 |
content_bottom |
content_bottom: 본문 하단 / action_bar: 액션 버튼 영역 |
| 로그인 필수 |
ON |
OFF 시 비회원도 신고 가능 |
| 블라인드 임계값 |
5건 |
이 건수 이상 신고 시 자동 블라인드 |
| 삭제 임계값 |
0건 |
0 = 자동 삭제 비활성화 |
| 신고 채택 포인트 |
0 |
0=비활성 / 1이상=블라인드·삭제 처리 시 신고자에게 지급 |
| 버튼 라벨 |
신고 |
버튼에 표시될 텍스트 |
| 버튼 스타일 |
subtle |
subtle / outline / solid |
| 직접 입력 허용 |
ON |
기타 사유 직접 입력 허용 |
| 관리자 알림 |
ON |
대기 신고 발생 시 알림 모달 표시 |
5. 신고 버튼
5.1 자동 삽입
| 삽입 위치 |
DOM 기준 |
설명 |
| content_bottom |
.dx-file-box beforebegin |
첨부파일 박스 위 |
| action_bar |
.dx-action-btn 앞 |
좋아요/스크랩 버튼 영역 앞 |
5.2 버튼 스타일
| 스타일 |
외형 |
| subtle (기본) |
회색 배경 + 둥근 모서리 |
| outline |
빨간 테두리 + 투명 배경 |
| solid |
빨간 배경 + 흰 텍스트 |
5.3 수동 삽입
뷰 파일에서 직접 신고 버튼을 삽입하려면 아래 코드를 사용합니다.
<?php
if (function_exists('dxrp_btn_html')) {
echo dxrp_btn_html(
'post', // 대상 유형: post 또는 comment
$post['id'], // 대상 ID
$board['board_key'], // 게시판 키
0, // post_id (댓글 신고 시 원글 ID)
$board['id'], // 게시판 ID
'manual' // 위치 식별자
);
}
?>
6. 신고 모달 및 사유
6.1 기본 신고 사유
| 코드 |
한글 표시 |
| spam |
스팸/광고 |
| obscene |
음란/선정적 |
| abuse |
욕설/비방 |
| illegal |
불법 정보 |
| privacy |
개인정보 침해 |
| copyright |
저작권 침해 |
| other |
기타 (직접 입력) |
💡 기타 선택 시 텍스트 입력창이 표시됩니다. 관리자 화면에서 사유 텍스트를 클릭하면 전체 내용을 모달로 확인할 수 있습니다.
7. 블라인드 처리
7.1 게시글 블라인드
| 처리 항목 |
방식 |
| 본문 내용 |
404 없이 안내 메시지로 교체 |
| 첨부파일 |
파일 목록 비우기 + 다운로드 링크 차단 |
| DB 처리 |
dx_report_counts.blind_status = 1 |
7.2 댓글 블라인드
블라인드된 댓글은 작성자·날짜는 유지되고 내용만 안내 메시지로 교체됩니다.
💡 관리자와 댓글 작성자 본인은 블라인드 내용도 볼 수 있습니다 (DXCMS 비밀댓글 방식과 동일).
7.3 블라인드 해제
관리자 화면 → 처리 버튼 → 블라인드 해제 선택 시 즉시 복구됩니다.
7.4 자동 삭제
⚠️ 자동 삭제는 복구가 어렵습니다. 임계값을 신중히 설정하거나 0(비활성)으로 유지하고 수동 처리를 권장합니다.
8. 댓글 신고
8.1 DOM 구조 (DXCMS 기본 게시판)
| 요소 |
셀렉터 |
| 댓글 아이템 |
id="comment-{숫자}" |
| ⋮ 드롭다운 메뉴 |
id="dx-cmt-menu-{숫자}" |
| 댓글 본문 |
id="cmt-view-{숫자}" class="dx-cmt-body" |
| 댓글 섹션 |
section.dx-cmt-section |
8.2 신고 버튼 삽입 방식
- 1순위: #dx-cmt-menu-{id} 드롭다운 안 하단에 빨간 신고 버튼 추가
- 2순위: 드롭다운 없으면 댓글 본문 (#cmt-view-{id}) 다음에 삽입
- AJAX로 동적 추가된 댓글도 MutationObserver로 자동 감지
9. 포인트 연동 (dx_point_log)
별도 테이블 없이 DXCMS 기본 포인트 테이블(dx_point_log)에 직접 기록합니다.
9.1 지급 조건
| 상황 |
포인트 지급 |
| 관리자가 직접 블라인드 처리 |
✅ 지급 |
| 관리자가 직접 삭제 처리 |
✅ 지급 |
| 신고 누적으로 자동 블라인드/삭제 |
❌ 미지급 |
| 기각 처리 |
❌ 미지급 |
| 동일 신고에 중복 지급 |
❌ point_granted=1 플래그로 차단 |
9.2 dx_point_log 기록 형식
| 컬럼 |
값 |
| type |
'report' |
| point |
설정된 포인트 값 |
| balance |
이전 잔액 + 포인트 |
| ref_type |
'post' 또는 'comment' |
| ref_id |
신고 대상 ID |
| note |
'신고 채택 포인트' |
9.3 설정 방법
- 관리자 → 신고 관리 → 설정 → 신고 채택 포인트 항목에 1 이상 입력 후 저장
- 0 입력 시 포인트 기능 완전 비활성화
10. 관리자 알림
10.1 동작 방식
| 단계 |
내용 |
| 1 |
관리자로 로그인한 상태에서 아무 페이지 접근 |
| 2 |
dx_reports 테이블에서 status='pending' 건수 카운트 |
| 3 |
대기 건수 > 0 이면 전체 화면 오버레이 모달 표시 |
| 4 |
신고 관리 바로가기 또는 닫기/그만보기로 모달 해제 |
10.2 24시간 그만보기
- 쿠키(dxrp_admin_hide)에 숨긴 시각(Unix timestamp) 저장
- PHP에서 해당 시각 이후 신규 신고가 있으면 모달 다시 표시
- 신규 신고가 없으면 24시간 동안 모달 표시 안 함
💡 관리자 페이지(/admin)에서는 신고 목록이 바로 보이므로 모달 미표시
11. 신고 관리자 화면
11.1 대시보드 통계
| 통계 카드 |
설명 |
| 전체 신고 |
누적 신고 총 건수 |
| 검토 대기 |
pending 상태 건수 |
| 오늘 신고 |
당일 접수 건수 |
| 블라인드 처리 |
자동/수동 블라인드 처리 건수 |
| 삭제 처리 |
자동/수동 삭제 처리 건수 |
11.2 처리 옵션
| 처리 |
설명 |
| 블라인드 |
게시글/댓글 내용 숨김 (복구 가능) + 포인트 지급 |
| 블라인드 해제 |
블라인드 상태 해제 |
| 삭제 |
게시글 삭제 처리 + 포인트 지급 |
| 복구 |
삭제/블라인드 상태 복구 |
| 기각 |
신고 내용 부적절 시 기각 처리 (포인트 미지급) |
12. 훅(Hook) 연동 가이드
12.1 신고 발생 알림 훅
dx_add_hook('dx_report_notify', function($data) {
// $data['notify_type'] : 'report' | 'blind' | 'delete'
// $data['title'] : 알림 제목
// $data['message'] : 알림 내용
// $data['post_url'] : 게시글 URL
// $data['admin_url'] : 관리자 신고 URL
// 이메일, Slack, 푸시 알림 등 연동 가능
});
12.2 포인트 지급 완료 훅
dx_add_hook('dx_report_point_granted', function($data) {
// $data['member_id'] : 지급 대상 회원 ID
// $data['point'] : 지급 포인트
// $data['report_id'] : 신고 ID
// $data['reason'] : '신고 채택'
// 외부 포인트 플러그인 추가 연동 가능
});
12.3 신고 직접 접수 (API)
$result = dxrp_submit(array(
'target_type' => 'post',
'target_id' => $post['id'],
'board_key' => $board['board_key'],
'member_id' => $memberId,
'reason_code' => 'spam',
'reason_text' => '',
));
// $result['ok'] : true/false
// $result['count'] : 누적 신고 건수
// $result['auto_action'] : '' | 'blinded' | 'deleted'
13. 문제 해결 (FAQ)
| 증상 |
원인 및 해결 |
| 포인트가 적립되지 않음 |
설정의 신고 채택 포인트가 0인지 확인. 자동 블라인드/삭제는 포인트 미지급, 관리자 직접 처리 시에만 지급 |
| 댓글 블라인드 후 댓글이 사라짐 |
#cmt-view-{id} innerHTML을 안내 메시지로 교체. 댓글 구조(아바타, 작성자)는 유지됨 |
| 신고 버튼이 표시되지 않음 |
설정에서 신고 기능 활성화 ON 확인. 적용 게시판 설정이 해당 게시판 키와 일치하는지 확인 |
| 관리자 알림이 계속 뜸 |
24시간 그만보기 클릭 후에도 신규 신고가 들어오면 다시 표시됨 (정상 동작) |
| install SQL error: key too long |
innodb_strict_mode=0 자동 적용. MySQL 5.6 이하면 MariaDB 10.1+ 업그레이드 권장 |
| 신고 처리 후 포인트 내역 확인 |
phpMyAdmin에서 dx_point_log 테이블 → type='report' 조건으로 조회 |