장선근
5 years ago
56 changed files with 1798 additions and 931 deletions
-
99_src/admin/js/admin.js
-
9_src/admin/js/modules/datagrid.js
-
24_src/admin/js/modules/member.js
-
16_src/admin/scss/plugins/_plugins_custom.scss
-
2_src/common/js/modules/components.js
-
0_src/common/js/plugins/jquery.tmpl.js
-
2public_html/assets/css/admin.min.css
-
2public_html/assets/css/admin.min.css.map
-
2public_html/assets/css/desktop.min.css
-
2public_html/assets/css/desktop.min.css.map
-
2public_html/assets/css/mobile.min.css
-
2public_html/assets/css/mobile.min.css.map
-
BINpublic_html/assets/images/admin/help/naver_syndi01.png
-
BINpublic_html/assets/images/admin/help/naver_syndi02.png
-
BINpublic_html/assets/images/admin/help/naver_syndi03.png
-
2public_html/assets/js/admin.min.js
-
2public_html/assets/js/admin.min.js.map
-
2public_html/assets/js/desktop.min.js
-
2public_html/assets/js/desktop.min.js.map
-
2public_html/assets/js/mobile.min.js
-
2public_html/assets/js/mobile.min.js.map
-
2source.info.json
-
2wheeparam/application/config/routes.php
-
77wheeparam/application/controllers/Board.php
-
88wheeparam/application/controllers/Helptool.php
-
1wheeparam/application/controllers/admin/Board.php
-
131wheeparam/application/controllers/admin/Management.php
-
130wheeparam/application/controllers/admin/Members.php
-
63wheeparam/application/controllers/admin/ajax/Management.php
-
186wheeparam/application/controllers/admin/ajax/Members.php
-
62wheeparam/application/controllers/ajax/Members.php
-
154wheeparam/application/controllers/customer/Qna.php
-
18wheeparam/application/libraries/Member.php
-
146wheeparam/config/wheeparam.sql
-
9wheeparam/views/themes/admin/board/form.php
-
34wheeparam/views/themes/admin/help/naver_syndi.php
-
4wheeparam/views/themes/admin/management/banner.php
-
41wheeparam/views/themes/admin/management/banner_form.php
-
179wheeparam/views/themes/admin/management/qna.php
-
79wheeparam/views/themes/admin/management/qna_category.php
-
15wheeparam/views/themes/admin/management/qna_category_form.php
-
72wheeparam/views/themes/admin/management/qna_view.php
-
132wheeparam/views/themes/admin/members/info.php
-
198wheeparam/views/themes/admin/members/lists.php
-
120wheeparam/views/themes/admin/members/log.php
-
4wheeparam/views/themes/admin/members/login.php
-
102wheeparam/views/themes/admin/members/modify.php
-
25wheeparam/views/themes/admin/members/password.php
-
129wheeparam/views/themes/admin/members/point.php
-
29wheeparam/views/themes/admin/members/point_form.php
-
132wheeparam/views/themes/admin/members/points.php
-
3wheeparam/views/themes/admin/setting/admin.php
-
2wheeparam/views/themes/admin/statics/visit.php
-
2wheeparam/views/themes/admin/theme.php
-
41wheeparam/views/themes/desktop/customer/qna/lists.php
-
39wheeparam/views/themes/desktop/customer/qna/write.php
2
public_html/assets/css/admin.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/css/admin.min.css.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/css/desktop.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/css/desktop.min.css.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/css/mobile.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/css/mobile.min.css.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Before Width: 700 | Height: 381 | Size: 19 KiB |
Before Width: 700 | Height: 538 | Size: 67 KiB |
Before Width: 920 | Height: 109 | Size: 27 KiB |
2
public_html/assets/js/admin.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/js/admin.min.js.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/js/desktop.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/js/desktop.min.js.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/js/mobile.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
public_html/assets/js/mobile.min.js.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,186 @@ |
|||||
|
<?php |
||||
|
defined('BASEPATH') OR exit('No direct script access allowed'); |
||||
|
require APPPATH . '/libraries/REST_Controller.php'; |
||||
|
|
||||
|
class Members extends REST_Controller |
||||
|
{ |
||||
|
/************************************************************** |
||||
|
* 사용자 목록 |
||||
|
***************************************************************/ |
||||
|
function index_get() |
||||
|
{ |
||||
|
$page_rows = $this->get('take', TRUE); |
||||
|
$start = $this->get('skip', TRUE); |
||||
|
|
||||
|
$sdate = $this->input->get('sdate', TRUE); |
||||
|
$startdate = $this->input->get('startdate', TRUE); |
||||
|
$enddate = $this->input->get('enddate', TRUE); |
||||
|
|
||||
|
if(! empty($sdate) && !empty($startdate)) $this->db->where('mem_'.$sdate.' >=', $startdate.' 00:00:00'); |
||||
|
if(! empty($sdate) && !empty($enddate)) $this->db->where('mem_'.$sdate.' <=', $enddate.' 23:59:59'); |
||||
|
|
||||
|
if(empty($page_rows)) $this->db->limit($page_rows, $start); |
||||
|
|
||||
|
$order_by = 'mem_idx DESC'; |
||||
|
$this->db->order_by($order_by); |
||||
|
|
||||
|
$this->db->select("SQL_CALC_FOUND_ROWS *", FALSE); |
||||
|
$this->db->from('member'); |
||||
|
|
||||
|
$result = $this->db->get(); |
||||
|
$return['lists'] = $result->result_array(); |
||||
|
$return['totalCount'] = (int)$this->db->query("SELECT FOUND_ROWS() AS cnt")->row(0)->cnt; |
||||
|
|
||||
|
foreach($return['lists'] as $i=>&$row) { |
||||
|
$row['nums'] = $return['totalCount'] - (int)$start - $i; |
||||
|
$row['mem_regip'] = long2ip((int)$row['mem_regip']); |
||||
|
$row['mem_logip'] = long2ip((int)$row['mem_logip']); |
||||
|
} |
||||
|
|
||||
|
$this->response($return, 200); |
||||
|
} |
||||
|
|
||||
|
/************************************************************** |
||||
|
* 사용자 상태 변경 |
||||
|
***************************************************************/ |
||||
|
function status_post() |
||||
|
{ |
||||
|
if(! $this->member->is_super() ) |
||||
|
$this->response(array('status'=>FALSE, 'message'=>'권한이 없습니다.'), 400); |
||||
|
|
||||
|
$mem_idx = $this->post('mem_idx', TRUE); |
||||
|
$current_status = $this->post('current_status', TRUE); |
||||
|
$change_status = $this->post('change_status', TRUE); |
||||
|
|
||||
|
if(empty($mem_idx)) |
||||
|
$this->response(array('status'=>FALSE, 'message'=>'관리자로 설정할 회원이 존재하지 않습니다.'), 400); |
||||
|
|
||||
|
if(! $mem = $this->member->get_member($mem_idx,'mem_idx') ) |
||||
|
{ |
||||
|
$this->response(array('status'=>FALSE, 'message'=>'존재하지 않는 회원입니다.'), 400); |
||||
|
} |
||||
|
|
||||
|
if( $mem['mem_status'] != $current_status ) |
||||
|
{ |
||||
|
$this->response(array('status'=>FALSE, 'message'=>'변경전 회원상태가 실제 DB상 회원상태와 일치하지 않습니다.'), 400); |
||||
|
} |
||||
|
|
||||
|
if( ! in_array($change_status, array('Y','N','D','H'))) |
||||
|
{ |
||||
|
$this->response(array('status'=>FALSE, 'message'=>'변경하려는 회원상태가 올바르지 않습니다.'), 400); |
||||
|
} |
||||
|
|
||||
|
$this->db->trans_start(); |
||||
|
|
||||
|
if( $change_status == 'Y' ) { |
||||
|
$this->db->set('mem_leavetime', '0000-00-00 00:00:00'); |
||||
|
$this->db->set('mem_bantime', '0000-00-00 00:00:00'); |
||||
|
$this->db->set('mem_htime', '0000-00-00 00:00:00'); |
||||
|
} |
||||
|
else if ($change_status == 'B') { |
||||
|
$this->db->set('mem_bantime', date('Y-m-d H:i:s')); |
||||
|
} |
||||
|
else if ($change_status == 'N') { |
||||
|
$this->db->set('mem_leavetime', date('Y-m-d H:i:s')); |
||||
|
} |
||||
|
else if ($change_status == 'H') { |
||||
|
$this->db->set('mem_htime', date('Y-m-d H:i:s')); |
||||
|
} |
||||
|
|
||||
|
$this->db->set('mem_status', $change_status)->where('mem_idx', $mem_idx)->update('member'); |
||||
|
|
||||
|
if ($this->db->trans_status() === FALSE) |
||||
|
{ |
||||
|
$this->db->trans_rollback(); |
||||
|
$this->response(array('status'=>FALSE, 'message'=>'시스템 오류가 발생하였습니다.'), 500); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
$this->db->trans_commit(); |
||||
|
$this->response(array('status'=>TRUE, 'message'=>'회원 상태변경이 완료되었습니다.'), 200); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function logs_get() |
||||
|
{ |
||||
|
$page_rows = $this->get('take', TRUE); |
||||
|
$start = $this->get('skip', TRUE); |
||||
|
|
||||
|
$start_date = $this->input->get('startdate', TRUE, date('Y-m-d', strtotime("-1 month", time()))); |
||||
|
$end_date = $this->input->get('enddate', TRUE, date('Y-m-d')); |
||||
|
$st = $this->input->get('st', TRUE); |
||||
|
$sc = $this->input->get('sc', TRUE); |
||||
|
|
||||
|
if ( !empty($st) && !empty($sc) ) |
||||
|
{ |
||||
|
if( $sc == 'nickname' OR $sc == 'userid') |
||||
|
{ |
||||
|
$sc = "member_log.mem_" . $sc; |
||||
|
$this->db->like($sc, $st); |
||||
|
} |
||||
|
else if ( $sc == 'idx' ) |
||||
|
{ |
||||
|
$this->db->where('member_log.mem_idx', $st); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if(! empty($start_date)) $this->db->where('mlg_regtime >=',$start_date . " 00:00:00"); |
||||
|
if(! empty($end_date)) $this->db->where('mlg_regtime <=',$end_date . " 23:59:59"); |
||||
|
|
||||
|
if(! empty($page_rows)) $this->db->limit($page_rows, $start); |
||||
|
$this->db->select("SQL_CALC_FOUND_ROWS *", FALSE); |
||||
|
$this->db->from('member_log'); |
||||
|
$this->db->join('member','member.mem_idx=member_log.mem_idx','inner'); |
||||
|
|
||||
|
$result = $this->db->get(); |
||||
|
$return['lists'] = $result->result_array(); |
||||
|
$return['totalCount'] = (int)$this->db->query("SELECT FOUND_ROWS() AS cnt")->row(0)->cnt; |
||||
|
|
||||
|
foreach($return['lists'] as $i=>&$row) { |
||||
|
$row['nums'] = $return['totalCount'] - $i - $start; |
||||
|
$row['mlg_is_mobile'] = $row['mlg_is_mobile'] == 'Y'; |
||||
|
$row['mlg_ip'] = long2ip((int)$row['mlg_ip']); |
||||
|
} |
||||
|
|
||||
|
$this->response($return, 200); |
||||
|
} |
||||
|
|
||||
|
/************************************************************** |
||||
|
* 포인트 목록 |
||||
|
***************************************************************/ |
||||
|
function points_get() |
||||
|
{ |
||||
|
$start_date = $this->get('startdate', TRUE); |
||||
|
$end_date = $this->get('enddate', TRUE); |
||||
|
$target_type = $this->get('target_type', TRUE); |
||||
|
$mem_idx = $this->get('mem_idx', TRUE); |
||||
|
$page_rows = $this->get('take', TRUE); |
||||
|
$start = $this->get('skip', TRUE); |
||||
|
|
||||
|
if( ! empty($target_type) ) $this->db->where('target_type', $target_type); |
||||
|
if( ! empty($start_date)) $this->db->where('reg_datetime >= ', $start_date . ' 00:00:00'); |
||||
|
if( ! empty($end_date)) $this->db->where('reg_datetime <= ', $end_date . ' 23:59:59'); |
||||
|
if( ! empty($mem_idx)) $this->db->where('MP.mem_idx', $mem_idx); |
||||
|
if( ! empty($page_rows)) $this->db->limit($page_rows, $start); |
||||
|
|
||||
|
$this->db->order_by('mpo_idx DESC'); |
||||
|
$this->db->select("SQL_CALC_FOUND_ROWS MP.*, M.*", FALSE); |
||||
|
$this->db->from('member_point AS MP'); |
||||
|
$this->db->join('member AS M','M.mem_idx=MP.mem_idx','inner'); |
||||
|
|
||||
|
$result = $this->db->get(); |
||||
|
$return['lists'] = $result->result_array(); |
||||
|
$return['totalCount'] = (int)$this->db->query("SELECT FOUND_ROWS() AS cnt")->row(0)->cnt; |
||||
|
|
||||
|
|
||||
|
|
||||
|
foreach($return['lists'] as $i=>&$row) |
||||
|
{ |
||||
|
$row['nums'] = $return['totalCount'] - $i - $start; |
||||
|
$row['target_type'] = point_type($row['target_type']); |
||||
|
} |
||||
|
|
||||
|
$this->response($return, 200); |
||||
|
} |
||||
|
|
||||
|
} |
@ -1,34 +0,0 @@ |
|||||
<div class="col-xs-12"> |
|
||||
<div class="page-header"> |
|
||||
<h2 class="page-title"><i class="far fa-question-circle" style="display:inline"></i> 네이버 신디케이션 API 등록방법</h2> |
|
||||
</div> |
|
||||
<div class="admin-help-wrap"> |
|
||||
<ul> |
|
||||
<li> |
|
||||
<p class="MT20 MB20">1. NAVER 웹마스터도구 페이지로 이동합니다. <a href="http://webmastertool.naver.com/" target="_blank" class="point-color">NAVER 웹마스터도구 페이지 바로가기</a></p> |
|
||||
<img src="/assets/images/admin/help/naver_ownership01.jpg" alt=""> |
|
||||
</li> |
|
||||
<li> |
|
||||
<p class="MT20 MB20"> |
|
||||
2. 로그인 후 <span class="point-color">연동 사이트 목록</span>페이지로 이동됩니다.<br> |
|
||||
연동된 사이트를 더블클릭 합니다. |
|
||||
</p> |
|
||||
<img src="/assets/images/admin/help/naver_syndi01.png" alt=""> |
|
||||
</li> |
|
||||
<li> |
|
||||
<p class="MT20 MB20"> |
|
||||
3. 왼쪽 메뉴에 <span class="point-color">설정</span>메뉴 부분을 클릭하여 <span class="point-color">신디케이션 인증키</span>를 복사합니다. |
|
||||
</p> |
|
||||
<img src="/assets/images/admin/help/naver_syndi02.png" alt=""> |
|
||||
</li> |
|
||||
<li> |
|
||||
<p class="MT20 MB20"> |
|
||||
4. 휘파람 관리자 페이지로 돌아와 <span class="point-color">[신디케이션 인증키]</span>코드를 휘파람 보드 관리자 -> <span class="point-color">네이버 신디케이션 API KEY</span>에 붙여 넣습니다. |
|
||||
</p> |
|
||||
<img src="/assets/images/admin/help/naver_syndi03.png" alt=""> |
|
||||
<br> |
|
||||
<br> |
|
||||
</li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
</div> |
|
@ -0,0 +1,179 @@ |
|||||
|
<div class="page-header" data-fit-aside> |
||||
|
<h1 class="page-title">Q&A 관리</h1> |
||||
|
</div> |
||||
|
|
||||
|
<form data-grid-search onsubmit="grid.refresh(1);return false;" data-fit-aside autocomplete="off"> |
||||
|
<div data-ax-tbl> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>작성 기간 검색</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" data-chained-datepicker="[name='enddate']" name="startdate" data-toggle="datepicker" value=""> |
||||
|
</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" name="enddate" data-toggle="datepicker" value=""> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>답변여부</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<select class="form-control" name="qna_ans_status"> |
||||
|
<option value="">전체보기</option> |
||||
|
<option value="N">미답변</option> |
||||
|
<option value="Y">답변완료</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>검색어 입력</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<select class="form-control form-control-inline" name="sc"> |
||||
|
<option value="qna_title">질문 제목</option> |
||||
|
<option value="qna_name">작성자</option> |
||||
|
<option value="qna_phone">연락처</option> |
||||
|
<option value="qna_email">이메일</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" name="st" value=""> |
||||
|
</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<button class="btn btn-default btn-sm"><i class="fal fa-search"></i> 필터적용</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div data-ax-td class="right"> |
||||
|
<div data-ax-td-wrap> |
||||
|
<button type="button" class="btn btn-default btn-sm" data-button="qna-category"><i class="fal fa-sitemap"></i> Q&A 유형 관리</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</form> |
||||
|
|
||||
|
<div class="H10" data-fit-aside></div> |
||||
|
|
||||
|
<div class="grid-wrapper" data-fit-content> |
||||
|
<div class="grid-container" id="grid-container"></div> |
||||
|
</div> |
||||
|
|
||||
|
<script> |
||||
|
var grid = new GRID('#grid-container', { |
||||
|
paging: { |
||||
|
pageSize: 20 |
||||
|
}, |
||||
|
columns: [ |
||||
|
{caption:'번호', dataField:'nums', alignment:'right', width:60, dataType:'number', format:'fixedPoint'}, |
||||
|
{caption:'질문일시', dataField:'reg_datetime', alignment:'center', width:120}, |
||||
|
{caption:'Q&A유형', dataField:'qnc_title', alignment:'center', width:120}, |
||||
|
{caption:'질문제목', dataField:'qna_title', alignment:'left'}, |
||||
|
{caption:'질문자', dataField:'qna_name', alignment:'center', width:80}, |
||||
|
{caption:'구분', dataField:'reg_user', alignment:'center', width:80, customizeText:function(cell) {return cell.value > 0 ?'회원':'비회원'}}, |
||||
|
{caption:'연락처', dataField:'qna_phone', alignment:'center', width:120}, |
||||
|
{caption:'E-mail', dataField:'qna_email', alignment:'left', width:180}, |
||||
|
{caption:'답변여부', dataField:'qna_ans_status', alignment:'center', width:60, customizeText:function(cell) {return cell.value == 'Y' ?'답변완료':''}}, |
||||
|
{caption:'답변자', dataField:'qna_ans_upd_username', alignment:'center', width:80}, |
||||
|
{caption:'답변일시', dataField:'qna_ans_upd_datetime', alignment:'center', width:120, customizeText:function(cell) {return cell.value != '0000-00-00 00:00:00' ?cell.value:''}} |
||||
|
], |
||||
|
dataSource: new DevExpress.data.DataSource({ |
||||
|
key : 'qna_idx', |
||||
|
load: function(loadOptions) { |
||||
|
var d = $.Deferred(); |
||||
|
var params = grid.getSearchParam(loadOptions); |
||||
|
|
||||
|
$.ajax({ |
||||
|
url : base_url + '/admin/ajax/management/qna', |
||||
|
type: 'GET', |
||||
|
async: false, |
||||
|
cache: false, |
||||
|
data: params |
||||
|
}).done(function(res) { |
||||
|
d.resolve(res.lists, { |
||||
|
totalCount : res.totalCount |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
return d.promise(); |
||||
|
} |
||||
|
}), |
||||
|
onContextMenuPreparing: function(e) { |
||||
|
if (e.row.rowType === "data") { |
||||
|
e.items = [ |
||||
|
{ |
||||
|
icon : 'search', |
||||
|
text: '내용보기', |
||||
|
onItemClick: function () { |
||||
|
grid.form(e.row.data.qna_idx); |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
icon : 'trash', |
||||
|
text: "삭제", |
||||
|
onItemClick: function () { |
||||
|
grid.delete(e.row.data); |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
onRowDblClick: function(e) { |
||||
|
grid.form(e.data.qna_idx); |
||||
|
}, |
||||
|
}); |
||||
|
|
||||
|
grid.form = function(qna_idx) { |
||||
|
APP.MODAL.callback = function() { |
||||
|
grid.refresh(); |
||||
|
APP.MODAL.close(); |
||||
|
} |
||||
|
|
||||
|
APP.MODAL.open({ |
||||
|
iframe: { |
||||
|
url: base_url + '/admin/management/qna_view/' + qna_idx |
||||
|
}, |
||||
|
width:800, |
||||
|
height:600, |
||||
|
header: { |
||||
|
title: 'Q&A 내용보기' |
||||
|
} |
||||
|
}) |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
grid.delete = function(data) { |
||||
|
if(! confirm('선택하신 데이타를 삭제하시겠습니까?\n제목: '+data.qna_title + '\n작성자: ' + data.qna_name)) return false; |
||||
|
|
||||
|
$.ajax({ |
||||
|
url: base_url + '/admin/ajax/management/qna', |
||||
|
type: 'DELETE', |
||||
|
data: { |
||||
|
qna_idx: data.qna_idx |
||||
|
}, |
||||
|
success:function() { |
||||
|
toastr.success('삭제되었습니다.'); |
||||
|
grid.refresh(); |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
$(function() { |
||||
|
grid.init(); |
||||
|
|
||||
|
$('[data-button="qna-category"]').click(function() { |
||||
|
APP.MODAL.open({ |
||||
|
iframe: { |
||||
|
url: base_url + '/admin/management/qna_category' |
||||
|
}, |
||||
|
width: 800, |
||||
|
height: 600, |
||||
|
header: { |
||||
|
title: 'Q&A 유형 관리' |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
}); |
||||
|
}) |
||||
|
</script> |
@ -0,0 +1,79 @@ |
|||||
|
<div class="ax-button-group"> |
||||
|
<div class="left"> |
||||
|
<h4>Q&A 분류 관리</h4> |
||||
|
</div> |
||||
|
<div class="right"> |
||||
|
<button type="button" class="btn btn-default" data-button="form-qna-category" data-idx=""><i class="fal fa-plus-circle"></i> 신규 등록</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="grid"> |
||||
|
<table> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th class="W20"></th> |
||||
|
<th>분류 이름</th> |
||||
|
<th class="W80">관리</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody data-toggle="sortable" data-key="qnc_idx" data-sort="sort" data-table="qna_category"> |
||||
|
<?php foreach($lists as $row):?>
|
||||
|
<tr> |
||||
|
<td class="text-center"> |
||||
|
<span class="move-grip"></span> |
||||
|
<input type="hidden" name="qnc_idx[]" value="<?=$row['qnc_idx']?>"> |
||||
|
</td> |
||||
|
<td><?=$row['qnc_title']?></td>
|
||||
|
<td class="text-center"> |
||||
|
<button type="button" class="btn btn-default btn-xs MR5" data-button="form-qna-category" data-idx="<?=$row['qnc_idx']?>"><i class="fal fa-pencil"></i></button> |
||||
|
<button type="button" class="btn btn-danger btn-xs" data-button="delete-qna-category" data-idx="<?=$row['qnc_idx']?>"><i class="fal fa-trash"></i></button> |
||||
|
</td> |
||||
|
</tr> |
||||
|
<?php endforeach;?>
|
||||
|
<?php if(count($lists) == 0) :?>
|
||||
|
<tr> |
||||
|
<td colspan="3" class="empty">등록된 분류가 없습니다.</td> |
||||
|
</tr> |
||||
|
<?php endif;?>
|
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
|
||||
|
<script> |
||||
|
$(function() { |
||||
|
$('[data-button="form-qna-category"]').click(function (e) { |
||||
|
var idx = $(this).data('idx'); |
||||
|
idx = typeof idx != 'undefined' && idx ? idx :''; |
||||
|
|
||||
|
APP.MODAL2.callback = function() { |
||||
|
location.reload(); |
||||
|
}; |
||||
|
|
||||
|
APP.MODAL2.open({ |
||||
|
iframe: { |
||||
|
url: base_url + '/admin/management/qna_category_form/' + idx, |
||||
|
}, |
||||
|
width: 340, |
||||
|
height: 200 |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
$('[data-button="delete-qna-category"]').click(function(e) { |
||||
|
var idx = $(this).data('idx'); |
||||
|
idx = typeof idx != 'undefined' && idx ? idx : false; |
||||
|
if(! idx) return; |
||||
|
if(! confirm('해당 분류를 삭제하시겠습니까?')) return; |
||||
|
$.ajax({ |
||||
|
url: base_url + '/admin/ajax/management/qna-category', |
||||
|
type:'DELETE', |
||||
|
data: { |
||||
|
qnc_idx:idx |
||||
|
}, |
||||
|
success:function() { |
||||
|
location.reload(); |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
}); |
||||
|
}) |
||||
|
</script> |
@ -0,0 +1,15 @@ |
|||||
|
<?=form_open(NULL, array('autocomplete'=>'off'))?>
|
||||
|
<div data-ax-tbl> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td class="width-100"> |
||||
|
<div data-ax-td-label>분류 이름</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" name="qnc_title" value="<?=element('qnc_title', $view)?>" autofocus required> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="text-center MT15"> |
||||
|
<button class="btn btn-primary"><i class="fal fa-save"></i> 저장하기</button> |
||||
|
</div> |
||||
|
<?=form_close()?>
|
@ -0,0 +1,72 @@ |
|||||
|
<?=form_open()?>
|
||||
|
<div data-ax-tbl> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td class="width-100"> |
||||
|
<div data-ax-td-label>제목</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_title']?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>작성자</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_name']?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>연락처</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_phone']?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>E-mail</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_email']?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td class="width-100"> |
||||
|
<div data-ax-td-label>내용</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=nl2br($view['qna_content'])?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>답변작성여부</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_ans_status']=='Y'?'답변완료':'미답변'?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>답변작성자</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_ans_status']=='Y'?$view['qna_ans_upd_username']:''?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>답변작성시간</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$view['qna_ans_status']=='Y'?$view['qna_ans_upd_datetime']:''?></p>
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td class="width-100"> |
||||
|
<div data-ax-td-label>답변 작성</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<textarea class="form-control" name="qna_ans_content" data-autosize rows="4"><?=$view['qna_ans_content']?></textarea>
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="text-center MT15"> |
||||
|
<button class="btn btn-primary">답변 작성하기</button> |
||||
|
</div> |
||||
|
<?=form_close()?>
|
@ -1,94 +1,96 @@ |
|||||
<div class="ax-button-group"> |
|
||||
<div class="left"> |
|
||||
<h4><?=$mem['mem_nickname']?>님의 회원정보</h4>
|
|
||||
|
<div data-ax-tbl> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>닉네임</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" value="<?=$mem['mem_nickname']?>" readonly> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="form-flex"> |
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">아이디</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control" value="<?=$mem['mem_userid']?>" readonly> |
|
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>상태</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<?php |
||||
|
if($mem['mem_status'] == 'Y') : |
||||
|
$status = '정상'; |
||||
|
elseif($mem['mem_status'] == 'D') : |
||||
|
$status = '접근금지'; |
||||
|
elseif($mem['mem_status'] == 'H') : |
||||
|
$status = '휴면'; |
||||
|
else : |
||||
|
$status = '탈퇴'; |
||||
|
endif; |
||||
|
?>
|
||||
|
<p class="form-control-static"><?=$status?></p>
|
||||
</div> |
</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<?php if($mem['mem_status'] == 'H') : ?>
|
||||
|
<a href="#" class="btn btn-default btn-sm" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','Y')"><i class="far fa-user-secret"></i> 휴면 해제</a> |
||||
|
<?php elseif( $mem['mem_status'] == 'Y' ) :?>
|
||||
|
<a href="#" class="btn btn-default btn-sm" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','D')"><i class="far fa-ban"></i> 로그인 금지</a> |
||||
|
<?php elseif( $mem['mem_status'] == 'D' ) :?>
|
||||
|
<a href="#" class="btn btn-default btn-sm" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','Y')"><i class="far fa-ban"></i> 로그인 금지 해제</a> |
||||
|
<?php endif;?>
|
||||
</div> |
</div> |
||||
|
|
||||
<?php if(! USE_EMAIL_ID) :?>
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">E-mail</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control" value="<?=$mem['mem_email']?>" readonly> |
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
<?php endif;?>
|
|
||||
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">닉네임</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control" value="<?=$mem['mem_nickname']?>" readonly> |
|
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>아이디</div> |
||||
|
<div data-ax-td-wrap><input class="form-control" value="<?=$mem['mem_userid']?>" readonly></div> |
||||
</div> |
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>비밀번호</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<a href="<?=base_url('admin/members/password/'.$mem['mem_idx'])?>" class="btn btn-default btn-sm"><i class="fal fa-lock"></i> 비밀번호 변경</a> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">휴대폰</label> |
|
||||
<div class="controls"> |
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>E-mail</div> |
||||
|
<div data-ax-td-wrap> <input class="form-control" value="<?=$mem['mem_email']?>" readonly></div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>휴대폰</div> |
||||
|
<div data-ax-td-wrap> |
||||
<input class="form-control" value="<?=$mem['mem_phone']?>" readonly> |
<input class="form-control" value="<?=$mem['mem_phone']?>" readonly> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
</div> |
||||
|
<div data-ax-tr> |
||||
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">성별</label> |
|
||||
<div class="controls"> |
|
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>성별</div> |
||||
|
<div data-ax-td-wrap> |
||||
<input class="form-control" value="<?=$mem['mem_gender']=='M'?'남':($mem['mem_gender']=='F'?'여':'미공개')?>" readonly> |
<input class="form-control" value="<?=$mem['mem_gender']=='M'?'남':($mem['mem_gender']=='F'?'여':'미공개')?>" readonly> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">권한 레벨</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control" value="<?=$mem['mem_auth']?>" readonly> |
|
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>권한 레벨</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static"><?=$mem['mem_auth']?></p>
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">E-mail 수신</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control" value="<?=$mem['mem_recv_email']=='Y'?'수신':'거부'?>" readonly> |
|
||||
</div> |
</div> |
||||
<label class="control-label control-label-sm">SMS 수신</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control" value="<?=$mem['mem_recv_sms']=='Y'?'수신':'거부'?>" readonly> |
|
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>E-mail</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static">수신 <?=$mem['mem_recv_email']=='Y'?'동의':'거부'?></p>
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">상태</label> |
|
||||
<div class="controls"> |
|
||||
<?php |
|
||||
if($mem['mem_status'] == 'Y') : |
|
||||
$status = '정상'; |
|
||||
elseif($mem['mem_status'] == 'D') : |
|
||||
$status = '접근금지'; |
|
||||
elseif($mem['mem_status'] == 'H') : |
|
||||
$status = '휴면'; |
|
||||
else : |
|
||||
$status = '탈퇴'; |
|
||||
endif; |
|
||||
?>
|
|
||||
<input class="form-control" value="<?=$status?>" readonly> |
|
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>SMS</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<p class="form-control-static">수신 <?=$mem['mem_recv_sms']=='Y'?'동의':'거부'?></p>
|
||||
|
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="H20"></div> |
<div class="H20"></div> |
||||
<div class="text-center"> |
<div class="text-center"> |
||||
<a href="<?=base_url('admin/members/password/'.$mem['mem_idx'])?>" class="btn btn-default"><i class="far fa-lock"></i> 비밀번호 변경</a> |
|
||||
<a href="<?=base_url('admin/members/modify/'.$mem['mem_idx'])?>" class="btn btn-default"><i class="far fa-pencil"></i> 정보 수정</a> |
|
||||
<?php if($mem['mem_status'] == 'H') : ?>
|
|
||||
<a href="#" class="btn btn-warning" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','Y')"><i class="far fa-user-secret"></i> 휴면 해제</a> |
|
||||
<?php elseif( $mem['mem_status'] == 'Y' ) :?>
|
|
||||
<a href="#" class="btn btn-warning" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','D')"><i class="far fa-ban"></i> 로그인 금지</a> |
|
||||
<?php elseif( $mem['mem_status'] == 'D' ) :?>
|
|
||||
<a href="#" class="btn btn-warning" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','Y')"><i class="far fa-ban"></i> 로그인 금지 해제</a> |
|
||||
<?php endif;?>
|
|
||||
|
<a href="<?=base_url('admin/members/modify/'.$mem['mem_idx'])?>" class="btn btn-default MR10"><i class="far fa-pencil"></i> 정보 수정</a> |
||||
<a href="#" class="btn btn-danger" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','N')"><i class="far fa-user-secret"></i> 회원 탈퇴</a> |
<a href="#" class="btn btn-danger" onclick="APP.MEMBER.STATUS_CHANGE('<?=$mem['mem_idx']?>','<?=$mem['mem_status']?>','N')"><i class="far fa-user-secret"></i> 회원 탈퇴</a> |
||||
</div> |
</div> |
@ -1,72 +1,86 @@ |
|||||
<div class="page-header"> |
|
||||
|
<div class="page-header" data-fit-aside> |
||||
<h1 class="page-title">회원 로그인 기록<small>회원 관리 > 회원 로그인 기록</small></h1> |
<h1 class="page-title">회원 로그인 기록<small>회원 관리 > 회원 로그인 기록</small></h1> |
||||
</div> |
</div> |
||||
|
|
||||
<?=form_open(NULL, array("method"=>'get', 'class'=>'form-flex'))?>
|
|
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">기간검색</label> |
|
||||
<div class="controls"> |
|
||||
<input class="form-control form-control-inline" name="startdate" data-toggle="datepicker" value="<?=$startdate?>"> |
|
||||
<input class="form-control form-control-inline" name="enddate" data-toggle="datepicker" value="<?=$enddate?>"> |
|
||||
|
<form data-grid-search onsubmit="grid.refresh(1);return false;" data-fit-aside autocomplete="off"> |
||||
|
<div data-ax-tbl> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>기간 검색</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" data-chained-datepicker="[name='enddate']" name="startdate" data-toggle="datepicker" value="<?=date('Y-m-d',strtotime('-1 month'))?>"> |
||||
</div> |
</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" name="enddate" data-toggle="datepicker" value="<?=date('Y-m-d')?>"> |
||||
</div> |
</div> |
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm">검색어 입력</label> |
|
||||
<div class="controls"> |
|
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>검색어 입력</div> |
||||
|
<div data-ax-td-wrap> |
||||
<select class="form-control form-control-inline" name="sc"> |
<select class="form-control form-control-inline" name="sc"> |
||||
<option value="userid" <?=$sc=='userid'?'selected':''?>>아이디</option>
|
<option value="userid" <?=$sc=='userid'?'selected':''?>>아이디</option>
|
||||
<option value="nickname" <?=$sc=='nickname'?'selected':''?>>닉네임</option>
|
<option value="nickname" <?=$sc=='nickname'?'selected':''?>>닉네임</option>
|
||||
<option value="idx" <?=$sc=='idx'?'selected':''?>>회원번호</option>
|
<option value="idx" <?=$sc=='idx'?'selected':''?>>회원번호</option>
|
||||
</select> |
</select> |
||||
<input class="form-control form-control-inline" name="st" value="<?=$st?>"> |
|
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
<div class="form-group"> |
|
||||
<label class="control-label control-label-sm"></label> |
|
||||
<div class="controls"> |
|
||||
<button class="btn btn-primary"><i class="fal fa-search"></i> 필터적용</button> |
|
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" name="st" value="<?=$st?>"> |
||||
|
</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<button class="btn btn-default btn-sm"><i class="fal fa-search"></i> 필터적용</button> |
||||
|
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
<?=form_close()?>
|
|
||||
|
|
||||
<div class="H10"></div> |
|
||||
<div class="grid"> |
|
||||
<table> |
|
||||
<thead> |
|
||||
<tr> |
|
||||
<th>일시</th> |
|
||||
<th>아이디</th> |
|
||||
<th>닉네임</th> |
|
||||
<th>브라우져</th> |
|
||||
<th>버젼</th> |
|
||||
<th>OS</th> |
|
||||
<th>모바일</th> |
|
||||
<th>접속 IP</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<?php foreach($log_list['list'] as $row) :?>
|
|
||||
<tr> |
|
||||
<td class="text-center"><?=$row['mlg_regtime']?></td>
|
|
||||
<td class="text-center"><?=$row['mem_userid']?></td>
|
|
||||
<td class="text-center"><?=$row['mem_nickname']?><?=display_member_menu($row['mem_idx'], "<i class='far fa-cog'></i>", $row['mem_status'])?></td>
|
|
||||
<td><?=$row['mlg_browser']?></td>
|
|
||||
<td><?=$row['mlg_version']?></td>
|
|
||||
<td><?=$row['mlg_platform']?></td>
|
|
||||
<td><?=$row['mlg_is_mobile']?></td>
|
|
||||
<td><?=long2ip($row['mlg_ip'])?></td>
|
|
||||
</tr> |
|
||||
<?php endforeach;?>
|
|
||||
</tbody> |
|
||||
</table> |
|
||||
</div> |
</div> |
||||
|
</form> |
||||
|
|
||||
<div class="H10"></div> |
|
||||
|
<div class="H10" data-fit-aside></div> |
||||
|
|
||||
<div class="ax-button-group ax-button-group-bottom"> |
|
||||
<div class="left"> |
|
||||
<?=$pagination?>
|
|
||||
</div> |
|
||||
|
<div class="grid-wrapper" data-fit-content> |
||||
|
<div id="grid-container" class="grid-wrapper"></div> |
||||
</div> |
</div> |
||||
|
|
||||
<div class="H30"></div> |
|
||||
|
<script> |
||||
|
var grid = new GRID('#grid-container', { |
||||
|
paging: { |
||||
|
pageSize:15 |
||||
|
}, |
||||
|
columns: [ |
||||
|
{caption:'순번', dataField:'nums', alignment:'right', width:80, dataType:'number', format:'fixedPoint'}, |
||||
|
{caption:'일시', dataField:'mlg_regtime', alignment:'center', width:160}, |
||||
|
{caption:'아이디', dataField:'mem_userid', alignment:'left', width:160}, |
||||
|
{caption:'이름', dataField:'mem_nickanem', alignment:'left', width:100}, |
||||
|
{caption:'브라우져', dataField:'mlg_browser', alignment:'left', width:80}, |
||||
|
{caption:'OS', dataField:'mlg_platform', alignment:'left', width:80}, |
||||
|
{caption:'모바일', dataField:'mlg_is_mobile', alignment:'center', width:60}, |
||||
|
{caption:'IP', dataField:'mlg_ip', alignment:'center', width:120}, |
||||
|
{caption:'', calculateCellValue:function(e) {return ''}} |
||||
|
], |
||||
|
dataSource: new DevExpress.data.DataSource({ |
||||
|
key : 'mlg_idx', |
||||
|
load: function(loadOptions) { |
||||
|
var d = $.Deferred(); |
||||
|
var params = grid.getSearchParam(loadOptions); |
||||
|
|
||||
|
$.ajax({ |
||||
|
url : base_url + '/admin/ajax/members/logs', |
||||
|
type: 'GET', |
||||
|
async: false, |
||||
|
cache: false, |
||||
|
data: params |
||||
|
}).done(function(res) { |
||||
|
d.resolve(res.lists, { |
||||
|
totalCount : res.totalCount |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
return d.promise(); |
||||
|
} |
||||
|
}), |
||||
|
}) |
||||
|
$(function() { |
||||
|
grid.init(); |
||||
|
}); |
||||
|
</script> |
@ -1,37 +1,109 @@ |
|||||
<div class="page-header"> |
|
||||
|
<div class="page-header" data-fit-aside> |
||||
<h2 class="page-title"><?=$this->site->config('point_name')?> 관리</h2>
|
<h2 class="page-title"><?=$this->site->config('point_name')?> 관리</h2>
|
||||
</div> |
</div> |
||||
|
|
||||
<div class="grid"> |
|
||||
<table> |
|
||||
<thead> |
|
||||
<tr> |
|
||||
<th class="W100">#</th>
|
|
||||
<th class="W150">일시</th> |
|
||||
<th class="W150">사용자</th> |
|
||||
<th class="W100"><?=$this->site->config('point_name')?></th>
|
|
||||
<th>내용</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
<?php foreach($list['list'] as $row) :?>
|
|
||||
<tr> |
|
||||
<td class="text-right"><?=number_format($row['nums'])?></td>
|
|
||||
<td class="text-center"><?=$row['mpo_regtime']?></td>
|
|
||||
<td class="text-center"><?=$row['mem_nickname']?><?=display_member_menu($row['mem_idx'], '<i class="far fa-cog"></i>', $row['mem_status'])?></td>
|
|
||||
<td class="text-right"><?=$row['mpo_value']>0?'+':''?><?=$row['mpo_value']?></td>
|
|
||||
<td><?=$row['mpo_description']?></td>
|
|
||||
</tr> |
|
||||
|
<form data-grid-search onsubmit="grid.refresh(1);return false;" data-fit-aside autocomplete="off"> |
||||
|
<div data-ax-tbl> |
||||
|
<div data-ax-tr> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label><?=$this->site->config('point_name')?> 유형</div>
|
||||
|
<div data-ax-td-wrap> |
||||
|
<select class="form-control form-control-inline" name="target_type"> |
||||
|
<option value="">전체보기</option> |
||||
|
<?php foreach($point_type as $key=>$val) :?>
|
||||
|
<option value="<?=$key?>" <?=$target_type==$key?'selected':''?>><?=$val?></option>
|
||||
<?php endforeach;?>
|
<?php endforeach;?>
|
||||
<?php if(count($list['list']) == 0) :?>
|
|
||||
<tr> |
|
||||
<td class="empty" colspan="5">검색된 내역이 없습니다.</td> |
|
||||
</tr> |
|
||||
<?php endif;?>
|
|
||||
</tbody> |
|
||||
</table> |
|
||||
|
</select> |
||||
</div> |
</div> |
||||
|
</div> |
||||
|
<div data-ax-td> |
||||
|
<div data-ax-td-label>기간검색</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" data-chained-datepicker="[name='enddate']" name="startdate" data-toggle="datepicker" value=""> |
||||
|
</div> |
||||
|
<div data-ax-td-wrap> |
||||
|
<input class="form-control" name="enddate" data-toggle="datepicker" value=""> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div data-ax-td class="W100"> |
||||
|
<div data-ax-td-wrap> |
||||
|
<button class="btn btn-default btn-sm"><i class="fal fa-search"></i> 필터적용</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</form> |
||||
|
|
||||
|
<div class="H10" data-fit-aside></div> |
||||
|
|
||||
<div class="text-center MT10"> |
|
||||
<?=$pagination?>
|
|
||||
|
<div class="grid-wrapper" data-fit-content> |
||||
|
<div class="grid-container" id="grid-container"></div> |
||||
</div> |
</div> |
||||
|
|
||||
|
<script> |
||||
|
var grid = new GRID('#grid-container', { |
||||
|
paging: { |
||||
|
pageSize: 20 |
||||
|
}, |
||||
|
columns: [ |
||||
|
{caption:'번호', dataField:'nums', alignment:'right', width:60, dataType:'number', format:'fixedPoint'}, |
||||
|
{caption:'일시', dataField:'reg_datetime', alignment:'center', width:120}, |
||||
|
{caption:'회원명', dataField:'mem_nickname', alignment:'center', width:80}, |
||||
|
{caption:'회원ID', dataField:'mem_userid', alignment:'left', width:180}, |
||||
|
{caption:'구분', dataField:'target_type', alignment:'center', width:120}, |
||||
|
{ |
||||
|
caption: '증가', name:'mpo_value_plus', dataField:'mpo_value', alignment:'right', dataType:'number', format:'fixedPoint', width:120, |
||||
|
calculateCellValue: function(cell) { |
||||
|
if(cell.mpo_flag == 1) return cell.mpo_value.numberFormat() |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
caption: '감소',name:'mpo_value_minus', dataField:'mpo_value', alignment:'right', dataType:'number', format:'fixedPoint', width:120, |
||||
|
calculateCellValue: function(cell) { |
||||
|
if(cell.mpo_flag == -1) return cell.mpo_value.numberFormat() |
||||
|
} |
||||
|
}, |
||||
|
{caption:'내용', dataField:'mpo_description', alignment:'left', minWidth:120}, |
||||
|
], |
||||
|
onCellPrepared: function(e) { |
||||
|
if(e.rowType == 'data') { |
||||
|
if(e.column.name == 'mpo_value_plus') { |
||||
|
e.cellElement.css("color", '#3498db'); |
||||
|
} |
||||
|
else if (e.column.name == 'mpo_value_minus') { |
||||
|
e.cellElement.css("color", '#e32815'); |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
onContextMenuPreparing: function(e) { |
||||
|
if (e.row.rowType === "data") { |
||||
|
e.items = APP.memberMenuObject(e, <?=$this->site->config('point_use')=='Y'?'"'.$this->site->config('point_name').'"':'false'?>);
|
||||
|
} |
||||
|
}, |
||||
|
dataSource: new DevExpress.data.DataSource({ |
||||
|
key : 'mpo_idx', |
||||
|
load: function(loadOptions) { |
||||
|
var d = $.Deferred(); |
||||
|
var params = grid.getSearchParam(loadOptions); |
||||
|
|
||||
|
$.ajax({ |
||||
|
url : base_url + '/admin/ajax/members/points', |
||||
|
type: 'GET', |
||||
|
async: false, |
||||
|
cache: false, |
||||
|
data: params |
||||
|
}).done(function(res) { |
||||
|
d.resolve(res.lists, { |
||||
|
totalCount : res.totalCount |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
return d.promise(); |
||||
|
} |
||||
|
}), |
||||
|
}); |
||||
|
|
||||
|
$(function() { |
||||
|
grid.init(); |
||||
|
}) |
||||
|
</script> |
@ -0,0 +1,41 @@ |
|||||
|
<form class="form-inline" autocomplete="off" method="get" accept-charset="UTF-8"> |
||||
|
<select class="form-control"> |
||||
|
<option value="title">질문제목</option> |
||||
|
<option value="name">질문자</option> |
||||
|
</select> |
||||
|
<input class="form-control" required> |
||||
|
<button class="btn btn-default"><i class="fal fa-search"></i> 검색하기</button> |
||||
|
</form> |
||||
|
<table class="table"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>순번</th> |
||||
|
<th>질문유형</th> |
||||
|
<th>질문제목</th> |
||||
|
<th>질문자</th> |
||||
|
<th>답변여부</th> |
||||
|
<th>작성일시</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<?php if(count($lists) == 0) :?>
|
||||
|
<tr> |
||||
|
<td colspan="5" class="text-center empty">등록된 질문이 없습니다.</td> |
||||
|
</tr> |
||||
|
<?php endif;?>
|
||||
|
<?php foreach($lists as $row):?>
|
||||
|
<tr> |
||||
|
<td class="text-right"><?=$row['nums']?></td>
|
||||
|
<td class="text-right"><?=$row['qnc_title']?></td>
|
||||
|
<td class="text-left"> |
||||
|
<a href="<?=base_url('customer/qna/'.$row['qna_idx'])?>"><i class="fal fa-lock"></i> <?=$row['qna_title']?></a>
|
||||
|
</td> |
||||
|
<td class="text-center"><?=$row['qna_name']?></td>
|
||||
|
<td class="text-center"><?=$row['is_answered']?'답변완료':'미답변'?></td>
|
||||
|
<td class="text-center"><?=$row['reg_datetime']?></td>
|
||||
|
</tr> |
||||
|
<?php endforeach;?>
|
||||
|
</tbody> |
||||
|
</table> |
||||
|
<div class="text-center"><?=$pagination?></div>
|
||||
|
<a href="<?=base_url('customer/qna/write')?>"><i class="fal fa-pencil"></i> 질문작성하기</a> |
@ -0,0 +1,39 @@ |
|||||
|
<?=form_open_multipart()?>
|
||||
|
<?=validation_errors('<p class="alert alert-danger">')?>
|
||||
|
|
||||
|
<?php if(! $this->member->is_login()) :?>
|
||||
|
<input placeholder="작성자" name="qna_name" required> |
||||
|
<input type="password" placeholder="비밀번호" name="qna_password" required> |
||||
|
<?php endif;?>
|
||||
|
|
||||
|
<input placeholder="연락처" data-regex="phone-number" name="qna_phone" value="<?=$this->member->info('phone')?>" required> |
||||
|
<input placeholder="E-mail" data-regex="email-address" name="qna_email" value="<?=$this->member->info('email')?>" required> |
||||
|
|
||||
|
<?php if(count($qna_category) > 0) :?>
|
||||
|
<select name="qnc_idx"> |
||||
|
<?php foreach($qna_category as $row):?>
|
||||
|
<option value="<?=$row['qnc_idx']?>"><?=$row['qnc_title']?></option>
|
||||
|
<?php endforeach;?>
|
||||
|
</select> |
||||
|
<?php endif;?>
|
||||
|
|
||||
|
<input placeholder="질문 제목" name="qna_title" required> |
||||
|
<textarea placeholder="질문 내용" name="qna_content" rows="10" required></textarea> |
||||
|
|
||||
|
<div data-container="file-input"></div> |
||||
|
<script id="tmpl-file-input" type="text/x-jquery-tmpl"> |
||||
|
<input type="file" name="userfile[]"> |
||||
|
</script> |
||||
|
<button type="button" data-button="add-file-input"><i class="fal fa-plus"></i> 파일 추가</button> |
||||
|
|
||||
|
<button>질문 등록하기</button> |
||||
|
|
||||
|
<?=form_close()?>
|
||||
|
|
||||
|
<script> |
||||
|
$(function() { |
||||
|
$('[data-button="add-file-input"]').click(function() { |
||||
|
$('[data-container="file-input"]').append( $('#tmpl-file-input').tmpl() ); |
||||
|
}); |
||||
|
}); |
||||
|
</script> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue