간단 소스 편집기
허용:
css/
,
page/
· 확장자:
html/css/js
페이지 추가
새로고침
파일 목록
css
css/app.js
css/app.js
css/style.css
css/style.css
page
page/account
계정 수동 생성 ❓
page/account/account_create.html
무료 계정 ❓
page/account/free_account_list.html
무료 계정 > 상세 정보 (탭형) ❓
page/account/free_account_view_tab.html
유료 계정 ❓
page/account/paid_account_list.html
유료 계정 상세 정보 ❓
page/account/paid_account_view.html
유료 계정 > 상세 정보 (탭형) ❓
page/account/paid_account_view_tab.html
page/main
대시보드 ❓
page/main/main.html
page/ops
관리자 추가 ❓
page/ops/admin_form.html
관리자 리스트 ❓
page/ops/admin_list.html
관리자 수정 ❓
page/ops/admin_modify.html
API 로그 ❓
page/ops/api_log.html
메일발송 로그 ❓
page/ops/mail_log.html
SMS 발송 로그 ❓
page/ops/sms_log.html
page/payment
page/payment/customer_pay_log.html
page/payment/customer_pay_log.html
page/payment/customer_refund_list.html
page/payment/customer_refund_list.html
도메인 SSL 연장 로그 ❓
page/payment/domain_log.html
결제 리스트 ❓
page/payment/pay_log.html
포인트 사용 로그 ❓
page/payment/point_log.html
환불 등록 ❓
page/payment/refund_form.html
환불 리스트 ❓
page/payment/refund_list.html
세금/현금영수증 ❓
page/payment/tax_doc.html
page/payment/user_pay_log.html
page/payment/user_pay_log.html
page/payment/user_refund_log.html
page/payment/user_refund_log.html
page/product
상품 등록 ❓
page/product/product_form.html
상품 리스트 ❓
page/product/product_list.html
상품 상세 ❓
page/product/product_view.html
page/settle
계정 정산 리스트 ❓
page/settle/month_list.html
page/settle/settle_log.html
page/settle/settle_log.html
page/sidebar_menu.html
page/sidebar_menu.html
page/sidebar_menu.html
page/site
FAQ 등록 ❓
page/site/faq_form.html
FAQ ❓
page/site/faq_list.html
공지사항 등록 ❓
page/site/notice_form.html
공지사항 ❓
page/site/notice_list.html
공지사항 상세 ❓
page/site/notice_view.html
페이지 추가 ❓
page/site/page_form.html
페이지 관리 ❓
page/site/page_list.html
페이지 수정 ❓
page/site/page_modify.html
팝업창 수정 ❓
page/site/popup_form.html
팝업창 ❓
page/site/popup_list.html
page/site/popup_modify.html
page/site/popup_modify.html
1:1 문의 상세 ❓
page/site/qna_form.html
1:1 문의 ❓
page/site/qna_list.html
SEO 관리 ❓
page/site/seo.html
page/stats
page/stats/account.html
page/stats/account.html
page/stats/sales.html
page/stats/sales.html
page/stats/visit.html
page/stats/visit.html
편집
page/ops/sms_log.html
<!-- /page/marketing/sms_log.html --> <div class="d-flex align-items-center justify-content-between mb-3"> <div> <h1 class="h4 mb-1">SMS 발송 로그 <button type="button" class="btn btn-link btn-sm p-0 ms-2 align-baseline" onclick="openPageHelp(this)" data-title="SMS 발송 로그"> ❓ </button> </h1> <div class="text-muted">발송 요청 및 결과(성공/실패)를 조회합니다.</div> </div> <div class="d-flex gap-2"> <button class="btn btn-outline-secondary btn-sm" type="button" onclick="protoAlert('엑셀 다운로드 기능(예정)')">엑셀</button> </div> </div> <style> /* 검색영역 전용: 세로 1열(상하 1레코드) + 라벨/입력 좌우 분리 */ .filter-stack{ display:flex; flex-direction:column; gap:.65rem; } .filter-rowline{ display:flex; gap:12px; align-items:flex-start; } .filter-rowline .filter-label{ width:140px; padding-top:6px; font-weight:600; color:#374151; white-space:nowrap; } .filter-rowline .filter-input{ flex:1; min-width:0; text-align:left; } /* ✅ 입력박스 좌측정렬 규칙 */ .filter-actions{ display:flex; justify-content:center; margin-top:12px; gap:.5rem; } .filter-actions .btn{ min-width:180px; font-weight:700; } .table-sms td, .table-sms th { white-space:nowrap; } .td-msg { max-width:420px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .code-mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } </style> <!-- 검색 박스 --> <div class="card mb-3"> <div class="card-body"> <div class="filter-stack"> <div class="filter-rowline"> <div class="filter-label">기간</div> <div class="filter-input"> <div class="d-flex flex-wrap gap-2 align-items-center"> <input type="date" class="form-control" style="max-width:200px;"> <span class="text-muted">~</span> <input type="date" class="form-control" style="max-width:200px;"> </div> </div> </div> <div class="filter-rowline"> <div class="filter-label">상태</div> <div class="filter-input"> <select class="form-select" style="max-width:220px;"> <option>전체</option> <option selected>성공</option> <option>실패</option> <option>대기</option> </select> </div> </div> <div class="filter-rowline"> <div class="filter-label">발송유형</div> <div class="filter-input"> <select class="form-select" style="max-width:260px;"> <option selected>전체</option> <option>일반</option> <option>인증(OTP)</option> <option>알림톡 대체발송</option> </select> </div> </div> <div class="filter-rowline"> <div class="filter-label">수신번호/이메일</div> <div class="filter-input"> <input type="text" class="form-control" placeholder="예) 01012345678 또는 user@email.com" style="max-width:520px;"> </div> </div> <div class="filter-rowline"> <div class="filter-label">메시지/템플릿명</div> <div class="filter-input"> <input type="text" class="form-control" placeholder="예) 결제완료, 인증번호, 구독만료 안내" style="max-width:520px;"> </div> </div> <div class="filter-rowline"> <div class="filter-label">참조 ID</div> <div class="filter-input"> <input type="text" class="form-control code-mono" placeholder="예) PAY_20260214_000123" style="max-width:520px;"> </div> </div> <div class="filter-actions"> <button class="btn btn-primary" type="button" onclick="protoAlert('프로토타입: 검색이 적용됩니다(가정)')">검색</button> <button class="btn btn-outline-secondary" type="button" onclick="protoAlert('프로토타입: 필터 초기화')">초기화</button> </div> </div> </div> </div> <!-- 리스트 --> <div class="card"> <div class="card-header d-flex align-items-center justify-content-between"> <div class="fw-bold">발송 내역</div> <div class="text-muted small">총 <span class="fw-semibold">128</span>건</div> </div> <div class="table-responsive"> <table class="table table-hover align-middle mb-0 table-sms"> <thead class="table-light"> <tr> <th style="width:60px;">번호</th> <th style="width:170px;">발송일시</th> <th style="width:140px;">수신번호</th> <th style="width:120px;">발송유형</th> <th>메시지</th> <th style="width:90px;">상태</th> <th style="width:220px;">실패사유</th> <th style="width:190px;">참조 ID</th> <th style="width:110px;">채널</th> <th style="width:140px;">관리</th> </tr> </thead> <tbody> <tr> <td>128</td> <td class="code-mono">2026-02-14 11:32:10</td> <td class="code-mono">010-****-4821</td> <td>인증(OTP)</td> <td class="td-msg">[CreatorLMS] 인증번호는 493812 입니다. 3분 내 입력해주세요.</td> <td><span class="badge text-bg-success">성공</span></td> <td class="text-muted">-</td> <td class="code-mono">OTP_20260214_104821</td> <td>SMS</td> <td> <button class="btn btn-sm btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#smsDetailModal" data-sms='{ "sent_at":"2026-02-14 11:32:10", "status":"성공", "type":"인증(OTP)", "channel":"SMS", "to":"010-1234-4821", "from":"1544-0000", "ref_id":"OTP_20260214_104821", "vendor_code":"200", "vendor_msg":"OK", "message":"[CreatorLMS] 인증번호는 493812 입니다. 3분 내 입력해주세요.", "params":"{\"otp\":\"493812\",\"ttl_sec\":180}" }'>상세</button> <button class="btn btn-sm btn-outline-secondary" type="button" onclick="protoAlert('프로토타입: 재전송 팝업(예정)')">재전송</button> </td> </tr> <tr> <td>127</td> <td class="code-mono">2026-02-14 11:21:03</td> <td class="code-mono">010-****-9012</td> <td>일반</td> <td class="td-msg">[CreatorLMS] 결제 완료: C-Start / 다음 결제일 2026-03-14</td> <td><span class="badge text-bg-success">성공</span></td> <td class="text-muted">-</td> <td class="code-mono">PAY_20260214_000127</td> <td>LMS</td> <td> <button class="btn btn-sm btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#smsDetailModal" data-sms='{ "sent_at":"2026-02-14 11:21:03", "status":"성공", "type":"일반", "channel":"LMS", "to":"010-7777-9012", "from":"1544-0000", "ref_id":"PAY_20260214_000127", "vendor_code":"200", "vendor_msg":"OK", "message":"[CreatorLMS] 결제 완료: C-Start / 다음 결제일 2026-03-14", "params":"{\"plan\":\"C-Start\",\"next_pay\":\"2026-03-14\"}" }'>상세</button> <button class="btn btn-sm btn-outline-secondary" type="button" onclick="protoAlert('프로토타입: 재전송 팝업(예정)')">재전송</button> </td> </tr> <tr> <td>126</td> <td class="code-mono">2026-02-14 10:58:41</td> <td class="code-mono">010-****-3344</td> <td>알림톡 대체발송</td> <td class="td-msg">[CreatorLMS] 구독 만료 3일 전입니다. 결제정보를 확인해주세요.</td> <td><span class="badge text-bg-warning">대기</span></td> <td class="text-muted">-</td> <td class="code-mono">BILL_20260214_000126</td> <td>SMS</td> <td> <button class="btn btn-sm btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#smsDetailModal" data-sms='{ "sent_at":"2026-02-14 10:58:41", "status":"대기", "type":"알림톡 대체발송", "channel":"SMS", "to":"010-5555-3344", "from":"1544-0000", "ref_id":"BILL_20260214_000126", "vendor_code":"-", "vendor_msg":"QUEUE", "message":"[CreatorLMS] 구독 만료 3일 전입니다. 결제정보를 확인해주세요.", "params":"{\"days_left\":3}" }'>상세</button> <button class="btn btn-sm btn-outline-secondary" type="button" onclick="protoAlert('프로토타입: 재전송 팝업(예정)')">재전송</button> </td> </tr> <tr> <td>125</td> <td class="code-mono">2026-02-14 10:42:19</td> <td class="code-mono">010-****-7788</td> <td>일반</td> <td class="td-msg">[CreatorLMS] 관리자 공지: 금일 23시 점검 예정입니다.</td> <td><span class="badge text-bg-danger">실패</span></td> <td>수신번호 오류(형식 불일치)</td> <td class="code-mono">OPS_20260214_000125</td> <td>SMS</td> <td> <button class="btn btn-sm btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#smsDetailModal" data-sms='{ "sent_at":"2026-02-14 10:42:19", "status":"실패", "type":"일반", "channel":"SMS", "to":"010-12-7788", "from":"1544-0000", "ref_id":"OPS_20260214_000125", "vendor_code":"422", "vendor_msg":"INVALID_MSISDN", "message":"[CreatorLMS] 관리자 공지: 금일 23시 점검 예정입니다.", "params":"{}" }'>상세</button> <button class="btn btn-sm btn-outline-secondary" type="button" onclick="protoAlert('프로토타입: 재전송 팝업(예정)')">재전송</button> </td> </tr> <tr> <td>124</td> <td class="code-mono">2026-02-14 10:10:02</td> <td class="code-mono">010-****-1122</td> <td>인증(OTP)</td> <td class="td-msg">[CreatorLMS] 인증번호는 701254 입니다. 3분 내 입력해주세요.</td> <td><span class="badge text-bg-danger">실패</span></td> <td>통신사 응답 지연(Timeout)</td> <td class="code-mono">OTP_20260214_101122</td> <td>SMS</td> <td> <button class="btn btn-sm btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#smsDetailModal" data-sms='{ "sent_at":"2026-02-14 10:10:02", "status":"실패", "type":"인증(OTP)", "channel":"SMS", "to":"010-9999-1122", "from":"1544-0000", "ref_id":"OTP_20260214_101122", "vendor_code":"504", "vendor_msg":"TIMEOUT", "message":"[CreatorLMS] 인증번호는 701254 입니다. 3분 내 입력해주세요.", "params":"{\"otp\":\"701254\",\"ttl_sec\":180}" }'>상세</button> <button class="btn btn-sm btn-outline-secondary" type="button" onclick="protoAlert('프로토타입: 재전송 팝업(예정)')">재전송</button> </td> </tr> </tbody> </table> </div> <nav class="mt-3 d-flex justify-content-center" aria-label="pagination"> <ul class="pagination pagination-sm mb-0"> <li class="page-item disabled"><a class="page-link" href="#">이전</a></li> <li class="page-item active"><a class="page-link" href="#">1</a></li> <li class="page-item"><a class="page-link" href="#">2</a></li> <li class="page-item"><a class="page-link" href="#">3</a></li> <li class="page-item"><a class="page-link" href="#">다음</a></li> </ul> </nav> </div> </div> <!-- 상세 모달 --> <div class="modal fade" id="smsDetailModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog modal-lg modal-dialog-scrollable"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">SMS 발송 상세</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="row g-3"> <div class="col-12 col-lg-6"> <div class="border rounded-3 p-3"> <div class="text-muted small mb-2">기본 정보</div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">발송일시</div> <div class="fw-semibold code-mono" id="d_sent_at">-</div> </div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">상태</div> <div class="fw-semibold" id="d_status">-</div> </div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">발송유형</div> <div class="fw-semibold" id="d_type">-</div> </div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">채널</div> <div class="fw-semibold" id="d_channel">-</div> </div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">수신번호</div> <div class="fw-semibold code-mono" id="d_to">-</div> </div> <div class="d-flex mb-0"> <div class="text-muted" style="width:110px;">발신번호</div> <div class="fw-semibold code-mono" id="d_from">-</div> </div> </div> </div> <div class="col-12 col-lg-6"> <div class="border rounded-3 p-3"> <div class="text-muted small mb-2">참조/응답</div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">참조 ID</div> <div class="fw-semibold code-mono" id="d_ref_id">-</div> </div> <div class="d-flex mb-2"> <div class="text-muted" style="width:110px;">벤더 코드</div> <div class="fw-semibold code-mono" id="d_vendor_code">-</div> </div> <div class="d-flex mb-0"> <div class="text-muted" style="width:110px;">벤더 메시지</div> <div class="fw-semibold code-mono" id="d_vendor_msg">-</div> </div> </div> </div> <div class="col-12"> <div class="border rounded-3 p-3"> <div class="text-muted small mb-2">메시지 원문</div> <textarea class="form-control" rows="5" id="d_message" readonly></textarea> </div> </div> <div class="col-12"> <div class="border rounded-3 p-3"> <div class="text-muted small mb-2">템플릿 파라미터(샘플)</div> <pre class="mb-0 p-2 rounded-2 bg-light code-mono" id="d_params">{}</pre> </div> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">닫기</button> <button type="button" class="btn btn-primary" onclick="protoAlert('프로토타입: 재전송 실행(예정)')">재전송</button> </div> </div> </div> </div> <script> function protoAlert(msg){ window.alert(msg); } // 상세 모달 데이터 바인딩 (function(){ var modal = document.getElementById('smsDetailModal'); if(!modal) return; modal.addEventListener('show.bs.modal', function (event) { var btn = event.relatedTarget; if(!btn) return; var raw = btn.getAttribute('data-sms') || '{}'; var data; try { data = JSON.parse(raw); } catch(e) { data = {}; } setText('d_sent_at', data.sent_at); setText('d_status', data.status); setText('d_type', data.type); setText('d_channel', data.channel); setText('d_to', data.to); setText('d_from', data.from); setText('d_ref_id', data.ref_id); setText('d_vendor_code', data.vendor_code); setText('d_vendor_msg', data.vendor_msg); var msgEl = document.getElementById('d_message'); if(msgEl) msgEl.value = data.message || ''; var paramsEl = document.getElementById('d_params'); if(paramsEl) paramsEl.textContent = data.params || '{}'; }); function setText(id, v){ var el = document.getElementById(id); if(el) el.textContent = (v === undefined || v === null || v === '') ? '-' : v; } })(); </script>
저장
페이지 추가
디렉토리
page (root)
page/account
page/main
page/marketing
page/ops
page/payment
page/product
page/settle
page/site
page/stats
* page/ 하위 1레벨 폴더만 선택
파일명
.html
* 영문 소문자/숫자/_/- 만, 최대 32자
비밀번호