dbmsv4 init...4

This commit is contained in:
최준흠 2026-01-05 16:10:03 +09:00
parent 7083471fbb
commit daf9e0a894
27 changed files with 704 additions and 472 deletions

View File

@ -35,11 +35,11 @@ defined('COMPOSER_PATH') || define('COMPOSER_PATH', ROOTPATH . 'vendor/autoload.
*/
defined('SECOND') || define('SECOND', 1);
defined('MINUTE') || define('MINUTE', 60);
defined('HOUR') || define('HOUR', 3600);
defined('DAY') || define('DAY', 86400);
defined('WEEK') || define('WEEK', 604800);
defined('MONTH') || define('MONTH', 2_592_000);
defined('YEAR') || define('YEAR', 31_536_000);
defined('HOUR') || define('HOUR', 3600);
defined('DAY') || define('DAY', 86400);
defined('WEEK') || define('WEEK', 604800);
defined('MONTH') || define('MONTH', 2_592_000);
defined('YEAR') || define('YEAR', 31_536_000);
defined('DECADE') || define('DECADE', 315_360_000);
/*
@ -67,25 +67,25 @@ defined('DECADE') || define('DECADE', 315_360_000);
| http://tldp.org/LDP/abs/html/exitcodes.html
|
*/
defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors
defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error
defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error
defined('EXIT_UNKNOWN_FILE') || define('EXIT_UNKNOWN_FILE', 4); // file not found
defined('EXIT_UNKNOWN_CLASS') || define('EXIT_UNKNOWN_CLASS', 5); // unknown class
defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors
defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error
defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error
defined('EXIT_UNKNOWN_FILE') || define('EXIT_UNKNOWN_FILE', 4); // file not found
defined('EXIT_UNKNOWN_CLASS') || define('EXIT_UNKNOWN_CLASS', 5); // unknown class
defined('EXIT_UNKNOWN_METHOD') || define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
defined('EXIT_USER_INPUT') || define('EXIT_USER_INPUT', 7); // invalid user input
defined('EXIT_DATABASE') || define('EXIT_DATABASE', 8); // database error
defined('EXIT__AUTO_MIN') || define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
defined('EXIT__AUTO_MAX') || define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code
defined('EXIT_USER_INPUT') || define('EXIT_USER_INPUT', 7); // invalid user input
defined('EXIT_DATABASE') || define('EXIT_DATABASE', 8); // database error
defined('EXIT__AUTO_MIN') || define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
defined('EXIT__AUTO_MAX') || define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code
define('MESSAGES', [
'CREATED' => '생성되었습니다.',
'UPDATED' => '수정되였습니다.',
'DELETED' => '삭제되였습니다.',
'SUCCESS' => '작업이 성공적으로 완료되었습니다.',
'FAILED' => '작업이 실패하였습니다.',
'SUCCESS' => '작업이 성공적으로 완료되었습니다.',
'FAILED' => '작업이 실패하였습니다.',
'NOT_FOUND' => '데이터가 존재하지 않습니다.',
'NOT_AUTH' => '권한이 없습니다.',
'NOT_AUTH' => '권한이 없습니다.',
'NOT_LOGIN' => '로그인이 필요합니다.',
'NOT_MATCH' => '데이터가 일치하지 않습니다.',
'NOT_EMPTY' => '데이터가 비어있습니다.',
@ -121,258 +121,161 @@ define('SESSION_NAMES', [
define("MESSENGERS", [
"skype" => [
"url" => "//join.skype.com/invite/uKUgXfZThSQC",
"icon" => '<img src="/images/common/top_skype.png" alt="스카이프">',
"icon" => 'SKYPE',
"id" => '',
],
"discord" => [
"url" => "//discord.gg/k6nQg84N",
"icon" => '<img src="/images/common/discord.png" alt="디스코드">',
"icon" => 'DISCORD',
"id" => '',
],
"telegram" => [
"url" => "//t.me/daemonidc",
"icon" => '<img src="/images/common/telegram.png" alt="텔레그램">',
"icon" => 'TELEGRAM',
"id" => '@daemonidc',
],
"kakaotalk" => [
"url" => "//t.me/daemonidc",
"icon" => '<img src="/images/common/kakaotalk.png" alt="카카오톡">',
"icon" => 'KAKAO',
"id" => '',
],
]);
//아이콘 및 Sound관련
define('ICONS', [
'ADD' => '<i class="bi bi-plus-circle"></i>',
'LOGO' => '<img src="/images/logo/android-icon-48x48.png">',
'EXCEL' => '<img src="/images/common/excel.png"/>',
'PDF' => '<img src="/images/common/pdf.png"/>',
'GOOGLE' => '<img src="https://www.google.com/favicon.ico" alt="Google" width="20" height="20" class="me-2">',
'MEMBER' => '<i class="bi bi-people"></i>',
'LOGIN' => '<i class="bi bi-shield-check"></i>',
'LOGOUT' => '<i class="bi bi-sign-stop-fill"></i>',
'HOME' => '<i class="bi bi-house"></i>',
'MENU' => '<i class="bi bi-menu-button"></i>',
'NEW' => '<i class="bi bi-database-add"></i>',
'REPLY' => '<i class="bi bi-arrow-return-right"></i>',
'DATABASE' => '<i class="bi bi-database"></i>',
'DISLIKE' => '<i class="bi bi-hand-thumbs-down"></i>',
'LIKE' => '<i class="bi bi-hand-thumbs-up"></i>',
'DOWNLOAD' => '<i class="bi bi-download"></i>',
'UPLOAD' => '<i class="bi bi-upload"></i>',
'COPY' => '<i class="bi bi-files"></i>',
'PASTE' => '<i class="bi bi-clipboard"></i>',
'EDIT' => '<i class="bi bi-pencil-square"></i>',
'VIEW' => '<i class="bi bi-eye"></i>',
'VIEW_OFF' => '<i class="bi bi-eye-slash"></i>',
'PRINT' => '<i class="bi bi-printer"></i>',
'SAVE' => '<i class="bi bi-save"></i>',
'CANCEL' => '<i class="bi bi-x-circle"></i>',
'CLOSE' => '<i class="bi bi-x-circle-fill"></i>',
'CLIENT' => '<i class="bi bi-person-circle"></i>',
'CHART' => '<i class="bi bi-bar-chart"></i>',
'CHECK' => '<i class="bi bi-check-circle"></i>',
'CHECK_OFF' => '<i class="bi bi-check-circle-fill"></i>',
'CHECK_ON' => '<i class="bi bi-check2-circle"></i>',
'CHECK_ALL' => '<i class="bi bi-check-all"></i>',
'CHECK_NONE' => '<i class="bi bi-check2"></i>',
'CHECK_SOME' => '<i class="bi bi-check2-square"></i>',
'COUPON' => '<i class="bi bi-ticket-perforated"></i>',
'HISTORY' => '<i class="bi bi-clock-history"></i>',
'MODIFY' => '<i class="bi bi-pencil-square"></i>',
'MODIFY_ALL' => '<i class="bi bi-pencil-square"></i>',
'BATCHJOB' => '<i class="bi bi-clipboard-data"></i>',
'DELETE' => '<i class="bi bi-trash"></i>',
'REBOOT' => '🔄',
'RELOAD' => '<i class="bi bi-bootstrap-reboot"></i>',
'SETUP' => '<i class="bi bi-gear"></i>',
'FLAG' => '<i class="bi bi-send"></i>',
'SEARCH' => '<i class="bi bi-search"></i>',
'PLAY' => '<i class="bi bi-play-fill"></i>',
'CART' => '<i class="bi bi-cart4"></i>',
'CARD' => '<i class="bi bi-credit-card"></i>',
'DEPOSIT' => '<i class="bi bi-cash-coin"></i>',
'DESKTOP' => '<i class="bi bi-pc-display-horizontal"></i>',
'DEVICE' => '<i class="bi bi-device-hdd"></i>',
'UP' => '<i class="bi bi-arrow-up"></i>',
'DOWN' => '<i class="bi bi-arrow-down"></i>',
'LEFT' => '<i class="bi bi-arrow-left"></i>',
'RIGHT' => '<i class="bi bi-arrow-right"></i>',
'IMAGE_FILE' => '<i class="bi bi-file-earmark-image"></i>',
'CLOUD' => '<i class="bi bi-cloud"></i>',
'SIGNPOST' => '<i class="bi bi-signpost"></i>',
'LOCK' => '<i class="bi bi-lock"></i>',
'UNLOCK' => '<i class="bi bi-unlock"></i>',
'BOX' => '<i class="bi bi-box"></i>',
'BOXS' => '<i class="bi bi-boxes"></i>',
'ONETIME' => '<i class="bi bi-1-circle-fill text-warning"></i>',
'MONTH' => '<i class="bi bi-calendar-check text-warning"></i>',
'EMAIL' => '<i class="bi bi-mailbox"></i>',
'MAIL' => '<i class="bi bi-envelope"></i>',
'PHONE' => '<i class="bi bi-phone"></i>',
'POINT' => '<i class="bi bi-coin"></i>',
'ALRAM' => '<i class="bi bi-bell"></i>',
'PAYMENT' => '<i class="bi bi-credit-card-2-back"></i>',
'LINK' => '<i class="bi bi-link-45deg"></i>',
'SALE_UP' => '<i class="bi bi-graph-up-arrow"></i>',
'SALE_DOWN' => '<i class="bi bi-graph-down-arrow"></i>',
'SERVICE' => '<i class="bi bi-gear-wide-connected"></i>',
'SERVICE_ITEM' => '<i class="bi bi-gear-wide-connected"></i>',
'SERVICE_ITEM_LINE' => '<i class="bi bi-chat-left-text"></i>',
'SERVICE_ITEM_IP' => '<i class="bi bi-globe"></i>',
'SERVICE_ITEM_SERVER' => '<i class="bi bi-server"></i>',
'SERVICE_ITEM_CPU' => '<i class="bi bi-cpu"></i>',
'SERVICE_ITEM_RAM' => '<i class="bi bi-memory"></i>',
'SERVICE_ITEM_STORAGE' => '<i class="bi bi-hdd-stack"></i>',
'SERVICE_ITEM_SOFTWARE' => '<i class="bi bi-box-seam"></i>',
'SERVICE_ITEM_DEFENCE' => '<i class="bi bi-shield-lock"></i>',
'SERVICE_ITEM_DOMAIN' => '<i class="bi bi-globe2"></i>',
'SERVICE_ITEM_OTHER' => '<i class="bi bi-gear-wide-connected"></i>',
'SERVER_ITEM_CPU' => '<i class="bi bi-cpu"></i>',
'SERVER_ITEM_RAM' => '<i class="bi bi-memory"></i>',
'SERVER_ITEM_DISK' => '<i class="bi bi-device-hdd"></i>',
'SERVER_ITEM_SWITCH' => '<i class="bi bi-diagram-3"></i>',
'SERVER_ITEM_OS' => '<i class="bi bi-microsoft"></i>',
'SERVER_ITEM_DB' => '<i class="bi bi-database"></i>',
'SERVER_ITEM_SOFTWARE' => '<i class="bi bi-window-sidebar"></i>',
'SERVER_ITEM_IP' => '<i class="bi bi-globe2"></i>',
'SERVER_ITEM_CS' => '<i class="bi bi-shield-check"></i>',
'SERVER_ITEM_ETC' => '<i class="bi bi-patch-question"></i>',
'ADD' => 'ADD',
'LOGO' => 'LOGO',
'EXCEL' => 'EXCEL',
'PDF' => 'PDF',
'GOOGLE' => 'GOOGLE',
'MEMBER' => 'MEMBER',
'LOGIN' => 'LOGIN',
'LOGOUT' => 'LOGOUT',
'HOME' => 'HOME',
'MENU' => 'MENU',
'NEW' => 'NEW',
'REPLY' => 'REPLY',
'DATABASE' => 'DATABASE',
'DISLIKE' => 'DISLIKE',
'LIKE' => 'LIKE',
'DOWNLOAD' => 'DOWNLOAD',
'UPLOAD' => 'UPLOAD',
'COPY' => 'COPY',
'PASTE' => 'PASTE',
'EDIT' => 'EDIT',
'VIEW' => 'VIEW',
'VIEW_OFF' => 'VIEW_OFF',
'PRINT' => 'PRINT',
'SAVE' => 'SAVE',
'CANCEL' => 'CANCEL',
'CLOSE' => 'CLOSE',
'CLIENT' => 'CLIENT',
'CHART' => 'CHART',
'CHECK' => 'CHECK',
'CHECK_OFF' => 'CHECK_OFF',
'CHECK_ON' => 'CHECK_ON',
'CHECK_ALL' => 'CHECK_ALL',
'CHECK_NONE' => 'CHECK_NONE',
'CHECK_SOME' => 'CHECK_SOME',
'COUPON' => 'COUPON',
'HISTORY' => 'HISTORY',
'MODIFY' => 'MODIFY',
'MODIFY_ALL' => 'MODIFY_ALL',
'BATCHJOB' => 'BATCHJOB',
'DELETE' => 'DELETE',
'REBOOT' => 'REBOOT',
'RELOAD' => 'RELOAD',
'SETUP' => 'SETUP',
'FLAG' => 'FLAG',
'SEARCH' => 'SEARCH',
'PLAY' => 'PLAY',
'CART' => 'CART',
'CARD' => 'CARD',
'DEPOSIT' => 'DEPOSIT',
'DESKTOP' => 'DESKTOP',
'DEVICE' => 'DEVICE',
'UP' => 'UP',
'DOWN' => 'DOWN',
'LEFT' => 'LEFT',
'RIGHT' => 'RIGHT',
'IMAGE_FILE' => 'IMAGE_FILE',
'CLOUD' => 'CLOUD',
'SIGNPOST' => 'SIGNPOST',
'LOCK' => 'LOCK',
'UNLOCK' => 'UNLOCK',
'BOX' => 'BOX',
'BOXS' => 'BOXS',
'ONETIME' => 'ONETIME',
'MONTH' => 'MONTH',
'EMAIL' => 'EMAIL',
'MAIL' => 'MAIL',
'PHONE' => 'PHONE',
'POINT' => 'POINT',
'ALRAM' => 'ALRAM',
'PAYMENT' => 'PAYMENT',
'LINK' => 'LINK',
'SALE_UP' => 'SALE_UP',
'SALE_DOWN' => 'SALE_DOWN',
'SERVICE' => 'SERVICE',
'SERVICE_ITEM' => 'SERVICE_ITEM',
'SERVICE_ITEM_LINE' => 'SERVICE_ITEM_LINE',
'SERVICE_ITEM_IP' => 'SERVICE_ITEM_IP',
'SERVICE_ITEM_SERVER' => 'SERVICE_ITEM_SERVER',
'SERVICE_ITEM_CPU' => 'SERVICE_ITEM_CPU',
'SERVICE_ITEM_RAM' => 'SERVICE_ITEM_RAM',
'SERVICE_ITEM_STORAGE' => 'SERVICE_ITEM_STORAGE',
'SERVICE_ITEM_SOFTWARE' => 'SERVICE_ITEM_SOFTWARE',
'SERVICE_ITEM_DEFENCE' => 'SERVICE_ITEM_DEFENCE',
'SERVICE_ITEM_DOMAIN' => 'SERVICE_ITEM_DOMAIN',
'SERVICE_ITEM_OTHER' => 'SERVICE_ITEM_OTHER',
'SERVER_ITEM_CPU' => 'SERVER_ITEM_CPU',
'SERVER_ITEM_RAM' => 'SERVER_ITEM_RAM',
'SERVER_ITEM_DISK' => 'SERVER_ITEM_DISK',
'SERVER_ITEM_SWITCH' => 'SERVER_ITEM_SWITCH',
'SERVER_ITEM_OS' => 'SERVER_ITEM_OS',
'SERVER_ITEM_DB' => 'SERVER_ITEM_DB',
'SERVER_ITEM_SOFTWARE' => 'SERVER_ITEM_SOFTWARE',
'SERVER_ITEM_IP' => 'SERVER_ITEM_IP',
'SERVER_ITEM_CS' => 'SERVER_ITEM_CS',
'SERVER_ITEM_ETC' => 'SERVER_ITEM_ETC',
]);
//메신저 아이콘
define('MESSENGER_ICONS', [
'WHATSAPP' => '<i class="bi bi-whatsapp"></i>',
'VIBER' => '<i class="bi bi-viber"></i>',
'LINE' => '<i class="bi bi-chat-left-text"></i>',
'KAKAO' => '<i class="bi bi-chat-left-text"></i>',
'DISCORD' => '<i class="bi bi-discord"></i>',
'TELEGRAM' => '<i class="bi bi-telegram"></i>',
'SKYPE' => '<i class="bi bi-skype"></i>',
'YOUTUBE' => '<i class="bi bi-youtube"></i>',
'FACEBOOK' => '<i class="bi bi-facebook"></i>',
'TWITTER' => '<i class="bi bi-twitter"></i>',
'INSTAGRAM' => '<i class="bi bi-instagram"></i>',
'LINKEDIN' => '<i class="bi bi-linkedin"></i>',
'GITHUB' => '<i class="bi bi-github"></i>',
'GITLAB' => '<i class="bi bi-gitlab"></i>',
'BITBUCKET' => '<i class="bi bi-bitbucket"></i>',
'REDDIT' => '<i class="bi bi-reddit"></i>',
'TIKTOK' => '<i class="bi bi-tiktok"></i>',
'PINTEREST' => '<i class="bi bi-pinterest"></i>',
'TUMBLR' => '<i class="bi bi-tumblr"></i>',
'SNAPCHAT' => '<i class="bi bi-snapchat"></i>',
'WHATSAPP' => 'WHATSAPP',
'VIBER' => 'VIBER',
'LINE' => 'LINE',
'KAKAO' => 'KAKAO',
'DISCORD' => 'DISCORD',
'TELEGRAM' => 'TELEGRAM',
'SKYPE' => 'SKYPE',
'YOUTUBE' => 'YOUTUBE',
'FACEBOOK' => 'FACEBOOK',
'TWITTER' => 'TWITTER',
'INSTAGRAM' => 'INSTAGRAM',
'LINKEDIN' => 'LINKEDIN',
'GITHUB' => 'GITHUB',
'GITLAB' => 'GITLAB',
'BITBUCKET' => 'BITBUCKET',
'REDDIT' => 'REDDIT',
'TIKTOK' => 'TIKTOK',
'PINTEREST' => 'PINTEREST',
'TUMBLR' => 'TUMBLR',
'SNAPCHAT' => 'SNAPCHAT',
]);
//배너관련
//배너관련 (경로만 유지)
define('TOP_BANNER', [
'default' => '<img src="/images/banner/sub_visual1.jpg"/>',
'aboutus' => '<img src="/images/banner/sub_visual1.jpg"/>',
'member' => '<img src="/images/banner/sub_visual1.jpg"/>',
'hosting' => '<img src="/images/banner/sub_visual2.jpg"/>',
'serverdevice' => '<img src="/images/banner/sub_visual3.jpg"/>',
'service' => '<img src="/images/banner/sub_visual3.jpg"/>',
'support' => '<img src="/images/banner/sub_visual4.jpg"/>',
'default' => '/images/banner/sub_visual1.jpg',
'aboutus' => '/images/banner/sub_visual1.jpg',
'member' => '/images/banner/sub_visual1.jpg',
'hosting' => '/images/banner/sub_visual2.jpg',
'serverdevice' => '/images/banner/sub_visual3.jpg',
'service' => '/images/banner/sub_visual3.jpg',
'support' => '/images/banner/sub_visual4.jpg',
]);
//소리관련
define('AUDIOS', [
'Alram_GetEmail' => '<object width=0 height=0 data="/sound/jarvis_email.mp3" type="audio/mpeg"></object>',
]);
//Layout관련
define('KEYWORD', '일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버 가상서버');
define('LAYOUTS', [
'auth' => [
'title' => KEYWORD,
'path' => 'auth',
'layout' => 'layouts' . DIRECTORY_SEPARATOR . 'auth',
'template' => 'templates' . DIRECTORY_SEPARATOR . 'auth',
'metas' => [
'<meta charset="UTF-8">',
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
'<meta http-equiv="X-UA-Compatible" content="IE=Edge">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . KEYWORD . '">',
'<meta name="keywords" content="' . KEYWORD . '">',
'<meta property="og:type" content="website">',
'<meta property="og:title" content="Daemon IDC">',
'<meta property="og:description" content="' . KEYWORD . '">',
],
'stylesheets' => [
'<link rel="icon" href="/favicon.ico">',
'<link href="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">',
'<link rel="stylesheet" href="/css/common/style.css" />',
],
'javascripts' => [
'<script src="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>',
],
'footerScripts' => []
],
'front' => [
'title' => KEYWORD,
'path' => 'front',
'layout' => 'layouts' . DIRECTORY_SEPARATOR . 'front',
'template' => 'templates' . DIRECTORY_SEPARATOR . 'front',
'topmenus' => ['aboutus', 'hosting', 'service', 'support'],
'metas' => [
'<meta charset="UTF-8">',
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
'<meta http-equiv="X-UA-Compatible" content="IE=Edge">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . KEYWORD . '">',
'<meta name="keywords" content="' . KEYWORD . '">',
'<meta property="og:type" content="website">',
'<meta property="og:title" content="Daemon IDC">',
'<meta property="og:description" content="' . KEYWORD . '">',
],
'stylesheets' => [
'<link rel="icon" href="/favicon.ico">',
'<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">',
'<link rel="stylesheet" href="/css/common/style.css" />',
],
'javascripts' => [
'<script src="//cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js"></script>',
'<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>',
'<script src="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>',
'<script src="//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>',
],
'footerScripts' => []
],
'admin' => [
'title' => '관리자화면',
'path' => 'admin',
'layout' => 'layouts' . DIRECTORY_SEPARATOR . 'admin',
'template' => 'templates' . DIRECTORY_SEPARATOR . 'admin',
'metas' => [
'<meta charset="UTF-8">',
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
'<meta http-equiv="X-UA-Compatible" content="IE=Edge">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . KEYWORD . '">',
'<meta name="keywords" content="' . KEYWORD . '">',
'<meta property="og:type" content="website">',
'<meta property="og:title" content="Daemon IDC">',
'<meta property="og:description" content="' . KEYWORD . '">',
],
'stylesheets' => [
'<link rel="icon" href="/favicon.ico">',
'<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/select2-bootstrap-5-theme@1.3.0/dist/select2-bootstrap-5-theme.min.css" />',
'<link rel="stylesheet" href="/assets/tagify/dist/tagify.css">',
'<link rel="stylesheet" href="/css/common/style.css" />',
],
'javascripts' => [
'<script src="//cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js"></script>',
'<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>',
'<script src="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>',
'<script src="//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>',
'<script src="/assets/tinymce/tinymce.min.js" referrerpolicy="origin"></script>',
'<script src="/assets/tagify/dist/tagify.js"></script>'
],
'footerScripts' => []
],
]);
// Layout은 Config\Layout 클래스에서 관리됩니다.
//STATUS
define("STATUS", [

107
app/Config/Layout.php Normal file
View File

@ -0,0 +1,107 @@
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Layout extends BaseConfig
{
public const KEYWORD = '일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버 가상서버';
public array $layouts = [
'auth' => [
'title' => self::KEYWORD,
'path' => 'auth',
'layout' => 'layouts' . DIRECTORY_SEPARATOR . 'auth',
'template' => 'templates' . DIRECTORY_SEPARATOR . 'auth',
'metas' => [
'<meta charset="UTF-8">',
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
'<meta http-equiv="X-UA-Compatible" content="IE=Edge">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . self::KEYWORD . '">',
'<meta name="keywords" content="' . self::KEYWORD . '">',
'<meta property="og:type" content="website">',
'<meta property="og:title" content="Daemon IDC">',
'<meta property="og:description" content="' . self::KEYWORD . '">',
],
'stylesheets' => [
'<link rel="icon" href="/favicon.ico">',
'<link href="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">',
'<link rel="stylesheet" href="/css/common/style.css" />',
],
'javascripts' => [
'<script src="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>',
],
'footerScripts' => []
],
'front' => [
'title' => self::KEYWORD,
'path' => 'front',
'layout' => 'layouts' . DIRECTORY_SEPARATOR . 'front',
'template' => 'templates' . DIRECTORY_SEPARATOR . 'front',
'topmenus' => ['aboutus', 'hosting', 'service', 'support'],
'metas' => [
'<meta charset="UTF-8">',
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
'<meta http-equiv="X-UA-Compatible" content="IE=Edge">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . self::KEYWORD . '">',
'<meta name="keywords" content="' . self::KEYWORD . '">',
'<meta property="og:type" content="website">',
'<meta property="og:title" content="Daemon IDC">',
'<meta property="og:description" content="' . self::KEYWORD . '">',
],
'stylesheets' => [
'<link rel="icon" href="/favicon.ico">',
'<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">',
'<link rel="stylesheet" href="/css/common/style.css" />',
],
'javascripts' => [
'<script src="//cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js"></script>',
'<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>',
'<script src="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>',
'<script src="//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>',
],
'footerScripts' => []
],
'admin' => [
'title' => '관리자화면',
'path' => 'admin',
'layout' => 'layouts' . DIRECTORY_SEPARATOR . 'admin',
'template' => 'templates' . DIRECTORY_SEPARATOR . 'admin',
'metas' => [
'<meta charset="UTF-8">',
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
'<meta http-equiv="X-UA-Compatible" content="IE=Edge">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . self::KEYWORD . '">',
'<meta name="keywords" content="' . self::KEYWORD . '">',
'<meta property="og:type" content="website">',
'<meta property="og:title" content="Daemon IDC">',
'<meta property="og:description" content="' . self::KEYWORD . '">',
],
'stylesheets' => [
'<link rel="icon" href="/favicon.ico">',
'<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css">',
'<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/select2-bootstrap-5-theme@1.3.0/dist/select2-bootstrap-5-theme.min.css" />',
'<link rel="stylesheet" href="/assets/tagify/dist/tagify.css">',
'<link rel="stylesheet" href="/css/common/style.css" />',
],
'javascripts' => [
'<script src="//cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js"></script>',
'<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>',
'<script src="//cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>',
'<script src="//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>',
'<script src="/assets/tinymce/tinymce.min.js" referrerpolicy="origin"></script>',
'<script src="/assets/tagify/dist/tagify.js"></script>'
],
'footerScripts' => []
],
];
}

View File

@ -71,7 +71,7 @@ abstract class AbstractWebController extends Controller
return $this->_viewDatas[$key] ?? null;
}
// --- 공통 처리 로직 (Override 가능) ---
// --- 공통 처리 로직 (Override 가능) ---
/**
* 모든 액션 실행 공통 초기화 작업
@ -114,18 +114,20 @@ abstract class AbstractWebController extends Controller
*/
protected function action_render_process(string $view_file, array $viewDatas, ?string $template_path = null): string
{
// dd($viewDatas);
$view_path = $viewDatas['layout']['path'];
helper(['form', 'IconHelper', 'utility']);
$config = config('Layout');
$layoutConfig = $config->layouts[$viewDatas['layout']['path']] ?? [];
$viewDatas['layout'] = array_merge($layoutConfig, $viewDatas['layout']);
$view_path = $viewDatas['layout']['path'];
if ($template_path) {
$view_path .= '/' . $template_path;
$view_path .= '/' . $template_path;
}
//최종 ViewPath
$viewDatas['view_path'] = $view_path;
$full_path = $view_path . '/' . $view_file;
// echo $full_path;
// exit;
helper(['form', __FUNCTION__]);
return view($full_path, [
helper([__FUNCTION__]);
return view($view_path . '/' . $view_file, [
'viewDatas' => [
...$viewDatas,
'forms' => ['attributes' => ['method' => "post",], 'hiddens' => []],

View File

@ -15,7 +15,7 @@ abstract class AdminController extends CommonController
{
parent::initController($request, $response, $logger);
$this->addActionPaths($this->_layout);
$this->layouts = LAYOUTS[$this->_layout];
$this->layouts = config('Layout')->layouts[$this->_layout] ?? [];
}
protected function action_init_process(string $action, array $formDatas = []): void
{
@ -24,7 +24,7 @@ abstract class AdminController extends CommonController
$this->addViewDatas('title', $this->getTitle());
$this->addViewDatas('helper', $this->service->getHelper());
$this->service->getFormService()->action_init_process($action, $formDatas);
$this->addViewDatas('formFields', $this->service->getFormService()->getFormFields());
$this->addViewDatas('formFields', $this->service->getFormService()->getFormFields());
$this->addViewDatas('formRules', $this->service->getFormService()->getFormRules());
$this->addViewDatas('formFilters', $this->service->getFormService()->getFormFilters());
$this->addViewDatas('formOptions', $this->service->getFormService()->getFormOptions());

View File

@ -18,7 +18,7 @@ class Home extends AbstractWebController
$this->service = service('customer_serviceservice');
}
$this->addActionPaths($this->_layout);
$this->layouts = LAYOUTS[$this->_layout];
$this->layouts = config('Layout')->layouts[$this->_layout] ?? [];
}
protected function action_init_process(string $action, array $formDatas = []): void
{
@ -26,7 +26,7 @@ class Home extends AbstractWebController
$this->addViewDatas('layout', $this->layouts);
$this->addViewDatas('helper', $this->service->getHelper());
$this->service->getFormService()->action_init_process($action, $formDatas);
$this->addViewDatas('formFields', $this->service->getFormService()->getFormFields());
$this->addViewDatas('formFields', $this->service->getFormService()->getFormFields());
$this->addViewDatas('formRules', $this->service->getFormService()->getFormRules());
$this->addViewDatas('formFilters', $this->service->getFormService()->getFormFilters());
$this->addViewDatas('formOptions', $this->service->getFormService()->getFormOptions());

View File

@ -17,7 +17,7 @@ abstract class AuthController extends AbstractWebController
{
parent::initController($request, $response, $logger);
$this->addActionPaths($this->_layout);
$this->layouts = LAYOUTS[$this->_layout];
$this->layouts = config('Layout')->layouts[$this->_layout] ?? [];
}
protected function action_init_process(string $action, array $formDatas = []): void
{
@ -26,7 +26,7 @@ abstract class AuthController extends AbstractWebController
$this->addViewDatas('helper', $this->service->getHelper());
//Fields,Rules,Filters,Options등 초기화
$this->service->getFormService()->action_init_process($action, $formDatas);
$this->addViewDatas('formFields', $this->service->getFormService()->getFormFields());
$this->addViewDatas('formFields', $this->service->getFormService()->getFormFields());
$this->addViewDatas('formRules', $this->service->getFormService()->getFormRules());
$this->addViewDatas('formFilters', $this->service->getFormService()->getFormFilters());
$this->addViewDatas('formOptions', $this->service->getFormService()->getFormOptions());

178
app/Helpers/IconHelper.php Normal file
View File

@ -0,0 +1,178 @@
<?php
namespace App\Helpers;
/**
* IconHelper
* 아이콘 소셜 미디어 아이콘의 HTML을 생성하는 헬퍼 클래스입니다.
*/
class IconHelper
{
/**
* 입력을 기반으로 아이콘 HTML을 반환합니다.
*
* @param string $key ICONS 상수의
* @param string $class 추가적인 CSS 클래스
* @return string
*/
public static function icon(string $key, string $class = ''): string
{
$icons = self::getIcons();
if (!isset($icons[$key])) {
$icons = self::getMessengerIcons();
}
if (!isset($icons[$key])) {
return '';
}
$icon = $icons[$key];
if ($class && str_contains($icon, 'class="')) {
return str_replace('class="', 'class="' . $class . ' ', $icon);
}
return $icon;
}
/**
* 메신저 아이콘 HTML을 반환합니다.
*
* @param string $key MESSENGER_ICONS 상수의
* @return string
*/
public static function messengerIcon(string $key): string
{
$icons = self::getMessengerIcons();
return $icons[$key] ?? '';
}
/**
* 아이콘 데이터를 관리합니다. (Constants.php에서 분리된 데이터)
*/
private static function getIcons(): array
{
return [
'ADD' => '<i class="bi bi-plus-circle"></i>',
'LOGO' => '<img src="/images/logo/android-icon-48x48.png">',
'EXCEL' => '<img src="/images/common/excel.png"/>',
'PDF' => '<img src="/images/common/pdf.png"/>',
'GOOGLE' => '<img src="https://www.google.com/favicon.ico" alt="Google" width="20" height="20" class="me-2">',
'MEMBER' => '<i class="bi bi-people"></i>',
'LOGIN' => '<i class="bi bi-shield-check"></i>',
'LOGOUT' => '<i class="bi bi-sign-stop-fill"></i>',
'HOME' => '<i class="bi bi-house"></i>',
'MENU' => '<i class="bi bi-menu-button"></i>',
'NEW' => '<i class="bi bi-database-add"></i>',
'REPLY' => '<i class="bi bi-arrow-return-right"></i>',
'DATABASE' => '<i class="bi bi-database"></i>',
'DISLIKE' => '<i class="bi bi-hand-thumbs-down"></i>',
'LIKE' => '<i class="bi bi-hand-thumbs-up"></i>',
'DOWNLOAD' => '<i class="bi bi-download"></i>',
'UPLOAD' => '<i class="bi bi-upload"></i>',
'COPY' => '<i class="bi bi-files"></i>',
'PASTE' => '<i class="bi bi-clipboard"></i>',
'EDIT' => '<i class="bi bi-pencil-square"></i>',
'VIEW' => '<i class="bi bi-eye"></i>',
'VIEW_OFF' => '<i class="bi bi-eye-slash"></i>',
'PRINT' => '<i class="bi bi-printer"></i>',
'SAVE' => '<i class="bi bi-save"></i>',
'CANCEL' => '<i class="bi bi-x-circle"></i>',
'CLOSE' => '<i class="bi bi-x-circle-fill"></i>',
'CLIENT' => '<i class="bi bi-person-circle"></i>',
'CHART' => '<i class="bi bi-bar-chart"></i>',
'CHECK' => '<i class="bi bi-check-circle"></i>',
'CHECK_OFF' => '<i class="bi bi-check-circle-fill"></i>',
'CHECK_ON' => '<i class="bi bi-check2-circle"></i>',
'CHECK_ALL' => '<i class="bi bi-check-all"></i>',
'CHECK_NONE' => '<i class="bi bi-check2"></i>',
'CHECK_SOME' => '<i class="bi bi-check2-square"></i>',
'COUPON' => '<i class="bi bi-ticket-perforated"></i>',
'HISTORY' => '<i class="bi bi-clock-history"></i>',
'MODIFY' => '<i class="bi bi-pencil-square"></i>',
'MODIFY_ALL' => '<i class="bi bi-pencil-square"></i>',
'BATCHJOB' => '<i class="bi bi-clipboard-data"></i>',
'DELETE' => '<i class="bi bi-trash"></i>',
'REBOOT' => '🔄',
'RELOAD' => '<i class="bi bi-bootstrap-reboot"></i>',
'SETUP' => '<i class="bi bi-gear"></i>',
'FLAG' => '<i class="bi bi-send"></i>',
'SEARCH' => '<i class="bi bi-search"></i>',
'PLAY' => '<i class="bi bi-play-fill"></i>',
'CART' => '<i class="bi bi-cart4"></i>',
'CARD' => '<i class="bi bi-credit-card"></i>',
'DEPOSIT' => '<i class="bi bi-cash-coin"></i>',
'DESKTOP' => '<i class="bi bi-pc-display-horizontal"></i>',
'DEVICE' => '<i class="bi bi-device-hdd"></i>',
'UP' => '<i class="bi bi-arrow-up"></i>',
'DOWN' => '<i class="bi bi-arrow-down"></i>',
'LEFT' => '<i class="bi bi-arrow-left"></i>',
'RIGHT' => '<i class="bi bi-arrow-right"></i>',
'IMAGE_FILE' => '<i class="bi bi-file-earmark-image"></i>',
'CLOUD' => '<i class="bi bi-cloud"></i>',
'SIGNPOST' => '<i class="bi bi-signpost"></i>',
'LOCK' => '<i class="bi bi-lock"></i>',
'UNLOCK' => '<i class="bi bi-unlock"></i>',
'BOX' => '<i class="bi bi-box"></i>',
'BOXS' => '<i class="bi bi-boxes"></i>',
'ONETIME' => '<i class="bi bi-1-circle-fill text-warning"></i>',
'MONTH' => '<i class="bi bi-calendar-check text-warning"></i>',
'EMAIL' => '<i class="bi bi-mailbox"></i>',
'MAIL' => '<i class="bi bi-envelope"></i>',
'PHONE' => '<i class="bi bi-phone"></i>',
'POINT' => '<i class="bi bi-coin"></i>',
'ALRAM' => '<i class="bi bi-bell"></i>',
'PAYMENT' => '<i class="bi bi-credit-card-2-back"></i>',
'LINK' => '<i class="bi bi-link-45deg"></i>',
'SALE_UP' => '<i class="bi bi-graph-up-arrow"></i>',
'SALE_DOWN' => '<i class="bi bi-graph-down-arrow"></i>',
'SERVICE' => '<i class="bi bi-gear-wide-connected"></i>',
'SERVICE_ITEM' => '<i class="bi bi-gear-wide-connected"></i>',
'SERVICE_ITEM_LINE' => '<i class="bi bi-chat-left-text"></i>',
'SERVICE_ITEM_IP' => '<i class="bi bi-globe"></i>',
'SERVICE_ITEM_SERVER' => '<i class="bi bi-server"></i>',
'SERVICE_ITEM_CPU' => '<i class="bi bi-cpu"></i>',
'SERVICE_ITEM_RAM' => '<i class="bi bi-memory"></i>',
'SERVICE_ITEM_STORAGE' => '<i class="bi bi-hdd-stack"></i>',
'SERVICE_ITEM_SOFTWARE' => '<i class="bi bi-box-seam"></i>',
'SERVICE_ITEM_DEFENCE' => '<i class="bi bi-shield-lock"></i>',
'SERVICE_ITEM_DOMAIN' => '<i class="bi bi-globe2"></i>',
'SERVICE_ITEM_OTHER' => '<i class="bi bi-gear-wide-connected"></i>',
'SERVER_ITEM_CPU' => '<i class="bi bi-cpu"></i>',
'SERVER_ITEM_RAM' => '<i class="bi bi-memory"></i>',
'SERVER_ITEM_DISK' => '<i class="bi bi-device-hdd"></i>',
'SERVER_ITEM_SWITCH' => '<i class="bi bi-diagram-3"></i>',
'SERVER_ITEM_OS' => '<i class="bi bi-microsoft"></i>',
'SERVER_ITEM_DB' => '<i class="bi bi-database"></i>',
'SERVER_ITEM_SOFTWARE' => '<i class="bi bi-window-sidebar"></i>',
'SERVER_ITEM_IP' => '<i class="bi bi-globe2"></i>',
'SERVER_ITEM_CS' => '<i class="bi bi-shield-check"></i>',
'SERVER_ITEM_ETC' => '<i class="bi bi-patch-question"></i>',
];
}
private static function getMessengerIcons(): array
{
return [
'WHATSAPP' => '<i class="bi bi-whatsapp"></i>',
'VIBER' => '<i class="bi bi-viber"></i>',
'LINE' => '<i class="bi bi-chat-left-text"></i>',
'KAKAO' => '<i class="bi bi-chat-left-text"></i>',
'DISCORD' => '<i class="bi bi-discord"></i>',
'TELEGRAM' => '<i class="bi bi-telegram"></i>',
'SKYPE' => '<i class="bi bi-skype"></i>',
'YOUTUBE' => '<i class="bi bi-youtube"></i>',
'FACEBOOK' => '<i class="bi bi-facebook"></i>',
'TWITTER' => '<i class="bi bi-twitter"></i>',
'INSTAGRAM' => '<i class="bi bi-instagram"></i>',
'LINKEDIN' => '<i class="bi bi-linkedin"></i>',
'GITHUB' => '<i class="bi bi-github"></i>',
'GITLAB' => '<i class="bi bi-gitlab"></i>',
'BITBUCKET' => '<i class="bi bi-bitbucket"></i>',
'REDDIT' => '<i class="bi bi-reddit"></i>',
'TIKTOK' => '<i class="bi bi-tiktok"></i>',
'PINTEREST' => '<i class="bi bi-pinterest"></i>',
'TUMBLR' => '<i class="bi bi-tumblr"></i>',
'SNAPCHAT' => '<i class="bi bi-snapchat"></i>',
];
}
}

View File

@ -0,0 +1,17 @@
<?php
use App\Helpers\IconHelper;
/**
* 아이콘 HTML을 반환합니다.
*
* @param string $key ICONS
* @param string $class 추가 클래스
* @return string
*/
if (!function_exists('icon')) {
function icon(string $key, string $class = ''): string
{
return IconHelper::icon($key, $class);
}
}

View File

@ -34,9 +34,9 @@ class BoardService extends CommonService
if ($this->_form === null) {
$this->_form = new BoardForm();
$this->_form->setAttributes([
'pk_field' => $this->getPKField(),
'title_field' => $this->getTitleField(),
'table' => $this->model->getTable(),
'pk_field' => $this->getPKField(),
'title_field' => $this->getTitleField(),
'table' => $this->model->getTable(),
'useAutoIncrement' => $this->model->useAutoIncrement(),
'class_path' => $this->getClassPaths(false)
]);
@ -48,9 +48,9 @@ class BoardService extends CommonService
if ($this->_helper === null) {
$this->_helper = new BoardHelper();
$this->_helper->setAttributes([
'pk_field' => $this->getPKField(),
'title_field' => $this->getTitleField(),
'table' => $this->model->getTable(),
'pk_field' => $this->getPKField(),
'title_field' => $this->getTitleField(),
'table' => $this->model->getTable(),
'useAutoIncrement' => $this->model->useAutoIncrement(),
'class_path' => $this->getClassPaths(false)
]);
@ -80,11 +80,13 @@ class BoardService extends CommonService
{
//관리자정보
$userEntities = service('userservice')->getEntities();
$datas = [];
$datas = [];
foreach ($this->getEntities(['category' => $category, 'status' => STATUS['AVAILABLE']]) as $entity) {
$datas[] = [
'title' => "<label for=\"view\" data-src=\"/admin/board/view/{$entity->getPK()}\" data-bs-toggle=\"modal\" data-bs-target=\" #modal_action_form\" class=\"text-primary form-label-sm\">{$entity->getTitle()}</label>",
'created_at' => date('Y-m-d H:m', strtotime($entity->getCreatedAT())),
'uid' => $entity->getPK(),
'title' => $entity->getTitle(),
'url' => "/admin/board/view/{$entity->getPK()}",
'created_at' => date('Y-m-d H:i', strtotime($entity->getCreatedAT())),
'user' => $userEntities[$entity->getUserUid()]->getTitle(),
];
}

View File

@ -1,13 +1,13 @@
<div class="layout_header">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= ICONS['SETUP'] ?>작업내역&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<?= view_cell("\App\Cells\MylogCell::dashboard") ?>
</div>
<div class="layout_footer"></div>
<div class="layout_header">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= icon('SETUP') ?>작업내역&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<?= view_cell("\App\Cells\MylogCell::dashboard") ?>
</div>
<div class="layout_footer"></div>

View File

@ -1,36 +1,39 @@
<div class="layout_header mt-3">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= ICONS['CHART'] ?> 최신 신규 서비스 현황&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<table class="table table-bordered table-hover align-middle">
<thead class="table-light">
<div class="layout_header mt-3">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= icon('CHART') ?> 최신 신규 서비스 현황&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<table class="table table-bordered table-hover align-middle">
<thead class="table-light">
<tr class="text-center">
<th>사이트</th>
<th>업체명</th>
<th>
<span class="float-start rounded border border-primary" style="cursor:pointer;"
onclick="copyServerPartsToClipboard()">ALL 📋</span> 장비번호 / 스위치정보 / IP정보 / CS정보
</th>
<th>등록자</th>
</tr>
</thead>
<tbody>
<?php foreach ($viewDatas['newServiceEntities'] as $entity): ?>
<?php $viewDatas['entity'] = $entity ?>
<tr class="text-center">
<th>사이트</th>
<th>업체명</th>
<th>
<span class="float-start rounded border border-primary" style="cursor:pointer;" onclick="copyServerPartsToClipboard()">ALL 📋</span> 장비번호 / 스위치정보 / IP정보 / CS정보
</th>
<th>등록자</th>
<td><?= SITES[$entity->getSite()] ?></td>
<td nowrap><?= $viewDatas['helper']->getFieldView('clientinfo_uid', $entity->getClientInfoUid(), $viewDatas) ?>
</td>
<td class="text-start">
<?= $viewDatas['helper']->getFieldView('serverinfo_uid', $entity->getServerInfoUid(), $viewDatas) ?></td>
<td nowrap><?= $viewDatas['helper']->getFieldView('user_uid', $entity->getUserUid(), $viewDatas) ?></td>
</tr>
</thead>
<tbody>
<?php foreach ($viewDatas['newServiceEntities'] as $entity): ?>
<?php $viewDatas['entity'] = $entity ?>
<tr class="text-center">
<td><?= SITES[$entity->getSite()] ?></td>
<td nowrap><?= $viewDatas['helper']->getFieldView('clientinfo_uid', $entity->getClientInfoUid(), $viewDatas) ?></td>
<td class="text-start"><?= $viewDatas['helper']->getFieldView('serverinfo_uid', $entity->getServerInfoUid(), $viewDatas) ?></td>
<td nowrap><?= $viewDatas['helper']->getFieldView('user_uid', $entity->getUserUid(), $viewDatas) ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</div>
<div class="layout_footer"></div>
<script src="/js/admin/clipboard.js"></script>
<?php endforeach ?>
</tbody>
</table>
</div>
<div class="layout_footer"></div>
<script src="/js/admin/clipboard.js"></script>

View File

@ -1,24 +1,24 @@
<div class="layout_header" style="margin-top:20px;">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= ICONS['SETUP'] ?>재고현황&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<table class="table table-bordered table-striped">
<tr>
<th class="text-center" width="33%">사용 서버</th>
<th class="text-center" width="33%">메모리 재고</th>
<th class="text-center">저장장치 재고</th>
</tr>
<tr>
<td><?= view_cell("\App\Cells\Equipment\CHASSISCell::stock") ?></td>
<td><?= view_cell("\App\Cells\Part\RAMCell::stock") ?></td>
<td><?= view_cell("\App\Cells\Part\DISKCell::stock") ?></td>
</tr>
</table>
</div>
<div class="layout_footer"></div>
<div class="layout_header" style="margin-top:20px;">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= icon('SETUP') ?>재고현황&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<table class="table table-bordered table-striped">
<tr>
<th class="text-center" width="33%">사용 서버</th>
<th class="text-center" width="33%">메모리 재고</th>
<th class="text-center">저장장치 재고</th>
</tr>
<tr>
<td><?= view_cell("\App\Cells\Equipment\CHASSISCell::stock") ?></td>
<td><?= view_cell("\App\Cells\Part\RAMCell::stock") ?></td>
<td><?= view_cell("\App\Cells\Part\DISKCell::stock") ?></td>
</tr>
</table>
</div>
<div class="layout_footer"></div>

View File

@ -1,45 +1,45 @@
<div class="layout_header">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= ICONS['CHART'] ?> 전체 서비스 현황&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<table class="table table-bordered table-hover table-align-middle">
<tr class="text-center">
<th rowspan="2" class="bg-light">사이트</th>
<th colspan="2" class="bg-light">일반</th>
<th colspan="2" class="bg-light">방어</th>
<th colspan="2" class="bg-light">전용</th>
<th colspan="2" class="bg-light">대체</th>
<th colspan="2" class="bg-light">VPN</th>
<th colspan="2" class="bg-light">이벤트</th>
<th colspan="2" class="bg-light">테스트</th>
<th colspan="3" class="bg-light">합계</th>
</tr>
<tr class="text-center">
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">합계</th>
</tr>
<?= view_cell("\App\Cells\Equipment\ServerCell::totalCountDashboard") ?>
</table>
</div>
<div class="layout_footer"></div>
<div class="layout_header">
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= icon('CHART') ?> 전체 서비스 현황&nbsp;&nbsp;</h4>
</span>
</li>
</ul>
</div>
<div style="border-left: 1px solid black; border-right: 1px solid black; padding:20px;">
<table class="table table-bordered table-hover table-align-middle">
<tr class="text-center">
<th rowspan="2" class="bg-light">사이트</th>
<th colspan="2" class="bg-light">일반</th>
<th colspan="2" class="bg-light">방어</th>
<th colspan="2" class="bg-light">전용</th>
<th colspan="2" class="bg-light">대체</th>
<th colspan="2" class="bg-light">VPN</th>
<th colspan="2" class="bg-light">이벤트</th>
<th colspan="2" class="bg-light">테스트</th>
<th colspan="3" class="bg-light">합계</th>
</tr>
<tr class="text-center">
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">도쿄</th>
<th class="bg-light">치바</th>
<th class="bg-light">합계</th>
</tr>
<?= view_cell("\App\Cells\Equipment\ServerCell::totalCountDashboard") ?>
</table>
</div>
<div class="layout_footer"></div>

View File

@ -4,7 +4,7 @@
<div id="left_menu" onMouseOver="sideMenuToggle(this);" onMouseOut="sideMenuToggle(this);">
<div id="accordion" class="accordion accordion-flush">
<div class="main">
<a href="/admin"><?= ICONS["HOME"] ?> Main</a>
<a href="/admin"><?= icon("HOME") ?> Main</a>
</div>
<?= $this->include($viewDatas['layout']['layout'] . '/left_menu/base'); ?>
<?= $this->include($viewDatas['layout']['layout'] . '/left_menu/board'); ?>

View File

@ -1,6 +1,6 @@
<div class="accordion-item">
<a href="/admin/user"><?= ICONS['MEMBER'] ?> 계정 관리</a>
<a href="/admin/user"><?= icon('MEMBER') ?> 계정 관리</a>
</div>
<div class="accordion-item">
<a href="/admin/payment?status=<?= STATUS['UNPAID'] ?>"><?= ICONS['PAYMENT'] ?> 결제내역</a>
<a href="/admin/payment?status=<?= STATUS['UNPAID'] ?>"><?= icon('PAYMENT') ?> 결제내역</a>
</div>

View File

@ -1,14 +1,13 @@
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-board" aria-expanded="true"
aria-controls="flush-board"><b><?= ICONS['DEVICE'] ?>게시판관리 </b>
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-board"
aria-expanded="true" aria-controls="flush-board"><b><?= icon('DEVICE') ?>게시판관리 </b>
</button>
</h2>
<div id="flush-board" class="accordion-collapse collapse" aria-labelledby="flush-board">
<div class="accordion-item">
<a href="/admin/board?category=<?= BOARD['CATEGORY']['NOTICE'] ?>"><?= ICONS['SERVICE_ITEM_LINE'] ?>공지사항</a>
<a href="/admin/board?category=<?= BOARD['CATEGORY']['NOTICE'] ?>"><?= icon('SERVICE_ITEM_LINE') ?>공지사항</a>
</div>
<div class="accordion-item">
<a href="/admin/board?category=<?= BOARD['CATEGORY']['REQUESTTASK'] ?>"><?= ICONS['SERVICE_ITEM_SERVER'] ?>요청업무</a>
<a href="/admin/board?category=<?= BOARD['CATEGORY']['REQUESTTASK'] ?>"><?= icon('SERVICE_ITEM_SERVER') ?>요청업무</a>
</div>
</div>

View File

@ -1,14 +1,13 @@
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-client" aria-expanded="false"
aria-controls="flush-client"><b><?= ICONS['CLOUD'] ?> 고객관리 </b>
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-client"
aria-expanded="false" aria-controls="flush-client"><b><?= icon('CLOUD') ?> 고객관리 </b>
</button>
</h2>
<div id="flush-client" class="accordion-collapse collapse" aria-labelledby="flush-client">
<div class="accordion-item">
<a href="/admin/customer/client"><?= ICONS['SIGNPOST'] ?>고객정보</a>
<a href="/admin/customer/client"><?= icon('SIGNPOST') ?>고객정보</a>
</div>
<div class="accordion-item">
<a href="/admin/customer/service"><?= ICONS['SERVICE'] ?> 서비스내역</a>
<a href="/admin/customer/service"><?= icon('SERVICE') ?> 서비스내역</a>
</div>
</div>

View File

@ -1,18 +1,17 @@
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-equipment" aria-expanded="true"
aria-controls="flush-equipment"><b><?= ICONS['DEVICE'] ?> 장비관리 </b>
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-equipment"
aria-expanded="true" aria-controls="flush-equipment"><b><?= icon('DEVICE') ?> 장비관리 </b>
</button>
</h2>
<div id="flush-equipment" class="accordion-collapse collapse" aria-labelledby="flush-equipment">
<div class="accordion-item">
<a href="/admin/equipment/line"><?= ICONS['SERVICE_ITEM_LINE'] ?>회선정보</a>
<a href="/admin/equipment/line"><?= icon('SERVICE_ITEM_LINE') ?>회선정보</a>
</div>
<div class="accordion-item">
<a href="/admin/equipment/server"><?= ICONS['SERVICE_ITEM_SERVER'] ?>Server정보</a>
<a href="/admin/equipment/server"><?= icon('SERVICE_ITEM_SERVER') ?>Server정보</a>
</div>
<div class="accordion-item">
<a href="/admin/equipment/chassis"><?= ICONS['SETUP'] ?>서버샷시정보</a>
<a href="/admin/equipment/chassis"><?= icon('SETUP') ?>서버샷시정보</a>
</div>
</div>

View File

@ -1,29 +1,28 @@
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-part" aria-expanded="true"
aria-controls="flush-part"><b><?= ICONS['DEVICE'] ?> 파트관리 </b>
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-part"
aria-expanded="true" aria-controls="flush-part"><b><?= icon('DEVICE') ?> 파트관리 </b>
</button>
</h2>
<div id="flush-part" class="accordion-collapse collapse" aria-labelledby="flush-part">
<div class="accordion-item">
<a href="/admin/part/switch"><?= ICONS['SETUP'] ?>SWITCH정보</a>
<a href="/admin/part/switch"><?= icon('SETUP') ?>SWITCH정보</a>
</div>
<div class="accordion-item">
<a href="/admin/part/ip"><?= ICONS['SERVICE_ITEM_IP'] ?>IP정보</a>
<a href="/admin/part/ip"><?= icon('SERVICE_ITEM_IP') ?>IP정보</a>
</div>
<div class="accordion-item">
<a href="/admin/part/cs"><?= ICONS['SERVICE_ITEM_DEFENCE'] ?>CS정보</a>
<a href="/admin/part/cs"><?= icon('SERVICE_ITEM_DEFENCE') ?>CS정보</a>
</div>
<div class="accordion-item">
<a href="/admin/part/cpu"><?= ICONS['SERVER_ITEM_CPU'] ?>CPU정보</a>
<a href="/admin/part/cpu"><?= icon('SERVER_ITEM_CPU') ?>CPU정보</a>
</div>
<div class="accordion-item">
<a href="/admin/part/ram"><?= ICONS['SERVER_ITEM_RAM'] ?>RAM정보</a>
<a href="/admin/part/ram"><?= icon('SERVER_ITEM_RAM') ?>RAM정보</a>
</div>
<div class="accordion-item">
<a href="/admin/part/disk"><?= ICONS['SERVER_ITEM_DISK'] ?>DISK정보</a>
<a href="/admin/part/disk"><?= icon('SERVER_ITEM_DISK') ?>DISK정보</a>
</div>
<div class="accordion-item">
<a href="/admin/part/software"><?= ICONS['SERVER_ITEM_SOFTWARE'] ?>Software정보</a>
<a href="/admin/part/software"><?= icon('SERVER_ITEM_SOFTWARE') ?>Software정보</a>
</div>
</div>

View File

@ -6,7 +6,8 @@
overflow-y: auto;
}
</style>
<nav class="navbar navbar-expand-lg fixed-top" style="background-color:#E7E7E7; border-top:1px solid darkgray; border-bottom:1px solid darkgray;">
<nav class="navbar navbar-expand-lg fixed-top"
style="background-color:#E7E7E7; border-top:1px solid darkgray; border-bottom:1px solid darkgray;">
<div class="container-fluid">
<nav class="nav"><a class="navbar-brand" href="/admin">DBMS 관리</a></nav>
<ul class="nav justify-content-center">
@ -14,14 +15,15 @@
<li class="nav-item">
<?= form_open("/admin/search", ['method' => 'GET', 'class' => 'd-flex gap-2']) ?>
<input type="text" name="keyword" placeholder="고객명/IP/서버명/기타 검색" id="search_keyword" class="form-control" />
<button type="submit" class="btn btn-default border border-dark"><?= ICONS['SEARCH'] ?></button>
<button type="submit" class="btn btn-default border border-dark"><?= icon('SEARCH') ?></button>
<?= form_close(); ?>
</li>
<li class="nav-item" style="background-color:white; margin-left:20px; font-size:12px;">
<!-- 🔔 공지 영역 -->
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="noticeDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<a class="nav-link dropdown-toggle" href="#" id="noticeDropdown" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
🔔 공지사항 <span id="notice-count" class="badge bg-danger">0</span>
</a>
<ol class="dropdown-menu dropdown-menu-end" aria-labelledby="noticeDropdown" id="noticeList">
@ -35,7 +37,8 @@
<!-- 🔔 업무요청 영역 -->
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="requesttaskDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<a class="nav-link dropdown-toggle" href="#" id="requesttaskDropdown" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
🔔 업무요청 <span id="requesttask-count" class="badge bg-danger">0</span>
</a>
<ol class="dropdown-menu dropdown-menu-end" aria-labelledby="requesttaskDropdown" id="requesttaskList">
@ -46,37 +49,40 @@
<!-- 🔔 업무요청 영역 -->
</li>
<li class="nav-item" style="background-color:white; margin-left:20px; font-size:12px;">
📋:클립보드COPY , 📌:실서비스서버 , ✔️:대체서버->실서비스서버 교체 , 🔄:대체서버등록 , <?= ICONS['MONTH'] ?>:월비용 , <?= ICONS['ONETIME'] ?>:일회성<BR>
<?= ICONS['SERVER_ITEM_SWITCH'] ?>:스위치 , <?= ICONS['SERVER_ITEM_IP'] ?>:IP , <?= ICONS['SERVER_ITEM_OS'] ?>:OS , <?= ICONS['SERVER_ITEM_SOFTWARE'] ?>:소프트웨어 , <?= ICONS['SERVER_ITEM_CS'] ?>:CS ,
<?= ICONS['SERVER_ITEM_CPU'] ?>:CPU , <?= ICONS['SERVER_ITEM_RAM'] ?>:RAM , <?= ICONS['SERVER_ITEM_DISK'] ?>:DISK
📋:클립보드COPY , 📌:실서비스서버 , ✔️:대체서버->실서비스서버 교체 , 🔄:대체서버등록 , <?= icon('MONTH') ?>:월비용 ,
<?= icon('ONETIME') ?>:일회성<BR>
<?= icon('SERVER_ITEM_SWITCH') ?>:스위치 , <?= icon('SERVER_ITEM_IP') ?>:IP , <?= icon('SERVER_ITEM_OS') ?>:OS ,
<?= icon('SERVER_ITEM_SOFTWARE') ?>:소프트웨어 , <?= icon('SERVER_ITEM_CS') ?>:CS ,
<?= icon('SERVER_ITEM_CPU') ?>:CPU , <?= icon('SERVER_ITEM_RAM') ?>:RAM , <?= icon('SERVER_ITEM_DISK') ?>:DISK
</li>
</ul>
<ul class="nav justify-content-end">
<li class="nav-item">
<?php if ($viewDatas['authContext']->isLoggedIn()): ?>
<div class="btn-group">
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<b><?= ICONS['LOGIN'] . $viewDatas['authContext']->getName() ?></b>
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-bs-toggle="dropdown"
aria-expanded="false">
<b><?= icon('LOGIN') . $viewDatas['authContext']->getName() ?></b>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><?= form_label(
ICONS['SETUP'] . "정보수정",
"modify",
[
"class" => "dropdown-item form-label-sm",
"data-src" => "/admin/user/modify/" . $viewDatas['authContext']->getUID(),
"data-bs-toggle" => "modal",
"data-bs-target" => "#modal_action_form"
]
) ?></li>
icon('SETUP') . "정보수정",
"modify",
[
"class" => "dropdown-item form-label-sm",
"data-src" => "/admin/user/modify/" . $viewDatas['authContext']->getUID(),
"data-bs-toggle" => "modal",
"data-bs-target" => "#modal_action_form"
]
) ?></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= icon('LOGOUT') ?>Logout</a></li>
</ul>
</div>
<?php else: ?>
<a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>" role="button"><?= ICONS['LOGIN'] ?>Login</a>
<a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>" role="button"><?= icon('LOGIN') ?>Login</a>
<?php endif ?>
</li>
</ul>
@ -91,7 +97,7 @@
document.querySelector('input[name="keyword"]').value = keyword;
});
//공지사항용
document.addEventListener("DOMContentLoaded", function() {
document.addEventListener("DOMContentLoaded", function () {
async function loadNotices() {
try {
const res = await fetch("/admin/board/latest/<?= BOARD['CATEGORY']['NOTICE'] ?>");

View File

@ -4,7 +4,7 @@
<nav class="nav"><a class="navbar-brand" href="#">사용자페이지</a></nav>
<ul class="nav justify-content-center">
<li class="nav-item">
<?= ICONS['LOCK'] ?>
<?= icon('LOCK') ?>
</li>
</ul>
@ -12,28 +12,29 @@
<li class="nav-item">
<?php if ($viewDatas['authContext']->isLoggedIn()): ?>
<div class="btn-group">
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<b><?= ICONS['LOGIN'] . $viewDatas['authContext']->getName() ?></b>
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-bs-toggle="dropdown"
aria-expanded="false">
<b><?= icon('LOGIN') . $viewDatas['authContext']->getName() ?></b>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><?= form_label(
ICONS['SETUP'] . "정보수정",
"modify",
[
"class" => "dropdown-item form-label-sm",
"data-src" => "/admin/user/profile/" . $viewDatas['authContext']->getUID(),
"data-bs-toggle" => "modal",
"data-bs-target" => "#modal_action_form"
]
) ?></li>
icon('SETUP') . "정보수정",
"modify",
[
"class" => "dropdown-item form-label-sm",
"data-src" => "/admin/user/profile/" . $viewDatas['authContext']->getUID(),
"data-bs-toggle" => "modal",
"data-bs-target" => "#modal_action_form"
]
) ?></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= icon('LOGOUT') ?>Logout</a></li>
</ul>
</div>
<?php else: ?>
<a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>" role="button"><?= ICONS['LOGIN'] ?>Login</a>
<a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>" role="button"><?= icon('LOGIN') ?>Login</a>
<?php endif ?>
</li>
</ul>

View File

@ -3,7 +3,7 @@
검색일:<?= form_input('index_start', $viewDatas['index_start'] ?? "", ["class" => "calender"]) ?>~<?= form_input('index_end', $viewDatas['index_end'] ?? "", ["class" => "calender"]) ?>
<button class="btn btn-outline-primary" type="submit">검색</button>
<?php $queryString = $_SERVER['QUERY_STRING'] ?? ''; ?>
<?= anchor(current_url() . '/download/excel' . ($queryString ? '?' . $queryString : ''), ICONS['EXCEL'], ["target" => "_self", "class" => "excel"]) ?>
<?= anchor(current_url() . '/download/excel' . ($queryString ? '?' . $queryString : ''), icon('EXCEL'), ["target" => "_self", "class" => "excel"]) ?>
</nav>
<nav class="pageinfo nav justify-content-end">
Page:<?= $viewDatas['page'] ?? 1 ?>/<?= $viewDatas['index_totalpage'] ?>

View File

@ -8,44 +8,54 @@
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= ICONS['DESKTOP'] ?> <?= $viewDatas['title'] ?? "" ?>&nbsp;&nbsp;</h4>
<h4>&nbsp;&nbsp;<?= \App\Helpers\IconHelper::icon('DESKTOP') ?> <?= $viewDatas['title'] ?? "" ?>&nbsp;&nbsp;</h4>
</span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/customer/client">고객정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/customer/client">고객정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/customer/wallet/account">예치금정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/customer/wallet/account">예치금정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/customer/wallet/coupon">쿠폰정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/customer/wallet/coupon">쿠폰정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/customer/wallet/point">포인트정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/customer/wallet/point">포인트정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/customer/service">서비스정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/customer/service">서비스정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/payment?status=<?= STATUS['UNPAID'] ?>">결제정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/payment?status=<?= STATUS['UNPAID'] ?>">결제정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/equipment/server">서버정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/equipment/server">서버정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/equipment/line">회선정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/equipment/line">회선정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/ip">IP정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/switch">SWITCH정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/part/switch">SWITCH정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/cs">CS정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/equipment/chassis">서버샷시정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/equipment/chassis">서버샷시정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/cpu">CPU정보</a></span>
@ -54,9 +64,11 @@
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/ram">RAM정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/disk">DISK정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/part/disk">DISK정보</a></span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a href="/admin/part/software">SOFTWARE정보</a></span>
<span class="nav-link active" aria-current="page" style="cursor:pointer;"><a
href="/admin/part/software">SOFTWARE정보</a></span>
</li>
</ul>

View File

@ -1,10 +1,11 @@
<!-- 모달 HTML -->
<div id="modal_action_form" class="modal_action_form modal fade" tabindex="-1" aria-labelledby="modal_label" aria-hidden="true">
<div id="modal_action_form" class="modal_action_form modal fade" tabindex="-1" aria-labelledby="modal_label"
aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modal_label">
&nbsp;&nbsp;<?= ICONS['DESKTOP'] ?> <?= $viewDatas['content_title'] ?>&nbsp;&nbsp;
&nbsp;&nbsp;<?= icon('DESKTOP') ?> <?= $viewDatas['content_title'] ?>&nbsp;&nbsp;
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>

View File

@ -4,7 +4,7 @@
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modal_label">
&nbsp;&nbsp;<?= ICONS['DESKTOP'] ?> <?= $viewDatas['content_title'] ?>&nbsp;&nbsp;
&nbsp;&nbsp;<?= icon('DESKTOP') ?> <?= $viewDatas['content_title'] ?>&nbsp;&nbsp;
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>

View File

@ -10,9 +10,10 @@
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="iframe_modal_label">
&nbsp;&nbsp;<?= ICONS['DESKTOP'] ?> <?= $viewDatas['title'] ?? "" ?>&nbsp;&nbsp;
&nbsp;&nbsp;<?= icon('DESKTOP') ?> <?= $viewDatas['title'] ?? "" ?>&nbsp;&nbsp;
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" onClick="window.location.reload()"></button>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"
onClick="window.location.reload()"></button>
</div>
<div class="modal-body" style="max-height: 80vh; overflow-y: auto;">
<iframe id="form-container" src="about:blank" width="100%" frameborder="0" allowfullscreen></iframe>
@ -53,12 +54,12 @@
}
var modal_action_form = document.getElementById('modal_action_form');
modal_action_form.addEventListener('show.bs.modal', function(event) {
modal_action_form.addEventListener('show.bs.modal', function (event) {
var button = event.relatedTarget;
var iframe = document.getElementById('form-container');
iframe.src = button.getAttribute('data-src');
// iframe이 로드된 후 높이를 조정하는 이벤트 리스너 추가
iframe.onload = function() {
iframe.onload = function () {
resizeIframe();
var iframeContent = iframe.contentDocument || iframe.contentWindow.document;
// 컨텐츠 변경 시 높이 재조정을 위한 MutationObserver 설정
@ -72,7 +73,7 @@
});
// 모달이 닫힐 때 iframe src를 초기화하여 종료 처리
modal_action_form.addEventListener('hidden.bs.modal', function() {
modal_action_form.addEventListener('hidden.bs.modal', function () {
var iframe = document.getElementById('form-container');
iframe.src = "about:blank"; // 모달 닫힐 때 iframe 초기화
});

View File

@ -1,11 +1,12 @@
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-item navbar-brand" aria-current="page">
<h4>&nbsp;&nbsp;<?= ICONS['DESKTOP'] ?> <?= $viewDatas['content_title'] ?>&nbsp;&nbsp;</h4>
<h4>&nbsp;&nbsp;<?= icon('DESKTOP') ?> <?= $viewDatas['content_title'] ?>&nbsp;&nbsp;</h4>
</span>
</li>
<li class="nav-item">
<span class="nav-link active" aria-current="page" data-bs-toggle="modal" data-bs-target="#DNSModal" style="cursor:pointer;">Cloudflare DNS</span>
<span class="nav-link active" aria-current="page" data-bs-toggle="modal" data-bs-target="#DNSModal"
style="cursor:pointer;">Cloudflare DNS</span>
</li>
</ul>
<div class="modal fade" id="DNSModal" tabindex="-1" aria-labelledby="CloudflareDNSModal" aria-hidden="true">
@ -49,7 +50,8 @@
<table class="cloudflare">
<tr>
<th>cloudprime001@idcjp.jp(,숫자)</th>
<td class="dnsname" onclick="copyToClipboard(this,'felicity.ns.cloudflare.com')">felicity.ns.cloudflare.com</td>
<td class="dnsname" onclick="copyToClipboard(this,'felicity.ns.cloudflare.com')">felicity.ns.cloudflare.com
</td>
<td class="dnsname" onclick="copyToClipboard(this,'tara.ns.cloudflare.com')">tara.ns.cloudflare.com</td>
</tr>
<tr>
@ -59,7 +61,8 @@
</tr>
<tr>
<th>jpcf003@gmail.com(~)</th>
<td class="dnsname" onclick="copyToClipboard(this,'natasha.ns.cloudflare.com');">natasha.ns.cloudflare.com</td>
<td class="dnsname" onclick="copyToClipboard(this,'natasha.ns.cloudflare.com');">natasha.ns.cloudflare.com
</td>
<td class="dnsname" onclick="copyToClipboard(this,'plato.ns.cloudflare.com');">plato.ns.cloudflare.com</td>
</tr>
<tr>