This commit is contained in:
Jaybe
2025-03-05 14:02:29 +09:00
commit 247a7808d3
357 changed files with 161196 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
<?=$this->extend('templates/front.php');?>
<!--타이틀-->
<?=$this->section('title');?>
ZENITH - 마이페이지
<?=$this->endSection();?>
<!--헤더-->
<?=$this->section('header');?>
<?=$this->endSection();?>
<!--바디-->
<?=$this->section('body');?>
<?=$this->endSection();?>
<!--컨텐츠영역-->
<?=$this->section('content');?>
<div class="sub-contents-wrap myPage-container">
<div class="title-area">
<h2 class="page-title">마이페이지</h2>
<p class="title-disc">혼자서는 작은 한 방울이지만 함께 모이면 바다를 이룬다.</p>
</div>
<main class="mt0">
<!-- <h1><?php echo $user->nickname?></h1> -->
<div class="row mt0">
<div>
<div class="card">
<div class="card-header bg-dark text-white">
<h3 class="card-title mb-0">Profile</h3>
</div>
<div class="card-body">
<?php if (session('error') !== null) : ?>
<div class="alert alert-danger" role="alert"><?= session('error') ?></div>
<?php elseif (session('errors') !== null) : ?>
<div class="alert alert-danger" role="alert">
<?php if (is_array(session('errors'))) : ?>
<?php foreach (session('errors') as $error) : ?>
<?= $error ?>
<br>
<?php endforeach ?>
<?php else : ?>
<?= session('errors') ?>
<?php endif ?>
</div>
<?php endif ?>
<?php if (session('message') !== null) : ?>
<div class="alert alert-success" role="alert"><?= session('message') ?></div>
<?php endif ?>
<form action="/mypage/update" method="post">
<?php if(!empty($user->nickname)) {?>
<dl>
<dt><span>이</span><span>름</span></dt>
<dd><?php echo $user->nickname?></dd>
</dl>
<?php } ?>
<dl>
<dt><span>아</span><span>이</span><span>디</span></dt>
<dd><?php echo $user->username?></dd>
</dl>
<dl>
<dt><span>이</span><span>메</span><span>일</span></dt>
<dd><?php echo $user->getEmail()?></dd>
</dl>
<dl>
<dt><span>기</span><span>존</span><span>비</span><span>밀</span><span>번</span><span>호</span></dt>
<dd><input type="password" class="form-control" name="old_password" placeholder="<?= lang('Auth.old_password') ?>"
value="" /></dd>
</dl>
<dl>
<dt><span>신</span><span>규</span><span>비</span><span>밀</span><span>번</span><span>호</span></dt>
<dd><input type="password" class="form-control" name="password" placeholder="<?= lang('Auth.password') ?>"
value="" /></dd>
</dl>
<dl>
<dt><span>비</span><span>밀</span><span>번</span><span>호</span><span>확</span><span>인</span></dt>
<dd><input type="password" class="form-control" name="password_confirm" placeholder="<?= lang('Auth.passwordConfirm') ?>"
value="" /></dd>
</dl>
<button type="submit" class="btn btn-primary">등록</button>
</form>
</div>
</div>
</div>
</div>
</main>
</div>
<?=$this->endSection();?>
<?=$this->section('script');?>
<script>
</script>
<?=$this->endSection();?>
<!--푸터-->
<?=$this->section('footer');?>
<?=$this->endSection();?>
+471
View File
@@ -0,0 +1,471 @@
<?=$this->extend('templates/front.php');?>
<!--타이틀-->
<?=$this->section('title');?>
ZENITH - 회원 관리
<?=$this->endSection();?>
<!--헤더-->
<?=$this->section('header');?>
<link href="/static/css/datatables.css" rel="stylesheet">
<link href="/static/node_modules/datatables.net-bs5/css/dataTables.bootstrap5.min.css" rel="stylesheet">
<link href="/static/node_modules/datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css" rel="stylesheet">
<link href="/static/node_modules/datatables.net-select-bs5/css/select.bootstrap5.min.css" rel="stylesheet">
<link href="/static/node_modules/datatables.net-staterestore-bs5/css/stateRestore.bootstrap5.min.css" rel="stylesheet">
<script src="/static/node_modules/datatables.net/js/dataTables.min.js"></script>
<script src="/static/node_modules/datatables.net-bs5/js/dataTables.bootstrap5.min.js"></script>
<script src="/static/node_modules/datatables.net-buttons/js/dataTables.buttons.min.js"></script>
<script src="/static/node_modules/datatables.net-buttons-bs5/js/buttons.bootstrap5.min.js"></script>
<style>
.ui-autocomplete{
z-index: 10000000;
max-height: 300px;
overflow-y: auto; /* prevent horizontal scrollbar */
overflow-x: hidden;
}
hr{
display: block !important;
}
.ui-widget{
font-family: "NanumSquareNeo", "Noto Sans", dotum, Gulim, sans-serif;
}
</style>
<?=$this->endSection();?>
<!--바디-->
<?=$this->section('body');?>
<?=$this->endSection();?>
<!--컨텐츠영역-->
<?=$this->section('content');?>
<div class="sub-contents-wrap db-manage-contaniner">
<div class="title-area">
<h2 class="page-title">회원 관리</h2>
<!-- <p class="title-disc">혼자서는 작은 한 방울이지만 함께 모이면 바다를 이룬다.</p> -->
</div>
<div class="search-wrap">
<form name="search-form" class="search d-flex justify-content-center">
<div class="input">
<input type="text" name="stx" id="stx" placeholder="검색어를 입력하세요">
<button class="btn-primary" id="search_btn" type="submit">조회</button>
</div>
</form>
</div>
<div class="position-relative">
<div class="row table-responsive">
<table class="dataTable table table-striped table-hover table-default" id="userTable">
<thead class="table-dark">
<tr>
<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">생성일</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<!--사용자 수정-->
<div class="modal fade" id="user-show" tabindex="-1" aria-labelledby="user-show-label" aria-hidden="true">
<div class="modal-dialog modal-lg sm-txt">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title" id="user-show-label"><i class="bi bi-file-text"></i> <span class="title">회원 관리</span></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="table-responsive">
<form name="user-show-form" id="userForm">
<input type="hidden" name="user_id" value="">
<h2 class="body-title">회원정보 수정</h2>
<table class="table table-bordered table-left-header">
<colgroup>
<col style="width:30%;">
<col style="width:70%;">
</colgroup>
<tbody>
<tr>
<th scope="row">소속</th>
<td id="userBelong">
<input type="text" name="company_name" class="form-control" id="belongCompany" placeholder="광고주/광고대행사 검색">
</td>
</tr>
<tr>
<th scope="row">아이디</th>
<td id="usernameText"></td>
</tr>
<tr>
<th scope="row">이메일</th>
<td id="emailText"></td>
</tr>
<tr>
<th scope="row">상태</th>
<td id="userStatus">
<select class="form-select" aria-label="상태 선택" name="active">
<option selected hidden disabled>-선택-</option>
<option value="1">활성</option>
<option value="0">비활성</option>
</select>
</td>
</tr>
<tr>
<th scope="row">권한</th>
<td id="userGroup" class="userGroup">
<div class="inner">
<div class="form-check form-check-inline">
<input type="checkbox" name="group[]" value="admin" class="form-check-input" id="admin">
<label for="admin" class="form-check-label">관리자</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="group[]" value="developer" class="form-check-input" id="developer">
<label for="developer" class="form-check-label">개발자</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="group[]" value="user" class="form-check-input" id="userCheck">
<label for="userCheck" class="form-check-label">직원</label>
</div>
</div>
<div class="inner">
<div class="form-check form-check-inline">
<input type="checkbox" name="group[]" value="agency" class="form-check-input" id="agency">
<label for="agency" class="form-check-label">광고대행사</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="group[]" value="advertiser" class="form-check-input" id="advertiser">
<label for="advertiser" class="form-check-label">광고주</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="group[]" value="guest" class="form-check-input" id="guest">
<label for="guest" class="form-check-label">게스트</label>
</div>
</div>
</td>
</tr>
<tr>
<th scope="row">세부권한</th>
<td id="userPermission" class="userPermission">
<p class="user-title-db">통합DB관리</p>
<div class="inner">
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="integrate.status" class="form-check-input" id="adminAccess">
<label for="adminAccess" class="form-check-label">인정기준 변경</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="integrate.advertiser" class="form-check-input" id="intergrateAdvertiser">
<label for="intergrateAdvertiser" class="form-check-label">광고주 노출</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="integrate.media" class="form-check-input" id="intergrateMedia">
<label for="intergrateMedia" class="form-check-label">매체 노출</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="integrate.description" class="form-check-input" id="intergrateDescription">
<label for="intergrateDescription" class="form-check-label">구분 노출</label>
</div>
</div>
<!-- <div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="admin.access" class="form-check-input" id="adminAccess">
<label for="adminAccess" class="form-check-label">관리자만 가능한 페이지 접근 가능</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="admin.settings" class="form-check-input" id="adminSettings">
<label for="adminSettings" class="form-check-label">관리자만 가능한 설정 접근 가능</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="users.create" class="form-check-input" id="usersCreate">
<label for="usersCreate" class="form-check-label">회원 생성</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="users.edit" class="form-check-input" id="usersEdit">
<label for="usersEdit" class="form-check-label">회원 수정</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="users.delete" class="form-check-input" id="usersDelete">
<label for="usersDelete" class="form-check-label">회원 삭제</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="agency.access" class="form-check-input" id="agencyAccess">
<label for="agencyAccess" class="form-check-label">대행사 목록 페이지</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="agency.advertisers" class="form-check-input" id="agencyAdvertisers">
<label for="agencyAdvertisers" class="form-check-label">대행사 하위 광고주 관리</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="agency.create" class="form-check-input" id="agencyCreate">
<label for="agencyCreate" class="form-check-label">대행사 생성</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="agency.edit" class="form-check-input" id="agencyEdit">
<label for="agencyEdit" class="form-check-label">대행사 수정</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="agency.delete" class="form-check-input" id="agencyDelete">
<label for="agencyDelete" class="form-check-label">대행사 삭제</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="advertiser.access" class="form-check-input" id="advertiserAccess">
<label for="advertiserAccess" class="form-check-label">광고주 목록 페이지</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="advertiser.create" class="form-check-input" id="advertiserCreate">
<label for="advertiserCreate" class="form-check-label">광고주 생성</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="advertiser.edit" class="form-check-input" id="advertiserEdit">
<label for="advertiserEdit" class="form-check-label">광고주 수정</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" name="permission[]" value="advertiser.delete" class="form-check-input" id="advertiserDelete">
<label for="advertiserDelete" class="form-check-label">광고주 삭제</label>
</div> -->
</td>
</tr>
<tr>
<th scope="row">생성일</th>
<td id="userCreatedAt"></td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary" id="userModifyBtn" form="userForm">수정</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">취소</button>
</div>
</div>
</div>
</div>
</div>
</div>
<?=$this->endSection();?>
<?=$this->section('script');?>
<script>
let data = {};
let dataTable;
getUserList();
function setData() {
data = {
'stx': $('#stx').val(),
};
return data;
}
function getUserList(){
dataTable = $('#userTable').DataTable({
"fixedHeader": true,
"autoWidth": true,
"order": [[7, 'desc']],
"processing" : true,
"serverSide" : true,
"responsive": true,
"searching": false,
"ordering": true,
"scrollX": true,
"scrollCollapse": true,
"deferRender": false,
"rowId": "user_id",
"lengthMenu": [
[ 25, 10, 50, -1 ],
[ '25개', '10개', '50개', '전체' ]
],
"ajax": {
"url": "<?=base_url()?>/user/get-users",
"data": function(d) {
d.searchData = setData();
},
"type": "GET",
"contentType": "application/json",
"dataType": "json",
},
"columnDefs": [
{ targets: [0], orderable: false},
],
"columns": [
{ "data": null },
{ "data": "belong" },
{ "data": "username"},
{ "data": "nickname"},
{ "data": "email" },
{ "data": "active" },
{ "data": "groups" },
{
"data": "created_at",
"render": function(data){
return data.substr(0, 10);
}
},
],
"createdRow": function(row, data, dataIndex) {
$(row).attr("data-bs-toggle", "modal");
$(row).attr("data-bs-target", "#user-show");
},
"language": {
url: '//cdn.datatables.net/plug-ins/1.13.4/i18n/ko.json',
},
"rowCallback": function(row, data, index) {
var api = this.api();
var totalRecords = api.page.info().recordsTotal;
var pageSize = api.page.len();
var currentPage = api.page();
var totalPages = Math.ceil(totalRecords / pageSize);
var seqNumber = totalRecords - (currentPage * pageSize) - index; // 계산된 순번 (내림차순)
$('td:eq(0)', row).html(seqNumber);
},
"infoCallback": function(settings, start, end, max, total, pre){
return "<i class='bi bi-check-square'></i>현재" + "<span class='now'>" +start +" - " + end + "</span>" + " / " + "<span class='total'>" + total + "</span>" + "건";
},
});
}
function getSearchCompanies(){
$('#belongCompany').autocomplete({
source : function(request, response) {
$.ajax({
url : "/company/get-search-companies",
type : "GET",
dataType: "JSON",
data : {'stx': request.term},
contentType: 'application/json; charset=utf-8',
success : function(data){
response(
$.map(data, function(item) {
return {
label: item.name,
value: item.name,
id: item.id
};
})
);
}
,error : function(){
alert("에러 발생");
}
});
},
focus : function(event, ui) {
return false;
},
minLength: 1,
autoFocus : true,
delay: 100
});
}
function setUserShow(data) {
$('#user-show #userBelong input[name="user_id"]').val(data.user_id);
$('#user-show #userBelong input[name="company_name"]').val(data.belong);
$('#user-show #usernameText').text(data.username);
$('#user-show #emailText').text(data.email);
$('#user-show #userCreatedAt').text(data.created_at);
$('#user-show table .dp_info').remove();
if(typeof data.division == 'string') {
var html = "";
html += `<tr class="dp_info"><th>이름</th><td>${data.nickname}</td></tr>`;
html += `<tr class="dp_info"><th>직급</th><td>${data.position}</td></tr>`;
html += `<tr class="dp_info"><th>부서</th><td>${data.division}</td></tr>`;
html += `<tr class="dp_info"><th>팀</th><td>${data.team}</td></tr>`;
$('#user-show table tr:eq(2)').after(html);
}
$('#user-show #userStatus select').val(data.active);
data.groups.forEach(function(value) {
if(value === 'superadmin'){
$("#userGroup").prepend('<div class="form-check-inline" id="groupHide">최고관리자</div>');
}
$("#userGroup input[value='" + value + "']").prop("checked", true);
});
data.permissions.forEach(function(value) {
$("#userPermission input[value='" + value + "']").prop("checked", true);
});
}
function updateUser(data){
$.ajax({
url : "/company/set-user",
type : "PUT",
dataType: "JSON",
data : data,
contentType: 'application/json; charset=utf-8',
success : function(data){
if(data == true){
dataTable.draw();
alert("변경되었습니다.");
$('#user-show').modal('hide');
}
}
,error : function(error){
var errorMessages = error.responseJSON.messages;
var firstErrorMessage = Object.values(errorMessages)[0];
alert(firstErrorMessage);
}
});
}
$('#user-show').on('show.bs.modal', function(e) {
var $btn = $(e.relatedTarget);
var id = $btn.attr('id');
$('input[name="user_id"]').val(id);
$.ajax({
type: "get",
url: "<?=base_url()?>/user/get-user",
data: {'user_id': id},
dataType: "json",
contentType: 'application/json; charset=utf-8',
success: function(data){
setUserShow(data);
},
error: function(error, status, msg){
alert("상태코드 " + status + "에러메시지" + msg );
}
});
})
.on('hidden.bs.modal', function(e) { //modal Reset
$('input[name="user_id"]').val('');
$('form[name="user-show-form"]')[0].reset();
$('#user-show #usernameText').text('');
$('#user-show #emailText').text('');
$('#user-show #userCreatdeAt').text('');
$('.dp_info td').text('');
$('#groupHide').remove();
});
$('#belongCompany').on("focus", function(){
getSearchCompanies();
})
$('form[name="search-form"]').bind('submit', function() {
dataTable.draw();
return false;
});
$('form[name="user-show-form"]').bind('submit', function() {
var data = $(this).serialize();
updateUser(data);
return false;
});
</script>
<?=$this->endSection();?>
<!--푸터-->
<?=$this->section('footer');?>
<?=$this->endSection();?>