+ = anchor(
+ $category->linkurl . '?category=' . $category->getPrimaryKey(),
+ $category->getTitle(),
+ ["target" => "_self"]
+ ) ?>
+ = ICONS['PLAY'] ?>
+
+
\ No newline at end of file
diff --git a/app/Views/admin/category/reply.php b/app/Views/admin/category/reply.php
new file mode 100644
index 0000000..c807fb2
--- /dev/null
+++ b/app/Views/admin/category/reply.php
@@ -0,0 +1,24 @@
+= $this->extend('layouts/admin') ?>
+= $this->section('content') ?>
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+
+
+
+
= $this->include('templates/front/index_head') ?>
+
+
+
+ | # |
+ = getFieldIndex_Column_OrderHelper($field, $viewDatas) ?>
+ @ |
+
+
+
+
+
+
+
+
+ status == DEFAULTS['STATUS'] ? 'class="table-danger" rowcolor="red"' : 'rowcolor="red"' ?> onClick="indexRowCheckBoxToggle(this)">
+ |
+ = $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt) ?>
+ |
+
+ = getFieldIndex_Row_OrderHelper($field, $entity, $viewDatas) ?> |
+
+
+ status != DEFAULTS['STATUS']) : ?>
+ = anchor(URLS['cancelCart'] . '/' . $entity->getPrimaryKey(), ICONS['DELETE'], ["class" => "btn btn-sm btn-danger btn-circle", "target" => "_self"]) ?>
+
+ |
+
+ status == 'unuse') : ?>
+ price ?>
+ sale ?>
+
+
+
+
+
+
+
+
+
+ = form_open(URLS['Billing'], ['method' => 'post'], $viewDatas['forms']['hiddens']) ?>
+
+ = form_hidden("order_uids[]", $entity->getPrimaryKey()) ?>
+
+ = form_hidden("price", $order_price - $order_sale) ?>
+
결제정보
+
+ 상품수
+ = $order_cnt ?>개
+
+
+ 상품금액
+ = number_format($order_price) ?>원
+
+
+ 할인금액
+ = number_format($order_sale) ?>원
+
+
+ 총결제금액
+ = number_format($order_price - $order_sale) ?>원
+
+
+ = $order_cnt ? form_submit('', '구매하기', array('', "class" => "btn btn-outline btn-primary")) : "결제할 주문건수가 없습니다." ?>
+
+ = form_close(); ?>
+
+
+
= $viewDatas['pagination'] ?>
+
= html_entity_decode($viewDatas['category']->tail) ?>
+
+
+ = $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/order/view.php b/app/Views/front/order/view.php
new file mode 100644
index 0000000..cc92a5c
--- /dev/null
+++ b/app/Views/front/order/view.php
@@ -0,0 +1,21 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+
+
= html_entity_decode($viewDatas['category']->tail) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/product/cell/virtual_calculator.php b/app/Views/front/product/cell/virtual_calculator.php
new file mode 100644
index 0000000..e11d813
--- /dev/null
+++ b/app/Views/front/product/cell/virtual_calculator.php
@@ -0,0 +1,87 @@
+
+
+
+ = form_open(URLS['addCart'], [
+ 'method' => 'post',
+ "onsubmit" => 'return calculator(' . $viewDatas['parts']['virtual']['default']['baserate'] . ')'
+ ]) ?>
+
+
+
+
+
+ | 가상서버 견적 계산기 |
+
+
+
+
+ | 기본요금 |
+
+ = number_format($viewDatas['parts']['virtual']['default']['baserate']) ?>원
+ |
+
+ $attrs) : ?>
+
+ | = $attrs['label'] ?> |
+
+ = number_format($attrs['cost']) ?>원
+ 할인가 = number_format($attrs['cost'] - $attrs['sale']) ?> *
+ = form_dropdown(
+ $category,
+ $attrs['options'],
+ old($category, 0),
+ [
+ 'id' => $category,
+ 'class' => 'vhost_parts',
+ 'cost' => $attrs['cost'],
+ 'sale' => $attrs['sale'],
+ 'onChange' => "calculator(" . $viewDatas['parts']['virtual']['default']['baserate'] . ")"
+ ]
+ ) ?>
+ = $attrs['unit'] ?>
+ |
+
+
+
+ | 결제일 |
+
+ "결제일 선택"];
+ for ($i = 1; $i <= 28; $i++) {
+ $paymentDayOptions[$i] = "매월 {$i}일";
+ }
+ ?>
+ = form_dropdown('paymentday', $paymentDayOptions, old('paymentday', 25), ['id' => 'paymentday']);
+ ?>
+ |
+
+
+ | 주문금액 |
+
+ 0원
+ = form_submit('', '신청', array("class" => "btn btn-outline btn-primary")); ?>
+ |
+
+
+
+ = form_close() ?>
+
+ = $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
+
\ No newline at end of file
diff --git a/app/Views/front/product/index.php b/app/Views/front/product/index.php
new file mode 100644
index 0000000..746c840
--- /dev/null
+++ b/app/Views/front/product/index.php
@@ -0,0 +1,39 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+
+ = $this->include('templates/front/index_head_product') ?>
+
+
+
+
+
+
+ | = $entity->getFileImage('middle') ?> |
+ = getFieldIndex_Row_ProductHelper('name', $entity, $viewDatas) ?> |
+
+
+ |
+ 구매비용 : = getFieldIndex_Row_ProductHelper('price', $entity, $viewDatas) ?>
+ =
+
+ 상품원가 : = getFieldIndex_Row_ProductHelper('cost', $entity, $viewDatas) ?>
+ -
+ 할인가 : = getFieldIndex_Row_ProductHelper('sale', $entity, $viewDatas) ?>
+
+ |
+
+
+ | 조회수 : = getFieldIndex_Row_ProductHelper('view_cnt', $entity, $viewDatas) ?> |
+
+
+
+
+
+
= $viewDatas['pagination'] ?>
+
+
= html_entity_decode($viewDatas['category']->tail) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/product/view.php b/app/Views/front/product/view.php
new file mode 100644
index 0000000..ae54358
--- /dev/null
+++ b/app/Views/front/product/view.php
@@ -0,0 +1,75 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+
+ status == DEFAULTS['STATUS']) : ?>
+ = form_open(URLS['addCart'], ['method' => 'post']) ?>
+ = form_hidden("product_uid", $viewDatas['entity']->getPrimaryKey()) ?>
+
+ "구매수량 선택"];
+ for ($i = 1; $i <= $viewDatas['entity']->stock; $i++) {
+ $quantityOptions[$i] = $i . "개";
+ }
+ ?>
+
+ = form_close(); ?>
+
+
+ 이제품은 현재[= lang('Product.STATUS.' . $viewDatas['entity']->status) ?>]입니다.
+
+
= html_entity_decode($viewDatas['category']->tail) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/sitepage/index.php b/app/Views/front/sitepage/index.php
new file mode 100644
index 0000000..f5c6e77
--- /dev/null
+++ b/app/Views/front/sitepage/index.php
@@ -0,0 +1,14 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
+
= html_entity_decode($viewDatas['currentCategory']->head) ?>
+
+
+ = getFieldIndex_Row_SitepageHelper('content', $entity, $viewDatas) ?>
+
+
+
= html_entity_decode($viewDatas['currentCategory']->tail) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/user/index.php b/app/Views/front/user/index.php
new file mode 100644
index 0000000..2b83e63
--- /dev/null
+++ b/app/Views/front/user/index.php
@@ -0,0 +1,41 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+
= $this->include('templates/front/index_head') ?>
+ = form_open(current_url() . '/batchjob', $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
+
+
+
+ | # |
+ = getFieldIndex_Column_UserHelper($field, $viewDatas) ?>
+
+
+
+
+
+ status != DEFAULTS['STATUS'] ? 'class="table-danger" rowcolor="red"' : 'rowcolor="red"' ?> onClick="indexRowCheckBoxToggle(this)">
+ |
+
+ getPrimaryKey() == $viewDatas['auth'][AUTH_FIELDS['ID']]) : ?>
+ = anchor(current_url() . '/update/' . $entity->getPrimaryKey(), $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt), ["target" => "_self"]) ?>
+
+ = $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt) ?>
+
+ |
+
+ = getFieldIndex_Row_UserHelper($field, $entity, $viewDatas) ?> |
+
+
+
+
+
+
+
+ = $viewDatas['pagination'] ?>
+
+ = form_close() ?>
+
= html_entity_decode($viewDatas['category']->tail) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/user/insert.php b/app/Views/front/user/insert.php
new file mode 100644
index 0000000..947afee
--- /dev/null
+++ b/app/Views/front/user/insert.php
@@ -0,0 +1,24 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+ = form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
+
+ = form_close(); ?>
+
= html_entity_decode($viewDatas['category']->tail) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/user/login.php b/app/Views/front/user/login.php
new file mode 100644
index 0000000..870cc8b
--- /dev/null
+++ b/app/Views/front/user/login.php
@@ -0,0 +1,41 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
+
+ = form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
+
+
+ | 계정 |
+
+ = form_input('id', old('id', DEFAULTS['EMPTY'])) ?>
+ |
+
+ = form_input([
+ 'type' => 'image', 'src' => "/images/common/btn_login.png",
+ 'width' => '57', 'height' => '60',
+ ]) ?>
+ |
+
+ $login_button) : ?>
+ = $login_button ?>
+
+ |
+
+
+ | 암호 |
+
+ = form_password('passwd', old('passwd', DEFAULTS['EMPTY'])) ?>
+ |
+
+
+ |
+ 회원가입
+ |
+
+
+ = form_close(); ?>
+
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/user/login_v1.php b/app/Views/front/user/login_v1.php
new file mode 100644
index 0000000..49a5bf4
--- /dev/null
+++ b/app/Views/front/user/login_v1.php
@@ -0,0 +1,37 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
+
+ = form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
+
+
+
+
+
+ = form_input('id', old('id', DEFAULTS['EMPTY'])) ?>
+
+
+
+
+
+
+
+ = form_password('passwd', old('passwd', DEFAULTS['EMPTY'])) ?>
+
+
+
+
+ = form_submit('', '로그인', array("class" => "btn btn-outline btn-primary")) ?>
+
+
+
+
+ = form_close(); ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/user/update.php b/app/Views/front/user/update.php
new file mode 100644
index 0000000..38175fb
--- /dev/null
+++ b/app/Views/front/user/update.php
@@ -0,0 +1,24 @@
+= $this->extend('layouts/front') ?>
+= $this->section('content') ?>
+
+
+
= html_entity_decode($viewDatas['category']->head) ?>
+ = form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
+
+ = form_close(); ?>
+
= html_entity_decode($viewDatas['category']->head) ?>
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/front/welcome_message.php b/app/Views/front/welcome_message.php
new file mode 100644
index 0000000..6910f05
--- /dev/null
+++ b/app/Views/front/welcome_message.php
@@ -0,0 +1,246 @@
+= $this->extend('layouts/main') ?>
+= $this->section('content') ?>
+
+
+
+ -
+
+
+ - SERVER
+ - - 정품HP 서버 사용
+ - - 안정적인 RAID 1+0 구성
+ - - 365/24 기술문의 가능
+
+
+
+ -
+
+
+ - NETWORK
+ - - 안정적인 기가망 사용
+ - - 100%에 도전! DDOS 방어
+ - - 실시간 트래픽 관제
+
+
+
+ -
+
+
+ - SERVICE
+ - - 365일24시간 고객대응
+ - - 친절한 고객 응대
+ - - 신속하고 정확한 작업 처리
+
+
+
+
+
+
+
+
+
PRICE & SPECIFICATION
+
IT Solution의 주력상품(서버)안내 및 사양, 가격정보입니다.
+
+
+
+
+
+ 4core
+
+
+
+
+
+
+ | 4core |
+
+
+
+
+ | CPU |
+ E5530 |
+
+
+ | RAM |
+ 8G |
+
+
+ | HDD |
+ SAS146G*4 |
+
+
+ | 임대료 |
+ 35만원 할인가 25만원 (회선비 별도) |
+
+
+
+
+
+
+
+
+ 8core
+
+
+
+
+
+
+ | 8core |
+
+
+
+
+ | CPU |
+ X5560*2 |
+
+
+ | RAM |
+ 16G |
+
+
+ | HDD |
+ SSD128G*2+SATA500G*2 |
+
+
+ | 임대료 |
+ 45만원 할인가 35만원 (회선비 별도) |
+
+
+
+
+
+
+
+
+ 12core
+
+
+
+
+
+
+ | 12core |
+
+
+
+
+ | CPU |
+ X5650*2 |
+
+
+ | RAM |
+ 16G |
+
+
+ | HDD |
+ SSD128G*2+SATA500G*2 |
+
+
+ | 임대료 |
+ 55만원 할인가 45만원 (회선비 별도) |
+
+
+
+
+
+
+
+
+ 20core
+
+
+
+
+
+
+ | 20core |
+
+
+
+
+ | CPU |
+ E2690v2*2 |
+
+
+ | RAM |
+ 32G |
+
+
+ | HDD |
+ SSD128G*2+SATA500G*2 |
+
+
+ | 임대료 |
+ 65만원 할인가 55만원 (회선비 별도) |
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ - 고객센터
+ -
+ - 1661-0577
+ - 365일 24시간
+
+
+
+ -
+
+
+ - 입금계과
+ - = MALLS['banks']['BANK1']['name'] ?> : = MALLS['banks']['BANK1']['account'] ?>
+ - = MALLS['banks']['BANK2']['name'] ?> : = MALLS['banks']['BANK2']['account'] ?>
+ - 예 금 주 : = MALLS['banks']['BANK1']['holder'] ?>
+
+
+
+ -
+
+
+ - 공지사항
+ - = view_cell('BoardCell::information', $viewDatas) ?>
+
+
+
+
+
+
+
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/app/Views/layouts/admin.php b/app/Views/layouts/admin.php
new file mode 100644
index 0000000..9b661e7
--- /dev/null
+++ b/app/Views/layouts/admin.php
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+ = $stylesheet ?>
+
+
+ = $javascript ?>
+
+
+
+
+
+
+
+
= $viewDatas['title'] ?>
+
+
+
+
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator'); ?>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/left_menu.php b/app/Views/layouts/admin/left_menu.php
new file mode 100644
index 0000000..d63aba4
--- /dev/null
+++ b/app/Views/layouts/admin/left_menu.php
@@ -0,0 +1,10 @@
+
+
+
+
+
+ = $this->include($viewDatas['layout']['path'] . '/left_menu/base'); ?>
+ = $this->include($viewDatas['layout']['path'] . '/left_menu/board'); ?>
+ = $this->include($viewDatas['layout']['path'] . '/left_menu/shoppingmall'); ?>
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/left_menu/base.php b/app/Views/layouts/admin/left_menu/base.php
new file mode 100644
index 0000000..51ebec1
--- /dev/null
+++ b/app/Views/layouts/admin/left_menu/base.php
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/left_menu/board.php b/app/Views/layouts/admin/left_menu/board.php
new file mode 100644
index 0000000..29799bc
--- /dev/null
+++ b/app/Views/layouts/admin/left_menu/board.php
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/left_menu/shoppingmall.php b/app/Views/layouts/admin/left_menu/shoppingmall.php
new file mode 100644
index 0000000..666f50a
--- /dev/null
+++ b/app/Views/layouts/admin/left_menu/shoppingmall.php
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/make_password.php b/app/Views/layouts/admin/make_password.php
new file mode 100644
index 0000000..23f0cc2
--- /dev/null
+++ b/app/Views/layouts/admin/make_password.php
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/top_navigator.php b/app/Views/layouts/admin/top_navigator.php
new file mode 100644
index 0000000..9a55593
--- /dev/null
+++ b/app/Views/layouts/admin/top_navigator.php
@@ -0,0 +1,20 @@
+
+
+
+ 관리페이지
+
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator/make_password'); ?>
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator/search'); ?>
+
+
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator/member_link'); ?>
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/top_navigator/make_password.php b/app/Views/layouts/admin/top_navigator/make_password.php
new file mode 100644
index 0000000..cbb0baa
--- /dev/null
+++ b/app/Views/layouts/admin/top_navigator/make_password.php
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/top_navigator/member_link.php b/app/Views/layouts/admin/top_navigator/member_link.php
new file mode 100644
index 0000000..0750447
--- /dev/null
+++ b/app/Views/layouts/admin/top_navigator/member_link.php
@@ -0,0 +1,14 @@
+
+
+
+ = ICONS['LOGIN'] ?>= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['TITLE']] ?>
+
+
+ = ICONS['LOGIN'] ?>Login
+
\ No newline at end of file
diff --git a/app/Views/layouts/admin/top_navigator/search.php b/app/Views/layouts/admin/top_navigator/search.php
new file mode 100644
index 0000000..d5a2c9f
--- /dev/null
+++ b/app/Views/layouts/admin/top_navigator/search.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/app/Views/layouts/common/copyright.php b/app/Views/layouts/common/copyright.php
new file mode 100644
index 0000000..8b25113
--- /dev/null
+++ b/app/Views/layouts/common/copyright.php
@@ -0,0 +1,29 @@
+
+
+
+
LOGO
+
+
+
+
회사소개
+
이용약관
+
개인정보취급방침
+
이용안내
+
+ # 회사 소개
+ Itsoluton은 해외 상품을 편리하게 이용할 수 있도록 도와 드리는 구매대행업입니다.
+ 일본소재 ㈜YYY의 상품에 대해 총판권을 가지고, 편리하게 이용할 수 있도록 지원해주고 있습니다.
+ 항상 빠르고 안전하고 저렴한 가격으로 고객님을 대신해서 구매대행을 진행할 수 있도록 하겠습니다.
+ 언제나 믿고 신뢰할 수 있는 르호봇이 되도록 노력하겠습니다.
+ 감사합니다.
+
+
+
+ 주소 : 전자우편주소 : itsolutionidc.jp@gmail.com 전화번호 : 1661-0577
+ 사업자등록번호 : 777-86-00287 [사업자정보확인]통신판매업신고번호 : 2023-사울동작-0001
+
+
+
+
Copyright(c) www.itsolution-mall.com All Right Reserved.
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/empty.php b/app/Views/layouts/empty.php
new file mode 100644
index 0000000..2f23d0f
--- /dev/null
+++ b/app/Views/layouts/empty.php
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+ = $stylesheet ?>
+
+
+ = $javascript ?>
+
+
+
+
+
+
+
+
= $viewDatas['title'] ?>
+
+
+
+
+ = $this->include('templates/empty/header'); ?>
+ = $this->renderSection('content') ?>
+ = $this->include('templates/empty/footer'); ?>
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/front.php b/app/Views/layouts/front.php
new file mode 100644
index 0000000..531e190
--- /dev/null
+++ b/app/Views/layouts/front.php
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = $stylesheet ?>
+
+
+ = $javascript ?>
+
+
+
+
+
+
+
+
= $viewDatas['title'] ?>
+
+
+
+
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator'); ?>
+ = $this->include($viewDatas['layout']['path'] . '/top_menu'); ?>
+ = CLASS_TOP_BANNER[strtoupper($viewDatas['className'])] ?>
+
+
+
+
+
+
+ |
+ = $this->include($viewDatas['layout']['path'] . '/left_menu'); ?>
+ |
+
+ = $this->include('templates/front/header'); ?>
+ = $this->renderSection('content') ?>
+ = $this->include('templates/front/footer'); ?>
+ |
+
+
+
+
+
+ = $this->include($viewDatas['layout']['path'] . '/../common/copyright'); ?>
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/front/left_menu.php b/app/Views/layouts/front/left_menu.php
new file mode 100644
index 0000000..98b79d8
--- /dev/null
+++ b/app/Views/layouts/front/left_menu.php
@@ -0,0 +1,16 @@
+ if ($viewDatas['category']) : ?>
+
+
+
+
+ endif ?>
\ No newline at end of file
diff --git a/app/Views/layouts/front/top_menu.php b/app/Views/layouts/front/top_menu.php
new file mode 100644
index 0000000..02e4449
--- /dev/null
+++ b/app/Views/layouts/front/top_menu.php
@@ -0,0 +1,37 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/front/top_navigator.php b/app/Views/layouts/front/top_navigator.php
new file mode 100644
index 0000000..31f2cbd
--- /dev/null
+++ b/app/Views/layouts/front/top_navigator.php
@@ -0,0 +1,21 @@
+
+
+
+
+ Logo
+
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator/top_center'); ?>
+
+
+
+ -
+ = anchor('/front/order', ICONS['CART'], ["target" => "_self"]); ?>
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator/member_link'); ?>
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/front/top_navigator/member_link.php b/app/Views/layouts/front/top_navigator/member_link.php
new file mode 100644
index 0000000..2a3461d
--- /dev/null
+++ b/app/Views/layouts/front/top_navigator/member_link.php
@@ -0,0 +1,14 @@
+
+
+
+ = ICONS['LOGIN'] ?>= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['TITLE']] ?>
+
+
+ = ICONS['LOGIN'] ?>Login
+
\ No newline at end of file
diff --git a/app/Views/layouts/front/top_navigator/search.php b/app/Views/layouts/front/top_navigator/search.php
new file mode 100644
index 0000000..410d2e9
--- /dev/null
+++ b/app/Views/layouts/front/top_navigator/search.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/app/Views/layouts/front/top_navigator/top_center.php b/app/Views/layouts/front/top_navigator/top_center.php
new file mode 100644
index 0000000..4103c38
--- /dev/null
+++ b/app/Views/layouts/front/top_navigator/top_center.php
@@ -0,0 +1,5 @@
+
+
고객센터 1661-0577 (365일 24시간)
+
|
+
itsolution-idc@outlook.kr
+
\ No newline at end of file
diff --git a/app/Views/layouts/main.php b/app/Views/layouts/main.php
new file mode 100644
index 0000000..a5604fd
--- /dev/null
+++ b/app/Views/layouts/main.php
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = $stylesheet ?>
+
+
+ = $javascript ?>
+
+
+
+
+
+
+
+
+
= $viewDatas['title'] ?>
+
+
+
+
+ = $this->include($viewDatas['layout']['path'] . '/top_navigator'); ?>
+ = $this->include($viewDatas['layout']['path'] . '/top_menu'); ?>
+
+
+
+
+
+
+
+
+
+ = $this->renderSection('content') ?>
+
+
+
+
+ = $this->include($viewDatas['layout']['path'] . '/../common/copyright'); ?>
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/main/board.php b/app/Views/layouts/main/board.php
new file mode 100644
index 0000000..39df150
--- /dev/null
+++ b/app/Views/layouts/main/board.php
@@ -0,0 +1,3 @@
+
공지사항글입니다.2023-08-04
+
공지사항글입니다.2023-08-04
+
공지사항글입니다.2023-08-04
\ No newline at end of file
diff --git a/app/Views/layouts/main/top_menu.php b/app/Views/layouts/main/top_menu.php
new file mode 100644
index 0000000..db885de
--- /dev/null
+++ b/app/Views/layouts/main/top_menu.php
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
TOP Menu
+
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_menu/top_menu_aboutus'); ?>
+
+ - |
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_menu/top_menu_hosting'); ?>
+
+ - |
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_menu/top_menu_server'); ?>
+
+ - |
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_menu/top_menu_network'); ?>
+
+ - |
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_menu/top_menu_service'); ?>
+
+ - |
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_menu/top_menu_support'); ?>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/layouts/main/top_navigator.php b/app/Views/layouts/main/top_navigator.php
new file mode 100644
index 0000000..394b9b3
--- /dev/null
+++ b/app/Views/layouts/main/top_navigator.php
@@ -0,0 +1,21 @@
+
+
+
+
+ Logo
+
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_navigator/top_center'); ?>
+
+
+
+ -
+ = anchor('/front/order', ICONS['CART'], ["target" => "_self"]); ?>
+
+ -
+ = $this->include($viewDatas['layout']['path'] . '/../common/top_navigator/member_link'); ?>
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/Pagers/bootstrap_full.php b/app/Views/templates/Pagers/bootstrap_full.php
new file mode 100644
index 0000000..8d0df7a
--- /dev/null
+++ b/app/Views/templates/Pagers/bootstrap_full.php
@@ -0,0 +1,34 @@
+setSurroundCount(2);
+?>
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/Pagers/bootstrap_simple.php b/app/Views/templates/Pagers/bootstrap_simple.php
new file mode 100644
index 0000000..e728703
--- /dev/null
+++ b/app/Views/templates/Pagers/bootstrap_simple.php
@@ -0,0 +1,17 @@
+setSurroundCount(0);
+?>
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/admin/footer.php b/app/Views/templates/admin/footer.php
new file mode 100644
index 0000000..4323c69
--- /dev/null
+++ b/app/Views/templates/admin/footer.php
@@ -0,0 +1,36 @@
+
+= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
+
\ No newline at end of file
diff --git a/app/Views/templates/admin/header.php b/app/Views/templates/admin/header.php
new file mode 100644
index 0000000..eecf4e8
--- /dev/null
+++ b/app/Views/templates/admin/header.php
@@ -0,0 +1,9 @@
+
+
+
+ = $viewDatas['class_icon'] ?>= $viewDatas['title'] ?>
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/admin/index_head.php b/app/Views/templates/admin/index_head.php
new file mode 100644
index 0000000..5630f6f
--- /dev/null
+++ b/app/Views/templates/admin/index_head.php
@@ -0,0 +1,19 @@
+
+
+
+
+ 페이지정보 : = $viewDatas['page'] ?>/= $viewDatas['total_page'] ?>
+ = form_dropdown('per_page', $viewDatas['pageOptions'], $viewDatas['per_page'], array('onChange' => 'this.form.submit()')) ?> / 총:= $viewDatas['total_count'] ?>
+
+
+
+
+ = form_open(current_url(), array("method" => "get")) ?>
+ 검색어:= form_input('word', $viewDatas['word']) ?>
+ 검색일:= form_input('start', $viewDatas['start'], ["class" => "calender"]) ?>= form_input('end', $viewDatas['end'], ["class" => "calender"]) ?>
+ = form_submit('', '검색하기') ?>
+ = anchor(current_url() . '/excel?' . $viewDatas['uri']->getQuery(), ICONS['EXCEL'], ["target" => "_self"]) ?>
+ = form_close() ?>
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/empty/footer.php b/app/Views/templates/empty/footer.php
new file mode 100644
index 0000000..1d48638
--- /dev/null
+++ b/app/Views/templates/empty/footer.php
@@ -0,0 +1,2 @@
+
+= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
\ No newline at end of file
diff --git a/app/Views/templates/empty/header.php b/app/Views/templates/empty/header.php
new file mode 100644
index 0000000..5b6637d
--- /dev/null
+++ b/app/Views/templates/empty/header.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Views/templates/front/footer.php b/app/Views/templates/front/footer.php
new file mode 100644
index 0000000..1da6eec
--- /dev/null
+++ b/app/Views/templates/front/footer.php
@@ -0,0 +1,35 @@
+
+= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
+
\ No newline at end of file
diff --git a/app/Views/templates/front/header.php b/app/Views/templates/front/header.php
new file mode 100644
index 0000000..e8aa951
--- /dev/null
+++ b/app/Views/templates/front/header.php
@@ -0,0 +1,11 @@
+
+
+
+ = $viewDatas['class_icon'] ?>= $viewDatas['currentCategory']->getTitle() ?>
+
+
+
+ = ICONS['HOME'] ?> > = $viewDatas['menus'][$viewDatas['currentCategory']->parent]['entity']->getTitle() ?> > = $viewDatas['currentCategory']->getTitle() ?>
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/front/index_head.php b/app/Views/templates/front/index_head.php
new file mode 100644
index 0000000..ef2a37b
--- /dev/null
+++ b/app/Views/templates/front/index_head.php
@@ -0,0 +1,14 @@
+
+
+
+ 페이지정보 : = $viewDatas['page'] ?>/= $viewDatas['total_page'] ?>
+
+
+
+ = form_open(current_url(), array("method" => "get")) ?>
+ = form_input('word', $viewDatas['word']) ?>
+ = form_submit('', '검색하기') ?>
+ = form_close() ?>
+
+
+
\ No newline at end of file
diff --git a/app/Views/templates/front/index_head_product.php b/app/Views/templates/front/index_head_product.php
new file mode 100644
index 0000000..c209662
--- /dev/null
+++ b/app/Views/templates/front/index_head_product.php
@@ -0,0 +1,17 @@
+
+
+
+ 페이지정보 : = $viewDatas['page'] ?>/= $viewDatas['total_page'] ?>
+
+
+ = anchor(current_url() . '?category=' . $viewDatas['category']->getPrimaryKey() . '&order_field=price&order_value=ASC', '판매가순', ["class" => "btn btn-sm btn-info btn-circle", "target" => "_self"]) ?>
+ = anchor(current_url() . '?category=' . $viewDatas['category']->getPrimaryKey() . '&order_field=view_cnt&order_value=DESC', '인기순', ["class" => "btn btn-sm btn-primary btn-circle", "target" => "_self"]) ?>
+
+
+ = form_open(current_url(), array("method" => "get")) ?>
+ = form_input('word', $viewDatas['word']) ?>
+ = form_submit('', '검색하기') ?>
+ = form_close() ?>
+
+
+
\ No newline at end of file
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000..69df4e1
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
403 Forbidden
+
+
+
+
Directory access is forbidden.
+
+
+
diff --git a/builds b/builds
new file mode 100644
index 0000000..cc2ca08
--- /dev/null
+++ b/builds
@@ -0,0 +1,125 @@
+#!/usr/bin/env php
+ 'vcs',
+ 'url' => GITHUB_URL,
+ ];
+ }
+
+ $array['require']['codeigniter4/codeigniter4'] = 'dev-develop';
+ unset($array['require']['codeigniter4/framework']);
+ } else {
+ unset($array['minimum-stability']);
+
+ if (isset($array['repositories'])) {
+ foreach ($array['repositories'] as $i => $repository) {
+ if ($repository['url'] === GITHUB_URL) {
+ unset($array['repositories'][$i]);
+ break;
+ }
+ }
+
+ if (empty($array['repositories'])) {
+ unset($array['repositories']);
+ }
+ }
+
+ $array['require']['codeigniter4/framework'] = LATEST_RELEASE;
+ unset($array['require']['codeigniter4/codeigniter4']);
+ }
+
+ file_put_contents($file, json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL);
+
+ $modified[] = $file;
+ } else {
+ echo 'Warning: Unable to decode composer.json! Skipping...' . PHP_EOL;
+ }
+ } else {
+ echo 'Warning: Unable to read composer.json! Skipping...' . PHP_EOL;
+ }
+}
+
+$files = [
+ __DIR__ . DIRECTORY_SEPARATOR . 'app/Config/Paths.php',
+ __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml.dist',
+ __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml',
+];
+
+foreach ($files as $file) {
+ if (is_file($file)) {
+ $contents = file_get_contents($file);
+
+ if ($dev) {
+ $contents = str_replace('vendor/codeigniter4/framework', 'vendor/codeigniter4/codeigniter4', $contents);
+ } else {
+ $contents = str_replace('vendor/codeigniter4/codeigniter4', 'vendor/codeigniter4/framework', $contents);
+ }
+
+ file_put_contents($file, $contents);
+
+ $modified[] = $file;
+ }
+}
+
+if ($modified === []) {
+ echo 'No files modified.' . PHP_EOL;
+} else {
+ echo 'The following files were modified:' . PHP_EOL;
+
+ foreach ($modified as $file) {
+ echo " * {$file}" . PHP_EOL;
+ }
+
+ echo 'Run `composer update` to sync changes with your vendor folder.' . PHP_EOL;
+}
diff --git a/cfmgr_dataflow.png b/cfmgr_dataflow.png
new file mode 100644
index 0000000..4a87b3c
Binary files /dev/null and b/cfmgr_dataflow.png differ
diff --git a/cfmgr_dataflow.xml b/cfmgr_dataflow.xml
new file mode 100644
index 0000000..71160b2
--- /dev/null
+++ b/cfmgr_dataflow.xml
@@ -0,0 +1 @@
+
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
\ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..11fa52c
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "codeigniter4/appstarter",
+ "type": "project",
+ "description": "CodeIgniter4 starter app",
+ "homepage": "https://codeigniter.com",
+ "license": "MIT",
+ "require": {
+ "php": "^8",
+ "phpoffice/phpspreadsheet": "^1.27",
+ "codeigniter4/framework": "^4.5",
+ "onokumus/metismenu": "dev-master",
+ "twbs/bootstrap": "5.2.3",
+ "guzzlehttp/guzzle": "^7.7",
+ "google/apiclient": "2.12.1",
+ "tinymce/tinymce": "^6.6"
+ },
+ "require-dev": {
+ "fakerphp/faker": "^1.9",
+ "mikey179/vfsstream": "^1.6",
+ "phpunit/phpunit": "^9.1"
+ },
+ "suggest": {
+ "ext-fileinfo": "Improves mime type detection for files"
+ },
+ "autoload": {
+ "exclude-from-classmap": [
+ "**/Database/Migrations/**"
+ ]
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\Support\\": "tests/_support"
+ }
+ },
+ "scripts": {
+ "test": "phpunit"
+ },
+ "support": {
+ "forum": "https://forum.codeigniter.com/",
+ "source": "https://github.com/codeigniter4/CodeIgniter4",
+ "slack": "https://codeigniterchat.slack.com"
+ }
+}
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..62a473a
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,57 @@
+
+
+
+
+ ./app
+
+
+ ./app/Views
+ ./app/Config/Routes.php
+
+
+
+
+
+
+
+
+
+
+ ./tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/preload.php b/preload.php
new file mode 100644
index 0000000..63c781c
--- /dev/null
+++ b/preload.php
@@ -0,0 +1,113 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+/*
+ *---------------------------------------------------------------
+ * Sample file for Preloading
+ *---------------------------------------------------------------
+ * See https://www.php.net/manual/en/opcache.preloading.php
+ *
+ * How to Use:
+ * 0. Copy this file to your project root folder.
+ * 1. Set the $paths property of the preload class below.
+ * 2. Set opcache.preload in php.ini.
+ * php.ini:
+ * opcache.preload=/path/to/preload.php
+ */
+
+// Load the paths config file
+require __DIR__ . '/app/Config/Paths.php';
+
+// Path to the front controller
+define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR);
+
+/**
+ * See https://www.php.net/manual/en/function.str-contains.php#126277
+ */
+if (! function_exists('str_contains')) {
+ /**
+ * Polyfill of str_contains()
+ */
+ function str_contains(string $haystack, string $needle): bool
+ {
+ return empty($needle) || strpos($haystack, $needle) !== false;
+ }
+}
+
+class preload
+{
+ /**
+ * @var array Paths to preload.
+ */
+ private array $paths = [
+ [
+ 'include' => __DIR__ . '/vendor/codeigniter4/framework/system',
+ 'exclude' => [
+ // Not needed if you don't use them.
+ '/system/Database/OCI8/',
+ '/system/Database/Postgre/',
+ '/system/Database/SQLSRV/',
+ // Not needed.
+ '/system/Database/Seeder.php',
+ '/system/Test/',
+ '/system/Language/',
+ '/system/CLI/',
+ '/system/Commands/',
+ '/system/Publisher/',
+ '/system/ComposerScripts.php',
+ '/Views/',
+ // Errors occur.
+ '/system/Config/Routes.php',
+ '/system/ThirdParty/',
+ ],
+ ],
+ ];
+
+ public function __construct()
+ {
+ $this->loadAutoloader();
+ }
+
+ private function loadAutoloader()
+ {
+ $paths = new Config\Paths();
+ require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
+ }
+
+ /**
+ * Load PHP files.
+ */
+ public function load()
+ {
+ foreach ($this->paths as $path) {
+ $directory = new RecursiveDirectoryIterator($path['include']);
+ $fullTree = new RecursiveIteratorIterator($directory);
+ $phpFiles = new RegexIterator(
+ $fullTree,
+ '/.+((? $file) {
+ foreach ($path['exclude'] as $exclude) {
+ if (str_contains($file[0], $exclude)) {
+ continue 2;
+ }
+ }
+
+ require_once $file[0];
+ echo 'Loaded: ' . $file[0] . "\n";
+ }
+ }
+ }
+}
+
+(new preload())->load();
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..a5d6c2a
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,49 @@
+# Disable directory browsing
+Options All -Indexes
+
+# ----------------------------------------------------------------------
+# Rewrite engine
+# ----------------------------------------------------------------------
+
+# Turning on the rewrite engine is necessary for the following rules and features.
+# FollowSymLinks must be enabled for this to work.
+
+ Options +FollowSymlinks
+ RewriteEngine On
+
+ # If you installed CodeIgniter in a subfolder, you will need to
+ # change the following line to match the subfolder you need.
+ # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
+ # RewriteBase /
+
+ # Redirect Trailing Slashes...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Rewrite "www.example.com -> example.com"
+ RewriteCond %{HTTPS} !=on
+ RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
+ RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
+
+ # Checks to see if the user is attempting to access a valid file,
+ # such as an image or css document, if this isn't true it sends the
+ # request to the front controller, index.php
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA]
+
+ # Ensure Authorization header is passed along
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+
+
+ # If we don't have mod_rewrite installed, all 404's
+ # can be sent to index.php, and everything works as normal.
+ ErrorDocument 404 index.php
+
+
+# Disable server signature start
+ ServerSignature Off
+# Disable server signature end
diff --git a/public/css/admin.css b/public/css/admin.css
new file mode 100644
index 0000000..8080efb
--- /dev/null
+++ b/public/css/admin.css
@@ -0,0 +1,53 @@
+/* ------------------------------------------------------------
+ * Name : admin.css
+ * Desc : Admin StyleSheet
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+ * {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ font-size:14px;
+ font: Arial;
+}
+
+/* #head{
+ border:1px solid blue;
+} */
+#tail{
+ text-align:center;
+ /* border:1px solid green; */
+}
+#layout {
+ width:100%;
+ /* border:1px solid blue; */
+}
+
+#layout #body{
+ padding-left:10px;
+ /* border:1px solid red; */
+}
+
+#layout #body nav.header{
+ /*content 상단라인*/
+ padding-top:40px;
+ border-bottom:1px solid silver;
+}
+#layout #body nav.header nav h4.title{
+ font-size:26px;
+ font-weight:bold;
+}
+#layout #body nav.header nav span.flow{
+ color: gray;
+}
+#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; */
+}
\ No newline at end of file
diff --git a/public/css/admin/content.css b/public/css/admin/content.css
new file mode 100644
index 0000000..71fa4f9
--- /dev/null
+++ b/public/css/admin/content.css
@@ -0,0 +1,95 @@
+div#content{
+ color:black;
+ padding-top:20px;
+ margin-bottom:40px;
+ /* border-left:1px solid silver;
+ border-right:1px solid silver; */
+}
+/* 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:12px;
+ 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; */
+}
+
+/* Table 부분 */
+div#content table {
+ width:100%;
+ /* overflow-x: auto;
+ padding-top:5px;
+ padding-bottom:5px; */
+}
+
+/* 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: 16px;
+ font-weight:bold;
+ border-top:2px solid black;
+ border-bottom:1px solid silver;
+ background-color:#F5F5F5;
+ /* border:1px solid silver; */
+}
+
+div#content div.bottom {
+ padding-top:15px;
+ text-align:center;
+}
+div#content div.bottom ul.pagination {
+ margin-top:20px;
+}
+div#content div.bottom ul.pagination li.page-item a{
+ border:0px;
+ border-radius:0px !important;
+ background-color:#e8ebe9;
+}
+div#content div.bottom ul.pagination li.active a{
+ background-color:gray;
+}
\ No newline at end of file
diff --git a/public/css/admin/left_menu.css b/public/css/admin/left_menu.css
new file mode 100644
index 0000000..3b75ace
--- /dev/null
+++ b/public/css/admin/left_menu.css
@@ -0,0 +1,20 @@
+div#left_menu{
+ position:fixed;
+ z-index:100;
+ width:160px;
+ border:1px solid silver;
+}
+
+div#left_menu div.accordion {
+ /* display:none; */
+ background-color: white;
+}
+div#left_menu div.accordion div.accordion-item:hover {
+ background-color: #e7e7e7;
+}
+div#left_menu div.accordion div.accordion-item a{
+ padding-left:10px;
+}
+div#left_menu div.accordion div.accordion-collapse a{
+ padding-left:30px;
+}
\ No newline at end of file
diff --git a/public/css/admin/member_link.css b/public/css/admin/member_link.css
new file mode 100644
index 0000000..38ed839
--- /dev/null
+++ b/public/css/admin/member_link.css
@@ -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;
+}
\ No newline at end of file
diff --git a/public/css/common/copyright.css b/public/css/common/copyright.css
new file mode 100644
index 0000000..45a4a77
--- /dev/null
+++ b/public/css/common/copyright.css
@@ -0,0 +1,29 @@
+div#copyright{
+ width:100%;
+ height:300px;
+ padding-top:30px;
+ padding-bottom:30px;
+ background-color:#2d2e2e;
+ color:white;
+}
+
+div#copyright div#content_bottom{
+ color:white;
+ text-align:left;
+ /* border-left:1px solid silver;
+ border-right:1px solid silver; */
+}
+
+div#copyright div#content_bottom .item{
+ padding-top:5px;
+ padding-left:5px;
+ padding-right:5px;
+ border-top:1px solid silver;
+ border-left:1px solid silver;
+ border-right:1px solid silver;
+}
+
+div#copyright div#content_bottom div.company_info{
+ padding:10px;
+ border:1px solid silver;
+}
diff --git a/public/css/common/left_menu.css b/public/css/common/left_menu.css
new file mode 100644
index 0000000..f3e2b8d
--- /dev/null
+++ b/public/css/common/left_menu.css
@@ -0,0 +1,57 @@
+div#left_menu{
+ /* position:fixed;
+ z-index:100; */
+ width:200px;
+ background-color:white;
+}
+
+div#left_menu div.parent {
+ font-size:24px;
+ 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:24px;
+}
+
+/* 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.sibling a{
+ text-decoration: none;
+ color:black;
+ font-size:18px;
+}
+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;
+}
\ No newline at end of file
diff --git a/public/css/common/login.css b/public/css/common/login.css
new file mode 100644
index 0000000..c35ee0d
--- /dev/null
+++ b/public/css/common/login.css
@@ -0,0 +1,46 @@
+/* ------------------------------------------------------------
+* 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');
+} */
\ No newline at end of file
diff --git a/public/css/common/login_v1.css b/public/css/common/login_v1.css
new file mode 100644
index 0000000..8eb0668
--- /dev/null
+++ b/public/css/common/login_v1.css
@@ -0,0 +1,50 @@
+/* ------------------------------------------------------------
+* 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:18px;
+ 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');
+} */
\ No newline at end of file
diff --git a/public/css/common/top_menu.css b/public/css/common/top_menu.css
new file mode 100644
index 0000000..588263c
--- /dev/null
+++ b/public/css/common/top_menu.css
@@ -0,0 +1,70 @@
+
+#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:24px;
+ font-weight:bold;
+}
+
+/* 메뉴바그룹 상단글자*/
+#top_menu div.dropdown-center ul.navbar-nav a#navbarDarkDropdownMenuLink{
+ font-size:18px;
+ 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:16px;
+ font-weight:bold;
+ text-align:center;
+ text-decoration:none;
+}
+#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li a.active{
+ color:#efefef;
+ 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;
+}
\ No newline at end of file
diff --git a/public/css/common/top_navigator.css b/public/css/common/top_navigator.css
new file mode 100644
index 0000000..ab9cd34
--- /dev/null
+++ b/public/css/common/top_navigator.css
@@ -0,0 +1,24 @@
+#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:18px;
+ font-weight: 500;
+}
diff --git a/public/css/empty.css b/public/css/empty.css
new file mode 100644
index 0000000..2decc0b
--- /dev/null
+++ b/public/css/empty.css
@@ -0,0 +1,14 @@
+/* ------------------------------------------------------------
+ * Name : admin.css
+ * Desc : Admin StyleSheet
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+
+ * {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ font-size:14px;
+ font: Arial;
+}
diff --git a/public/css/front.css b/public/css/front.css
new file mode 100644
index 0000000..469f91a
--- /dev/null
+++ b/public/css/front.css
@@ -0,0 +1,54 @@
+/* ------------------------------------------------------------
+ * Name : admin.css
+ * Desc : Admin StyleSheet
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+ * {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ font-size:14px;
+ font: Arial;
+}
+
+/* #head{
+ border:1px solid blue;
+} */
+#tail{
+ text-align:center;
+ /* border:1px solid green; */
+}
+#layout {
+ width:1280px;
+ /* border:1px solid blue; */
+}
+
+#layout #body{
+ padding-left:10px;
+ /* border:1px solid red; */
+}
+
+#layout #body nav.header{
+ /*content 상단라인*/
+ padding-top:40px;
+ margin-left:30px;
+ border-bottom:1px solid silver;
+}
+#layout #body nav.header nav h4.title{
+ font-size:26px;
+ font-weight:bold;
+}
+#layout #body nav.header nav span.flow{
+ color: gray;
+}
+#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; */
+}
\ No newline at end of file
diff --git a/public/css/front/billing.css b/public/css/front/billing.css
new file mode 100644
index 0000000..b796a9d
--- /dev/null
+++ b/public/css/front/billing.css
@@ -0,0 +1,18 @@
+/* ------------------------------------------------------------
+* 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%;
+}
\ No newline at end of file
diff --git a/public/css/front/content.css b/public/css/front/content.css
new file mode 100644
index 0000000..6c6f850
--- /dev/null
+++ b/public/css/front/content.css
@@ -0,0 +1,96 @@
+div#content{
+ color:black;
+ padding-top:20px;
+ padding-left:30px;
+ margin-bottom:40px;
+ /* border-left:1px solid silver;
+ border-right:1px solid silver; */
+}
+/* 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:12px;
+ 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; */
+}
+
+/* Table 부분 */
+div#content table {
+ width:100%;
+ /* overflow-x: auto;
+ padding-top:5px;
+ padding-bottom:5px; */
+}
+
+/* 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: 16px;
+ font-weight:bold;
+ border-top:2px solid black;
+ border-bottom:1px solid silver;
+ background-color:#F5F5F5;
+ /* border:1px solid silver; */
+}
+
+div#content div.bottom {
+ padding-top:15px;
+ text-align:center;
+}
+div#content div.bottom ul.pagination {
+ margin-top:20px;
+}
+div#content div.bottom ul.pagination li.page-item a{
+ border:0px;
+ border-radius:0px !important;
+ background-color:#e8ebe9;
+}
+div#content div.bottom ul.pagination li.active a{
+ background-color:gray;
+}
\ No newline at end of file
diff --git a/public/css/front/order.css b/public/css/front/order.css
new file mode 100644
index 0000000..611d5cf
--- /dev/null
+++ b/public/css/front/order.css
@@ -0,0 +1,50 @@
+/* ------------------------------------------------------------
+* 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:18px;
+ 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:18px;
+ font-weight: 800;
+}
+div#order div.orderbox div.submit{
+ padding-top:10px;
+ text-align:center;
+}
\ No newline at end of file
diff --git a/public/css/front/sitepage.css b/public/css/front/sitepage.css
new file mode 100644
index 0000000..73df0c5
--- /dev/null
+++ b/public/css/front/sitepage.css
@@ -0,0 +1,69 @@
+@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;}
+*/
diff --git a/public/css/main.css b/public/css/main.css
new file mode 100644
index 0000000..e583aed
--- /dev/null
+++ b/public/css/main.css
@@ -0,0 +1,209 @@
+/* ------------------------------------------------------------
+ * Name : admin.css
+ * Desc : Admin StyleSheet
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+ * {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ font-size:14px;
+ font: Arial;
+}
+
+/* #head{
+ border:1px solid blue;
+} */
+#tail{
+ text-align:center;
+ /* border:1px solid green; */
+}
+#layout {
+ width:1280px;
+ /* border:1px solid blue; */
+}
+
+#layout #body{
+ padding-left:10px;
+ /* border:1px solid red; */
+}
+
+#layout #body nav.header{
+ /*content 상단라인*/
+ padding-top:40px;
+ margin-left:30px;
+ border-bottom:1px solid silver;
+}
+#layout #body nav.header nav h4.title{
+ font-size:26px;
+ font-weight:bold;
+}
+#layout #body nav.header nav span.flow{
+ color: gray;
+}
+#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; */
+}
+
+/* reset */
+html {overflow-y:scroll;}
+body,p,h1,h2,h3,h4,h5,h6,ul,ol,li,dl,dt,dd,table,th,td,form,fieldset,legend,input,textarea,button,select,figure,figcaption{margin:0;padding:0}
+body,input,textarea,select,button,table{font-family:'Noto Sans KR', helvetica,sans-serif;font-size:16px;letter-spacing:-0.2px;line-height:1.7em;color:#505050;word-break:keep-all; -webkit-text-size-adjust:none;}
+img{border:0}
+ul,ol{list-style:none}
+fieldset{border:none}
+fieldset legend {position:absolute;visibility:hidden;overflow:hidden;width:0;height:0;margin:0;padding:0;font:0/0 Arial;}
+button{cursor:pointer}
+header,hgroup,article,nav,footer,figure,figcaption,canvas,section,time{display:block}
+hr {clear:both;display:none;}
+li img, dd img {vertical-align:top;}
+*html body img {margin:none; padding:none;} /*for IE 6*/
+* {max-height: 1000000px;}
+
+a{
+ color:#5d5d5d;
+ text-decoration:none;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+a:hover,
+a:active{
+ color:#000;
+ text-decoration:none;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+
+::-webkit-input-placeholder {color:#999;}
+:-moz-placeholder {color:#999;}
+::-moz-placeholder {color:#999;}
+:-ms-input-placeholder {color:#999;}
+:placeholder-shown {color:#999;}
+
+table caption {visibility:hidden; overflow:hidden; width:0; height:0; margin:0; padding:0; font:0/0 Arial;}
+input[type="radio"], input[type="checkbox"] {vertical-align:middle !important; margin:-2px 3px 0 0 !important; background:transparent;}
+input,select {vertical-align:middle; background:#fff;}
+
+
+/* user class */
+h1,h2,h3,h4,h5,h6,strong,th,.bold{font-weight:500;}
+.clear{clear:both;}
+.clearfix:after {content:" "; display:block; clear:both;}
+.hide {position:absolute;visibility:hidden;overflow:hidden;width:0;height:0;margin:0;padding:0;font:0/0 Arial;}
+.pointer {cursor:pointer;}
+.input {height:35px; padding:0 0 0 10px; font-size:15px; line-height:33px; border:1px solid #ddd; box-sizing:border-box;}
+.textarea {padding:10px; font-size:15px; line-height:33px; border:1px solid #ddd; resize:none; overflow:auto; box-sizing:border-box;}
+.select {height:35px; padding:0 0 0 10px; font-size:15px; border:1px solid #ddd; box-sizing:border-box;}
+
+.mgb2 {margin-bottom:2px !important;}
+.mgb3 {margin-bottom:3px !important;}
+.mgb4 {margin-bottom:4px !important;}
+.mgb5 {margin-bottom:5px !important;}
+.mgb6 {margin-bottom:6px !important;}
+.mgb7 {margin-bottom:7px !important;}
+.mgb8 {margin-bottom:8px !important;}
+.mgb9 {margin-bottom:9px !important;}
+.mgb10 {margin-bottom:10px !important;}
+.mgb15 {margin-bottom:15px !important;}
+.mgb20 {margin-bottom:20px !important;}
+.mgb25 {margin-bottom:25px !important;}
+.mgb30 {margin-bottom:30px !important;}
+.mgb35 {margin-bottom:35px !important;}
+.mgb40 {margin-bottom:40px !important;}
+.mgb45 {margin-bottom:45px !important;}
+.mgb50 {margin-bottom:50px !important;}
+.mgb60 {margin-bottom:60px !important;}
+.mgb70 {margin-bottom:70px !important;}
+.mgb75 {margin-bottom:75px !important;}
+.mgb90 {margin-bottom:90px !important;}
+
+.fl {float:left;}
+.fr {float:right;}
+
+.space-center {text-align:center !important;}
+.space-right {text-align:right !important;}
+.space-left {text-align:left !important;}
+
+.text-blue {color:#284685}
+.text-red {color:#b4260b}
+.text-gray {color:#999}
+.text-black {color:#000}
+
+
+.line-through {text-decoration:line-through;}
+
+.main-bnr {width:1200px; position:relative; margin:-120px auto 60px; z-index:12}
+.main-bnr ul:after {content:" "; display:block; clear:both;}
+.main-bnr ul li {float:left; width:33.333%; height:180px; background-repeat:no-repeat; background-position:40px 50%;}
+.main-bnr ul li.bg1 {background-color:#41adde; background-image:url('/images/main/icon1.png');}
+.main-bnr ul li.bg2 {background-color:#0280c9; background-image:url('/images/main/icon2.png');}
+.main-bnr ul li.bg3 {background-color:#30539f; background-image:url('/images/main/icon3.png');}
+.main-bnr ul li .info {padding-left:180px; display:table; height:180px; color:#fff}
+.main-bnr ul li .info dl {width:100%; display:table-cell; vertical-align:middle;}
+.main-bnr ul li .info dl dt {font-size:18px; line-height:1.7em; font-weight:500; margin-bottom:10px;}
+.main-bnr ul li .info dl dd {font-size:15px; line-height:1.7em;}
+
+.main-bnr2 {width:1200px; position:relative; margin:20px auto 60px; z-index:12;}
+.main-bnr2 ul:after {content:" "; display:block; clear:both;}
+.main-bnr2 ul li {float:left; width:33.333%; height:180px; background-repeat:no-repeat; background-position:40px 50%;}
+.main-bnr2 ul li.bg1 {background-color:#41adde; background-image:url('/images/main/icon1.png');}
+.main-bnr2 ul li.bg2 {background-color:#0280c9; background-image:url('/images/main/icon2.png');}
+.main-bnr2 ul li.bg3 {background-color:#30539f; background-image:url('/images/main/icon3.png');}
+.main-bnr2 ul li .info {padding-left:180px; display:table; width:100%; height:180px; color:#fff;}
+.main-bnr2 ul li .info dl {width:100%; display:table-cell; vertical-align:middle;}
+.main-bnr2 ul li .info dl dt {font-size:24px; line-height:1.7em; font-weight:500; margin-bottom:10px;}
+.main-bnr2 ul li .info dl dd {font-size:15px; line-height:1.7em;}
+.main-bnr2 ul li .info dl dd a{color:white;}
+.main-bnr2 ul li .info dl dd span{float:right; padding-right:20px;}
+
+.main-title {text-align:center; margin-bottom:40px;}
+.main-title h2 {font-size:28px; line-height:1.6em; font-weight:700; color:#333;}
+.main-title p {color:#656565; font-size:17px;line-height:1.6em;}
+
+.main-price {margin:0 -10px 80px; overflow:hidden;}
+.main-price:after{content:"";display:block;clear:both;}
+.main-price .col {float:left; width:50%; padding:0 10px; box-sizing:border-box; margin-bottom:20px;}
+.main-price .col:nth-child(2n+1) {clear:left;}
+.main-table.type2 table thead th {background:#0280c9}
+.main-table table {width:100%; border-collapse:collapse; border-spacing:0px;}
+.main-table table thead th {padding:9px 10px; height:35px; font-size:22px; font-weight:500; line-height:22px; color:#fff; background:#30539f}
+.main-table table tbody th {padding:9px 10px; height:35px; font-size:16px; font-weight:500; line-height:22px; color:#333; border-bottom:1px solid #d6d6d6; background:#eaeef4;}
+.main-table table tbody td {padding:9px 20px; color:#2c2c2c; font-size:16px; line-height:22px; border-bottom:1px solid #d6d6d6; background:#f8f8f8}
+.main-table table tbody th.none,.main-table table tbody td.none {border-bottom:0}
+.main-table .f-back {background-color:#e62b2b; color:#fff; }
+.main-table strong {font-weight:500}
+
+.main-service {background:url('/images/main/bg_bnr.jpg') 50% 0 no-repeat; width:100%; height:330px;}
+.main-service .col {float:left; width:50%; height:330px; display:table; text-align:center;}
+.main-service .col .link {width:600px; height:330px; display:table-cell; vertical-align:middle; color:#fff;}
+.main-service .col .link dl dt {font-size:30px; line-height:1.4em; font-weight:500; margin-bottom:5px;}
+.main-service .col .link dl dd {font-size:17px; line-height:1.4em; margin-bottom:20px;}
+.main-service .col .link .more {font-size:15px; line-height:1.4em; opacity:.8}
+.main-service .col .link .more .arrow {margin:0 3px;position:relative;border: solid #ddd;border-width: 0 2px 2px 0;transform: rotate(-45deg);display: inline-block;padding: 3px;}
+.main-service .col a {display:block;}
+
+.main-notice {background:#f5f5f5; padding:60px 0;}
+.main-notice .title {float:left; width:511px; height:276px; color:#fff; background:url('/images/main/bg_notice.gif') 0 0 no-repeat;}
+.main-notice .title dl {padding:50px}
+.main-notice .title dl dt {font-size:32px; line-height:1.4em; font-weight:500; margin-bottom:5px;}
+.main-notice .title dl dd {font-size:16px; line-height:1.4em; color:#cbcfd9;}
+.main-notice .list {float:left; width:688px; height:276px; background:#fff; border:1px solid #ddd; border-left:0; box-sizing:border-box;}
+.main-notice .list ul {padding:15px 40px 0;}
+.main-notice .list ul li {line-height:49px; height:49px; border-bottom:1px solid silver; position:relative;}
+.main-notice .list ul li:last-child {border-bottom:0}
+.main-notice .list ul li a {display:inline-block; font-size:16px; font-weight:bold; width:500px; height:49px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis; }
+.main-notice .list span {position:absolute; top:0; right:0; font-size:14px; color:#959595;}
\ No newline at end of file
diff --git a/public/css/main/content.css b/public/css/main/content.css
new file mode 100644
index 0000000..6c6f850
--- /dev/null
+++ b/public/css/main/content.css
@@ -0,0 +1,96 @@
+div#content{
+ color:black;
+ padding-top:20px;
+ padding-left:30px;
+ margin-bottom:40px;
+ /* border-left:1px solid silver;
+ border-right:1px solid silver; */
+}
+/* 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:12px;
+ 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; */
+}
+
+/* Table 부분 */
+div#content table {
+ width:100%;
+ /* overflow-x: auto;
+ padding-top:5px;
+ padding-bottom:5px; */
+}
+
+/* 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: 16px;
+ font-weight:bold;
+ border-top:2px solid black;
+ border-bottom:1px solid silver;
+ background-color:#F5F5F5;
+ /* border:1px solid silver; */
+}
+
+div#content div.bottom {
+ padding-top:15px;
+ text-align:center;
+}
+div#content div.bottom ul.pagination {
+ margin-top:20px;
+}
+div#content div.bottom ul.pagination li.page-item a{
+ border:0px;
+ border-radius:0px !important;
+ background-color:#e8ebe9;
+}
+div#content div.bottom ul.pagination li.active a{
+ background-color:gray;
+}
\ No newline at end of file
diff --git a/public/css/style.css b/public/css/style.css
new file mode 100644
index 0000000..8b0ccdd
--- /dev/null
+++ b/public/css/style.css
@@ -0,0 +1,33 @@
+/* ------------------------------------------------------------
+ * Name : admin.css
+ * Desc : Admin StyleSheet
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+@charset "utf-8";
+
+body {
+ background-color: white;
+}
+
+/* user class */
+h1,h2,h3,h4,h5,h6,strong,th,.bold{font-weight:500;}
+
+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 {
+ 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; }
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..7ecfce2
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/images/auth/google_login_button.png b/public/images/auth/google_login_button.png
new file mode 100644
index 0000000..c19f257
Binary files /dev/null and b/public/images/auth/google_login_button.png differ
diff --git a/public/images/banner/sub_visual1.jpg b/public/images/banner/sub_visual1.jpg
new file mode 100644
index 0000000..df85468
Binary files /dev/null and b/public/images/banner/sub_visual1.jpg differ
diff --git a/public/images/banner/sub_visual2.jpg b/public/images/banner/sub_visual2.jpg
new file mode 100644
index 0000000..8699f2b
Binary files /dev/null and b/public/images/banner/sub_visual2.jpg differ
diff --git a/public/images/banner/sub_visual3.jpg b/public/images/banner/sub_visual3.jpg
new file mode 100644
index 0000000..4ee3220
Binary files /dev/null and b/public/images/banner/sub_visual3.jpg differ
diff --git a/public/images/banner/sub_visual4.jpg b/public/images/banner/sub_visual4.jpg
new file mode 100644
index 0000000..6708503
Binary files /dev/null and b/public/images/banner/sub_visual4.jpg differ
diff --git a/public/images/common/adminbg.png b/public/images/common/adminbg.png
new file mode 100644
index 0000000..68c6a93
Binary files /dev/null and b/public/images/common/adminbg.png differ
diff --git a/public/images/common/btn_login.png b/public/images/common/btn_login.png
new file mode 100644
index 0000000..c0b2782
Binary files /dev/null and b/public/images/common/btn_login.png differ
diff --git a/public/images/common/excel.png b/public/images/common/excel.png
new file mode 100644
index 0000000..e67fc00
Binary files /dev/null and b/public/images/common/excel.png differ
diff --git a/public/images/common/menu_on.gif b/public/images/common/menu_on.gif
new file mode 100644
index 0000000..b6216bb
Binary files /dev/null and b/public/images/common/menu_on.gif differ
diff --git a/public/images/common/top.png b/public/images/common/top.png
new file mode 100644
index 0000000..84d194d
Binary files /dev/null and b/public/images/common/top.png differ
diff --git a/public/images/common/top_skype.png b/public/images/common/top_skype.png
new file mode 100644
index 0000000..90355c0
Binary files /dev/null and b/public/images/common/top_skype.png differ
diff --git a/public/images/main/bg_bnr.jpg b/public/images/main/bg_bnr.jpg
new file mode 100644
index 0000000..70e0e16
Binary files /dev/null and b/public/images/main/bg_bnr.jpg differ
diff --git a/public/images/main/bg_notice.gif b/public/images/main/bg_notice.gif
new file mode 100644
index 0000000..8eaf4f4
Binary files /dev/null and b/public/images/main/bg_notice.gif differ
diff --git a/public/images/main/icon1.png b/public/images/main/icon1.png
new file mode 100644
index 0000000..dbdb2c7
Binary files /dev/null and b/public/images/main/icon1.png differ
diff --git a/public/images/main/icon2.png b/public/images/main/icon2.png
new file mode 100644
index 0000000..bc56142
Binary files /dev/null and b/public/images/main/icon2.png differ
diff --git a/public/images/main/icon3.png b/public/images/main/icon3.png
new file mode 100644
index 0000000..ccdcecf
Binary files /dev/null and b/public/images/main/icon3.png differ
diff --git a/public/images/main/visual1.jpg b/public/images/main/visual1.jpg
new file mode 100644
index 0000000..e9c72fa
Binary files /dev/null and b/public/images/main/visual1.jpg differ
diff --git a/public/images/main/visual2.jpg b/public/images/main/visual2.jpg
new file mode 100644
index 0000000..b78e8c4
Binary files /dev/null and b/public/images/main/visual2.jpg differ
diff --git a/public/images/main/visual3.jpg b/public/images/main/visual3.jpg
new file mode 100644
index 0000000..0911c90
Binary files /dev/null and b/public/images/main/visual3.jpg differ
diff --git a/public/images/sub/com_icon1.png b/public/images/sub/com_icon1.png
new file mode 100644
index 0000000..bd7b57a
Binary files /dev/null and b/public/images/sub/com_icon1.png differ
diff --git a/public/images/sub/com_icon2.png b/public/images/sub/com_icon2.png
new file mode 100644
index 0000000..fa77ce2
Binary files /dev/null and b/public/images/sub/com_icon2.png differ
diff --git a/public/images/sub/com_icon3.png b/public/images/sub/com_icon3.png
new file mode 100644
index 0000000..eb662cd
Binary files /dev/null and b/public/images/sub/com_icon3.png differ
diff --git a/public/images/sub/product_img1.jpg b/public/images/sub/product_img1.jpg
new file mode 100644
index 0000000..132c31c
Binary files /dev/null and b/public/images/sub/product_img1.jpg differ
diff --git a/public/images/sub/product_img2.jpg b/public/images/sub/product_img2.jpg
new file mode 100644
index 0000000..14e5914
Binary files /dev/null and b/public/images/sub/product_img2.jpg differ
diff --git a/public/images/sub/product_img3.jpg b/public/images/sub/product_img3.jpg
new file mode 100644
index 0000000..c045f4a
Binary files /dev/null and b/public/images/sub/product_img3.jpg differ
diff --git a/public/images/sub/sub1_1.jpg b/public/images/sub/sub1_1.jpg
new file mode 100644
index 0000000..36e9c46
Binary files /dev/null and b/public/images/sub/sub1_1.jpg differ
diff --git a/public/images/sub/sub2_1.jpg b/public/images/sub/sub2_1.jpg
new file mode 100644
index 0000000..cc46724
Binary files /dev/null and b/public/images/sub/sub2_1.jpg differ
diff --git a/public/images/sub/sub2_1_icon.gif b/public/images/sub/sub2_1_icon.gif
new file mode 100644
index 0000000..fc1dcd0
Binary files /dev/null and b/public/images/sub/sub2_1_icon.gif differ
diff --git a/public/images/sub/sub2_1_skype.gif b/public/images/sub/sub2_1_skype.gif
new file mode 100644
index 0000000..0789ce6
Binary files /dev/null and b/public/images/sub/sub2_1_skype.gif differ
diff --git a/public/images/sub/sub2_2_tit.png b/public/images/sub/sub2_2_tit.png
new file mode 100644
index 0000000..6ded24c
Binary files /dev/null and b/public/images/sub/sub2_2_tit.png differ
diff --git a/public/images/sub/sub3_1.jpg b/public/images/sub/sub3_1.jpg
new file mode 100644
index 0000000..28fecdc
Binary files /dev/null and b/public/images/sub/sub3_1.jpg differ
diff --git a/public/images/sub/sub_visual1.jpg b/public/images/sub/sub_visual1.jpg
new file mode 100644
index 0000000..df85468
Binary files /dev/null and b/public/images/sub/sub_visual1.jpg differ
diff --git a/public/images/sub/sub_visual2.jpg b/public/images/sub/sub_visual2.jpg
new file mode 100644
index 0000000..8699f2b
Binary files /dev/null and b/public/images/sub/sub_visual2.jpg differ
diff --git a/public/images/sub/sub_visual3.jpg b/public/images/sub/sub_visual3.jpg
new file mode 100644
index 0000000..4ee3220
Binary files /dev/null and b/public/images/sub/sub_visual3.jpg differ
diff --git a/public/images/sub/sub_visual4.jpg b/public/images/sub/sub_visual4.jpg
new file mode 100644
index 0000000..6708503
Binary files /dev/null and b/public/images/sub/sub_visual4.jpg differ
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..5ec58a7
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,56 @@
+systemDirectory . '/Boot.php';
+
+exit(CodeIgniter\Boot::bootWeb($paths));
diff --git a/public/js/admin.js b/public/js/admin.js
new file mode 100644
index 0000000..ec32e90
--- /dev/null
+++ b/public/js/admin.js
@@ -0,0 +1,104 @@
+/* ------------------------------------------------------------
+ * Name : admin.js
+ * Desc : Admin Javascrip
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+function trim(str){
+ return this.replace(/(^\s*)|(\s*$)/gi, "");
+}
+
+//오른쪽에 위 화살표 방향버튼용
+/*$(document).ready(function(){
+ $('body').append('
');
+ $("#toTop").bind("click", function () {$("body").animate({ scrollTop: 0 }, 200);});
+ $(window).scroll(function () {
+ if ($(this).scrollTop() != 0) {
+ $('#toTop').fadeIn();
+ } else {
+ $('#toTop').fadeOut();
+ }
+ });
+});
+//오른쪽에 위 화살표 방향버튼용
+//오른쪽에 아래 화살표 방향버튼용
+$(document).ready(function(){
+ $('body').append('
');
+ $("#toBottom").bind("click", function () {$("body").animate({ scrollTop: 200000 }, 200);});
+ $(window).scroll(function () {
+ if ($(this).scrollTop() != 0) {
+ $('#toBottom').fadeIn();
+ } else {
+ $('#toBottom').fadeIn();
+ }
+ });
+});*/
+//오른쪽에 아래 화살표 방향버튼용
+
+function is_NumericKey(evt,obj){
+ var charCode = (evt.which) ? evt.which : event.keyCode;
+ switch(charCode){
+ case 48://0
+ case 49://1
+ case 50://2
+ case 51://3
+ case 52://4
+ case 53://5
+ case 54://6
+ case 55://7
+ case 56://8
+ case 57://9
+ case 96://KeyPad:0
+ case 97://KeyPad:1
+ case 98://KeyPad:2
+ case 99://KeyPad:3
+ case 100://KeyPad:4
+ case 101://KeyPad:5
+ case 102://KeyPad:6
+ case 103://KeyPad:7
+ case 104://KeyPad:8
+ case 105://KeyPad:9
+ break;
+ default:
+ alert('숫자만 가능합니다['+charCode+']');
+ obj.value = obj.value.substring(0,obj.value.length-1);
+ break;
+ }
+}
+function is_NumericType(data){
+ if(!data.match(/^[0-9]+$/)){
+ throw (new Error('숫자가 아닌값['+data+']이 있습니다'));
+ }
+ return true;
+}//
+function change_CurrencyFormat(obj,currencies){
+ //var currencies = document.getElementsByClassName("currency");
+ var total_currency = 0;
+ for(i=0; i
{ alert("복사가 완료되었습니다."); })
+ .catch(err => { console.log('복사가 오류', err); })
+}
\ No newline at end of file
diff --git a/public/js/admin/side_menu.js b/public/js/admin/side_menu.js
new file mode 100644
index 0000000..a592c6f
--- /dev/null
+++ b/public/js/admin/side_menu.js
@@ -0,0 +1,14 @@
+function sideMenuToggle (menu_id){
+ var accordion = $(".accordion")[0];
+ alert(accordion.clientWidth);
+ if (accordion.clientWidth == 0){
+ accordion.style.display = "block";
+ $("#"+menu_id).css({ "width": '200px' })
+ $("#button"+menu_id).html("메뉴닫기");
+ }
+ else {
+ accordion.style.display = "none";
+ $("#"+menu_id).css({"width":'28px'})
+ $("#button"+menu_id).html("메뉴열기");
+ }
+}//toggleMenu
\ No newline at end of file
diff --git a/public/js/empty.js b/public/js/empty.js
new file mode 100644
index 0000000..f973e71
--- /dev/null
+++ b/public/js/empty.js
@@ -0,0 +1,6 @@
+/* ------------------------------------------------------------
+ * Name : front.js
+ * Desc : Front Javascrip
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
diff --git a/public/js/front.js b/public/js/front.js
new file mode 100644
index 0000000..6bea8a4
--- /dev/null
+++ b/public/js/front.js
@@ -0,0 +1,93 @@
+/* ------------------------------------------------------------
+ * Name : front.js
+ * Desc : Front Javascrip
+ * Created : 2016/9/11 Tri-aBility by Junheum,Choi
+ * Updated :
+ ------------------------------------------------------------ */
+
+function trim(str){
+ return this.replace(/(^\s*)|(\s*$)/gi, "");
+}//
+
+function bookmarksite(title,url) {
+ if (window.sidebar) // firefox
+ window.sidebar.addPanel(title, url, "");
+ else if(window.opera && window.print){ // opera
+ var elem = document.createElement('a');
+ elem.setAttribute('href',url);
+ elem.setAttribute('title',title);
+ elem.setAttribute('rel','sidebar');
+ elem.click();
+ }
+ else if(document.all) // ie
+ window.external.AddFavorite(url, title);
+}//
+
+function captcha_refresh(refresh_url) {
+ $.ajax({
+ type: 'POST',
+ url: refresh_url,
+ success: function(data, status, xhr){
+ if(data)
+ $('#captcha_span').html(data);
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ console.log(jqXHR.responseText);
+ console.log(textStatus+'=>'+errorThrown);
+ }
+ });//ajax
+}//
+
+function is_NumericKey(evt,obj){
+ var charCode = (evt.which) ? evt.which : event.keyCode;
+ switch(charCode){
+ case 48://0
+ case 49://1
+ case 50://2
+ case 51://3
+ case 52://4
+ case 53://5
+ case 54://6
+ case 55://7
+ case 56://8
+ case 57://9
+ case 96://KeyPad:0
+ case 97://KeyPad:1
+ case 98://KeyPad:2
+ case 99://KeyPad:3
+ case 100://KeyPad:4
+ case 101://KeyPad:5
+ case 102://KeyPad:6
+ case 103://KeyPad:7
+ case 104://KeyPad:8
+ case 105://KeyPad:9
+ break;
+ default:
+ alert('숫자만 가능합니다['+charCode+']');
+ obj.value = obj.value.substring(0,obj.value.length-1);
+ break;
+ }
+}
+function is_NumericType(data){
+ if(!data.match(/^[0-9]+$/)){
+ throw (new Error('숫자가 아닌값['+data+']이 있습니다'));
+ }
+ return true;
+}//
+function change_CurrencyFormat(obj,currencies){
+ //var currencies = document.getElementsByClassName("currency");
+ var total_currency = 0;
+ for(i=0; i'+errorThrown);
+ }
+ });//ajax
+}//
+
+function is_NumericKey(evt,obj){
+ var charCode = (evt.which) ? evt.which : event.keyCode;
+ switch(charCode){
+ case 48://0
+ case 49://1
+ case 50://2
+ case 51://3
+ case 52://4
+ case 53://5
+ case 54://6
+ case 55://7
+ case 56://8
+ case 57://9
+ case 96://KeyPad:0
+ case 97://KeyPad:1
+ case 98://KeyPad:2
+ case 99://KeyPad:3
+ case 100://KeyPad:4
+ case 101://KeyPad:5
+ case 102://KeyPad:6
+ case 103://KeyPad:7
+ case 104://KeyPad:8
+ case 105://KeyPad:9
+ break;
+ default:
+ alert('숫자만 가능합니다['+charCode+']');
+ obj.value = obj.value.substring(0,obj.value.length-1);
+ break;
+ }
+}
+function is_NumericType(data){
+ if(!data.match(/^[0-9]+$/)){
+ throw (new Error('숫자가 아닌값['+data+']이 있습니다'));
+ }
+ return true;
+}//
+function change_CurrencyFormat(obj,currencies){
+ //var currencies = document.getElementsByClassName("currency");
+ var total_currency = 0;
+ for(i=0; i new Date() )
+ {
+ expiredays = expiredays - 1;
+ }
+ todayDate.setDate( todayDate.getDate() + expiredays );
+ document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
+}
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..9e60f97
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/spark b/spark
new file mode 100644
index 0000000..a56fbc1
--- /dev/null
+++ b/spark
@@ -0,0 +1,84 @@
+#!/usr/bin/env php
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+/*
+ * --------------------------------------------------------------------
+ * CODEIGNITER COMMAND-LINE TOOLS
+ * --------------------------------------------------------------------
+ * The main entry point into the CLI system and allows you to run
+ * commands and perform maintenance on your application.
+ */
+
+/*
+ *---------------------------------------------------------------
+ * CHECK SERVER API
+ *---------------------------------------------------------------
+ */
+
+// Refuse to run when called from php-cgi
+if (strpos(PHP_SAPI, 'cgi') === 0) {
+ exit("The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n");
+}
+
+/*
+ *---------------------------------------------------------------
+ * CHECK PHP VERSION
+ *---------------------------------------------------------------
+ */
+
+$minPhpVersion = '8.1'; // If you update this, don't forget to update `public/index.php`.
+if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
+ $message = sprintf(
+ 'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',
+ $minPhpVersion,
+ PHP_VERSION
+ );
+
+ exit($message);
+}
+
+// We want errors to be shown when using it from the CLI.
+error_reporting(E_ALL);
+ini_set('display_errors', '1');
+
+/*
+ *---------------------------------------------------------------
+ * SET THE CURRENT DIRECTORY
+ *---------------------------------------------------------------
+ */
+
+// Path to the front controller
+define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR);
+
+// Ensure the current directory is pointing to the front controller's directory
+chdir(FCPATH);
+
+/*
+ *---------------------------------------------------------------
+ * BOOTSTRAP THE APPLICATION
+ *---------------------------------------------------------------
+ * This process sets up the path constants, loads and registers
+ * our autoloader, along with Composer's, loads our constants
+ * and fires up an environment-specific bootstrapping.
+ */
+
+// LOAD OUR PATHS CONFIG FILE
+// This is the line that might need to be changed, depending on your folder structure.
+require FCPATH . '../app/Config/Paths.php';
+// ^^^ Change this line if you move your application folder
+
+$paths = new Config\Paths();
+
+// LOAD THE FRAMEWORK BOOTSTRAP FILE
+require $paths->systemDirectory . '/Boot.php';
+
+exit(CodeIgniter\Boot::bootSpark($paths));
diff --git a/tests/OOPExampleTest.php b/tests/OOPExampleTest.php
new file mode 100644
index 0000000..1c0100c
--- /dev/null
+++ b/tests/OOPExampleTest.php
@@ -0,0 +1,31 @@
+
+class Foo
+{
+}
+
+class NotFoo
+{
+}
+
+class Bar
+{
+ /**
+ * @param $_foos Foo[]
+ */
+ public function doFoo(array $_foos, $_param2)
+ {
+ return (function (Foo ...$_foos) use ($_param2) {
+ return $_param2;
+ })(...$_foos);
+ }
+}
+
+$myBar = new Bar();
+$arrayOfFoo = array(new Foo(), new Foo(), new Foo());
+$notArrayOfFoo = array(new Foo(), new NotFoo(), new Foo());
+
+echo $myBar->doFoo($arrayOfFoo, 'Success');
+// Success
+
+echo $myBar->doFoo($notArrayOfFoo, 'Success');
+// Uncaught TypeError: Argument 2 passed to Bar::{closure}() must be an instance of Foo, instance of NotFoo given...
\ No newline at end of file
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..473d0f8
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,122 @@
+# Running Application Tests
+
+This is the quick-start to CodeIgniter testing. Its intent is to describe what
+it takes to set up your application and get it ready to run unit tests.
+It is not intended to be a full description of the test features that you can
+use to test your application. Those details can be found in the documentation.
+
+## Resources
+
+* [CodeIgniter 4 User Guide on Testing](https://codeigniter4.github.io/userguide/testing/index.html)
+* [PHPUnit docs](https://phpunit.de/documentation.html)
+* [Any tutorials on Unit testing in CI4?](https://forum.codeigniter.com/showthread.php?tid=81830)
+
+## Requirements
+
+It is recommended to use the latest version of PHPUnit. At the time of this
+writing we are running version 9.x. Support for this has been built into the
+**composer.json** file that ships with CodeIgniter and can easily be installed
+via [Composer](https://getcomposer.org/) if you don't already have it installed globally.
+
+```console
+> composer install
+```
+
+If running under macOS or Linux, you can create a symbolic link to make running tests a touch nicer.
+
+```console
+> ln -s ./vendor/bin/phpunit ./phpunit
+```
+
+You also need to install [XDebug](https://xdebug.org/docs/install) in order
+for code coverage to be calculated successfully. After installing `XDebug`, you must add `xdebug.mode=coverage` in the **php.ini** file to enable code coverage.
+
+## Setting Up
+
+A number of the tests use a running database.
+In order to set up the database edit the details for the `tests` group in
+**app/Config/Database.php** or **phpunit.xml**.
+Make sure that you provide a database engine that is currently running on your machine.
+More details on a test database setup are in the
+[Testing Your Database](https://codeigniter4.github.io/userguide/testing/database.html) section of the documentation.
+
+## Running the tests
+
+The entire test suite can be run by simply typing one command-line command from the main directory.
+
+```console
+> ./phpunit
+```
+
+If you are using Windows, use the following command.
+
+```console
+> vendor\bin\phpunit
+```
+
+You can limit tests to those within a single test directory by specifying the
+directory name after phpunit.
+
+```console
+> ./phpunit app/Models
+```
+
+## Generating Code Coverage
+
+To generate coverage information, including HTML reports you can view in your browser,
+you can use the following command:
+
+```console
+> ./phpunit --colors --coverage-text=tests/coverage.txt --coverage-html=tests/coverage/ -d memory_limit=1024m
+```
+
+This runs all of the tests again collecting information about how many lines,
+functions, and files are tested. It also reports the percentage of the code that is covered by tests.
+It is collected in two formats: a simple text file that provides an overview as well
+as a comprehensive collection of HTML files that show the status of every line of code in the project.
+
+The text file can be found at **tests/coverage.txt**.
+The HTML files can be viewed by opening **tests/coverage/index.html** in your favorite browser.
+
+## PHPUnit XML Configuration
+
+The repository has a ``phpunit.xml.dist`` file in the project root that's used for
+PHPUnit configuration. This is used to provide a default configuration if you
+do not have your own configuration file in the project root.
+
+The normal practice would be to copy ``phpunit.xml.dist`` to ``phpunit.xml``
+(which is git ignored), and to tailor it as you see fit.
+For instance, you might wish to exclude database tests, or automatically generate
+HTML code coverage reports.
+
+## Test Cases
+
+Every test needs a *test case*, or class that your tests extend. CodeIgniter 4
+provides a few that you may use directly:
+* `CodeIgniter\Test\CIUnitTestCase` - for basic tests with no other service needs
+* `CodeIgniter\Test\DatabaseTestTrait` - for tests that need database access
+
+Most of the time you will want to write your own test cases to hold functions and services
+common to your test suites.
+
+## Creating Tests
+
+All tests go in the **tests/** directory. Each test file is a class that extends a
+**Test Case** (see above) and contains methods for the individual tests. These method
+names must start with the word "test" and should have descriptive names for precisely what
+they are testing:
+`testUserCanModifyFile()` `testOutputColorMatchesInput()` `testIsLoggedInFailsWithInvalidUser()`
+
+Writing tests is an art, and there are many resources available to help learn how.
+Review the links above and always pay attention to your code coverage.
+
+### Database Tests
+
+Tests can include migrating, seeding, and testing against a mock or live1 database.
+Be sure to modify the test case (or create your own) to point to your seed and migrations
+and include any additional steps to be run before tests in the `setUp()` method.
+
+1 Note: If you are using database tests that require a live database connection
+you will need to rename **phpunit.xml.dist** to **phpunit.xml**, uncomment the database
+configuration lines and add your connection details. Prevent **phpunit.xml** from being
+tracked in your repo by adding it to **.gitignore**.
diff --git a/tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php b/tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php
new file mode 100644
index 0000000..2bbdcfe
--- /dev/null
+++ b/tests/_support/Database/Migrations/2020-02-22-222222_example_migration.php
@@ -0,0 +1,37 @@
+forge->addField('id');
+ $this->forge->addField([
+ 'name' => ['type' => 'varchar', 'constraint' => 31],
+ 'uid' => ['type' => 'varchar', 'constraint' => 31],
+ 'class' => ['type' => 'varchar', 'constraint' => 63],
+ 'icon' => ['type' => 'varchar', 'constraint' => 31],
+ 'summary' => ['type' => 'varchar', 'constraint' => 255],
+ 'created_at' => ['type' => 'datetime', 'null' => true],
+ 'updated_at' => ['type' => 'datetime', 'null' => true],
+ 'deleted_at' => ['type' => 'datetime', 'null' => true],
+ ]);
+
+ $this->forge->addKey('name');
+ $this->forge->addKey('uid');
+ $this->forge->addKey(['deleted_at', 'id']);
+ $this->forge->addKey('created_at');
+
+ $this->forge->createTable('factories');
+ }
+
+ public function down()
+ {
+ $this->forge->dropTable('factories');
+ }
+}
diff --git a/tests/_support/Database/Seeds/ExampleSeeder.php b/tests/_support/Database/Seeds/ExampleSeeder.php
new file mode 100644
index 0000000..f67bf8f
--- /dev/null
+++ b/tests/_support/Database/Seeds/ExampleSeeder.php
@@ -0,0 +1,41 @@
+ 'Test Factory',
+ 'uid' => 'test001',
+ 'class' => 'Factories\Tests\NewFactory',
+ 'icon' => 'fas fa-puzzle-piece',
+ 'summary' => 'Longer sample text for testing',
+ ],
+ [
+ 'name' => 'Widget Factory',
+ 'uid' => 'widget',
+ 'class' => 'Factories\Tests\WidgetPlant',
+ 'icon' => 'fas fa-puzzle-piece',
+ 'summary' => 'Create widgets in your factory',
+ ],
+ [
+ 'name' => 'Evil Factory',
+ 'uid' => 'evil-maker',
+ 'class' => 'Factories\Evil\MyFactory',
+ 'icon' => 'fas fa-book-dead',
+ 'summary' => 'Abandon all hope, ye who enter here',
+ ],
+ ];
+
+ $builder = $this->db->table('factories');
+
+ foreach ($factories as $factory) {
+ $builder->insert($factory);
+ }
+ }
+}
diff --git a/tests/_support/Libraries/ConfigReader.php b/tests/_support/Libraries/ConfigReader.php
new file mode 100644
index 0000000..40d057a
--- /dev/null
+++ b/tests/_support/Libraries/ConfigReader.php
@@ -0,0 +1,17 @@
+findAll();
+
+ // Make sure the count is as expected
+ $this->assertCount(3, $objects);
+ }
+
+ public function testSoftDeleteLeavesRow()
+ {
+ $model = new ExampleModel();
+ $this->setPrivateProperty($model, 'useSoftDeletes', true);
+ $this->setPrivateProperty($model, 'tempUseSoftDeletes', true);
+
+ /** @var stdClass $object */
+ $object = $model->first();
+ $model->delete($object->id);
+
+ // The model should no longer find it
+ $this->assertNull($model->find($object->id));
+
+ // ... but it should still be in the database
+ $result = $model->builder()->where('id', $object->id)->get()->getResult();
+
+ $this->assertCount(1, $result);
+ }
+}
diff --git a/tests/session/ExampleSessionTest.php b/tests/session/ExampleSessionTest.php
new file mode 100644
index 0000000..98fe7af
--- /dev/null
+++ b/tests/session/ExampleSessionTest.php
@@ -0,0 +1,18 @@
+set('logged_in', 123);
+ $this->assertSame(123, $session->get('logged_in'));
+ }
+}
diff --git a/tests/unit/HealthTest.php b/tests/unit/HealthTest.php
new file mode 100644
index 0000000..ab3e2aa
--- /dev/null
+++ b/tests/unit/HealthTest.php
@@ -0,0 +1,50 @@
+assertTrue(defined('APPPATH'));
+ }
+
+ public function testBaseUrlHasBeenSet()
+ {
+ $validation = Services::validation();
+
+ $env = false;
+
+ // Check the baseURL in .env
+ if (is_file(HOMEPATH . '.env')) {
+ $env = preg_grep('/^app\.baseURL = ./', file(HOMEPATH . '.env')) !== false;
+ }
+
+ if ($env) {
+ // BaseURL in .env is a valid URL?
+ // phpunit.xml.dist sets app.baseURL in $_SERVER
+ // So if you set app.baseURL in .env, it takes precedence
+ $config = new App();
+ $this->assertTrue(
+ $validation->check($config->baseURL, 'valid_url'),
+ 'baseURL "' . $config->baseURL . '" in .env is not valid URL'
+ );
+ }
+
+ // Get the baseURL in app/Config/App.php
+ // You can't use Config\App, because phpunit.xml.dist sets app.baseURL
+ $reader = new ConfigReader();
+
+ // BaseURL in app/Config/App.php is a valid URL?
+ $this->assertTrue(
+ $validation->check($reader->baseURL, 'valid_url'),
+ 'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL'
+ );
+ }
+}
diff --git a/writable/.htaccess b/writable/.htaccess
new file mode 100644
index 0000000..f24db0a
--- /dev/null
+++ b/writable/.htaccess
@@ -0,0 +1,6 @@
+
+ Require all denied
+
+
+ Deny from all
+