





1. 개요 및 특징
DX Lottery는 DXCMS 회원이 하루 1회 포인트로 복권을 구매하고 긁어서 당첨 포인트를 받는 플러그인입니다. 10포인트로 참여하여 최대 2,000포인트를 당첨받을 수 있으며, 전체 당첨 확률은 65%입니다.주요 특징
• 하루 1회 참여 제한 — 회원당 날짜별 1회• 풀스크린 모달 — 페이지 이동 없이 전체 화면 모달로 진행
• 실제 복권 긁기 UI — Canvas API 기반 은박 긁기 인터랙션
• 10등급 당첨 구조 — 100pt ~ 2,000pt, 전체 당첨률 65%
• 등수별 1명 제한 — 낙관적 잠금으로 동시 요청 방어
• 자동 포인트 처리 — 구매 차감, 당첨 지급 자동화
• 달력 기반 관리자 — 날짜별 번호 확인 및 당첨자 조회
• 실시간 확률 시뮬레이션 — 지정 횟수만큼 테스트 가능
• 관리자 리셋 기능 — 특정 회원 티켓 삭제 및 포인트 원복
• 운영 기간 설정 — 시작일/종료일 지정 가능
• PHP 5.6+ 호환
참여 흐름 요약
로그인 회원이 페이지 접속
↓
복권 모달 자동 표시
↓
① 참여 (10포인트 차감) → 은박 긁기 → 당첨 결과 확인
② 다음에 하기 → 모달 닫기 (오늘은 더 이상 표시 안 함)
2. 설치 방법
파일 구조
plugins/
dx-lottery/
manifest.php ← 플러그인 메타 정보
plugin.php ← 훅 등록, AJAX 처리, 모달 렌더링
core/
install.php ← DB 테이블 설치
helper.php ← 핵심 로직 (당첨 처리, 포인트 등)
admin/
index.php ← 관리자 화면
assets/
lottery.css ← 복권 모달 스타일
admin.css ← 관리자 화면 스타일
설치 절차
1. plugins/dx-lottery/ 폴더를 DXCMS 루트의 plugins/ 폴더에 복사2. 관리자 → 플러그인 → DX Lottery → 활성화
3. 활성화 시 3개 DB 테이블 자동 생성
4. 관리자 사이드바 → 레이아웃 → 포인트 복권 메뉴 확인
5. 설정 탭에서 복권 활성화 여부, 참여 비용, 운영 기간 설정
3. 복권 참여 방법 (회원 화면)
로그인한 회원이 사이트 어느 페이지에 접속하든 하루 1회 복권 모달이 자동으로 표시됩니다.3-1. 모달 화면 구성
| 단계 | 화면 | 설명 |
| 1단계 | 안내 화면 | 복권 설명, 참여 비용(포인트), 참여/다음에 하기 버튼 |
| 2단계 | 긁기 화면 | 은박 긁기 UI — 마우스/터치로 긁으면 결과 표시 |
| 3단계 | 결과 화면 | 당첨 등수 및 포인트 표시 (꽝이면 꽝 화면) |
3-2. 참여 절차
1. 모달 표시 → "참여하기" 버튼 클릭 (10포인트 차감)2. 은박 영역을 마우스 또는 손가락으로 긁기
3. 긁기 완료 시 당첨 결과 자동 표시
4. "확인" 버튼으로 모달 닫기
3-3. 모달 상태 정의
| 상태 | 설명 |
| none | 오늘 티켓 없음 — 모달 처음 표시 (JS init 호출 전) |
| pending | 모달이 화면에 표시된 상태 — 아직 결정 안 함 |
| purchased | 참여 완료 (포인트 차감됨) — 긁기 대기 중 |
| scratched | 긁기 완료 — 당첨 결과 확정 |
| declined | 다음에 하기 선택 — 오늘 모달 재표시 안 함 |
4. 관리자 화면 사용법
관리자 사이드바 → 레이아웃 → 포인트 복권 접속5개 탭으로 구성: 대시보드 / 일별 번호 관리 / 당첨자 현황 / 실시간 로그 / 설정
4-1. 대시보드
오늘의 복권 현황을 한눈에 확인합니다.| 항목 | 설명 |
| 오늘 참여자 수 | 오늘 복권에 참여한 회원 수 |
| 오늘 당첨자 수 | 오늘 포인트를 받은 당첨자 수 |
| 오늘 지급 포인트 | 오늘 총 지급된 포인트 합계 |
| 전체 참여 회원 | 전체 기간 누적 참여 회원 수 |
| 오늘 참여 내역 | 최근 30건 실시간 현황 (회원명, 상태, 등수, 포인트, 시각) |
4-2. 일별 번호 관리
달력 형태로 날짜별 당첨 번호와 당첨자를 관리합니다.• 달력에서 날짜 클릭 → 해당 날의 당첨 번호(1~10등) 및 당첨자 확인
• 번호는 로그인 회원이 처음 접속하는 시점에 자동 생성 (6자리 난수)
• 각 등수별 당첨 번호, 상금, 슬롯 상태(비어있음/당첨자ID), 당첨 회원명 표시
4-3. 당첨자 현황
전체 당첨 기록을 필터링하여 조회합니다.필터 옵션
• 날짜 필터 — 특정 날짜의 당첨 내역만 조회
• 등수 필터 — 특정 등수만 필터 (클릭으로 선택, 꽝 포함)
• 회원 ID 필터 — 특정 회원의 전체 참여 이력 조회
등수별 당첨 통계
• 각 등수별 총 당첨 횟수를 카드로 표시
• 카드 클릭 시 해당 등수 필터 자동 적용
4-4. 실시간 로그
당첨 확률 시뮬레이션 도구입니다. 실제 당첨 로직을 N회 실행하여 결과를 확인합니다.• 100회 / 1,000회 / 10,000회 / 100,000회 선택
• 등수별 당첨 횟수, 비율, 이론 확률과의 비교 표시
• 오차 범위 확인 가능
4-5. 설정
| 설정 항목 | 설명 | 기본값 |
| 복권 활성화 | 전체 ON/OFF 제어 | ON |
| 참여 비용 (포인트) | 복권 1회 참여 시 차감될 포인트 | 10 |
| 시작일 | 복권 서비스 시작 날짜 (비워두면 즉시 운영) | 없음 |
| 종료일 | 복권 서비스 종료 날짜 (비워두면 무기한) | 없음 |
4-6. 회원 복권 리셋
특정 회원의 복권 티켓을 삭제하고 포인트를 원래대로 복구합니다. 테스트 또는 불만 처리용입니다.리셋 시 처리 내용
• 해당 회원의 해당 날짜 티켓 삭제
• 구매 비용(포인트) 환불
• 당첨 포인트가 지급된 경우 회수
• 해당 등수 당첨 슬롯 반환 (다른 회원이 당첨 가능)
• 리셋 후 해당 회원이 다음 접속 시 모달 재표시
리셋 방법
1. 회원 ID 입력
2. 날짜 선택 (기본: 오늘)
3. "리셋 실행" 클릭
4. 확인 다이얼로그 승인
5. 당첨 확률 및 상금 체계
총 풀 1000 기준으로 당첨 650 (65%), 꽝 350 (35%)로 설계되어 있습니다.| 등수 | 당첨 포인트 | 당첨 확률 | 비고 |
| 1등 | 2,000 pt | 1.9% | 최고 상금 |
| 2등 | 1,000 pt | 2.3% | |
| 3등 | 700 pt | 3.7% | |
| 4등 | 500 pt | 5.1% | |
| 5등 | 400 pt | 6.1% | |
| 6등 | 300 pt | 7.0% | |
| 7등 | 200 pt | 7.9% | |
| 8등 | 150 pt | 8.9% | |
| 9등 | 120 pt | 9.8% | |
| 10등 | 100 pt | 12.3% | 최다 당첨 |
| 꽝 | 0 pt | 35.0% | 포인트 없음 |
등수별 1명 제한 동작 예시
예시: A회원이 확률 추첨에서 3등에 해당됨
경우 1) 3등 슬롯이 비어있음
→ A회원이 3등 당첨 (700pt 지급)
경우 2) 3등 슬롯이 이미 다른 회원이 차지함
→ 4등 슬롯 확인 → 비어있으면 4등 당첨 (500pt)
→ 4등도 차있으면 5등 확인 ... 반복
→ 10등까지 모두 차있으면 꽝
6. 동작 방식 (기술)
6-1. 훅 등록 구조
| 훅 | Priority | 역할 |
| dx_extend_top | 1 | DB 설치 확인 + AJAX POST 처리 (_dxlt_action) |
| dx_admin_top | 2 | 관리자 사이드바 링크 등록 + 관리자 화면 진입 |
| dx_bottom | 20 | 로그인 회원에게 복권 풀모달 HTML/JS 삽입 |
6-2. AJAX 액션 처리
| _dxlt_action 값 | 설명 | 인증 |
| adm_reset | 회원 복권 리셋 (관리자 전용) | 관리자 |
| init | 모달 초기화 — pending 티켓 생성 | 로그인 |
| purchase | 복권 구매 — 포인트 차감 | 로그인 |
| scratch | 복권 긁기 — 당첨 처리 | 로그인 |
| decline | 다음에 하기 — declined 처리 | 로그인 |
6-3. 낙관적 잠금 (동시성 처리)
여러 회원이 동시에 같은 등수를 당첨받는 상황을 방지합니다.
1. 현재 winners JSON 값 읽기 (oldWinners)
2. 당첨 등수 슬롯 선점 시도:
UPDATE lottery_daily
SET winners = <새값>
WHERE lot_date = ? AND winners = <oldWinners>
3. 업데이트 성공 (영향 행 > 0) → 당첨 확정
4. 업데이트 실패 (다른 요청이 먼저 선점) → 재시도 (최대 3회)
5. 3회 모두 실패 → 꽝 처리
7. DB 테이블 구조
7-1. lottery_settings — 전역 설정
| 컬럼 | 타입 | 기본값 | 설명 |
| id | INT | AUTO | 설정 ID |
| is_active | TINYINT(1) | 1 | 복권 활성화 여부 |
| ticket_cost | INT | 10 | 참여 비용 (포인트) |
| start_date | DATE | NULL | 서비스 시작일 (NULL=즉시) |
| end_date | DATE | NULL | 서비스 종료일 (NULL=무기한) |
| updated_at | DATETIME | 마지막 수정일 |
7-2. lottery_daily — 일별 당첨 번호
| 컬럼 | 타입 | 설명 |
| id | BIGINT | ID |
| lot_date | DATE (UNIQUE) | 날짜 (하루 1행) |
| numbers | TEXT (JSON) | {"1":"123456",...,"10":"654321"} — 등수별 6자리 번호 |
| winners | TEXT (JSON) | {"1":0,...,"10":0} — 0=빈슬롯, member_id=당첨자 |
| created_by | INT | 번호 최초 생성한 회원 ID |
| created_at | DATETIME | 생성 일시 |
7-3. lottery_tickets — 회원별 참여 기록
| 컬럼 | 타입 | 설명 |
| id | BIGINT | ID |
| lot_date | DATE | 참여 날짜 |
| member_id | INT | 회원 ID |
| status | VARCHAR(20) | pending / purchased / scratched / declined |
| prize_rank | TINYINT | 당첨 등수 (0=꽝 또는 미긁음) |
| prize_pts | INT | 지급된 포인트 |
| scratched_at | DATETIME | 긁기 완료 시각 |
| created_at | DATETIME | 티켓 생성 시각 |
8. FAQ
Q. 복권 모달이 표시되지 않아요.
다음을 확인하세요. ① 플러그인 활성화 여부 ② 설정 탭의 복권 활성화 ON 여부 ③ 운영 기간(시작일/종료일) 확인 ④ 로그인 상태 확인 (비로그인 회원에게는 표시되지 않음)Q. 이미 오늘 "다음에 하기"를 눌렀는데 다시 보여주고 싶어요.
관리자 화면 → 회원 복권 리셋 에서 해당 회원 ID와 오늘 날짜를 선택하여 리셋하면 됩니다. 해당 회원이 다음 접속 시 모달이 재표시됩니다.Q. 1등 당첨자가 하루에 1명뿐인 이유는?
공정성을 위해 각 등수별 1명만 당첨되도록 설계되어 있습니다. 1등 슬롯이 채워지면 이후 참여자는 1등에 해당하는 확률이 나왔더라도 2등, 3등... 순으로 조정됩니다.Q. 포인트가 부족한 회원은 어떻게 되나요?
"참여하기" 버튼 클릭 시 "포인트가 부족합니다" 메시지가 표시되고 구매가 차단됩니다. 이 경우 "다음에 하기"로 모달을 닫을 수 있습니다.Q. 당첨 확률을 조정하고 싶어요.
core/helper.php 의 dxlt_prize_table() 함수에서 각 등수의 weight 값을 조정하면 됩니다. 전체 weight 합이 650을 유지해야 당첨 확률 65%가 유지됩니다. 변경 후 실시간 로그 탭에서 시뮬레이션으로 확인하세요.Q. 복권 운영을 특정 기간만 하고 싶어요.
설정 탭에서 시작일과 종료일을 지정하면 해당 기간에만 모달이 표시됩니다. 종료일이 지나면 자동으로 비활성화됩니다.Q. 관리자도 복권 모달이 표시되나요?
네, 관리자도 로그인 회원이므로 모달이 표시됩니다. 테스트 후 관리자 리셋으로 초기화할 수 있습니다.***** 필독 *****
1. 포인트 복권은 버그를 제외하고, 모든 것은 직접 개발 및 수정하셔야 합니다.
2. 추가 개발은 하지 않습니다.
3. 원본 그대로 재배포, 재판매만 금지합니다.