새 회원 관리창 1차 구현 완료.

This commit is contained in:
2018-03-25 21:46:03 +09:00
parent 7a34cc4089
commit 83d619835f
10 changed files with 633 additions and 258 deletions
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

+49 -90
View File
@@ -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(){
가입 허용&nbsp;
<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>
로그인 허용&nbsp;
<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>
+33 -14
View File
@@ -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'
]);
+298
View File
@@ -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
]);
-85
View File
@@ -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("처리 실패!");
}
}
)
})
});
}
-69
View File
@@ -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;
+219
View File
@@ -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());
})
});
+1
View File
@@ -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();
}
+8
View File
@@ -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"));
}