This commit is contained in:
2026-01-30 17:20:52 +09:00
commit 21b6332c9c
459 changed files with 190743 additions and 0 deletions

2
kngil/skin/.htaccess Normal file
View File

@@ -0,0 +1,2 @@
#skin direct access control
#(production 단계에서 활성화 예정)

57
kngil/skin/_footer.php Normal file
View File

@@ -0,0 +1,57 @@
<button class="btn-top" onclick="window.scrollTo(0,0);"><div class="arrow">Top</div></button>
<!-- footer -->
<footer class="footer">
<button class="footer-close">푸터 닫기</button>
<div class="footer-wrap">
<div class="comp-info">
<p class="logo"><img src="/kngil/img/logo_baron.svg" alt="KNGIL"></p>
<p class="ceo">대표이사 <em>장종찬</em></p>
</div>
<div class="comp-inner">
<div class="privacy-box">
<a class="privacy" href="javascript:privacy('privacy');">개인정보처리방침</a>
<a href="javascript:privacy('agreement');">이용약관</a>
</div>
<!-- comp-contact -->
<div class="comp-contact">
<ul class="footer-menu">
<li>
<a href="value.html">KNGIL</a>
</li>
<li>
<a href="provided.html">제공데이터</a>
</li>
<li>
<a href="primary.html">주요기능</a>
</li>
<li>
<a href="analysis.html">데이터분석</a>
</li>
<li>
<a href="results.html">성과품</a>
</li>
</ul>
<div class="footer-family">
<button class="btn-family">Family Site</button>
<ul class="family-list">
<li><a href="https://eg-bim.co.kr" target="_blank">EG-BIM</a></li>
<li><a href="http://k-tova.com" target="_blank">TOVA</a></li>
<li><a href="http://k-gaia.co.kr" target="_blank">GAIA</a></li>
</ul>
</div>
</div>
<!-- comp-contact END -->
<p class="address">[05774] 서울특별시 송파구 오금로 554(거여동) <span class="tel">Tel : 02-2141-7434</span></p>
<p class="copyright">© BARON Consultant Co,.Ltd All Rights Reserved.</p>
</div>
<!-- comp-area END -->
</div>
</footer>
<!--// footer -->
<!-- // 모든 팝업페이지 경로 -->
<script src="/kngil/js/common.js"></script>

34
kngil/skin/_head.php Normal file
View File

@@ -0,0 +1,34 @@
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
/>
<meta http-equiv="X-UA-compatible" content="IE=edge,chrome=1" />
<meta name="format-detection" content="telephone=no" />
<link
rel="shortcut icon"
type="image/svg+xml"
href="/kngil/img/favicon.svg"
/>
<!-- CSS -->
<link rel="stylesheet" href="/kngil/css/lib/aos.min.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/lib/lenis.min.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/common.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/style.css" />
<!-- JS (local) -->
<script src="/kngil/js/lib/jquery-3.6.1.min.js"></script>
<script src="/kngil/js/lib/jquery.mousewheel.min.js"></script>
<script src="/kngil/js/lib/lenis.min.js"></script>
<script src="/kngil/js/lib/aos.min.js"></script>
<script src="/kngil/js/lib/gsap.min.js"></script>
<script src="/kngil/js/lib/scrolltrigger.min.js"></script>
<script src="/kngil/js/lib/ScrollToPlugin.min.js"></script>
<!-- ScrollMagic (외부 CDN 유지) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/animation.gsap.min.js"></script>
<title>KNGIL</title>

View File

@@ -0,0 +1,16 @@
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
/>
<meta http-equiv="X-UA-compatible" content="IE=edge,chrome=1" />
<meta name="format-detection" content="telephone=no" />
<link
rel="shortcut icon"
type="image/svg+xml"
href="/kngil/img/favicon.svg"
/>
<link rel="stylesheet" type="text/css" href="/kngil/css/common.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/style.css" />
<script src="./js/lib/jquery-3.6.1.min.js"></script>

168
kngil/skin/_header.php Normal file
View File

@@ -0,0 +1,168 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$isLogin = isset($_SESSION['login']);
$auth = $_SESSION['login']['auth_bc'] ?? '';
// 권한 그룹
$isSuperAdmin = in_array($auth, ['BS100100', 'BS100200']);
$isCompanyAdmin = in_array($auth, ['BS100100', 'BS100200', 'BS100300', 'BS100400']);
?>
<head>
<style>
.icon-btn {
display: inline-flex;
align-items: center;
justify-content: center;
margin-right: 6px;
}
.icon-btn img {
width: 30px;
height: 30px;
filter: invert(1); /* 흰색 아이콘 */
opacity: 0.8;
transition: 0.2s;
}
.icon-btn:hover img {
opacity: 1;
}
/* 툴팁 래퍼 */
.tooltip {
position: relative;
}
/* 툴팁 박스 */
.tooltip-text {
position: absolute;
bottom: 120%;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
background: rgba(20, 20, 20, 0.95);
color: #fff;
font-size: 12px;
padding: 6px 10px;
border-radius: 4px;
opacity: 0;
visibility: hidden;
transition: opacity 0.2s ease, transform 0.2s ease;
pointer-events: none;
z-index: 1000;
}
/* 말풍선 화살표 */
.tooltip-text::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border-width: 6px;
border-style: solid;
border-color: rgba(20, 20, 20, 0.95) transparent transparent transparent;
}
/* hover 시 노출 */
.tooltip:hover .tooltip-text {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(-4px);
}
</style>
</head>
<!-- header -->
<div class="header-wrap">
<header class="header">
<h1>
<a href="/kngil/skin/index.php">KNGIL</a>
</h1>
<div class="header-right">
<?php if ($isLogin): ?>
<!-- 통합 회원관리 (관리자/개발자만) -->
<?php if ($isSuperAdmin): ?>
<a href="/kngil/skin/adm.php"
class="icon-btn tooltip">
<img src="/kngil/img/ico/ico_super_admin.svg" class="header-icon" alt="통합 회원관리">
<span class="tooltip-text">통합 회원관리</span>
</a>
<?php endif; ?>
<!-- 회사 관리자 (관리자/개발자/메인/서브) -->
<?php if ($isCompanyAdmin): ?>
<a href="/kngil/skin/adm_comp.php"
class="icon-btn tooltip">
<img src="/kngil/img/ico/ico_company_admin.svg" class="header-icon" alt="회사 관리자">
<span class="tooltip-text">회사 관리자</span>
</a>
<?php endif; ?>
<?php endif; ?>
<!-- 기존 사용자 메뉴 -->
<div class="menu-box">
<button class="menu-user">
<img src="/kngil/img/ico/ico_user.svg" alt="user">
</button>
<ul class="menu-list">
<!-- 비로그인 -->
<li class="<?= $isLogin ? 'd-none' : '' ?>">
<a class="my-join" href="javascript:agreement();">회원가입</a>
</li>
<li class="<?= $isLogin ? 'd-none' : '' ?>">
<a class="my-login" href="javascript:login();">로그인</a>
</li>
<!-- 로그인 -->
<li class="<?= $isLogin ? '' : 'd-none' ?>">
<a class="my-join" href="javascript:mypage01()">마이페이지</a>
</li>
<li class="<?= $isLogin ? '' : 'd-none' ?>">
<a class="my-login" href="/kngil/bbs/logout.php">로그아웃</a>
</li>
</ul>
</div>
<div>
<button class="menu-all">
<span></span>
<span></span>
<span></span>
</button>
</div>
</div>
</header>
</div>
<!--// header -->
<!-- floating_menu -->
<div class="floating-menu">
<ul>
<li class="floating-faq">
<a href="/kngil/skin/faq_list.skin.php">
<i class="ico-faq"></i>
<span>FAQ</span>
</a>
</li>
<li class="floating-buy">
<a href="/kngil/?page=buy">
<i class="ico-buy"></i>
<span>구매하기</span>
</a>
</li>
</ul>
</div>
<!-- //floating_menu -->

48
kngil/skin/_nav.php Normal file
View File

@@ -0,0 +1,48 @@
<ul class="sitemap">
<li>
<a href="value.html">
<span>KNGIL</span>
<p>
공공데이터 기반으로 기초자료를<br>
<em>보고서 형태로 제공</em>하는 서비스
</p>
</a>
</li>
<li>
<a href="provided.html">
<span>제공데이터</span>
<p>
<em>쉽고 편리하게 작업</em> 있는<br>
다양한 기능 탑재
</p>
</a>
</li>
<li>
<a href="primary.html">
<span>주요기능</span>
<p>
<em>편의성, 직관성, 효율성 향상</em> 위한 <br>
다양한 기능을 제공
</p>
</a>
</li>
<li>
<a href="analysis.html">
<span>데이터분석</span>
<p>
위치 속성 정보 등을 정확히 매칭,<br>
<em>신뢰도 높은 분석 결과 제공</em>
</p>
</a>
</li>
<li>
<a href="results.html">
<span>성과품</span>
<p>
<em>항목별 자동생성</em><br>
보고서 제공
</p>
</a>
</li>
</ul>

17
kngil/skin/_popups.php Normal file
View File

@@ -0,0 +1,17 @@
<!-- 팝업 모음 (pop_temp 등에서 사용) -->
@@include("mypage/pop_agreement.html")
@@include("mypage/pop_join.html")
@@include("mypage/pop_join2.html")
@@include("mypage/pop_join3.html")
@@include("mypage/pop_login.html")
@@include("mypage/pop_login2.html")
@@include("mypage/pop_mypage01.html")
@@include("mypage/pop_mypage02.html")
@@include("mypage/pop_mypage03.html")
@@include("mypage/pop_mypage04.html")
@@include("mypage/pop_mypage05.html")
@@include("mypage/pop_mypage06.html")
@@include("mypage/pop_cancel.html")
@@include("mypage/pop_search.html")
@@include("mypage/pop_password.html")
@@include("popup/pop_privacy.html")

155
kngil/skin/adm.php Normal file
View File

@@ -0,0 +1,155 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/adm_guard.php';
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>큰길회원 list</title>
<!-- CSS -->
<link rel="stylesheet" href="/kngil/css/adm_style.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vitmalina/w2ui@master/dist/w2ui.min.css">
</head>
<body>
<a href="/kngil/skin/index.php" class="btn-home-fixed" title="홈으로">
<svg class="icon-home"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round">
<path d="M3 11L12 3l9 8"/>
<path d="M5 10v10h5v-6h4v6h5V10"/>
</svg>
</a>
<!-- =========================
페이지 타이틀 + 우측 버튼
========================= -->
<h1 class="adm-title">
큰길회원 list
<div class="adm-title-actions">
<button id="btnfaq" class="btn-faq">
F&Q 내용 등록
</button>
<button id="btnServiceRegister" class="btn-service">
서비스등록
</button>
<button id="btnPurchaseHistory" class="btn-history">
구매이력
</button>
<button id="btnProductManage" class="btn-product">
상품등록
</button>
</div>
</h1>
<div class="super-search-wrap">
<!-- 🔹 좌측: 검색 영역 -->
<div class="super-search">
<select id="schMemberStatus">
<option value="">회원상태 전체</option>
<option value="Y">사용중</option>
<option value="N">미사용</option>
</select>
<input type="text" id="schMemberName" placeholder="회원명 입력">
<input type="number" id="schRemainArea" placeholder="잔여면적(㎡ 이하)">
<!-- ✅ 검색버튼은 여기 -->
<button id="btnSearch">검색</button>
</div>
<!-- 🔹 우측: 저장 버튼 -->
<button id="btnSave">저장</button>
</div>
<!-- =========================
상단 Grid (회사 / 관리자)
========================= -->
<div class="card">
<div id="userGrid" style="height:520px;"></div>
</div>
<!-- =========================
하단 Grid (회사 사용자 목록)
========================= -->
<div class="card" id="detailCard" style="display:none;">
<div id="detailGrid" style="height:260px;"></div>
</div>
<!-- =========================
ES Module
========================= -->
<script type="module">
import { w2ui,w2alert } from 'https://cdn.jsdelivr.net/gh/vitmalina/w2ui@master/dist/w2ui.es6.min.js'
import { createSuperAdminGrid, bindSaveButton } from '/kngil/js/adm.js'
import { createUserGrid } from '/kngil/js/adm_comp.js'
import { openPurchaseHistoryPopup } from '/kngil/js/adm_purch_popup.js' //구매이력
import { openProductPopup } from '/kngil/js/adm_product_popup.js'
import { openfaqPopup } from '/kngil/js/adm_faq_popup.js'
// =========================
// 상단 회사 Grid 생성
// =========================
createSuperAdminGrid('#userGrid')
bindSaveButton()
// =========================
// 하단 사용자 Grid 생성 (빈 상태)
// =========================
createUserGrid('#detailGrid', {
loadSummary: false
})
// =========================
// 구매이력 버튼
// =========================
// 구매이력 버튼
/*
document.getElementById('btnPurchaseHistory')
.addEventListener('click', () => {
// 실제로는 선택된 회원ID를 넘길 예정
openPurchaseHistoryPopup('TEST001')
})
*/
// 💡 PHP 세션에서 로그인한 회원 ID 가져오기
// 세션 배열 구조에 따라 $_SESSION['login']['member_id']를 참조합니다.
const loginMemberId = "<?php echo $_SESSION['login']['member_id'] ?? ''; ?>";
const isSuperAdmin = <?php echo IS_SUPER_ADMIN ? 'true' : 'false'; ?>; // 관리자 여부
// 구매이력 버튼 클릭 이벤트
document.getElementById('btnPurchaseHistory')
.addEventListener('click', () => {
if (!loginMemberId) {
alert('로그인 세션이 만료되었거나 회원 정보를 찾을 수 없습니다.');
return;
}
// 'TEST001' 대신 실제 로그인한 세션 ID를 전달합니다.
openPurchaseHistoryPopup('',isSuperAdmin);
})
// =========================
// 상품등록 버튼
// =========================
document.getElementById('btnProductManage')
.addEventListener('click', () => {
openProductPopup()
})
// =========================
// F&Q 버튼
// =========================
document.getElementById('btnfaq')
.addEventListener('click', () => {
openfaqPopup()
})
</script>
</body>
</html>

188
kngil/skin/adm_comp.php Normal file
View File

@@ -0,0 +1,188 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/adm_guard.php';
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>관리자 페이지</title>
<!-- CSS -->
<!-- <link rel="stylesheet" href="/css/common.css"> -->
<link rel="stylesheet" href="/kngil/css/adm_style.css">
<!-- <link rel="stylesheet" href="/css/w2ui-custom.css"> -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vitmalina/w2ui@master/dist/w2ui.min.css">
</head>
<body>
<a href="/kngil/skin/index.php" class="btn-home-fixed" title="홈으로">
<svg class="icon-home"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round">
<path d="M3 11L12 3l9 8"/>
<path d="M5 10v10h5v-6h4v6h5V10"/>
</svg>
</a>
<h1 class="adm-title">
관리자 페이지
<div class="adm-title-actions">
<button id="btnUseHistory" class="btn-history">사용이력</button>
<button id="btnPurchaseHistory" class="btn-history">구매이력</button>
</div>
</h1>
<!-- 계약 / 사용량 -->
<div class="card adm-summary">
<!-- 1행 -->
<div class="adm-row">
<div class="adm-item">
<span class="label">계약현황</span>
<span class="value">회원ID</span>
<span class="value bold" id="memberId">-</span>
</div>
<div class="adm-item">
<span class="label">요금제</span>
<span class="value bold" id="planName">-</span>
</div>
<div class="adm-item right">
<span class="label">유효기간</span>
<span class="value" id="dateRange">-</span>
</div>
</div>
<!-- 2행 -->
<div class="adm-row usage">
<div class="adm-item">
<span class="label">사용현황</span>
<span class="value">발급ID</span>
<span class="value bold" id="issuedCnt">-</span>
</div>
<div class="adm-item">
<span class="label">사용ID</span>
<span class="value bold" id="usedCnt">-</span>
</div>
<div class="usage-box">
<div class="usage-text">
<span id="usedArea">-</span>
<span id="totalArea">-</span>
</div>
<div class="usage-bar">
<div class="usage-used" id="usedBar">0%</div>
<div class="usage-remain" id="remainBar"></div>
</div>
</div>
</div>
</div>
<div class="adm-search">
<input type="text" id="schKeyword" placeholder="검색어 입력">
<select id="schType">
<option value="">전체</option>
<option value="id">ID</option>
<option value="name">이름</option>
<option value="dept">부서</option>
</select>
<select id="schUseYn">
<option value="">전체</option>
<option value="Y">사용</option>
<option value="N">미사용</option>
</select>
<button id="btnSearch">검색</button>
<!-- ✅ 회원ID (관리자 전용 컨트롤) -->
<input
type="text"
id="targetMemberId"
class="adm-member-input"
placeholder="회원ID"
>
<button id="btnBulkCreate" class="btn-bulk">
일괄생성
</button>
<button id="btnSave_comp">저장</button>
<button id="btnDelete">삭제</button>
<button id="btnAdd">추가</button>
</div>
<!-- Grid -->
<div class="card">
<div id="userGrid" style="height:730px;"></div>
</div>
<!-- ✅ ES Module 진입점 -->
<script type="module">
import { createUserGrid, loadData } from '/kngil/js/adm_comp.js'
import { openPurchaseHistoryPopup } from '/kngil/js/adm_purch_popup.js'
import { openuseHistoryPopup } from '/kngil/js/adm_use_history.js'
// 거래처 관리자 Grid 생성
await createUserGrid('#userGrid', {
loadSummary: true
})
//상단
loadData()
// 💡 PHP 세션에서 로그인한 회원 ID 가져오기
// 세션 배열 구조에 따라 $_SESSION['login']['member_id']를 참조합니다.
const loginMemberId = "<?php echo $_SESSION['login']['member_id'] ?? ''; ?>";
const isSuperAdmin = <?php echo IS_SUPER_ADMIN ? 'true' : 'false'; ?>; // 관리자 여부
// 회원ID input 초기화
const memberInput = document.getElementById('targetMemberId');
if (memberInput) {
if (isSuperAdmin) {
// 관리자 / 개발자
memberInput.value = loginMemberId || '';
memberInput.disabled = false;
} else {
// 메인 / 서브
memberInput.value = loginMemberId;
memberInput.disabled = true;
memberInput.style.display = 'none';
}
}
// 구매이력 버튼 클릭 이벤트
document.getElementById('btnPurchaseHistory')
.addEventListener('click', () => {
if (!loginMemberId) {
alert('로그인 세션이 만료되었거나 회원 정보를 찾을 수 없습니다.');
return;
}
// 'TEST001' 대신 실제 로그인한 세션 ID를 전달합니다.
openPurchaseHistoryPopup(loginMemberId,isSuperAdmin);
})
// 구매이력 버튼 클릭 이벤트
document.getElementById('btnUseHistory')
.addEventListener('click', () => {
if (!loginMemberId) {
alert('로그인 세션이 만료되었거나 회원 정보를 찾을 수 없습니다.');
return;
}
// 'TEST001' 대신 실제 로그인한 세션 ID를 전달합니다.
openuseHistoryPopup(loginMemberId,isSuperAdmin);
})
</script>
</body>
</html>

188
kngil/skin/adm_comp1.php Normal file
View File

@@ -0,0 +1,188 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/adm_guard.php';
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>관리자 페이지</title>
<!-- CSS -->
<!-- <link rel="stylesheet" href="/css/common.css"> -->
<link rel="stylesheet" href="/kngil/css/adm_style.css">
<link rel="stylesheet" href="/kngil/css/adm_style.clean.css">
<!-- <link rel="stylesheet" href="/css/w2ui-custom.css"> -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vitmalina/w2ui@master/dist/w2ui.min.css">
</head>
<body class="page-admin">
<a href="/kngil/skin/index.php" class="btn-home-fixed" title="홈으로">
<svg class="icon-home"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round">
<path d="M3 11L12 3l9 8"/>
<path d="M5 10v10h5v-6h4v6h5V10"/>
</svg>
</a>
<h1 class="adm-title">
관리자 페이지
<div class="adm-title-actions">
<button id="btnUseHistory" class="btn-ghost">사용이력</button>
<button id="btnPurchaseHistory" class="btn-ghost">구매이력</button>
</div>
</h1>
<!-- 계약 / 사용량 -->
<div class="card adm-summary summary-card">
<!-- 1행 -->
<div class="adm-row">
<div class="adm-item">
<span class="label">계약현황</span>
<span class="value">회원ID</span>
<span class="value bold" id="memberId">-</span>
</div>
<div class="adm-item">
<span class="label">요금제</span>
<span class="value bold" id="planName">-</span>
</div>
<div class="adm-item right">
<span class="label">유효기간</span>
<span class="value" id="dateRange">-</span>
</div>
</div>
<!-- 2행 -->
<div class="adm-row usage">
<div class="adm-item">
<span class="label">사용현황</span>
<span class="value">발급ID</span>
<span class="value bold" id="issuedCnt">-</span>
</div>
<div class="adm-item">
<span class="label">사용ID</span>
<span class="value bold" id="usedCnt">-</span>
</div>
<div class="usage-box">
<div class="usage-text">
<span id="usedArea">-</span>
<span id="totalArea">-</span>
</div>
<div class="usage-bar">
<div class="usage-used" id="usedBar"></div>
</div>
</div>
</div>
</div>
<div class="adm-search search-card">
<input type="text" id="schKeyword" placeholder="검색어 입력">
<select id="schType">
<option value="">전체</option>
<option value="id">ID</option>
<option value="name">이름</option>
<option value="dept">부서</option>
</select>
<select id="schUseYn">
<option value="">전체</option>
<option value="Y">사용</option>
<option value="N">미사용</option>
</select>
<button id="btnSearch" class="btn-ghost">검색</button>
<!-- ✅ 회원ID (관리자 전용 컨트롤) -->
<input
type="text"
id="targetMemberId"
class="adm-member-input"
placeholder="회원ID"
>
<button id="btnBulkCreate" class="btn-ghost">
일괄생성
</button>
<button id="btnSave_comp" class="btn-primary">저장</button>
<button id="btnDelete" class="btn-danger">삭제</button>
<button id="btnAdd" class="btn-success">추가</button>
</div>
<!-- Grid -->
<div class="card grid-card">
<div id="userGrid" style="height:730px;"></div>
</div>
<!-- ✅ ES Module 진입점 -->
<script type="module">
import { createUserGrid, loadData } from '/kngil/js/adm_comp.js'
import { openPurchaseHistoryPopup } from '/kngil/js/adm_purch_popup.js'
import { openuseHistoryPopup } from '/kngil/js/adm_use_history.js'
// 거래처 관리자 Grid 생성
await createUserGrid('#userGrid', {
loadSummary: true
})
//상단
loadData()
// 💡 PHP 세션에서 로그인한 회원 ID 가져오기
// 세션 배열 구조에 따라 $_SESSION['login']['member_id']를 참조합니다.
const loginMemberId = "<?php echo $_SESSION['login']['member_id'] ?? ''; ?>";
const isSuperAdmin = <?php echo IS_SUPER_ADMIN ? 'true' : 'false'; ?>; // 관리자 여부
// 회원ID input 초기화
const memberInput = document.getElementById('targetMemberId');
if (memberInput) {
if (isSuperAdmin) {
// 관리자 / 개발자
memberInput.value = loginMemberId || '';
memberInput.disabled = false;
} else {
// 메인 / 서브
memberInput.value = loginMemberId;
memberInput.disabled = true;
memberInput.style.display = 'none';
}
}
// 구매이력 버튼 클릭 이벤트
document.getElementById('btnPurchaseHistory')
.addEventListener('click', () => {
if (!loginMemberId) {
alert('로그인 세션이 만료되었거나 회원 정보를 찾을 수 없습니다.');
return;
}
// 'TEST001' 대신 실제 로그인한 세션 ID를 전달합니다.
openPurchaseHistoryPopup(loginMemberId,isSuperAdmin);
})
// 구매이력 버튼 클릭 이벤트
document.getElementById('btnUseHistory')
.addEventListener('click', () => {
if (!loginMemberId) {
alert('로그인 세션이 만료되었거나 회원 정보를 찾을 수 없습니다.');
return;
}
// 'TEST001' 대신 실제 로그인한 세션 ID를 전달합니다.
openuseHistoryPopup(loginMemberId,isSuperAdmin);
})
</script>
</body>
</html>

View File

@@ -0,0 +1,165 @@
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
<?php include __DIR__ . "/_head.php"; ?>
<title>Q&A</title>
<!-- <script src="/kngil/js/faq/jquery-1.12.4.min.js?ver=2304171"></script> -->
<!-- <script src="/kngil/js/faq/jquery-migrate-1.4.1.min.js?ver=2304171"></script> -->
<script src="/kngil/js/faq/jquery.menu.js?ver=2304171"></script>
<script src="/kngil/js/faq/wrest.js?ver=2304171"></script>
<script src="/kngil/js/faq/placeholders.min.js?ver=2304171"></script>
<script src="/kngil/js/faq/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="/kngil/js/faq/jquery.bxslider.js?ver=2304171"></script>
<!-- //그누보드 작성 -->
<!-- 디자인팀 작성 -->
<script type="text/javascript" src="/kngil/js/faq/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="/kngil/js/faq/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<script type="text/javascript" src="/kngil/js/faq/faq_popup.js"></script>
<link rel="stylesheet" href="/kngil/css/qa/font-awesome.min.css?ver=2303229">
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<body>
<div class="wrap">
<!-- HEADER -->
<?php include __DIR__ . "/_header.php"; ?>
<!-- //HEADER -->
<?php
include __DIR__ . "/pop_login.php";
include __DIR__ . "/pop_join.php";
include __DIR__ . "/pop_agreement.php";
include __DIR__ . "/pop_mypage01.php";
include __DIR__ . "/pop_mypage02.php";
include __DIR__ . "/pop_mypage03.php";
include __DIR__ . "/pop_password.php";
include __DIR__ . "/pop_privacy.php";
include __DIR__ . "/pop_search.php";
// include __DIR__ . "/_nav.php";
?>
<div class="container faq">
<!-- 상단 타이틀 -->
<section class="sub-header">
<div class="page-title">
<h2 data-aos="fade-down" data-aos-duration="1000">FAQ</h2>
<p class="sub-txt">KNGIL 관련 문의하기</p>
</div>
<ul class="sub-tab">
<li class="on">
<a href="/kngil/skin/faq_list.skin.php">자주하는 질문(FAQ)</a>
</li>
<li>
<a href="/kngil/bbs/qa_list.php">문의하기(Q&A)</a>
</li>
<li>
<a href="https://939.co.kr/saman/" target="_blank">원격지원</a>
</li>
</ul>
</section>
<section class="sub-content">
<h3 class="sub-tit">자주하는 질문(FAQ)</h3>
<!-- 검색 -->
<fieldset id="faq_sch" class="search-box">
<legend>FAQ 검색</legend>
<input type="text" id="faqSearch" class="frm-input" placeholder="검색어를 입력하세요">
<button type="button" value="검색" class="btn-submit" aria-label="FAQ 검색 실행">
<i class="fa fa-search" aria-hidden="true"></i> 검색
</button>
</fieldset>
<!-- FAQ LIST (아코디언은 이 페이지 인라인 스크립트로 동작) -->
<ol id="faqList" class="faq-list" data-faq-handled="page">
<?php
// 1. DB 연결 파일 포함 (파일 경로가 다르면 수정하세요)
$db_path = __DIR__ . "/../bbs/db_conn.php";
if (file_exists($db_path)) {
include_once $db_path;
} else {
echo "<li style='padding:20px; color:red;'>설정 파일 오류: db_conn.php를 찾을 수 없습니다.</li>";
}
try {
// 2. 쿼리 실행 (PDO 방식)
$sql = "SELECT fa_subject, fa_content FROM kngil.fa_comments ORDER BY sq_no ASC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$i = 0;
// 3. 데이터 패치 및 출력
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$question = $row['fa_subject'];
$answer = $row['fa_content'];
$i++;
?>
<li class="faq-item">
<h3 class="faq-question">
<span class="tit-bg">Q</span>
<a href="#" class="faq-link"><?php echo htmlspecialchars($question); ?></a>
<button type="button" class="faq-icon" aria-label="답변 열기">
<i class="ico-plus" aria-hidden="true"></i>
</button>
</h3>
<div class="faq-answer">
<div class="con-inner">
<?php echo nl2br(htmlspecialchars($answer)); ?>
</div>
</div>
</li>
<?php
}
if ($i == 0) {
echo "<li class='no_data' style='text-align:center; padding:50px;'>등록된 FAQ 데이터가 없습니다.</li>";
}
} catch (PDOException $e) {
// 에러 발생 시 출력
echo "<li style='color:red;'>데이터 로딩 오류: " . $e->getMessage() . "</li>";
}
?>
</ol>
</section>
</div>
<!-- FOOTER -->
<?php include __DIR__ . "/_footer.php"; ?>
<!-- //FOOTER -->
</div>
<script src="/kngil/js/index.js"></script>
<script src="/kngil/js/mypage.js"></script>
<script src="/kngil/js/join.js"></script>
<script type="module" src="/kngil/js/login.js"></script>
<script src="/kngil/js/login_sms.js"></script>
<script>
AOS.init();
</script>
</body>
<script src="/kngil/js/viewimageresize.js"></script>

59
kngil/skin/index.php Normal file
View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<!--index.php-->
<html lang="ko">
<head>
<?php include __DIR__ . "/_head.php"; ?>
</head>
<body>
<div class="wrap main">
<div class="main-mask">
<?php include __DIR__ . "/_header.php"; ?>
<!-- container -->
<div class="container">
<section class="main-contents">
<div class="bg-video">
<a href="./value.html" class="main-link" id="main_video_link">
<video id="video_play" autoplay muted>
<source src="/kngil/img/video/main_1.mp4" type="video/mp4" class="main-video-01">
</video>
</a>
</div>
<ul class="main-pagination">
<li><div class="page-01 page-on" data-page="1"><img src="/kngil/img/logo_kngil.svg" alt="KNGIL"></div><span>01</span></li>
<li><div class="page-02" data-page="2">제공데이터</div><span>02</span></li>
<li><div class="page-03" data-page="3">주요기능</div><span>03</span></li>
<li><div class="page-04" data-page="4">데이터분석</div><span>04</span></li>
<li><div class="page-05" data-page="5">성과품</div><span>05</span></li>
</ul>
</section>
</div>
<?php include __DIR__ . "/_footer.php"; ?>
<!-- // container -->
</div>
</div>
<?php
include __DIR__ . "/pop_login.php";
include __DIR__ . "/pop_join.php";
include __DIR__ . "/pop_agreement.php";
include __DIR__ . "/pop_mypage01.php";
include __DIR__ . "/pop_mypage02.php";
include __DIR__ . "/pop_mypage03.php";
include __DIR__ . "/pop_password.php";
include __DIR__ . "/pop_privacy.php";
include __DIR__ . "/pop_search.php";
include __DIR__ . "/_nav.php";
?>
<script>
window.IS_LOGIN = <?= isset($_SESSION['login']) ? 'true' : 'false' ?>;
</script>
<script src="/kngil/js/index.js"></script>
<script src="/kngil/js/mypage.js"></script>
<script src="/kngil/js/join.js"></script>
<script type="module" src="/kngil/js/login.js"></script>
<script src="/kngil/js/login_sms.js"></script>
</body>
</html>

View File

@@ -0,0 +1,314 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_agreement" role="dialog" aria-labelledby="agreement_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container join">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="agreement_title">회원가입</h2>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" novalidate>
<div class="terms-wrap">
<div class="terms-area">
<div class="check-box">
<label for="terms_agree">이용약관</label>
<input type="checkbox" id="terms_agree">
</div>
<div class="terms-box">
<em>KNGIL 소프트웨어 이용약관</em> <br>
<br>
<em>제1장 총칙</em> <br>
<em>제1조 (목적)</em><br>
약관은 바론컨설턴트(이하 "회사" 합니다) 제공하는 KNGIL 소프트웨어(이하 "서비스" 합니다) 이용함에 있어 회사와 이용자 간의 권리,
의무 책임사항과 기타 필요한 사항을 정하는 것을 목적으로 합니다.<br>
<em>제2조 (용어의 정의)</em> <br>
약관에서 사용하는 용어의 정의는 다음과 같습니다:<br>
- “서비스”란 회사가 제공하는 소프트웨어 관련 제반 서비스를 의미합니다.<br>
- “이용자”란 회사의 서비스에 접속하여 약관에 따라 회사가 제공하는 서비스를 이용하는 회원 비회원을 말합니다.<br>
- “회원”이란 약관에 동의하고 회사와 이용계약을 체결한 자를 의미합니다.<br>
- “비회원”이란 회원가입을 하지 않고 회사가 제공하는 일부 서비스를 이용하는 자를 말합니다.<br>
<em>제3조 (약관의 효력 변경)</em><br>
약관은 이용자가 약관에 동의하고, 회사가 이에 대한 승낙을 완료함으로써 효력이 발생합니다.
회사는 필요한 경우 약관을 변경할 있으며, 변경된 약관은 서비스 화면에 공지된 효력이 발생합니다.<br>
<em>제4조 (약관 준칙)</em><br>
약관에 명시되지 않은 사항에 대해서는 대한민국의 관련 법령과 상관습에 따릅니다.<br>
<em>제2장 서비스 이용계약</em><br>
<em>제5조 (이용계약의 성립)</em><br>
이용계약은 이용자가 약관의 내용에 동의하고, 회사가 제공하는 소정의 회원가입 신청서를 작성하여 가입을 완료한 , 회사가 이를 승인함으로써 성립합니다.<br>
<em>제6조 (이용계약의 유보와 거절)</em><br>
회사는 다음 호에 해당하는 경우 이용계약의 성립을 유보하거나 거절할 있습니다:
- 신청서의 내용이 허위로 판명된 경우
- 서비스 제공이 기술적으로 어려운 경우<br>
<em>제7조 (계약사항의 변경)</em><br>
회원은 개인정보 관리 메뉴를 통해 언제든지 자신의 정보를 열람하고 수정할 있습니다. 회원의 정보가 변경된 경우 즉시 수정해야 하며, 수정하지 않아
발생하는 문제의 책임은 회원에게 있습니다.<br>
<em>제3장 개인정보 보호</em><br>
<em>제8조 (개인정보 보호의 원칙)</em><br>
회원의 개인정보는 관련 법령에 따라 보호됩니다.
회사는 개인정보 보호와 관련된 세부 사항을 별도로 마련한 개인정보처리방침에 따라 관리하며, 이용자는 언제든지 해당 방침을 통해 개인정보 관리에 대한
자세한 내용을 확인할 있습니다.<br>
<em>제9조 (개인정보처리방침 준수)</em><br>
회사는 개인정보 보호와 관련된 구체적인 사항을 개인정보처리방침에 따라 관리합니다.
개인정보의 수집, 이용, 제공, 보관, 보호 등에 관한 사항은 회사의 개인정보처리방침을 따르며, 이용자는 회사 웹사이트에서 이를 확인할
있습니다.
회사는 개인정보 보호를 위해 최선을 다하며, 관련 법령에 따라 이용자의 개인정보를 안전하게 관리합니다.<br>
<em>제10조 (14 미만 아동의 개인정보 보호)</em><br>
회사는 14 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다.
법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 있으며, 회사는 이를 신속하게 처리합니다.
14 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.<br>
<em>제4장 서비스 제공 이용</em><br>
제11조 (서비스 제공)<br>
회사는 회원의 이용 신청을 승인한 때부터 서비스를 개시합니다. 서비스 이용은 연중무휴 24시간을 원칙으로 합니다.<br>
<em>제12조 (서비스의 변경 중단)</em> <br>
회사는 서비스 제공이 어려운 경우 사전 고지 서비스를 변경하거나 중단할 있습니다.<br>
<em>제5장 정보 제공 광고</em><br>
제13조 (정보 제공 광고)<br>
회사는 서비스 이용 필요하다고 인정되는 정보 광고를 제공할 있습니다.
회원은 원치 않는 정보를 수신 거부할 있습니다.<br>
<em>제6장 게시물 관리</em><br>
<em>제14조 (게시물의 관리)</em><br>
회사는 회원이 게시한 내용이 불법적이거나 약관에 위배될 경우 이를 삭제할 있습니다.<br>
<em>제15조 (게시물의 저작권)</em><br>
게시물의 저작권은 회원에게 있으며, 회사는 이를 서비스 홍보 개선 목적으로 사용할 있습니다.<br>
<em>제7장 계약 해지 이용 제한</em><br>
<em>제16조 (계약 해지)</em> <br>
회원은 언제든지 계약 해지를 요청할 있으며, 회사는 신속하게 처리합니다.<br>
<em>제17조 (이용 제한)</em><br>
회사는 회원이 약관을 위반할 경우 서비스 이용을 제한할 있습니다.<br>
<em>제8장 손해 배상 면책 조항</em><br>
<em>제18조 (손해 배상)</em><br>
회사는 무료로 제공되는 서비스와 관련하여 회원에게 발생한 손해에 대해 책임을 지지 않습니다.<br>
<em>제19조 (면책 조항)</em><br>
회사는 천재지변 불가항력적인 사유로 인해 서비스를 제공하지 못하는 경우 책임을 지지 않습니다.<br>
<em>제9장 유료 서비스</em> <br>
<em>20 (유료 서비스의 이용)</em><br>
회사는 회원에게 특정 서비스에 대해 유료로 제공할 있습니다.
유료 서비스의 이용 요금, 결제 방식, 환불 절차 등에 대한 상세 내용은 서비스 안내 페이지와 결제 화면에 명시합니다.
유료 서비스 이용 요금은 회사가 정한 결제 방식에 따라 결제됩니다. 회원은 신용카드, 계좌이체, 휴대전화 결제 회사가 제공하는 다양한 결제
방식을 통해 요금을 납부할 있습니다.
유료 서비스의 이용 요금은 선불 결제를 원칙으로 하며, 이용 기간 서비스 중지 해지 남은 이용 기간에 대한 환불은 회사의 환불 정책에
따라 처리됩니다.
회사는 회원의 유료 서비스 이용과 관련하여 발생한 문제에 대해 최선을 다해 해결하도록 노력합니다. 다만, 회사의 고의 또는 중대한 과실이 없는
회원이 유료 서비스 이용 입은 손해에 대해서는 책임을 지지 않습니다.<br>
<em>20 (유료 서비스의 이용)</em> <br>
회원은 결제 7 이내에 서비스 이용을 시작하지 않은 경우, 요금 전액을 환불받을 있습니다.
유료 서비스 이용 부득이한 사유로 서비스가 중지된 경우, 회사는 이용하지 않은 부분에 대해 환불 절차를 밟습니다.
회원의 귀책사유로 인해 서비스 이용이 중지된 경우, 환불이 불가능합니다.
환불은 회원이 지정한 계좌로 환불 절차를 거치며, 환불 요청 7 이내에 처리됩니다.<br>
<em>제22조 (유료 서비스의 중지 해지)</em><br>
회원이 유료 서비스를 해지하고자 하는 경우, 회사의 고객 지원 센터에 해지 신청을 해야 합니다.
회사는 회원이 약관을 위반하거나 부정한 방법으로 유료 서비스를 이용한 경우, 유료 서비스 이용을 즉시 중지하고 계약을 해지할 있습니다.<br>
<em>제10장 양도 금지</em><br>
<em>제23조 (양도 금지)</em><br>
회원은 서비스 이용권한, 기타 이용계약상의 지위를 제3자에게 양도, 증여할 없으며, 이를 담보로 제공할 없습니다.<br>
<em>제11장 관할 법원</em><br>
<em>제24조 (분쟁 해결)</em><br>
서비스 이용과 관련하여 분쟁이 발생한 경우, 회사와 회원은 성실히 협의하여 해결합니다.<br>
<em>제25조 (관할 법원)</em><br>
약관에 따른 분쟁은 서울중앙지방법원을 관할 법원으로 합니다.<br>
<em>부칙</em><br>
약관은 2024 10 1일부터 시행됩니다.<br>
</div>
</div>
<div class="terms-area">
<div class="check-box">
<label for="privacy_agree">개인정보 수집 이용 동의</label>
<input type="checkbox" id="privacy_agree">
</div>
<div class="terms-box">
<em>KNGIL 서비스 개인정보처리방침</em> <br>
<br>
<em>제1조 (목적)</em><br>
<em>제1조 (목적)</em><br>
바론컨설턴트(이하 "회사") KNGIL 서비스(이하 "서비스") 이용하는 고객(이하 "이용자") 개인정보를 보호하고, 「개인정보 보호법」에 따라
책임과 의무를 다하기 위해 개인정보처리방침을 마련했습니다. 방침은 이용자가 제공한 개인정보가 어떻게 수집, 이용, 보관, 보호되는지를
설명합니다.<br>
<em>제2조 (개인정보의 처리목적)</em><br>
회사는 다음의 목적을 위해 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는
「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 필요한 조치를 이행할 예정입니다.
- 본인확인: 회원가입 관리를 위한 본인 확인, 전화 또는 이메일을 통한 연락
- 서비스 제공: 각종 통보 서비스 제공을 위한 업무 처리
- 제품소개서 다운로드: 설명자료 전달
- 상담 데모 신청: 상담 제공 데모 제공, 계약 처리자 정보 수집
- 행사 참가 신청: 참석 안내 세미나/설명회/교육 제공
- 보안가이드 제공: 안내자료 전달
- 기술지원 문의: 서비스 사용 지원
- 서비스 개선 의견 접수: 서비스 품질 개선
- 마케팅 활동: 동의한 고객에 한해 뉴스레터 매거진 발송<br>
<em>제3조 (개인정보의 처리 보유 기간)</em><br>
회사는 법령에 따른 개인정보 보유 이용기간 또는 정보주체로부터 개인정보를 수집 동의받은 개인정보 보유 이용기간 내에서 개인정보를 처리
보유합니다.
각각의 개인정보 처리 보유 기간은 다음과 같습니다:
- 회원정보: 회원가입일부터 회원탈퇴 1년까지
- 홍보, 상담, 계약용 개인정보: 2<br>
<em>제4조 (개인정보의 제3자 제공)</em><br>
회사는 정보주체의 개인정보를 제2조에서 명시한 범위 내에서만 처리하며, 정보 주체의 동의, 법률의 특별한 규정 「개인정보 보호법」 제17조
제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.
회사는 다음과 같이 개인정보를 제3자에게 제공하고 있습니다:
- 제공받는 : 수사기관 유관기관, 피신고업체
- 이용 목적: 개인정보 침해 민원 처리
- 제공하는 개인정보 항목: 성명, 연락처, 이메일
- 보유 이용기간: 법령에서 정한 보존기간 제공목적 달성 파기<br>
<em>제5조 (개인정보 처리 위탁)</em><br>
회사는 개인정보 처리업무를 외부 업체에 위탁하지 않으며, 자체적으로 처리하고 있습니다.
회사가 특정 업무(: 채용 업무) 외부 업체에 위탁할 경우, 개인정보 처리방침 시행 회사 홈페이지에서 공지한 정보주체의 동의를 받은
위탁합니다.<br>
<em>제6조 (정보주체의 권리·의무 행사 방법)</em><br>
정보주체는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 있습니다.
권리 행사는 다음과 같은 방법으로 있습니다:
- 서면: 회사 주소로 서면 제출
- 전자우편: 회사 이메일로 요청
- 모사전송(FAX): 회사 FAX로 요청
권리 행사는 정보주체의 법정대리인이나 위임을 받은 자를 통해 대리로도 가능합니다. 경우 “개인정보 처리 방법에 관한 고시” 별지 제11호 서식에
따른 위임장을 제출해야 합니다.
개인정보 열람 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 따라 제한될 있습니다.
개인정보의 정정 삭제 요구는 다른 법령에 따라 수집된 개인정보인 경우 제한될 있습니다.
회사는 권리 행사를 요청한 자가 본인 또는 정당한 대리인인지를 확인합니다.<br>
<em>제7조 (처리하는 개인정보의 항목)</em><br>
회사는 다음의 개인정보 항목을 처리합니다:
- 수집 항목:
- 필수 항목: 성명, 휴대전화번호, 이메일
- 선택 항목: 회사전화번호, 문의사항
- 수집 방법:
- 홈페이지, 전화, 이메일을 통해 수집<br>
<em>제8조 (개인정보의 파기)</em><br>
회사는 개인정보 보유 기간의 경과, 처리 목적 달성 개인정보가 불필요하게 되었을 지체 없이 해당 개인정보를 파기합니다.
정보주체로부터 동의받은 개인정보 보유 기간이 경과하거나 처리 목적이 달성된 경우에도 다른 법령에 따라 개인정보를 계속 보존해야 경우에는, 해당
개인정보를 별도의 데이터베이스(DB) 옮기거나 보관 장소를 달리하여 보존합니다.
개인정보 파기의 절차 방법은 다음과 같습니다:
- 파기 절차: 회사는 파기 사유가 발생한 개인정보를 선정하고, 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.
- 파기 방법: 전자적 파일 형태로 기록된 개인정보는 복구할 없도록 기술적 방법을 사용해 삭제하며, 종이 문서에 기록된 개인정보는 분쇄기로
분쇄하거나 소각하여 파기합니다.<br>
<em>제9조 (개인정보의 안전성 확보 조치)</em><br>
회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취합니다:
- 관리적 조치: 내부관리계획 수립·시행, 정기적 직원 교육
- 기술적 조치: 개인정보처리시스템 접근 권한 관리, 접근통제시스템 설치, 고유식별정보 암호화, 보안 프로그램 설치
- 물리적 조치: 전산실 자료보관실 접근 통제<br>
<em>제10조 (개인정보 자동 수집 장치의 설치·운영 거부에 관한 사항)</em><br>
회사는 쿠키(Cookie) 사용하지 않습니다. 쿠키는 이용자의 이용 정보를 저장하고 수시로 불러오는 작은 파일로, KNGIL 서비스에서는 쿠키를
사용하지 않습니다.<br>
<em>제11조 (개인정보 보호책임자)</em><br>
회사는 개인정보 처리에 관한 업무를 총괄하여 책임지고, 개인정보 처리와 관련된 정보주체의 불만처리 피해구제를 위해 개인정보 보호책임자를 지정하고
있습니다.
개인정보 보호책임자:
- 성명: 최은혜
- 직책: 연구원
- 연락처: 02-2141-7443
- 팩스번호: 02-408-1927
- 이메일: b23065@hanmaceng.co.kr<br>
<em>제12조 (개인정보 열람청구)</em><br>
정보주체는 「개인정보 보호법」 제35조에 따른 개인정보 열람 청구를 아래 부서에 있습니다. 회사는 정보주체의 개인정보 열람청구가 신속하게
처리되도록 노력하겠습니다.
개인정보 열람청구 접수·처리 부서:
- 부서명: 총괄기획실
- 담당자: 박진
- 연락처: 02-2141-7485
- 팩스번호: 02-2141-7599
- 이메일: jpark@baroncs.co.kr<br>
<em>제13조 (권익침해 구제방법)</em><br>
정보주체는 개인정보 침해로 인한 구제를 위해 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁 해결이나 상담을 신청할 있습니다.
- 개인정보분쟁조정위원회: (국번없이) 1833-6972 (www.kopico.go.kr)
- 개인정보침해신고센터: (국번없이) 118 (privacy.kisa.or.kr)
- 대검찰청: (국번없이) 1301 (www.spo.go.kr)
- 경찰청: (국번없이) 182 (www.police.go.kr)<br>
<em>제14조 (개인정보 처리방침의 변경)</em><br>
개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용의 추가, 삭제 수정이 있을 , 개정 최소 7 전에 홈페이지를 통해 사전
공지합니다.<br>
<br>
<em>부칙</em><br>
<em>제1조 (시행일자)</em><br>
개인정보처리방침은 2024 10 1일부터 시행됩니다.<br>
<em>제2조 (개정 고지의 의무)</em><br>
회사는 개인정보처리방침을 변경하는 경우, 변경사항을 시행일자 7 전부터 서비스 공지사항 페이지를 통해 고지할 것입니다. 다만, 이용자의 권리나
의무에 중대한 변경이 발생하는 경우에는 시행일자 30 전부터 고지합니다.<br>
<em>제3조 (유효성)</em><br>
개인정보처리방침의 일부 조항이 법적 또는 기타 사유로 인해 무효화되거나 시행할 없는 경우, 나머지 조항들은 계속해서 유효합니다. 무효화된 조항은
관련 법령에 부합하는 방식으로 수정되어 효력을 지속합니다.<br>
<em>제4조 (변경 통지의 방법)</em><br>
회사는 개인정보처리방침의 변경 , 다음의 방법으로 이용자에게 고지합니다:
- 서비스 초기화면 또는 팝업 공지
- 이메일 발송
- 회사 홈페이지 공지사항<br>
<em>제5조 (비회원의 개인정보 보호)</em><br>
회사는 비회원의 개인정보도 회원과 동일한 수준으로 보호합니다. 비회원이 개인정보 제공을 거부할 경우 일부 서비스 이용에 제한이 있을 있습니다.<br>
<em>제6조 (14 미만 아동의 개인정보 보호)</em><br>
회사는 14 미만 아동의 개인정보를 수집하지 않습니다. 만일 14 미만 아동의 개인정보가 수집된 경우, 법정 대리인의 동의를 받아야 하며, 법정
대리인의 동의 없이 수집된 경우 이를 지체 없이 파기합니다.<br>
<em>제7조 (개인정보의 국외 이전)</em><br>
회사는 이용자의 개인정보를 국외로 이전하지 않으며, 향후 필요한 경우, 사전에 이용자의 동의를 받습니다.<br>
<em>제8조 (기타)</em><br>
방침에 명시되지 않은 사항은 회사의 내부 방침과 관련 법령에 따릅니다.<br>
</div>
</div>
<div class="check-box">
<label for="all_agree">약관에 모두 동의합니다.</label>
<input type="checkbox" id="all_agree" class="chk-all">
</div>
<div class="btn-wrap">
<button class="btn-full" type="button" onclick="javascript:join();">확인</button>
</div>
</div>
</form>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

46
kngil/skin/pop_cancel.php Normal file
View File

@@ -0,0 +1,46 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_cancel" role="dialog" aria-labelledby="mypage03_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container cancel">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage03_title">회원 탈퇴</h2>
<p class="sub-txt">
<em>
서비스를 이용해주셔서 감사합니다.<br><br>
탈퇴 내용을 <br>
다시 확인해주세요.
</em>
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<div class="messages">
<div class="msg-box">
<div class="ico-pw"><img src="/kngil/img/ico/ico_people_del.svg" alt=""></div>
<p>
탈퇴 서비스 이용이 <em class="tc-red">즉시 종료</em>되며, <br />
<em>이용 중인 유료 서비스는 이상 사용할 없습니다.</em>
</p>
<br/>
<p><em>그래도 탈퇴하시겠습니까?</em></p>
</div>
<div class="btn-wrap">
<button class="btn-cancel" type="button">회원탈퇴</button>
<button class="btn-full" type="button">취소</button>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

261
kngil/skin/pop_join.php Normal file
View File

@@ -0,0 +1,261 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_join" role="dialog" aria-labelledby="join_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container join">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="join_title">회원가입</h2>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" name="joinForm" novalidate>
<div class="tbl-wrap">
<span class="info-msg txt-right">*항목은 필수 항목 입니다.</span>
<table>
<tbody>
<!-- 회원 유형 -->
<tr>
<th>
<label for="company_name">회원유형</label>
</th>
<td>
<div class="input-box">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2">
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<!-- 아이디 -->
<tr>
<th>
<label for="user_id">아이디</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
class="user-id"
type="text"
id="user_id"
name="userId"
placeholder="아이디 입력"
required
pattern="[a-zA-Z][a-zA-Z0-9]{3,11}"
aria-describedby="id_help"
>
<button type="button" id="btn_id_check" class="btn-sm" aria-label="아이디 중복 확인">
중복확인
</button>
</div>
<span class="info-msg" id="id_help">
영문+숫자 4~12(영문으로 시작)
</span>
</td>
</tr>
<!-- 비밀번호 -->
<tr>
<th>
<label for="user_password">비밀번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box">
<input
type="password"
id="user_password"
name="userPassword"
placeholder="비밀번호 입력"
required
minlength="8"
pattern="^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*]).{8,}$"
aria-describedby="password_help"
>
<input
type="password"
id="user_password_confirm"
name="userPasswordConfirm"
placeholder="비밀번호 확인"
required
aria-describedby="password_help"
>
</div>
<span class="info-msg" id="password_help">
영문+숫자+특수기호 8 이상
</span>
</td>
</tr>
<!-- 이름 -->
<tr>
<th class="h-4">
<label for="user_name">이름</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="info-box">
<input
type="text"
id="user_name"
name="userName"
placeholder="이름 입력"
required
>
</div>
</td>
</tr>
<!-- 이메일 -->
<tr>
<th class="h-4">
<label for="user_email">이메일</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box">
<input
type="text"
id="user_email"
name="userEmail"
class="e-id"
placeholder="이메일 입력"
required
aria-describedby="email_help"
>
<div aria-hidden="true"><span>@</span></div>
<input
type="text"
id="custom_domain"
name="customDomain"
placeholder="직접 입력"
class="custom-domain d-none"
aria-label="이메일 도메인 직접 입력"
>
<select
name="emailDomain"
id="domain_list"
class="domain-list"
required
aria-describedby="email_help"
>
<option value="" hidden disabled selected>선택</option>
<option value="naver.com">naver.com</option>
<option value="gmail.com">gmail.com</option>
<option value="daum.net">daum.net</option>
<option value="nate.com">nate.com</option>
<option value="hotmail.com">hotmail.com</option>
<option value="yahoo.com">yahoo.com</option>
<option value="type">직접입력</option>
</select>
</div>
<span class="info-msg d-none" id="email_help">이메일 도메인을 선택하거나 직접 입력하세요</span>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr>
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer d-none">03:00</span>
<button type="button" class="btn-sm btn-code" aria-label="인증번호 발송">
인증번호
</button>
</div>
</td>
</tr>
<!-- 휴대전화번호 인증완료 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="complete-msg"><i class="ico-check" aria-hidden="true"></i>인증완료</span>
</div>
</td>
</tr>
<!-- 회사정보 -->
<tr class="company-group">
<th>
<label for="company_name">회사정보</label>
</th>
<td>
<div class="input-box">
<input
type="text"
id="company_name"
name="companyName"
placeholder="회사명 입력"
>
<input
type="text"
id="department_name"
name="departmentName"
placeholder="소속부서 입력"
>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="btn-wrap">
<button type="submit" class="btn-full">
가입하기
</button>
</div>
</form>
<!-- 가입완료 메시지 -->
<div class="messages" style="display: none;" role="alert" aria-live="polite">
<i class="complete" aria-hidden="true"></i>
<span>
<em>이지빔님 환영합니다!</em><br>
회원가입이 완료 되었습니다.
</span>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

261
kngil/skin/pop_join2.php Normal file
View File

@@ -0,0 +1,261 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_join2" role="dialog" aria-labelledby="join_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container join">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="join_title">회원가입</h2>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" name="joinForm" novalidate>
<div class="tbl-wrap">
<span class="info-msg txt-right">*항목은 필수 항목 입니다.</span>
<table>
<tbody>
<!-- 회원 유형 -->
<tr>
<th>
<label for="company_name">회원유형</label>
</th>
<td>
<div class="input-box">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2">
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<!-- 아이디 -->
<tr>
<th>
<label for="user_id">아이디</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
class="user-id"
type="text"
id="user_id"
name="userId"
placeholder="아이디 입력"
required
pattern="[a-zA-Z][a-zA-Z0-9]{3,11}"
aria-describedby="id_help"
>
<button type="button" class="btn-sm" aria-label="아이디 중복 확인">
중복확인
</button>
</div>
<span class="info-msg" id="id_help">
영문+숫자 4~12(영문으로 시작)
</span>
</td>
</tr>
<!-- 비밀번호 -->
<tr>
<th>
<label for="user_password">비밀번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box">
<input
type="password"
id="user_password"
name="userPassword"
placeholder="비밀번호 입력"
required
minlength="8"
pattern="^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*]).{8,}$"
aria-describedby="password_help"
>
<input
type="password"
id="user_password_confirm"
name="userPasswordConfirm"
placeholder="비밀번호 확인"
required
aria-describedby="password_help"
>
</div>
<span class="info-msg" id="password_help">
영문+숫자+특수기호 12 이상
</span>
</td>
</tr>
<!-- 이름 -->
<tr>
<th class="h-4">
<label for="user_name">이름</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="info-box">
<input
type="text"
id="user_name"
name="userName"
placeholder="이름 입력"
required
>
</div>
</td>
</tr>
<!-- 이메일 -->
<tr>
<th class="h-4">
<label for="user_email">이메일</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box">
<input
type="text"
id="user_email"
name="userEmail"
class="e-id"
placeholder="이메일 입력"
required
aria-describedby="email_help"
>
<div aria-hidden="true"><span>@</span></div>
<input
type="text"
id="custom_domain"
name="customDomain"
placeholder="직접 입력"
class="custom-domain d-none"
aria-label="이메일 도메인 직접 입력"
>
<select
name="emailDomain"
id="domain_list"
class="domain-list"
required
aria-describedby="email_help"
>
<option value="" hidden disabled selected>선택</option>
<option value="naver.com">naver.com</option>
<option value="gmail.com">gmail.com</option>
<option value="daum.net">daum.net</option>
<option value="nate.com">nate.com</option>
<option value="hotmail.com">hotmail.com</option>
<option value="yahoo.com">yahoo.com</option>
<option value="type">직접입력</option>
</select>
</div>
<span class="info-msg d-none" id="email_help">이메일 도메인을 선택하거나 직접 입력하세요</span>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr>
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer">03:00</span>
<button type="button" class="btn-sm btn-code light" aria-label="인증번호 발송">
인증번호
</button>
</div>
</td>
</tr>
<!-- 휴대전화번호 인증완료 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="complete-msg"><i class="ico-check" aria-hidden="true"></i>인증완료</span>
</div>
</td>
</tr>
<!-- 회사정보 -->
<tr class="company-group">
<th>
<label for="company_name">회사정보</label>
</th>
<td>
<div class="input-box">
<input
type="text"
id="company_name"
name="companyName"
placeholder="회사명 입력"
>
<input
type="text"
id="department_name"
name="departmentName"
placeholder="소속부서 입력"
>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="btn-wrap">
<button type="submit" class="btn-full">
가입하기
</button>
</div>
</form>
<!-- 가입완료 메시지 -->
<div class="messages" style="display: none;" role="alert" aria-live="polite">
<i class="complete" aria-hidden="true"></i>
<span>
<em>이지빔님 환영합니다!</em><br>
회원가입이 완료 되었습니다.
</span>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

262
kngil/skin/pop_join3.php Normal file
View File

@@ -0,0 +1,262 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_join3" role="dialog" aria-labelledby="join_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container join">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="join_title">회원가입</h2>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" name="joinForm" novalidate>
<div class="tbl-wrap">
<span class="info-msg txt-right">*항목은 필수 항목 입니다.</span>
<table>
<tbody>
<!-- 회원 유형 -->
<tr>
<th>
<label for="company_name">회원유형</label>
</th>
<td>
<div class="input-box">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2">
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<!-- 아이디 -->
<tr>
<th>
<label for="user_id">아이디</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
class="user-id"
type="text"
id="user_id"
name="userId"
placeholder="아이디 입력"
required
pattern="[a-zA-Z][a-zA-Z0-9]{3,11}"
aria-describedby="id_help"
>
<button type="button" class="btn-sm" aria-label="아이디 중복 확인">
중복확인
</button>
</div>
<span class="info-msg" id="id_help">
영문+숫자 4~12(영문으로 시작)
</span>
</td>
</tr>
<!-- 비밀번호 -->
<tr>
<th>
<label for="user_password">비밀번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box">
<input
type="password"
id="user_password"
name="userPassword"
placeholder="비밀번호 입력"
required
minlength="8"
pattern="^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*]).{8,}$"
aria-describedby="password_help"
>
<input
type="password"
id="user_password_confirm"
name="userPasswordConfirm"
placeholder="비밀번호 확인"
required
aria-describedby="password_help"
>
</div>
<span class="info-msg" id="password_help">
영문+숫자+특수기호 12 이상
</span>
</td>
</tr>
<!-- 이름 -->
<tr>
<th class="h-4">
<label for="user_name">이름</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="info-box">
<input
type="text"
id="user_name"
name="userName"
placeholder="이름 입력"
required
>
</div>
</td>
</tr>
<!-- 이메일 -->
<tr>
<th class="h-4">
<label for="user_email">이메일</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box">
<input
type="text"
id="user_email"
name="userEmail"
class="e-id"
placeholder="이메일 입력"
required
aria-describedby="email_help"
>
<div aria-hidden="true"><span>@</span></div>
<input
type="text"
id="custom_domain"
name="customDomain"
placeholder="직접 입력"
class="custom-domain d-none"
aria-label="이메일 도메인 직접 입력"
>
<select
name="emailDomain"
id="domain_list"
class="domain-list"
required
aria-describedby="email_help"
>
<option value="" hidden disabled selected>선택</option>
<option value="naver.com">naver.com</option>
<option value="gmail.com">gmail.com</option>
<option value="daum.net">daum.net</option>
<option value="nate.com">nate.com</option>
<option value="hotmail.com">hotmail.com</option>
<option value="yahoo.com">yahoo.com</option>
<option value="type">직접입력</option>
</select>
</div>
<span class="info-msg d-none" id="email_help">이메일 도메인을 선택하거나 직접 입력하세요</span>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer">03:00</span>
<button type="button" class="btn-sm btn-code light" aria-label="인증번호 발송">
인증번호
</button>
</div>
</td>
</tr>
<!-- 휴대전화번호 인증완료 -->
<tr >
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="complete-msg"><i class="ico-check" aria-hidden="true"></i>인증완료</span>
</div>
</td>
</tr>
<!-- 회사정보 -->
<tr class="company-group">
<th>
<label for="company_name">회사정보</label>
</th>
<td>
<div class="input-box">
<input
type="text"
id="company_name"
name="companyName"
placeholder="회사명 입력"
>
<input
type="text"
id="department_name"
name="departmentName"
placeholder="소속부서 입력"
>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="btn-wrap">
<button type="submit" class="btn-full">
가입하기
</button>
</div>
</form>
<!-- 가입완료 메시지 -->
<div class="messages" style="display: none;" role="alert" aria-live="polite">
<i class="complete" aria-hidden="true"></i>
<span>
<em>이지빔님 환영합니다!</em><br>
회원가입이 완료 되었습니다.
</span>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

94
kngil/skin/pop_login.php Normal file
View File

@@ -0,0 +1,94 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_login" role="dialog" aria-labelledby="login_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container login">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="login_title">로그인</h2>
<p class="sub-txt">
KNGIL 로그인 <br class="pc-only">
<em>다운로드 1:1문의 서비스를</em><br class="pc-only" /> 이용하실 있습니다.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<div class="contents-wrap">
<ul class="tab-menu round">
<li class="tab-phone on"><span>휴대폰 인증</span></li>
<li class="tab-id"><span>아이디 로그인</span></li>
</ul>
<div class="tab-content phone">
<form action="" method="post" novalidate>
<div class="form-wrap">
<div class="input-box group">
<i class="phone" aria-hidden="true"></i>
<input type="tel" id="login_phone" name="userPhone" placeholder="휴대폰 번호 (예: 010-1234-5678)" required aria-label="휴대폰 번호">
<span class="timer d-none">03:00</span>
<!-- 재요청 버튼 -->
<button type="button"
class="btn-resend d-none"
id="sms_resend">
재요청
</button>
</div>
<div class="info-box d-none">
<p>
<em>인증 링크를 문자로 발송했습니다</em><br />
인증 문자가 오지 않으면 인증 링크를 재요청 해보세요
</p>
</div>
<div class="btn-wrap">
<button class="btn-full" id="sms_button" type="submit">인증 링크 요청</button>
</div>
<div class="btn-wrap">
<a class="go-signup" href="javascript:agreement();">
<span>회원가입</span><i class="arrow-r" aria-hidden="true"></i>
</a>
</div>
</div>
</form>
</div>
<div class="tab-content id">
<form action="" method="post" novalidate>
<div class="form-wrap">
<div class="input-box group">
<i class="id" aria-hidden="true"></i>
<input type="text" id="login_id" name="userId" placeholder="아이디" required aria-label="아이디">
</div>
<div class="input-box group">
<i class="pw" aria-hidden="true"></i>
<input type="password" id="login_password" name="userPassword" placeholder="비밀번호" required aria-label="비밀번호">
</div>
<div class="btn-wrap">
<button class="btn-full" type="submit">로그인</button>
</div>
<div class="btn-wrap">
<a class="go-signup" href="javascript:agreement();">
<span>회원가입</span>
<i class="arrow-r" aria-hidden="true"></i>
</a>
<!-- 로그인 팝업 이동 -->
<a class="go-login" href="http://172.16.9.44/kngil/skin/popup/callback">
<span>로그인</span>
<i class="arrow-r" aria-hidden="true"></i>
</a>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

83
kngil/skin/pop_login2.php Normal file
View File

@@ -0,0 +1,83 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_login2" role="dialog" aria-labelledby="login_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container login">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="login_title">로그인</h2>
<p class="sub-txt">
KNGIL 로그인 <br class="pc-only">
<em>다운로드 1:1문의 서비스를</em><br class="pc-only" /> 이용하실 있습니다.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<div class="contents-wrap">
<ul class="tab-menu round">
<li class="tab-phone on"><span>휴대폰 인증</span></li>
<li class="tab-id"><span>아이디 로그인</span></li>
</ul>
<div class="tab-content phone">
<form action="" method="post" novalidate>
<div class="form-wrap">
<div class="input-box group">
<i class="phone" aria-hidden="true"></i>
<input type="text" id="login_phone" name="userPhone" placeholder="휴대폰 번호" required aria-label="휴대폰 번호">
<span class="timer">03:00</span>
</div>
<div class="info-box">
<p>
<em>인증 링크를 문자로 발송했습니다</em><br />
인증 문자가 오지 않으면 인증 링크를 재요청 해보세요
</p>
</div>
<div class="btn-wrap">
<button class="btn-full" type="submit">인증 링크 요청</button>
</div>
<div class="btn-wrap">
<a class="go-signup" href="javascript:agreement();">
<span>회원가입</span><i class="arrow-r" aria-hidden="true"></i>
</a>
</div>
</div>
</form>
</div>
<div class="tab-content id">
<form action="" method="post" novalidate>
<div class="form-wrap">
<div class="input-box group">
<i class="id" aria-hidden="true"></i>
<input type="text" id="login_id" name="userId" placeholder="아이디" required aria-label="아이디">
</div>
<div class="input-box group">
<i class="pw" aria-hidden="true"></i>
<input type="password" id="login_password" name="userPassword" placeholder="비밀번호" required aria-label="비밀번호">
</div>
<div class="btn-wrap">
<button class="btn-full" type="submit">로그인</button>
</div>
<div class="btn-wrap">
<a class="go-signup" href="javascript:agreement();">
<span>회원가입</span>
<i class="arrow-r" aria-hidden="true"></i>
</a>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

View File

@@ -0,0 +1,72 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_mypage01" role="dialog" aria-labelledby="mypage01_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage01_title">마이페이지</h2>
<p class="sub-txt">
회원님의 <em>정보 보호</em> <br>
위하여 <em>비밀번호</em> 한번 확인합니다.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body password">
<div class="contents-wrap">
<ul class="tab-menu round">
<li class="tab-phone on"><span>휴대폰 인증</span></li>
<li class="tab-id"><span>비밀번호 인증</span></li>
</ul>
<div class="tab-content phone">
<form action="" method="post" novalidate>
<div class="form-wrap">
<div class="input-box group">
<i class="phone" aria-hidden="true"></i>
<input type="text" id="login_phone" name="userPhone" placeholder="휴대폰 번호" required aria-label="휴대폰 번호">
<span class="timer d-none">03:00</span>
</div>
<div class="info-box d-none">
<p>
<em>인증 링크를 문자로 발송했습니다</em><br>
인증 문자가 오지 않으면 인증 링크를 재요청 해보세요
</p>
</div>
<div class="btn-wrap">
<button class="btn-full" type="submit">인증 링크 요청</button>
</div>
</div>
</form>
</div>
<div class="tab-content id">
<form action="" method="post" novalidate>
<div class="form-wrap">
<div class="input-box group">
<i class="pw" aria-hidden="true"></i>
<input type="password" id="login_password" name="userPassword" placeholder="비밀번호 입력" required aria-label="비밀번호 입력">
</div>
<div class="btn-wrap">
<button class="btn-full" type="submit">확인</button>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

122
kngil/skin/pop_mypage02.php Normal file
View File

@@ -0,0 +1,122 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_mypage02" role="dialog" aria-labelledby="mypage02_title" aria-modal="true" style="display:none;">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage02_title">마이페이지</h2>
<p class="sub-txt">
소중한 <em> 정보</em> <br>
<em>최신</em>으로 관리하세요.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<div class="my-info">
<div class="name">
<span>
<em id="mp_user_nm"></em>
<span class="user-id" id="mp_user_id"></span>
</span>
<button class="btn-sm" onclick="javascript:mypage03();"> 정보 수정</button>
</div>
<ul class="detail">
<li>
<h5><i class="tel"></i>연락처</h5>
<p id="mp_tel"></p>
<p id="mp_email"></p>
</li>
<li>
<h5><i class="company"></i>회사정보</h5>
<p id="mp_co_nm"></p>
<p id="mp_dept_nm"></p>
</li>
<li>
<h5><i class="usage"></i>사용량 (단위:m2)</h5>
<p><span>누적</span><em id="mp_tot_use"></em></p>
<p><span>당년</span><em id="mp_year_use"></em></p>
</li>
</ul>
</div>
<div class="my-history">
<h5>서비스 사용이력</h5>
<div class="board-list">
<table>
<colgroup>
<col style="width: 10%;">
<col style="width: auto;">
<col style="width: 15%;">
<col style="width: 15%;">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>서비스 구분</th>
<th>일자</th>
<th><em>사용량</em>(단위:m2)</th>
</tr>
</thead>
<tbody id="mp_history_body">
<tr>
<td>1</td>
<td class="tit"><a href="">서비스 01</a></td>
<td>24-06-22</td>
<td><em>300</em></td>
</tr>
<tr>
<td>2</td>
<td class="tit"><a href="">서비스 01</a></td>
<td>24-06-23</td>
<td><em>400</em></td>
</tr>
<tr>
<td>3</td>
<td class="tit"><a href="">서비스 01</a></td>
<td>24-06-23</td>
<td><em>300</em></td>
</tr>
<tr>
<td>4</td>
<td class="tit"><a href="">서비스 01</a></td>
<td>24-06-23</td>
<td><em>200</em></td>
</tr>
<tr>
<td>5</td>
<td class="tit"><a href="">서비스 01</a></td>
<td>24-06-23</td>
<td><em>400</em></td>
</tr>
</tbody>
</table>
<div class="pagination">
<button type="button" class="btn-prev"></button>
<ul class="pagination-list">
<li class="on"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
</ul>
<button type="button" class="btn-next"></button>
</div>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

167
kngil/skin/pop_mypage03.php Normal file
View File

@@ -0,0 +1,167 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_mypage03" role="dialog" aria-labelledby="mypage03_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container edit">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage03_title"> 정보 수정</h2>
<p class="sub-txt">
소중한 <em> 정보</em> <br>
<em>최신</em>으로 관리하세요.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" novalidate>
<div class="tbl-wrap">
<table>
<tbody>
<tr class="disabled">
<th>회원유형</th>
<td>
<div class="input-box radio">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked disabled>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2" disabled>
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<tr class="disabled">
<th>아이디</th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" readonly disabled>
</div>
</td>
</tr>
<tr id="row-pw-original">
<th>비밀번호 <span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input id="current_pw" type="password" placeholder="************" required readonly disabled>
<button type="button" class="btn-sm change" id="btnPwChange">비밀번호 변경</button>
</div>
</td>
</tr>
<tr id="row-pw-new">
<th> 비밀번호</th>
<td>
<div class="input-box">
<input
type="password"
placeholder="새 비밀번호 입력"
required
id="new_pw"
>
<input
type="password"
placeholder="새 비밀번호 확인"
required
id="new_pw_confirm"
>
<button
type="button"
class="btn-sm btn-cancel"
id="btnPwCancel"
>
취소
</button>
</div>
<span
class="info-msg d-none"
id="pwPolicyMsg"
>
영문+숫자+특수기호 8 이상
</span>
</td>
</tr>
<tr class="disabled">
<th>이름 </th>
<td>
<div class="input-box">
<input type="text" placeholder="이지빔" readonly disabled>
</div>
</td>
</tr>
<tr>
<th>이메일<span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" class="e-id" required>
<div><span>@</span></div>
<input type="text" id="custom_domain" placeholder="직접 입력" class="d-none domain-domain" required>
<select id="domain_list" class="domain-list" required>
<option value="" hidden disabled>선택</option>
<option value="naver" selected>naver.com</option>
<option value="gmail">gmail.com</option>
<option value="daum">daum.net</option>
<option value="nate">nate.com</option>
<option value="hotmail">hotmail.com</option>
<option value="yahoo">yahoo.com</option>
<option value="type" id="domain_txt">직접입력</option>
</select>
</div>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr>
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer d-none">03:00</span>
<button type="button" class="btn-sm btn-code" aria-label="인증번호 발송">
인증요청
</button>
</div>
</td>
</tr>
<tr class="company-group disabled">
<th>회사정보</th>
<td>
<div class="input-box">
<input type="text" id="company_name" name="companyName" placeholder="(주)BBB" required disabled>
<input type="text" id="department_name" name="departmentName" placeholder="XXX부" required disabled>
</div>
</td>
</tr>
</tbody>
</table>
<div class="btn-wrap">
<button type="button" class="btn-cancel" onclick="javascript:mypage02();">취소</button>
<button type="button" class="btn-full">수정</button>
</div>
<div class="sign-out"><a href=""><i class="ico-signout" aria-hidden="true"></i>회원 탈퇴하기</a></div>
</div>
</form>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

183
kngil/skin/pop_mypage04.php Normal file
View File

@@ -0,0 +1,183 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_mypage04" role="dialog" aria-labelledby="mypage03_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container edit">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage03_title"> 정보 수정</h2>
<p class="sub-txt">
소중한 <em> 정보</em> <br>
<em>최신</em>으로 관리하세요.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" novalidate>
<div class="tbl-wrap">
<table>
<tbody>
<tr class="disabled">
<th>회원유형</th>
<td>
<div class="input-box radio">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked disabled>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2" disabled>
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<tr class="disabled">
<th>아이디</th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" readonly disabled>
</div>
</td>
</tr>
<tr >
<th>비밀번호<span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input type="password" placeholder="************" required>
<button type="button" class="btn-sm btn-cancel">취소</button>
</div>
</td>
</tr>
<tr>
<th> 비밀번호 </th>
<td>
<div class="input-box">
<input type="password" placeholder="새 비밀번호 입력" required>
<input type="password" placeholder="새 비밀번호 확인" required>
<button type="button" class="btn-sm">변경</button>
</div>
<span class="info-msg d-none">영문+숫자+특수기호 8 이상</span>
</td>
</tr>
<tr class="disabled">
<th>이름 </th>
<td>
<div class="input-box">
<input type="text" placeholder="이지빔" readonly disabled>
</div>
</td>
</tr>
<tr>
<th>이메일<span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" class="e-id" required>
<div><span>@</span></div>
<input type="text" id="custom_domain" placeholder="직접 입력" class="d-none domain-domain" required>
<select id="domain_list" class="domain-list" required>
<option value="" hidden disabled>선택</option>
<option value="naver" selected>naver.com</option>
<option value="gmail">gmail.com</option>
<option value="daum">daum.net</option>
<option value="nate">nate.com</option>
<option value="hotmail">hotmail.com</option>
<option value="yahoo">yahoo.com</option>
<option value="type" id="domain_txt">직접입력</option>
</select>
</div>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr>
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer d-none">03:00</span>
<button type="button" class="btn-sm btn-code" aria-label="인증번호 발송">
인증요청
</button>
</div>
</td>
</tr>
<!-- 휴대전화번호 인증완료 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="complete-msg"><i class="ico-check" aria-hidden="true"></i>인증완료</span>
</div>
</td>
</tr>
<!-- 휴대전화번호 변경 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<button class="btn-sm change" type="button">휴대폰 번호 변경</button>
</div>
</td>
</tr>
<tr class="company-group disabled">
<th>회사정보</th>
<td>
<div class="input-box">
<input type="text" id="company_name" name="companyName" placeholder="(주)BBB" required disabled>
<input type="text" id="department_name" name="departmentName" placeholder="XXX부" required disabled>
</div>
</td>
</tr>
</tbody>
</table>
<div class="btn-wrap">
<button type="button" class="btn-cancel">취소</button>
<button type="button" class="btn-full">정보 수정</button>
</div>
<div class="sign-out"><a href=""><i class="ico-signout" aria-hidden="true"></i>회원 탈퇴하기</a></div>
</div>
</form>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

174
kngil/skin/pop_mypage05.php Normal file
View File

@@ -0,0 +1,174 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_mypage05" role="dialog" aria-labelledby="mypage03_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container edit">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage03_title"> 정보 수정</h2>
<p class="sub-txt">
소중한 <em> 정보</em> <br>
<em>최신</em>으로 관리하세요.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" novalidate>
<div class="tbl-wrap">
<table>
<tbody>
<tr class="disabled">
<th>회원유형</th>
<td>
<div class="input-box radio">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked disabled>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2" disabled>
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<tr class="disabled">
<th>아이디</th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" readonly disabled>
</div>
</td>
</tr>
<tr>
<th >비밀번호<span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input type="password" placeholder="************" required>
<button type="button" class="btn-sm change">비밀번호 변경</button>
</div>
</td>
</tr>
<tr class="disabled">
<th >이름 </th>
<td>
<div class="input-box">
<input type="text" placeholder="이지빔" readonly disabled>
</div>
</td>
</tr>
<tr>
<th >이메일<span class="point" aria-label="필수">*</span> </th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" class="e-id" required>
<div><span>@</span></div>
<input type="text" id="custom_domain" placeholder="직접 입력" class="d-none domain-domain" required>
<select id="domain_list" class="domain-list" required>
<option value="" hidden disabled>선택</option>
<option value="naver" selected>naver.com</option>
<option value="gmail">gmail.com</option>
<option value="daum">daum.net</option>
<option value="nate">nate.com</option>
<option value="hotmail">hotmail.com</option>
<option value="yahoo">yahoo.com</option>
<option value="type" id="domain_txt">직접입력</option>
</select>
</div>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr>
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer">03:00</span>
<button type="button" class="btn-sm btn-code light" aria-label="인증번호 발송">
재요청
</button>
</div>
</td>
</tr>
<!-- 휴대전화번호 인증완료 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="complete-msg"><i class="ico-check" aria-hidden="true"></i>인증완료</span>
</div>
</td>
</tr>
<!-- 휴대전화번호 변경 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<button class="btn-sm change" type="button">휴대폰 번호 변경</button>
</div>
</td>
</tr>
<tr class="company-group disabled">
<th>회사정보</th>
<td>
<div class="input-box">
<input type="text" id="company_name" name="companyName" placeholder="(주)BBB" required disabled>
<input type="text" id="department_name" name="departmentName" placeholder="XXX부" required disabled>
</div>
</td>
</tr>
</tbody>
</table>
<div class="btn-wrap">
<button type="button" class="btn-cancel">취소</button>
<button type="button" class="btn-full">정보 수정</button>
</div>
<div class="sign-out"><a href=""><i class="ico-signout" aria-hidden="true"></i>회원 탈퇴하기</a></div>
</div>
</form>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

173
kngil/skin/pop_mypage06.php Normal file
View File

@@ -0,0 +1,173 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_mypage06" role="dialog" aria-labelledby="mypage03_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in mypage">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container edit">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="mypage03_title"> 정보 수정</h2>
<p class="sub-txt">
소중한 <em> 정보</em> <br>
<em>최신</em>으로 관리하세요.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<form action="" method="post" novalidate>
<div class="tbl-wrap">
<table>
<tbody>
<tr class="disabled">
<th>회원유형</th>
<td>
<div class="input-box radio">
<label for="member_type1">
<input type="radio" id="member_type1" name="memberType" value="1" checked disabled>
<span>기업회원</span>
</label>
<label for="member_type2">
<input type="radio" id="member_type2" name="memberType" value="2" disabled>
<span>개인회원</span>
</label>
</div>
</td>
</tr>
<tr class="disabled">
<th>아이디</th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" readonly disabled>
</div>
</td>
</tr>
<tr>
<th >비밀번호<span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input type="password" placeholder="************" required>
<button type="button" class="btn-sm change">비밀번호 변경</button>
</div>
</td>
</tr>
<tr class="disabled">
<th>이름</th>
<td>
<div class="input-box">
<input type="text" placeholder="이지빔" readonly disabled>
</div>
</td>
</tr>
<tr>
<th>이메일<span class="point" aria-label="필수">*</span></th>
<td>
<div class="input-box">
<input type="text" placeholder="A1122" class="e-id" required>
<div><span>@</span></div>
<input type="text" id="custom_domain" placeholder="직접 입력" class="d-none domain-domain" required>
<select id="domain_list" class="domain-list" required>
<option value="" hidden disabled>선택</option>
<option value="naver" selected>naver.com</option>
<option value="gmail">gmail.com</option>
<option value="daum">daum.net</option>
<option value="nate">nate.com</option>
<option value="hotmail">hotmail.com</option>
<option value="yahoo">yahoo.com</option>
<option value="type" id="domain_txt">직접입력</option>
</select>
</div>
</td>
</tr>
<!-- 휴대전화번호 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="timer d-none">03:00</span>
<button type="button" class="btn-sm btn-code" aria-label="인증번호 발송">
인증번호
</button>
</div>
</td>
</tr>
<!-- 휴대전화번호 인증완료 -->
<tr >
<th>
<label for="user_phone">휴대전화번호</label>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<span class="complete-msg"><i class="ico-check" aria-hidden="true"></i>인증완료</span>
</div>
</td>
</tr>
<!-- 휴대전화번호 변경 -->
<tr class="d-none">
<th>
<label for="user_phone">휴대전화번호</label>
<span class="point" aria-label="필수">*</span>
</th>
<td>
<div class="input-box group">
<input
type="tel"
id="user_phone"
name="userPhone"
placeholder="휴대폰 번호"
required
pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
>
<button class="btn-sm change" type="button">휴대폰 번호 변경</button>
</div>
</td>
</tr>
<tr class="company-group disabled">
<th>회사정보</th>
<td>
<div class="input-box">
<input type="text" id="company_name" name="companyName" placeholder="(주)BBB" required disabled>
<input type="text" id="department_name" name="departmentName" placeholder="XXX부" required disabled>
</div>
</td>
</tr>
</tbody>
</table>
<div class="btn-wrap">
<button type="button" class="btn-cancel">취소</button>
<button type="button" class="btn-full">정보 수정</button>
</div>
<div class="sign-out"><a href=""><i class="ico-signout" aria-hidden="true"></i>회원 탈퇴하기</a></div>
</div>
</form>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

View File

@@ -0,0 +1,42 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_password" role="dialog" aria-labelledby="password_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container login">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="password_title">로그인</h2>
<p class="sub-txt">
KNGIL 로그인 <br class="pc-only">
<em>다운로드 1:1문의 서비스를</em><br class="pc-only" /> 이용하실 있습니다.
</p>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<div class="form-wrap">
<div class="messages">
<div class="msg-box">
<div class="ico-pw"><img src="/kngil/img/ico/ico_password.svg" alt=""></div>
<p>관리자에 의해 <em>임시 발급된 비밀번호</em> 입니다.</p>
<p>보안을 위해 <em> 비밀번호</em> 변경해 주세요.</p>
</div>
<div class="btn-wrap">
<button class="btn-cancel" type="button">나중에 변경</button>
<button class="btn-full" type="button">지금 변경</button>
</div>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

544
kngil/skin/pop_privacy.php Normal file
View File

@@ -0,0 +1,544 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_privacy" role="dialog" aria-labelledby="privacy-title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in privacy">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container">
<div class="pop-contents">
<ul class="tab-menu">
<li class="tab-privacy on"><span>개인정보 보호정책</span></li>
<li class="tab-agreement"><span>이용약관</span></li>
</ul>
<div class="tab-content pri">
<ul class="list-1">
<li><span class="tit">제1조. 목적</span>
<ul class="list-2" maker="1">
<li>바론컨설턴트(이하 "회사") KNGIL 서비스(이하 "서비스") 이용하는 고객(이하 "이용자")<br>
개인정보를 보호하고, 「개인정보 보호법」에 따라 책임과 의무를 다하기 위해 개인정보처리방침을<br>
마련했습니다. 방침은 이용자가 제공한 개인정보가 어떻게 수집, 이용, 보관, 보호되는지를 설명합니다.</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제2조. 개인정보의 처리목적</span>
<ul class="list-2">
<li>회사는 다음의 목적을 위해 개인정보를 처리합니다.<br>
처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 <br>
「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 필요한 조치를 이행할 예정입니다.<br>
<ul class="list-3">
<li>본인확인: 회원가입 관리를 위한 본인 확인, 전화 또는 이메일을 통한 연락</li>
<li>서비스 제공: 각종 통보 서비스 제공을 위한 업무 처리</li>
<li>제품소개서 다운로드: 설명자료 전달</li>
<li>상담 데모 신청: 상담 제공 데모 제공, 계약 처리자 정보 수집</li>
<li>행사 참가 신청: 참석 안내 세미나/설명회/교육 제공</li>
<li>보안가이드 제공: 안내자료 전달</li>
<li>기술지원 문의: 서비스 사용 지원</li>
<li>서비스 개선 의견 접수: 서비스 품질 개선</li>
<li>마케팅 활동: 동의한 고객에 한해 뉴스레터 매거진 발송</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제3조. 개인정보의 처리 보유 기간</span>
<ul class="list-2">
<li>회사는 법령에 따른 개인정보 보유 이용기간 또는 정보주체로부터 개인정보를 수집 동의받은 개인정보 보유 이용기간 내에서
개인정보를 처리 보유합니다.</li>
<li>각각의 개인정보 처리 보유 기간은 다음과 같습니다:
<ul class="list-3">
<li>회원정보: 회원가입일부터 회원탈퇴 1년까지</li>
<li>홍보, 상담, 계약용 개인정보: 2</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제4조. 개인정보의 제3자 제공</span>
<ul class="list-2">
<li>회사는 정보주체의 개인정보를 제2조에서 명시한 범위 내에서만 처리하며, 정보 주체의 동의, 법률의 특별한 규정 「개인정보
보호법」 제17조
제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.</li>
<li>회사는 다음과 같이 개인정보를 제3자에게 제공하고 있습니다:
<ul class="list-3">
<li>제공받는 : 수사기관 유관기관, 피신고업체</li>
<li>이용 목적: 개인정보 침해 민원 처리</li>
<li>제공하는 개인정보 항목: 성명, 연락처, 이메일</li>
<li>보유 이용기간: 법령에서 정한 보존기간 제공목적 달성 파기</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제5조. 개인정보 처리 위탁</span>
<ul class="list-2">
<li>회사는 개인정보 처리업무를 외부 업체에 위탁하지 않으며, 자체적으로 처리하고 있습니다.</li>
<li>회사가 특정 업무(: 채용 업무) 외부 업체에 위탁할 경우, <br>개인정보 처리방침 시행 회사 홈페이지에서 공지한
정보주체의 동의를 받은 위탁합니다.</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제6조. 정보주체의 권리·의무 행사 방법</span>
<ul class="list-2">
<li>정보주체는 회사에 대해 언제든지 개인정보 열람, 정정, 삭제, 처리정지 요구 등의 권리를 행사할 있습니다.</li>
<li>권리 행사는 다음과 같은 방법으로 있습니다:
<ul class="list-3">
<li>서면: 회사 주소로 서면 제출</li>
<li>전자우편: 회사 이메일로 요청</li>
<li>모사전송(FAX): 회사 FAX로 요청</li>
</ul>
</li><li>권리 행사는 정보주체의 법정대리인이나 위임을 받은 자를 통해 대리로도 가능합니다. 경우 “개인정보 처리 방법에 관한 고시”
별지 제11호 서식에 따른 위임장을 제출해야 합니다.</li>
<li>개인정보 열람 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 따라 제한될 있습니다.</li>
<li>개인정보의 정정 삭제 요구는 다른 법령에 따라 수집된 개인정보인 경우 제한될 있습니다.</li>
<li>회사는 권리 행사를 요청한 자가 본인 또는 정당한 대리인인지를 확인합니다.</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제7조. 처리하는 개인정보의 항목</span>
<ul class="list-2">
<li>회사는 다음의 개인정보 항목을 처리합니다:</li>
<li>수집 항목
<ul class="list-3">
<li>필수 항목: 성명, 휴대전화번호, 이메일</li>
<li>선택 항목: 회사전화번호, 문의사항</li>
<li>수집 방법: 홈페이지, 전화, 이메일을 통해 수집</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제8조. 개인정보의 파기</span>
<ul class="list-2">
<li>회사는 개인정보 보유 기간의 경과, 처리 목적 달성 개인정보가 불필요하게 되었을 지체 없이 해당 개인정보를 파기합니다.
</li>
<li>정보주체로부터 동의받은 개인정보 보유 기간이 경과하거나 처리 목적이 달성된 경우에도 다른 법령에 따라 개인정보를 계속 보존해야
경우에는, 해당 개인정보를 별도의 데이터베이스(DB) 옮기거나 보관 장소를 달리하여 보존합니다.</li>
<li>개인정보 파기의 절차 방법은 다음과 같습니다:
<ul class="list-3">
<li>파기 절차: 회사는 파기 사유가 발생한 개인정보를 선정하고, 개인정보 보호책임자의 승인을 받아 개인정보를
파기합니다.</li>
<li>파기 방법: 전자적 파일 형태로 기록된 개인정보는 복구할 없도록 기술적 방법을 사용해 삭제하며, 종이 문서에
기록된 개인정보는 분쇄기로
분쇄하거나 소각하여 파기합니다.</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제9조. 개인정보의 안전성 확보 조치</span>
<ul class="list-2">
<li>회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취합니다:
<ul class="list-3">
<li>관리적 조치: 내부관리계획 수립·시행, 정기적 직원 교육</li>
<li>기술적 조치: 개인정보처리시스템 접근 권한 관리, 접근통제시스템 설치, 고유식별정보 암호화, 보안 프로그램 설치
</li>
<li>물리적 조치: 전산실 자료보관실 접근 통제</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제10조. 개인정보 자동 수집 장치의 설치·운영 거부에 관한 사항</span>
<ul class="list-2">
<li>회사는 쿠키(Cookie) 사용하지 않습니다. 쿠키는 이용자의 이용 정보를 저장하고 수시로 불러오는 작은 파일로,
KNGIL 서비스에서는 쿠키를 사용하지 않습니다.
</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제11조. 개인정보 보호책임자</span>
<ul class="list-2">
<li>회사는 개인정보 처리에 관한 업무를 총괄하여 책임지고, 개인정보 처리와 관련된 정보주체의 불만처리 피해구제를 위해 개인정보
보호책임자를 지정하고 있습니다.</li>
<li>개인정보 보호책임자:
<ul class="list-3">
<li>성명: 염승호</li>
<li>직책: 수석연구원</li>
<li>연락처: 02-2141-7448</li>
<li>팩스번호: 02-2141-7599</li>
<li>이메일: b23008@baroncs.co.kr</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제12조. 개인정보 열람청구</span>
<ul class="list-2">
<li>정보주체는 「개인정보 보호법」 제35조에 따른 개인정보 열람 청구를 아래 부서에 있습니다. 회사는 정보주체의 개인정보
열람청구가 신속하게 처리되도록 노력하겠습니다.</li>
<li>개인정보 열람청구 접수·처리 부서:
<ul class="list-3">
<li>부서명: 총괄기획실</li>
<li>담당자: 권혁진</li>
<li>연락처: 02-2141-7465</li>
<li>팩스번호: 02-2141-7599</li>
<li>이메일: baroncs@baroncs.co.kr</li>
</ul>
</li></ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제13조. 권익침해 구제방법</span>
<ul class="list-2">
<li>정보주체는 개인정보 침해로 인한 구제를 위해 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁 해결이나 상담을
신청할 있습니다.
<ul class="list-3">
<li>개인정보분쟁조정위원회: (국번없이) 1833-6972 (www.kopico.go.kr)</li>
<li>개인정보침해신고센터: (국번없이) 118 (privacy.kisa.or.kr)</li>
<li>대검찰청: (국번없이) 1301 (www.spo.go.kr)</li>
<li>팩스번호: 02-408-1927</li>
<li>경찰청: (국번없이) 182 (www.police.go.kr)</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제14조. 개인정보 처리방침의 변경</span>
<ul class="list-2">
<li> 개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용의 추가, 삭제 수정이 있을 , 개정 최소 7 전에
홈페이지를 통해 사전
공지합니다.</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">부칙</span>
<ul class="list-2">
<li> 1 (시행일자)
<ul class="list-3">
<li> 개인정보처리방침은 2024 10 1일부터 시행됩니다.</li>
</ul>
</li><li>제2조 (개정 고지의 의무)
<ul class="list-3">
<li>회사는 개인정보처리방침을 변경하는 경우, 변경사항을 시행일자 7 전부터 서비스 공지사항 페이지를 통해 고지할 것입니다.
다만, 이용자의 권리나
의무에 중대한 변경이 발생하는 경우에는 시행일자 30 전부터 고지합니다.</li>
</ul>
</li><li>제3조 (유효성)
<ul class="list-3">
<li> 개인정보처리방침의 일부 조항이 법적 또는 기타 사유로 인해 무효화되거나 시행할 없는 경우, 나머지 조항들은 계속해서 유효합니다.
무효화된 조항은
관련 법령에 부합하는 방식으로 수정되어 효력을 지속합니다.</li>
</ul>
</li><li>제4조 (변경 통지의 방법)<br>
회사는 개인정보처리방침의 변경 , 다음의 방법으로 이용자에게 고지합니다:
<ul class="list-3">
<li>서비스 초기화면 또는 팝업 공지</li>
<li>이메일 발송</li>
<li>회사 홈페이지 공지사항</li>
</ul>
</li><li>제5조 (비회원의 개인정보 보호)
<ul class="list-3">
<li>회사는 비회원의 개인정보도 회원과 동일한 수준으로 보호합니다. 비회원이 개인정보 제공을 거부할 경우 일부 서비스 이용에 제한이 있을
있습니다.</li>
</ul>
</li><li>제6조 (14 미만 아동의 개인정보 보호)
<ul class="list-3">
<li>회사는 14 미만 아동의 개인정보를 수집하지 않습니다. 만일 14 미만 아동의 개인정보가 수집된 경우, 법정 대리인의 동의를 받아야
하며, 법정
대리인의 동의 없이 수집된 경우 이를 지체 없이 파기합니다.</li>
</ul>
</li><li>제7조 (개인정보의 국외 이전)
<ul class="list-3">
<li>회사는 이용자의 개인정보를 국외로 이전하지 않으며, 향후 필요한 경우, 사전에 이용자의 동의를 받습니다.</li>
</ul>
</li><li>제8조 (기타)
<ul class="list-3">
<li> 방침에 명시되지 않은 사항은 회사의 내부 방침과 관련 법령에 따릅니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="tab-content agr">
<ul class="list-1">
<li><span class="tit">제1장 총칙</span>
<ul class="list-2" maker="1">
<li>제1조 (목적)
<ul class="list-3">
<li> 약관은 바론컨설턴트(이하 "회사" 합니다) 제공하는 KNGIL 소프트웨어(이하 "서비스" 합니다) 이용함에
있어 회사와 이용자 간의 권리,
의무 책임사항과 기타 필요한 사항을 정하는 것을 목적으로 합니다.</li>
</ul>
</li><li>제2조 (용어의 정의)<br>
약관에서 사용하는 용어의 정의는 다음과 같습니다:
<ul class="list-3">
<li>“서비스”란 회사가 제공하는 소프트웨어 관련 제반 서비스를 의미합니다.</li>
<li>“이용자”란 회사의 서비스에 접속하여 약관에 따라 회사가 제공하는 서비스를 이용하는 회원 비회원을 말합니다.
</li>
<li>“회원”이란 약관에 동의하고 회사와 이용계약을 체결한 자를 의미합니다.</li>
<li>“비회원”이란 회원가입을 하지 않고 회사가 제공하는 일부 서비스를 이용하는 자를 말합니다.</li>
</ul>
</li><li>제3조 (약관의 효력 변경)<br>
약관에서 사용하는 용어의 정의는 다음과 같습니다:
<ul class="list-3">
<li> 약관은 이용자가 약관에 동의하고, 회사가 이에 대한 승낙을 완료함으로써 효력이 발생합니다.</li>
<li>회사는 필요한 경우 약관을 변경할 있으며, 변경된 약관은 서비스 화면에 공지된 효력이 발생합니다.
</li>
</ul>
</li><li>제4조 (약관 준칙)
<ul class="list-3">
<li> 약관에 명시되지 않은 사항에 대해서는 대한민국의 관련 법령과 상관습에 따릅니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제2장 서비스 이용계약</span>
<ul class="list-2" maker="1">
<li>제5조 (이용계약의 성립)
<ul class="list-3">
<li>이용계약은 이용자가 약관의 내용에 동의하고, 회사가 제공하는 소정의 회원가입 신청서를 작성하여 가입을 완료한 ,
회사가 이를 승인함으로써 성립합니다.</li>
</ul>
</li><li>제6조 (이용계약의 유보와 거절)<br>
회사는 다음 호에 해당하는 경우 이용계약의 성립을 유보하거나 거절할 있습니다:
<ul class="list-3">
<li>신청서의 내용이 허위로 판명된 경우</li>
<li>서비스 제공이 기술적으로 어려운 경우</li>
</ul>
</li><li>제7조 (계약사항의 변경)<br>
<ul class="list-3">
<li>회원은 개인정보 관리 메뉴를 통해 언제든지 자신의 정보를 열람하고 수정할 있습니다. 회원의 정보가 변경된 경우
즉시 수정해야 하며, 수정하지 않아
발생하는 문제의 책임은 회원에게 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제3장 개인정보 보호</span>
<ul class="list-2" maker="1">
<li>제8조 (개인정보 보호의 원칙)
<ul class="list-3">
<li>회원의 개인정보는 관련 법령에 따라 보호됩니다.</li>
<li>회사는 개인정보 보호와 관련된 세부 사항을 별도로 마련한 개인정보처리방침에 따라 관리하며, 이용자는 언제든지 해당
방침을 통해 개인정보 관리에 대한
자세한 내용을 확인할 있습니다.</li>
</ul>
</li><li>제9조 (개인정보처리방침 준수)
<ul class="list-3">
<li>회사는 개인정보 보호와 관련된 구체적인 사항을 개인정보처리방침에 따라 관리합니다.</li>
<li>개인정보의 수집, 이용, 제공, 보관, 보호 등에 관한 사항은 회사의 개인정보처리방침을 따르며, 이용자는 회사
웹사이트에서 이를 확인할
있습니다.</li>
<li>회사는 개인정보 보호를 위해 최선을 다하며, 관련 법령에 따라 이용자의 개인정보를 안전하게 관리합니다.</li>
</ul>
</li><li>제10조 (14 미만 아동의 개인정보 보호)<br>
<ul class="list-3">
<li>회사는 14 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다.</li>
<li>법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 있으며, 회사는 이를 신속하게 처리합니다.</li>
<li>14 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제4장 서비스 제공 이용</span>
<ul class="list-2" maker="1">
<li>제11조 (서비스 제공)
<ul class="list-3">
<li>회사는 회원의 이용 신청을 승인한 때부터 서비스를 개시합니다. 서비스 이용은 연중무휴 24시간을 원칙으로 합니다.
</li>
</ul>
</li><li>제12조 (서비스의 변경 중단)
<ul class="list-3">
<li>회사는 서비스 제공이 어려운 경우 사전 고지 서비스를 변경하거나 중단할 있습니다.</li>
</ul>
</li><li>제10조 (14 미만 아동의 개인정보 보호)<br>
<ul class="list-3">
<li>회사는 14 미만 아동의 개인정보를 수집할 경우, 반드시 법정대리인의 동의를 받아야 합니다.</li>
<li>법정대리인은 아동의 개인정보 열람, 수정, 삭제를 요청할 있으며, 회사는 이를 신속하게 처리합니다.</li>
<li>14 미만 아동의 개인정보 보호와 관련된 구체적인 사항은 개인정보처리방침에 명시되어 있습니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제5장 정보 제공 광고</span>
<ul class="list-2" maker="1">
<li>제13조 (정보 제공 광고)
<ul class="list-3">
<li>회사는 서비스 이용 필요하다고 인정되는 정보 광고를 제공할 있습니다.</li>
<li>회원은 원치 않는 정보를 수신 거부할 있습니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제6장 게시물 관리</span>
<ul class="list-2" maker="1">
<li>제14조 (게시물의 관리)
<ul class="list-3">
<li>회사는 회원이 게시한 내용이 불법적이거나 약관에 위배될 경우 이를 삭제할 있습니다.</li>
</ul>
</li><li>제15조 (게시물의 저작권)
<ul class="list-3">
<li>게시물의 저작권은 회원에게 있으며, 회사는 이를 서비스 홍보 개선 목적으로 사용할 있습니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제7장 계약 해지 이용 제한</span>
<ul class="list-2" maker="1">
<li>제16조 (계약 해지)
<ul class="list-3">
<li>회원은 언제든지 계약 해지를 요청할 있으며, 회사는 신속하게 처리합니다.</li>
</ul>
</li><li>제17조 (이용 제한)
<ul class="list-3">
<li>회사는 회원이 약관을 위반할 경우 서비스 이용을 제한할 있습니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제8장 손해 배상 면책 조항</span>
<ul class="list-2" maker="1">
<li>제18조 (손해 배상)
<ul class="list-3">
<li>회사는 무료로 제공되는 서비스와 관련하여 회원에게 발생한 손해에 대해 책임을 지지 않습니다.</li>
</ul>
</li><li>제19조 (면책 조항)
<ul class="list-3">
<li>회사는 천재지변 불가항력적인 사유로 인해 서비스를 제공하지 못하는 경우 책임을 지지 않습니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제9장 유료 서비스</span>
<ul class="list-2" maker="1">
<li>제20조 (유료 서비스의 이용)
<ul class="list-3">
<li>회사는 회원에게 특정 서비스에 대해 유료로 제공할 있습니다.</li>
<li>유료 서비스의 이용 요금, 결제 방식, 환불 절차 등에 대한 상세 내용은 서비스 안내 페이지와 결제 화면에
명시합니다.</li>
<li>유료 서비스 이용 요금은 회사가 정한 결제 방식에 따라 결제됩니다. 회원은 신용카드, 계좌이체, 휴대전화 결제
회사가 제공하는 다양한 결제
방식을 통해 요금을 납부할 있습니다.</li>
<li>유료 서비스의 이용 요금은 선불 결제를 원칙으로 하며, 이용 기간 서비스 중지 해지 남은 이용 기간에
대한 환불은 회사의 환불 정책에
따라 처리됩니다.</li>
<li>회사는 회원의 유료 서비스 이용과 관련하여 발생한 문제에 대해 최선을 다해 해결하도록 노력합니다. 다만, 회사의
고의 또는 중대한 과실이 없는
회원이 유료 서비스 이용 입은 손해에 대해서는 책임을 지지 않습니다</li>
</ul>
</li><li>21 (환불 정책)
<ul class="list-3">
<li>회원은 결제 7 이내에 서비스 이용을 시작하지 않은 경우, 요금 전액을 환불받을 있습니다.</li>
<li>유료 서비스 이용 부득이한 사유로 서비스가 중지된 경우, 회사는 이용하지 않은 부분에 대해 환불 절차를
밟습니다.</li>
<li>회원의 귀책사유로 인해 서비스 이용이 중지된 경우, 환불이 불가능합니다.</li>
<li>환불은 회원이 지정한 계좌로 환불 절차를 거치며, 환불 요청 7 이내에 처리됩니다.</li>
</ul>
</li><li>제22조 (유료 서비스의 중지 해지)
<ul class="list-3">
<li>회원이 유료 서비스를 해지하고자 하는 경우, 회사의 고객 지원 센터에 해지 신청을 해야 합니다.</li>
<li>회사는 회원이 약관을 위반하거나 부정한 방법으로 유료 서비스를 이용한 경우, 유료 서비스 이용을 즉시 중지하고
계약을 해지할 있습니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">제10장 양도 금지</span>
<ul class="list-2" maker="1">
<li>제23조 (양도 금지)
<ul class="list-3">
<li>회원은 서비스 이용권한, 기타 이용계약상의 지위를 제3자에게 양도, 증여할 없으며, 이를 담보로 제공할
없습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="list-1">
<li><span class="tit">제11장 관할 법원</span>
<ul class="list-2" maker="1">
<li>제24조 (분쟁 해결)
<ul class="list-3">
<li>서비스 이용과 관련하여 분쟁이 발생한 경우, 회사와 회원은 성실히 협의하여 해결합니다.</li>
</ul>
</li><li>제25조 (관할 법원)
<ul class="list-3">
<li> 약관에 따른 분쟁은 서울중앙지방법원을 관할 법원으로 합니다.</li>
</ul>
</li>
</ul>
</li></ul>
<ul class="list-1">
<li><span class="tit">부칙</span>
<ul class="list-2" maker="1">
<li> 약관은 2024 10 1일부터 시행됩니다.
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

143
kngil/skin/pop_search.php Normal file
View File

@@ -0,0 +1,143 @@
<!-- popup_wrap -->
<div class="popup-wrap" id="pop_search" role="dialog" aria-labelledby="search_title" aria-modal="true">
<!-- popup_in -->
<div class="popup-in member">
<button class="btn-close" type="button" aria-label="팝업 닫기">
<img src="/kngil/img/ico/ico_close.svg" alt="닫기">
</button>
<!-- popup_container -->
<div class="popup-container search">
<!-- pop_header -->
<div class="pop-header">
<h2 class="tit" id="search_title">아이디 찾기 / <br> 비밀번호 변경</h2>
</div>
<!-- //pop_header -->
<!-- pop_body -->
<div class="pop-body">
<div class="contents-wrap">
<ul class="tab-menu">
<li class="tab-id on"><span>아이디 찾기</span></li>
<li class="tab-pw"><span>비밀번호 찾기</span></li>
</ul>
<div class="tab-content id">
<div class="radio-wrap">
<label><input type="radio" class="find-ph on" checked> 휴대전화 번호로 찾기</label>
<label><input type="radio" class="find-email"> 이메일 주소로 찾기</label>
</div>
<div class="form-wrap">
<table class="ph">
<tbody>
<tr>
<th>이름</th>
<td>
<div class="input-box">
<input type="text" placeholder="이름 입력" required>
</div>
</td>
</tr>
<tr>
<th>휴대전화번호</th>
<td>
<div class="input-box">
<input type="text" placeholder="휴대전화번호 입력" required>
</div>
</td>
</tr>
</tbody>
</table>
<table class="email hidden">
<tbody>
<tr>
<th>이름</th>
<td>
<div class="input-box">
<input type="text" placeholder="이름 입력" required>
</div>
</td>
</tr>
<tr>
<th>이메일</th>
<td>
<div class="input-box">
<input type="text" placeholder="이메일 입력" class="e-id" required>
<div><span>@</span></div>
<input type="text" id="custom_domain" class="domain-domain d-none" placeholder="직접 입력" required>
<select id="domain_list" class="domain-list" required>
<option value="" hidden disabled selected>선택</option>
<option value="naver">naver.com</option>
<option value="gmail">gmail.com</option>
<option value="daum">daum.net</option>
<option value="nate">nate.com</option>
<option value="hotmail">hotmail.com</option>
<option value="yahoo">yahoo.com</option>
<option value="type" id="domain_txt">직접입력</option>
</select>
</div>
</td>
</tr>
</tbody>
</table>
<div class="btn-wrap">
<button class="btn-full" type="button">확인</button>
</div>
<div class="inquiry">계정이 기억나지 않을 경우 <em>baroncs@baroncs.co.kr</em> 문의하시기 바랍니다.</div>
</div>
</div>
<div class="tab-content pw">
<div class="form-wrap">
<table>
<tbody>
<tr>
<th>아이디</th>
<td>
<div class="input-box">
<input type="text" placeholder="아이디 입력" required>
</div>
</td>
</tr>
<tr>
<th >이메일</th>
<td>
<div class="input-box">
<input type="text" placeholder="이메일 입력" class="e-id" required>
<div><span>@</span></div>
<input type="text" id="custom_domain" placeholder="직접 입력" class="d-none domain-domain" required>
<select id="domain_list" class="domain-list" required>
<option value="" hidden disabled selected>선택</option>
<option value="naver">naver.com</option>
<option value="gmail">gmail.com</option>
<option value="daum">daum.net</option>
<option value="nate">nate.com</option>
<option value="hotmail">hotmail.com</option>
<option value="yahoo">yahoo.com</option>
<option value="type" id="domain_txt">직접입력</option>
</select>
</div>
</td>
</tr>
</tbody>
</table>
<div class="info-box">
<p>아이디와 이메일 일치시에 비밀번호는<br> <em>등록된 휴대폰 번호</em> 변경됩니다.</p>
</div>
<div class="btn-wrap">
<button class="btn-full" type="button">확인</button>
</div>
<div class="inquiry">계정이 기억나지 않을 경우 <em>baroncs@baroncs.co.kr</em> 문의하시기 바랍니다.</div>
</div>
</div>
<div class="messages pw hidden">
<i class="send"></i>
<span><em>baroncs@baroncs.co.kr</em> <br>임시 비밀번호를 전송하였습니다.</span>
</div>
</div>
</div>
<!-- //pop_body -->
</div>
<!-- //popup_container -->
</div>
<!-- //popup_in -->
</div>
<!-- //popup_wrap -->

View File

@@ -0,0 +1,50 @@
<?php
// 슈퍼관리자 권한 체크
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>상품등록</title>
<link rel="stylesheet" href="/css/common.css">
<link rel="stylesheet" href="/css/adm_style.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vitmalina/w2ui@master/dist/w2ui.min.css">
</head>
<body>
<div class="product-wrap">
<!-- 타이틀 -->
<div class="product-header">
상품등록
<span class="btn-close" onclick="window.close()">X</span>
</div>
<!-- 버튼 영역 -->
<div class="product-toolbar">
<button id="btnAdd">+</button>
<button id="btnRemove">-</button>
<button id="btnSave">저장</button>
</div>
<!-- Grid -->
<div id="productGrid" style="height:260px;"></div>
</div>
<script type="module">
import { createProductGrid, addProductRow, removeProductRow, saveProducts }
from '/js/adm_index.js'
const grid = createProductGrid('#productGrid')
document.getElementById('btnAdd').onclick = () => addProductRow()
document.getElementById('btnRemove').onclick = () => removeProductRow()
document.getElementById('btnSave').onclick = () => saveProducts()
</script>
</body>
</html>

View File

@@ -0,0 +1,614 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<?php include __DIR__ . "/_head.php"; ?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Q&A 상세보기</title>
<link rel="stylesheet" href="/kngil/css/qa/font-awesome.min.css?ver=2303229">
<!-- 디자인팀 작성 -->
<script src="/kngil/js/lib/jquery-3.6.1.min.js" type="text/javascript"></script>
<script src="/kngil/js/qa/jquery.mousewheel.min.js" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
</head>
<body>
<div class="wrap">
<?php
include __DIR__ . "/_header.php";
if (!$isLogin) {
echo "<script>
alert('로그인 후 문의 등록이 가능합니다.');
location.href = '/kngil/skin/qa_list.skin.php';
</script>";
exit;
}
$isLoggedIn = !empty($_SESSION['login']);
?>
<?php
include __DIR__ . "/pop_login.php";
include __DIR__ . "/pop_join.php";
include __DIR__ . "/pop_agreement.php";
include __DIR__ . "/pop_mypage01.php";
include __DIR__ . "/pop_mypage02.php";
include __DIR__ . "/pop_mypage03.php";
include __DIR__ . "/pop_password.php";
include __DIR__ . "/pop_privacy.php";
include __DIR__ . "/pop_search.php";
?>
<div class="container faq">
<section class="sub-header">
<div class="page-title">
<h2 data-aos="fade-down" data-aos-duration="1000">Q&A</h2>
<p class="sub-txt">KNGIL 관련 문의하기</p>
</div>
<ul class="sub-tab">
<li><a href="/kngil/skin/faq_list.skin.php">자주하는 질문(FAQ)</a></li>
<li class="on"><a href="/kngil/bbs/qa_list.php">문의하기(Q&A)</a></li>
<li><a href="https://939.co.kr/saman/" target="_blank">원격지원</a></li>
</ul>
</section>
<section class="sub-content">
<h3 class="sub-tit">문의하기(Q&A)</h3>
<article class="qa-detail">
<div class="qa-view">
<div class="qa-view-header">
<div class="title-area">
<!-- 왼쪽: 카테고리 + 제목 -->
<div class="title-left">
<span class="cate"><?=htmlspecialchars($post['category_label'])?></span>
<span class="title"><?=htmlspecialchars($post['title'])?></span>
</div>
<!-- 오른쪽: 상태 -->
<div class="title-right">
<?php if ($isSuperAdmin): ?>
<form method="post" action="/kngil/bbs/qa_status.php">
<input type="hidden" name="post_id" value="<?= $post['post_id'] ?>">
<select name="status" onchange="this.form.submit()" class="status-select status-<?= htmlspecialchars($post['stat_bc']) ?>">
<option value="new" <?= $post['stat_bc']==='new'?'selected':'' ?>>문의접수</option>
<option value="review" <?= $post['stat_bc']==='review'?'selected':'' ?>>문의검토</option>
<option value="deep" <?= $post['stat_bc']==='deep'?'selected':'' ?>>정밀검토</option>
<option value="patch" <?= $post['stat_bc']==='patch'?'selected':'' ?>>패치예정</option>
<option value="done" <?= $post['stat_bc']==='done'?'selected':'' ?>>답변완료</option>
</select>
</form>
<?php else: ?>
<div class="status"><?= htmlspecialchars($post['status_label']) ?></div>
<?php endif; ?>
</div>
</div>
<div class="user-info">
<div class="user-item">
<span>
<i class="fa fa-clock-o" aria-hidden="true"></i>
<?=htmlspecialchars($post['cdt_dt'])?>
</span>
</div>
<div class="user-item">
<!-- 글번호 -->
<span class="post">
<i class="fa fa-hashtag" aria-hidden="true"></i>
<?= htmlspecialchars($post['post_id']) ?>
</span>
<?php if ($post['category'] === 'notice'): ?>
<!-- ✅ 공지사항이면 "관리자"만 표시 -->
<span>
<i class="fa fa-user" aria-hidden="true"></i>
관리자
</span>
<?php else: ?>
<!-- 작성자 이메일 -->
<span>
<i class="fa fa-envelope-o" aria-hidden="true"></i>
<?= htmlspecialchars($post['email']) ?>
</span>
<!-- 회사 -->
<span>
<i class="fa fa-building-o" aria-hidden="true"></i>
<?= htmlspecialchars($post['co_nm'] ?? '') ?>
</span>
<!-- 부서 -->
<?php if (!empty($post['dept_nm'])): ?>
<span>
<i class="fa fa-sitemap" aria-hidden="true"></i>
<?= htmlspecialchars($post['dept_nm']) ?>
</span>
<?php endif; ?>
<!-- 작성자 이름 -->
<!-- <span>
<i class="fa fa-user" aria-hidden="true"></i>
<?= htmlspecialchars($post['display_name']) ?>
</span> -->
<!-- 관리자 전용 -->
<?php if ($isSuperAdmin): ?>
<?php if (!empty($post['tel_no'])): ?>
<span>
<i class="fa fa-phone" aria-hidden="true"></i>
<?= htmlspecialchars($post['tel_no']) ?>
</span>
<?php endif; ?>
<span>
<i class="fa fa-key" aria-hidden="true"></i>
Q&A : <?= htmlspecialchars($post['post_id']) ?>
</span>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
</div>
<div class="content">
<?= $post['content'] ?>
</div>
</div>
<!-- 첨부파일 -->
<?php if (!empty($attachments)): ?>
<div class="attachments" style="margin-top:20px;">
<h3>첨부파일</h3>
<ul>
<?php foreach ($attachments as $file): ?>
<li>
<?php if (!empty($_SESSION['user']['userId'])): ?>
<!-- ✅ 로그인한 경우: 다운로드 가능 -->
<a href="<?= htmlspecialchars($file['save_path']) ?>" download>
<?= htmlspecialchars($file['ori_name']) ?>
</a>
<?php else: ?>
<!-- 🚫 비회원: 이름만 표시 (다운로드 막음) -->
<?= htmlspecialchars($file['ori_name']) ?> <span style="color:#888;"></span>
<?php endif; ?>
<small>
(<?= round($file['file_size'] / 1024, 1) ?> KB,
<?= htmlspecialchars(substr($file['uploaded_at'],0,16)) ?>)
</small>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
</article>
<div class="btn-wrap right">
<!-- 수정 버튼 (로그인 사용자 == 작성자 인 경우에만) -->
<?php if ($me === $_SESSION['login']['user_id'] ?? ''): ?>
<button class="btn-secondary" onclick="location.href='/kngil/bbs/qa_write.php?id=<?= $post['post_id'] ?>'">수정</button>
<button class="btn-secondary" id="btn-delete" data-status="<?= $post['stat_bc'] ?>" data-id="<?= $post['post_id'] ?>">삭제</button>
<?php endif; ?>
<!-- <button onclick="history.back()">닫기</button> -->
<button class="btn-primary" onclick="location.href='/kngil/bbs/qa_list.php'">
<i class="fa fa-list" aria-hidden="true"></i> 목록</button>
</div>
<article class="comment-section">
<h4 class="comment-title">댓글 (<span id="comment-count"><?= count($comments ?? []) ?></span>)</h4>
<div class="comment-wrap form-wrap">
<div id="comments" class="comment-list">
<?php foreach ($comments ?? [] as $c): ?>
<div class="comment" id="comment-<?= $c['comment_id'] ?>">
<div class="comment-body">
<!-- 댓글 내용 -->
<div class="comment-text">
<?= nl2br(htmlspecialchars($c['content'] ?? '')) ?>
</div>
<!-- (이미지 영역 구조 유지 아직 로직 안 붙여도 됨) -->
<?php if (!empty($c['images'])): ?>
<div class="comment-images" style="margin-top:6px; display:flex; gap:12px;">
<?php foreach ($c['images'] as $img): ?>
<div style="text-align:center;">
<img
src="<?= htmlspecialchars($img['thumb_path']) ?>"
onclick="window.open('<?= htmlspecialchars($img['file_path']) ?>', '_blank')"
style="width:140px; border-radius:6px; margin:4px; cursor:pointer;">
<div style="font-size:12px; color:#555; margin-top:4px; max-width:140px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">
<?= htmlspecialchars($img['file_name']) ?>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<!-- 작성자 + 날짜 -->
<div class="comment-meta">
<span class="comment-author">
<strong><?= htmlspecialchars($c['user_nm'] ?? '') ?></strong>
</span>
<span class="comment-date">
<small><?= $c['cdt_dt'] ?? '' ?></small>
</span>
</div>
</div>
<!-- 수정 / 삭제 버튼 -->
<div class="comment-actions" style="text-align:right;">
<?php if ($isLoggedIn): ?>
<?php if (($_SESSION['login']['user_id'] ?? '') === ($c['commenter'] ?? '')): ?>
<button class="btn-edit" data-id="<?= $c['comment_id'] ?>">수정</button>
<button class="btn-delete" data-id="<?= $c['comment_id'] ?>">삭제</button>
<?php elseif ($isSuperAdmin): ?>
<button class="btn-delete" data-id="<?= $c['comment_id'] ?>">삭제</button>
<?php endif; ?>
<?php endif; ?>
</div>
<!-- 수정 모드 textarea (구조 유지) -->
<div class="comment-edit-box" style="display:none; margin-top:5px;">
<textarea class="comment-edit-input" rows="3"><?= htmlspecialchars($c['content'] ?? '') ?></textarea>
<div class="comment-edit-actions" style="text-align:right; margin-top:3px;">
<button class="btn-save-edit" data-id="<?= $c['comment_id'] ?>">저장</button>
<button class="btn-cancel-edit">취소</button>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<!-- 신규 댓글 입력 -->
<?php if ($isLoggedIn): ?>
<form id="commentForm" enctype="multipart/form-data">
<div class="comment-row">
<textarea id="newComment"
name="comment"
class="input-text"
rows="3"
placeholder="댓글을 입력하세요"></textarea>
<button type="submit" class="btn-save">저장</button>
</div>
<!-- 업로드 영역 (구조 유지) -->
<div class="upload-wrap">
<label for="commentImages" class="img-upload-btn">📷 이미지 첨부</label>
<input type="file" id="commentImages" name="images[]" accept="image/*" multiple>
<span id="fileName" class="file-name">선택된 파일 없음</span>
<div id="previewArea"></div>
</div>
</form>
<?php else: ?>
<p style="color:#888;">댓글 작성은 로그인 후 이용 가능합니다.</p>
<?php endif; ?>
</div>
</article>
</section>
</div> <!-- container END -->
<?php include __DIR__ . "/_footer.php"; ?>
</div> <!-- wrapper END -->
<script>
$(document).on('click', '#btn-delete', function (e) {
e.preventDefault();
const status = $(this).data('status');
const postId = $(this).data('id');
if (status === 'review' || status === 'done') {
alert("검토중이거나 답변완료 된 상태에서는 글을 삭제할 수 없습니다.\n관리자에게 문의해 주세요");
return;
}
if (!confirm("정말 삭제하시겠습니까?\n댓글과 첨부파일도 함께 삭제됩니다.")) {
return;
}
const form = document.createElement('form');
form.method = 'post';
form.action = "/kngil/bbs/qa_detail.php"; // ✅ 중요
const actionInput = document.createElement('input');
actionInput.type = 'hidden';
actionInput.name = 'action';
actionInput.value = 'delete';
const idInput = document.createElement('input');
idInput.type = 'hidden';
idInput.name = 'post_id';
idInput.value = postId;
form.appendChild(actionInput);
form.appendChild(idInput);
document.body.appendChild(form);
form.submit();
});
</script>
<script src="/kngil/js/index.js"></script>
<script src="/kngil/js/mypage.js"></script>
<script src="/kngil/js/join.js"></script>
<script type="module" src="/kngil/js/login.js"></script>
<script src="/kngil/js/login_sms.js"></script>
<script>
try{
AOS.init();
if (typeof Lenis !== 'undefined') {
const lenis = new Lenis();
lenis.on('scroll', ScrollTrigger.update);
gsap.ticker.add((time)=>{ lenis.raf(time * 1000) });
gsap.ticker.lagSmoothing(0);
window.lenis = lenis;
}
} catch(e){ console.error(e); }
</script>
<script>
//상태 색상 변경 동적 업데이트
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.status-select').forEach(sel => {
sel.addEventListener('change', function() {
this.className = 'status-select status-' + this.value;
});
});
});
// ✅ 댓글 저장 (이미지 포함)
document.getElementById('commentForm')?.addEventListener('submit', async (e) => {
e.preventDefault();
const text = document.getElementById('newComment').value.trim();
const files = document.getElementById('commentImages').files;
if (!text && files.length === 0) {
alert('댓글 또는 이미지를 입력하세요.');
return;
}
const formData = new FormData();
formData.append('postId', <?= json_encode($post['post_id']) ?>);
formData.append('comment', text);
for (let i = 0; i < files.length; i++) {
formData.append('images[]', files[i]);
}
const res = await fetch('/kngil/bbs/qa_comment.php', {
method: 'POST',
body: formData,
credentials: 'include'
});
const json = await res.json();
if (json.status !== 'ok') {
alert(json.message || '저장 실패');
return;
}
// ✅ DOM 추가 (서버에서 이미지 URL 배열 반환한다고 가정)
const div = document.createElement('div');
div.className = 'comment';
div.id = "comment-" + json.comment_id;
const safeText = (json.comment_text || '').replace(/\r?\n/g, '<br>');
let imageHTML = "";
if (json.images && json.images.length > 0) {
imageHTML = `
<div class="comment-images"
style="margin-top:6px; display:flex; gap:12px; flex-wrap:wrap;">
${json.images
.map(
(img) => `
<div style="text-align:center; width:140px;">
<img
src="${img.thumb}"
onclick="window.open('${img.full}', '_blank')"
style="width:140px; height:auto; border-radius:6px; cursor:pointer;"
>
<div style="
font-size:12px;
color:#555;
margin-top:4px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
">
${img.name}
</div>
</div>
`
)
.join("")}
</div>`;
}
div.innerHTML = `
<div class="comment-body">
<div class="comment-text">${safeText}</div>
${imageHTML}
<div class="comment-meta">
<span class="comment-author"><strong>${json.user_name || json.login_id}</strong></span>
<span class="comment-date"><small>${json.created_at}</small></span>
</div>
</div>
`;
document.getElementById('comments').append(div);
document.getElementById('newComment').value = '';
document.getElementById('commentImages').value = '';
document.getElementById('previewArea').innerHTML = '';
});
// 댓글 수정 버튼
$(document).on('click', '.btn-edit', function() {
const id = $(this).data('id');
const $comment = $(this).closest('.comment');
const $text = $comment.find('.comment-text');
const original = $text.text().trim();
// input으로 교체
$text.replaceWith(`<textarea class="edit-input" data-id="${id}" rows="3">${original}</textarea>`);
$(this).text("저장").removeClass("btn-edit").addClass("btn-save-edit").attr("data-id", id);;
});
// 댓글 수정 저장
$(document).on('click', '.btn-save-edit', function() {
const id = $(this).data('id');
const $input = $('.edit-input[data-id="'+id+'"]');
const newText = $input.val().trim();
if (!newText) return alert("내용을 입력하세요");
console.log("update click", id, newText);
$.post("/kngil/bbs/qa_comment_update.php",
{ commentId:id, comment:newText },
function(res) {
if (res.status === 'ok') {
alert(res.message || "댓글이 수정되었습니다.");
$input.replaceWith(`<div class="comment-text">${newText}</div>`);
$('.btn-save-edit[data-id="'+id+'"]').text("수정")
.removeClass("btn-save-edit").addClass("btn-edit");
} else {
alert(res.message || "수정 실패");
}
}, "json");
});
document.addEventListener('click', function(e) {
// 수정 버튼 클릭 → textarea 열기
if (e.target.classList.contains('btn-edit')) {
const comment = e.target.closest('.comment');
comment.querySelector('.comment-text').style.display = 'none';
comment.querySelector('.comment-actions').style.display = 'none';
comment.querySelector('.comment-edit-box').style.display = 'block';
}
// 취소 버튼 → 원래 상태로
if (e.target.classList.contains('btn-cancel-edit')) {
const comment = e.target.closest('.comment');
comment.querySelector('.comment-text').style.display = 'inline';
comment.querySelector('.comment-actions').style.display = 'block';
comment.querySelector('.comment-edit-box').style.display = 'none';
}
// 저장 버튼 → AJAX로 수정 요청 (예시)
if (e.target.classList.contains('btn-save-edit')) {
const comment = e.target.closest('.comment');
const id = e.target.dataset.id;
const newText = comment.querySelector('.comment-edit-input').value;
// TODO: AJAX 호출해서 서버 업데이트
console.log("수정 저장:", id, newText);
// UI 갱신
comment.querySelector('.comment-text').textContent = newText;
comment.querySelector('.comment-text').style.display = 'inline';
comment.querySelector('.comment-actions').style.display = 'block';
comment.querySelector('.comment-edit-box').style.display = 'none';
}
});
// 댓글 삭제 버튼
$(document).on("click", ".btn-delete", function () {
if (!confirm("정말 삭제하시겠습니까?")) return;
var commentId = $(this).data("id");
$.ajax({
url: "/kngil/bbs/qa_comment_delete.php",
type: "POST",
data: { commentId: commentId },
dataType: "json",
success: function (res) {
if (res.status === "ok") {
// DOM에서도 삭제
$("#comment-" + commentId).fadeOut(300, function () {
$(this).remove();
});
// ✅ 댓글 수 감소
var countEl = $("#comment-count");
var current = parseInt(countEl.text(), 10);
if (current > 0) {
countEl.text(current - 1);
}
alert("댓글이 삭제되었습니다.");
} else {
alert(res.message || "삭제 실패");
}
},
error: function (xhr) {
alert("삭제 요청 에러: " + xhr.responseText);
}
});
});
</script>
</body>
</html>
<script>
// ✅ 댓글 이미지 미리보기
document.addEventListener("change", function (e) {
if (e.target.id === "commentImages") {
const preview = document.getElementById("previewArea");
preview.innerHTML = ""; // 초기화
[...e.target.files].forEach((file) => {
// ▶ 개별 박스 생성
const box = document.createElement("div");
box.style.width = "80px";
box.style.marginRight = "10px";
box.style.textAlign = "center";
box.style.display = "inline-block";
// ▶ 썸네일 이미지
const img = document.createElement("img");
img.src = URL.createObjectURL(file);
img.style.width = "80px";
img.style.height = "80px";
img.style.objectFit = "cover";
img.style.borderRadius = "6px";
// ▶ 파일명 (길면 ... 처리)
const name = document.createElement("div");
name.textContent = file.name;
name.style.marginTop = "4px";
name.style.whiteSpace = "nowrap";
name.style.overflow = "hidden";
name.style.textOverflow = "ellipsis";
name.style.width = "80px";
// ▶ 박스에 넣기
box.appendChild(img);
box.appendChild(name);
// ▶ preview 영역에 넣기
preview.appendChild(box);
});
}
});
</script>

339
kngil/skin/qa_list.skin.php Normal file
View File

@@ -0,0 +1,339 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<?php include __DIR__ . "/_head.php"; ?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Q&A 게시판 리스트</title>
<link rel="stylesheet" href="/kngil/css/qa/font-awesome.min.css?ver=2303229">
<!-- 디자인팀 작성 -->
<script src="/kngil/js/lib/jquery-3.6.1.min.js" type="text/javascript"></script>
<script src="/kngil/js/qa/jquery.mousewheel.min.js" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<!-- <script src="/kngil/js/qa/qa_popup.js" type="text/javascript"></script>
<script src="/kngil/js/qa/qa_common.js" type="text/javascript"></script>
<script src="/kngil/js/qa/qa_index.js" type="text/javascript"></script> -->
<!-- <link rel="stylesheet" href="/kngil/css/style.css"/> -->
<!-- //디자인팀 작성 -->
</head>
<body>
<div class="wrap">
<!-- HEADER -->
<?php include __DIR__ . "/_header.php"; ?>
<!-- //HEADER -->
<?php
include __DIR__ . "/pop_login.php";
include __DIR__ . "/pop_join.php";
include __DIR__ . "/pop_agreement.php";
include __DIR__ . "/pop_mypage01.php";
include __DIR__ . "/pop_mypage02.php";
include __DIR__ . "/pop_mypage03.php";
include __DIR__ . "/pop_password.php";
include __DIR__ . "/pop_privacy.php";
include __DIR__ . "/pop_search.php";
// include __DIR__ . "/_nav.php";
?>
<?php
$search = $search ?? '';
$cats = $cats ?? [];
$writer = $writer ?? '';
$status = $status ?? 'all';
?>
<div class="container faq">
<section class="sub-header">
<div class="page-title">
<h2 data-aos="fade-down" data-aos-duration="1000">Q&amp;A</h2>
<p class="sub-txt">KNGIL 관련 문의하기</p>
</div>
<ul class="sub-tab">
<li><a href="/kngil/skin/faq_list.skin.php">자주하는 질문(FAQ)</a></li>
<li class="on"><a href="/kngil/bbs/qa_list.php">문의하기(Q&A)</a></li>
<li><a href="https://939.co.kr/saman/" target="_blank">원격지원</a></li>
</ul>
</section>
<section class="sub-content">
<h3 class="sub-tit">1:1 문의하기</h3>
<form class="qa-controls" method="get" action="">
<div class="search-wrap">
<div class="filters">
<div class="check-group">
<!-- <strong>구분</strong> -->
<?php
// 선택 여부 유틸
$isChecked = function($v) use ($cats) {
return in_array($v, $cats ?? [], true) ? 'checked' : '';
};
// 아무 것도 선택 안되어 있으면 전체 on
$allOn = empty($cats);
?>
<label><input type="checkbox" name="cat[]" value="전체"> 전체</label>
<label><input type="checkbox" name="cat[]" value="일반문의"> 일반</label>
<label><input type="checkbox" name="cat[]" value="개선문의"> 개선</label>
<label><input type="checkbox" name="cat[]" value="오류문의"> 오류</label>
<?php if (!empty($_SESSION['login'])): ?>
<label><input type="checkbox" name="cat[]" value="관리글"> 관리</label>
<?php endif; ?>
</div>
<fieldset class="check-box">
<legend>작성자</legend>
<label><input type="checkbox" name="writer" value="me" <?= $writer==='me' ?'checked':'' ?>> 내가 작성한 글</label>
</fieldset>
<?php if (!empty($_SESSION['login'])): ?>
<?php $status = $_GET['status'] ?? 'all'; ?>
<fieldset class="check-box1" style="margin-left:20px;">
<legend>상태</legend>
<select name="status" class="status-select">
<option value="all" <?= $status==='all'?'selected':'' ?>>전체</option>
<option value="wait" <?= $status==='wait'?'selected':'' ?>>문의접수</option>
<option value="review"<?= $status==='review'?'selected':'' ?>>문의검토</option>
<option value="deep" <?= $status==='deep'?'selected':'' ?>>정밀검토</option>
<option value="patch" <?= $status==='patch'?'selected':'' ?>>패치예정</option>
<option value="done" <?= $status==='done'?'selected':'' ?>>답변완료</option>
</select>
</fieldset>
<?php endif; ?>
</div>
<div class="qa-search search-box">
<?php if (!empty($_SESSION['login'])): ?>
<input type="number" class="qna-id-input" placeholder="Q&A ID">
<button type="button" class="btn-move">이동</button>
<?php endif; ?>
<input type="text" name="q" value="<?= htmlspecialchars($search) ?>" placeholder="제목+내용 검색어를 입력하세요">
<button type="submit" class="btn-submit" >
<i class="fa fa-search"></i> 검색
</button>
</div>
</div>
</form>
<div class="board-list">
<table>
<colgroup>
<col style="width:5%"><col style="width:7%"><col style="width:12%"><col style="width:12%">
<col style="width:7%"><col style="width:auto"><col style="width:9%"><col style="width:9%">
</colgroup>
<thead>
<tr>
<th>번호</th><th>구분</th><th>회사</th><th>부서</th>
<th>작성자</th><th>제목</th><th>등록일</th><th>상태</th>
</tr>
</thead>
<tbody>
<?php
$totalIndex = $totalCount - ($page - 1) * $pageSize;
$idx = 0;
?>
<?php foreach($posts as $row): ?>
<?php
$isNotice = ($row['category'] === 'notice');
$rowNumber = $totalIndex - $idx; // 연속 번호 재계산
?>
<?php $isNotice = ($row['category'] === 'notice'); ?>
<tr class="<?= $isNotice ? 'row-notice' : '' ?>" onclick="location.href='/kngil/bbs/qa_detail.php?id=<?= urlencode($row['post_id']) ?>'" style="cursor:pointer;">
<!-- 번호: 공지 or 연속번호 -->
<td><?= $isNotice ? '공지' : $rowNumber ?></td>
<!-- 구분 -->
<td><?= htmlspecialchars($row['category']) ?></td>
<!-- 회사 -->
<td><?= htmlspecialchars($row['display_company']) ?></td>
<!-- 부서 -->
<td><?= htmlspecialchars($row['dept_nm'] ?? '') ?></td>
<!-- 작성자 -->
<td><?= htmlspecialchars($row['display_name']) ?></td>
<!-- 제목 -->
<td class="left">
<?php if (!empty($row['is_secret'])): ?>
<small style="color:#999">[비밀글]</small>
<?php endif; ?>
<span class="title-text">
<?= htmlspecialchars($row['title']) ?>
</span>
<!-- 댓글 개수 -->
<?php if (!empty($row['comment_count'])): ?>
<span class="badge badge-comment" style="color:#007bff; margin-left:5px;">
<i class="fa fa-commenting-o"></i> <?= $row['comment_count'] ?>
</span>
<?php endif; ?>
<!-- 첨부파일 개수 -->
<?php if (!empty($row['file_count'])): ?>
<span class="badge badge-file" style="color:#28a745; margin-left:5px;">
<i class="fa fa-paperclip"></i> <?= $row['file_count'] ?>
</span>
<?php endif; ?>
</td>
<!-- 등록일 -->
<td><?= htmlspecialchars(substr($row['created_at'],0,10)) ?></td>
<!-- 상태 -->
<td>
<?php if ($row['category'] === 'notice'): ?>
<!-- 공지사항이면 상태값 안 보여줌 -->
<span></span>
<?php else: ?>
<span class="status-<?= htmlspecialchars($row['status']) ?>">
<?= $row['status']==='wait' ? '문의접수'
: ($row['status']==='review' ? '문의검토'
: ($row['status']==='deep' ? '정밀검토'
: ($row['status']==='patch' ? '패치예정'
: ($row['status']==='done' ? '답변완료'
: '')))) ?>
</span>
<?php endif; ?>
</td>
</tr>
<?php $idx++; ?>
<?php endforeach; ?>
</tbody>
</table>
<?php if ($totalPages > 1): ?>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?<?= http_build_query(array_merge($_GET, ['page'=>$page-1])) ?>" class="prev">이전</a>
<?php else: ?><span class="prev">이전</span><?php endif ?>
<?php
$blockSize = 10;
$currentBlock= ceil($page / $blockSize);
$start = ($currentBlock - 1) * $blockSize + 1;
$end = min($totalPages, $currentBlock * $blockSize);
for ($i = $start; $i <= $end; $i++):
?>
<?php if ($i == $page): ?>
<!-- ✅ 여기! 현재 페이지는 span.current -->
<span class="current"><?= $i ?></span>
<?php else: ?>
<a href="?<?= http_build_query(array_merge($_GET, ['page'=>$i])) ?>"><?= $i ?></a>
<?php endif ?>
<?php endfor ?>
<?php if ($page < $totalPages): ?>
<a href="?<?= http_build_query(array_merge($_GET, ['page'=>$page+1])) ?>" class="next">다음</a>
<?php else: ?><span class="next">다음</span><?php endif ?>
</div>
<?php endif ?>
</div>
<div class="btn-wrap right">
<button type="button" class="btn-primary" onclick="location.href='/kngil/skin/qa_write.skin.php'">
<i class="fa fa-pencil" aria-hidden="true"></i> 문의등록
</button>
</div>
</section>
<div class="contents">
</div><!-- contents END /egbim1/skin/qa/basic/descope_qa_write.skin.php-->
</div><!-- container END -->
<button class="btn_top js__top topbtn_on" onclick="window.scrollTo(0,0);" style="bottom:60px;"><div class="arrow"></div></button>
<!-- FOOTER -->
<?php include __DIR__ . "/_footer.php"; ?>
<!-- //FOOTER -->
</div><!-- wrapper END -->
<script src="/kngil/js/index.js"></script>
<script src="/kngil/js/mypage.js"></script>
<script src="/kngil/js/join.js"></script>
<script type="module" src="/kngil/js/login.js"></script>
<script src="/kngil/js/login_sms.js"></script>
<script>
// AOS / Lenis 초기화 (안전 가드)
try {
AOS.init();
if (typeof Lenis !== 'undefined') {
const lenis = new Lenis();
lenis.on('scroll', ScrollTrigger.update);
gsap.ticker.add((time)=>{ lenis.raf(time * 1000) });
gsap.ticker.lagSmoothing(0);
window.lenis = lenis; // 다른 코드에서 접근할 수 있게
}
} catch(e) { console.error(e); }
</script>
<script>
// ===== 공용 유틸 =====
function getQueryString(name){
// 페이지 구성 요소가 없을 수 있으므로 가드
const intro = document.querySelector('.intro_wrap');
if (intro) intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
if (mainMask) mainMask.classList.add('skip');
return new URLSearchParams(window.location.search).get(name);
}
// 필터 변경 시 자동 제출
(function(){
const form = document.querySelector('.qa-controls');
const boxes = Array.from(document.querySelectorAll('.qa-controls input[name="cat[]"]'));
const writer = document.querySelector('.qa-controls input[name="writer"]');
function submitForm(){ form && form.submit(); }
function syncAllToggle(changed){
const allBox = boxes.find(b => b.value === 'all');
const itemBoxes = boxes.filter(b => b.value !== 'all');
if (!allBox) return;
if (changed && changed.value === 'all') {
// 전체 체크 시 개별은 해제
if (allBox.checked) itemBoxes.forEach(b => b.checked = false);
} else {
// 개별 체크 시 전체 해제
if (itemBoxes.some(b => b.checked)) allBox.checked = false;
// 개별이 전부 해제되면 전체 자동 체크
if (!itemBoxes.some(b => b.checked)) allBox.checked = true;
}
}
boxes.forEach(b => {
b.addEventListener('change', function(){ syncAllToggle(this); submitForm(); });
});
if (writer) writer.addEventListener('change', submitForm);
})();
// Q&A ID 검색
$(document).on("click", ".btn-move", function() {
const qnaId = $(".qna-id-input").val().trim();
if (!qnaId) {
alert("Q&A ID를 입력하세요.");
return;
}
location.href = "/kngil/bbs/qa_detail.php?id=" + qnaId;
});
$("#qna-id-search").on("keypress", function(e){
if(e.key === "Enter"){
$("#qna-id-btn").click();
}
});
</script>

View File

@@ -0,0 +1,334 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<?php include __DIR__ . "/_head.php"; ?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Q&A 게시판 리스트</title>
<link rel="stylesheet" href="/kngil/css/qa/font-awesome.min.css?ver=2303229">
<!-- 디자인팀 작성 -->
<script src="/kngil/js/lib/jquery-3.6.1.min.js" type="text/javascript"></script>
<script src="/kngil/js/qa/jquery.mousewheel.min.js" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<!-- <script src="/kngil/js/qa/qa_popup.js" type="text/javascript"></script>
<script src="/kngil/js/qa/qa_common.js" type="text/javascript"></script>
<script src="/kngil/js/qa/qa_index.js" type="text/javascript"></script> -->
<link rel="stylesheet" href="/kngil/css/qa/qa_reset.css"/>
<link rel="stylesheet" href="/kngil/css/qa/qa_font.css"/>
<link rel="stylesheet" href="/kngil/css/qa/qa_style.css"/>
<!-- <link rel="stylesheet" href="/kngil/css/style.css"/> -->
<!-- //디자인팀 작성 -->
</head>
<body>
<div class="wrapper">
<!-- HEADER -->
<?php include __DIR__ . "/_header.php"; ?>
<!-- //HEADER -->
<?php
include __DIR__ . "/pop_login.php";
include __DIR__ . "/pop_join.php";
include __DIR__ . "/pop_agreement.php";
include __DIR__ . "/pop_mypage01.php";
include __DIR__ . "/pop_mypage02.php";
include __DIR__ . "/pop_mypage03.php";
include __DIR__ . "/pop_password.php";
include __DIR__ . "/pop_privacy.php";
include __DIR__ . "/pop_search.php";
// include __DIR__ . "/_nav.php";
?>
<?php
$search = $search ?? '';
$cats = $cats ?? [];
$writer = $writer ?? '';
$status = $status ?? 'all';
?>
<div class="qa-container container faq">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">Q&amp;A</h2>
<span>EG-BIM 관련 문의하기</span>
</div>
<ul class="sub_tab">
<li><a href="/kngil/skin/faq_list.skin.php">자주하는 질문(FAQ)</a></li>
<li class="on"><a href="/kngil/bbs/qa_list.php">문의하기(Q&A)</a></li>
<li><a href="https://939.co.kr/saman/" target="_blank">원격지원</a></li>
</ul>
</section>
<span class="sub_tit">문의하기(Q&A)</span>
<div class="contents">
<form class="qa-controls" method="get" action="">
<div class="search-wrap">
<div class="qa-filters">
<div class="check-group">
<!-- <strong>구분</strong> -->
<?php
// 선택 여부 유틸
$isChecked = function($v) use ($cats) {
return in_array($v, $cats ?? [], true) ? 'checked' : '';
};
// 아무 것도 선택 안되어 있으면 전체 on
$allOn = empty($cats);
?>
<label><input type="checkbox" name="cat[]" value="전체"> 전체</label>
<label><input type="checkbox" name="cat[]" value="일반문의"> 일반</label>
<label><input type="checkbox" name="cat[]" value="개선문의"> 개선</label>
<label><input type="checkbox" name="cat[]" value="오류문의"> 오류</label>
<?php if (!empty($_SESSION['login'])): ?>
<label><input type="checkbox" name="cat[]" value="관리글"> 관리</label>
<?php endif; ?>
</div>
<div class="check-box">
<strong>작성자</strong>
<label><input type="checkbox" name="writer" value="me" <?= $writer==='me' ?'checked':'' ?>> 내가 작성한 글</label>
</div>
<?php if (!empty($_SESSION['login'])): ?>
<?php $status = $_GET['status'] ?? 'all'; ?>
<div class="check-box1" style="margin-left:20px;">
<strong>상태</strong>
<select name="status" class="status-select">
<option value="all" <?= $status==='all'?'selected':'' ?>>전체</option>
<option value="wait" <?= $status==='wait'?'selected':'' ?>>문의접수</option>
<option value="review"<?= $status==='review'?'selected':'' ?>>문의검토</option>
<option value="deep" <?= $status==='deep'?'selected':'' ?>>정밀검토</option>
<option value="patch" <?= $status==='patch'?'selected':'' ?>>패치예정</option>
<option value="done" <?= $status==='done'?'selected':'' ?>>답변완료</option>
</select>
</div>
<?php endif; ?>
</div>
<div class="qa-search search-box">
<?php if (!empty($_SESSION['login'])): ?>
<input type="number" class="qna-id-input" placeholder="Q&A ID">
<button type="button" class="btn-move">이동</button>
<?php endif; ?>
<input type="text" name="q" value="<?= htmlspecialchars($search) ?>" placeholder="제목+내용 검색어를 입력하세요">
<button type="submit" class="btn-search">
<i class="fa fa-search"></i> 검색
</button>
</div>
</div>
</form>
<div class="tbl-wrap">
<table>
<colgroup>
<col style="width:5%"><col style="width:7%"><col style="width:12%"><col style="width:12%">
<col style="width:7%"><col style="width:auto"><col style="width:9%"><col style="width:9%">
</colgroup>
<thead>
<tr>
<th>번호</th><th>구분</th><th>회사</th><th>부서</th>
<th>작성자</th><th>제목</th><th>등록일</th><th>상태</th>
</tr>
</thead>
<tbody>
<?php
$totalIndex = $totalCount - ($page - 1) * $pageSize;
$idx = 0;
?>
<?php foreach($posts as $row): ?>
<?php
$isNotice = ($row['category'] === 'notice');
$rowNumber = $totalIndex - $idx; // 연속 번호 재계산
?>
<?php $isNotice = ($row['category'] === 'notice'); ?>
<tr class="<?= $isNotice ? 'row-notice' : '' ?>" onclick="location.href='/kngil/bbs/qa_detail.php?id=<?= urlencode($row['post_id']) ?>'" style="cursor:pointer;">
<!-- 번호: 공지 or 연속번호 -->
<td><?= $isNotice ? '공지' : $rowNumber ?></td>
<!-- 구분 -->
<td><?= htmlspecialchars($row['category']) ?></td>
<!-- 회사 -->
<td><?= htmlspecialchars($row['display_company']) ?></td>
<!-- 부서 -->
<td><?= htmlspecialchars($row['dept_nm'] ?? '') ?></td>
<!-- 작성자 -->
<td><?= htmlspecialchars($row['display_name']) ?></td>
<!-- 제목 -->
<td class="left">
<?php if (!empty($row['is_secret'])): ?>
<span style="color:#999">[비밀글]</span>
<?php endif; ?>
<span class="title-text">
<?= htmlspecialchars($row['title']) ?>
</span>
<!-- 댓글 개수 -->
<?php if (!empty($row['comment_count'])): ?>
<span class="badge badge-comment" style="color:#007bff; margin-left:5px;">
<i class="fa fa-commenting-o"></i> <?= $row['comment_count'] ?>
</span>
<?php endif; ?>
<!-- 첨부파일 개수 -->
<?php if (!empty($row['file_count'])): ?>
<span class="badge badge-file" style="color:#28a745; margin-left:5px;">
<i class="fa fa-paperclip"></i> <?= $row['file_count'] ?>
</span>
<?php endif; ?>
</td>
<!-- 등록일 -->
<td><?= htmlspecialchars(substr($row['created_at'],0,10)) ?></td>
<!-- 상태 -->
<td>
<?php if ($row['category'] === 'notice'): ?>
<!-- 공지사항이면 상태값 안 보여줌 -->
<span></span>
<?php else: ?>
<span class="status-<?= htmlspecialchars($row['status']) ?>">
<?= $row['status']==='wait' ? '문의접수'
: ($row['status']==='review' ? '문의검토'
: ($row['status']==='deep' ? '정밀검토'
: ($row['status']==='patch' ? '패치예정'
: ($row['status']==='done' ? '답변완료'
: '')))) ?>
</span>
<?php endif; ?>
</td>
</tr>
<?php $idx++; ?>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php if ($totalPages > 1): ?>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?<?= http_build_query(array_merge($_GET, ['page'=>$page-1])) ?>" class="prev">이전</a>
<?php else: ?><span class="prev">이전</span><?php endif ?>
<?php
$blockSize = 10;
$currentBlock= ceil($page / $blockSize);
$start = ($currentBlock - 1) * $blockSize + 1;
$end = min($totalPages, $currentBlock * $blockSize);
for ($i = $start; $i <= $end; $i++):
?>
<?php if ($i == $page): ?>
<!-- ✅ 여기! 현재 페이지는 span.current -->
<span class="current"><?= $i ?></span>
<?php else: ?>
<a href="?<?= http_build_query(array_merge($_GET, ['page'=>$i])) ?>"><?= $i ?></a>
<?php endif ?>
<?php endfor ?>
<?php if ($page < $totalPages): ?>
<a href="?<?= http_build_query(array_merge($_GET, ['page'=>$page+1])) ?>" class="next">다음</a>
<?php else: ?><span class="next">다음</span><?php endif ?>
</div>
<?php endif ?>
<div class="btn-group">
<button type="button" class="btn btn-write" onclick="location.href='/kngil/skin/qa_write.skin.php'">
<i class="fa fa-pencil" aria-hidden="true"></i> 문의등록
</button>
</div>
</div><!-- contents END /egbim1/skin/qa/basic/descope_qa_write.skin.php-->
</div><!-- container END -->
<button class="btn_top js__top topbtn_on" onclick="window.scrollTo(0,0);" style="bottom:60px;"><div class="arrow"></div></button>
<!-- FOOTER -->
<?php include __DIR__ . "/_footer.php"; ?>
<!-- //FOOTER -->
</div><!-- wrapper END -->
<script src="/kngil/js/index.js"></script>
<script src="/kngil/js/mypage.js"></script>
<script src="/kngil/js/join.js"></script>
<script type="module" src="/kngil/js/login.js"></script>
<script src="/kngil/js/login_sms.js"></script>
<script>
// AOS / Lenis 초기화 (안전 가드)
try {
AOS.init();
if (typeof Lenis !== 'undefined') {
const lenis = new Lenis();
lenis.on('scroll', ScrollTrigger.update);
gsap.ticker.add((time)=>{ lenis.raf(time * 1000) });
gsap.ticker.lagSmoothing(0);
window.lenis = lenis; // 다른 코드에서 접근할 수 있게
}
} catch(e) { console.error(e); }
</script>
<script>
// ===== 공용 유틸 =====
function getQueryString(name){
// 페이지 구성 요소가 없을 수 있으므로 가드
const intro = document.querySelector('.intro_wrap');
if (intro) intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
if (mainMask) mainMask.classList.add('skip');
return new URLSearchParams(window.location.search).get(name);
}
// 필터 변경 시 자동 제출
(function(){
const form = document.querySelector('.qa-controls');
const boxes = Array.from(document.querySelectorAll('.qa-controls input[name="cat[]"]'));
const writer = document.querySelector('.qa-controls input[name="writer"]');
function submitForm(){ form && form.submit(); }
function syncAllToggle(changed){
const allBox = boxes.find(b => b.value === 'all');
const itemBoxes = boxes.filter(b => b.value !== 'all');
if (!allBox) return;
if (changed && changed.value === 'all') {
// 전체 체크 시 개별은 해제
if (allBox.checked) itemBoxes.forEach(b => b.checked = false);
} else {
// 개별 체크 시 전체 해제
if (itemBoxes.some(b => b.checked)) allBox.checked = false;
// 개별이 전부 해제되면 전체 자동 체크
if (!itemBoxes.some(b => b.checked)) allBox.checked = true;
}
}
boxes.forEach(b => {
b.addEventListener('change', function(){ syncAllToggle(this); submitForm(); });
});
if (writer) writer.addEventListener('change', submitForm);
})();
// Q&A ID 검색
$(document).on("click", ".btn-move", function() {
const qnaId = $(".qna-id-input").val().trim();
if (!qnaId) {
alert("Q&A ID를 입력하세요.");
return;
}
location.href = "/kngil/bbs/qa_detail.php?id=" + qnaId;
});
$("#qna-id-search").on("keypress", function(e){
if(e.key === "Enter"){
$("#qna-id-btn").click();
}
});
</script>

View File

@@ -0,0 +1,217 @@
<!-- <?php if (!empty($errors)): ?>
<div style="margin:20px; padding:15px; border:1px solid #e00; color:#e00;">
<strong>오류 발생</strong>
<ul>
<?php foreach ($errors as $err): ?>
<li><?= htmlspecialchars($err) ?></li>
<?php endforeach ?>
</ul>
</div>
<?php endif; ?> -->
<!DOCTYPE html>
<html lang="ko">
<head>
<?php include __DIR__ . "/_head.php"; ?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Q&A 게시판 리스트</title>
<link rel="stylesheet" href="/kngil/css/qa/font-awesome.min.css?ver=2303229">
<!-- 디자인팀 작성 -->
<script src="/kngil/js/lib/jquery-3.6.1.min.js" type="text/javascript"></script>
<script src="/kngil/js/qa/jquery.mousewheel.min.js" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<!-- CKEditor 5 -->
<script src="https://cdn.ckeditor.com/ckeditor5/41.0.0/classic/ckeditor.js"></script>
</head>
<body>
<div class="wrap">
<?php
include __DIR__ . "/_header.php";
if (!$isLogin) {
echo "<script>
alert('로그인 후 문의 등록이 가능합니다.');
location.href = '/kngil/skin/qa_list.skin.php';
</script>";
exit;
}
?>
<?php
include __DIR__ . "/pop_login.php";
include __DIR__ . "/pop_join.php";
include __DIR__ . "/pop_agreement.php";
include __DIR__ . "/pop_mypage01.php";
include __DIR__ . "/pop_mypage02.php";
include __DIR__ . "/pop_mypage03.php";
include __DIR__ . "/pop_password.php";
include __DIR__ . "/pop_privacy.php";
include __DIR__ . "/pop_search.php";
?>
<div class="container faq">
<section class="sub-header">
<div class="page-title">
<h2>Q&A</h2>
<p class="sub-txt">KNGIL 관련 문의하기</p>
</div>
<ul class="sub-tab">
<li><a href="/kngil/skin/faq_list.skin.php">자주하는 질문(FAQ)</a></li>
<li class="on"><a href="/kngil/bbs/qa_list.php">문의하기(Q&A)</a></li>
<li><a href="https://939.co.kr/saman/" target="_blank">원격지원</a></li>
</ul>
</section>
<section class="sub-content">
<h3 class="sub-tit">문의하기(Q&A)</h3>
<form id="qaForm"
action="/kngil/bbs/qa_write.php<?= $isEdit ? '?id=' . $post['post_id'] : '' ?>"
method="POST"
enctype="multipart/form-data">
<div class="form-area">
<div class="form-group">
<fieldset class="form-item">
<label class="form-tit" for="category">구분</label>
<select class="select-sm" name="category" id="category" required>
<option value="">-- 선택 --</option>
<option value="오류문의" <?= ($post['category'] ?? '')=='오류문의' ? 'selected':'' ?>>오류문의</option>
<option value="개선문의" <?= ($post['category'] ?? '')=='개선문의' ? 'selected':'' ?>>개선문의</option>
<option value="일반문의" <?= ($post['category'] ?? '')=='일반문의' ? 'selected':'' ?>>일반문의</option>
<?php if ($isSuperAdmin): ?>
<option value="공지사항" <?= ($post['category'] ?? '')=='공지사항' ? 'selected':'' ?>>공지사항</option>
<option value="관리글" <?= ($post['category'] ?? '')=='관리글' ? 'selected':'' ?>>관리글</option>
<?php endif; ?>
</select>
</fieldset>
</div>
<div class="form-item">
<strong class="form-tit">제목<span class="require">*</span></strong>
<input type="text" name="title" style="width:100%;" placeholder="제목을 입력하세요" class="input-text" required
value="<?= htmlspecialchars($post['title'] ?? '', ENT_QUOTES) ?>">
</div>
<div class="form-item">
<strong class="form-tit">비밀글</strong>
<label>
<input type="checkbox" name="secret" value="1"
<?= !empty($post['is_secret']) ? 'checked':'' ?>>
비밀글로 등록
</label>
</div>
<div class="form-item">
<label class="form-tit" for="content">내용</label>
<div class="form-col-group">
<textarea id="content" name="content" class="text-area"
placeholder="문의 내용을 작성해주세요"><?= htmlspecialchars($post['content'] ?? '') ?></textarea>
</div>
</div>
<div class="form-item">
<label class="form-tit" for="attach">첨부파일</label>
<div class="form-col-group">
<div class="attach-box">
<input type="file" id="attach" name="attach[]" multiple>
<small class="info-msg">* 최대 30MB 이내</small>
</div>
<div id="drop-zone" class="drop-zone">
<p>여기로 파일을 드래그하거나 클릭해서 선택하세요.</p>
</div>
<ul id="file-list"></ul>
</div>
</div>
</div>
<div class="btn-wrap right">
<button type="button" class="btn btn-cancel" onclick="history.back()">취소</button>
<button type="submit" class="btn btn-secondary"><?= $isEdit ? '수정 저장' : '작성완료' ?></button>
</div>
<form>
</section>
</div>
<?php include __DIR__ . "/_footer.php"; ?>
</div>
<script src="/kngil/js/index.js"></script>
<script src="/kngil/js/mypage.js"></script>
<script src="/kngil/js/join.js"></script>
<script type="module" src="/kngil/js/login.js"></script>
<script src="/kngil/js/login_sms.js"></script>
<!-- CKEditor 표시용 초기화 (submit 관여 X) -->
<script>
document.addEventListener("DOMContentLoaded", function () {
ClassicEditor
.create(document.querySelector('#content'), {
language: 'ko',
ckfinder: {
uploadUrl: '/kngil/bbs/qa_img_upload.php'
}
})
.catch(console.error);
});
</script>
<!-- 첨부파일 drag UX (submit 관여 X) -->
<script>
const dropZone = document.getElementById("drop-zone");
const fileInput = document.getElementById("attach");
const fileList = document.getElementById("file-list");
let uploadFiles = [];
if (dropZone) {
dropZone.addEventListener("click", () => fileInput.click());
dropZone.addEventListener("dragover", e => { e.preventDefault(); dropZone.classList.add("dragover"); });
dropZone.addEventListener("dragleave", () => dropZone.classList.remove("dragover"));
dropZone.addEventListener("drop", e => {
e.preventDefault();
dropZone.classList.remove("dragover");
addFiles(e.dataTransfer.files);
});
}
fileInput.addEventListener("change", () => addFiles(fileInput.files));
function addFiles(files) {
for (const f of files) uploadFiles.push(f);
render();
sync();
}
function render() {
fileList.innerHTML = "";
uploadFiles.forEach(f => {
const li = document.createElement("li");
li.textContent = `${f.name} (${(f.size/1024).toFixed(1)} KB)`;
fileList.appendChild(li);
});
}
function sync() {
const dt = new DataTransfer();
uploadFiles.forEach(f => dt.items.add(f));
fileInput.files = dt.files;
}
</script>
</body>
</html>

View File

@@ -0,0 +1,469 @@
<?php
include __DIR__ . '/layout_sales.php';
sales_layout_start("영업실적");
?>
<h2 class="text-2xl font-bold mb-4">영업실적</h2>
<!-- <button class="bg-blue-600 text-white px-4 py-2 rounded mb-3" id="btn-add-result">
신규 실적 등록
</button> -->
<div id="grid_results" style="width:100%;height:720px;"></div>
<script type="module">
import { w2grid } from "https://cdn.jsdelivr.net/gh/vitmalina/w2ui@master/dist/w2ui.es6.min.js";
/* ------------------------------------------------------
공통 유틸
------------------------------------------------------ */
function clean(v) {
return (v === undefined || v === null) ? '' : v;
}
function cleanNumber(v) {
if (v === undefined || v === null || v === '' || isNaN(v)) return 0;
return Number(v);
}
function normalizeListValue(v) {
if (typeof v === "object" && v !== null && v.id) return v.id;
if (typeof v === "string") return v;
return '';
}
/* ------------------------------------------------------
🔵 직원 목록 / 거래처 목록 로드
------------------------------------------------------ */
let employeeList = [];
let clientList = [];
let productList = [];
async function loadEmployees() {
let res = await fetch('/egbim/bbs/sales_members.php?action=list');
let json = await res.json();
if (json.status === "ok") {
employeeList = json.records.map(m => ({
id: m.emp_no,
text: `${m.emp_name} (${m.emp_no})`
}));
}
}
async function loadClients() {
let res = await fetch('/egbim/bbs/sales_clients.php?action=list');
let json = await res.json();
if (json.status === "ok") {
clientList = json.records.map(c => ({
id: c.client_code,
text: `${c.client_name} (${c.client_code})`
}));
}
}
async function loadProducts() {
let res = await fetch('/egbim/bbs/sales_products.php?action=list');
let json = await res.json();
if (json.status === 'ok') {
productList = json.records.map(p => ({
id: p.code, // 저장용
text: `${p.name} (${p.code})` // 화면 표시용
}));
}
}
/* ------------------------------------------------------
🔵 직원 + 거래처 모두 로드 후 GRID 생성
------------------------------------------------------ */
await loadEmployees();
await loadClients();
await loadProducts();
/* ------------------------------------------------------
🔵 GRID
------------------------------------------------------ */
let grid = new w2grid({
name: 'grid_results',
box: '#grid_results',
show: {
toolbar: true,
footer: true,
toolbarSave: true,
toolbarReload: true,
toolbarSearch: true,
toolbarColumns: true,
lineNumbers: true
},
multiSearch: true,
searches: [
{ field: 'sales_date', label: '실적일', type: 'date' },
{ field: 'emp_no', label: '영업담당자', type: 'text' },
{ field: 'client_code', label: '거래처명', type: 'text', operator: 'contains' },
{ field: 'product_code', label: '제품명', type: 'text' },
{ field: 'remarks', label: '비고', type: 'text' },
],
columns: [
{ field: 'sales_date', text: '실적일', size: '110px', editable: { type: 'date' }, sortable: true },
/* 🔵 영업담당자 콤보 */
{
field: 'emp_no',
text: '영업담당자',
size: '150px',
editable: { type: 'combo', items: employeeList, showAll: true, filter: true},
resizable: true,
// render(record) {
// // 1) combo 선택 직후: record.emp_no = { id, text }
// if (typeof record.emp_no === "object" && record.emp_no !== null) {
// return record.emp_no.text; // ← 즉시 표시됨
// }
// // 2) 서버에서 불러온 값은 string → employeeList에서 매칭
// const item = employeeList.find(e => e.id == record.emp_no);
// return item ? item.text : record.emp_no;
// },
sortable: true
},
/* 🔵 거래처명 콤보 — DB는 client_code 저장 */
{
field: 'client_code',
text: '거래처명',
size: '180px',
editable: { type: 'combo', items: clientList, showAll: true, filter: true, match: 'contains', openOnFocus: true },
// render(record, extra) {
// let id = (typeof record.client_code === "object") ? record.client_code.id : record.client_code;
// let item = clientList.find(c => c.id == id);
// return item ? item.text : id;
// },
resizable: true,
sortable: true
},
{
field: 'product_code',
text: '제품명',
size: '200px',
editable: { type: 'combo', items: productList, filter: true, showAll: true },
// combo는 render 제거해야 정상표시됨
// render(record) {
// let item = productList.find(p => p.id === record.product_code);
// return item ? item.text : record.product_code;
// },
resizable: true,
sortable: true
},
{ field: 'quantity', text: '수량', size: '80px',
editable: { type: 'int' }, sortable: true, render: 'int', resizable: true, style: 'text-align:right' },
{ field: 'unit_price', text: '단가', size: '100px',
editable: { type: 'int' }, sortable: true, render: 'int', resizable: true, style: 'text-align:right' },
{ field: 'discount', text: '할인액', size: '100px',
editable: { type: 'float' }, sortable: true, render: 'int', resizable: true, style: 'text-align:right' },
{ field: 'total_amount', text: '총금액', size: '120px',
editable: { type: 'float' }, sortable: true, render: 'int', resizable: true, style: 'text-align:right' },
{ field: 'remarks', text: '비고', size: '200px', editable: { type: 'text' }, resizable: true, sortable: true },
{ field: 'created_at', text: '등록일', size: '160px', resizable: true, sortable: true }
],
toolbar: {
items: [
{ id: 'add', type: 'button', text: '추가', icon: 'w2ui-icon-plus' },
{ id: 'delete', type: 'button', text: '삭제', icon: 'w2ui-icon-cross' }
],
onClick(event) {
const g = this.owner;
if (event.target === 'w2ui-reload') {
loadResults();
return;
}
if (event.target === 'add') {
const newId = "new-" + Math.random().toString(36).substr(2, 9);
g.add({
recid: newId,
sales_date: "",
emp_no: "",
client_code: "",
product_code: "",
quantity: 0,
unit_price: 0,
discount: 0,
total_amount: 0,
remarks: "",
created_at: ""
});
g.refresh();
updateSummary();
return;
}
if (event.target === 'delete') {
const sel = g.getSelection();
if (!sel.length) return;
if (!confirm("정말 삭제하시겠습니까?")) return;
sel.forEach(id => {
// 신규(new-xxx)는 DB 삭제 X
if (String(id).startsWith("new-")) {
g.remove(id);
return;
}
fetch("/egbim/bbs/sales_results.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
action: "delete",
seq_no: id
})
})
.then(res => res.json())
.then(json => {
console.log("삭제 응답:", json);
})
.catch(err => console.error("삭제 오류:", err));
g.remove(id);
});
updateSummary();
}
}
},
onChange(event) {
event.onComplete = function(ev) {
let rec = grid.get(ev.recid);
if (!rec) return;
let field = grid.columns[ev.column].field;
let val = ev.value_new;
// combo object → text 강제 변환
if (typeof val === "object" && val !== null) {
val = val.text;
}
grid.set(ev.recid, { [field]: val });
// 계산 필드 자동 업데이트
if (field === 'quantity' || field === 'unit_price' || field === 'discount') {
let qty = parseInt(rec.quantity) || 0;
let unit = parseInt(rec.unit_price) || 0;
let dc = parseInt(rec.discount) || 0;
let total = Math.max(0, qty * unit - dc);
grid.set(ev.recid, { total_amount: total });
}
grid.refresh();
};
},
/* ------------------------------------------------------
🔥 저장 처리 (insert + update)
------------------------------------------------------ */
onSave(event) {
const changes = this.getChanges();
if (!changes.length) return;
Promise.all(
changes.map(ch => {
let rec = this.get(ch.recid); // 기존 record 전체 값
/* -------------------------------------------
🔵 1) 영업담당자(emp_no) 유효성 검사 및 변환
------------------------------------------- */
// raw 값 가져오기 (object, string 모두 처리)
let empRaw = ch.emp_no ?? rec.emp_no;
console.log('1111333');
// 콤보일 경우 object → text 로 변환 ("홍길동 (01201)")
if (typeof empRaw === "object" && empRaw !== null) {
empRaw = empRaw.text;
console.log('1111222');
}
// 빈 값은 허용
if (empRaw !== "") {
console.log('1111444');
// "(사번)" 추출
let match = empRaw.match(/\((.*?)\)/);
if (!match) {
console.log('11115');
alert("영업담당자 형식이 잘못되었습니다. 예: 홍길동 (01201)");
throw "invalid emp_no format";
}
let extractedEmpNo = match[1];
// 사번 유효성 체크
let validEmpList = employeeList.map(e => e.id);
if (!validEmpList.includes(extractedEmpNo)) {
console.log('11116');
alert("영업담당자는 목록에 있는 사람만 선택할 수 있습니다.");
throw "invalid emp_no";
}
}
// ✔ 최종 DB에는 "홍길동 (01201)" 그대로 저장
ch.emp_no = empRaw;
/* -------------------------------------------
🔵 2) 거래처(client_code) 유효성 검사
------------------------------------------- */
let client = normalizeListValue(ch.client_code ?? rec.client_code);
let validClientList = clientList.map(c => c.id);
let clientRaw = ch.client_code ?? rec.client_code;
if (typeof clientRaw === "object" && clientRaw !== null) {
clientRaw = clientRaw.text;
}
if (clientRaw !== "") {
let match = clientRaw.match(/\(([^()]*)\)(?!.*\([^()]*\))/);
if (!match) {
alert("거래처명 형식이 잘못되었습니다. 예: 현대건설 (C002)");
throw "invalid_client_code_format";
}
let code = match[1];
let validList = clientList.map(c => c.id);
if (!validList.includes(code)) {
alert("거래처명은 목록에서 선택해야 합니다.");
throw "invalid_client_code";
}
}
ch.client_code = clientRaw;
/* -------------------------------------------
🔵 3) 제품명(product_code) 유효성 검사
------------------------------------------- */
let product = normalizeListValue(ch.product_code ?? rec.product_code);
let validProductList = productList.map(p => p.id);
let productRaw = ch.product_code ?? rec.product_code;
if (typeof productRaw === "object" && productRaw !== null) {
productRaw = productRaw.text;
}
if (productRaw !== "") {
let match = productRaw.match(/\((.*?)\)$/);
if (!match) {
alert("제품명 형식이 잘못되었습니다. 예: EG-BIM (P001)");
throw "invalid_product_code_format";
}
let code = match[1];
let validList = productList.map(p => p.id);
if (!validList.includes(code)) {
alert("제품명은 목록에서 선택해야 합니다.");
throw "invalid_product_code";
}
}
ch.product_code = productRaw;
let body = {
action: String(ch.recid).startsWith("new-") ? "insert" : "update",
seq_no: ch.recid,
sales_date: clean(ch.sales_date ?? rec.sales_date),
emp_no: ch.emp_no,
client_code: ch.client_code,
product_code: ch.product_code,
quantity: cleanNumber(ch.quantity ?? rec.quantity),
unit_price: cleanNumber(ch.unit_price ?? rec.unit_price),
discount: cleanNumber(ch.discount ?? rec.discount),
total_amount: cleanNumber(ch.total_amount ?? rec.total_amount),
remarks: clean(ch.remarks ?? rec.remarks)
};
return fetch("/egbim/bbs/sales_results.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams(body)
});
})
).then(() => {
loadResults();
alert("저장되었습니다!");
});
}
});
/* ------------------------------------------------------
🔵 데이터 로드 + 합계
------------------------------------------------------ */
function loadResults() {
fetch("/egbim/bbs/sales_results.php?action=list")
.then(r => r.json())
.then(res => {
if (res.status === "ok") {
grid.records = res.records.map(r => ({
recid: r.seq_no,
...r
}));
updateSummary();
grid.refresh();
}
});
}
loadResults();
function updateSummary() {
let sumQty = 0, sumUnit = 0, sumDiscount = 0, sumTotal = 0;
grid.records.forEach(r => {
sumQty += Number(r.quantity || 0);
sumUnit += Number(r.unit_price || 0);
sumDiscount += Number(r.discount || 0);
sumTotal += Number(r.total_amount || 0);
});
grid.summary = [
{
recid: 'summary',
sales_date: '<span style="float:right;font-weight:bold;">합계</span>',
quantity: sumQty,
unit_price: sumUnit,
discount: sumDiscount,
total_amount: sumTotal,
w2ui: { summary: true }
}
];
grid.refresh();
}
</script>
<?php sales_layout_end(); ?>