cfmgrv4 init...1

This commit is contained in:
최준흠 2024-10-05 23:56:06 +09:00
parent 8f596fc223
commit 36806b0c12
50 changed files with 1051 additions and 688 deletions

View File

@ -130,12 +130,6 @@ define('SESSION_NAMES', [
'ISLOGIN' => "islogined",
'AUTH' => 'auth',
]);
//인증 관련
define('AUTH_FIELDS', [
'ID' => 'id',
'TITLE' => 'title',
'ROLE' => 'role',
]);
//메신저 관련
define("MESSENGERS", [
"skype" => [
@ -214,7 +208,19 @@ define('AUDIOS', [
define('KEYWORD', '일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버 가상서버');
define('LAYOUTS', [
'empty' => [
'title' => KEYWORD,
'path' => 'layouts' . DIRECTORY_SEPARATOR . 'empty',
'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">',
@ -227,12 +233,11 @@ define('LAYOUTS', [
'front' => [
'title' => KEYWORD,
'path' => 'layouts' . DIRECTORY_SEPARATOR . 'front',
//'topmenus' => ['aboutus', 'hosting', 'serverdevice', 'service', 'support'],
'topmenus' => ['aboutus', 'hosting', 'service', 'support'],
'metas' => [
'<meta charset="utf-8">',
'<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="viewport" id="viewport" content="width=1280">',
'<meta name="subject" content="Daemon IDC">',
'<meta name="description" content="' . KEYWORD . '">',
'<meta name="keywords" content="' . KEYWORD . '">',
@ -245,7 +250,7 @@ define('LAYOUTS', [
'<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 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="//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="//cdn.jsdelivr.net/npm/boxicons@latest/css/boxicons.min.css" />',
@ -254,7 +259,7 @@ define('LAYOUTS', [
'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" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" 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="/vendors/tinymce/tinymce/tinymce.js" referrerpolicy="origin"></script>',
],
@ -262,11 +267,22 @@ define('LAYOUTS', [
'admin' => [
'title' => '관리자화면',
'path' => 'layouts' . 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 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="//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="//cdn.jsdelivr.net/npm/boxicons@latest/css/boxicons.min.css" />',
@ -276,7 +292,7 @@ define('LAYOUTS', [
'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" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" 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="/vendors/tinymce/tinymce/tinymce.js" referrerpolicy="origin"></script>',
],

View File

@ -11,23 +11,20 @@ $routes->addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}
//authFilter는 추가적인 작업이 필요
//1. app/Filters/AuthFilter.php
//2. Config/Filters.php -> $aliases = ['authFilter' => AuthFilter::class]
$routes->group('', ['namespace' => 'App\Controllers'], function ($routes) {
$routes->get('/', 'Home::index');
$routes->group('user', function ($routes) {
$routes->get('login', 'UserController::create_form');
$routes->get('signup', 'UserController::create');
$routes->get('logout', 'UserController::logout', ['filter' => 'authFilter:user']);
});
$routes->get('/', 'Home::index');
$routes->group('/user', function ($routes) {
$routes->get('login', 'UserController::create_form');
$routes->post('login', 'UserController::create');
$routes->get('logout', 'UserController::logout', ['filter' => 'authFilter:user']);
});
$routes->group('cli', ['namespace' => 'App\CLI'], function ($routes) {
$routes->group('cloudflare', ['namespace' => 'App\CLI\Cloudflare'], function ($routes) {
$routes->cli('reload', 'Cloudflare::reload');
});
});
// $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'authFilter:manager'], function ($routes) {
$routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'authFilter:manager'], function ($routes) {
$routes->group('admin', ['namespace' => 'App\Controllers\Admin'], function ($routes) {
$routes->get('/', 'Home::index');
$routes->group('user', ['filter' => 'authFilter:master'], function ($routes) {
$routes->group('user', function ($routes) {
$routes->get('/', 'UserController::index');
$routes->get('create', 'UserController::create_form');
$routes->post('create', 'UserController::create');

View File

@ -17,7 +17,7 @@ class UserController extends AdminController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name .= "User";
$this->class_name = "User";
$this->class_path .= $this->class_name;
$this->view_path = strtolower($this->view_root . $this->class_name);
$this->title = lang("{$this->class_path}.title");

View File

@ -0,0 +1,19 @@
<?php
namespace App\Controllers;
use App\Controllers\MVController;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
abstract class FrontController extends MVController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->layout = "front";
$this->view_root .= "front/";
$this->action_form = FORMS['MODAL'];
}
}

View File

@ -14,10 +14,6 @@ use Psr\Log\LoggerInterface;
abstract class MVController extends CommonController
{
protected $class_name = "";
protected $class_path = "";
protected $view_root = "";
protected $view_path = "";
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
@ -115,6 +111,7 @@ abstract class MVController extends CommonController
$this->create_validate($this->action, $this->fields);
$this->formDatas = $this->getFormDatas();
$this->entity = $this->getModel()->create(formDatas: $this->formDatas);
$this->message = "입력작업이 완료되었습니다.";
}
final protected function create_procedure(string $action_form = "default"): RedirectResponse|string
{
@ -123,13 +120,12 @@ abstract class MVController extends CommonController
try {
$this->create_process();
$this->getModel()->transCommit();
$this->message = "입력작업이 완료되었습니다.";
log_message("notice", __FUNCTION__ . $this->message);
switch ($action_form) {
case FORMS['MODAL']:
$result = view("templates/{$this->layout}/{$action_form}_close", data: ['viewDatas' => $this->getViewDatas()]);
break;
case FORMS['IFRAM']:
case FORMS['IFRAME']:
$result = view("templates/{$this->layout}/{$action_form}_close", data: ['viewDatas' => $this->getViewDatas()]);
break;
default:
@ -192,6 +188,7 @@ abstract class MVController extends CommonController
throw new \Exception(__FUNCTION__, " => {$uid} 정보를 찾을수 없습니다.");
}
$this->entity = $this->getModel()->modify($this->entity, $this->formDatas);
$this->message = "수정작업이 완료되었습니다.";
}
final protected function modify_procedure(string $uid, string $action_form = "default"): RedirectResponse|string
{
@ -200,13 +197,12 @@ abstract class MVController extends CommonController
try {
$this->modify_process($uid);
$this->getModel()->transCommit();
$this->message = "수정작업이 완료되었습니다.";
log_message("notice", __FUNCTION__ . $this->message);
switch ($action_form) {
case FORMS['MODAL']:
$result = view("templates/{$this->layout}/{$action_form}_close", data: ['viewDatas' => $this->getViewDatas()]);
break;
case FORMS['IFRAME']:
case FORMS['IFRAMEE']:
$result = view("templates/{$this->layout}/{$action_form}_close", data: ['viewDatas' => $this->getViewDatas()]);
break;
default:
@ -268,6 +264,7 @@ abstract class MVController extends CommonController
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
$this->entity = $this->getModel()->delete($this->entity->getPK());
$this->message = "삭제작업을 완료하였습니다.";
}
final public function delete(string $uid): RedirectResponse
{
@ -276,9 +273,8 @@ abstract class MVController extends CommonController
try {
$this->delete_process($uid);
$this->getModel()->transCommit();
$message = "삭제작업을 완료하였습니다.";
log_message("notice", $message);
$this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], $message);
log_message("notice", $this->message);
$this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], $this->message);
return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/");
} catch (\Exception $e) {
//Transaction Rollback

View File

@ -9,9 +9,8 @@ use CodeIgniter\Validation\Validation;
use Psr\Log\LoggerInterface;
use App\Models\UserModel;
use App\Entities\UserEntity;
class UserController extends MVController
class UserController extends FrontController
{
private $_model = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
@ -81,40 +80,40 @@ class UserController extends MVController
return $this->create_form_procedure();
}
//로그인처리
protected function create_process(): void
{
// $this->create_validate($this->action, $this->fields);
$this->formDatas = $this->getFormDatas();
if (!isset($this->formDatas['id']) || !$this->formDatas['id']) {
throw new \Exception("사용자ID를 입력해주세요!");
}
if (!isset($this->formDatas['passwd']) || !$this->formDatas['passwd']) {
throw new \Exception("암호를 입력해주세요!");
}
$entity = $this->getModel()->getEntityByID($this->formDatas['id']);
if (is_null($entity) || !isset($entity->passwd)) {
throw new \Exception("사용자ID: {$this->formDatas['id']}가 존재하지 않습니다.");
}
if (password_verify($this->formDatas['passwd'], $entity->passwd)) {
//Session에 Login 정보전달
$this->session->set([
SESSION_NAMES['AUTH'] => [
'uid' => $entity->getPK(),
'name' => $entity->getTitle(),
'email' => $entity->email,
'role' => $entity->role
],
SESSION_NAMES['ISLOGIN'] => true
]);
$this->message = "로그인 성공";
} else {
throw new \Exception("로그인 실패");
}
}
public function create(): RedirectResponse|string
{
$this->init(__FUNCTION__);
$this->formDatas = $this->getFormDatas();
$id = $this->request->getVar('id');
$passwd = $this->request->getVar('passwd');
if (!$id) {
session()->setFlashdata('error', "사용자ID를 입력해주세요!");
return redirect()->back()->withInput();
}
if (!$passwd) {
session()->setFlashdata('error', "암호를 입력해주세요!");
return redirect()->back()->withInput();
}
$entity = $this->getModel()->getEntityByID($id);
if (is_null($entity) || !isset($entity->passwd)) {
session()->setFlashdata('error', "사용자ID: {$id}가 존재하지 않습니다.");
return redirect()->back()->withInput();
}
if (password_verify($passwd, $entity->passwd)) {
//Session에 Login 정보전달
$authData = [
'uid' => $entity->getPK(),
'name' => $entity->getTitle(),
'email' => $entity->email,
'role' => $entity->role,
SESSION_NAMES['ISLOGIN'] => true
];
session()->set($authData);
return redirect()->to($this->request->getVar(SESSION_NAMES['RETURN_URL']) ? $this->request->getVar(SESSION_NAMES['RETURN_URL']) : "/");
} else {
session()->setFlashdata('error', '암호가 맞지 않습니다.');
return redirect()->back()->withInput();
}
return $this->create_procedure();
}
//로그아웃
public function logout(): RedirectResponse

View File

@ -29,18 +29,19 @@ class AuthFilter implements FilterInterface
if (session()->get(SESSION_NAMES['ISLOGIN'])) {
$auth = session()->get(SESSION_NAMES['AUTH']);
// 회원 ROLES이 필요ROLE($arguments[0]) 목록에 존재하지 않으면(ACL)
if (!in_array($arguments[0], explode(DEFAULTS['DELIMITER_ROLE'], $auth[AUTH_FIELDS['ROLE']]))) {
if (!in_array($arguments[0], explode(DEFAULTS['DELIMITER_ROLE'], $auth['role']))) {
return redirect()->to(URLS['LOGIN'])->with(
'return_message',
sprintf(
"%s,%s회원님은 접속에 필요한 권한[%s]이 없습니다. ",
$auth[AUTH_FIELDS['ROLE']],
$auth[AUTH_FIELDS['TITLE']],
$auth['role'],
$auth['name'],
implode(",", $arguments)
)
);
}
} else {
dd(session()->get(SESSION_NAMES['AUTH']));
session()->setFlashdata(SESSION_NAMES['RETURN_URL'], $request->getUri()->getPath() . '?' . $request->getUri()->getQuery());
return redirect()->to(URLS['LOGIN'])->with('return_message', '로그인을하셔야합니다.');
}

View File

@ -33,7 +33,13 @@ function getFieldForm_AccountHelper(string $field, mixed $value, array $viewData
// return implode("&nbsp;", $checkboxs);
break;
case AccountModel::TITLE:
$form = form_input($field, $value, ["placeholder" => "예)test@exmaple.com", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)test@exmaple.com",
"style" =>
"width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'type':
case 'status':
@ -44,10 +50,17 @@ function getFieldForm_AccountHelper(string $field, mixed $value, array $viewData
break;
case 'updated_at':
case 'created_at':
$form = form_input($field, $value, ['class' => 'calender']);
$form = form_input($field, $value, [
"class" => "calener form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
default:
$form = form_input($field, $value, ["style" => "width:100%;"]);
$form = form_input($field, $value, [
"style" => "width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
}
return $form;

View File

@ -19,7 +19,12 @@ function getFieldForm_AuthHelper(string $field, mixed $value, array $viewDatas,
$value = $value ?: DEFAULTS['EMPTY'];
switch ($field) {
case AuthModel::TITLE:
$form = form_input($field, $value, ["placeholder" => "예)test@example.com", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)test@example.com",
"style" => "width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'status':
$form = form_dropdown($field, [
@ -29,10 +34,17 @@ function getFieldForm_AuthHelper(string $field, mixed $value, array $viewDatas,
break;
case 'updated_at':
case 'created_at':
$form = form_input($field, $value, ['class' => 'calender']);
$form = form_input($field, $value, [
"class" => "calender form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
default:
$form = form_input($field, $value, ["style" => "width:100%;"]);
$form = form_input($field, $value, [
"style" => "width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
}
return $form;

View File

@ -39,13 +39,29 @@ function getFieldForm_RecordHelper(string $field, mixed $value, array $viewDatas
// return implode("&nbsp;", $checkboxs);
break;
case RecordModel::TITLE: //host
$form = form_input($field, $value, ["placeholder" => "예)www.example.com", "style" => "width:200px; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)www.example.com",
"style" =>
"width:200px; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'hosts':
$form = form_textarea($field, html_entity_decode($value), ['class' => 'editor', 'rows' => '5']);
$form = form_textarea($field, html_entity_decode($value), [
'rows' => '5',
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'content':
$form = form_input($field, $value, ["placeholder" => "예)123.123.123.123", "style" => "width:200px; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)123.123.123.123",
"style" =>
"width:200px; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case "type":
case "fixed":
@ -59,10 +75,17 @@ function getFieldForm_RecordHelper(string $field, mixed $value, array $viewDatas
break;
case 'updated_at':
case 'created_at':
$form = form_input($field, $value, ['class' => 'calender']);
$form = form_input($field, $value, [
"class" => "calender form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
default:
$form = form_input($field, $value, ["style" => "width:100%;"]);
$form = form_input($field, $value, [
"style" => "width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
}
return $form;

View File

@ -33,16 +33,36 @@ function getFieldForm_ZoneHelper(string $field, mixed $value, array $viewDatas,
// return implode("&nbsp;", $checkboxs);
break;
case ZoneModel::TITLE:
$form = form_input($field, $value, ["placeholder" => "예)exmaple.com", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)exmaple.com",
"style" =>
"width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'domains':
$form = form_textarea($field, $value, ['class' => 'editor', 'rows' => '5']);
$form = form_textarea($field, $value, [
'rows' => '5',
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'hosts':
$form = form_textarea($field, $value == DEFAULTS['EMPTY'] ? "@\n*\nm\nwww" : $value, ['class' => 'editor', 'rows' => '5']);
$form = form_textarea($field, $value == DEFAULTS['EMPTY'] ? "@\n*\nm\nwww" : $value, [
'rows' => '5',
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'content':
$form = form_input($field, $value, ["placeholder" => "예)123.123.123.123", "style" => "width:200px; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)123.123.123.123",
"style" =>
"width:200px; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case "development_mode":
case "ipv6":
@ -62,10 +82,18 @@ function getFieldForm_ZoneHelper(string $field, mixed $value, array $viewDatas,
break;
case 'updated_at':
case 'created_at':
$form = form_input($field, $value, ['class' => 'calender']);
$form = form_input($field, $value, [
"class" => "calender form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
default:
$form = form_input($field, $value, ["style" => "width:100%;"]);
$form = form_input($field, $value, [
"style" =>
"width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
}
return $form;

View File

@ -19,10 +19,21 @@ function getFieldForm_MapurlHelper(string $field, mixed $value, array $viewDatas
$value = $value ?: DEFAULTS['EMPTY'];
switch ($field) {
case MapurlModel::TITLE:
$form = form_input($field, $value, ["placeholder" => "예)http://old.example.com", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)http://old.example.com",
"style" => "width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'newurl':
$form = form_input($field, $value, ["placeholder" => "예)https://new.example.com", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)https://new.example.com",
"style" =>
"width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'status':
$form = form_dropdown($field, [
@ -32,10 +43,18 @@ function getFieldForm_MapurlHelper(string $field, mixed $value, array $viewDatas
break;
case 'updated_at':
case 'created_at':
$form = form_input($field, $value, ['class' => 'calender']);
$form = form_input($field, $value, [
"class" => "calender form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
default:
$form = form_input($field, $value, ["style" => "width:100%;"]);
$form = form_input($field, $value, [
"style" =>
"width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
}
return $form;

View File

@ -19,7 +19,12 @@ function getFieldForm_UserHelper(string $field, mixed $value, array $viewDatas,
$value = $value ?: DEFAULTS['EMPTY'];
switch ($field) {
case UserModel::TITLE:
$form = form_input($field, $value, ["placeholder" => "예)", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)",
"style" => "width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'role':
if (in_array($viewDatas['action'], ['create', 'modify'])) {
@ -43,20 +48,41 @@ function getFieldForm_UserHelper(string $field, mixed $value, array $viewDatas,
], $value, $extras);
break;
case 'passwd':
$form = form_password($field, "", ["style" => "width:100%;"]);
$form = form_password($field, "", [
"style" => "width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'email':
$form = form_input($field, $value, ["placeholder" => "예)test@example.com", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)test@example.com",
"style" => "width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'mobile':
$form = form_input($field, $value, ["placeholder" => "예)010-0010-0010", "style" => "width:100%; ::placeholder{color:silver; opacity: 1;}"]);
$form = form_input($field, $value, [
"placeholder" => "예)010-0010-0010",
"style" => "width:100%; ::placeholder{color:silver; opacity: 1;}",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
case 'updated_at':
case 'created_at':
$form = form_input($field, $value, ['class' => 'calender']);
$form = form_input($field, $value, [
"class" => "calender form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
default:
$form = form_input($field, $value, ["style" => "width:100%;"]);
$form = form_input($field, $value, [
"style" => "width:100%;",
"class" => "form-control",
(strpos($viewDatas['field_rules'][$field], 'required') !== false) ? "required" : ""
]);
break;
}
return $form;

View File

@ -38,21 +38,11 @@ abstract class MyAuth
protected function setSession_process(UserEntity $entity): UserEntity
{
$this->_session->set(SESSION_NAMES['ISLOGIN'], true);
$auths = [];
foreach (array_values(AUTH_FIELDS) as $field) {
switch ($field) {
case 'id':
$auths[$field] = $entity->getPK();
break;
case 'title':
$auths[$field] = $entity->getTitle();
break;
case 'role':
$auths[$field] = $entity->$field;
break;
}
}
$this->_session->set(SESSION_NAMES['AUTH'], $auths);
$this->_session->set(SESSION_NAMES['AUTH'], [
'uid' => $entity->getPK(),
'name' => $entity->getTitle(),
'role' => $entity->role
]);
return $entity;
}
}

View File

@ -2,8 +2,6 @@
namespace App\Libraries\MySocket;
use GuzzleHttp\Client;
class GoogleSocket extends Google_Client
{
private $_session = null;

View File

@ -9,7 +9,6 @@ trait AuthTrait
final protected function session_AuthTrait(): Session
{
$session = \Config\Services::session();
$session->set(SESSION_NAMES['ISLOGIN'], false);
$session->set('currentRoles', [DEFAULTS["ROLE"]]);
if ($session->get(SESSION_NAMES['ISLOGIN'])) {
$session->set(SESSION_NAMES['ISLOGIN'], true);
@ -17,7 +16,7 @@ trait AuthTrait
'currentRoles',
explode(
DEFAULTS['DELIMITER_ROLE'],
$session->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['ROLE']]
$session->get(SESSION_NAMES['AUTH'])['role']
)
);
}

View File

@ -0,0 +1,25 @@
<?= $this->extend("layouts/{$viewDatas['layout']}/{$viewDatas['action_form']}") ?>
<?= $this->section('content') ?>
<link href="/css/<?= $viewDatas['layout'] ?>/content.css" media="screen" rel="stylesheet" type="text/css" />
<div class="login-container border rounded p-4 shadow">
<?= form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<h2 class="text-center mb-4">로그인</h2>
<div class="mb-3">
<label for="userId" class="form-label">아이디</label>
<input type="text" class="form-control" id="userId" name="id" value="<?= set_value('id') ?>" required>
</div>
<div class="mb-3">
<label for="userPassword" class="form-label">비밀번호</label>
<input type="password" class="form-control" id="userPassword" name="passwd" required>
</div>
<div class="d-flex justify-content-between align-items-center">
<button type="submit" class="btn btn-primary">로그인</button>
<button type="button" class="btn btn-outline-primary">회원가입</button>
<button type="button" class="btn btn-primary">
<img src="https://www.google.com/favicon.ico" alt="Google" width="20" height="20" class="me-2">
Google 로그인
</button>
</div>
<?= form_close(); ?>
</div>
<?= $this->endSection() ?>

View File

@ -2,10 +2,10 @@
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<title><?= LAYOUTS[$viewDatas['layout']]['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['metas'] as $meta): ?>
<?= $meta ?>
<?php endforeach; ?>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>
@ -28,7 +28,7 @@
</div>
<div class="middle">
<div class="left"><?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu'); ?></div>
<div class="center">
<div class="right">
<div class="header"><?= $this->include("templates/{$viewDatas['layout']}/header"); ?></div>
<div class="content"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include("templates/{$viewDatas['layout']}/footer"); ?></div>

View File

@ -23,19 +23,18 @@
<li class="nav-item">
<?php if ($viewDatas['session']->get(SESSION_NAMES['ISLOGIN'])): ?>
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<?= ICONS['LOGIN'] ?> <?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['TITLE']] ?>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item"
href="/front/user/update/<?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['ID']] ?>"><?= ICONS['SETUP'] ?>수정</a>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
</ul>
<?php else: ?><a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>"
role="button"><?= ICONS['LOGIN'] ?>Login</a><?php endif ?>
<?= ICONS['LOGIN'] . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['name'] ?>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item"
href="/user/modify/<?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])['uid'] ?>"><?= ICONS['SETUP'] ?>수정</a>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
</ul>
<?php else: ?><a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>"
role="button"><?= ICONS['LOGIN'] ?>Login</a><?php endif ?>
</li>
</ul>
</div>

View File

@ -2,10 +2,10 @@
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<title><?= LAYOUTS[$viewDatas['layout']]['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['metas'] as $meta): ?>
<?= $meta ?>
<?php endforeach; ?>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>

View File

@ -2,10 +2,10 @@
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<title><?= LAYOUTS[$viewDatas['layout']]['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['metas'] as $meta): ?>
<?= $meta ?>
<?php endforeach; ?>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>
@ -27,12 +27,9 @@
<?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/top'); ?>
</div>
<div class="middle">
<div class="left"><?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu'); ?></div>
<div class="center">
<div class="header"><?= $this->include("templates/{$viewDatas['layout']}/header"); ?></div>
<div class="content"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include("templates/{$viewDatas['layout']}/footer"); ?></div>
</div>
<div class="header"><?= $this->include("templates/{$viewDatas['layout']}/header"); ?></div>
<div class="content"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include("templates/{$viewDatas['layout']}/footer"); ?></div>
</div>
<div class="bottom">
<?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/bottom'); ?>

View File

@ -0,0 +1,3 @@
<nav class="tail navbar navbar-expand-lg">
</nav>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>
<?php foreach (LAYOUTS[$viewDatas['layout']]['javascripts'] as $javascript): ?>
<?= $javascript ?>
<?php endforeach; ?>
<link href="/css/<?= $viewDatas['layout'] ?>.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/<?= $viewDatas['layout'] ?>.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn' t work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="top">
<?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/top'); ?>
</div>
<div class="middle">
<div class="left"><?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu'); ?></div>
<div class="center">
<div class="header"><?= $this->include("templates/{$viewDatas['layout']}/header"); ?></div>
<div class="content"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include("templates/{$viewDatas['layout']}/footer"); ?></div>
</div>
</div>
<div class="bottom">
<?= $this->include(LAYOUTS[$viewDatas['layout']]['path'] . '/bottom'); ?>
</div>
</body>
</html>

View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>
<?php foreach (LAYOUTS[$viewDatas['layout']]['javascripts'] as $javascript): ?>
<?= $javascript ?>
<?php endforeach; ?>
<link href="/css/<?= $viewDatas['layout'] ?>.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/<?= $viewDatas['layout'] ?>.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn' t work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="content"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include("templates/{$viewDatas['layout']}/footer"); ?></div>
</body>
</html>

View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>
<?php foreach (LAYOUTS[$viewDatas['layout']]['javascripts'] as $javascript): ?>
<?= $javascript ?>
<?php endforeach; ?>
<link href="/css/<?= $viewDatas['layout'] ?>.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/<?= $viewDatas['layout'] ?>.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn' t work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="content"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include("templates/{$viewDatas['layout']}/footer"); ?></div>
</body>
</html>

View File

@ -0,0 +1,42 @@
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav"><a class="navbar-brand" href="#">관리페이지</a></nav>
<ul class="nav justify-content-center">
<li class="nav-item">
<?= ICONS['LOCK'] ?>
</li>
<li class="nav-item">
<input type="text" class="form-control" value="<?= getPasswordString_CommonHelper() ?>" id="makePassword">
</li>
<li class="nav-item">
<button class="btn btn-default border border-dark" type="button" id="totSearchBtn"
onClick="window.location.reload();"><?= ICONS['SEARCH'] ?></button>
</li>
<!-- <li class="nav-item">
<form class="d-flex me-20" role="search">
<input class="form-control" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</li> -->
</ul>
<ul class="nav justify-content-end">
<li class="nav-item">
<?php if ($viewDatas['session']->get(SESSION_NAMES['ISLOGIN'])): ?>
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<?= ICONS['LOGIN'] . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['name'] ?>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item"
href="/user/modify/<?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])['uid'] ?>"><?= ICONS['SETUP'] ?>수정</a>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
</ul>
<?php else: ?><a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>"
role="button"><?= ICONS['LOGIN'] ?>Login</a><?php endif ?>
</li>
</ul>
</div>
</nav>

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<title><?= LAYOUTS[$viewDatas['layout']]['title'] ?></title>
<?php foreach (LAYOUTS[$viewDatas['layout']]['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>

View File

@ -0,0 +1,64 @@
<?= $viewDatas['session']->getFlashdata(SESSION_NAMES['RETURN_MSG']) ? alert_CommonHelper($viewDatas['session']->getFlashdata(SESSION_NAMES['RETURN_MSG'])) : "" ?>
<script type="text/javascript">
$(document).ready(function() {
//class가 calender인 inputbox용,날짜field용
$(".calender").datepicker({
changeYear: true,
changeMonth: true,
yearRange: "-10:+0",
dateFormat: "yy-mm-dd"
});
//id가 batchjobuids_checkbox인 버튼을 클릭시 class가 batchjobuids_checkboxs인 checkbox용
$('#batchjobuids_checkbox').click(function(event) {
if (this.checked) {
$('.batchjobuids_checkboxs').each(function() { //loop checkbox
$(this).prop('checked', true); //check
});
} else {
$('.batchjobuids_checkboxs').each(function() { //loop checkbox
$(this).prop('checked', false); //uncheck
});
}
});
//class가 select-field인 SelectBox용
$(".select-field").select2({
theme: "classic",
width: 'style',
dropdownAutoWidth: true
});
// text editor 초기화
//참고: https://phppot.com/menu/php/learn-php/
// class가 editor인 textarea용
tinymce.init({
selector: 'textarea.tinymce',
plugins: ['code', 'image', 'preview', 'table', 'emoticons', 'autoresize'],
height: 600,
// content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
automatic_uploads: false,
images_upload_url: '/tinymce_upload.php',
// images_upload_base_path: '/upload_images',
images_upload_handler: function(blobInfo, success, failure) {
var xhr, formData;
xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.open('POST', '/tinymce_upload.php');
xhr.onload = function() {
var json;
if (xhr.status != 200) {
failure('HTTP Error: ' + xhr.status);
return;
}
json = JSON.parse(xhr.responseText);
if (!json || typeof json.file_path != 'string') {
failure('Invalid JSON: ' + xhr.responseText);
return;
}
success(json.file_path);
};
formData = new FormData();
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
},
});
});
</script>

View File

@ -0,0 +1,87 @@
<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>
</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>
</li>
</ul>
<div class="modal fade" id="DNSModal" tabindex="-1" aria-labelledby="CloudflareDNSModal" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="CloudflareDNSModal">Cloudflare DNS</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<style>
table.cloudflare {
width: 100%;
border: thin solid;
}
table.cloudflare th {
border: thin solid;
text-align: center;
padding: 0px 5px 0px 5px;
background-color: #e8e9ea;
}
table.cloudflare td {
border: thin solid;
text-align: center;
padding: 0px 5px 0px 5px;
}
table.cloudflare td.dnsname:hover {
cursor: pointer;
background-color: #fde9bf;
}
</style>
<script>
function copyToClipboard(element, domain) {
navigator.clipboard.writeText(domain);
element.style.backgroundColor = '#fde9bf';
}
</script>
<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,'tara.ns.cloudflare.com')">tara.ns.cloudflare.com</td>
</tr>
<tr>
<th>cloudjp002@idcjp.jp(~)</th>
<td class="dnsname" onclick="copyToClipboard(this,'aida.ns.cloudflare.com');">aida.ns.cloudflare.com</td>
<td class="dnsname" onclick="copyToClipboard(this,'kurt.ns.cloudflare.com');">kurt.ns.cloudflare.com</td>
</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,'plato.ns.cloudflare.com');">plato.ns.cloudflare.com</td>
</tr>
<tr>
<th>cloudwin001@idcjp.jp(,숫자)</th>
<td class="dnsname" onclick="copyToClipboard(this,'alina.ns.cloudflare.com');">alina.ns.cloudflare.com</td>
<td class="dnsname" onclick="copyToClipboard(this,'rick.ns.cloudflare.com');">rick.ns.cloudflare.com</td>
</tr>
<tr>
<th>cloudwin002@idcjp.jp(~)</th>
<td class="dnsname" onclick="copyToClipboard(this,'hope.ns.cloudflare.com');">hope.ns.cloudflare.com</td>
<td class="dnsname" onclick="copyToClipboard(this,'piotr.ns.cloudflare.com');">piotr.ns.cloudflare.com</td>
</tr>
<tr>
<th>cloudwin003@idcjp.jp(~)</th>
<td class="dnsname" onclick="copyToClipboard(this,'tani.ns.cloudflare.com');">tani.ns.cloudflare.com</td>
<td class="dnsname" onclick="copyToClipboard(this,'woz.ns.cloudflare.com');">woz.ns.cloudflare.com</td>
</tr>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,29 @@
<!-- 처음 호출할때 사용법
$this->include('templates/' . $viewDatas['layout'] . '/actionform');
-->
<!-- 동적으로 ifram src 바꾸고싶을때
<span onClick="changeIframe_src('신규URL')" style="cursor:pointer;"></span>
-->
<div class="index_action_form">
<iframe id="index_iframe" src=" <?= current_url() . "/create" ?>" scrolling="no">
<p>사용 중인 브라우저는 iframe을 지원하지 않습니다.</p>
</iframe>
</div>
<script>
function resizeIframe() {
var iframe = document.getElementById('index_iframe');
iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px';
}
function changeIframe_src(target_url) {
var iframe = document.getElementById('index_iframe');
var newIframe = iframe.cloneNode();
newIframe.src = target_url;
iframe.parentNode.replaceChild(newIframe, iframe); // 기존 iframe을 새 iframe으로 교체
}
document.addEventListener('DOMContentLoaded', function() {
var iframe = document.getElementById('index_iframe');
iframe.onload = resizeIframe; // iframe이 로드된 후 높이를 조정
});
</script>

View File

@ -0,0 +1,8 @@
<?= $this->extend("layouts/empty") ?>
<?= $this->section('content') ?>
<div class="text-center">
<div><?= $viewDatas['message'] ?></div>
<p>작업 완료 아래 버튼을 클릭하면 모달이 닫힙니다.</p>
<button onclick="parent.window.location.reload()">작업 완료</button>
</div>
<?= $this->endSection() ?>

View File

@ -0,0 +1,24 @@
<?= form_open(current_url(), array("method" => "get")) ?>
<nav class="index_top navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="condition nav">
조건검색:
<?php $fieldform_function = "getFieldForm_{$viewDatas['class_name']}Helper" ?>
<?php foreach ($viewDatas['filter_fields'] as $field): ?>
<?= $fieldform_function($field, $viewDatas[$field] ?: old($field), $viewDatas) ?>
<?php endforeach ?>
</nav>
<nav class="search nav justify-content-center">
검색어:<?= form_input('word', $viewDatas['word']) ?>
검색일:<?= form_input('start', $viewDatas['start'], ["class" => "calender"]) ?><?= form_input('end', $viewDatas['end'], ["class" => "calender"]) ?>
<?= form_submit('', '검색하기') ?>
<?= anchor(current_url() . '/download/excel', ICONS['EXCEL'], ["target" => "_self", "class" => "excel"]) ?>
</nav>
<nav class="pageinfo nav justify-content-end">
페이지 : <?= $viewDatas['page'] ?>/<?= $viewDatas['total_page'] ?>
<?= form_dropdown('per_page', $viewDatas['page_options'], $viewDatas['per_page'], array('onChange' => 'this.form.submit()')) ?>
/ :<?= $viewDatas['total_count'] ?>
</nav>
</div>
</nav>
<?= form_close() ?>

View File

@ -0,0 +1,61 @@
<!-- 처음 호출할때 사용법
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#iframeInModal" data-src="시작URL">시작</button>
-->
<!-- 동적으로 ifram src 바꾸고싶을때
<span data-bs-toggle="modal" data-bs-target="#iframeInModal" data-src="바꾸고싶은URL" style="cursor:pointer;">바꾸기</span>
-->
<div id="index_action_form" class="index_action_form modal fade" tabindex="-1" aria-labelledby="iframeModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable"> <!-- modal-lg는 모달 크기를 크게 설정 -->
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="iframeModalLabel">
<h4>&nbsp;&nbsp;<?= ICONS['DESKTOP'] ?> <?= $viewDatas['title'] ?>&nbsp;&nbsp;</h4>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<iframe id="iframeInModal" src="about:blank" width="100%" height="400" frameborder="0" allowfullscreen></iframe>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Modal이 열릴 iframe의 src를 설정 -->
<script>
function resizeIframe() {
var iframe = document.getElementById('iframeInModal');
iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px';
}
function closeBootstrapModal() {
var modalElement = document.getElementById('index_action_form'); // 모달의 실제 DOM 요소 가져오기
var modalInstance = bootstrap.Modal.getInstance(modalElement); // 모달 인스턴스 가져오기
if (modalInstance) {
// 먼저 모달을 호출한 페이지를 리로드
window.location.reload();
modalInstance.hide(); // 모달 닫기 (hide() 메서드 사용)
} else {
console.error("Modal instance not found.");
}
}
var index_action_form = document.getElementById('index_action_form');
index_action_form.addEventListener('show.bs.modal', function(event) {
// 버튼이 클릭된 이벤트를 가져옴
var button = event.relatedTarget;
// console.log(button.getAttribute('data-src'));
var iframeSrc = button.getAttribute('data-src'); // data-src 값을 가져옴
var iframe = document.getElementById('iframeInModal');
// console.log(iframe.getAttribute('src'));
iframe.src = iframeSrc; // 가져온 data-src 값을 iframe에 설정
// iframe.onload = resizeIframe; // iframe이 로드된 후 높이를 조정
});
// 모달이 닫힐 때 iframe src를 초기화하여 종료 처리
index_action_form.addEventListener('hidden.bs.modal', function() {
var iframe = document.getElementById('iframeInModal');
iframe.src = "about:blank"; // 모달 닫힐 때 iframe 초기화
});
</script>

View File

@ -0,0 +1,8 @@
<?= $this->extend("layouts/empty") ?>
<?= $this->section('content') ?>
<div class="text-center">
<div><?= $viewDatas['message'] ?></div>
<p>작업 완료 아래 버튼을 클릭하면 모달이 닫힙니다.</p>
<button onclick="parent.closeBootstrapModal()">작업 완료</button>
</div>
<?= $this->endSection() ?>

View File

@ -11,8 +11,9 @@
/* font-size: 15px; */
}
html,
body {
background-color: #efefef;
height: 100%;
}
div.top {
@ -24,23 +25,20 @@ div.top {
}
div.middle {
/* height: 100%; */
/* display: flex; */
/* border: 1px solid blue; */
}
div.middle div.left {
width: 217px;
/* overflow: auto; */
/* border: 1px solid red; */
}
/* div.middle div.left {
border: 1px solid red;
} */
div.middle div.center {
div.middle div.right {
width: 100%;
/* overflow: auto; */
/* border: 1px solid blue; */
}
div.middle div.center div.header {
div.middle div.right div.header {
/*content 헤더라인*/
height: 55px;
padding-top: 15px;
@ -51,11 +49,11 @@ div.middle div.center div.header {
border-radius: 15px 15px 0px 0px;
}
div.middle div.center div.header li.nav-item {
div.middle div.right div.header li.nav-item {
height: 40px;
}
div.middle div.center div.content {
div.middle div.right div.content {
/*content 부분*/
padding-top: 15px;
padding-left: 23px;
@ -66,7 +64,7 @@ div.middle div.center div.content {
background-color: white;
}
div.middle div.center div.footer {
div.middle div.right div.footer {
/*content 하단라인*/
height: 20px;
border-left: 1px solid gray;

View File

@ -1,60 +0,0 @@
div#left_menu{
/* position:fixed;
z-index:100; */
width:200px;
background-color:white;
}
div#left_menu div.parent {
font-size:1.5rem;
font-weight:bold;
height:170px;
padding-top:30px;
background-color: #eeeeee;
border:1px solid silver;
text-align:center;
}
div#left_menu div.parent div.title{
color:#26417D;
}
div#left_menu div.parent div{
font-size: 1.5rem;
}
/* leftmenu bar */
div#left_menu div.sibling {
padding-top:15px;
text-align:left;
padding-left:20px;
height:60px;
border-bottom:1px solid silver;
}
div#left_menu div.active {
background-color:#26417D;
}
div#left_menu div.sibling a{
text-decoration: none;
color:black;
font-size: 1.3rem;
}
div#left_menu div.sibling span.play{
float:right;
color:white;
padding-top:5px;
padding-right:15px;
}
div#left_menu div.active {
background-color:#26417D;
}
div#left_menu div.active a{
color:white;
}
div#left_menu div.sibling:hover {
background-color:#26417D;
}
div#left_menu div.sibling:hover a,div.active{
color:white;
}
div#left_menu div.sibling:hover span.play{
color:white;
}

View File

@ -1,46 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
div.login{
width: 799px;
height: 283px;
margin-top:30px;
margin-left:120px;
padding-top:155px;
background-image: url('/images/common/adminbg.png');
}
div.login form{
margin-left:300px;
/* border: 1px solid red; */
}
div.login form table {
width:300px;
/* border: 1px solid red; */
}
div.login form table td {
text-align: center;
color:white;
padding-right:5px;
/* border: 1px solid blue; */
}
div.login form table td.column {
height: 27px;
}
div.login form table td.login_bottom{
padding-top:20px;
}
div.login form table td.login_bottom a{
color:white;
}
/* div.login form table input[type=submit]{
width: 57px;
height: 60px;
background: url('/images/common/btn_login.png');
} */

View File

@ -1,50 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
div#content a {
color:black;
}
div#content div.login{
width: 509px;
margin-top:30px;
}
div#content div.login form {
padding-top:20px;
border:1px solid silver;
}
div#content div.login form div.label_column{
text-align:right;
/* border:1px solid red; */
}
div#content div.login form label.col-form-label{
font-size: 1.5rem;
font-weight:bold;
/* border:1px solid red; */
}
div#content div.login form input[type=text],input[type=password]{
text-align:left;
height:35px;
width:250px;
border:1px solid silver;
}
div#content div.login_bottom{
padding-top:20px;
padding-bottom:20px;
text-align:center;
}
/* div#content div.login form table input[type=submit]{
width: 57px;
height: 60px;
background: url('/images/common/btn_login.png');
} */

View File

@ -1,74 +0,0 @@
#top_menu{
width:1280px;
/* border:1px solid red; */
}
#top_menu a:hover{
text-decoration:none;
}
/* #top_menu nav.nav,ul.nav{
border:1px solid red;
} */
#top_menu a.navbar-brand{
font-size: 1.5rem;
font-weight:bold;
}
/* 메뉴바그룹 상단글자*/
#top_menu div.dropdown-center ul.navbar-nav a#navbarDarkDropdownMenuLink{
font-size: 1.3rem;
font-weight:bold;
/* border:1px solid silver; */
}
/* 메뉴바그룹 */
#top_menu div.dropdown-center ul.navbar-nav li.dropdown {
width:150px;
text-align:center;
/* border:1px solid red; */
}
/* 메뉴바그룹 hover했을시 */
#top_menu div.dropdown-center ul.navbar-nav li.dropdown:hover a#navbarDarkDropdownMenuLink{
color:#26417D;
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown:hover ul.dropdown-menu{
/* margin-top:15px; */
display: block;
/* 라운드없애기 */
border-radius:0px !important;
padding-bottom:0px;
border:0px;
/* border:1px solid silver; */
}
/* 메뉴바 */
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li{
height:60px;
padding-top:15px;
border-bottom:1px solid silver;
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li a{
width:150px;
font-size: 1.2rem;
font-weight:bold;
text-align:center;
text-decoration:none;
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li.active{
background-color:#26417D;
/* border:1px solid red; */
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li.active a{
color:white;
background-color:#26417D;
/* border:1px solid red; */
}
/* 메뉴바 over했을시*/
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li:hover{
background-color:#26417D;
/* border:1px solid red; */
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li:hover a{
color:white;
background-color:#26417D;
}

View File

@ -1,24 +0,0 @@
#top_navigator{
padding-top:20px;
padding-bottom:20px;
background-color:#eeeeee
}
#top_navigator ul.justify-content-center div.navigator_center span{
padding-left:5px;
padding-right:5px;
}
#top_navigator ul.justify-content-center div.navigator_center span strong{
color:#26417D;
font-weight: bold;
}
#top_navigator ul.justify-content-center div.navigator_center span strong{
color:#26417D;
font-weight: bold;
}
#top_navigator ul.justify-content-end li.cart a{
font-size: 1.5rem;
font-weight: 500;
}

View File

@ -7,45 +7,68 @@
* {
margin: 0px;
padding: 0px;
font-size: 14px;
}
/* #head{
border:1px solid blue;
} */
#tail{
text-align:center;
/* border:1px solid green; */
}
#layout {
width:1280px;
/* border:1px solid blue; */
border: 0px;
/* font-size: 15px; */
}
#layout #body{
padding-left:10px;
/* border:1px solid red; */
html,
body {
height: 100%;
}
#layout #body nav.header{
/*content 상단라인*/
padding-top:40px;
margin-left:30px;
border-bottom:1px solid silver;
div.top {
height: 51px;
margin-bottom: 10px;
border-top: 1px solid gray;
border-bottom: 1px solid gray;
background-color: #e8e9ea;
}
#layout #body nav.header nav h4.title{
font-size:2rem;
font-weight:bold;
div.middle {
/* border: 1px solid red; */
}
#layout #body nav.header nav span.flow{
color: gray;
div.middle div.header {
/*content 헤더라인*/
height: 55px;
padding-top: 15px;
background-color: #e7e7e7;
border-top: 1px solid gray;
border-left: 1px solid gray;
border-right: 1px solid gray;
border-radius: 15px 15px 0px 0px;
}
#layout #body div.footer
/*content 하단라인*/{
height:20px;
/* border-top:0px;
border-left:1px solid silver;
border-bottom:1px solid silver;
border-right:1px solid silver;
border-radius: 0px 0px 10px 10px;
background-color:white; */
div.middle div.header li.nav-item {
height: 40px;
}
div.middle div.content {
/*content 부분*/
padding-top: 15px;
padding-left: 23px;
padding-right: 15px;
padding-bottom: 15px;
border-left: 1px solid gray;
border-right: 1px solid gray;
background-color: white;
border: 1px solid red;
}
div.middle div.footer {
/*content 하단라인*/
height: 20px;
border-left: 1px solid gray;
border-right: 1px solid gray;
border-bottom: 1px solid gray;
border-radius: 0px 0px 15px 15px;
}
div.bottom {
height: 51px;
margin-top: 10px;
border-top: 1px solid gray;
border-bottom: 1px solid gray;
background-color: #efefef;
background-color: #e8e9ea;
}

View File

@ -1,18 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
table#billing td {
text-align: center;
color:white;
padding-right:5px;
/* border: 1px solid blue; */
}
table#billing td {
height: 27px;
}
table#billing td.label {
width: 15%;
}

View File

@ -1,96 +1,156 @@
div#content{
color:black;
padding-top:20px;
padding-left:30px;
margin-bottom:40px;
/* border-left:1px solid silver;
border-right:1px solid silver; */
/*조건검색*/
nav.index_top nav.condition {
border-color: 1px solid red;
}
/*검색*/
nav.index_top nav.search {
position: relative;
height: 30px;
border-color: 1px solid red;
}
nav.index_top nav.search input[type="text"] {
width: 200px;
height: 30px;
}
/*검색submit*/
nav.index_top nav.search input[type="submit"] {
font-weight: bold;
width: 80px;
height: 30px;
color: white;
background-color: #555555;
}
/*검색submit*/
nav.index_top nav.search a.excel {
position: absolute;
top: -9px;
right: -45px;
/* border-color: 1px solid red; */
}
/* div#content div.top{
border:1px solid red;
} */
/*페이지정보*/
div#content div.top nav span.pageinfo{
font-weight:bold;
}
/*검색*/
div#content div.top nav input[type=text]{
width:200px;
height:40px;
border-radius:0px !important;
/* border:1px solid red; */
}
/*검색submit*/
div#content div.top nav input[type=submit]{
font-size: 1.5rem;
font-weight:bold;
width:80px;
height:40px;
color:white;
border-radius:0px !important;
background-color:#555555;
/* border:1px solid red; */
}
/*Excel Icon*/
div#content div.top nav a{
border-radius:0px !important;
/* border:1px solid red; */
nav.index_top nav.pageinfo {
font-weight: bold;
/* border-color: 1px solid red; */
}
/* Table 부분 */
div#content table {
width:100%;
/* overflow-x: auto;
padding-top:5px;
padding-bottom:5px; */
table.index_table {
width: 100%;
/* table-layout: fixed; 고정 레이아웃 */
border-collapse: collapse;
/* 테두리 결합 */
}
/* insert,update,reply,view Form Page 관련 전용*/
div#content table.form tbody tr td.label{
width:10%;
text-align:right;
padding-right:20px;
background-color:#e8ebe9;
}
div#content table.form tbody tr td.column{
height:27px;
text-align:left;
padding-left:20px;
}
/* insert,update,reply,view Form Page 관련 전용*/
/* 상품 리스트 전용 */
div#content table.product tr:first-child {
border-top:2px solid black;
border-bottom:1px solid silver;
}
/* 상품 리스트 전용 */
div#content table thead th{
white-space: nowrap;
padding-top:15px;
padding-bottom:15px;
font-size: 1.5rem;
font-weight:bold;
border-top:2px solid black;
border-bottom:1px solid silver;
background-color:#F5F5F5;
/* border:1px solid silver; */
table.index_table thead th {
white-space: nowrap;
padding-top: 15px;
padding-bottom: 15px;
font-weight: bold;
border-top: 2px solid black;
border-bottom: 1px solid silver;
background-color: #f5f5f5;
text-align: center;
/* border:1px solid silver; */
}
div#content div.bottom {
padding-top:15px;
text-align:center;
div.index_bottom {
padding-top: 15px;
text-align: center;
word-wrap: break-word;
/* 긴 단어 강제 줄바꿈 */
white-space: normal;
/* 자동 줄바꿈 */
/* border: 1px solid red; */
}
div#content div.bottom ul.pagination {
margin-top:20px;
div.index_pagination nav {
margin-top: 20px;
/* border: 1px solid red; */
}
div#content div.bottom ul.pagination li.page-item a{
border:0px;
border-radius:0px !important;
background-color:#e8ebe9;
div.index_pagination nav ul.pagination {
/* border: 1px solid green; */
width: fit-content;
/* UL의 너비를 내용에 맞춤 */
margin: 0 auto;
/* 좌우 마진을 자동으로 설정하여 중앙 배치 */
padding: 0;
list-style: none;
/* 기본 점 스타일 제거 (옵션) */
}
div#content div.bottom ul.pagination li.active a{
background-color:gray;
div.index_pagination nav ul.pagination li {
margin-left: 5px;
}
div.index_pagination nav ul.pagination li a {
padding: 5px 10px 5px 10px;
font-size: 1.5rem;
color: white;
background-color: #808080;
}
div.index_pagination nav ul.pagination li.active a {
color: black;
border: 1px solid #808080;
}
div.index_pagination nav ul.pagination li a:hover {
border: 1px solid black;
}
div.index_action_form {
margin-top: 20px;
/* border: 1px solid red; */
}
div.index_action_form iframe {
width: 100%;
border: none;
/* border: 1px solid blue; */
}
/* create,modify,view 페이지용 */
table.action_form {
/* 블록 요소로 변경 */
margin-left: auto;
/* 자동 여백을 이용한 가로 가운데 정렬 */
margin-right: auto;
/* 자동 여백을 이용한 가로 가운데 정렬 */
/* border: 1px solid blue; */
/* table-layout: fixed; 고정 레이아웃 */
border-collapse: collapse;
/* 테두리 결합 */
}
table.action_form th {
text-align: center;
background-color: #f5f5f5;
}
table.action_form td {
text-align: center;
word-wrap: break-word;
/* 긴 단어 강제 줄바꿈 */
white-space: normal;
/* 자동 줄바꿈 */
}
/* create,modify,view 페이지용 */
div.login-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 400px;
height: 380px;
margin: auto;
display: flex;
flex-direction: column;
justify-content: center;
}

View File

@ -0,0 +1,56 @@
div#left_menu {
position: fixed;
margin-top: 60px;
z-index: 100;
border: 1px solid silver;
}
div#left_menu div#menu_button {
position: absolute;
top: -1px;
right: -21px;
width: 20px;
height: 160px;
cursor: pointer;
writing-mode: vertical-rl;
/* 세로로 글자를 출력 */
text-orientation: upright;
/* 글자가 직립되도록 설정 */
border-top: 1px solid silver;
border-right: 1px solid silver;
border-bottom: 1px solid silver;
border-radius: 0px 5px 5px 0px;
background-color: #e8e9ea;
}
div#left_menu div.accordion {
display: none;
width: 20px;
}
div#left_menu div.accordion div.main {
height: 50px;
padding-top: 15px;
padding-left: 10px;
background-color: white;
border-bottom: 1px solid silver;
}
div#left_menu div.accordion div.accordion-item {
height: 50px;
padding-top: 15px;
background-color: #eeeeee;
border-bottom: 1px solid silver;
}
div#left_menu div.accordion div.accordion-item:hover {
background-color: silver;
}
div#left_menu div.accordion div.accordion-item a {
padding-left: 20px;
}
div#left_menu div.accordion div.accordion-collapse a {
padding-left: 30px;
}

View File

@ -0,0 +1,17 @@
nav.top_menu ul.member-link{
/* border:1px solid red; */
color:#3a37f3;
padding-right:20px;
}
nav.top_menu ul.member-link a{
color:#3a37f3;
}
nav.top_menu ul.member-link ul.dropdown-menu li:hover{
background-color: #eaeaea;
}
nav.top_menu ul.member-link ul.dropdown-menu li a{
padding-left:10px;
}

View File

@ -1,50 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
div#order {
position:relative;
margin:0px;
padding:0px;
/* border:1px solid red; */
}
div#order div.orderbox {
/* position:fixed; */
width:200px;
padding:5px;
border:1px solid gray;
}
div#order div.orderbox div.title{
font-size: 1.5rem;
font-weight: 600;
border-bottom:2px solid gray;
}
div#order div.orderbox div.item{
padding-bottom:5px;
/* border:1px solid red; */
}
div#order div.orderbox div.item span.label{
color: gray;
}
div#order div.orderbox div.item span.value{
float:right;
}
div#order div.orderbox div.total{
padding-top:10px;
border-top:2px solid gray;
}
div#order div.orderbox div.total span.label{
color: gray;
}
div#order div.orderbox div.total span.value{
float:right;
font-size: 1.5rem;
font-weight: 800;
}
div#order div.orderbox div.submit{
padding-top:10px;
text-align:center;
}

View File

@ -1,69 +0,0 @@
@charset "utf-8";
/* doc.css는 디자인페이지 스타일을 정의합니다. */
.greeting {margin:0 -25px;}
.greeting:after {content:"";display:block;clear:both;}
.greeting .col {float:left; width:50%; padding:0 25px; box-sizing:border-box; text-align:justify; letter-spacing:-.40px;}
.company {position:relative; text-align:center; font-size:22px; line-height:1.4em; color:#2c2c2c; font-weight:300; padding-bottom:75px; margin-bottom:10px;}
.company strong {color:#30539f; font-weight:500}
.company:after {content:"";position:absolute; bottom:10px; left:50%; width:1px; height:46px; background:#ddd;}
.com-cnt {border:1px solid #ededed;}
.com-cnt:after {content:" "; display:block; clear:both;}
.com-cnt .col {float:left; width:33.333%; height:278px; position:relative;}
.com-cnt .col.bg1 {background:url('/images/sub/com_icon1.png') 50% 41px no-repeat;}
.com-cnt .col.bg2 {background:#f8f9fb url('/images/sub/com_icon2.png') 50% 31px no-repeat;}
.com-cnt .col.bg3 {background:url('/images/sub/com_icon3.png') 50% 33px no-repeat;}
.com-cnt .col:first-child:after {display:none;}
.com-cnt .col:after {content:"";position:absolute; top:0; left:0; width:1px; height:100%; background:#ededed;}
.com-cnt .col dl {padding-top:145px; text-align:center;}
.com-cnt .col dl dt {color:#284685; font-size:18px; line-height:1.4em; font-weight:500; margin-bottom:10px;}
.com-cnt .col dl dd {font-size:15px; line-height:1.4em; text-align:left; padding-left:76px;}
.app-cnt:after {content:" "; display:block; clear:both;}
.app-cnt .col {float:left; width:275px; height:130px; position:relative; box-sizing:border-box;}
.app-cnt .col.inquiry {width:345px}
.app-cnt .col:first-child:after {display:none;}
.app-cnt .col:after {content:"";position:absolute; top:0; left:0; width:1px; height:100%; background:#ededed;}
.app-cnt .col .box {width:100%; height:130px;position:relative; display:table;}
.app-cnt .col .icon {position:absolute; top:0; left:0; width:107px; height:107px; background:url('../images/sub/sub2_1_icon.gif') 0 50% no-repeat;}
.app-cnt .col .info {padding-left:130px; font-size:15px; line-height:1.6em; height:130px;position:relative; vertical-align:middle; display:table-cell; letter-spacing:-.30px;}
.app-cnt .col.type2 .info {padding-left:48px; font-size:16px;}
.app-cnt .col.type2 dl dt {color:#284685; font-size:18px; line-height:1.4em; font-weight:500; margin-bottom:5px;}
.app-cnt .col.type2 dl dt img {vertical-align:middle; padding-left:5px;}
.product-cnt {margin-bottom:70px; text-align:center;}
.product-cnt:last-child {margin-bottom:0}
.product-cnt p {line-height:0}
.product-cnt .col {position:relative; vertical-align:top; display:inline-block; width:420px; margin:-61px 10px 0 10px;}
.pro-title.type1 {background-color:#41adde}
.pro-title.type2 {background-color:#0280c9}
.pro-title.type3 {background-color:#284685}
.pro-title {font-size:20px; line-height:61px;color:#fff; font-weight:500; text-align:center;background-image:url('../images/sub/sub2_2_tit.png'); background-repeat:no-repeat; background-position:100% 0;}
.table01 table {width:100%; border-collapse:collapse; border-spacing:0px;}
.table01 table tbody th {padding:12px 10px; height:35px; font-size:16px; font-weight:500; line-height:22px; color:#4d4d4d; border-bottom:1px dotted #d6d6d6; background:#f6fafc;}
.table01 table tbody td {padding:12px 20px; color:#2c2c2c; font-size:16px; line-height:22px; border-bottom:1px dotted #d6d6d6;}
.table01 strong {font-weight:500}
.box-cnt {border:1px solid #e0e0e0; border-radius:10px; padding:38px 27px; margin-bottom:50px;}
.box-cnt:last-child {margin-bottom:0}
.box-cnt .title {background:#f6f6f6; font-size:20px; line-height:1.4em; color:#2c2c2c; padding:5px 0 5px 18px; font-weight:500; margin-bottom:15px;}
.box-cnt .cnt {padding-left:18px; font-size:17px; line-height:1.6em; font-weight:200}
.box-cnt .cnt dl dt {position:relative; color:#2e3192; font-size:18px; line-height:1.4em; font-weight:500; padding-left:18px;}
.box-cnt .cnt dl dt:after {content:"";position:absolute;top:50%; margin-top:-2px; left:0; width:10px; height:5px; background:#2e3192; border-radius:2px;}
.box-cnt .cnt dl dd {text-indent:-10px; padding-left:10px; letter-spacing:-.30px;}
/*
.sitemap:after {content:" "; display:block; clear:both;}
.sitemap dl {float:left; display:inline; width:225px; margin:0 0 30px 80px;}
.sitemap dl.first {margin-left:0}
.sitemap dl dt {padding:10px 0; text-align:center; font-size:16px; font-weight:500; color:#fff; margin:0 0 5px 0; background:#737373;border-top-left-radius:20px; border-bottom-right-radius:20px;}
.sitemap dl dd {line-height:40px; border-bottom:1px solid #eee; font-weight:300; text-indent:-12px; padding-left:13px;}
.sitemap dl dd a {display:block; padding:8px 0 8px 15px; font-size:15px; line-height:20px;}
.sitemap dl dd a:hover {color:#f1592a}
.sitemap dl dd ul {padding:2px 0 20px;}
.sitemap dl dd ul li a {background:none; color:#f1592a; font-size:12px; line-height:20px; padding:0 0 0 20px;}
*/

View File

@ -7,23 +7,49 @@
@charset "utf-8";
/* user class */
h1,h2,h3,h4,h5,h6,strong,th,.bold{font-weight:500;}
h1,
h2,
h3,
h4,
h5,
h6,
strong,
th,
.bold {
font-weight: 500;
}
input[type=text],input[type=password]{
input[type=text],
input[type=password] {
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
white-space: nowrap;
}
select,textarea,button {
select,
textarea,
button {
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
white-space: nowrap;
}
a:link { text-decoration: none; }
a:visited { text-decoration: none; }
a:hover { text-decoration: underline; }
a:active { text-decoration: underline; }
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:active {
text-decoration: underline;
}

View File

@ -1,11 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>