This commit is contained in:
shim
2023-04-17 11:06:08 +09:00
parent d0b393aa97
commit 76264e09ad
4686 changed files with 552713 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
var _isFullSize = false;
var _isCodeEdit = false;
function editFullSize(id,obj)
{
if (_isCodeEdit)
{
_codefullscreen();
}
else {
if (_isFullSize == false)
{
obj.title = '원래대로';
$('#'+id).addClass('rb-fullsize');
_isFullSize = true;
}
else {
obj.title = '전체화면';
$('#'+id).removeClass('rb-fullsize');
_isFullSize = false;
}
}
}
function goHref_parent(url) {
parent.location.href = url;
}
$(function () {
$('[data-toggle="tooltip"]').tooltip()
$('[data-tooltip="tooltip"]').tooltip({
html: true
})
$('.js-tooltip').tooltip()
})

View File

@@ -0,0 +1,283 @@
<header class="navbar navbar-expand fixed-top navbar-dark bg-dark" role="navigation" data-scroll-header>
<?php if($g['device'] && $module == 'dashboard'):?>
<a class="navbar-brand" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.shortcut" style="margin-left:0;">
<i class="kf kf-bi-01 fa-lg" style="color:#000;"></i>
</a>
<?php else:?>
<a class="navbar-brand" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard<?php if($g['mobile']&&$_SESSION['pcmode']!='Y'):?>&amp;front=mobile.shortcut<?php endif?>">
<span class="badge badge-light"><?php echo $MD['name']?></span>
</a>
<?php if($module == 'dashboard' && ($front == 'main' || $front == 'mobile.dashboard')):?>
<i class="fa fa-cog rb-modal-dashboard js-tooltip d-none" title="대시보드 꾸미기" data-toggle="modal" data-target="#modal_window"></i>
<?php endif?>
<?php endif?>
<div class="navbar-collapse collapse">
<?php if($g['device']&&$module=='dashboard'):?>
<ul class="navbar-nav mr-auto">
<li<?php if($front=='mobile.shortcut'):?> class="active"<?php endif?>><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.shortcut">바로가기</a></li>
<li<?php if($front=='mobile.dashboard'):?> class="active"<?php endif?>><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.dashboard">대시보드</a></li>
<li<?php if($front=='mobile.site'):?> class="active"<?php endif?>><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.site">사이트</a></li>
</ul>
<?php else:?>
<ul class="navbar-nav mr-auto" id="rb-admin-ul-tabs">
<?php $_front =explode('_' , $front); ?>
<?php $_menuCount=$d['amenu']?count($d['amenu']):0;if(!$nosite&&$_menuCount):?>
<?php if($_i<=10):?>
<?php $_i=1;foreach($d['amenu'] as $_k => $_v):?>
<li id="rb-more-tab-<?php echo $_i?>" class="nav-item">
<a class="nav-link<?php if($_front[0] == $_k):?> active<?php endif?>" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=<?php echo $m?>&amp;module=<?php echo $module?>&amp;front=<?php echo $_k ?>">
<?php echo $_v ?>
</a>
</li>
<?php $_i++;endforeach?>
<?php endif?>
<?php if($_i>10):?>
<li class="nav-item dropdown rb-more-tabs d-block d-sm-none">
<a class="nav-link dropdown-toggle" href="#." data-toggle="dropdown">더보기</a>
<div class="dropdown-menu dropdown-menu-right">
<?php $_i=1;foreach($d['amenu'] as $_k => $_v):?>
<a id="rb-more-tabs-<?php echo $_i?>" class="dropdown-item<?php if($front == $_k):?> active<?php endif?>" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=<?php echo $m?>&amp;module=<?php echo $module?>&amp;front=<?php echo $_k?>">
<?php echo $_v?>
</a>
<?php $_i++;endforeach?>
</div>
</li>
<?php endif?>
<?php endif?>
</ul>
<?php endif?>
<ul class="navbar-nav my-0">
<?php if($module!='dashboard'):?>
<li class="nav-item">
<a class="nav-link<?php if($front == '_info'):?> active<?php endif?>" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=<?php echo $m?>&amp;module=<?php echo $module?>&amp;front=_info">
<i class="fa fa-question-circle fa-lg"></i> 안내
</a>
</li>
<?php endif?>
<?php $exists_bookmark=getDbRows($table['s_admpage'],'memberuid='.$my['uid']." and url='".$g['s'].'/?r='.$r.'&m='.$m.'&module='.$module.'&front='.$front."'")?>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
<i id="_bookmark_star_" class="fa fa-lg fa-star<?php if($exists_bookmark):?> rb-star-fill text-primary<?php else:?>-o<?php endif?>"></i>
</a>
<div class="dropdown-menu dropdown-menu-right p-0">
<div class="card border-dark rounded-0 mb-0" style="width: 300px">
<div class="card-header d-flex justify-content-between align-items-center py-1 px-2 bg-white border-secondary">
북마크
<div>
<div id="_bookmark_notyet_" class="btn-group btn-group-sm dropdown<?php if($exists_bookmark):?> d-none<?php endif?>">
<button type="button" class="btn btn-outline-secondary rb-bookmark-add">북마크에 추가</button>
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-body" data-toggle="dropdown">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<div id="rb-bookmark-dropdown1" class="dropdown-menu">
<a href="#." class="dropdown-item rb-bookmark-add">북마크에 추가</a>
<div class="dropdown-divider"></div>
<a href="#." data-toggle="modal" data-target="#modal_window" class="dropdown-item rb-modal-bookmark">북마크 관리</a>
</div>
</div>
<div id="_bookmark_already_" class="btn-group btn-group-sm <?php if(!$exists_bookmark):?> d-none<?php endif?>">
<button type="button" class="btn btn-light disabled">추가됨</button>
<button type="button" class="btn btn-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown">
<span class="sr-only">Toggle Dropdown</span>
</button>
<div id="rb-bookmark-dropdown2" class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item b-bookmark-del" href="#">북마크에서 삭제</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item rb-modal-bookmark" href="#" data-toggle="modal" data-target="#modal_window">북마크 관리</a>
</div>
</div>
</div>
</div>
<div id="_add_bookmark_" class="list-group list-group-flush rb-scrollbar">
<?php $ADMPAGE = getDbArray($table['s_admpage'],'memberuid='.$my['uid'],'*','gid','asc',0,1)?>
<?php while($R=db_fetch_array($ADMPAGE)):?>
<a href="<?php echo $R['url']?>" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center" id="_now_bookmark_<?php echo $R['uid']?>">
<?php echo $R['name']?>
<i class="fa fa-fw fa-file-text-o"></i>
</a>
<?php endwhile?>
<?php if(!db_num_rows($ADMPAGE)):?><a class="list-group-item"><i class="fa fa-fw fa-file-text-o"></i>등록된 북마크가 없습니다</a><?php endif?>
</div>
<div class="card-footer p-0 border-top-0">
<a href="#." data-toggle="modal" data-target="#modal_window" class="rb-modal-bookmark btn btn-link btn-block">북마크 관리</a>
</div>
</div>
</div>
</li>
<?php if ($my['super'] && !$my['adm_site']): ?>
<?php
$SITES = getDbArray($table['s_site'],'','*','gid','asc',0,$p);
$SITEN = db_num_rows($SITES);
?>
<?php if($SITEN>1 && ($module!='admin' && $module!='project')):?>
<li class="nav-item d-none" data-role="siteSelector">
<div class="input-group input-group-sm mt-1 ml-2 border border-primary">
<div class="input-group-append" style="margin-left: 0;">
<a class="input-group-text muted-link" href="<?php echo $g['s']?>/?r=<?php echo $SD['id']?>&amp;m=<?php echo $m?>&amp;pickmodule=site&amp;panel=Y" target="_parent" data-toggle="tooltip" title="사이트관리">
<i class="<?php echo $SD['icon']?> fa-lg" aria-hidden="true"></i>
</a>
</div>
<select class="form-control custom-select" onchange="goHref_parent('<?php echo $g['s']?>/?m=<?php echo $m?>&pickmodule=<?php echo $module?>&panel=Y&pickfront=<?php echo $front?>&r='+this.value);" style="margin-left: -1px;min-width:100px">
<?php while($S = db_fetch_array($SITES)):?>
<option value="<?php echo $S['id']?>"<?php if($r==$S['id']):?> selected<?php endif?>><?php echo $S['label']?></option>
<?php endwhile?>
</select>
</div>
</li>
<?php endif?>
<?php else: ?>
<?php
$SITES = getArrayString($my['adm_site']);
$SITEN = $SITES[count];
?>
<?php if($SITEN>1 && ($module!='admin' && $module!='project')):?>
<li class="nav-item d-none" data-role="siteSelector">
<div class="input-group input-group-sm mt-1 ml-2 border border-primary">
<div class="input-group-append" style="margin-left: 0;">
<a class="input-group-text muted-link" href="<?php echo $g['s']?>/?r=<?php echo $_SD['id']?>&amp;m=<?php echo $m?>&amp;pickmodule=site&amp;panel=Y" target="_parent">
<i class="<?php echo $SD['icon']?> fa-lg" aria-hidden="true"></i>
</a>
</div>
<select class="form-control custom-select" onchange="goHref_parent('<?php echo $g['s']?>/?m=<?php echo $m?>&pickmodule=<?php echo $module?>&panel=Y&pickfront=<?php echo $front?>&r='+this.value);" style="margin-left: -1px;min-width:100px">
<?php $_i=0;foreach($SITES['data'] as $val):?>
<?php $_SD = getUidData($table['s_site'],$val); ?>
<option value="<?php echo $_SD['id']?>"<?php if($r==$_SD['id']):?> selected<?php endif?>><?php echo $_SD['label']?></option>
<?php $_i++;endforeach?>
</select>
</div>
</li>
<?php endif?>
<?php endif; ?>
</ul>
</div><!-- /.navbar-collapse -->
</header>
<main id="rb-admin-page-content">
<?php include $g['adm_module'] ?>
</main>
<script>
$(document).ready(function()
{
document.body.onload = tabSetting;
document.body.onresize = tabSetting;
<?php if($g['device']):?>
$('#bs-example-navbar-collapse-1').on('show.bs.collapse', function () {
$("#_navbar_header_").addClass('rb-header-bottom-line');
});
$('#bs-example-navbar-collapse-1').on('hide.bs.collapse', function () {
$("#_navbar_header_").removeClass('rb-header-bottom-line');
});
getId('_add_bookmark_').style.maxHeight = '205px';
<?php endif?>
$('#bs-example-navbar-collapse-1 [data-toggle=dropdown]').on('click', function(event) {
event.preventDefault();
event.stopPropagation();
$(this).parent().siblings().removeClass('open');
$(this).parent().toggleClass('open');
});
$(".rb-help-btn").click(function(){
$(this).button('toggle');
});
$('.rb-modal-bookmark').on('click',function() {
modalSetting('modal_window','<?php echo getModalLink('&amp;m=admin&amp;module=admin&amp;front=modal.bookmark')?>');
});
$('.rb-bookmark-add').on('click',function() {
frames._action_frame_admin.location.href = '<?php echo $g['s']?>/?r=<?php echo $r?>&m=<?php echo $m?>&a=bookmark&_addmodule=<?php echo $module?>&_addfront=<?php echo $front?>';
});
$('.rb-bookmark-del').on('click',function() {
frames._action_frame_admin.location.href = '<?php echo $g['s']?>/?r=<?php echo $r?>&m=<?php echo $m?>&a=bookmark_delete&deltype=hidden&_addmodule=<?php echo $module?>&_addfront=<?php echo $front?>';
});
});
function tabSetting()
{
<?php if($g['device']):?>
$('#bs-example-navbar-collapse-1').removeClass('navbar-collapse');
if(document.body.scrollWidth > 750) $('#bs-example-navbar-collapse-1').addClass('navbar-collapse');
else $('#bs-example-navbar-collapse-1').removeClass('navbar-collapse');
<?php endif?>
var i;
var bodyWidth = document.body.scrollWidth;
var allTabnum = <?php echo (int)$_menuCount?>;
var showTabnum = allTabnum;
var showTabMore = false;
if (allTabnum > 3)
{
if (bodyWidth >= 0 && bodyWidth < 360)
{
showTabnum = 2;
showTabMore = true;
}
else if (bodyWidth >= 360 && bodyWidth < 523)
{
showTabnum = 3;
showTabMore = true;
}
else if (bodyWidth >= 523 && bodyWidth < 640)
{
showTabnum = 4;
showTabMore = true;
}
else if (bodyWidth >= 640 && bodyWidth < 750)
{
showTabnum = 5;
showTabMore = true;
}
else if (bodyWidth >= 750 && bodyWidth < 1100)
{
showTabnum = 8;
showTabMore = true;
}
else if (bodyWidth >= 1100 && bodyWidth < 1400)
{
showTabnum = 10;
showTabMore = false;
}
else if (bodyWidth >= 1400)
{
showTabnum = allTabnum;
showTabMore = false;
}
}
for (i = 1; i <= allTabnum; i++)
{
$('#rb-more-tab-'+i).removeClass('d-none');
$('#rb-more-tabs-'+i).removeClass('d-none');
}
for (i = showTabnum+1; i <= allTabnum; i++) $('#rb-more-tab-'+i).addClass('d-none');
for (i = 0; i <= showTabnum; i++) $('#rb-more-tabs-'+i).addClass('d-none');
if (showTabMore == true) $('.rb-more-tabs').removeClass('d-none');
else $('.rb-more-tabs').addClass('d-none');
}
// 북마크 dropdown 내부클릭시 dropdown 유지
$('.dropdown-body').on('click', function(e) {
e.stopPropagation();
});
</script>

View File

@@ -0,0 +1,196 @@
@charset "utf-8";
@import url(https://fonts.googleapis.com/earlyaccess/notosanskr.css);
html,
body {
height: 100%;
}
body {
background-color: #343a40 !important;
font-family: 'Noto Sans KR', "돋움", dotum, '나눔고딕', 'Nanum Gothic', sans-serif, FontAwesome, kimsq !important;
color: #ccc
}
a {
color: #ccc
}
.rb-root {
display: table;
height: 100%;
width: 100%;
padding: 0;
}
#rb-login {
display: table-cell;
text-align: left;
margin: 0 auto;
padding: 10% 0 100px;
}
#rb-login .card {
margin: 0 auto 15px;
color: #ccc;
background-color: rgb(39, 44, 50);
border: 1px solid #222;
border-radius: 3px;
color: #999;
box-shadow: 0px 2px 2px #222;
}
#rb-login .card-header h1 {
margin-bottom: 0;
font-size: 18px
}
#rb-login .card-header a {
color: #ccc
}
#rb-login .card-header a:hover {
text-decoration: none
}
#rb-login .card .form-group label {
font-weight: normal;
display: block;
margin-bottom: 7px
}
#rb-login .form-login .label-link {
float: right;
font-size: 12px;
line-height: 24px;
}
#rb-login .panel .form-control.input-lg {
border-radius: 2px;
}
#rb-login .card-footer ul {
margin-bottom: 0
}
#rb-login .card-foote a {
font-size: 90%;
}
.form-control,
.form-control[readonly] {
background-color: rgb(31, 34, 39);
color: rgb(171, 175, 181);
border-color: rgb(27, 30, 36);
border-radius: 0
}
.btn {
border-radius: 0
}
/*반응형 설정*/
@media (min-width: 481px) {
#rb-login .card {
width: 350px;
}
}
@media (max-width: 480px) {
body {
/*background-color: #fff !important*/
}
#rb-login {
padding: 0;
}
#rb-login .card {
box-shadow: none;
border: none;
border-radius: none;
background-color: inherit;
}
#rb-login .card-footer {
/*background-color: transparent;*/
}
#rb-login h1 {
font-size: 20px
}
#rb-login .btn.btn-primary {
width: 100%;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
}
#modal-pwReset {
font-size: 14px
}
#modal-pwReset .modal-header,
#modal-pwReset .card-header {
background-color: #0069d9;
color: #fff
}
#modal-pwReset .modal-content {
border-radius: .45rem;
}
#modal-pwReset .nav-tabs .nav-link:focus,
#modal-pwReset .nav-tabs .nav-link:hover {
border-color: #0069d9 #0069d9 #fff;
}
#modal-pwReset .form-control,
#modal-pwReset .form-control[readonly] {
background-color: #fff;
border: 1px solid #ced4da;
border-radius: 0;
color: #495057;
}
.btn-light {
color: #24292e;
user-select: none;
background-color: #eff3f6;
background-image: linear-gradient(-180deg, #fafbfc 0%, #eff3f6 90%);
background-repeat: repeat-x;
background-position: -1px -1px;
background-size: 110% 110%;
border: 1px solid rgba(27, 31, 35, 0.2);
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
}
.btn-light:hover,
.btn-light.hover {
background-color: #e6ebf1;
background-image: linear-gradient(-180deg, #f0f3f6 0%, #e6ebf1 90%);
background-position: -.5em;
border-color: rgba(27, 31, 35, 0.35);
}
.btn-light:not(:disabled):not(.disabled).active,
.btn-light:not(:disabled):not(.disabled):active,
.show>.btn-light.dropdown-toggle {
background-color: #e9ecef;
background-image: none;
border-color: rgba(27, 31, 35, 0.35);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
.btn-light:not(:disabled):not(.disabled).active:focus,
.btn-light:not(:disabled):not(.disabled):active:focus,
.show>.btn-light.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2em rgba(3, 102, 214, 0.3);
}

View File

@@ -0,0 +1,535 @@
<div class="rb-root">
<div id="rb-login">
<div class="card">
<div class="card-header">
<h1>
<a href="<?php echo $g['r']?>/">
<i class="kf-bi-01"></i>
</a>
<small>관리자 모드</small>
</h1>
</div>
<div class="card-body">
<form class="loginForm" role="form" name="loginform" id="admin-loginform" action="<?php echo $g['s']?>/" method="post">
<input type="hidden" name="r" value="<?php echo $r?>">
<input type="hidden" name="a" value="login">
<input type="hidden" name="referer" value="<?php echo $referer ? $referer : $_SERVER['HTTP_REFERER']?>">
<input type="hidden" name="usertype" value="admin">
<input type="hidden" name="pickgoods" value="<?php echo $pickgoods ?>">
<input type="hidden" name="form" value="">
<div class="form-group">
<label for="id" class="control-label">아이디 또는 이메일</label>
<input type="text" name="id" class="form-control input-lg" id="id" placeholder="" value="" autofocus required autocapitalize="off" autocorrect="off" tabindex="1">
<div class="invalid-feedback mt-2" data-role="idErrorBlock"></div>
</div>
<div class="form-group">
<label for="pw" class="control-label">비밀번호</label>
<input type="password" name="pw" class="form-control input-lg" id="pw" placeholder="" value="" required tabindex="2">
<div class="invalid-feedback mt-2" data-role="passwordErrorBlock"></div>
</div>
<div class="custom-control custom-checkbox mb-2">
<input type="checkbox" class="custom-control-input" id="login_cookie" name="login_cookie" value="checked" data-toggle="collapse" data-target="#collapsealert">
<label class="custom-control-label" for="login_cookie">로그인 상태 유지</label>
</div>
<div class="collapse" id="collapsealert" style="">
<div class="alert alert-danger f12 mb-3">
개인정보 보호를 위해, 개인 PC에서만 사용해 주세요.
</div>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit" id="rb-submit" data-role="submit" tabindex="3">
<span class="not-loading">로그인</span>
<span class="is-loading"><i class="fa fa-spinner fa-lg fa-spin fa-fw"></i> 로그인중 ...</span>
</button>
<p class="mt-3">
<a href="#modal-pwReset" data-toggle="modal">
<small>비밀번호를 잊으셨나요?</small>
</a>
</p>
</form>
</div>
</div>
</div>
</div>
<!-- 모달 : modal-pwReset : 비밀번호 초기화 -->
<div class="modal fade" id="modal-pwReset" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document" style="max-width: 400px;">
<div class="modal-content">
<div class="modal-header border-bottom-0 d-flex flex-column" style="">
<h5 class="modal-title mx-auto h6">관리자 비밀번호 재설정</h5>
</div>
<?php if ($d['member']['join_byEmail'] || $d['member']['join_byPhone']): ?>
<div class="card border-0" style="margin-top: -15px" data-role="confirm_code">
<div class="card-header">
<ul class="nav nav-tabs nav-justified card-header-tabs f14">
<?php if ($d['member']['join_byEmail']): ?>
<li class="nav-item">
<a class="nav-link<?php echo $d['member']['join_byEmail']?' active':'' ?>" id="tab-email" data-toggle="tab" href="#pane-pw-email">
이메일로 받기
</a>
</li>
<?php endif; ?>
<?php if ($d['member']['join_byPhone']): ?>
<li class="nav-item">
<a class="nav-link<?php echo ($d['member']['join_byPhone'] && !$d['member']['join_byEmail'])?' active':'' ?>" id="tab-phone" data-toggle="tab" href="#pane-pw-phone">
휴대폰으로 받기
</a>
</li>
<?php endif; ?>
</ul>
</div>
<div class="card-body ">
<div class="tab-content text-center">
<div class="tab-pane <?php echo $d['member']['join_byEmail']?' show active':'' ?>" id="pane-pw-email" role="tabpanel" aria-labelledby="tab-email">
<div class="input-group input-group-lg mt-3">
<input type="email" class="form-control" name="email" placeholder="이메일 주소" tabindex="1" autocorrect="off" autocapitalize="off" required value="">
<div class="invalid-tooltip" data-role="emailErrorBlock"></div>
<div class="input-group-append">
<button class="btn btn-light" type="button" data-act="send_code" data-type="email" data-device="desktop">
<span class="not-loading">다음</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
<div class="d-none mt-3" data-role="verify_email_area">
<small class="form-text text-success my-3">
인증번호를 발송했습니다.(유효시간 <?php echo $d['member']['join_keyexpire'] ?>분)
<span data-role="countdown" data-email-countdown="">[00:00]</span><br>
위 메일로 발송된 6자리 인증번호를 입력해 주세요.<br>
인증번호가 오지 않으면 입력하신 정보가 정확한지 확인하여 주세요.
</small>
<div class="input-group input-group-lg">
<input type="number" class="form-control" name="confirm_email_code" data-role="confirm_email_code" placeholder="인증번호 입력">
<div class="invalid-tooltip" data-role="emailCodeBlock"></div>
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button" data-act="confirm_code" data-type="email" data-device="desktop">
<span class="not-loading">확인</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
</div><!-- /.d-none -->
</div><!-- /.tab-pane -->
<div class="tab-pane <?php echo ($d['member']['join_byPhone'] && !$d['member']['join_byEmail'])?' show active':'' ?>" id="pane-pw-phone" role="tabpanel" aria-labelledby="tab-phone">
<div class="input-group input-group-lg mt-3">
<input type="tel" class="form-control" name="phone" placeholder="휴대폰 번호" tabindex="1" autocorrect="off" autocapitalize="off" required>
<div class="invalid-tooltip" data-role="phoneErrorBlock"></div>
<div class="input-group-append">
<button class="btn btn-light" type="button" data-act="send_code" data-type="phone" data-device="desktop">
<span class="not-loading">다음</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
<div class="d-none mt-3" data-role="verify_phone_area">
<small class="form-text text-success my-3">
인증번호를 발송했습니다.(유효시간 <?php echo $d['member']['join_keyexpire'] ?>분)
<span data-role="countdown" data-phone-countdown="">[00:00]</span><br>
위 휴대폰으로 발송된 6자리 인증번호를 입력해 주세요.<br>
인증번호가 오지 않으면 입력하신 정보가 정확한지 확인하여 주세요.
</small>
<div class="input-group input-group-lg">
<input type="number" class="form-control" name="confirm_phone_code" data-role="confirm_phone_code" placeholder="인증번호 입력">
<div class="invalid-tooltip" data-role="phoneCodeBlock">인증번호를 입력해주세요.</div>
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button" data-act="confirm_code" data-type="phone" data-device="desktop">
<span class="not-loading">확인</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
</div><!-- /.d-none -->
</div><!-- /.tab-pane -->
</div><!-- /.tab-content -->
<ul class="list-unstyled f13 text-muted mt-4 mb-1">
<li>본인인증을 통해 비밀번호를 재설정 하실 수 있습니다.</li>
<li>인증번호를 받을 곳을 선택해 주세요.</li>
<li>비밀번호는 암호화 저장되어 분실 시 찾아드릴 수 없습니다.</li>
</ul>
</div><!-- /.card-body tab-content-->
</div><!-- /.card -->
<?php endif; ?>
<div class="card d-none" data-role="change_pw">
<div class="card-body">
<form id="pwResetForm" role="form" action="<?php echo $g['s']?>/" method="post" autocomplete="off">
<input type="hidden" name="r" value="<?php echo $r?>">
<input type="hidden" name="m" value="member">
<input type="hidden" name="a" value="pw_reset">
<input type="hidden" name="act" value="change_pw">
<input type="hidden" name="device" value="desktop">
<input type="hidden" name="code" value="">
<input type="hidden" name="target" value="">
<input type="hidden" name="type" value="">
<input type="hidden" name="check_pw1" value="0">
<input type="hidden" name="check_pw2" value="0">
<input type="hidden" name="usertype" value="admin">
<div class="form-group position-relative">
<label>비밀번호(6~16자리)</label>
<input type="password" class="form-control form-control-lg" name="pw1" placeholder="" autocorrect="off" autocapitalize="off" data-role="pw1">
<div class="invalid-tooltip" data-role="pw1CodeBlock" id="pw1-feedback"></div>
</div>
<div class="form-group position-relative">
<label>비밀번호 재입력</label>
<input type="password" class="form-control form-control-lg" name="pw2" placeholder="" autocorrect="off" autocapitalize="off" data-role="pw2">
<div class="invalid-tooltip" data-role="pw2CodeBlock" id="pw2-feedback"></div>
</div>
<div class="mt-4 mb-3">
<button type="submit" class="btn btn-outline-primary btn-lg btn-block" data-role="submit">
<span class="not-loading">변경하기</span>
<span class="is-loading"><i class="fa fa-spinner fa-lg fa-spin fa-fw"></i> 변경중 ...</span>
</button>
</div>
</form>
</div><!-- /.card-body -->
</div><!-- /.card -->
<div class="modal-footer justify-content-center py-2">
<button type="button" class="btn btn-link muted-link" data-dismiss="modal">닫기</button>
</div>
</div>
</div>
</div>
<!-- https://github.com/hilios/jQuery.countdown -->
<?php getImport('jquery.countdown','jquery.countdown.min','2.2.0','js')?>
<script>
var modal_pwReset = $('#modal-pwReset')
$(function () {
$('#admin-loginform').submit(function(e){
e.preventDefault();
e.stopPropagation();
var form = $(this)
var formID = form.attr('id')
var f = document.getElementById(formID);
form.find('[name="form"]').val('#'+formID);
form.find('[type="submit"]').attr("disabled",true);
form.find('.form-control').removeClass('is-invalid') //에러이력 초기화
setTimeout(function(){
getIframeForAction(f);
f.submit();
}, 500);
});
// 로그인 에러 흔적 초기화
$("#admin-loginform").find('.form-control').keyup(function() {
$(this).removeClass('is-invalid')
});
})
function doPwCountdown(type) {
modal_pwReset.find('[data-'+type+'-countdown]').each(function() {
var $this = $(this), finalDate = $(this).data(type+'-countdown');
$this.html('');
$this.countdown(finalDate, function(event) {
$this.html('['+event.strftime('%M:%S')+']');
});
});
};
function pwResetCheck(obj,layer) {
var f = document.getElementById('pwResetForm');
if (!obj.value)
{
obj.classList.remove('is-invalid');
getId(layer).innerHTML = '';
}
else
{
if (obj.name == 'pw1') {
f.classList.remove('was-validated');
if (f.pw1.value.length < 6 || f.pw1.value.length > 16) {
f.check_pw1.value = '0';
f.classList.remove('was-validated');
obj.classList.add('is-invalid');
obj.classList.remove('is-valid');
getId(layer).innerHTML = '영문/숫자 2개 이상의 조합으로 최소 6~16자로 입력하셔야 합니다.';
obj.focus();
return false;
}
if (getTypeCheck(f.pw1.value,"abcdefghijklmnopqrstuvwxyz")) {
getId(layer).innerHTML = '비밀번호가 영문만으로 입력되었습니다.\n영문/숫자 2개 이상의 조합으로 최소 6자이상 입력하셔야 합니다.';
obj.focus();
return false;
}
if (getTypeCheck(f.pw1.value,"1234567890")) {
getId(layer).innerHTML = '비밀번호가 숫자만으로 입력되었습니다.\n영문/숫자 2개 이상의 조합으로 최소 6자이상 입력하셔야 합니다.';
obj.focus();
return false;
}
f.pw1.classList.add('is-valid');
f.pw1.classList.remove('is-invalid');
getId(layer).innerHTML = '';
f.check_pw1.value = '1';
}
if (obj.name == 'pw2') {
f.classList.remove('was-validated');
obj.classList.add('is-invalid');
obj.classList.remove('is-valid');
if (f.pw1.value != f.pw2.value)
{
getId(layer).innerHTML = '비밀번호가 일치하지 않습니다.';
f.classList.remove('was-validated');
obj.focus();
f.check_pw2.value = '0';
return false;
}
f.pw2.classList.add('is-valid');
f.pw2.classList.remove('is-invalid');
getId(layer).innerHTML = '';
f.check_pw2.value = '1';
}
}
}
$(function () {
modal_pwReset.on('show.bs.modal', function (e) {
var modal = modal_pwReset
//화면 초기화
modal.find('[data-role="confirm_code"]').removeClass('d-none')
modal.find('[data-role="change_pw"]').addClass('d-none')
modal.find('#tab-email').tab('show')
modal.find('[data-act="send_code"]').prop("disabled",false)
modal.find('[data-act="send_code"] .not-loading').text('다음')
modal.find('[data-act="confirm_code"]').prop("disabled",false)
modal.find('[type="number"]').val('').removeClass('is-invalid')
modal.find('[name="email"]').val('').removeClass('is-invalid')
modal.find('[name="phone"]').val('').removeClass('is-invalid')
modal.find('[data-role="verify_email_area"]').addClass('d-none')
modal.find('[data-role="verify_phone_area"]').addClass('d-none')
modal.find('[data-role="pw1"]').val('').removeClass('is-invalid')
modal.find('[data-role="pw2"]').val('').removeClass('is-invalid')
modal.find('[name="check_pw1"]').val(0)
modal.find('[name="check_pw2"]').val(0)
modal.find('[data-role="submit"]').prop("disabled",false)
})
modal_pwReset.on('shown.bs.modal', function (e) {
var modal = modal_pwReset
modal.find('[name="email"]').trigger('focus')
})
modal_pwReset.find('input').keyup(function() {
$(this).removeClass('is-invalid') //에러 발생후 다시 입력 시도시에 에러 흔적 초기화
});
//비밀번호 유용성 체크
modal_pwReset.find('[data-role="change_pw"] input').keyup(function(){
var modal = modal_pwReset
var item = $(this).data('role')
var item_pw_check = modal.find('[name=check_pw]').val()
if (item =='pw1') {
element = document.querySelector('[name="pw1"]');
pwResetCheck(element,'pw1-feedback')
}
if (item =='pw2') {
element = document.querySelector('[name="pw2"]');
pwResetCheck(element,'pw2-feedback')
}
});
})
modal_pwReset.find('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var pane = $(this).attr('id')
if (pane=='tab-email') modal_pwReset.find('[name="email"]').focus()
if (pane=='tab-phone') modal_pwReset.find('[name="phone"]').focus()
})
// 본인인증 코드발송
modal_pwReset.on('click','[data-act="send_code"]',function(){
var modal = modal_pwReset
var button = $(this)
var act = 'send_code'
var type = button.attr('data-type')
var device = button.attr('data-device')
if (type=='email') {
var input = modal.find('[name="email"]')
var _input = document.querySelector('#modal-pwReset [name="email"]');
var target = input.val()
var msg = modal.find('[data-role="emailErrorBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 이메일 입력폼 유효성 체크
if (!target) {
input.focus()
input.addClass('is-invalid')
msg.text('이메일을 입력해주세요.')
return false;
}
if (!chkEmailAddr(_input.value)) {
input.focus()
input.addClass('is-invalid')
msg.text('이메일 형식이 아닙니다.')
return false;
}
}
if (type=='phone') {
var input = modal.find('[name="phone"]')
var _input = document.querySelector('#modal-pwReset [name="phone"]');
var target = input.val()
var msg = modal.find('[data-role="phoneErrorBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 휴대폰번호 입력폼 유효성 체크
if (!target) {
input.focus()
input.addClass('is-invalid')
msg.text('휴대폰 번호를 입력해주세요.')
return false;
}
if (!chkPhoneNumber(_input.value)) {
input.focus()
input.addClass('is-invalid')
msg.text('휴대폰 번호 형식이 아닙니다.')
return false;
}
}
button.attr('disabled',true) //버튼 로딩처리
var url = rooturl+'/?r='+raccount+'&m=member&a=pw_reset&act='+act+'&type='+type+'&target='+target+'&device='+device+'&usertype=admin'
getIframeForAction();
//modal.find('[data-act=confirm_code]').attr('data-type',type);
//modal.find('[type=number]').attr('data-role','confirm_'+type+'_code').attr('name','confirm_'+type+'_code');
//modal.find('.invalid-tooltip').attr('data-role',type+'CodeBlock');
modal.find('[data-role=countdown]').text('');
modal.find('[data-role="target"]').text(target)
setTimeout(function() {
frames.__iframe_for_action__.location.href = url;
}, 700);
});
// 본인인증 코드확인
modal_pwReset.on('click','[data-act="confirm_code"]',function(){
var modal = modal_pwReset
var button = $(this)
var act = 'confirm_code'
var type = button.data('type')
var device = button.data('device')
if (type=='email') {
var input = modal.find('[name="confirm_email_code"]')
var code = input.val()
var msg = modal.find('[data-role="emailCodeBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 인증번호 입력폼 유효성 체크
if (!code) {
input.focus()
input.addClass('is-invalid')
msg.text('인증번호를 입력해주세요.')
return false;
}
}
if (type=='phone') {
var input = modal.find('[name="confirm_phone_code"]')
var code = input.val()
var msg = modal.find('[data-role="phoneCodeBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 인증번호 입력폼 유효성 체크
if (!code) {
input.focus()
input.addClass('is-invalid')
msg.text('인증번호를 입력해주세요.')
return false;
}
}
button.attr('disabled',true) //버튼 로딩처리
var url = rooturl+'/?r='+raccount+'&m=member&a=pw_reset&act='+act+'&type='+type+'&code='+code+'&device='+device
getIframeForAction();
setTimeout(function() {
frames.__iframe_for_action__.location.href = url;
}, 700);
});
// 비밀번호 변경
$('#pwResetForm').submit( function(e){
e.preventDefault();
e.stopPropagation();
var form = $(this)
var formID = form.attr('id')
var f = document.getElementById(formID);
if (f.check_pw1.value == '0' || f.check_pw2.value == '0') {
return false;
}
form.find('[name="form"]').val('#'+formID);
form.find('[type="submit"]').attr("disabled",true); //버튼 로딩처리
form.find('.form-control').removeClass('is-invalid') //에러이력 초기화
setTimeout(function(){
getIframeForAction(f);
f.submit();
}, 500);
}
);
</script>

View File

@@ -0,0 +1,899 @@
@charset "utf-8";
/* ------------------ 공통사항 --------------------*/
body {
padding-top: 3.5rem;
background-color: #fff !important;
padding: 0;
font-family: 'NotoSans', '돋움', dotum, sans-serif;
font-size: 16px;
line-height: 1.3rem;
color: #222;
letter-spacing: -.5px;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
a {
color: #6698e8;
}
code {
background: transparent
}
#rb-body.lang-en {
font-family: 'NotoSans', Helvetica, Arial, 'Liberation Sans', sans-serif;
}
.btn {
border-radius: 0px;
}
#rb-admin-page-content {
padding-top: 3.34rem
}
.navbar {
border-bottom: 1px solid rgba(0, 0, 0, .1);
background-color: #fff
}
#rb-bookmark-dropdown1 {
position: absolute;
top: 34px;
left: -24px;
background: #fff;
border: #cccccc solid 1px;
border-radius: 3px;
}
#rb-bookmark-dropdown2 {
position: absolute;
top: 34px;
left: -71px;
background: #fff;
border: #cccccc solid 1px;
border-radius: 3px;
}
/* ------------------ navbar --------------------*/
/* ------------------ tabs --------------------*/
.navbar {
font-family: 'NotoSans', sans-serif, '돋움', dotum, sans-serif;
}
.navbar .navbar-nav {
border-bottom: 0
}
.navbar .navbar-nav .nav-item {
/*margin-right: 20px;*/
margin-bottom: 0;
}
.navbar .navbar-nav li a.nav-link {
position: relative;
color: rgba(0, 0, 0, .5) !important;
font-size: 15px
}
.navbar-nav>li a.nav-link.active::before,
.navbar-nav>li a.nav-link.active:focus::before,
.navbar-nav>li a.nav-link.active:hover::before {
position: absolute;
width: 100%;
height: 4px;
left: 0;
bottom: -9px;
content: '';
background-color: #007bff;
color: rgba(0, 0, 0, .9);
;
font-weight: 400;
}
/*
* Sidebar
*/
.sidebar {
position: fixed;
top: 3.4rem;
bottom: 0;
left: 0;
z-index: 1000;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
/* Scrollable contents if viewport is shorter than content. */
border-right: 1px solid rgba(0, 0, 0, .1);
background-color: #fff;
}
.sidebar.sidebar-right {
left: auto;
right: 0;
border-right: none;
border-left: 1px solid rgba(0, 0, 0, .1);
}
.sidebar .nav {
margin-bottom: 20px;
}
.sidebar .nav-item {
width: 100%;
}
.sidebar .nav-item+.nav-item {
margin-left: 0;
}
.sidebar .nav-link {
border-radius: 0;
}
.sidebar .card {
margin-bottom: 0;
border-radius: 0;
border-left: 0;
border-right: 0;
border-bottom: 0;
box-shadow: none
}
.sidebar .card~.card {
margin-top: -1px
}
.sidebar .card-body {
background-color: #fff
}
.sidebar .list-group-item.active {
border-width: 1px !important;
border-style: solid !important;
border-color: rgb(0, 123, 255) !important;
border-image: initial !important;
}
.sidebar .list-group-item.active .badge-dark {
color: #eee;
}
.breadcrumb {
background-color: transparent;
}
/* ------------------ button --------------------*/
/*본문*/
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
font-family: 'NotoSans', sans-serif, '돋움', dotum, sans-serif;
margin: 0 0 20px;
font-weight: 300;
}
.h2,
h2 {
font-size: 30px;
}
.h3,
h3 {
font-size: 26px;
}
.h4,
h4 {
font-size: 22px;
}
.page-body-header {
background-color: #fff
}
.page-header {
padding-top: 20px;
padding-bottom: 9px;
margin: 0 0px 20px;
border-bottom: 1px solid rgba(0, 0, 0, .1)
}
.page-header h1,
.page-header h2,
.page-header h3,
.page-headerh4,
.page-header h5,
.page-header h6 {
margin: 0;
}
.subnav-item {
position: relative;
float: left;
padding: 6px 14px;
font-weight: 600;
line-height: 20px;
color: #586069;
border: 1px solid #e1e4e8;
}
.subnav-item+.subnav-item {
margin-left: -1px;
}
.subnav-item:first-child {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
.subnav-item:last-child {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
/* ------------------ icon panel --------------------*/
/*color*/
.text-gray {
color: #586069 !important;
}
.text-gray-light {
color: #959da5 !important;
}
.text-gray-dark {
color: #24292e !important;
}
.link-gray {
color: #586069 !important;
}
.link-gray-dark {
color: #24292e !important;
}
.link-gray-dark:hover {
color: #0366d6 !important;
}
.border-top {
border-top: 1px #e1e4e8 solid !important;
}
.border-gray-light {
border-color: #eaecef !important;
}
/*form*/
.col-form-label-lg {
font-size: 1rem;
}
.form-control[readonly] {
color: #999;
}
.form-control-plaintext {
color: #999;
}
.input-group-addon {
background-color: #343b43;
color: #999;
border: 1px solid #222;
}
.input-group-text {
background-color: #fff
}
/* tab */
.nav-tabs {
border-bottom: 1px solid rgba(0, 0, 0, .1);
}
.nav-tabs .nav-link {
border-radius: 0;
}
.nav-tabs .nav-link:hover {}
.nav-tabs .nav-link.active {}
.nav-tabs .nav-link.active:first-child {}
/* ------------------ table --------------------*/
.table {}
.table thead th {
border-bottom: none;
padding: .75rem;
line-height: 1;
font-weight: normal;
}
.table thead th,
.table tbody td {
white-space: nowrap !important;
vertical-align: middle;
}
.table-bordered td,
.table-bordered th {
border: 1px solid rgba(0,0,0,.125);
}
.table-active,
.table-active>td,
.table-active>th {
background-color: #007bff;
color: #fff
}
.table tbody .table-active td .badge-dark,
.table tbody .table-active td a {
color: #fff;
}
#rb-body .card .card-header.rb-icon .icon {
float: left;
border-right: 1px solid #c9c9c9;
width: 41px;
height: 100%;
box-shadow: none;
position: absolute;
top: 0;
left: 1px;
text-align: center;
}
/*comment*/
.form-control,
.input-group-lg>.form-control {
border-radius: 0
}
.border-default {
border-color: #222
}
.btn.btn-block {
border-radius: 4rem
}
/* ------------------ 즐겨찾기 --------------------*/
/* ------------------ 토글 레이어 --------------------*/
#bs-example-navbar-collapse-1 .rb-toggle-layer {
padding: 0;
text-shadow: none;
}
#bs-example-navbar-collapse-1 .rb-toggle-layer .panel {
margin: 0;
border: none;
padding: 0;
}
#bs-example-navbar-collapse-1 .rb-toggle-layer .panel-title {
line-height: 30px;
font-weight: bold;
font-size: 14px
}
#bs-example-navbar-collapse-1 .rb-toggle-layer .list-group {
max-height: 450px;
max-height: calc(100vh - 300px);
max-height: -moz-calc(100vh - 300px);
max-height: -webkit-calc(100vh - 300px);
overflow: auto;
}
#bs-example-navbar-collapse-1 .rb-toggle-layer .panel-footer a {
display: block;
text-align: center;
font-weight: normal;
color: #777
}
.rb-box {
position: relative;
background-color: #444;
border-radius: 6px;
text-align: center;
padding: 8px;
margin: 4px;
width: 70px;
height: 65px;
overflow: hidden;
box-shadow: 0 1px 2px #222 !important;
}
/* ------------------ 풀사이즈 편집 --------------------*/
.rb-fullsize {
position: fixed;
z-index: 1000000;
top: -35px;
left: 0;
right: 0;
bottom: 0 width: 100%;
height: 100%;
}
.rb-fullsize textarea {
position: fixed;
top: 47px;
left: 3px;
width: 99.5%;
height: 100%;
}
.rb-fullsize .rb-submit button {
position: fixed;
bottom: 5px;
width: 99%;
height: 40px;
font-weight: bold;
font-size: 18px;
margin: 0 5px 0 5px;
}
/* CodeMirror */
.CodeMirror .CodeMirror-scroll {
line-height: 1.5 !important;
font-size: 12px
}
/* ------------------ footer --------------------*/
.rb-admin-footer {
padding-top: 40px;
padding-bottom: 0;
margin-top: 0;
color: #777;
text-align: center;
}
/* ------------------ modal close --------------------*/
.rb-close-white {
color: #fff;
text-shadow: 0 1px 0 #ffffff;
opacity: 1;
filter: alpha(opacity=100);
line-height: 30px;
}
/* ------------------ 모바일 디바이스 접속 --------------------*/
#rb-body.rb-device-connect {
overflow-x: hidden;
}
#rb-body.rb-device-connect .rb-navbar-nav {
margin-top: 36px;
}
#rb-body.rb-device-connect .mobile-tabs li {
width: 33.3333%;
}
/* ------------------ 기타 --------------------*/
#rb-body .rb-modal-dashboard {
font-size: 18px;
cursor: pointer;
position: relative;
top: 8px;
}
#rb-body.rb-device-connect .rb-modal-dashboard {
font-size: 14px;
top: 0;
}
#rb-body.rb-device-connect .rb-modal-dashboard i {
font-size: 17px;
}
/* ------------------ 미디어쿼리 --------------------*/
@media (min-width: 768px) {
#bs-example-navbar-collapse-1 .rb-notifications-layer {
width: 260px;
}
}
@media (max-width: 767px) {
#rb-body select.form-control {
margin-bottom: 5px;
}
#rb-body .input-group select.form-control {
margin-bottom: 0;
}
}
@media (min-width:992px) {
#rb-body .rb-navbar-nav>li:first-child>a {
-webkit-border-radius: 4px 0 0 0;
-moz-border-radius: 4px 0 0 0;
border-radius: 4px 0 0 0;
}
#rb-body .rb-navbar-nav>li:last-child>a {
-webkit-border-radius: 1px 4px 0 0;
-moz-border-radius: 1px 4px 0 0;
border-radius: 1px 4px 0 0;
}
#rb-body .tab-content {
-webkit-border-radius: 0 0 4px 4px;
-moz-border-radius: 0 0 4px 4px;
border-radius: 0 0 4px 4px;
}
}
@media (max-width: 991px) {
#rb-body .rb-navbar-nav.rb-item-03 li {
width: 33.3%;
}
#rb-body .rb-navbar-nav.rb-item-04 li {
width: 25%;
}
}
/*테마*/
/*content*/
/*table*/
/*component*/
/* modal */
.modal .modal-header {
border-bottom: 1px solid rgba(0, 0, 0, .1);
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.modal .modal-header .close {
opacity: 1;
}
.modal .modal-body iframe body {
background-color: #fff
}
.modal-content {
border: 1px solid rgba(0, 0, 0, .1);
border-radius: 0
}
.modal-footer {
border-top: 1px solid rgba(0, 0, 0, .1);
}
/*list-group*/
/*badge*/
.badge-dark {
color: #586069;
background-color: rgba(27, 31, 35, .08);
font-weight: 300
}
/*button*/
.btn {
position: relative;
display: inline-block;
/* padding: 6px 12px; */
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
}
.btn:focus {
outline: 0;
}
.btn-light:focus,
.btn-light.focus {
box-shadow: 0 0 0 0.2em rgba(3, 102, 214, 0.3);
}
[data-toggle="buttons"].btn-group .btn-light {
color: #999;
font-weight: normal;
}
[data-toggle="buttons"].btn-group .btn-light.active {
color: #fff !important;
background-color: #0366d6 !important;
border-color: #0366d6;
}
.btn-sm {
padding: 3px 10px;
font-size: 12px;
line-height: 20px;
}
.btn,
[role="button"] {
cursor: pointer !important;
}
.btn-light {
color: #24292e;
user-select: none;
background-color: #fff;
border: 1px solid rgba(27, 31, 35, 0.2);
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
border-radius: 0
}
.btn-light:hover,
.btn-light.hover {
background-color: #e6ebf1;
background-image: linear-gradient(-180deg, #f0f3f6 0%, #e6ebf1 90%);
background-position: -.5em;
border-color: rgba(27, 31, 35, 0.35);
}
.btn-light:not(:disabled):not(.disabled).active,
.btn-light:not(:disabled):not(.disabled):active,
.show>.btn-light.dropdown-toggle {
background-color: #e9ecef;
background-image: none;
border-color: rgba(27, 31, 35, 0.35);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
.btn-light:not(:disabled):not(.disabled).active:focus,
.btn-light:not(:disabled):not(.disabled):active:focus,
.show>.btn-light.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2em rgba(3, 102, 214, 0.3);
}
.btn-danger {
color: #cb2431;
border: 1px solid rgba(27, 31, 35, 0.2);
background-color: #fafbfc;
background-image: linear-gradient(-180deg, #fafbfc 0%, #eff3f6 90%);
}
.btn-danger:hover {
color: #fff;
background-color: #cb2431;
background-image: linear-gradient(-180deg, #de4450 0%, #cb2431 90%);
border-color: rgba(27, 31, 35, 0.5);
}
.btn-danger:active,
.btn-danger.active {
color: #fff;
background-color: #b5202c;
background-image: none;
border-color: rgba(27, 31, 35, 0.5);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
.btn-danger:disabled,
.btn-danger.disabled {
color: rgba(203, 36, 49, 0.4);
background-color: #eff3f6;
background-image: none;
border-color: rgba(27, 31, 35, 0.2);
box-shadow: none;
}
.btn-outline-primary.disabled,
.btn-outline-primary:disabled {
color: #555;
background-color: transparent;
border-color: #555;
}
/* Pagination */
/*tooltip*/
.tooltip-inner {
background-color: #0366d6;
}
.tooltip.bs-tooltip-top .arrow::before,
.tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before {
border-top-color: #0366d6
}
/* input-group */
/*form*/
.form-group label {
font-size: 13px;
font-weight: 300;
color: #6c757d
}
.col-form-label {
color: #444
}
.custom-checkbox,
.custom-radio {
/* line-height: 1.85rem; */
}
/*badge*/
/*card*/
.card-header.p-0 a.d-block {
padding: .75rem 1.25rem
}
.card-header.p-0 a.d-block::before {
display: inline-block;
margin-left: 1rem;
margin-right: -.45rem;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
float: right;
content: "\f0d7";
}
.card-header.p-0 a.d-block.collapsed::before {
content: "\f0da";
}
.card-header.bg-primary {
border-bottom: 0;
border-radius: 0;
}
.card-header,
.card-footer {
background-color: #fff
}
.card>.list-group:last-child .list-group-item:last-child {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
/*유틸리티*/
.bg-dark {
background-color: #fff !important;
}
.border {
border: 1px solid #222;
}
.border-bottom {
border-bottom: 1px solid rgba(0, 0, 0, .1) !important;
}
.border-left {
border-left: 1px solid rgba(0, 0, 0, .1) !important;
}
/*tree*/
.sidebar .rb-tree {
font-family: 'NotoSans','돋움', dotum, sans-serif, FontAwesome;
}
.sidebar .rb-tree li:before {
border-left: 1px solid rgba(0, 0, 0, .2) !important;
}
.sidebar .rb-tree li:after {
border-top: 1px solid rgba(0, 0, 0, .2) !important;
}
.sidebar .rb-tree .rb-active {
color: rgb(0, 123, 255);
}
.sidebar .rb-tree a {}
.sidebar .rb-tree a u {
text-decoration: none;
}
/*기본 모듈개별*/
#catebody .dd-item .dd-handle {
background-color: rgba(0, 0, 0, .03);
}
.sidebar .dd-handle {
color: inherit;
}
/*datepicker 스타일 초기화*/
.input-daterange .input-group-addon {
width: auto !important;
min-width: auto !important;
font-weight: normal !important;
background-color: #fff;
text-align: center !important;
text-shadow: none !important;
vertical-align: middle !important;
border: solid transparent !important;
border-width: 1px 0 !important;
margin-left: 0 !important;
margin-right: 0 !important;
}
/* readme */
.rb-docs {
background-color: #fff
}
/* markdown-body */
.markdown-body .form-control,
.markdown-body {
font-size: 14px !important;
}
/* 라이선스 */
.badge-standard {
color: #fff;
background-color: #007bff;
}
.badge-premium {
color: #fff;
background-color: #563d7c;
}

View File

@@ -0,0 +1,34 @@
var _isFullSize = false;
var _isCodeEdit = false;
function editFullSize(id,obj)
{
if (_isCodeEdit)
{
_codefullscreen();
}
else {
if (_isFullSize == false)
{
obj.title = '원래대로';
$('#'+id).addClass('rb-fullsize');
_isFullSize = true;
}
else {
obj.title = '전체화면';
$('#'+id).removeClass('rb-fullsize');
_isFullSize = false;
}
}
}
function goHref_parent(url) {
parent.location.href = url;
}
$(function () {
$('[data-toggle="tooltip"]').tooltip()
$('[data-tooltip="tooltip"]').tooltip({
html: true
})
$('.js-tooltip').tooltip()
})

View File

@@ -0,0 +1,283 @@
<header class="navbar navbar-expand fixed-top navbar-dark bg-dark" role="navigation" data-scroll-header>
<?php if($g['device'] && $module == 'dashboard'):?>
<a class="navbar-brand" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.shortcut" style="margin-left:0;">
<i class="kf kf-bi-01 fa-lg" style="color:#000;"></i>
</a>
<?php else:?>
<a class="navbar-brand" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard<?php if($g['mobile']&&$_SESSION['pcmode']!='Y'):?>&amp;front=mobile.shortcut<?php endif?>">
<span class="badge badge-light"><?php echo $MD['name']?></span>
</a>
<?php if($module == 'dashboard' && ($front == 'main' || $front == 'mobile.dashboard')):?>
<i class="fa fa-cog rb-modal-dashboard js-tooltip d-none" title="대시보드 꾸미기" data-toggle="modal" data-target="#modal_window"></i>
<?php endif?>
<?php endif?>
<div class="navbar-collapse collapse">
<?php if($g['device']&&$module=='dashboard'):?>
<ul class="navbar-nav mr-auto">
<li<?php if($front=='mobile.shortcut'):?> class="active"<?php endif?>><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.shortcut">바로가기</a></li>
<li<?php if($front=='mobile.dashboard'):?> class="active"<?php endif?>><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.dashboard">대시보드</a></li>
<li<?php if($front=='mobile.site'):?> class="active"<?php endif?>><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=dashboard&amp;front=mobile.site">사이트</a></li>
</ul>
<?php else:?>
<ul class="navbar-nav mr-auto" id="rb-admin-ul-tabs">
<?php $_front =explode('_' , $front); ?>
<?php $_menuCount=$d['amenu']?count($d['amenu']):0;if(!$nosite&&$_menuCount):?>
<?php if($_i<=10):?>
<?php $_i=1;foreach($d['amenu'] as $_k => $_v):?>
<li id="rb-more-tab-<?php echo $_i?>" class="nav-item">
<a class="nav-link<?php if($_front[0] == $_k):?> active<?php endif?>" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=<?php echo $m?>&amp;module=<?php echo $module?>&amp;front=<?php echo $_k ?>">
<?php echo $_v ?>
</a>
</li>
<?php $_i++;endforeach?>
<?php endif?>
<?php if($_i>10):?>
<li class="nav-item dropdown rb-more-tabs d-block d-sm-none">
<a class="nav-link dropdown-toggle" href="#." data-toggle="dropdown">더보기</a>
<div class="dropdown-menu dropdown-menu-right">
<?php $_i=1;foreach($d['amenu'] as $_k => $_v):?>
<a id="rb-more-tabs-<?php echo $_i?>" class="dropdown-item<?php if($front == $_k):?> active<?php endif?>" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=<?php echo $m?>&amp;module=<?php echo $module?>&amp;front=<?php echo $_k?>">
<?php echo $_v?>
</a>
<?php $_i++;endforeach?>
</div>
</li>
<?php endif?>
<?php endif?>
</ul>
<?php endif?>
<ul class="navbar-nav my-0">
<?php if($module!='dashboard'):?>
<li class="nav-item">
<a class="nav-link<?php if($front == '_info'):?> active<?php endif?>" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=<?php echo $m?>&amp;module=<?php echo $module?>&amp;front=_info">
<i class="fa fa-question-circle fa-lg"></i> 안내
</a>
</li>
<?php endif?>
<?php $exists_bookmark=getDbRows($table['s_admpage'],'memberuid='.$my['uid']." and url='".$g['s'].'/?r='.$r.'&m='.$m.'&module='.$module.'&front='.$front."'")?>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
<i id="_bookmark_star_" class="fa fa-lg fa-star<?php if($exists_bookmark):?> rb-star-fill text-primary<?php else:?>-o<?php endif?>"></i>
</a>
<div class="dropdown-menu dropdown-menu-right p-0">
<div class="card border-dark rounded-0 mb-0" style="width: 300px">
<div class="card-header d-flex justify-content-between align-items-center py-1 px-2 bg-white border-secondary">
북마크
<div>
<div id="_bookmark_notyet_" class="btn-group btn-group-sm dropdown<?php if($exists_bookmark):?> d-none<?php endif?>">
<button type="button" class="btn btn-outline-secondary rb-bookmark-add">북마크에 추가</button>
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-body" data-toggle="dropdown">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<div id="rb-bookmark-dropdown1" class="dropdown-menu">
<a href="#." class="dropdown-item rb-bookmark-add">북마크에 추가</a>
<div class="dropdown-divider"></div>
<a href="#." data-toggle="modal" data-target="#modal_window" class="dropdown-item rb-modal-bookmark">북마크 관리</a>
</div>
</div>
<div id="_bookmark_already_" class="btn-group btn-group-sm <?php if(!$exists_bookmark):?> d-none<?php endif?>">
<button type="button" class="btn btn-light disabled">추가됨</button>
<button type="button" class="btn btn-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown">
<span class="sr-only">Toggle Dropdown</span>
</button>
<div id="rb-bookmark-dropdown2" class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item b-bookmark-del" href="#">북마크에서 삭제</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item rb-modal-bookmark" href="#" data-toggle="modal" data-target="#modal_window">북마크 관리</a>
</div>
</div>
</div>
</div>
<div id="_add_bookmark_" class="list-group list-group-flush rb-scrollbar">
<?php $ADMPAGE = getDbArray($table['s_admpage'],'memberuid='.$my['uid'],'*','gid','asc',0,1)?>
<?php while($R=db_fetch_array($ADMPAGE)):?>
<a href="<?php echo $R['url']?>" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center" id="_now_bookmark_<?php echo $R['uid']?>">
<?php echo $R['name']?>
<i class="fa fa-fw fa-file-text-o"></i>
</a>
<?php endwhile?>
<?php if(!db_num_rows($ADMPAGE)):?><a class="list-group-item"><i class="fa fa-fw fa-file-text-o"></i>등록된 북마크가 없습니다</a><?php endif?>
</div>
<div class="card-footer p-0 border-top-0">
<a href="#." data-toggle="modal" data-target="#modal_window" class="rb-modal-bookmark btn btn-link btn-block">북마크 관리</a>
</div>
</div>
</div>
</li>
<?php if ($my['super'] && !$my['adm_site']): ?>
<?php
$SITES = getDbArray($table['s_site'],'','*','gid','asc',0,$p);
$SITEN = db_num_rows($SITES);
?>
<?php if($SITEN>1 && ($module!='admin' && $module!='project')):?>
<li class="nav-item d-none" data-role="siteSelector">
<div class="input-group input-group-sm mt-1 ml-2 border border-primary">
<div class="input-group-append" style="margin-left: 0;">
<a class="input-group-text muted-link" href="<?php echo $g['s']?>/?r=<?php echo $SD['id']?>&amp;m=<?php echo $m?>&amp;pickmodule=site&amp;panel=Y" target="_parent" data-toggle="tooltip" title="사이트관리">
<i class="<?php echo $SD['icon']?$SD['icon']:'fa fa-home'?> fa-lg" aria-hidden="true"></i>
</a>
</div>
<select class="form-control custom-select" onchange="goHref_parent('<?php echo $g['s']?>/?m=<?php echo $m?>&pickmodule=<?php echo $module?>&panel=Y&pickfront=<?php echo $front?>&r='+this.value);" style="margin-left: -1px;min-width:100px">
<?php while($S = db_fetch_array($SITES)):?>
<option value="<?php echo $S['id']?>"<?php if($r==$S['id']):?> selected<?php endif?>><?php echo $S['label']?></option>
<?php endwhile?>
</select>
</div>
</li>
<?php endif?>
<?php else: ?>
<?php
$SITES = getArrayString($my['adm_site']);
$SITEN = $SITES[count];
?>
<?php if($SITEN>1 && ($module!='admin' && $module!='project')):?>
<li class="nav-item d-none" data-role="siteSelector">
<div class="input-group input-group-sm mt-1 ml-2 border border-primary">
<div class="input-group-append" style="margin-left: 0;">
<a class="input-group-text muted-link" href="<?php echo $g['s']?>/?r=<?php echo $_SD['id']?>&amp;m=<?php echo $m?>&amp;pickmodule=site&amp;panel=Y" target="_parent">
<i class="<?php echo $SD['icon']?> fa-lg" aria-hidden="true"></i>
</a>
</div>
<select class="form-control custom-select" onchange="goHref_parent('<?php echo $g['s']?>/?m=<?php echo $m?>&pickmodule=<?php echo $module?>&panel=Y&pickfront=<?php echo $front?>&r='+this.value);" style="margin-left: -1px;min-width:100px">
<?php $_i=0;foreach($SITES['data'] as $val):?>
<?php $_SD = getUidData($table['s_site'],$val); ?>
<option value="<?php echo $_SD['id']?>"<?php if($r==$_SD['id']):?> selected<?php endif?>><?php echo $_SD['label']?></option>
<?php $_i++;endforeach?>
</select>
</div>
</li>
<?php endif?>
<?php endif; ?>
</ul>
</div><!-- /.navbar-collapse -->
</header>
<main id="rb-admin-page-content">
<?php include $g['adm_module'] ?>
</main>
<script>
$(document).ready(function()
{
document.body.onload = tabSetting;
document.body.onresize = tabSetting;
<?php if($g['device']):?>
$('#bs-example-navbar-collapse-1').on('show.bs.collapse', function () {
$("#_navbar_header_").addClass('rb-header-bottom-line');
});
$('#bs-example-navbar-collapse-1').on('hide.bs.collapse', function () {
$("#_navbar_header_").removeClass('rb-header-bottom-line');
});
getId('_add_bookmark_').style.maxHeight = '205px';
<?php endif?>
$('#bs-example-navbar-collapse-1 [data-toggle=dropdown]').on('click', function(event) {
event.preventDefault();
event.stopPropagation();
$(this).parent().siblings().removeClass('open');
$(this).parent().toggleClass('open');
});
$(".rb-help-btn").click(function(){
$(this).button('toggle');
});
$('.rb-modal-bookmark').on('click',function() {
modalSetting('modal_window','<?php echo getModalLink('&amp;m=admin&amp;module=admin&amp;front=modal.bookmark')?>');
});
$('.rb-bookmark-add').on('click',function() {
frames._action_frame_admin.location.href = '<?php echo $g['s']?>/?r=<?php echo $r?>&m=<?php echo $m?>&a=bookmark&_addmodule=<?php echo $module?>&_addfront=<?php echo $front?>';
});
$('.rb-bookmark-del').on('click',function() {
frames._action_frame_admin.location.href = '<?php echo $g['s']?>/?r=<?php echo $r?>&m=<?php echo $m?>&a=bookmark_delete&deltype=hidden&_addmodule=<?php echo $module?>&_addfront=<?php echo $front?>';
});
});
function tabSetting()
{
<?php if($g['device']):?>
$('#bs-example-navbar-collapse-1').removeClass('navbar-collapse');
if(document.body.scrollWidth > 750) $('#bs-example-navbar-collapse-1').addClass('navbar-collapse');
else $('#bs-example-navbar-collapse-1').removeClass('navbar-collapse');
<?php endif?>
var i;
var bodyWidth = document.body.scrollWidth;
var allTabnum = <?php echo (int)$_menuCount?>;
var showTabnum = allTabnum;
var showTabMore = false;
if (allTabnum > 3)
{
if (bodyWidth >= 0 && bodyWidth < 360)
{
showTabnum = 2;
showTabMore = true;
}
else if (bodyWidth >= 360 && bodyWidth < 523)
{
showTabnum = 3;
showTabMore = true;
}
else if (bodyWidth >= 523 && bodyWidth < 640)
{
showTabnum = 4;
showTabMore = true;
}
else if (bodyWidth >= 640 && bodyWidth < 750)
{
showTabnum = 5;
showTabMore = true;
}
else if (bodyWidth >= 750 && bodyWidth < 1100)
{
showTabnum = 8;
showTabMore = true;
}
else if (bodyWidth >= 1100 && bodyWidth < 1400)
{
showTabnum = 10;
showTabMore = false;
}
else if (bodyWidth >= 1400)
{
showTabnum = allTabnum;
showTabMore = false;
}
}
for (i = 1; i <= allTabnum; i++)
{
$('#rb-more-tab-'+i).removeClass('d-none');
$('#rb-more-tabs-'+i).removeClass('d-none');
}
for (i = showTabnum+1; i <= allTabnum; i++) $('#rb-more-tab-'+i).addClass('d-none');
for (i = 0; i <= showTabnum; i++) $('#rb-more-tabs-'+i).addClass('d-none');
if (showTabMore == true) $('.rb-more-tabs').removeClass('d-none');
else $('.rb-more-tabs').addClass('d-none');
}
// 북마크 dropdown 내부클릭시 dropdown 유지
$('.dropdown-body').on('click', function(e) {
e.stopPropagation();
});
</script>

View File

@@ -0,0 +1,183 @@
@charset "utf-8";
@import url(https://fonts.googleapis.com/earlyaccess/notosanskr.css);
html,
body {
height: 100%;
}
body {
background-color: #f9f9f9;
font-family: 'Noto Sans KR', "돋움", dotum, '나눔고딕', 'Nanum Gothic', sans-serif, FontAwesome, kimsq !important;
}
a {
color: #444
}
.rb-root {
display: table;
height: 100%;
width: 100%;
padding: 0;
}
#rb-login {
display: table-cell;
text-align: left;
margin: 0 auto;
padding: 10% 0 100px;
}
#rb-login .card {
margin: 0 auto 15px;
border-radius: 3px;
}
#rb-login .card-header h1 {
margin-bottom: 0;
font-size: 18px
}
#rb-login .card-header a:hover {
text-decoration: none
}
#rb-login .card .form-group label {
font-weight: normal;
display: block;
margin-bottom: 7px
}
#rb-login .form-login .label-link {
float: right;
font-size: 12px;
line-height: 24px;
}
#rb-login .panel .form-control.input-lg {
border-radius: 2px;
}
#rb-login .card-footer ul {
margin-bottom: 0
}
#rb-login .card-foote a {
font-size: 90%;
}
.form-control,
.form-control[readonly] {
border-radius: 0
}
.btn {
border-radius: 0
}
/*반응형 설정*/
@media (min-width: 481px) {
#rb-login .card {
width: 350px;
}
}
@media (max-width: 480px) {
body {
/*background-color: #fff !important*/
}
#rb-login {
padding: 0;
}
#rb-login .card {
box-shadow: none;
border: none;
border-radius: none;
background-color: inherit;
}
#rb-login .card-footer {
/*background-color: transparent;*/
}
#rb-login h1 {
font-size: 20px
}
#rb-login .btn.btn-primary {
width: 100%;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
}
#modal-pwReset {
font-size: 14px
}
#modal-pwReset .modal-header,
#modal-pwReset .card-header {
background-color: #0069d9;
color: #fff
}
#modal-pwReset .modal-content {
border-radius: .45rem;
}
#modal-pwReset .nav-tabs .nav-link:focus,
#modal-pwReset .nav-tabs .nav-link:hover {
border-color: #0069d9 #0069d9 #fff;
}
#modal-pwReset .form-control,
#modal-pwReset .form-control[readonly] {
background-color: #fff;
border: 1px solid #ced4da;
border-radius: 0;
color: #495057;
}
.btn-light {
color: #24292e;
user-select: none;
background-color: #eff3f6;
background-image: linear-gradient(-180deg, #fafbfc 0%, #eff3f6 90%);
background-repeat: repeat-x;
background-position: -1px -1px;
background-size: 110% 110%;
border: 1px solid rgba(27, 31, 35, 0.2);
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
}
.btn-light:hover,
.btn-light.hover {
background-color: #e6ebf1;
background-image: linear-gradient(-180deg, #f0f3f6 0%, #e6ebf1 90%);
background-position: -.5em;
border-color: rgba(27, 31, 35, 0.35);
}
.btn-light:not(:disabled):not(.disabled).active,
.btn-light:not(:disabled):not(.disabled):active,
.show>.btn-light.dropdown-toggle {
background-color: #e9ecef;
background-image: none;
border-color: rgba(27, 31, 35, 0.35);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
.btn-light:not(:disabled):not(.disabled).active:focus,
.btn-light:not(:disabled):not(.disabled):active:focus,
.show>.btn-light.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2em rgba(3, 102, 214, 0.3);
}

View File

@@ -0,0 +1,540 @@
<div class="rb-root">
<div id="rb-login">
<div class="card shadow-sm">
<div class="card-header">
<h1>
<a href="<?php echo $g['r']?>/">
<i class="kf-bi-01"></i>
</a>
<small>관리자 모드</small>
</h1>
</div>
<div class="card-body">
<form class="loginForm" role="form" name="loginform" id="admin-loginform" action="<?php echo $g['s']?>/" method="post">
<input type="hidden" name="r" value="<?php echo $r?>">
<input type="hidden" name="a" value="login">
<input type="hidden" name="referer" value="<?php echo $referer ? $referer : $_SERVER['HTTP_REFERER']?>">
<input type="hidden" name="usertype" value="admin">
<input type="hidden" name="pickgoods" value="<?php echo $pickgoods ?>">
<input type="hidden" name="form" value="">
<div class="form-group">
<label for="id" class="control-label">아이디 또는 이메일</label>
<input type="text" name="id" class="form-control input-lg" id="id" placeholder="" value="" autofocus required autocapitalize="off" autocorrect="off" tabindex="1">
<div class="invalid-feedback mt-2" data-role="idErrorBlock"></div>
</div>
<div class="form-group">
<label for="pw" class="control-label">비밀번호</label>
<input type="password" name="pw" class="form-control input-lg" id="pw" placeholder="" value="" required tabindex="2">
<div class="invalid-feedback mt-2" data-role="passwordErrorBlock"></div>
</div>
<div class="custom-control custom-checkbox mb-3">
<input type="checkbox" class="custom-control-input" id="login_cookie" name="login_cookie" value="checked" data-toggle="collapse" data-target="#collapsealert">
<label class="custom-control-label" for="login_cookie">로그인 상태 유지</label>
</div>
<div class="collapse" id="collapsealert" style="">
<div class="alert alert-danger f12 mb-3">
개인정보 보호를 위해, 개인 PC에서만 사용해 주세요.
</div>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit" id="rb-submit" data-role="submit" tabindex="3">
<span class="not-loading">로그인</span>
<span class="is-loading">
<div class="d-flex align-items-center justify-content-center">
<span class="spinner-border spinner-border-sm mr-2" role="status" aria-hidden="true"></span>
<span>로그인중...</span>
</div>
</span>
</button>
<p class="mt-3">
<a href="#modal-pwReset" data-toggle="modal">
<small>비밀번호를 잊으셨나요?</small>
</a>
</p>
</form>
</div>
</div>
</div>
</div>
<!-- 모달 : modal-pwReset : 비밀번호 초기화 -->
<div class="modal fade" id="modal-pwReset" tabindex="-1" role="dialog">
<div class="modal-dialog modal-dialog-centered" role="document" style="max-width: 400px;">
<div class="modal-content">
<div class="modal-header border-bottom-0 d-flex flex-column" style="">
<h5 class="modal-title mx-auto h6">관리자 비밀번호 재설정</h5>
</div>
<?php if ($d['member']['join_byEmail'] || $d['member']['join_byPhone']): ?>
<div class="card border-0" style="margin-top: -15px" data-role="confirm_code">
<div class="card-header">
<ul class="nav nav-tabs nav-justified card-header-tabs f14">
<?php if ($d['member']['join_byEmail']): ?>
<li class="nav-item">
<a class="nav-link<?php echo $d['member']['join_byEmail']?' active':'' ?>" id="tab-email" data-toggle="tab" href="#pane-pw-email">
이메일로 받기
</a>
</li>
<?php endif; ?>
<?php if ($d['member']['join_byPhone']): ?>
<li class="nav-item">
<a class="nav-link<?php echo ($d['member']['join_byPhone'] && !$d['member']['join_byEmail'])?' active':'' ?>" id="tab-phone" data-toggle="tab" href="#pane-pw-phone">
휴대폰으로 받기
</a>
</li>
<?php endif; ?>
</ul>
</div>
<div class="card-body ">
<div class="tab-content text-center">
<div class="tab-pane <?php echo $d['member']['join_byEmail']?' show active':'' ?>" id="pane-pw-email" role="tabpanel" aria-labelledby="tab-email">
<div class="input-group input-group-lg mt-3">
<input type="email" class="form-control" name="email" placeholder="이메일 주소" tabindex="1" autocorrect="off" autocapitalize="off" required value="">
<div class="invalid-tooltip" data-role="emailErrorBlock"></div>
<div class="input-group-append">
<button class="btn btn-light" type="button" data-act="send_code" data-type="email" data-device="desktop">
<span class="not-loading">다음</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
<div class="d-none mt-3" data-role="verify_email_area">
<small class="form-text text-success my-3">
인증번호를 발송했습니다.(유효시간 <?php echo $d['member']['join_keyexpire'] ?>분)
<span data-role="countdown" data-email-countdown="">[00:00]</span><br>
위 메일로 발송된 6자리 인증번호를 입력해 주세요.<br>
인증번호가 오지 않으면 입력하신 정보가 정확한지 확인하여 주세요.
</small>
<div class="input-group input-group-lg">
<input type="number" class="form-control" name="confirm_email_code" data-role="confirm_email_code" placeholder="인증번호 입력">
<div class="invalid-tooltip" data-role="emailCodeBlock"></div>
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button" data-act="confirm_code" data-type="email" data-device="desktop">
<span class="not-loading">확인</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
</div><!-- /.d-none -->
</div><!-- /.tab-pane -->
<div class="tab-pane <?php echo ($d['member']['join_byPhone'] && !$d['member']['join_byEmail'])?' show active':'' ?>" id="pane-pw-phone" role="tabpanel" aria-labelledby="tab-phone">
<div class="input-group input-group-lg mt-3">
<input type="tel" class="form-control" name="phone" placeholder="휴대폰 번호" tabindex="1" autocorrect="off" autocapitalize="off" required>
<div class="invalid-tooltip" data-role="phoneErrorBlock"></div>
<div class="input-group-append">
<button class="btn btn-light" type="button" data-act="send_code" data-type="phone" data-device="desktop">
<span class="not-loading">다음</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
<div class="d-none mt-3" data-role="verify_phone_area">
<small class="form-text text-success my-3">
인증번호를 발송했습니다.(유효시간 <?php echo $d['member']['join_keyexpire'] ?>분)
<span data-role="countdown" data-phone-countdown="">[00:00]</span><br>
위 휴대폰으로 발송된 6자리 인증번호를 입력해 주세요.<br>
인증번호가 오지 않으면 입력하신 정보가 정확한지 확인하여 주세요.
</small>
<div class="input-group input-group-lg">
<input type="number" class="form-control" name="confirm_phone_code" data-role="confirm_phone_code" placeholder="인증번호 입력">
<div class="invalid-tooltip" data-role="phoneCodeBlock">인증번호를 입력해주세요.</div>
<div class="input-group-append">
<button class="btn btn-outline-primary" type="button" data-act="confirm_code" data-type="phone" data-device="desktop">
<span class="not-loading">확인</span>
<span class="is-loading"><i class="fa fa-spinner fa-spin"></i></span>
</button>
</div>
</div>
</div><!-- /.d-none -->
</div><!-- /.tab-pane -->
</div><!-- /.tab-content -->
<ul class="list-unstyled f13 text-muted mt-4 mb-1">
<li>본인인증을 통해 비밀번호를 재설정 하실 수 있습니다.</li>
<li>인증번호를 받을 곳을 선택해 주세요.</li>
<li>비밀번호는 암호화 저장되어 분실 시 찾아드릴 수 없습니다.</li>
</ul>
</div><!-- /.card-body tab-content-->
</div><!-- /.card -->
<?php endif; ?>
<div class="card d-none" data-role="change_pw">
<div class="card-body">
<form id="pwResetForm" role="form" action="<?php echo $g['s']?>/" method="post" autocomplete="off">
<input type="hidden" name="r" value="<?php echo $r?>">
<input type="hidden" name="m" value="member">
<input type="hidden" name="a" value="pw_reset">
<input type="hidden" name="act" value="change_pw">
<input type="hidden" name="device" value="desktop">
<input type="hidden" name="code" value="">
<input type="hidden" name="target" value="">
<input type="hidden" name="type" value="">
<input type="hidden" name="check_pw1" value="0">
<input type="hidden" name="check_pw2" value="0">
<input type="hidden" name="usertype" value="admin">
<div class="form-group position-relative">
<label>비밀번호(6~16자리)</label>
<input type="password" class="form-control form-control-lg" name="pw1" placeholder="" autocorrect="off" autocapitalize="off" data-role="pw1">
<div class="invalid-tooltip" data-role="pw1CodeBlock" id="pw1-feedback"></div>
</div>
<div class="form-group position-relative">
<label>비밀번호 재입력</label>
<input type="password" class="form-control form-control-lg" name="pw2" placeholder="" autocorrect="off" autocapitalize="off" data-role="pw2">
<div class="invalid-tooltip" data-role="pw2CodeBlock" id="pw2-feedback"></div>
</div>
<div class="mt-4 mb-3">
<button type="submit" class="btn btn-outline-primary btn-lg btn-block" data-role="submit">
<span class="not-loading">변경하기</span>
<span class="is-loading"><i class="fa fa-spinner fa-lg fa-spin fa-fw"></i> 변경중 ...</span>
</button>
</div>
</form>
</div><!-- /.card-body -->
</div><!-- /.card -->
<div class="modal-footer justify-content-center py-2">
<button type="button" class="btn btn-link muted-link" data-dismiss="modal">닫기</button>
</div>
</div>
</div>
</div>
<!-- https://github.com/hilios/jQuery.countdown -->
<?php getImport('jquery.countdown','jquery.countdown.min','2.2.0','js')?>
<script>
var modal_pwReset = $('#modal-pwReset')
$(function () {
$('#admin-loginform').submit(function(e){
e.preventDefault();
e.stopPropagation();
var form = $(this)
var formID = form.attr('id')
var f = document.getElementById(formID);
form.find('[name="form"]').val('#'+formID);
form.find('[type="submit"]').attr("disabled",true);
form.find('.form-control').removeClass('is-invalid') //에러이력 초기화
setTimeout(function(){
getIframeForAction(f);
f.submit();
}, 500);
});
// 로그인 에러 흔적 초기화
$("#admin-loginform").find('.form-control').keyup(function() {
$(this).removeClass('is-invalid')
});
})
function doPwCountdown(type) {
modal_pwReset.find('[data-'+type+'-countdown]').each(function() {
var $this = $(this), finalDate = $(this).data(type+'-countdown');
$this.html('');
$this.countdown(finalDate, function(event) {
$this.html('['+event.strftime('%M:%S')+']');
});
});
};
function pwResetCheck(obj,layer) {
var f = document.getElementById('pwResetForm');
if (!obj.value)
{
obj.classList.remove('is-invalid');
getId(layer).innerHTML = '';
}
else
{
if (obj.name == 'pw1') {
f.classList.remove('was-validated');
if (f.pw1.value.length < 6 || f.pw1.value.length > 16) {
f.check_pw1.value = '0';
f.classList.remove('was-validated');
obj.classList.add('is-invalid');
obj.classList.remove('is-valid');
getId(layer).innerHTML = '영문/숫자 2개 이상의 조합으로 최소 6~16자로 입력하셔야 합니다.';
obj.focus();
return false;
}
if (getTypeCheck(f.pw1.value,"abcdefghijklmnopqrstuvwxyz")) {
getId(layer).innerHTML = '비밀번호가 영문만으로 입력되었습니다.\n영문/숫자 2개 이상의 조합으로 최소 6자이상 입력하셔야 합니다.';
obj.focus();
return false;
}
if (getTypeCheck(f.pw1.value,"1234567890")) {
getId(layer).innerHTML = '비밀번호가 숫자만으로 입력되었습니다.\n영문/숫자 2개 이상의 조합으로 최소 6자이상 입력하셔야 합니다.';
obj.focus();
return false;
}
f.pw1.classList.add('is-valid');
f.pw1.classList.remove('is-invalid');
getId(layer).innerHTML = '';
f.check_pw1.value = '1';
}
if (obj.name == 'pw2') {
f.classList.remove('was-validated');
obj.classList.add('is-invalid');
obj.classList.remove('is-valid');
if (f.pw1.value != f.pw2.value)
{
getId(layer).innerHTML = '비밀번호가 일치하지 않습니다.';
f.classList.remove('was-validated');
obj.focus();
f.check_pw2.value = '0';
return false;
}
f.pw2.classList.add('is-valid');
f.pw2.classList.remove('is-invalid');
getId(layer).innerHTML = '';
f.check_pw2.value = '1';
}
}
}
$(function () {
modal_pwReset.on('show.bs.modal', function (e) {
var modal = modal_pwReset
//화면 초기화
modal.find('[data-role="confirm_code"]').removeClass('d-none')
modal.find('[data-role="change_pw"]').addClass('d-none')
modal.find('#tab-email').tab('show')
modal.find('[data-act="send_code"]').prop("disabled",false)
modal.find('[data-act="send_code"] .not-loading').text('다음')
modal.find('[data-act="confirm_code"]').prop("disabled",false)
modal.find('[type="number"]').val('').removeClass('is-invalid')
modal.find('[name="email"]').val('').removeClass('is-invalid')
modal.find('[name="phone"]').val('').removeClass('is-invalid')
modal.find('[data-role="verify_email_area"]').addClass('d-none')
modal.find('[data-role="verify_phone_area"]').addClass('d-none')
modal.find('[data-role="pw1"]').val('').removeClass('is-invalid')
modal.find('[data-role="pw2"]').val('').removeClass('is-invalid')
modal.find('[name="check_pw1"]').val(0)
modal.find('[name="check_pw2"]').val(0)
modal.find('[data-role="submit"]').prop("disabled",false)
})
modal_pwReset.on('shown.bs.modal', function (e) {
var modal = modal_pwReset
modal.find('[name="email"]').trigger('focus')
})
modal_pwReset.find('input').keyup(function() {
$(this).removeClass('is-invalid') //에러 발생후 다시 입력 시도시에 에러 흔적 초기화
});
//비밀번호 유용성 체크
modal_pwReset.find('[data-role="change_pw"] input').keyup(function(){
var modal = modal_pwReset
var item = $(this).data('role')
var item_pw_check = modal.find('[name=check_pw]').val()
if (item =='pw1') {
element = document.querySelector('[name="pw1"]');
pwResetCheck(element,'pw1-feedback')
}
if (item =='pw2') {
element = document.querySelector('[name="pw2"]');
pwResetCheck(element,'pw2-feedback')
}
});
})
modal_pwReset.find('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var pane = $(this).attr('id')
if (pane=='tab-email') modal_pwReset.find('[name="email"]').focus()
if (pane=='tab-phone') modal_pwReset.find('[name="phone"]').focus()
})
// 본인인증 코드발송
modal_pwReset.on('click','[data-act="send_code"]',function(){
var modal = modal_pwReset
var button = $(this)
var act = 'send_code'
var type = button.attr('data-type')
var device = button.attr('data-device')
if (type=='email') {
var input = modal.find('[name="email"]')
var _input = document.querySelector('#modal-pwReset [name="email"]');
var target = input.val()
var msg = modal.find('[data-role="emailErrorBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 이메일 입력폼 유효성 체크
if (!target) {
input.focus()
input.addClass('is-invalid')
msg.text('이메일을 입력해주세요.')
return false;
}
if (!chkEmailAddr(_input.value)) {
input.focus()
input.addClass('is-invalid')
msg.text('이메일 형식이 아닙니다.')
return false;
}
}
if (type=='phone') {
var input = modal.find('[name="phone"]')
var _input = document.querySelector('#modal-pwReset [name="phone"]');
var target = input.val()
var msg = modal.find('[data-role="phoneErrorBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 휴대폰번호 입력폼 유효성 체크
if (!target) {
input.focus()
input.addClass('is-invalid')
msg.text('휴대폰 번호를 입력해주세요.')
return false;
}
if (!chkPhoneNumber(_input.value)) {
input.focus()
input.addClass('is-invalid')
msg.text('휴대폰 번호 형식이 아닙니다.')
return false;
}
}
button.attr('disabled',true) //버튼 로딩처리
var url = rooturl+'/?r='+raccount+'&m=member&a=pw_reset&act='+act+'&type='+type+'&target='+target+'&device='+device+'&usertype=admin'
getIframeForAction();
//modal.find('[data-act=confirm_code]').attr('data-type',type);
//modal.find('[type=number]').attr('data-role','confirm_'+type+'_code').attr('name','confirm_'+type+'_code');
//modal.find('.invalid-tooltip').attr('data-role',type+'CodeBlock');
modal.find('[data-role=countdown]').text('');
modal.find('[data-role="target"]').text(target)
setTimeout(function() {
frames.__iframe_for_action__.location.href = url;
}, 700);
});
// 본인인증 코드확인
modal_pwReset.on('click','[data-act="confirm_code"]',function(){
var modal = modal_pwReset
var button = $(this)
var act = 'confirm_code'
var type = button.data('type')
var device = button.data('device')
if (type=='email') {
var input = modal.find('[name="confirm_email_code"]')
var code = input.val()
var msg = modal.find('[data-role="emailCodeBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 인증번호 입력폼 유효성 체크
if (!code) {
input.focus()
input.addClass('is-invalid')
msg.text('인증번호를 입력해주세요.')
return false;
}
}
if (type=='phone') {
var input = modal.find('[name="confirm_phone_code"]')
var code = input.val()
var msg = modal.find('[data-role="phoneCodeBlock"]')
// 상태초기화
input.removeClass('is-invalid is-valid')
// 인증번호 입력폼 유효성 체크
if (!code) {
input.focus()
input.addClass('is-invalid')
msg.text('인증번호를 입력해주세요.')
return false;
}
}
button.attr('disabled',true) //버튼 로딩처리
var url = rooturl+'/?r='+raccount+'&m=member&a=pw_reset&act='+act+'&type='+type+'&code='+code+'&device='+device
getIframeForAction();
setTimeout(function() {
frames.__iframe_for_action__.location.href = url;
}, 700);
});
// 비밀번호 변경
$('#pwResetForm').submit( function(e){
e.preventDefault();
e.stopPropagation();
var form = $(this)
var formID = form.attr('id')
var f = document.getElementById(formID);
if (f.check_pw1.value == '0' || f.check_pw2.value == '0') {
return false;
}
form.find('[name="form"]').val('#'+formID);
form.find('[type="submit"]').attr("disabled",true); //버튼 로딩처리
form.find('.form-control').removeClass('is-invalid') //에러이력 초기화
setTimeout(function(){
getIframeForAction(f);
f.submit();
}, 500);
}
);
</script>