새 회원 관리창 1차 구현 완료.
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 2.7 KiB |
@@ -23,21 +23,14 @@ if($userGrade < 6){
|
||||
|
||||
<!-- 스타일 -->
|
||||
<link type="text/css" rel="stylesheet" href="../e_lib/bootstrap.min.css">
|
||||
<link type="text/css" rel="stylesheet" href='member/Style.css'>
|
||||
<link type="text/css" rel="stylesheet" href='memberAdmin.css'>
|
||||
|
||||
<script type="text/javascript" src='../js/common.js'></script>
|
||||
<script type="text/javascript" src='../e_lib/jquery-3.2.1.min.js'></script>
|
||||
<script type="text/javascript" src="../e_lib/bootstrap.bundle.min.js"></script>
|
||||
<script type="text/javascript" src='../js/func.js'></script>
|
||||
|
||||
<script type="text/javascript" src='../i_popup/Action.js'></script>
|
||||
<script type="text/javascript" src='member/Action.js'></script>
|
||||
<script type="text/javascript">
|
||||
$(function(){
|
||||
EntranceMember_Import();
|
||||
EntranceMember_Init();
|
||||
})
|
||||
</script>
|
||||
<script type="text/javascript" src='memberAdmin.js'></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
@@ -49,121 +42,87 @@ $(function(){
|
||||
가입 허용
|
||||
<div id="radios_allow_join" class="btn-group btn-group-toggle" data-toggle="buttons">
|
||||
<label class="btn btn-secondary">
|
||||
<input type="radio" name="allow_join" value="Y" id="allow_join_y" autocomplete="off">Y
|
||||
<input type="radio" name="allow_join" value="1" id="allow_join_y" autocomplete="off">Y
|
||||
</label>
|
||||
<label class="btn btn-secondary">
|
||||
<input type="radio" name="allow_join" value="N" id="allow_join_n" autocomplete="off">N
|
||||
<input type="radio" name="allow_join" value="0" id="allow_join_n" autocomplete="off">N
|
||||
</label>
|
||||
</div>
|
||||
|
||||
로그인 허용
|
||||
<div id="radios_allow_login" class="btn-group btn-group-toggle" data-toggle="buttons">
|
||||
<label class="btn btn-secondary">
|
||||
<input type="radio" name="allow_login" value="Y" id="allow_login_y" autocomplete="off">Y
|
||||
<input type="radio" name="allow_login" value="1" id="allow_login_y" autocomplete="off">Y
|
||||
</label>
|
||||
<label class="btn btn-secondary">
|
||||
<input type="radio" name="allow_login" value="N" id="allow_login_n" autocomplete="off">N
|
||||
<input type="radio" name="allow_login" value="0" id="allow_login_n" autocomplete="off">N
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="btn-group" role="group" aria-label="Basic example">
|
||||
<button type="button" class="btn btn-secondary">탈퇴 계정 정리(1개월+)</button>
|
||||
<button type="button" class="btn btn-secondary">오래된 전콘 정리(1개월+)</button>
|
||||
|
||||
<div class="btn-group" role="group">
|
||||
<button onclick="changeSystem('scrub_deleted');" type="button" class="btn btn-secondary">탈퇴 계정 정리(1개월+)</button>
|
||||
<button onclick="changeSystem('scrub_icon');"type="button" class="btn btn-secondary">전콘 정리(1개월+)</button>
|
||||
</div>
|
||||
|
||||
<button type="button" class="btn btn-secondary">오래된 계정 정리(6개월+)</button>
|
||||
<button onclick="changeSystem('scrub_old_user');" type="button" class="btn btn-secondary">오래된 계정 정리(6개월+)</button>
|
||||
|
||||
</div>
|
||||
<h6 class="card-header">회원 목록</h6>
|
||||
<table class="table table-hover table-sm table-striped">
|
||||
<table id="user_list_frame" class="table table-hover table-sm table-striped">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col>
|
||||
<col style="width:200px;">
|
||||
</colgroup>
|
||||
<thead class="thead-dark">
|
||||
<tr>
|
||||
<th scope="col">코드</th>
|
||||
<th scope="col">유저명</th>
|
||||
<th scope="col">가입 방식</th>
|
||||
<th scope="col">EMAIL</th>
|
||||
<th scope="col">등급</th>
|
||||
<th scope="col">닉네임</th>
|
||||
<th scope="col">전콘</th>
|
||||
<th scope="col">가입일자</th>
|
||||
<th scope="col">최근 로그인</th>
|
||||
<th scope="col">탈퇴 신청</th>
|
||||
<th scope="col">장수명</th>
|
||||
<th scope="col">가입<br>일자</th>
|
||||
<th scope="col">최근<br>로그인</th>
|
||||
<th scope="col">탈퇴<br>신청</th>
|
||||
<th scope="col">명령</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row">ㅁ</th>
|
||||
<td>ㅁ</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">ㅁ</th>
|
||||
<td>ㅁ</td>
|
||||
<tbody id="user_list">
|
||||
<tr data-id="2">
|
||||
<th scope="row">2</th>
|
||||
<td>hide_d</td>
|
||||
<td class="small">hided62<br>@gmail.com<br>(Kakao)</td>
|
||||
<td>일반<p class="small blocked" style="margin:0;">18-03-25<br>15:39:00</p></td>
|
||||
<td>Hide_D</td>
|
||||
<td><img src="../d_pic/186200d.jpg" width="64px" height="64px"></td>
|
||||
<td class="small">체:가나다라마바<br>퀘:가나다라마바<br>풰:가나다라마바<br>퉤:가나다라마바<br>훼:가나다라마바</td>
|
||||
<td class="small">18-03-25<br>15:39:00</td>
|
||||
<td class="small">18-03-25<br>15:39:00</td>
|
||||
<td class="small">18-03-25<br>15:39:00</td>
|
||||
<td>
|
||||
<div class="btn-group" role="group">
|
||||
<button type="button" class="act_delete_user btn btn-danger btn-sm">강제<br>탈퇴</button>
|
||||
<button type="button" class="act_reset_pw btn btn-info btn-sm">암호<br>변경</button>
|
||||
<button type="button" class="act_block_user btn btn-warning btn-sm">유저<br>차단</button>
|
||||
<button type="button" class="act_unblock_user btn btn-secondary btn-sm">차단<br>해제</button>
|
||||
<button type="button" class="act_set_userlevel btn btn-primary btn-sm">별도<br>권한</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="EntranceMember_00">
|
||||
<div id="EntranceMember_0000" class="bg2 font4">
|
||||
회 원 정 보
|
||||
<font id="EntranceMember_000000">(0/0)</font>
|
||||
</div>
|
||||
<input id="EntranceMember_0001" type="button" value="돌아가기">
|
||||
<div id="EntranceMember_0006" class="bg2 font2">
|
||||
<div id="EntranceMember_000600"></div>
|
||||
<input id="btn_allow_join" type="button" value="가입허용">
|
||||
<input id="btn_deny_join" type="button" value="가입금지">
|
||||
<input id="btn_allow_login" type="button" value="로그인허용">
|
||||
<input id="btn_deny_login" type="button" value="로그인금지">
|
||||
<input id="btn_process_withdraw" type="button" value="탈퇴처리(1개월)">
|
||||
<input id="btn_process_scrub_olduser" type="button" value="오래된계정(6개월)">
|
||||
</div>
|
||||
<div id="EntranceMember_0002" class="bg2 font2">
|
||||
선택:
|
||||
<select id="EntranceMember_000200" size="1">
|
||||
<option value="0">순서</option>
|
||||
<option value="1">ID</option>
|
||||
<option value="2">장수</option>
|
||||
<option value="3">민번</option>
|
||||
<option value="4">IP</option>
|
||||
<option value="5">등급</option>
|
||||
<option value="6">등록</option>
|
||||
<option value="7">최근</option>
|
||||
</select>
|
||||
<input id="EntranceMember_000201" type="button" value="정렬">
|
||||
</div>
|
||||
<div id="EntranceMember_0003" class="bg2 font2">
|
||||
선택:
|
||||
<select id="EntranceMember_000300" size="1">
|
||||
</select>
|
||||
<input id="EntranceMember_000301" type="button" value="블럭회원">
|
||||
<input id="EntranceMember_000302" type="button" value="일반회원">
|
||||
<input id="EntranceMember_000303" type="button" value="참여회원">
|
||||
<input id="EntranceMember_000304" type="button" value="유효회원">
|
||||
<input id="EntranceMember_000305" type="button" value="특별회원">
|
||||
<input id="EntranceMember_000306" type="button" value="전콘제거">
|
||||
<input id="EntranceMember_000307" type="button" value="비번초기화">
|
||||
<input id="EntranceMember_000308" type="button" value="회원삭제">
|
||||
</div>
|
||||
<div id="EntranceMember_0004" class="bg1">
|
||||
<div id="EntranceMember_000400">순번</div>
|
||||
<div id="EntranceMember_000401">ID</div>
|
||||
<div id="EntranceMember_000402">민번</div>
|
||||
<div id="EntranceMember_000403">닉네임</div>
|
||||
<div id="EntranceMember_000404">IP</div>
|
||||
<div id="EntranceMember_000405">블럭</div>
|
||||
<div id="EntranceMember_000406">최근블럭일</div>
|
||||
<div id="EntranceMember_000407">등록</div>
|
||||
<div id="EntranceMember_000408">최근등록일</div>
|
||||
<div id="EntranceMember_000409">등급</div>
|
||||
<div id="EntranceMember_000412">사진</div>
|
||||
<div id="EntranceMember_000413">SVR</div>
|
||||
<div id="EntranceMember_000414">탈퇴</div>
|
||||
</div>
|
||||
<div id="EntranceMember_0005">
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -16,26 +16,45 @@ if($session->userGrade < 6){
|
||||
}
|
||||
|
||||
$userList = [];
|
||||
foreach($db->query('SELECT * FROM MEMBER order by `no`') as $member){
|
||||
$userID = $member['NO'];
|
||||
$userName = $member['ID'];
|
||||
$email = $member['EMAIL'];
|
||||
$grade = $member['GRADE'];
|
||||
$blockUntil = $member['BLOCK_DATE'];
|
||||
foreach($db->query('SELECT member.*, max(member_log.date) as loginDate from member
|
||||
left join member_log on member.`NO` = member_log.member_no and member_log.action_type="login"
|
||||
group by member.no order by member.no asc') as $member){
|
||||
|
||||
$nickname = $member['NAME'];
|
||||
if($member['IMGSVR']){
|
||||
$icon = RootDB::getServerBasepath().'/'.$member['PICTURE'];
|
||||
$icon = RootDB::getServerBasepath().'/d_pic/'.$member['PICTURE'];
|
||||
}
|
||||
else{
|
||||
$icon = IMAGES.'/'.$member['PICTURE'];
|
||||
$icon = IMAGE.'/'.$member['PICTURE'];
|
||||
}
|
||||
|
||||
$deleteAfter = $member['delete_after'];
|
||||
|
||||
|
||||
$userList[] = [
|
||||
'userID'=>$member['NO'],
|
||||
'userName'=>$member['ID'],
|
||||
'email'=>$member['EMAIL'],
|
||||
'authType'=>$member['oauth_type'],
|
||||
'userGrade'=>$member['GRADE'],
|
||||
'blockUntil'=>$member['BLOCK_DATE'],
|
||||
'nickname'=>$member['NAME'],
|
||||
'icon'=>$icon,
|
||||
'joinDate'=>$member['REG_DATE'],
|
||||
'loginDate'=>$member['loginDate'],
|
||||
'deleteAfter'=>$member['delete_after']
|
||||
];
|
||||
}
|
||||
|
||||
$serverList = [];
|
||||
foreach(AppConf::getList() as $serverName => $setting){
|
||||
|
||||
}
|
||||
if($setting->isRunning()){
|
||||
$serverList[] = $serverName;
|
||||
}
|
||||
}
|
||||
|
||||
$system = $db->queryFirstRow('SELECT `REG`, `LOGIN` FROM `system` limit 1');
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'users'=>$userList,
|
||||
'servers'=>$serverList,
|
||||
'allowJoin'=>$system['REG']=='Y',
|
||||
'allowLogin'=>$system['LOGIN']=='Y'
|
||||
]);
|
||||
@@ -0,0 +1,298 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
require_once('_common.php');
|
||||
$session = Session::Instance()->setReadOnly();
|
||||
|
||||
if($session->userGrade < 6){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'운영자 권한이 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
// 외부 파라미터
|
||||
// $_POST['action'] : 처리종류
|
||||
// $_POST['user_id'] : 유저 이름
|
||||
// $_POST['param'] : 추가 파라미터
|
||||
|
||||
$action = Util::array_get($_POST['action']);
|
||||
$userID = Util::array_get($_POST['user_id']);
|
||||
$param = Util::array_get($_POST['param']);
|
||||
|
||||
if(!$action){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'action 미설정'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$db = RootDB::db();
|
||||
|
||||
if($action == 'allow_login'){
|
||||
$param = Util::toInt($param);
|
||||
if($param === null && $param !== 0 && $param !== 1){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'올바르지 않은 param'
|
||||
]);
|
||||
}
|
||||
|
||||
$param = $param?'Y':'N';
|
||||
$db->update('system',[
|
||||
'LOGIN'=>$param
|
||||
], true);
|
||||
Json::die([
|
||||
'result'=>true
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'allow_join'){
|
||||
$param = Util::toInt($param);
|
||||
if($param === null && $param !== 0 && $param !== 1){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'올바르지 않은 param'
|
||||
]);
|
||||
}
|
||||
|
||||
$param = $param?'Y':'N';
|
||||
$db->update('system',[
|
||||
'REG'=>$param
|
||||
], true);
|
||||
Json::die([
|
||||
'result'=>true
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'scrub_deleted'){
|
||||
$deleteUntil = TimeUtil::DateToday();
|
||||
$db->delete('member', 'delete_after < %s', $deleteUntil);
|
||||
$cnt = $db->affectedRows();
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'affected'=>$cnt
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'scrub_icon'){
|
||||
$deleteUntil = strtotime("-1 month");
|
||||
$usedIcon = [];
|
||||
foreach($db->queryFirstColumn('SELECT picture from member where imgsvr = 1') as $icon){
|
||||
$icon = explode('?', $icon)[0];
|
||||
$usedIcon[$icon]=$icon;
|
||||
}
|
||||
|
||||
$cnt = 0;
|
||||
|
||||
foreach(glob(__DIR__.'/../d_pic/*.{jpg,png,gif}', GLOB_BRACE) as $filepath){
|
||||
$filename = basename($filepath);
|
||||
|
||||
if (array_key_exists($filename, $usedIcon)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$mtime = filemtime($filepath);
|
||||
if($mtime > $deleteUntil){
|
||||
continue;
|
||||
}
|
||||
|
||||
@unlink($filepath);
|
||||
$cnt++;
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'affected'=>$cnt
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'scrub_old_user'){
|
||||
$deleteUntil = TimeUtil::DatetimeFromNowMinute(-60*24*30*6);
|
||||
$targetUser = [];
|
||||
$members = $db->query('SELECT member.no, max(member_log.date) as loginDate from member
|
||||
left join member_log on member.`NO` = member_log.member_no and
|
||||
(member_log.action_type="login" or member_log.action_type="reg") group by member.no');
|
||||
foreach($members as $member){
|
||||
if($member['loginDate'] === null){
|
||||
$targetUser[] = $member['no'];
|
||||
continue;
|
||||
}
|
||||
|
||||
if($member['loginDate'] <= $deleteUntil){
|
||||
$targetUser[] = $member['no'];
|
||||
}
|
||||
}
|
||||
|
||||
if(count($targetUser) == 0){
|
||||
$cnt = 0;
|
||||
}
|
||||
else{
|
||||
$db->delete('member', 'no = %li', $targetUser);
|
||||
$cnt = $db->affectedRows();
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'affected'=>$cnt
|
||||
]);
|
||||
}
|
||||
|
||||
//여기부터는 무조건 멤버에 대한 항목임
|
||||
if(!$userID){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'userID가 지정되지 않았습니다. action:'.$action
|
||||
]);
|
||||
}
|
||||
|
||||
$targetGrade = $db->queryFirstField('SELECT `grade` FROM `member` WHERE `no` = %i', $userID);
|
||||
if($targetGrade === null){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'해당하는 유저가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
if($targetGrade >= $session->userGrade){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'자신과 같거나 높은 권한의 유저를 변경할 수 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if($action == 'delete'){
|
||||
$db->delete('member', 'no = %i', $userID);
|
||||
$cnt = $db->affectedRows();
|
||||
|
||||
if(!$cnt){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'유저가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'reset_pw'){
|
||||
|
||||
$newPassword = Util::randomStr(6);
|
||||
$tmpPassword = Util::hashPassword(RootDB::getGlobalSalt(), $newPassword);
|
||||
$newSalt = bin2hex(random_bytes(8));
|
||||
$newFinalPassword = Util::hashPassword($newSalt, $tmpPassword);
|
||||
|
||||
$db->update('member', [
|
||||
'pw'=>$newFinalPassword,
|
||||
'salt'=>$newSalt
|
||||
],'no=%i', $userID);
|
||||
$cnt = $db->affectedRows();
|
||||
|
||||
if(!$cnt){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'유저가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true,
|
||||
'detail'=>"비밀번호가 {$newPassword}로 초기화되었습니다."
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
if($action == 'block'){
|
||||
$param = Util::toInt($param);
|
||||
if($param === null){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'올바르지 않은 param'
|
||||
]);
|
||||
}
|
||||
|
||||
if($param <= 0){
|
||||
$param = 50*365;
|
||||
}
|
||||
|
||||
$db->update('member', [
|
||||
'grade'=>0,
|
||||
'block_date'=>$db->sqleval('DATE_ADD(now(), INTERVAL %i DAY)', $param)
|
||||
], 'no = %i', $userID);
|
||||
$cnt = $db->affectedRows();
|
||||
|
||||
if(!$cnt){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'유저가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'unblock'){
|
||||
$db->update('member', [
|
||||
'grade'=>1,
|
||||
'block_date'=>null
|
||||
], 'no = %i', $userID);
|
||||
$cnt = $db->affectedRows();
|
||||
|
||||
if(!$cnt){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'유저가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true
|
||||
]);
|
||||
}
|
||||
|
||||
if($action == 'set_userlevel'){
|
||||
$param = Util::toInt($param);
|
||||
if($param === null || $param < 1){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'올바르지 않은 param'
|
||||
]);
|
||||
}
|
||||
|
||||
if($param >= $session->userGrade){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'관리자보다 같거나 높은 등급을 설정할 수 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
$db->update('member', [
|
||||
'grade'=>$param,
|
||||
], 'no = %i', $userID);
|
||||
$cnt = $db->affectedRows();
|
||||
|
||||
if(!$cnt){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'실행되지 않았습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>true
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'알 수 없는 명령입니다. action:'.$action
|
||||
]);
|
||||
@@ -1,85 +0,0 @@
|
||||
function EntranceMember_Import() {
|
||||
}
|
||||
|
||||
function EntranceMember_Init() {
|
||||
$("#EntranceMember_0001").click(EntranceMember_Back);
|
||||
$("#EntranceMember_000201").click(EntranceMember_Order);
|
||||
|
||||
$("#btn_allow_join").click(function() { EntranceMember_Post(8); });
|
||||
$("#btn_deny_join").click(function() { EntranceMember_Post(9); });
|
||||
$("#btn_allow_login").click(function() { EntranceMember_Post(10); });
|
||||
$("#btn_deny_login").click(function() { EntranceMember_Post(11); });
|
||||
$("#btn_process_withdraw").click(function() { EntranceMember_Post(12); });
|
||||
$("#btn_process_scrub_olduser").click(function() { EntranceMember_Post(13); });
|
||||
$("#EntranceMember_000607").click(function() { EntranceMember_Post(14); });
|
||||
|
||||
$("#EntranceMember_000301").click(function() { EntranceMember_Post(0); });
|
||||
$("#EntranceMember_000302").click(function() { EntranceMember_Post(1); });
|
||||
$("#EntranceMember_000303").click(function() { EntranceMember_Post(2); });
|
||||
$("#EntranceMember_000304").click(function() { EntranceMember_Post(3); });
|
||||
$("#EntranceMember_000305").click(function() { EntranceMember_Post(4); });
|
||||
$("#EntranceMember_000306").click(function() { EntranceMember_Post(5); });
|
||||
$("#EntranceMember_000307").click(function() { EntranceMember_Post(6); });
|
||||
$("#EntranceMember_000308").click(function() { EntranceMember_Post(7); });
|
||||
|
||||
}
|
||||
|
||||
function EntranceMember_Update() {
|
||||
EntranceMember_UpdateMember(0);
|
||||
}
|
||||
|
||||
function EntranceMember_Back() {
|
||||
$("#EntranceMember_00").hide();
|
||||
|
||||
$("#Entrance_00").show();
|
||||
Entrance_Update();
|
||||
}
|
||||
|
||||
function EntranceMember_Order() {
|
||||
EntranceMember_UpdateMember($("#EntranceMember_000200").val());
|
||||
}
|
||||
|
||||
function EntranceMember_UpdateMember(select) {
|
||||
Popup_Wait(function() {
|
||||
GetJSON(
|
||||
"../../i_entrance/member/Get.php", {
|
||||
select: select
|
||||
},
|
||||
function(response, textStatus) {
|
||||
if(response.result == "SUCCESS") {
|
||||
$("#EntranceMember_000000").text(response.count);
|
||||
$("#EntranceMember_000300").html(response.lists);
|
||||
$("#EntranceMember_0005").html(response.members);
|
||||
$("#EntranceMember_000600").html(response.state);
|
||||
Popup_WaitHide();
|
||||
} else {
|
||||
Popup_WaitShow("처리 실패!");
|
||||
}
|
||||
}
|
||||
)
|
||||
});
|
||||
}
|
||||
|
||||
function EntranceMember_Post(select) {
|
||||
var no = $("#EntranceMember_000300").val();
|
||||
var sel = $("#EntranceMember_000200").val();
|
||||
|
||||
Popup_Confirm('정말 실행하시겠습니까?', function() {
|
||||
Popup_Wait(function() {
|
||||
PostJSON(
|
||||
"../../i_entrance/member/Post.php", {
|
||||
select: select,
|
||||
no: no
|
||||
},
|
||||
function(response, textStatus) {
|
||||
if(response.result == "SUCCESS") {
|
||||
Popup_WaitHide();
|
||||
EntranceMember_UpdateMember(sel);
|
||||
} else {
|
||||
Popup_WaitShow("처리 실패!");
|
||||
}
|
||||
}
|
||||
)
|
||||
})
|
||||
});
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
require_once('_common.php');
|
||||
$session = Session::requireLogin();
|
||||
|
||||
// 외부 파라미터
|
||||
// $_POST['select'] : 처리종류
|
||||
// $_POST['no'] : NO
|
||||
$select = $_POST['select'];
|
||||
$no = $_POST['no'];
|
||||
|
||||
$db = RootDB::db();
|
||||
$member = $db->queryFirstRow('SELECT `GRADE` FROM `MEMBER` WHERE `NO` = %i', $session->userID);
|
||||
|
||||
if($member['GRADE'] < 6) {
|
||||
$response['result'] = 'FAIL';
|
||||
$response['msg'] = '운영자 권한이 없습니다.';
|
||||
} else {
|
||||
|
||||
if($select >= 0 && $select <= 4) {
|
||||
/*
|
||||
0: 블럭회원
|
||||
1: 일반회원
|
||||
2: 참여회원?
|
||||
3: 유효회원?
|
||||
4: 특별회원?
|
||||
*/
|
||||
$db->update('MEMBER', ['GRADE'=>$select], 'NO=%i', $no);
|
||||
} elseif($select == 5) {
|
||||
// 전콘제거
|
||||
$db->update('MEMBER', [
|
||||
'PICTURE'=>'',
|
||||
'IMGSVR'=>0
|
||||
], 'NO=%i', $no);
|
||||
|
||||
} elseif($select == 6) {
|
||||
// 비번초기화
|
||||
$pw = md5('11111111');
|
||||
$db->update('MEMBER', ['PW'=>$pw], 'NO=%i',$no);
|
||||
} elseif($select == 7) {
|
||||
// 회원삭제
|
||||
$db->delete('MEMBER', 'NO=%i', $no);
|
||||
} elseif($select == 8) {
|
||||
// 가입허용
|
||||
$db->update('SYSTEM', ['REG'=>'Y'], 'NO=1');
|
||||
} elseif($select == 9) {
|
||||
// 가입금지
|
||||
$db->update('SYSTEM', ['REG'=>'N'], 'NO=1');
|
||||
} elseif($select == 10) {
|
||||
// 로그인허용
|
||||
$db->update('SYSTEM', ['LOGIN'=>'Y'], 'NO=1');
|
||||
} elseif($select == 11) {
|
||||
// 로그인금지
|
||||
$db->update('SYSTEM', ['LOGIN'=>'N'], 'NO=1');
|
||||
} elseif($select == 12) {
|
||||
// 탈퇴처리(1개월)
|
||||
$db->delete('MEMBER', "QUIT='Y' AND GRADE<'5' AND REG_DATE<DATE_SUB(NOW(), INTERVAL 1 MONTH)");
|
||||
} elseif($select == 13) {
|
||||
// 오래된계정(6개월)
|
||||
$db->delete('MEMBER', "GRADE<'5' AND REG_DATE<DATE_SUB(NOW(), INTERVAL 6 MONTH)");
|
||||
}
|
||||
|
||||
$response['result'] = 'SUCCESS';
|
||||
}
|
||||
|
||||
Json::die($response);
|
||||
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
@charset "utf-8";
|
||||
|
||||
#user_list_frame{
|
||||
min-width:920px;
|
||||
}
|
||||
|
||||
#user_list_frame td, #user_list_frame th{
|
||||
text-align:center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#user_list td button{
|
||||
padding: 0.15rem 0.3rem;
|
||||
line-height:1.1em;
|
||||
}
|
||||
|
||||
p.small, td.small{
|
||||
line-height:1.2em;
|
||||
}
|
||||
|
||||
.hide_text{
|
||||
display:none;
|
||||
}
|
||||
p.user_grade_0 {
|
||||
display:block;
|
||||
color:#E74C3C;
|
||||
}
|
||||
#EntranceMember_00 {
|
||||
width: 1100px; height: 20px;
|
||||
border: none;
|
||||
@@ -0,0 +1,219 @@
|
||||
var userFrame = '\
|
||||
<tr id="userinfo_<%userID%>" data-username="<%userName%>" data-id="<%userID%>">\
|
||||
<th scope="row"><%userID%></th>\
|
||||
<td><%userName%></td>\
|
||||
<td class="small"><%emailFunc(email)%><br>(<%authType%>)</td>\
|
||||
<td><%userGradeText%><p class="small hide_text user_grade_<%userGrade%>" style="margin:0;"><%shortDate(blockUntil)%></p></td>\
|
||||
<td><%nickname%></td>\
|
||||
<td><img src="<%icon%>" width="64px" height="64px"></td>\
|
||||
<td class="small"><%slotGeneralList%></td>\
|
||||
<td class="small"><%shortDate(joinDate)%></td>\
|
||||
<td class="small"><%shortDate(loginDate)%></td>\
|
||||
<td class="small"><%shortDate(deleteAfter)%></td>\
|
||||
<td>\
|
||||
<div class="btn-group" role="group">\
|
||||
<button type="button" onclick="changeUserStatus(\'delete\', this);" class="btn btn-danger btn-sm">강제<br>탈퇴</button>\
|
||||
<button type="button" onclick="changeUserStatus(\'reset_pw\', this);" class="btn btn-info btn-sm">암호<br>변경</button>\
|
||||
<button type="button" onclick="changeUserStatus(\'block\', this);" class="btn btn-warning btn-sm">유저<br>차단</button>\
|
||||
<button type="button" onclick="changeUserStatus(\'unblock\', this);" class="btn btn-secondary btn-sm">차단<br>해제</button>\
|
||||
<button type="button" onclick="changeUserStatus(\'set_userlevel\', this);" class="btn btn-primary btn-sm">별도<br>권한</button>\
|
||||
</div>\
|
||||
</td>\
|
||||
</tr>';
|
||||
|
||||
function convUserGrade(grade){
|
||||
var userGradeMap = {
|
||||
0:'차단',
|
||||
1:'일반',
|
||||
4:'특별',
|
||||
5:'부운영자',
|
||||
6:'운영자'
|
||||
};
|
||||
|
||||
if(grade in userGradeMap){
|
||||
return userGradeMap[grade];
|
||||
}
|
||||
return grade;
|
||||
}
|
||||
|
||||
function fillAllowJoinLogin(result){
|
||||
$('#radios_allow_join .active').removeClass('active');
|
||||
$('#radios_allow_login .active').removeClass('active');
|
||||
if(result.allowJoin){
|
||||
$('#allow_join_y').parent().addClass('active');
|
||||
}
|
||||
else{
|
||||
$('#allow_join_n').parent().addClass('active');
|
||||
}
|
||||
|
||||
if(result.allowLogin){
|
||||
$('#allow_login_y').parent().addClass('active');
|
||||
}
|
||||
else{
|
||||
$('#allow_login_n').parent().addClass('active');
|
||||
}
|
||||
}
|
||||
|
||||
function fillUserList(result){
|
||||
var $user_list = $('#user_list');
|
||||
|
||||
|
||||
$user_list.empty();
|
||||
|
||||
var slotGeneralList = $.map(result.servers, function(value){
|
||||
return '<span class="server_generalName_{0}"></span>'.format(value)
|
||||
}).join('<br>');
|
||||
|
||||
var emailFunc = function(text){
|
||||
return String(text).replace('@','@<br>');
|
||||
}
|
||||
var brFunc = function(text){
|
||||
return String(text).split(' ').join('<br>');
|
||||
};
|
||||
|
||||
var shortDateFunc = function(date){
|
||||
if(!date){
|
||||
return '-';
|
||||
}
|
||||
return brFunc(date.substr(2));
|
||||
}
|
||||
|
||||
$.each(result.users, function(idx, user){
|
||||
user.br = brFunc;
|
||||
user.shortDate = shortDateFunc;
|
||||
user.emailFunc = emailFunc;
|
||||
if(!user.email){
|
||||
user.email = '-';
|
||||
}
|
||||
user.slotGeneralList = slotGeneralList;
|
||||
user.userGradeText = convUserGrade(user.userGrade);
|
||||
|
||||
$user_list.append(
|
||||
TemplateEngine(userFrame, user)
|
||||
)
|
||||
});
|
||||
|
||||
//TODO: slotGeneralList에 값을 채워야함. ajax로 받아올 필요 있음
|
||||
}
|
||||
|
||||
function changeSystem(action, param=null){
|
||||
var text = '{0}{1}을 진행합니다.'.format(action, param?(', '+param):'');
|
||||
if(!confirm(text)){
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:'j_set_userlist.php',
|
||||
dataType:'json',
|
||||
data:{
|
||||
'action':action,
|
||||
'param':param
|
||||
}
|
||||
}).then(function(result){
|
||||
if(result.result){
|
||||
if(result.affected !== undefined){
|
||||
alert('{0}건이 처리되었습니다.'.format(result.affected));
|
||||
refreshAll();
|
||||
}
|
||||
else{
|
||||
alert('완료되었습니다.');
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
alert(result.reason);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function changeUserStatus(action, userID, param=null){
|
||||
if(userID instanceof Element){
|
||||
userID = parseInt($(userID).parents('tr').data('id'));
|
||||
}
|
||||
if(!$.isNumeric(userID)){
|
||||
alert('userID가 올바르게 지정되지 않았습니다!');
|
||||
return;
|
||||
}
|
||||
userID = parseInt(userID);
|
||||
|
||||
|
||||
if(action == 'set_userlevel'){
|
||||
if(!$.isNumeric(param)){
|
||||
param = prompt('원하는 등급을 입력해주세요.(1:일반, 4:특별, 5:부운영자, 6:운영자)', '1');
|
||||
}
|
||||
param = parseInt(param);
|
||||
|
||||
if(param < 1 || param > 6){
|
||||
alert('올바르지 않습니다.');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(action == 'block'){
|
||||
if(!$.isNumeric(param)){
|
||||
param = prompt('블록 기간을 입력해주세요. <= 0은 반영구(50년)입니다.', '7');
|
||||
}
|
||||
param = parseInt(param);
|
||||
}
|
||||
|
||||
var userName = $('#userinfo_'+userID).data('username');
|
||||
|
||||
var text = '{0}에 대해서 {1}{2}을 진행합니다.'.format(userName, action, param?(', '+param):'');
|
||||
if(!confirm(text)){
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:'j_set_userlist.php',
|
||||
dataType:'json',
|
||||
data:{
|
||||
'action':action,
|
||||
'user_id':userID,
|
||||
'param':param
|
||||
}
|
||||
}).then(function(result){
|
||||
if(result.result){
|
||||
if(result.detail !== undefined){
|
||||
alert('완료되었습니다. : {0}'.format(result.detail));
|
||||
refreshAll();
|
||||
}
|
||||
else{
|
||||
alert('완료되었습니다.');
|
||||
refreshAll();
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
alert(result.reason);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function refreshAll(){
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:'j_get_userlist.php',
|
||||
dataType:'json'
|
||||
}).then(function(result){
|
||||
if(!result.result){
|
||||
alert(reuslt.reason);
|
||||
return;
|
||||
}
|
||||
|
||||
fillAllowJoinLogin(result);
|
||||
fillUserList(result);
|
||||
});
|
||||
}
|
||||
|
||||
$(function(){
|
||||
refreshAll();
|
||||
|
||||
$('input[name=allow_join], input[name=allow_login]').on('change', function(){
|
||||
var $this = $(this);
|
||||
changeSystem($this.attr('name'), $this.val());
|
||||
})
|
||||
});
|
||||
@@ -17,6 +17,7 @@ class Json{
|
||||
}
|
||||
|
||||
public static function die($value, $noCache = true, $pretty = false, $die = true){
|
||||
//NOTE: REST 형식에 맞게, ok(), fail()로 쪼개는게 낫지 않을까 생각해봄.
|
||||
if($noCache){
|
||||
WebUtil::setHeaderNoCache();
|
||||
}
|
||||
|
||||
@@ -10,6 +10,14 @@ class TimeUtil {
|
||||
return date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
public static function DatetimeFromNowDay($day) {
|
||||
return date('Y-m-d H:i:s', strtotime("{$day} days"));
|
||||
}
|
||||
|
||||
public static function DatetimeFromNowHour($hour) {
|
||||
return date('Y-m-d H:i:s', strtotime("{$hour} hours"));
|
||||
}
|
||||
|
||||
public static function DatetimeFromNowMinute($minute) {
|
||||
return date('Y-m-d H:i:s', strtotime("{$minute} minutes"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user