commit
This commit is contained in:
36
index.php
Normal file
36
index.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
// /www/kngil/index.php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
// ---------------------------------
|
||||
// 1. 기본 상수
|
||||
// ---------------------------------
|
||||
define('ROOT', __DIR__);
|
||||
define('SKIN_PATH', ROOT.'/skin');
|
||||
|
||||
// ---------------------------------
|
||||
// 2. 페이지 결정
|
||||
// ---------------------------------
|
||||
$page = $_GET['page'] ?? 'index';
|
||||
|
||||
// 파일명 보안 필터
|
||||
$page = preg_replace('/[^a-zA-Z0-9_\-]/', '', $page);
|
||||
|
||||
// ---------------------------------
|
||||
// 3. skin 파일 매핑
|
||||
// ---------------------------------
|
||||
$viewFile = SKIN_PATH.'/'.$page.'.php';
|
||||
|
||||
// ---------------------------------
|
||||
// 4. 존재 여부 체크
|
||||
// ---------------------------------
|
||||
if (!is_file($viewFile)) {
|
||||
http_response_code(404);
|
||||
exit('404 NOT FOUND');
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
// 5. 화면 위임
|
||||
// ---------------------------------
|
||||
require $viewFile;
|
||||
24
kngil/.htaccess
Normal file
24
kngil/.htaccess
Normal file
@@ -0,0 +1,24 @@
|
||||
# --------------------------------------------------
|
||||
# 기본 보안 설정
|
||||
# --------------------------------------------------
|
||||
|
||||
# 디렉토리 목록 노출 방지
|
||||
Options -Indexes
|
||||
|
||||
# 기본 인덱스 파일 고정
|
||||
DirectoryIndex index.php
|
||||
|
||||
# 서버 정보 노출 방지
|
||||
ServerSignature Off
|
||||
|
||||
# --------------------------------------------------
|
||||
# 민감 파일 직접 접근 차단
|
||||
# --------------------------------------------------
|
||||
<FilesMatch "\.(env|ini|log|sql|bak|sh|inc)$">
|
||||
Require all denied
|
||||
</FilesMatch>
|
||||
|
||||
# --------------------------------------------------
|
||||
# PHP 설정 (가능한 경우)
|
||||
# --------------------------------------------------
|
||||
php_flag display_errors Off
|
||||
39
kngil/auth/oauth-callback.php
Normal file
39
kngil/auth/oauth-callback.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
// /auth/oauth-callback.php
|
||||
|
||||
$code = $_POST['code'] ?? null;
|
||||
|
||||
if (!$code) {
|
||||
echo 'Invalid callback';
|
||||
exit;
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>로그인 처리중...</title>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
fetch('/api/auth/verify-login.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
credentials: 'include',
|
||||
body: JSON.stringify({
|
||||
code: <?= json_encode($code) ?>
|
||||
})
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(result => {
|
||||
if (window.opener) {
|
||||
window.opener.postMessage({
|
||||
type: result.status === 'success' ? 'LOGIN_SUCCESS' : 'LOGIN_FAIL',
|
||||
payload: result.user || result.message
|
||||
}, location.origin);
|
||||
}
|
||||
window.close();
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
1
kngil/bbs/.htaccess
Normal file
1
kngil/bbs/.htaccess
Normal file
@@ -0,0 +1 @@
|
||||
Options -Indexes
|
||||
165
kngil/bbs/adm.php
Normal file
165
kngil/bbs/adm.php
Normal file
@@ -0,0 +1,165 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =================================================
|
||||
0. 로그인 / 권한 체크
|
||||
================================================= */
|
||||
if (!isset($_SESSION['login'])) {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '로그인이 필요합니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$auth = $_SESSION['login']['auth_bc'] ?? '';
|
||||
|
||||
if (!in_array($auth, ['BS100100', 'BS100200'])) {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '접근 권한이 없습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
공통 입력
|
||||
================================================= */
|
||||
$input = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
$action = $_GET['action'] ?? $input['action'] ?? 'list';
|
||||
|
||||
try {
|
||||
|
||||
switch ($action) {
|
||||
|
||||
case 'user_list':
|
||||
|
||||
// 🔥 상단에서 선택한 회사
|
||||
$target_member_id = $_GET['member_id'] ?? '';
|
||||
|
||||
if (!$target_member_id) {
|
||||
throw new Exception('member_id 누락');
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.sp_users_r(
|
||||
:member_id,
|
||||
'',
|
||||
'',
|
||||
''
|
||||
)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':member_id' => $target_member_id
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
foreach ($rows as $i => &$r) {
|
||||
$r['recid'] = $i + 1;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'records' => $rows
|
||||
]);
|
||||
break;
|
||||
|
||||
/* =================================================
|
||||
1. 통합 회원 목록 조회
|
||||
- 모든 회사(member) 조회
|
||||
================================================= */
|
||||
case 'list':
|
||||
|
||||
$sql = "SELECT * FROM kngil.sp_member_sys_r('', '', '');";
|
||||
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$i = 1;
|
||||
foreach ($rows as &$r) {
|
||||
$r['recid'] = $i++;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'records' => $rows
|
||||
]);
|
||||
break;
|
||||
|
||||
/* =================================================
|
||||
2. 회원 정보 수정 (회사 단위)
|
||||
- tel / email / 사업자번호 / 회사명
|
||||
================================================= */
|
||||
case 'save':
|
||||
|
||||
$updates = $input['updates'] ?? [];
|
||||
if (!$updates) {
|
||||
throw new Exception('저장할 데이터가 없습니다.');
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
$stmtU = $pdo->prepare("
|
||||
SELECT kngil.sp_member_sys_u(
|
||||
:member_id::varchar,
|
||||
:tel_no::varchar,
|
||||
:email::varchar,
|
||||
:bs_no::varchar,
|
||||
:co_nm::varchar,
|
||||
:mid::varchar
|
||||
) AS result
|
||||
");
|
||||
|
||||
foreach ($updates as $r) {
|
||||
|
||||
if (empty($r['member_id'])) {
|
||||
throw new Exception('member_id 누락');
|
||||
}
|
||||
|
||||
$stmtU->execute([
|
||||
':member_id' => $r['member_id'],
|
||||
':tel_no' => $r['tel_no'] ?? null,
|
||||
':email' => $r['email'] ?? null,
|
||||
':bs_no' => $r['bs_no'] ?? null,
|
||||
':co_nm' => $r['co_nm'] ?? null,
|
||||
':mid' => $_SESSION['login']['user_id']
|
||||
]);
|
||||
|
||||
$result = $stmtU->fetchColumn();
|
||||
|
||||
if (strpos($result, 'ERROR') === 0) {
|
||||
throw new Exception($result);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success'
|
||||
]);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception('Invalid action');
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
261
kngil/bbs/adm_comp copy.php
Normal file
261
kngil/bbs/adm_comp copy.php
Normal file
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
로그인 / 권한 가드
|
||||
========================= */
|
||||
require_once __DIR__ . '/adm_guard.php';
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
세션 기준 값 (중요)
|
||||
========================= */
|
||||
$login = $_SESSION['login'];
|
||||
$auth_bc = $login['auth_bc']; // 권한코드
|
||||
$member_id = $login['member_id']; // 회사ID
|
||||
|
||||
/* =========================
|
||||
입력
|
||||
========================= */
|
||||
$input = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
$action = $_GET['action'] ?? $input['action'] ?? 'list';
|
||||
|
||||
/* =========================
|
||||
권한 플래그
|
||||
========================= */
|
||||
$isAdmin = in_array($auth_bc, ['BS100100','BS100200','BS100300'], true);
|
||||
|
||||
try {
|
||||
|
||||
switch ($action) {
|
||||
|
||||
/* =========================
|
||||
0. 공통코드 조회 (콤보)
|
||||
========================= */
|
||||
case 'base_code':
|
||||
|
||||
$main_cd = $_GET['main_cd'] ?? $input['main_cd'] ?? '';
|
||||
|
||||
if (!$main_cd) {
|
||||
throw new Exception('main_cd가 필요합니다.');
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.fn_base_cd(:main_cd)
|
||||
");
|
||||
$stmt->execute([
|
||||
':main_cd' => $main_cd
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'items' => $rows // [{id, text}]
|
||||
]);
|
||||
break;
|
||||
|
||||
|
||||
/* =========================
|
||||
1. 사용자 목록 조회
|
||||
========================= */
|
||||
case 'list':
|
||||
|
||||
$schType = $_GET['sch_type'] ?? '';
|
||||
$schKeyword = $_GET['sch_keyword'] ?? '';
|
||||
$schUseYn = $_GET['sch_use_yn'] ?? '';
|
||||
|
||||
// 기본값
|
||||
$sch_id = '';
|
||||
$sch_nm = '';
|
||||
$sch_dept = '';
|
||||
|
||||
if ($schKeyword !== '') {
|
||||
switch ($schType) {
|
||||
case 'id':
|
||||
$sch_id = $schKeyword;
|
||||
break;
|
||||
case 'name':
|
||||
$sch_nm = $schKeyword;
|
||||
break;
|
||||
case 'dept':
|
||||
$sch_dept = $schKeyword;
|
||||
break;
|
||||
|
||||
default: // 전체
|
||||
$sch_id = $schKeyword;
|
||||
$sch_nm = $schKeyword;
|
||||
$sch_dept = $schKeyword;
|
||||
}
|
||||
}
|
||||
|
||||
$sql = "
|
||||
SELECT *
|
||||
FROM kngil.sp_users_r(
|
||||
:member_id,
|
||||
:user_nm,
|
||||
:dept_nm,
|
||||
:use_yn
|
||||
);
|
||||
";
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_nm' => $_GET['user_nm'] ?? '',
|
||||
':dept_nm' => $_GET['dept_nm'] ?? '',
|
||||
':use_yn' => $_GET['use_yn'] ?? ''
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$i = 1;
|
||||
foreach ($rows as &$r) {
|
||||
$r['recid'] = $i++;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'member_id' => $member_id,
|
||||
'records' => $rows
|
||||
]);
|
||||
break;
|
||||
|
||||
|
||||
/* =========================
|
||||
2. 사용자 저장
|
||||
========================= */
|
||||
case 'save':
|
||||
|
||||
$inserts = $input['inserts'] ?? [];
|
||||
$updates = $input['updates'] ?? [];
|
||||
|
||||
if (!$inserts && !$updates) {
|
||||
throw new Exception('저장할 데이터가 없습니다.');
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// INSERT
|
||||
if ($inserts) {
|
||||
$stmtI = $pdo->prepare("
|
||||
SELECT kngil.sp_users_i(
|
||||
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
|
||||
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:cid
|
||||
)
|
||||
");
|
||||
|
||||
foreach ($inserts as $r) {
|
||||
$stmtI->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $r['user_id'],
|
||||
':user_pw' => $r['user_pw'] ?? '0000',
|
||||
':user_nm' => $r['user_nm'],
|
||||
':dept_nm' => $r['dept_nm'],
|
||||
':posit_nm' => $r['posit_nm'] ?? '',
|
||||
':tel_no' => $r['tel_no'],
|
||||
':email' => $r['email'],
|
||||
':auth_bc' => $r['auth_bc'],
|
||||
':use_yn' => $r['use_yn'],
|
||||
':rmks' => $r['rmks'] ?? '',
|
||||
':cid' => $r['cid'] ?? 'SYSTEM'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// UPDATE
|
||||
if ($updates) {
|
||||
$stmtU = $pdo->prepare("
|
||||
SELECT kngil.sp_users_u(
|
||||
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
|
||||
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:mid
|
||||
)
|
||||
");
|
||||
|
||||
foreach ($updates as $r) {
|
||||
$stmtU->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $r['user_id'],
|
||||
':user_pw' => null,
|
||||
':user_nm' => $r['user_nm'],
|
||||
':dept_nm' => $r['dept_nm'],
|
||||
':posit_nm' => $r['posit_nm'] ?? '',
|
||||
':tel_no' => $r['tel_no'],
|
||||
':email' => $r['email'],
|
||||
':auth_bc' => $r['auth_bc'],
|
||||
':use_yn' => $r['use_yn'],
|
||||
':rmks' => $r['rmks'] ?? '',
|
||||
':mid' => $r['mid'] ?? 'SYSTEM'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode(['status'=>'success']);
|
||||
break;
|
||||
|
||||
|
||||
|
||||
/* =========================
|
||||
3. 사용자 삭제 (비활성)
|
||||
========================= */
|
||||
case 'delete':
|
||||
|
||||
$ids = $input['ids'] ?? [];
|
||||
if (!$ids) throw new Exception('삭제 대상이 없습니다.');
|
||||
|
||||
$sql = "SELECT kngil.sp_users_d(:member_id, :user_id)";
|
||||
$stmt = $pdo->prepare($sql);
|
||||
|
||||
foreach ($ids as $uid) {
|
||||
$stmt->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $uid
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode(['status'=>'success']);
|
||||
break;
|
||||
/* =========================
|
||||
4. 회원 총 구매 면적 조회
|
||||
========================= */
|
||||
case 'total_area':
|
||||
|
||||
$sql = "
|
||||
SELECT COALESCE(SUM(sum_area), 0) AS total_area
|
||||
FROM kngil.sp_buy_item_history_r(:member_id, '', NULL, NULL)
|
||||
";
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute([
|
||||
':member_id' => $member_id
|
||||
]);
|
||||
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'member_id' => $member_id,
|
||||
'total_area' => (int)$row['total_area']
|
||||
]);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception('잘못된 요청');
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
393
kngil/bbs/adm_comp.php
Normal file
393
kngil/bbs/adm_comp.php
Normal file
@@ -0,0 +1,393 @@
|
||||
<?php
|
||||
ini_set('display_errors', 0);
|
||||
error_reporting(0);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
로그인 / 권한 가드
|
||||
========================= */
|
||||
require_once __DIR__ . '/adm_guard.php';
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
세션 기준 값
|
||||
========================= */
|
||||
$login = $_SESSION['login'];
|
||||
$auth_bc = $login['auth_bc']; // 권한코드
|
||||
$member_id = $login['member_id']; // 회사ID
|
||||
$user_id = $login['user_id'] ?? 'SYSTEM';
|
||||
|
||||
/* =========================
|
||||
권한 정의 (단순화 버전)
|
||||
========================= */
|
||||
$isAdmin = in_array(
|
||||
$auth_bc,
|
||||
['BS100100','BS100200','BS100300','BS100400'],
|
||||
true
|
||||
);
|
||||
|
||||
/* =========================
|
||||
입력
|
||||
========================= */
|
||||
$input = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
$action = $_GET['action'] ?? $input['action'] ?? 'list';
|
||||
|
||||
try {
|
||||
|
||||
switch ($action) {
|
||||
|
||||
/* =========================
|
||||
0. 공통코드 조회
|
||||
========================= */
|
||||
case 'base_code':
|
||||
|
||||
$main_cd = $_GET['main_cd'] ?? $input['main_cd'] ?? '';
|
||||
if (!$main_cd) {
|
||||
throw new Exception('main_cd가 필요합니다.');
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.fn_base_cd(:main_cd)
|
||||
");
|
||||
$stmt->execute([':main_cd' => $main_cd]);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'items' => $stmt->fetchAll(PDO::FETCH_ASSOC)
|
||||
]);
|
||||
break;
|
||||
|
||||
/* =========================
|
||||
1. 사용자 목록 조회
|
||||
========================= */
|
||||
case 'list':
|
||||
|
||||
// 조회 대상 member_id 결정
|
||||
$target_member_id = $member_id; // 기본: 세션 기준
|
||||
|
||||
// 관리자 / 개발자만 GET member_id 허용
|
||||
if ($isAdmin && !empty($_GET['member_id'])) {
|
||||
$target_member_id = $_GET['member_id'];
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.sp_users_r(
|
||||
:member_id,
|
||||
:user_nm,
|
||||
:dept_nm,
|
||||
:use_yn
|
||||
)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':member_id' => $target_member_id,
|
||||
':user_nm' => $_GET['user_nm'] ?? '',
|
||||
':dept_nm' => $_GET['dept_nm'] ?? '',
|
||||
':use_yn' => $_GET['use_yn'] ?? ''
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
foreach ($rows as $i => &$r) {
|
||||
$r['recid'] = $i + 1;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'member_id' => $target_member_id,
|
||||
'records' => $rows
|
||||
]);
|
||||
break;
|
||||
|
||||
/* =========================
|
||||
2. 사용자 저장
|
||||
========================= */
|
||||
case 'save':
|
||||
|
||||
if (!$isAdmin) {
|
||||
throw new Exception('저장 권한이 없습니다.');
|
||||
}
|
||||
|
||||
$inserts = $input['inserts'] ?? [];
|
||||
$updates = $input['updates'] ?? [];
|
||||
|
||||
if (!$inserts && !$updates) {
|
||||
throw new Exception('저장할 데이터가 없습니다.');
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
/* ---------- INSERT ---------- */
|
||||
if ($inserts) {
|
||||
|
||||
$stmtI = $pdo->prepare("
|
||||
SELECT kngil.sp_users_i(
|
||||
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
|
||||
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:cid
|
||||
)
|
||||
");
|
||||
|
||||
foreach ($inserts as $r) {
|
||||
$stmtI->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $r['user_id'],
|
||||
':user_pw' => $r['user_pw'] ?? '0000',
|
||||
':user_nm' => $r['user_nm'],
|
||||
':dept_nm' => $r['dept_nm'],
|
||||
':posit_nm' => $r['posit_nm'] ?? '',
|
||||
':tel_no' => $r['tel_no'],
|
||||
':email' => $r['email'],
|
||||
':auth_bc' => is_array($r['auth_bc'])
|
||||
? ($r['auth_bc']['id'] ?? '')
|
||||
: $r['auth_bc'],
|
||||
':use_yn' => is_array($r['use_yn'])
|
||||
? ($r['use_yn']['id'] ?? 'Y')
|
||||
: $r['use_yn'],
|
||||
':rmks' => $r['rmks'] ?? '',
|
||||
':cid' => $user_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------- UPDATE ---------- */
|
||||
if ($updates) {
|
||||
|
||||
$stmtChk = $pdo->prepare("
|
||||
SELECT 1
|
||||
FROM kngil.users
|
||||
WHERE member_id = :member_id
|
||||
AND user_id = :user_id
|
||||
");
|
||||
|
||||
$stmtU = $pdo->prepare("
|
||||
SELECT kngil.sp_users_u(
|
||||
:member_id,:user_id,NULL,:user_nm,:dept_nm,
|
||||
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:mid
|
||||
)
|
||||
");
|
||||
|
||||
foreach ($updates as $r) {
|
||||
|
||||
// 회사 탈출 방지
|
||||
$stmtChk->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $r['user_id']
|
||||
]);
|
||||
|
||||
if (!$stmtChk->fetchColumn()) {
|
||||
throw new Exception('권한 없는 사용자 수정 시도');
|
||||
}
|
||||
|
||||
$stmtU->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $r['user_id'],
|
||||
':user_nm' => $r['user_nm'],
|
||||
':dept_nm' => $r['dept_nm'],
|
||||
':posit_nm' => $r['posit_nm'] ?? '',
|
||||
':tel_no' => $r['tel_no'],
|
||||
':email' => $r['email'],
|
||||
':auth_bc' => $r['auth_bc'],
|
||||
':use_yn' => $r['use_yn'],
|
||||
':rmks' => $r['rmks'] ?? '',
|
||||
':mid' => $user_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode(['status' => 'success']);
|
||||
break;
|
||||
|
||||
/* =========================
|
||||
3. 사용자 삭제 (비활성)
|
||||
========================= */
|
||||
case 'delete':
|
||||
|
||||
if (!$isAdmin) {
|
||||
throw new Exception('삭제 권한이 없습니다.');
|
||||
}
|
||||
|
||||
$ids = $input['ids'] ?? [];
|
||||
if (!$ids) {
|
||||
throw new Exception('삭제 대상이 없습니다.');
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.sp_users_d(:member_id, :user_id)
|
||||
");
|
||||
|
||||
foreach ($ids as $uid) {
|
||||
$stmt->execute([
|
||||
':member_id' => $member_id,
|
||||
':user_id' => $uid
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode(['status' => 'success']);
|
||||
break;
|
||||
|
||||
/* =========================
|
||||
4. 회원 총 구매 면적
|
||||
========================= */
|
||||
case 'total_area':
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT COALESCE(SUM(sum_area),0)
|
||||
FROM kngil.sp_buy_item_history_r(:member_id, '', NULL, NULL)
|
||||
");
|
||||
$stmt->execute([':member_id' => $member_id]);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'total_area' => (int)$stmt->fetchColumn()
|
||||
]);
|
||||
break;
|
||||
|
||||
/* =========================
|
||||
5. CSV 일괄 계정생성
|
||||
========================= */
|
||||
|
||||
|
||||
case 'bulk_create':
|
||||
|
||||
if (!$isAdmin) {
|
||||
throw new Exception('일괄 생성 권한이 없습니다.');
|
||||
}
|
||||
|
||||
$target_member_id = $input['member_id'] ?? '';
|
||||
$csv_url = $input['csv_url'] ?? '';
|
||||
|
||||
if (!$target_member_id || !$csv_url) {
|
||||
throw new Exception('필수 파라미터 누락');
|
||||
}
|
||||
|
||||
// CSV 다운로드
|
||||
$csv = @file_get_contents($csv_url);
|
||||
if ($csv === false) {
|
||||
throw new Exception('CSV 파일을 불러올 수 없습니다.');
|
||||
}
|
||||
|
||||
$lines = array_map('str_getcsv', explode("\n", trim($csv)));
|
||||
|
||||
// 헤더 제거 (첫 줄)
|
||||
array_shift($lines);
|
||||
|
||||
$success = 0;
|
||||
$fail = 0;
|
||||
$errors = [];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.sp_users_i(
|
||||
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
|
||||
'',:tel_no,:email,:auth_bc,:use_yn,'',
|
||||
:cid
|
||||
)
|
||||
");
|
||||
|
||||
foreach ($lines as $i => $row) {
|
||||
|
||||
if (count($row) < 8) {
|
||||
$fail++;
|
||||
$errors[] = "라인 ".($i+2).": 컬럼 수 부족";
|
||||
continue;
|
||||
}
|
||||
|
||||
[
|
||||
$user_id,
|
||||
$user_pw,
|
||||
$user_nm,
|
||||
$tel_no,
|
||||
$email,
|
||||
$dept_nm,
|
||||
$use_txt,
|
||||
$auth_txt
|
||||
] = array_map('trim', $row);
|
||||
|
||||
/* ---------- 값 정규화 ---------- */
|
||||
|
||||
$use_yn = 'Y'; // 항상 사용
|
||||
$auth_bc = 'BS100500'; // 일반 권한
|
||||
|
||||
/* ---------- 중복 체크 ---------- */
|
||||
|
||||
// ID 중복 (대소문자 무시)
|
||||
$chk = $pdo->prepare("
|
||||
SELECT 1 FROM kngil.users
|
||||
WHERE LOWER(user_id) = LOWER(:uid)
|
||||
");
|
||||
$chk->execute([':uid' => $user_id]);
|
||||
if ($chk->fetchColumn()) {
|
||||
$fail++;
|
||||
$errors[] = "라인 ".($i+2).": ID 중복 ($user_id)";
|
||||
continue;
|
||||
}
|
||||
|
||||
// 전화번호 중복
|
||||
$chk = $pdo->prepare("
|
||||
SELECT 1 FROM kngil.users
|
||||
WHERE tel_no = :tel
|
||||
");
|
||||
$chk->execute([':tel' => $tel_no]);
|
||||
if ($chk->fetchColumn()) {
|
||||
$fail++;
|
||||
$errors[] = "라인 ".($i+2).": 연락처 중복 ($tel_no)";
|
||||
continue;
|
||||
}
|
||||
|
||||
/* ---------- 프로시저 호출 ---------- */
|
||||
try {
|
||||
$stmt->execute([
|
||||
':member_id' => $target_member_id,
|
||||
':user_id' => $user_id,
|
||||
':user_pw' => $user_pw ?: '0000',
|
||||
':user_nm' => $user_nm,
|
||||
':dept_nm' => $dept_nm,
|
||||
':tel_no' => $tel_no,
|
||||
':email' => $email,
|
||||
':auth_bc' => $auth_bc,
|
||||
':use_yn' => $use_yn,
|
||||
':cid' => $user_id // 생성자
|
||||
]);
|
||||
$result = $stmt->fetchColumn(); // ⭐ 필수
|
||||
|
||||
if ($result !== 'SUCCESS') {
|
||||
$fail++;
|
||||
$errors[] = "라인 ".($i+2).": ".$result;
|
||||
continue;
|
||||
}
|
||||
|
||||
$success++;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$fail++;
|
||||
$errors[] = "라인 ".($i+2).": ".$e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'success_cnt' => $success,
|
||||
'fail_cnt' => $fail,
|
||||
'errors' => $errors
|
||||
]);
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
throw new Exception('잘못된 요청');
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
http_response_code(403);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
27
kngil/bbs/adm_faq_popup.php
Normal file
27
kngil/bbs/adm_faq_popup.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
// 1. DB 연결 (절대 경로 혹은 상대 경로 확인)
|
||||
require_once 'db_conn.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
try {
|
||||
// 2. 프로시저 호출 (컬럼명: itm_cd, itm_nm, area, itm_amt 등)
|
||||
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_fa_comments_r()");
|
||||
$stmt->execute();
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 3. W2UI를 위해 각 행에 'recid' 필드 강제 주입
|
||||
$records = [];
|
||||
foreach ($rows as $row) {
|
||||
$row['recid'] = $row['fa_id']; // 상품코드를 고유 키로 지정
|
||||
$records[] = $row;
|
||||
}
|
||||
|
||||
// 4. 순수 JSON만 출력 (다른 echo나 공백이 섞이면 에러 발생)
|
||||
echo json_encode($records);
|
||||
|
||||
} catch (PDOException $e) {
|
||||
// 에러 발생 시 그리드가 이해할 수 있게 JSON으로 출력
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
58
kngil/bbs/adm_faq_popup_delete.php
Normal file
58
kngil/bbs/adm_faq_popup_delete.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
로그인 / 권한 가드
|
||||
========================= */
|
||||
require_once __DIR__ . '/adm_guard.php';
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
세션 기준 값
|
||||
========================= */
|
||||
$login = $_SESSION['login'];
|
||||
$auth_bc = $login['auth_bc']; // 권한코드
|
||||
$member_id = $login['member_id']; // 회사ID
|
||||
$user_id = $login['user_id'] ?? 'SYSTEM';
|
||||
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
// JSON 데이터 읽기
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
try {
|
||||
// 2. $pdo 변수가 있는지 확인 (DB 연결 확인)
|
||||
if (!isset($pdo)) {
|
||||
throw new Exception('데이터베이스 연결 설정($pdo)을 찾을 수 없습니다.');
|
||||
}
|
||||
|
||||
$ids = $input['ids'] ?? [];
|
||||
if (empty($ids)) {
|
||||
throw new Exception('삭제 대상이 없습니다.');
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// 3. 삭제 실행
|
||||
$stmt = $pdo->prepare("SELECT kngil.sp_fa_comments_d(:fa_id)");
|
||||
|
||||
foreach ($ids as $code) {
|
||||
$stmt->execute([':fa_id' => $code]);
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode(['status' => 'success']);
|
||||
|
||||
} catch (Exception $e) {
|
||||
if (isset($pdo) && $pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
// 기존 출력물 제거 후 깨끗한 JSON만 출력
|
||||
if (ob_get_length()) ob_clean();
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
94
kngil/bbs/adm_faq_popup_save.php
Normal file
94
kngil/bbs/adm_faq_popup_save.php
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
로그인 / 권한 가드
|
||||
========================= */
|
||||
require_once __DIR__ . '/adm_guard.php';
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
세션 기준 값
|
||||
========================= */
|
||||
$login = $_SESSION['login'];
|
||||
$auth_bc = $login['auth_bc']; // 권한코드
|
||||
$member_id = $login['member_id']; // 회사ID
|
||||
$user_id = $login['user_id'] ?? 'SYSTEM';
|
||||
|
||||
|
||||
/* =========================
|
||||
입력
|
||||
========================= */
|
||||
$input = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
$action = $_GET['action'] ?? $input['action'] ?? 'list';
|
||||
|
||||
try {
|
||||
|
||||
switch ($action) {
|
||||
|
||||
case 'save':
|
||||
// $isAdmin 에러를 방지하기 위해 잠시 주석 처리하거나 true로 설정
|
||||
// if (!$isAdmin) throw new Exception('권한이 없습니다.');
|
||||
|
||||
$inserts = $input['inserts'] ?? [];
|
||||
$updates = $input['updates'] ?? [];
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
/* ---------- 신규 추가(INSERT) ---------- */
|
||||
if ($inserts) {
|
||||
// 호출 시 파라미터 개수와 이름을 정확히 맞춤
|
||||
$stmtI = $pdo->prepare("SELECT kngil.sp_fa_comments_i(:fa_subject, :fa_content, :sq_no, :use_yn, :cid)");
|
||||
|
||||
foreach ($inserts as $r) {
|
||||
$stmtI->execute([
|
||||
':fa_subject' => $r['fa_subject'] ?? '', // 데이터가 없으면 빈 글자라도 보냄
|
||||
':fa_content' => $r['fa_content'] ?? '',
|
||||
':sq_no' => $r['sq_no'] ?? 0,
|
||||
':use_yn' => $r['use_yn'] ?? 'Y',
|
||||
':cid' => $user_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------- 수정(UPDATE) ---------- */
|
||||
if ($updates) {
|
||||
$stmtU = $pdo->prepare("SELECT kngil.sp_fa_comments_u(:fa_id, :fa_subject, :fa_content, :sq_no, :use_yn, :mid)");
|
||||
|
||||
foreach ($updates as $r) {
|
||||
$stmtU->execute([
|
||||
':fa_id' => $r['fa_id'] ?? '',
|
||||
':fa_subject' => $r['fa_subject'] ?? '', // 데이터가 없으면 빈 글자라도 보냄
|
||||
':fa_content' => $r['fa_content'] ?? '',
|
||||
':sq_no' => $r['sq_no'] ?? 0,
|
||||
':use_yn' => $r['use_yn'] ?? 'Y',
|
||||
':mid' => $user_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode(['status' => 'success']);
|
||||
break;
|
||||
default:
|
||||
throw new Exception('잘못된 요청');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
catch (Exception $e) {
|
||||
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
http_response_code(403);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
36
kngil/bbs/adm_guard.php
Normal file
36
kngil/bbs/adm_guard.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
/* =========================
|
||||
1. 로그인 체크
|
||||
========================= */
|
||||
if (empty($_SESSION['login'])) {
|
||||
header('Location: /kngil/skin/index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
2. 권한 체크
|
||||
========================= */
|
||||
$auth_bc = $_SESSION['login']['auth_bc'] ?? '';
|
||||
|
||||
$ALLOW_AUTH = [
|
||||
'BS100100', // 개발자
|
||||
'BS100200', // 관리자
|
||||
'BS100300', // 메인
|
||||
'BS100400', // 서브
|
||||
];
|
||||
|
||||
if (!in_array($auth_bc, $ALLOW_AUTH, true)) {
|
||||
http_response_code(403);
|
||||
echo '접근 권한이 없습니다.';
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
3. 권한 플래그 (중요)
|
||||
========================= */
|
||||
define('IS_SUPER_ADMIN', in_array($auth_bc, ['BS100100','BS100200'], true));
|
||||
define('IS_COMPANY_ADMIN', in_array($auth_bc, ['BS100300','BS100400'], true));
|
||||
27
kngil/bbs/adm_product_popup.php
Normal file
27
kngil/bbs/adm_product_popup.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
// 1. DB 연결 (절대 경로 혹은 상대 경로 확인)
|
||||
require_once 'db_conn.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
try {
|
||||
// 2. 프로시저 호출 (컬럼명: itm_cd, itm_nm, area, itm_amt 등)
|
||||
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_item_r()");
|
||||
$stmt->execute();
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 3. W2UI를 위해 각 행에 'recid' 필드 강제 주입
|
||||
$records = [];
|
||||
foreach ($rows as $row) {
|
||||
$row['recid'] = $row['itm_cd']; // 상품코드를 고유 키로 지정
|
||||
$records[] = $row;
|
||||
}
|
||||
|
||||
// 4. 순수 JSON만 출력 (다른 echo나 공백이 섞이면 에러 발생)
|
||||
echo json_encode($records);
|
||||
|
||||
} catch (PDOException $e) {
|
||||
// 에러 발생 시 그리드가 이해할 수 있게 JSON으로 출력
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
58
kngil/bbs/adm_product_popup_delete.php
Normal file
58
kngil/bbs/adm_product_popup_delete.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
로그인 / 권한 가드
|
||||
========================= */
|
||||
require_once __DIR__ . '/adm_guard.php';
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
세션 기준 값
|
||||
========================= */
|
||||
$login = $_SESSION['login'];
|
||||
$auth_bc = $login['auth_bc']; // 권한코드
|
||||
$member_id = $login['member_id']; // 회사ID
|
||||
$user_id = $login['user_id'] ?? 'SYSTEM';
|
||||
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
// JSON 데이터 읽기
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
try {
|
||||
// 2. $pdo 변수가 있는지 확인 (DB 연결 확인)
|
||||
if (!isset($pdo)) {
|
||||
throw new Exception('데이터베이스 연결 설정($pdo)을 찾을 수 없습니다.');
|
||||
}
|
||||
|
||||
$ids = $input['ids'] ?? [];
|
||||
if (empty($ids)) {
|
||||
throw new Exception('삭제 대상이 없습니다.');
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// 3. 삭제 실행
|
||||
$stmt = $pdo->prepare("SELECT kngil.sp_item_d(:itm_cd)");
|
||||
|
||||
foreach ($ids as $code) {
|
||||
$stmt->execute([':itm_cd' => $code]);
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode(['status' => 'success']);
|
||||
|
||||
} catch (Exception $e) {
|
||||
if (isset($pdo) && $pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
// 기존 출력물 제거 후 깨끗한 JSON만 출력
|
||||
if (ob_get_length()) ob_clean();
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
97
kngil/bbs/adm_product_popup_save.php
Normal file
97
kngil/bbs/adm_product_popup_save.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
로그인 / 권한 가드
|
||||
========================= */
|
||||
require_once __DIR__ . '/adm_guard.php';
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
세션 기준 값
|
||||
========================= */
|
||||
$login = $_SESSION['login'];
|
||||
$auth_bc = $login['auth_bc']; // 권한코드
|
||||
$member_id = $login['member_id']; // 회사ID
|
||||
$user_id = $login['user_id'] ?? 'SYSTEM';
|
||||
|
||||
|
||||
/* =========================
|
||||
입력
|
||||
========================= */
|
||||
$input = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
$action = $_GET['action'] ?? $input['action'] ?? 'list';
|
||||
|
||||
try {
|
||||
|
||||
switch ($action) {
|
||||
|
||||
case 'save':
|
||||
// $isAdmin 에러를 방지하기 위해 잠시 주석 처리하거나 true로 설정
|
||||
// if (!$isAdmin) throw new Exception('권한이 없습니다.');
|
||||
|
||||
$inserts = $input['inserts'] ?? [];
|
||||
$updates = $input['updates'] ?? [];
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
/* ---------- 신규 추가(INSERT) ---------- */
|
||||
if ($inserts) {
|
||||
// 호출 시 파라미터 개수와 이름을 정확히 맞춤
|
||||
$stmtI = $pdo->prepare("SELECT kngil.sp_item_i(:itm_cd, :itm_nm, :area, :itm_amt, :use_yn, :rmks, :cid)");
|
||||
|
||||
foreach ($inserts as $r) {
|
||||
$stmtI->execute([
|
||||
':itm_cd' => $r['itm_cd'] ?? '', // 데이터가 없으면 빈 글자라도 보냄
|
||||
':itm_nm' => $r['itm_nm'] ?? '',
|
||||
':area' => $r['area'] ?? 0,
|
||||
':itm_amt' => $r['itm_amt'] ?? 0,
|
||||
':use_yn' => $r['use_yn'] ?? 'Y',
|
||||
':rmks' => $r['rmks'] ?? '',
|
||||
':cid' => $user_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------- 수정(UPDATE) ---------- */
|
||||
if ($updates) {
|
||||
$stmtU = $pdo->prepare("SELECT kngil.sp_item_u(:itm_cd, :itm_nm, :area, :itm_amt, :use_yn, :rmks, :mid)");
|
||||
|
||||
foreach ($updates as $r) {
|
||||
$stmtU->execute([
|
||||
':itm_cd' => $r['itm_cd'] ?? '',
|
||||
':itm_nm' => $r['itm_nm'] ?? '',
|
||||
':area' => $r['area'] ?? 0,
|
||||
':itm_amt' => $r['itm_amt'] ?? 0,
|
||||
':use_yn' => $r['use_yn'] ?? 'Y',
|
||||
':rmks' => $r['rmks'] ?? '',
|
||||
':mid' => $user_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
echo json_encode(['status' => 'success']);
|
||||
break;
|
||||
default:
|
||||
throw new Exception('잘못된 요청');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
catch (Exception $e) {
|
||||
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
http_response_code(403);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
45
kngil/bbs/adm_purch_popup.php
Normal file
45
kngil/bbs/adm_purch_popup.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
// 1. DB 연결
|
||||
require_once 'db_conn.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
try {
|
||||
// 클라이언트(JS)로부터 전달받은 검색 조건 (POST 또는 GET 방식에 맞춰 수정)
|
||||
$p_member_id = $_POST['member_id'] ?? '';
|
||||
$p_member_nm = $_POST['member_nm'] ?? '';
|
||||
|
||||
// 날짜가 빈 값('')으로 오면 반드시 null로 치환해야 PostgreSQL date 타입 에러가 안 납니다.
|
||||
$p_fbuy_dt = (!empty($_POST['fbuy_dt'])) ? $_POST['fbuy_dt'] : null;
|
||||
$p_tbuy_dt = (!empty($_POST['tbuy_dt'])) ? $_POST['tbuy_dt'] : null;
|
||||
|
||||
// 2. 프로시저 호출 - 파라미터 자리에 ?를 사용합니다.
|
||||
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_buy_item_history_r(?, ?, ?, ?)");
|
||||
|
||||
// 파라미터 순서대로 배열에 담아 실행합니다.
|
||||
$stmt->execute([
|
||||
$p_member_id,
|
||||
$p_member_nm,
|
||||
$p_fbuy_dt,
|
||||
$p_tbuy_dt
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 3. W2UI를 위해 각 행에 'recid' 필드 강제 주입
|
||||
$records = [];
|
||||
foreach ($rows as $row) {
|
||||
// 복합키(member_id + sp_no)를 조합하여 유일한 recid 생성
|
||||
$row['recid'] = $row['member_id'] . '_' . $row['sq_no'];
|
||||
$records[] = $row;
|
||||
}
|
||||
|
||||
// 4. 결과 출력
|
||||
echo json_encode($records);
|
||||
|
||||
} catch (PDOException $e) {
|
||||
// HTTP 상태 코드를 500으로 설정하여 클라이언트가 에러임을 인지하게 할 수 있습니다.
|
||||
http_response_code(500);
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
209
kngil/bbs/adm_service.php
Normal file
209
kngil/bbs/adm_service.php
Normal file
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once __DIR__ . '/db_conn.php';
|
||||
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
$action = $input['action'] ?? '';
|
||||
$member_id = $input['member_id'] ?? '';
|
||||
|
||||
if (!$action || !$member_id) {
|
||||
http_response_code(400);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '필수값 누락'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
/* =========================
|
||||
조회 (R)
|
||||
========================= */
|
||||
if ($action === 'list') {
|
||||
|
||||
$buy_date = $input['buy_date'] ?? '';
|
||||
if (!$buy_date) {
|
||||
throw new Exception('구매일 누락');
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.sp_buy_item_r(:member_id, :buy_date)
|
||||
");
|
||||
$stmt->execute([
|
||||
'member_id' => $member_id,
|
||||
'buy_date' => $buy_date
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$i = 1;
|
||||
foreach ($rows as &$r) {
|
||||
$r['recid'] = $i++;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'records' => $rows
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
즉시 삭제 (D)
|
||||
========================= */
|
||||
if ($action === 'delete') {
|
||||
|
||||
$sq_no = $input['sq_no'] ?? null;
|
||||
if (!$sq_no) {
|
||||
throw new Exception('삭제 대상 누락');
|
||||
}
|
||||
|
||||
$pdo->prepare("
|
||||
SELECT kngil.sp_buy_item_d(
|
||||
:member_id,
|
||||
:sq_no
|
||||
)
|
||||
")->execute([
|
||||
'member_id' => $member_id,
|
||||
'sq_no' => $sq_no
|
||||
]);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
저장 (C / U)
|
||||
========================= */
|
||||
if ($action === 'save') {
|
||||
|
||||
$buy_date = $input['buy_date'] ?? '';
|
||||
$items = $input['items'] ?? [];
|
||||
|
||||
if (!$buy_date) {
|
||||
throw new Exception('구매일 누락');
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
foreach ($items as $row) {
|
||||
|
||||
$end_dt = empty($row['end_dt']) ? null : $row['end_dt'];
|
||||
|
||||
// INSERT
|
||||
if (!empty($row['_new'])) {
|
||||
|
||||
$pdo->prepare("
|
||||
SELECT kngil.sp_buy_item_i(
|
||||
:member_id::character varying,
|
||||
:buy_dt::date,
|
||||
:itm_cd::character varying,
|
||||
:itm_qty::numeric,
|
||||
:itm_area::numeric,
|
||||
:add_area::numeric,
|
||||
(:itm_area + :add_area)::numeric,
|
||||
:itm_amt::numeric,
|
||||
:dis_rt::numeric,
|
||||
:buy_amt::numeric,
|
||||
:vat_amt::numeric,
|
||||
:sum_amt::numeric,
|
||||
:end_dt::date,
|
||||
:ok_yn::character varying,
|
||||
:rmks::character varying,
|
||||
:cid::character varying
|
||||
)
|
||||
")->execute([
|
||||
'member_id' => $member_id,
|
||||
'buy_dt' => $buy_date,
|
||||
'itm_cd' => $row['itm_cd'],
|
||||
'itm_qty' => $row['itm_qty'],
|
||||
'itm_area' => $row['itm_area'],
|
||||
'add_area' => $row['add_area'] ?? 0,
|
||||
'itm_amt' => $row['itm_amt'],
|
||||
'dis_rt' => $row['dis_rt'],
|
||||
'buy_amt' => $row['buy_amt'],
|
||||
'vat_amt' => $row['vat_amt'],
|
||||
'sum_amt' => $row['sum_amt'],
|
||||
'end_dt' => $end_dt,
|
||||
'ok_yn' => $row['ok_yn'],
|
||||
'rmks' => $row['rmks'] ?? '',
|
||||
'cid' => 'ADMIN'
|
||||
]);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// UPDATE
|
||||
if (!empty($row['_existing']) && !empty($row['sq_no'])) {
|
||||
|
||||
$pdo->prepare("
|
||||
SELECT kngil.sp_buy_item_u(
|
||||
:member_id::character varying,
|
||||
:sq_no::integer,
|
||||
:buy_dt::date,
|
||||
:itm_cd::character varying,
|
||||
:itm_qty::numeric,
|
||||
:itm_area::numeric,
|
||||
:add_area::numeric,
|
||||
(:itm_area + :add_area)::numeric,
|
||||
:itm_amt::numeric,
|
||||
:dis_rt::numeric,
|
||||
:buy_amt::numeric,
|
||||
:vat_amt::numeric,
|
||||
:sum_amt::numeric,
|
||||
:end_dt::date,
|
||||
:ok_yn::character varying,
|
||||
:rmks::character varying,
|
||||
:mid::character varying
|
||||
)
|
||||
")->execute([
|
||||
'member_id' => $member_id,
|
||||
'sq_no' => $row['sq_no'],
|
||||
'buy_dt' => $buy_date,
|
||||
'itm_cd' => $row['itm_cd'],
|
||||
'itm_qty' => $row['itm_qty'],
|
||||
'itm_area' => $row['itm_area'],
|
||||
'add_area' => $row['add_area'] ?? 0,
|
||||
'itm_amt' => $row['itm_amt'],
|
||||
'dis_rt' => $row['dis_rt'],
|
||||
'buy_amt' => $row['buy_amt'],
|
||||
'vat_amt' => $row['vat_amt'],
|
||||
'sum_amt' => $row['sum_amt'],
|
||||
'end_dt' => $end_dt,
|
||||
'ok_yn' => $row['ok_yn'],
|
||||
'rmks' => $row['rmks'] ?? '',
|
||||
'mid' => 'ADMIN'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
throw new Exception('Invalid action');
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
if ($pdo->inTransaction()) {
|
||||
$pdo->rollBack();
|
||||
}
|
||||
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
41
kngil/bbs/adm_use_history.php
Normal file
41
kngil/bbs/adm_use_history.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
// 1. DB 연결
|
||||
require_once 'db_conn.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
try {
|
||||
// JS의 URLSearchParams에서 보낸 키값과 일치시켜야 합니다.
|
||||
$p_member_id = $_POST['member_id'] ?? '';
|
||||
$p_user_nm = $_POST['user_nm'] ?? '';
|
||||
$p_dept_nm = $_POST['dept_nm'] ?? '';
|
||||
|
||||
// 2. 프로시저 호출
|
||||
// PostgreSQL 함수 호출 시 파라미터가 비어있으면 전체 조회가 되도록 설계됨
|
||||
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_use_history(?, ?, ?)");
|
||||
|
||||
$stmt->execute([
|
||||
$p_member_id,
|
||||
$p_user_nm,
|
||||
$p_dept_nm
|
||||
]);
|
||||
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 3. W2UI를 위해 각 행에 'recid' 필드 주입
|
||||
$records = [];
|
||||
foreach ($rows as $index => $row) {
|
||||
// user_id와 sq_no 조합으로 유일키 생성 (권장)
|
||||
// 만약 데이터가 없을 경우를 대비해 $index를 활용할 수도 있음
|
||||
$row['recid'] = ($row['user_id'] ?? 'unknown') . '_' . ($row['sq_no'] ?? $index);
|
||||
$records[] = $row;
|
||||
}
|
||||
|
||||
// 4. 결과 출력
|
||||
echo json_encode($records, JSON_UNESCAPED_UNICODE); // 한글 깨짐 방지
|
||||
|
||||
} catch (PDOException $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
13
kngil/bbs/db_conn.php
Normal file
13
kngil/bbs/db_conn.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
$dsn = "pgsql:host=172.16.9.44;port=5432;dbname=KNGIL";
|
||||
$user = "postgres";
|
||||
$pass = "erpteam1!";
|
||||
|
||||
try {
|
||||
$pdo = new PDO($dsn, $user, $pass, [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
|
||||
]);
|
||||
// echo "PostgreSQL 연결 성공 🎉";
|
||||
} catch (PDOException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
23
kngil/bbs/get_base_cd.php
Normal file
23
kngil/bbs/get_base_cd.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
require_once 'db_conn.php';
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// URL 파라미터로 group_id를 받습니다. (예: get_base_cd.php?group_id=BS210)
|
||||
$group_id = isset($_GET['group_id']) ? $_GET['group_id'] : '';
|
||||
|
||||
if (empty($group_id)) {
|
||||
echo json_encode([]);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
// 파라미터(? 처리)를 사용하여 보안을 강화하고 재사용성을 높입니다.
|
||||
$stmt = $pdo->prepare("SELECT id, text FROM kngil.fn_base_cd(?)");
|
||||
$stmt->execute([$group_id]);
|
||||
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode($items);
|
||||
} catch (PDOException $e) {
|
||||
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
160
kngil/bbs/join copy.php
Normal file
160
kngil/bbs/join copy.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$data = json_decode(file_get_contents('php://input'), true);
|
||||
$action = $data['action'] ?? '';
|
||||
|
||||
/* =================================================
|
||||
아이디 중복확인 (fn_user_id_check 사용)
|
||||
================================================= */
|
||||
if ($action === 'check_id') {
|
||||
|
||||
$userId = trim($data['userId'] ?? '');
|
||||
|
||||
if (!preg_match('/^[a-zA-Z][a-zA-Z0-9]{3,11}$/', $userId)) {
|
||||
echo json_encode([
|
||||
'available' => false,
|
||||
'message' => '아이디 형식 오류'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.fn_user_id_check(:user_id)
|
||||
");
|
||||
$stmt->execute([
|
||||
':user_id' => $userId
|
||||
]);
|
||||
|
||||
$result = trim($stmt->fetchColumn());
|
||||
|
||||
if (strpos($result, 'SUCCESS') === 0) {
|
||||
echo json_encode([
|
||||
'available' => true,
|
||||
'message' => '사용 가능한 아이디입니다.'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'available' => false,
|
||||
'message' => '이미 존재하는 아이디입니다.'
|
||||
]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/* =================================================
|
||||
1. 필수값 검증
|
||||
================================================= */
|
||||
$required = [
|
||||
'memberType', // 회원유형
|
||||
'userId',
|
||||
'password',
|
||||
'userName',
|
||||
'email',
|
||||
'phone'
|
||||
];
|
||||
|
||||
foreach ($required as $k) {
|
||||
if (empty($data[$k])) {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '필수 항목이 누락되었습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
2. 회원유형 → co_bc 매핑
|
||||
================================================= */
|
||||
/*
|
||||
기업회원 : '1'
|
||||
개인회원 : '2'
|
||||
→ 실제 코드값은 여기서 통제
|
||||
*/
|
||||
$co_bc = ($data['memberType'] === '1')
|
||||
? 'CB100100' // 기업
|
||||
: 'CB100200'; // 개인
|
||||
|
||||
/* =================================================
|
||||
3. 비밀번호 규칙 + 암호화
|
||||
================================================= */
|
||||
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*]).{12,}$/', $data['password'])) {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '비밀번호 규칙이 올바르지 않습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$hashedPw = password_hash($data['password'], PASSWORD_DEFAULT);
|
||||
|
||||
/* =================================================
|
||||
4. 이메일 형식
|
||||
================================================= */
|
||||
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '이메일 형식 오류'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
5. 프로시저 호출
|
||||
================================================= */
|
||||
try {
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.sp_member_i(
|
||||
:p_co_bc,
|
||||
:p_member_id,
|
||||
:p_user_pw,
|
||||
:p_member_nm,
|
||||
:p_email,
|
||||
:p_tel_no,
|
||||
:p_co_nm,
|
||||
:p_dept_nm,
|
||||
:p_cid
|
||||
) AS result
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':p_co_bc' => $co_bc,
|
||||
':p_member_id' => $data['userId'],
|
||||
':p_user_pw' => $hashedPw,
|
||||
':p_member_nm' => $data['userName'],
|
||||
':p_email' => $data['email'],
|
||||
':p_tel_no' => $data['phone'],
|
||||
':p_co_nm' => $data['company'] ?? null,
|
||||
':p_dept_nm' => $data['department'] ?? null,
|
||||
':p_cid' => $data['userId']
|
||||
]);
|
||||
|
||||
$result = $stmt->fetchColumn();
|
||||
|
||||
if ($result === 'SUCCESS') {
|
||||
echo json_encode([
|
||||
'success' => true
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '서버 오류'
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Invalid action'
|
||||
]);
|
||||
exit;
|
||||
203
kngil/bbs/join.php
Normal file
203
kngil/bbs/join.php
Normal file
@@ -0,0 +1,203 @@
|
||||
<?php
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
header('Content-Type: application/json');
|
||||
|
||||
/* =========================
|
||||
로그 함수
|
||||
========================= */
|
||||
function join_log($label, $data = null) {
|
||||
$logFile = $_SERVER['DOCUMENT_ROOT'].'/kngil/log/join.log';
|
||||
$time = date('Y-m-d H:i:s');
|
||||
|
||||
$log = "[$time] $label\n";
|
||||
if ($data !== null) {
|
||||
$log .= print_r($data, true);
|
||||
}
|
||||
$log .= "\n-----------------------------\n";
|
||||
|
||||
file_put_contents($logFile, $log, FILE_APPEND);
|
||||
}
|
||||
|
||||
/* =========================
|
||||
JSON 입력 파싱
|
||||
========================= */
|
||||
$raw = file_get_contents('php://input');
|
||||
$data = json_decode($raw, true);
|
||||
|
||||
join_log('RAW INPUT', $raw);
|
||||
join_log('PARSED DATA', $data);
|
||||
|
||||
$action = $data['action'] ?? null;
|
||||
join_log('ACTION', $action);
|
||||
|
||||
if (!$action) {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Invalid action'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
1. 아이디 중복확인
|
||||
================================================= */
|
||||
if ($action === 'check_id') {
|
||||
|
||||
$userId = trim($data['userId'] ?? '');
|
||||
join_log('CHECK_ID userId', $userId);
|
||||
|
||||
if (!preg_match('/^[a-zA-Z][a-zA-Z0-9]{3,11}$/', $userId)) {
|
||||
echo json_encode([
|
||||
'available' => false,
|
||||
'message' => '아이디 형식 오류'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.fn_user_id_check(:user_id)
|
||||
");
|
||||
$stmt->execute([':user_id' => $userId]);
|
||||
|
||||
$result = trim($stmt->fetchColumn());
|
||||
join_log('CHECK_ID RESULT', $result);
|
||||
|
||||
if (strpos($result, 'SUCCESS') === 0) {
|
||||
echo json_encode([
|
||||
'available' => true,
|
||||
'message' => '사용 가능한 아이디입니다.'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'available' => false,
|
||||
'message' => '이미 존재하는 아이디입니다.'
|
||||
]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
2. 회원가입
|
||||
================================================= */
|
||||
if ($action !== 'signup') {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Invalid action'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
3. 필수값 검증
|
||||
================================================= */
|
||||
$required = ['memberType','userId','password','userName','email','phone'];
|
||||
|
||||
foreach ($required as $k) {
|
||||
if (empty($data[$k])) {
|
||||
join_log('REQUIRED MISSING', $k);
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '필수 항목이 누락되었습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
4. 회원유형 → co_bc
|
||||
================================================= */
|
||||
$memberType = $data['memberType'] ?? '2';
|
||||
$co_bc = ($memberType === '1') ? 'CB100100' : 'CB100200';
|
||||
|
||||
join_log('co_bc', $co_bc);
|
||||
|
||||
/* =================================================
|
||||
5. 비밀번호 규칙 (8자)
|
||||
================================================= */
|
||||
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/', $data['password'])) {
|
||||
join_log('PASSWORD INVALID');
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '비밀번호 규칙이 올바르지 않습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$userPw = $data['password'];
|
||||
|
||||
/* =================================================
|
||||
6. 이메일 검증
|
||||
================================================= */
|
||||
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
|
||||
join_log('EMAIL INVALID', $data['email']);
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '이메일 형식 오류'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =================================================
|
||||
7. 프로시저 호출
|
||||
================================================= */
|
||||
try {
|
||||
|
||||
join_log('SIGNUP PARAMS', [
|
||||
'memberType' => $memberType,
|
||||
'userId' => $data['userId'],
|
||||
'userName' => $data['userName'],
|
||||
'email' => $data['email'],
|
||||
'phone' => $data['phone'],
|
||||
'company' => $data['company'] ?? null,
|
||||
'department' => $data['department'] ?? null,
|
||||
]);
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.sp_member_i(
|
||||
:p_co_bc,
|
||||
:p_member_id,
|
||||
:p_user_pw,
|
||||
:p_member_nm,
|
||||
:p_email,
|
||||
:p_tel_no,
|
||||
:p_co_nm,
|
||||
:p_dept_nm,
|
||||
:p_cid
|
||||
)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':p_co_bc' => $co_bc,
|
||||
':p_member_id' => $data['userId'],
|
||||
':p_user_pw' => $userPw,
|
||||
':p_member_nm' => $data['userName'],
|
||||
':p_email' => $data['email'],
|
||||
':p_tel_no' => $data['phone'],
|
||||
':p_co_nm' => $data['company'] ?? null,
|
||||
':p_dept_nm' => $data['department'] ?? null,
|
||||
':p_cid' => $data['userId']
|
||||
]);
|
||||
|
||||
$result = trim($stmt->fetchColumn());
|
||||
join_log('PROC RESULT', $result);
|
||||
|
||||
if ($result === 'SUCCESS') {
|
||||
join_log('SIGNUP SUCCESS', $data['userId']);
|
||||
echo json_encode(['success' => true]);
|
||||
} else {
|
||||
join_log('SIGNUP FAIL', $result);
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (Throwable $e) {
|
||||
join_log('EXCEPTION', $e->getMessage());
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => '서버 오류'
|
||||
]);
|
||||
}
|
||||
|
||||
exit;
|
||||
68
kngil/bbs/login.php
Normal file
68
kngil/bbs/login.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$id = trim($input['id'] ?? '');
|
||||
$pw = trim($input['pw'] ?? '');
|
||||
|
||||
if ($id === '' || $pw === '') {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '아이디와 비밀번호를 입력하세요.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
u.member_id,
|
||||
u.user_id,
|
||||
u.user_pw,
|
||||
u.user_nm,
|
||||
u.auth_bc,
|
||||
u.dept_nm,
|
||||
m.co_nm,
|
||||
u.tel_no,
|
||||
u.email
|
||||
FROM kngil.users u
|
||||
LEFT JOIN kngil.members m
|
||||
ON u.member_id = m.member_id
|
||||
WHERE LOWER(u.user_id) = LOWER(:id)
|
||||
AND u.use_yn = 'Y'
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([':id' => $id]);
|
||||
|
||||
$user = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$user) {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '존재하지 않는 아이디입니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 현재 구조상 평문 비교
|
||||
if ($user['user_pw'] !== $pw) {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '비밀번호가 올바르지 않습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ✅ 로그인 성공
|
||||
$_SESSION['login'] = [
|
||||
'member_id' => $user['member_id'],
|
||||
'user_id' => $user['user_id'],
|
||||
'user_nm' => $user['user_nm'],
|
||||
'auth_bc' => $user['auth_bc'],
|
||||
'co_nm' => $user['co_nm'] ?? null,
|
||||
'dept_nm' => $user['dept_nm'] ?? null,
|
||||
'tel_no' => $user['tel_no'] ?? null,
|
||||
'email' => $user['email'] ?? null
|
||||
];
|
||||
|
||||
echo json_encode(['status' => 'success']);
|
||||
179
kngil/bbs/login_sms copy.php
Normal file
179
kngil/bbs/login_sms copy.php
Normal file
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
/**
|
||||
* Sentinel SMS 매직링크 테스트 (PHP)
|
||||
* - phoneNumber: 01086270921 (고정)
|
||||
* - system: kngil
|
||||
* - secret_key: MY_SECRET_KEY
|
||||
*/
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
설정값
|
||||
========================= */
|
||||
$AUTH_SERVER = 'http://61.98.205.242:8075';
|
||||
$SYSTEM = 'kngil';
|
||||
$SECRET_KEY = '9f3b2e7a0a4f1f25c41c8c2367d04d54a89a2a5b2b189d63a99a0b874db4b27f';
|
||||
$PHONE = '01086270921';
|
||||
|
||||
/* =========================
|
||||
JWT 생성 (HS256)
|
||||
========================= */
|
||||
function base64url_encode($data) {
|
||||
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
|
||||
}
|
||||
|
||||
function create_jwt($payload, $secret) {
|
||||
$header = ['alg'=>'HS256','typ'=>'JWT'];
|
||||
|
||||
$segments = [];
|
||||
$segments[] = base64url_encode(json_encode($header));
|
||||
$segments[] = base64url_encode(json_encode($payload));
|
||||
|
||||
$signing_input = implode('.', $segments);
|
||||
$signature = hash_hmac('sha256', $signing_input, $secret, true);
|
||||
|
||||
$segments[] = base64url_encode($signature);
|
||||
|
||||
return implode('.', $segments);
|
||||
}
|
||||
|
||||
/* =========================
|
||||
cURL 요청 함수
|
||||
========================= */
|
||||
function curl_json($url, $method='GET', $headers=[], $body=null) {
|
||||
$ch = curl_init($url);
|
||||
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_CUSTOMREQUEST => $method,
|
||||
CURLOPT_HTTPHEADER => $headers,
|
||||
CURLOPT_POSTFIELDS => $body,
|
||||
CURLOPT_TIMEOUT => 10
|
||||
]);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$err = curl_error($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
|
||||
curl_close($ch);
|
||||
|
||||
if ($err) {
|
||||
throw new Exception($err);
|
||||
}
|
||||
|
||||
return [$code, $response];
|
||||
}
|
||||
|
||||
/* =========================
|
||||
MODE 분기
|
||||
========================= */
|
||||
$mode = $_GET['mode'] ?? 'request';
|
||||
|
||||
try {
|
||||
|
||||
/* =========================
|
||||
1️⃣ 매직링크 발급 요청
|
||||
========================= */
|
||||
if ($mode === 'request') {
|
||||
|
||||
// JWT payload (3분 유효)
|
||||
$payload = [
|
||||
'system' => $SYSTEM,
|
||||
'iat' => time(),
|
||||
'exp' => time() + 180
|
||||
];
|
||||
|
||||
$jwt = create_jwt($payload, $SECRET_KEY);
|
||||
|
||||
[$code, $res] = curl_json(
|
||||
$AUTH_SERVER.'/auth/sentinel',
|
||||
'POST',
|
||||
[
|
||||
'Authorization: Bearer '.$jwt,
|
||||
'Content-Type: application/json'
|
||||
],
|
||||
json_encode([
|
||||
'phoneNumber' => $PHONE
|
||||
])
|
||||
);
|
||||
|
||||
echo json_encode([
|
||||
'step' => 'sentinel_request',
|
||||
'http_code' => $code,
|
||||
'response' => json_decode($res, true)
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
2️⃣ 매직링크 상태 확인
|
||||
========================= */
|
||||
if ($mode === 'status') {
|
||||
|
||||
$token = $_GET['token'] ?? '';
|
||||
if (!$token) {
|
||||
throw new Exception('token 필요');
|
||||
}
|
||||
|
||||
$payload = [
|
||||
'system' => $SYSTEM,
|
||||
'iat' => time(),
|
||||
'exp' => time() + 180
|
||||
];
|
||||
|
||||
$jwt = create_jwt($payload, $SECRET_KEY);
|
||||
|
||||
[$code, $res] = curl_json(
|
||||
$AUTH_SERVER.'/auth/status?token='.$token,
|
||||
'GET',
|
||||
[
|
||||
'Authorization: Bearer '.$jwt
|
||||
]
|
||||
);
|
||||
|
||||
$data = json_decode($res, true);
|
||||
|
||||
// 🔴 여기부터가 "로그인 처리"
|
||||
if (!empty($data['loggedIn'])) {
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT member_id, user_id, user_nm, auth_bc
|
||||
FROM kngil.users
|
||||
WHERE REPLACE(tel_no, '-', '') = :phone
|
||||
AND use_yn = 'Y'
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([':phone' => $PHONE]);
|
||||
$user = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$user) {
|
||||
throw new Exception('해당 번호로 등록된 사용자 없음');
|
||||
}
|
||||
|
||||
$_SESSION['login'] = [
|
||||
'member_id' => $user['member_id'],
|
||||
'user_id' => $user['user_id'],
|
||||
'user_nm' => $user['user_nm'],
|
||||
'auth_bc' => $user['auth_bc']
|
||||
];
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'message' => '자동 로그인 완료'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'pending'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo json_encode([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage()
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
212
kngil/bbs/login_sms.php
Normal file
212
kngil/bbs/login_sms.php
Normal file
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
/**
|
||||
* Sentinel SMS 매직링크 로그인 (PHP)
|
||||
* - system: kngil
|
||||
* - secret_key: MY_SECRET_KEY
|
||||
*/
|
||||
|
||||
session_start();
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
/* =========================
|
||||
설정값
|
||||
========================= */
|
||||
$AUTH_SERVER = 'http://61.98.205.242:8075';
|
||||
$SYSTEM = 'kngil';
|
||||
$SECRET_KEY = '9f3b2e7a0a4f1f25c41c8c2367d04d54a89a2a5b2b189d63a99a0b874db4b27f';
|
||||
|
||||
/* =========================
|
||||
입력 처리
|
||||
========================= */
|
||||
$input = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
$mode = $_GET['mode'] ?? $input['mode'] ?? '';
|
||||
|
||||
/* =========================
|
||||
JWT 생성 (HS256)
|
||||
========================= */
|
||||
function base64url_encode($data) {
|
||||
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
|
||||
}
|
||||
|
||||
function create_jwt($payload, $secret) {
|
||||
$header = ['alg' => 'HS256', 'typ' => 'JWT'];
|
||||
|
||||
$segments = [];
|
||||
$segments[] = base64url_encode(json_encode($header));
|
||||
$segments[] = base64url_encode(json_encode($payload));
|
||||
|
||||
$signing_input = implode('.', $segments);
|
||||
$signature = hash_hmac('sha256', $signing_input, $secret, true);
|
||||
|
||||
$segments[] = base64url_encode($signature);
|
||||
return implode('.', $segments);
|
||||
}
|
||||
|
||||
/* =========================
|
||||
cURL JSON 요청
|
||||
========================= */
|
||||
function curl_json($url, $method = 'GET', $headers = [], $body = null) {
|
||||
$ch = curl_init($url);
|
||||
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_CUSTOMREQUEST => $method,
|
||||
CURLOPT_HTTPHEADER => $headers,
|
||||
CURLOPT_POSTFIELDS => $body,
|
||||
CURLOPT_TIMEOUT => 10
|
||||
]);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$err = curl_error($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
|
||||
curl_close($ch);
|
||||
|
||||
if ($err) {
|
||||
throw new Exception($err);
|
||||
}
|
||||
|
||||
return [$code, $response];
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
/* =========================
|
||||
1️⃣ 매직링크 발급 요청
|
||||
========================= */
|
||||
if ($mode === 'request') {
|
||||
|
||||
$rawPhone = $input['phone'] ?? '';
|
||||
$phone = preg_replace('/[^0-9]/', '', $rawPhone);
|
||||
|
||||
if (!$phone) {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '휴대폰 번호를 입력하세요.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// JWT payload (3분 유효)
|
||||
$payload = [
|
||||
'system' => $SYSTEM,
|
||||
'iat' => time(),
|
||||
'exp' => time() + 180
|
||||
];
|
||||
|
||||
$jwt = create_jwt($payload, $SECRET_KEY);
|
||||
|
||||
[$code, $res] = curl_json(
|
||||
$AUTH_SERVER . '/auth/sentinel',
|
||||
'POST',
|
||||
[
|
||||
'Authorization: Bearer ' . $jwt,
|
||||
'Content-Type: application/json'
|
||||
],
|
||||
json_encode([
|
||||
'phoneNumber' => $phone
|
||||
])
|
||||
);
|
||||
|
||||
$result = json_decode($res, true);
|
||||
|
||||
if (empty($result['token'])) {
|
||||
throw new Exception('Sentinel token 발급 실패');
|
||||
}
|
||||
|
||||
// ✅ token 반드시 저장
|
||||
$_SESSION['sms_login'] = [
|
||||
'phone' => $phone,
|
||||
'token' => $result['token']
|
||||
];
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
2️⃣ 매직링크 상태 확인 → 자동 로그인
|
||||
========================= */
|
||||
if ($mode === 'status') {
|
||||
|
||||
if (
|
||||
empty($_SESSION['sms_login']['token']) ||
|
||||
empty($_SESSION['sms_login']['phone'])
|
||||
) {
|
||||
echo json_encode(['status' => 'pending']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$token = $_SESSION['sms_login']['token'];
|
||||
$phone = $_SESSION['sms_login']['phone'];
|
||||
|
||||
$payload = [
|
||||
'system' => $SYSTEM,
|
||||
'iat' => time(),
|
||||
'exp' => time() + 180
|
||||
];
|
||||
|
||||
$jwt = create_jwt($payload, $SECRET_KEY);
|
||||
|
||||
[$code, $res] = curl_json(
|
||||
$AUTH_SERVER . '/auth/status?token=' . $token,
|
||||
'GET',
|
||||
[
|
||||
'Authorization: Bearer ' . $jwt
|
||||
]
|
||||
);
|
||||
|
||||
$data = json_decode($res, true);
|
||||
|
||||
// 🔴 인증 완료 시 로그인 처리
|
||||
if (!empty($data['loggedIn'])) {
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
member_id,
|
||||
user_id,
|
||||
user_nm,
|
||||
auth_bc
|
||||
FROM kngil.users
|
||||
WHERE REPLACE(tel_no, '-', '') = :phone
|
||||
AND use_yn = 'Y'
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute([':phone' => $phone]);
|
||||
$user = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$user) {
|
||||
throw new Exception('해당 번호로 등록된 사용자 없음');
|
||||
}
|
||||
|
||||
// ✅ 기존 PW 로그인과 동일
|
||||
$_SESSION['login'] = [
|
||||
'member_id' => $user['member_id'],
|
||||
'user_id' => $user['user_id'],
|
||||
'user_nm' => $user['user_nm'],
|
||||
'auth_bc' => $user['auth_bc']
|
||||
];
|
||||
|
||||
unset($_SESSION['sms_login']);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'message' => '자동 로그인 완료'
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode(['status' => 'pending']);
|
||||
exit;
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo json_encode([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage()
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
6
kngil/bbs/logout.php
Normal file
6
kngil/bbs/logout.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
session_start();
|
||||
session_destroy();
|
||||
|
||||
header('Location: /kngil/skin/index.php');
|
||||
exit;
|
||||
40
kngil/bbs/mypage01.php
Normal file
40
kngil/bbs/mypage01.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
//mypage01.php
|
||||
session_start();
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
if (!isset($_SESSION['login'])) {
|
||||
http_response_code(401);
|
||||
echo json_encode(['status' => 'error', 'message' => '로그인이 필요합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$pw = trim($input['pw'] ?? '');
|
||||
|
||||
if ($pw === '') {
|
||||
echo json_encode(['status' => 'error', 'message' => '비밀번호를 입력하세요.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$userId = $_SESSION['login']['user_id'];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT user_pw
|
||||
FROM kngil.users
|
||||
WHERE user_id = :user_id
|
||||
AND use_yn = 'Y'
|
||||
");
|
||||
$stmt->execute([':user_id' => $userId]);
|
||||
|
||||
$user = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$user || $user['user_pw'] !== $pw) {
|
||||
echo json_encode(['status' => 'error', 'message' => '비밀번호가 올바르지 않습니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ✅ 비밀번호 재인증 성공
|
||||
$_SESSION['mypage_verified'] = true;
|
||||
|
||||
echo json_encode(['status' => 'success']);
|
||||
90
kngil/bbs/mypage02.php
Normal file
90
kngil/bbs/mypage02.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (!isset($_SESSION['login'])) {
|
||||
http_response_code(401);
|
||||
echo json_encode(['status' => 'error', 'message' => '로그인이 필요합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
if (empty($_SESSION['mypage_verified'])) {
|
||||
http_response_code(403);
|
||||
echo json_encode(['status' => 'error', 'message' => '마이페이지 인증이 필요합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$userId = $_SESSION['login']['user_id'];
|
||||
|
||||
/* =========================
|
||||
페이징 파라미터
|
||||
========================= */
|
||||
$page = max(1, intval($_GET['page'] ?? 1));
|
||||
$pageSize = 5;
|
||||
$offset = ($page - 1) * $pageSize;
|
||||
|
||||
try {
|
||||
|
||||
/* =========================
|
||||
1. 내 정보
|
||||
========================= */
|
||||
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_users_my_r(:user_id)");
|
||||
$stmt->execute([':user_id' => $userId]);
|
||||
$user = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$user) {
|
||||
echo json_encode(['status' => 'error', 'message' => '사용자 정보 없음']);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =========================
|
||||
2. 전체 건수
|
||||
========================= */
|
||||
$cntStmt = $pdo->prepare("
|
||||
SELECT COUNT(*)
|
||||
FROM kngil.use_history
|
||||
WHERE user_id = :user_id
|
||||
");
|
||||
$cntStmt->execute([':user_id' => $userId]);
|
||||
$totalCount = (int)$cntStmt->fetchColumn();
|
||||
|
||||
$totalPages = (int)ceil($totalCount / $pageSize);
|
||||
|
||||
/* =========================
|
||||
3. 현재 페이지 데이터
|
||||
========================= */
|
||||
$histStmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.sp_users_my_history(:user_id)
|
||||
OFFSET :offset
|
||||
LIMIT :limit
|
||||
");
|
||||
$histStmt->bindValue(':user_id', $userId, PDO::PARAM_STR);
|
||||
$histStmt->bindValue(':offset', $offset, PDO::PARAM_INT);
|
||||
$histStmt->bindValue(':limit', $pageSize, PDO::PARAM_INT);
|
||||
$histStmt->execute();
|
||||
|
||||
$history = $histStmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'user' => $user,
|
||||
'history' => $history,
|
||||
'pagination' => [
|
||||
'page' => $page,
|
||||
'pageSize' => $pageSize,
|
||||
'totalCount' => $totalCount,
|
||||
'totalPages' => $totalPages
|
||||
]
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '서버 오류',
|
||||
'detail' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
139
kngil/bbs/mypage03.php
Normal file
139
kngil/bbs/mypage03.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// 로그인 체크
|
||||
if (!isset($_SESSION['login'])) {
|
||||
http_response_code(401);
|
||||
echo json_encode(['status' => 'error', 'message' => '로그인이 필요합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 2차 인증 체크
|
||||
if (empty($_SESSION['mypage_verified'])) {
|
||||
http_response_code(403);
|
||||
echo json_encode(['status' => 'error', 'message' => '마이페이지 인증이 필요합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$userId = $_SESSION['login']['user_id'];
|
||||
$memberId = $_SESSION['login']['member_id'];
|
||||
|
||||
/* ==================================================
|
||||
GET : 회원정보 조회 (mypage03 열릴 때)
|
||||
================================================== */
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT *
|
||||
FROM kngil.sp_users_r(
|
||||
:member_id,
|
||||
'',
|
||||
'',
|
||||
'Y'
|
||||
)
|
||||
WHERE user_id = :user_id
|
||||
LIMIT 1
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':member_id' => $memberId,
|
||||
':user_id' => $userId
|
||||
]);
|
||||
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$row) {
|
||||
echo json_encode(['status' => 'error', 'message' => '회원정보를 찾을 수 없습니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'data' => $row
|
||||
]);
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '조회 중 오류 발생',
|
||||
'detail' => $e->getMessage()
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* ==================================================
|
||||
POST : 회원정보 수정
|
||||
================================================== */
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
$userPw = trim($input['password'] ?? '');
|
||||
$email = trim($input['email'] ?? '');
|
||||
$deptNm = trim($input['dept_nm'] ?? '');
|
||||
|
||||
// 전화번호는 이번 단계에서 수정 안 함
|
||||
$tel_no = trim($input['tel_no'] ?? '');
|
||||
|
||||
if ($email === '') {
|
||||
echo json_encode(['status' => 'error', 'message' => '이메일은 필수입니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($userPw !== '' && strlen($userPw) < 8) {
|
||||
echo json_encode(['status' => 'error', 'message' => '비밀번호는 8자 이상이어야 합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT kngil.sp_users_my_u(
|
||||
:user_id,
|
||||
:user_pw,
|
||||
:email,
|
||||
:tel_no,
|
||||
:dept_nm,
|
||||
:mid
|
||||
)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':user_id' => $userId,
|
||||
':user_pw' => $userPw,
|
||||
':email' => $email,
|
||||
':tel_no' => $tel_no,
|
||||
':dept_nm' => $deptNm,
|
||||
':mid' => $userId
|
||||
]);
|
||||
|
||||
$result = $stmt->fetchColumn();
|
||||
|
||||
if ($result !== 'SUCCESS') {
|
||||
echo json_encode(['status' => 'error', 'message' => $result]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode(['status' => 'success']);
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '저장 중 오류 발생',
|
||||
'detail' => $e->getMessage()
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// 허용되지 않은 메서드
|
||||
http_response_code(405);
|
||||
echo json_encode(['status' => 'error', 'message' => 'Invalid request']);
|
||||
110
kngil/bbs/qa_comment.php
Normal file
110
kngil/bbs/qa_comment.php
Normal file
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
session_start();
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (empty($_SESSION['login'])) {
|
||||
echo json_encode(['status'=>'error','message'=>'로그인 필요']);
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once __DIR__.'/db_conn.php';
|
||||
|
||||
$postId = (int)($_POST['postId'] ?? 0);
|
||||
$content = trim($_POST['comment'] ?? '');
|
||||
|
||||
if ($postId < 1 || ($content === '' && empty($_FILES['images']))) {
|
||||
echo json_encode(['status'=>'error','message'=>'내용 없음']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$user = $_SESSION['login'];
|
||||
|
||||
try {
|
||||
$pdo->beginTransaction();
|
||||
|
||||
/* =========================
|
||||
1) 댓글 INSERT
|
||||
========================= */
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO kngil.qa_comments
|
||||
(post_id, commenter, user_nm, content, cdt_dt)
|
||||
VALUES
|
||||
(:post_id, :commenter, :user_nm, :content, NOW())
|
||||
RETURNING comment_id
|
||||
");
|
||||
$stmt->execute([
|
||||
':post_id' => $postId,
|
||||
':commenter' => $user['user_id'],
|
||||
':user_nm' => $user['user_nm'],
|
||||
':content' => $content
|
||||
]);
|
||||
|
||||
$commentId = $stmt->fetchColumn();
|
||||
|
||||
/* =========================
|
||||
2) 이미지 업로드
|
||||
========================= */
|
||||
$images = [];
|
||||
|
||||
if (!empty($_FILES['images']['name'][0])) {
|
||||
|
||||
$uploadDir = $_SERVER['DOCUMENT_ROOT'].'/kngil/uploads/comment/';
|
||||
if (!is_dir($uploadDir)) {
|
||||
mkdir($uploadDir, 0777, true);
|
||||
}
|
||||
|
||||
foreach ($_FILES['images']['name'] as $i => $name) {
|
||||
|
||||
if ($_FILES['images']['error'][$i] !== UPLOAD_ERR_OK) continue;
|
||||
|
||||
$tmp = $_FILES['images']['tmp_name'][$i];
|
||||
$size = $_FILES['images']['size'][$i];
|
||||
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
|
||||
|
||||
$save = time().'_'.bin2hex(random_bytes(4)).'.'.$ext;
|
||||
$fullPath = $uploadDir.$save;
|
||||
move_uploaded_file($tmp, $fullPath);
|
||||
|
||||
$path = '/kngil/uploads/comment/'.$save;
|
||||
|
||||
// 🔥 DB 구조에 맞게 INSERT
|
||||
$pdo->prepare("
|
||||
INSERT INTO kngil.qa_comment_images
|
||||
(comment_id, file_name, file_path, thumb_path, file_size, uploaded_at)
|
||||
VALUES
|
||||
(:comment_id, :file_name, :file_path, :thumb_path, :file_size, NOW())
|
||||
")->execute([
|
||||
':comment_id' => $commentId,
|
||||
':file_name' => $name,
|
||||
':file_path' => $path,
|
||||
':thumb_path' => $path, // 지금은 동일 (추후 썸네일 분리 가능)
|
||||
':file_size' => $size
|
||||
]);
|
||||
|
||||
$images[] = [
|
||||
'thumb' => $path,
|
||||
'full' => $path,
|
||||
'name' => $name
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'comment_id' => $commentId,
|
||||
'comment_text' => $content,
|
||||
'user_name' => $user['user_nm'],
|
||||
'login_id' => $user['user_id'],
|
||||
'created_at' => date('Y-m-d H:i'),
|
||||
'images' => $images
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
$pdo->rollBack();
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
33
kngil/bbs/qa_comment_delete.php
Normal file
33
kngil/bbs/qa_comment_delete.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
session_start();
|
||||
header('Content-Type: application/json');
|
||||
|
||||
require_once __DIR__.'/db_conn.php';
|
||||
|
||||
if (empty($_SESSION['login'])) {
|
||||
echo json_encode(['status'=>'error','message'=>'로그인 필요']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($_POST['commentId'] ?? 0);
|
||||
$userId = $_SESSION['login']['user_id'];
|
||||
|
||||
if ($id < 1) {
|
||||
echo json_encode(['status'=>'error','message'=>'잘못된 요청']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 관리자 or 본인
|
||||
$isAdmin = function_exists('is_qna_admin') && is_qna_admin();
|
||||
|
||||
$sql = $isAdmin
|
||||
? "DELETE FROM kngil.qa_comments WHERE comment_id = :id"
|
||||
: "DELETE FROM kngil.qa_comments WHERE comment_id = :id AND commenter = :user";
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$params = [':id'=>$id];
|
||||
if (!$isAdmin) $params[':user'] = $userId;
|
||||
|
||||
$stmt->execute($params);
|
||||
|
||||
echo json_encode(['status'=>'ok']);
|
||||
34
kngil/bbs/qa_comment_update.php
Normal file
34
kngil/bbs/qa_comment_update.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
session_start();
|
||||
header('Content-Type: application/json');
|
||||
|
||||
require_once __DIR__.'/db_conn.php';
|
||||
|
||||
if (empty($_SESSION['login'])) {
|
||||
echo json_encode(['status'=>'error','message'=>'로그인 필요']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$id = (int)($_POST['commentId'] ?? 0);
|
||||
$content = trim($_POST['comment'] ?? '');
|
||||
|
||||
if ($id < 1 || $content === '') {
|
||||
echo json_encode(['status'=>'error','message'=>'잘못된 요청']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 본인 댓글만 수정
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE kngil.qa_comments
|
||||
SET content = :content,
|
||||
mdt_dt = NOW()
|
||||
WHERE comment_id = :id
|
||||
AND commenter = :user
|
||||
");
|
||||
$stmt->execute([
|
||||
':content' => $content,
|
||||
':id' => $id,
|
||||
':user' => $_SESSION['login']['user_id']
|
||||
]);
|
||||
|
||||
echo json_encode(['status'=>'ok']);
|
||||
233
kngil/bbs/qa_detail.php
Normal file
233
kngil/bbs/qa_detail.php
Normal file
@@ -0,0 +1,233 @@
|
||||
<?php
|
||||
// kngil/bbs/qa_detail.php
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
/* ===============================
|
||||
1. 세션 & 로그인 체크
|
||||
=============================== */
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
if (empty($_SESSION['login'])) {
|
||||
echo "<script>
|
||||
alert('로그인 후 이용 가능합니다.');
|
||||
location.href = '/kngil/skin/qa_list.skin.php';
|
||||
</script>";
|
||||
exit;
|
||||
}
|
||||
|
||||
$login = $_SESSION['login'];
|
||||
$me = $login['user_id'] ?? '';
|
||||
$auth = $login['auth_bc'] ?? '';
|
||||
|
||||
$isAdmin = in_array($auth, ['BS100100', 'BS100200']); // 개발자/관리자
|
||||
|
||||
/* ===============================
|
||||
2. DB 연결 (PostgreSQL)
|
||||
=============================== */
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
/* ===============================
|
||||
4. 삭제 처리
|
||||
=============================== */
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'delete') {
|
||||
|
||||
$postId = (int)($_POST['post_id'] ?? 0);
|
||||
if ($postId < 1) {
|
||||
die('잘못된 요청입니다.');
|
||||
}
|
||||
|
||||
// 글 조회
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT post_id, user_id, stat_bc
|
||||
FROM kngil.qa_posts
|
||||
WHERE post_id = :pid
|
||||
");
|
||||
$stmt->execute([':pid' => $postId]);
|
||||
$post = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$post) {
|
||||
die('존재하지 않는 글입니다.');
|
||||
}
|
||||
|
||||
// 상태 제한 (검토중 / 완료면 삭제 불가)
|
||||
if (in_array($post['stat_bc'], ['REVIEW', 'DONE']) && !$isAdmin) {
|
||||
die('검토중이거나 답변 완료된 글은 삭제할 수 없습니다.');
|
||||
}
|
||||
|
||||
// 권한 체크 (본인 or 관리자)
|
||||
if (!$isAdmin && $post['user_id'] !== $loginUser['user_id']) {
|
||||
die('삭제 권한이 없습니다.');
|
||||
}
|
||||
|
||||
try {
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// 1️⃣ 첨부파일 삭제
|
||||
$fs = $pdo->prepare("
|
||||
SELECT save_path
|
||||
FROM kngil.qa_attachments
|
||||
WHERE post_id = :pid
|
||||
");
|
||||
$fs->execute([':pid' => $postId]);
|
||||
|
||||
foreach ($fs->fetchAll() as $f) {
|
||||
$file = $_SERVER['DOCUMENT_ROOT'] . $f['save_path'];
|
||||
if (is_file($file)) unlink($file);
|
||||
}
|
||||
|
||||
$pdo->prepare("DELETE FROM kngil.qa_attachments WHERE post_id = ?")
|
||||
->execute([$postId]);
|
||||
|
||||
// 2️⃣ 댓글 삭제
|
||||
$pdo->prepare("DELETE FROM kngil.qa_comments WHERE post_id = ?")
|
||||
->execute([$postId]);
|
||||
|
||||
// 3️⃣ 본문 삭제
|
||||
$pdo->prepare("DELETE FROM kngil.qa_posts WHERE post_id = ?")
|
||||
->execute([$postId]);
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
header("Location: /kngil/skin/qa_list.skin.php");
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$pdo->rollBack();
|
||||
die('삭제 중 오류 발생: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
3. post_id 검증
|
||||
=============================== */
|
||||
$postId = (int)($_GET['id'] ?? 0);
|
||||
if ($postId < 1) {
|
||||
exit('잘못된 접근입니다.');
|
||||
}
|
||||
|
||||
|
||||
/* ===============================
|
||||
5. 글 조회
|
||||
=============================== */
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
p.post_id,
|
||||
p.user_id,
|
||||
p.user_nm,
|
||||
p.tel_no,
|
||||
p.category,
|
||||
p.co_nm,
|
||||
p.dept_nm,
|
||||
p.title,
|
||||
p.content,
|
||||
p.attachment,
|
||||
p.stat_bc,
|
||||
p.is_secret,
|
||||
p.complete_form,
|
||||
p.cdt_dt,
|
||||
p.mid_dt,
|
||||
p.is_read_admin,
|
||||
|
||||
u.email
|
||||
|
||||
FROM kngil.qa_posts p
|
||||
LEFT JOIN kngil.users u
|
||||
ON p.user_id = u.user_id
|
||||
WHERE p.post_id = :pid
|
||||
");
|
||||
$stmt->execute([':pid' => $postId]);
|
||||
$post = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$post) {
|
||||
exit('존재하지 않는 글입니다.');
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
6. 비밀글 접근 제어
|
||||
=============================== */
|
||||
if ($post['is_secret'] === 'Y' && $post['user_id'] !== $me && !$isAdmin) {
|
||||
exit('⚠️ 비밀글은 작성자 또는 관리자만 확인할 수 있습니다.');
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
7. 관리자 열람 처리
|
||||
=============================== */
|
||||
if ($isAdmin && $post['is_read_admin'] === 'N') {
|
||||
$pdo->prepare("
|
||||
UPDATE kngil.qa_posts
|
||||
SET is_read_admin = 'Y'
|
||||
WHERE post_id = :pid
|
||||
")->execute([':pid' => $postId]);
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
8. 라벨 매핑
|
||||
=============================== */
|
||||
$STATUS_LABELS = [
|
||||
'WAIT' => '문의접수',
|
||||
'REVIEW'=> '검토중',
|
||||
'DONE' => '답변완료'
|
||||
];
|
||||
|
||||
$CATEGORY_LABELS = [
|
||||
'general' => '일반문의',
|
||||
'improvement' => '개선문의',
|
||||
'error' => '오류문의',
|
||||
'notice' => '공지사항'
|
||||
];
|
||||
|
||||
$post['status_label'] = $STATUS_LABELS[$post['stat_bc']] ?? $post['stat_bc'];
|
||||
$post['category_label'] = $CATEGORY_LABELS[$post['category']] ?? $post['category'];
|
||||
$post['display_name'] = $post['user_nm'];
|
||||
|
||||
/* ===============================
|
||||
9. 첨부파일 조회
|
||||
=============================== */
|
||||
$af = $pdo->prepare("
|
||||
SELECT
|
||||
id,
|
||||
ori_name,
|
||||
save_path,
|
||||
file_size,
|
||||
uploaded_at
|
||||
FROM kngil.qa_attachments
|
||||
WHERE post_id = :pid
|
||||
ORDER BY id ASC
|
||||
");
|
||||
$af->execute([':pid' => $postId]);
|
||||
$attachments = $af->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
/* ===============================
|
||||
10. 댓글 조회 (일단 구조만)
|
||||
=============================== */
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
comment_id,
|
||||
post_id,
|
||||
commenter,
|
||||
content,
|
||||
user_nm,
|
||||
cdt_dt
|
||||
FROM kngil.qa_comments
|
||||
WHERE post_id = :post_id
|
||||
ORDER BY cdt_dt ASC
|
||||
");
|
||||
$stmt->execute([
|
||||
':post_id' => $postId
|
||||
]);
|
||||
|
||||
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
/* ===============================
|
||||
11. 소유자 여부 (수정 버튼용)
|
||||
=============================== */
|
||||
$isOwner = ($post['user_id'] === $me);
|
||||
|
||||
/* ===============================
|
||||
12. 스킨 렌더링
|
||||
=============================== */
|
||||
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_detail.skin.php';
|
||||
152
kngil/bbs/qa_list.php
Normal file
152
kngil/bbs/qa_list.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
/**
|
||||
* Q&A 리스트 컨트롤러
|
||||
* - 스킨: /kngil/skin/qa_list.skin.php
|
||||
*/
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
/* =========================
|
||||
1. 입력값 정리
|
||||
========================= */
|
||||
$page = max(1, (int)($_GET['page'] ?? 1));
|
||||
$pageSize = 15;
|
||||
$offset = ($page - 1) * $pageSize;
|
||||
|
||||
$search = trim($_GET['q'] ?? '');
|
||||
$cats = $_GET['cat'] ?? []; // 배열
|
||||
$writer = $_GET['writer'] ?? ''; // me
|
||||
$status = $_GET['status'] ?? 'all'; // 상태
|
||||
|
||||
$isLogin = !empty($_SESSION['login']);
|
||||
$loginUserId = $_SESSION['login']['user_id'] ?? null;
|
||||
|
||||
/* =========================
|
||||
2. WHERE 조건 구성
|
||||
========================= */
|
||||
$where = [];
|
||||
$params = [];
|
||||
|
||||
/* 카테고리 */
|
||||
if (!empty($cats) && !in_array('all', $cats, true)) {
|
||||
$catKeys = [];
|
||||
foreach ($cats as $i => $cat) {
|
||||
$key = ":cat{$i}";
|
||||
$catKeys[] = $key;
|
||||
$params[$key] = $cat;
|
||||
}
|
||||
$where[] = "p.category IN (" . implode(',', $catKeys) . ")";
|
||||
}
|
||||
|
||||
/* 내가 작성한 글 */
|
||||
if ($writer === 'me' && $loginUserId) {
|
||||
$where[] = "p.user_id = :me";
|
||||
$params[':me'] = $loginUserId;
|
||||
}
|
||||
|
||||
/* 상태 */
|
||||
if ($status !== 'all') {
|
||||
$where[] = "p.stat_bc = :status";
|
||||
$params[':status'] = $status;
|
||||
}
|
||||
|
||||
/* 검색 (제목 + 내용) */
|
||||
if ($search !== '') {
|
||||
$where[] = "(p.title ILIKE :q OR p.content ILIKE :q)";
|
||||
$params[':q'] = "%{$search}%";
|
||||
}
|
||||
|
||||
$whereSql = $where ? 'WHERE ' . implode(' AND ', $where) : '';
|
||||
|
||||
/* =========================
|
||||
3. 전체 건수
|
||||
========================= */
|
||||
$countSql = "
|
||||
SELECT COUNT(*)
|
||||
FROM kngil.qa_posts p
|
||||
{$whereSql}
|
||||
";
|
||||
$stmt = $pdo->prepare($countSql);
|
||||
$stmt->execute($params);
|
||||
$totalCount = (int)$stmt->fetchColumn();
|
||||
|
||||
/* =========================
|
||||
4. 리스트 조회
|
||||
========================= */
|
||||
$listSql = "
|
||||
SELECT
|
||||
p.post_id,
|
||||
p.category,
|
||||
p.title,
|
||||
p.user_nm,
|
||||
p.co_nm,
|
||||
p.dept_nm,
|
||||
p.stat_bc AS status,
|
||||
p.is_secret,
|
||||
p.cdt_dt AS created_at,
|
||||
|
||||
-- 댓글 수
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM kngil.qa_comments c
|
||||
WHERE c.post_id = p.post_id
|
||||
) AS comment_count,
|
||||
|
||||
-- 첨부파일 수
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM kngil.qa_attachments a
|
||||
WHERE a.post_id = p.post_id
|
||||
) AS file_count
|
||||
|
||||
FROM kngil.qa_posts p
|
||||
{$whereSql}
|
||||
ORDER BY
|
||||
(p.category = 'notice') DESC,
|
||||
p.post_id DESC
|
||||
LIMIT :limit OFFSET :offset
|
||||
";
|
||||
|
||||
$stmt = $pdo->prepare($listSql);
|
||||
|
||||
/* 바인딩 */
|
||||
foreach ($params as $k => $v) {
|
||||
$stmt->bindValue($k, $v);
|
||||
}
|
||||
$stmt->bindValue(':limit', $pageSize, PDO::PARAM_INT);
|
||||
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
|
||||
|
||||
$stmt->execute();
|
||||
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
/* =========================
|
||||
5. 표시용 가공
|
||||
========================= */
|
||||
foreach ($posts as &$row) {
|
||||
// 회사 표시
|
||||
$row['display_company'] = $row['co_nm'] ?? '';
|
||||
|
||||
// 작성자 표시
|
||||
$row['display_name'] = $row['user_nm'] ?? $row['user_id'];
|
||||
|
||||
// 날짜 포맷
|
||||
$row['created_at'] = substr($row['created_at'], 0, 10);
|
||||
}
|
||||
unset($row);
|
||||
|
||||
/* =========================
|
||||
6. 페이징 계산
|
||||
========================= */
|
||||
$totalPages = (int)ceil($totalCount / $pageSize);
|
||||
|
||||
/* =========================
|
||||
7. 스킨 렌더링
|
||||
========================= */
|
||||
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_list.skin.php';
|
||||
50
kngil/bbs/qa_status.php
Normal file
50
kngil/bbs/qa_status.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/adm_guard.php';
|
||||
|
||||
/* =========================
|
||||
1. 관리자 권한 체크
|
||||
========================= */
|
||||
if (!defined('IS_SUPER_ADMIN') || !IS_SUPER_ADMIN) {
|
||||
http_response_code(403);
|
||||
exit('권한이 없습니다.');
|
||||
}
|
||||
|
||||
/* =========================
|
||||
2. 파라미터 체크
|
||||
========================= */
|
||||
$postId = (int)($_POST['post_id'] ?? 0);
|
||||
$status = $_POST['status'] ?? '';
|
||||
|
||||
$ALLOW_STATUS = ['new','review','deep','patch','done'];
|
||||
|
||||
if ($postId < 1 || !in_array($status, $ALLOW_STATUS, true)) {
|
||||
exit('잘못된 요청입니다.');
|
||||
}
|
||||
|
||||
/* =========================
|
||||
3. 상태 업데이트
|
||||
========================= */
|
||||
try {
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE kngil.qa_posts
|
||||
SET stat_bc = :status,
|
||||
mid_dt = NOW()
|
||||
WHERE post_id = :pid
|
||||
");
|
||||
$stmt->execute([
|
||||
':status' => $status,
|
||||
':pid' => $postId
|
||||
]);
|
||||
|
||||
// 상세 페이지로 복귀
|
||||
header("Location: /kngil/bbs/qa_detail.php?id={$postId}");
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
exit('DB 오류: '.$e->getMessage());
|
||||
}
|
||||
231
kngil/bbs/qa_write.php
Normal file
231
kngil/bbs/qa_write.php
Normal file
@@ -0,0 +1,231 @@
|
||||
<?php
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
|
||||
/* ===============================
|
||||
1. 세션 & 로그인 체크
|
||||
=============================== */
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// echo '<pre>';
|
||||
// var_dump($_SESSION['login']);
|
||||
// exit;
|
||||
|
||||
if (empty($_SESSION['login'])) {
|
||||
echo "<script>
|
||||
alert('로그인이 필요합니다.');
|
||||
location.href = '/kngil/skin/qa_list.skin.php';
|
||||
</script>";
|
||||
exit;
|
||||
}
|
||||
|
||||
$loginUser = $_SESSION['login'];
|
||||
|
||||
/* ===============================
|
||||
2. DB 연결
|
||||
=============================== */
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||||
|
||||
/* ===============================
|
||||
3. 수정 여부 판단
|
||||
=============================== */
|
||||
$postId = isset($_GET['id']) ? (int)$_GET['id'] : 0;
|
||||
$isEdit = $postId > 0;
|
||||
|
||||
/* ===============================
|
||||
4. 수정 모드 – 기존 글 로드
|
||||
=============================== */
|
||||
$post = [
|
||||
'category' => '',
|
||||
'title' => '',
|
||||
'content' => '',
|
||||
'is_secret' => 'N',
|
||||
];
|
||||
|
||||
if ($isEdit) {
|
||||
$stmt = $pdo->prepare("SELECT * FROM kngil.qa_posts WHERE post_id = :pid");
|
||||
$stmt->execute([':pid' => $postId]);
|
||||
$post = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$post) {
|
||||
die('존재하지 않는 글입니다.');
|
||||
}
|
||||
|
||||
// 작성자 본인만 수정 가능
|
||||
if ($post['user_id'] !== ($loginUser['user_id'] ?? '')) {
|
||||
die('수정 권한이 없습니다.');
|
||||
}
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
5. 첨부파일 업로드
|
||||
=============================== */
|
||||
function handle_file_uploads(PDO $pdo, int $postId)
|
||||
{
|
||||
if (empty($_FILES['attach']['name'][0])) return;
|
||||
|
||||
$uploadDir = $_SERVER['DOCUMENT_ROOT'] . '/kngil/uploads/qa/';
|
||||
if (!is_dir($uploadDir)) {
|
||||
mkdir($uploadDir, 0777, true);
|
||||
}
|
||||
|
||||
$allowExt = ['jpg','jpeg','png','gif','pdf','hwp','doc','docx','xls','xlsx','zip'];
|
||||
|
||||
foreach ($_FILES['attach']['name'] as $i => $oriName) {
|
||||
|
||||
if ($_FILES['attach']['error'][$i] !== UPLOAD_ERR_OK) continue;
|
||||
|
||||
$tmp = $_FILES['attach']['tmp_name'][$i];
|
||||
$size = $_FILES['attach']['size'][$i];
|
||||
$ext = strtolower(pathinfo($oriName, PATHINFO_EXTENSION));
|
||||
|
||||
if (!in_array($ext, $allowExt)) continue;
|
||||
if ($size > 30 * 1024 * 1024) continue;
|
||||
|
||||
$saveName = time() . '_' . bin2hex(random_bytes(6)) . '.' . $ext;
|
||||
$savePath = $uploadDir . $saveName;
|
||||
|
||||
if (!move_uploaded_file($tmp, $savePath)) continue;
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO kngil.qa_attachments (
|
||||
post_id,
|
||||
ori_name,
|
||||
save_path,
|
||||
file_size,
|
||||
uploaded_at
|
||||
) VALUES (
|
||||
:post_id,
|
||||
:ori_name,
|
||||
:save_path,
|
||||
:file_size,
|
||||
NOW()
|
||||
)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
':post_id' => $postId,
|
||||
':ori_name' => $oriName,
|
||||
':save_path' => '/kngil/uploads/qa/' . $saveName,
|
||||
':file_size' => $size
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* ===============================
|
||||
6. POST 처리 (등록 / 수정)
|
||||
=============================== */
|
||||
$errors = [];
|
||||
|
||||
$secret = 'N';
|
||||
$category = '';
|
||||
$title = '';
|
||||
$content = '';
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
$category = trim($_POST['category'] ?? '');
|
||||
$title = trim($_POST['title'] ?? '');
|
||||
$content = trim($_POST['content'] ?? '');
|
||||
$secret = isset($_POST['secret']) ? 'Y' : 'N';
|
||||
|
||||
if ($category === '') $errors[] = '구분을 선택하세요.';
|
||||
if ($title === '') $errors[] = '제목을 입력하세요.';
|
||||
if ($content === '') $errors[] = '내용을 입력하세요.';
|
||||
|
||||
// 첨부파일명만 저장 (실파일 저장은 추후 분리 가능)
|
||||
$attachment = null;
|
||||
if (!empty($_FILES['attach']['name'][0])) {
|
||||
$attachment = implode(',', $_FILES['attach']['name']);
|
||||
}
|
||||
|
||||
if (empty($errors)) {
|
||||
try {
|
||||
|
||||
if ($isEdit) {
|
||||
/* ---------- UPDATE ---------- */
|
||||
$stmt = $pdo->prepare("
|
||||
UPDATE kngil.qa_posts
|
||||
SET category = :category,
|
||||
title = :title,
|
||||
content = :content,
|
||||
is_secret = :is_secret,
|
||||
mid_dt = NOW()
|
||||
WHERE post_id = :pid
|
||||
");
|
||||
$stmt->execute([
|
||||
':category' => $category,
|
||||
':title' => $title,
|
||||
':content' => $content,
|
||||
':is_secret' => $secret, // 'Y' or 'N'
|
||||
':pid' => $postId
|
||||
]);
|
||||
handle_file_uploads($pdo, $postId);
|
||||
|
||||
} else {
|
||||
/* ---------- INSERT ---------- */
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO kngil.qa_posts (
|
||||
user_id,
|
||||
user_nm,
|
||||
tel_no,
|
||||
co_nm,
|
||||
dept_nm,
|
||||
category,
|
||||
title,
|
||||
content,
|
||||
is_secret,
|
||||
stat_bc,
|
||||
is_read_admin,
|
||||
cdt_dt
|
||||
) VALUES (
|
||||
:user_id,
|
||||
:user_nm,
|
||||
:tel_no,
|
||||
:co_nm,
|
||||
:dept_nm,
|
||||
:category,
|
||||
:title,
|
||||
:content,
|
||||
:is_secret,
|
||||
'wait',
|
||||
'N',
|
||||
NOW()
|
||||
)
|
||||
RETURNING post_id
|
||||
");
|
||||
// var_dump($loginUser);
|
||||
// exit;
|
||||
$stmt->execute([
|
||||
':user_id' => $loginUser['user_id'],
|
||||
':user_nm' => $loginUser['user_nm'],
|
||||
':tel_no' => $loginUser['tel_no'] ?? null,
|
||||
':co_nm' => $loginUser['co_nm'] ?? null,
|
||||
':dept_nm' => $loginUser['dept_nm'] ?? null,
|
||||
':category' => $category,
|
||||
':title' => $title,
|
||||
':content' => $content,
|
||||
':is_secret' => $secret
|
||||
]);
|
||||
|
||||
$postId = $stmt->fetchColumn();
|
||||
handle_file_uploads($pdo, $postId);
|
||||
}
|
||||
|
||||
header("Location: /kngil/bbs/qa_detail.php?id={$postId}");
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$errors[] = 'DB 오류: ' . $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
7. 화면 출력
|
||||
=============================== */
|
||||
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_write.skin.php';
|
||||
223
kngil/bbs/sales_results.php
Normal file
223
kngil/bbs/sales_results.php
Normal file
@@ -0,0 +1,223 @@
|
||||
<?php
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
|
||||
/* -----------------------------------------------------
|
||||
🔵 DB 연결
|
||||
----------------------------------------------------- */
|
||||
try {
|
||||
$pdo = new PDO(
|
||||
"mysql:host=localhost;dbname=egbim;charset=utf8mb4",
|
||||
"egbim",
|
||||
"baron3840!!",
|
||||
[
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
|
||||
]
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(["status" => "fail", "message" => "DB 연결 실패"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------
|
||||
🔵 공통 날짜 변환 함수 (MM/DD/YYYY → YYYY-MM-DD)
|
||||
----------------------------------------------------- */
|
||||
function normalize_date($dateStr) {
|
||||
if (!$dateStr) return null;
|
||||
|
||||
// 이미 YYYY-MM-DD라면 그대로 반환
|
||||
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $dateStr)) {
|
||||
return $dateStr;
|
||||
}
|
||||
|
||||
// MM/DD/YYYY → YYYY-MM-DD (한자리/두자리 모두 허용)
|
||||
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $dateStr, $m)) {
|
||||
$month = str_pad($m[1], 2, '0', STR_PAD_LEFT);
|
||||
$day = str_pad($m[2], 2, '0', STR_PAD_LEFT);
|
||||
return "{$m[3]}-$month-$day";
|
||||
}
|
||||
|
||||
// 형식 이상하면 null 리턴
|
||||
return null;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------
|
||||
🔵 요청 액션
|
||||
----------------------------------------------------- */
|
||||
$action = $_POST['action'] ?? $_GET['action'] ?? "";
|
||||
|
||||
/* =====================================================
|
||||
1) LIST
|
||||
===================================================== */
|
||||
if ($action === "list") {
|
||||
$stmt = $pdo->query("
|
||||
SELECT r.*, m.emp_name
|
||||
FROM sales_results r
|
||||
LEFT JOIN sales_members m ON r.emp_no = m.emp_no
|
||||
ORDER BY r.seq_no DESC
|
||||
");
|
||||
|
||||
echo json_encode([
|
||||
"status" => "ok",
|
||||
"records" => $stmt->fetchAll()
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =====================================================
|
||||
2) INSERT (seq_no 자동 증가)
|
||||
===================================================== */
|
||||
if ($action === "insert") {
|
||||
|
||||
$sales_date = normalize_date($_POST['sales_date']);
|
||||
|
||||
if (!$sales_date) {
|
||||
echo json_encode([
|
||||
"status" => "error",
|
||||
"message" => "실적일(sales_date) 형식 오류. YYYY-MM-DD 또는 MM/DD/YYYY 로 입력하세요."
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$next_seq = $pdo->query("SELECT IFNULL(MAX(seq_no), 0) + 1 FROM sales_results")->fetchColumn();
|
||||
|
||||
// 🔥 서버에서 총금액 계산
|
||||
$qty = (int)($_POST['quantity'] ?? 0);
|
||||
$unit = (int)($_POST['unit_price'] ?? 0);
|
||||
$discount = (int)($_POST['discount'] ?? 0);
|
||||
|
||||
$total_amount = ($qty * $unit) - $discount;
|
||||
if ($total_amount < 0) $total_amount = 0;
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
INSERT INTO sales_results
|
||||
(seq_no, sales_date, emp_no, client_code, product_code, quantity, unit_price, discount, total_amount, remarks)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
$next_seq,
|
||||
$sales_date,
|
||||
$_POST['emp_no'],
|
||||
$_POST['client_code'],
|
||||
$_POST['product_code'],
|
||||
$qty,
|
||||
$unit,
|
||||
$discount,
|
||||
$total_amount, // 🔥 클라이언트 값 무시, 서버 계산값 넣기
|
||||
$_POST['remarks']
|
||||
]);
|
||||
|
||||
echo json_encode(["status" => "ok"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
/* =====================================================
|
||||
3) UPDATE
|
||||
===================================================== */
|
||||
if ($action === "update") {
|
||||
|
||||
$seq_no = $_POST['seq_no'] ?? '';
|
||||
if (!$seq_no) {
|
||||
echo json_encode(["status" => "error", "message" => "seq_no 누락"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
unset($_POST['action'], $_POST['seq_no']);
|
||||
|
||||
/* -----------------------------
|
||||
🔵 날짜 변환 (MM/DD/YYYY → YYYY-MM-DD)
|
||||
----------------------------- */
|
||||
if (!empty($_POST['sales_date'])) {
|
||||
$date = normalize_date($_POST['sales_date']);
|
||||
if (!$date) {
|
||||
echo json_encode(["status" => "error", "message" => "실적일(sales_date) 형식 오류"]);
|
||||
exit;
|
||||
}
|
||||
$_POST['sales_date'] = $date;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------
|
||||
🔥 quantity / unit_price / discount 변경 여부 확인
|
||||
----------------------------------------------------- */
|
||||
$qtyChanged = array_key_exists('quantity', $_POST);
|
||||
$unitChanged = array_key_exists('unit_price', $_POST);
|
||||
$discountChanged = array_key_exists('discount', $_POST);
|
||||
|
||||
if ($qtyChanged || $unitChanged || $discountChanged) {
|
||||
|
||||
// 기존 값 가져오기
|
||||
$old = $pdo->prepare("
|
||||
SELECT quantity, unit_price, discount
|
||||
FROM sales_results
|
||||
WHERE seq_no = ?
|
||||
");
|
||||
$old->execute([$seq_no]);
|
||||
$oldData = $old->fetch();
|
||||
|
||||
// 새 값이 있으면 새 값 사용, 없으면 기존 값 사용
|
||||
$qty = isset($_POST['quantity']) ? (int)$_POST['quantity'] : (int)$oldData['quantity'];
|
||||
$unit = isset($_POST['unit_price']) ? (int)$_POST['unit_price'] : (int)$oldData['unit_price'];
|
||||
$discount = isset($_POST['discount']) ? (int)$_POST['discount'] : (int)$oldData['discount'];
|
||||
|
||||
// 서버에서 총금액 재계산
|
||||
$total_amount = ($qty * $unit) - $discount;
|
||||
if ($total_amount < 0) $total_amount = 0;
|
||||
|
||||
$_POST['total_amount'] = $total_amount; // 🔥 강제 반영
|
||||
}
|
||||
|
||||
/* -----------------------------
|
||||
🔵 Partial Update (빈값은 무시)
|
||||
----------------------------- */
|
||||
$fields = [];
|
||||
$params = [];
|
||||
|
||||
foreach ($_POST as $key => $val) {
|
||||
|
||||
// NULL, 빈문자, undefined는 UPDATE 안함
|
||||
if ($val === '' || $val === null || $val === 'undefined') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$fields[] = "$key = ?";
|
||||
$params[] = $val;
|
||||
}
|
||||
|
||||
if (!empty($fields)) {
|
||||
$sql = "UPDATE sales_results SET "
|
||||
. implode(", ", $fields)
|
||||
. ", updated_at = NOW()
|
||||
WHERE seq_no = ?";
|
||||
$params[] = $seq_no;
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
}
|
||||
|
||||
echo json_encode(["status" => "ok"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/* =====================================================
|
||||
4) DELETE
|
||||
===================================================== */
|
||||
if ($action === "delete") {
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM sales_results WHERE seq_no = ?");
|
||||
$stmt->execute([$_POST['seq_no']]);
|
||||
|
||||
echo json_encode(["status" => "ok"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/* =====================================================
|
||||
요청 없음
|
||||
===================================================== */
|
||||
echo json_encode(["status" => "fail", "message" => "잘못된 요청"]);
|
||||
exit;
|
||||
?>
|
||||
219
kngil/css/adm_style.clean.css
Normal file
219
kngil/css/adm_style.clean.css
Normal file
@@ -0,0 +1,219 @@
|
||||
/* ==================================================
|
||||
adm_style.clean.css
|
||||
외부용 관리자 페이지 덮어쓰기 전용
|
||||
기존 adm_style.css 수정 금지
|
||||
================================================== */
|
||||
|
||||
/* ---------- 기본 톤 ---------- */
|
||||
body {
|
||||
background: #f8fafc;
|
||||
color: #111827;
|
||||
}
|
||||
|
||||
/* ---------- 카드 공통 ---------- */
|
||||
.card {
|
||||
border-radius: 14px;
|
||||
border-color: #e5e7eb;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
/* ---------- 관리자 요약 영역 ---------- */
|
||||
.adm-summary {
|
||||
border: 1px solid #e5e7eb !important;
|
||||
border-radius: 14px;
|
||||
background: #ffffff;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.04);
|
||||
}
|
||||
|
||||
.adm-summary .adm-row {
|
||||
padding: 10px 16px;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
.adm-summary .adm-row:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.adm-summary .label {
|
||||
color: #6b7280;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.adm-summary .value.bold {
|
||||
color: #111827;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* ---------- 사용량 바 ---------- */
|
||||
.usage-box {
|
||||
width: 520px;
|
||||
}
|
||||
|
||||
.usage-text {
|
||||
font-size: 12px;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
.usage-bar {
|
||||
height: 10px;
|
||||
border-radius: 999px;
|
||||
background: #e5e7eb;
|
||||
overflow: hidden;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.usage-used {
|
||||
background: #2563eb !important;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.usage-remain {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* ---------- 검색 영역 ---------- */
|
||||
.adm-search {
|
||||
background: #ffffff;
|
||||
border: 1px solid #e5e7eb;
|
||||
border-radius: 12px;
|
||||
padding: 10px 14px;
|
||||
}
|
||||
|
||||
.adm-search input,
|
||||
.adm-search select {
|
||||
height: 36px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* ---------- 상단 타이틀 ---------- */
|
||||
.adm-title {
|
||||
font-size: 22px;
|
||||
font-weight: 700;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
/* ---------- 상단 보조 버튼 ---------- */
|
||||
.adm-title-actions button {
|
||||
background: #f3f4f6;
|
||||
border: 1px solid #e5e7eb;
|
||||
color: #374151;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.adm-title-actions button:hover {
|
||||
background: #e5e7eb;
|
||||
}
|
||||
|
||||
/* ---------- 저장 버튼 ---------- */
|
||||
#btnSave_comp {
|
||||
background: #2563eb !important;
|
||||
border-color: #2563eb !important;
|
||||
color: #ffffff !important;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#btnSave_comp:hover {
|
||||
background: #1d4ed8 !important;
|
||||
}
|
||||
|
||||
/* ---------- 삭제 버튼 ---------- */
|
||||
#btnDelete {
|
||||
background: transparent !important;
|
||||
color: #dc2626 !important;
|
||||
border-color: #dc2626 !important;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#btnDelete:hover {
|
||||
background: #fee2e2 !important;
|
||||
}
|
||||
|
||||
/* ---------- 추가 버튼 ---------- */
|
||||
#btnAdd {
|
||||
background: transparent !important;
|
||||
color: #16a34a !important;
|
||||
border-color: #16a34a !important;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#btnAdd:hover {
|
||||
background: #ecfdf5 !important;
|
||||
}
|
||||
|
||||
/* ---------- 일괄 생성 버튼 ---------- */
|
||||
#btnBulkCreate {
|
||||
background: #f3f4f6 !important;
|
||||
color: #374151 !important;
|
||||
border-color: #e5e7eb !important;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
/* ---------- Grid 카드 ---------- */
|
||||
.grid-card {
|
||||
border-radius: 14px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ---------- w2ui Grid 외부용 ---------- */
|
||||
.w2ui-grid {
|
||||
border-radius: 14px;
|
||||
overflow: hidden;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
.w2ui-grid-header {
|
||||
background: #f9fafb !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.w2ui-grid-records tr {
|
||||
height: 44px;
|
||||
}
|
||||
|
||||
/* ---------- 홈 버튼 ---------- */
|
||||
.btn-home-fixed {
|
||||
background: #111827;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.btn-home-fixed:hover {
|
||||
background: #000000;
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
외부 사용자용 레이아웃 폭 제한
|
||||
=============================== */
|
||||
|
||||
/* 페이지 전체 폭 컨테이너 효과 */
|
||||
body {
|
||||
background: #f8fafc; /* 살짝 밝은 배경 */
|
||||
}
|
||||
|
||||
/* 관리자 페이지 실 컨텐츠 폭 제한 */
|
||||
.adm-title,
|
||||
.adm-summary,
|
||||
.adm-search,
|
||||
.card {
|
||||
max-width: 1400px; /* ← 여기만 조절 */
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/* 카드 간 간격 통일 */
|
||||
.card {
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
/* 검색 영역도 카드 느낌 */
|
||||
.adm-search {
|
||||
background: #fff;
|
||||
padding: 12px 16px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* 버튼 그룹 정리 */
|
||||
.adm-search button {
|
||||
white-space: nowrap;
|
||||
}
|
||||
532
kngil/css/adm_style.css
Normal file
532
kngil/css/adm_style.css
Normal file
@@ -0,0 +1,532 @@
|
||||
/*---------------20260119---------------*/
|
||||
/* ===============================
|
||||
서비스 등록 팝업
|
||||
=============================== */
|
||||
|
||||
.service-popup {
|
||||
padding: 10px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* 상단 */
|
||||
.service-top {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* 회원 정보 */
|
||||
.service-member {
|
||||
flex: 1;
|
||||
border: 1px solid #ddd;
|
||||
padding: 10px;
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
.service-member > div {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.purchase-date {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
/* 상품 선택 */
|
||||
.service-product {
|
||||
width: 420px;
|
||||
border: 1px solid #ddd;
|
||||
padding: 10px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.service-product .title {
|
||||
font-weight: bold;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
/* 저장 / 삭제 바 */
|
||||
.service-save-bar {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
margin: 12px 0;
|
||||
}
|
||||
|
||||
.service-save-bar .btn-delete {
|
||||
padding: 6px 14px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
background: rgb(247, 74, 52);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.service-save-bar .btn-delete:hover {
|
||||
background: #d32f2f;
|
||||
}
|
||||
|
||||
.service-save-bar .btn-save {
|
||||
padding: 6px 14px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
background: rgb(70, 58, 248);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.service-save-bar .btn-save:hover {
|
||||
background: #3c04f3;
|
||||
}
|
||||
|
||||
.service-save-bar .right-actions {
|
||||
display: flex;
|
||||
gap: 8px; /* 삭제-저장 간격 */
|
||||
}
|
||||
|
||||
/* Grid */
|
||||
.service-grid {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
/* 합계 */
|
||||
.service-summary {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 20px;
|
||||
padding: 10px;
|
||||
border-top: 2px solid #ccc;
|
||||
margin-top: 8px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
상품등록
|
||||
=============================== */
|
||||
|
||||
.product-wrap {
|
||||
max-width: 900px;
|
||||
margin: 40px auto;
|
||||
border: 1px solid #aaa;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.product-header {
|
||||
background: #f2f2f2;
|
||||
padding: 10px 14px;
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.product-header .btn-close {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 8px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.product-toolbar {
|
||||
padding: 8px 10px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.product-toolbar button {
|
||||
padding: 4px 10px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
Grid 액션 바(슈퍼관리자 상단)
|
||||
=============================== */
|
||||
|
||||
/* 검색 + 저장 버튼 한 줄 정렬 */
|
||||
/* 전체 한 줄 */
|
||||
.super-search-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin: 10px 20px;
|
||||
}
|
||||
|
||||
/* 좌측 검색 그룹 */
|
||||
.super-search {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* 검색 입력 공통 */
|
||||
.super-search select,
|
||||
.super-search input {
|
||||
height: 34px;
|
||||
padding: 0 10px;
|
||||
font-size: 13px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #d1d5db;
|
||||
}
|
||||
|
||||
/* 검색 버튼 */
|
||||
#btnSearch {
|
||||
height: 34px;
|
||||
padding: 0 14px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #2563eb;
|
||||
background: #2563eb;
|
||||
color: #374151;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#btnSearch:hover,
|
||||
#btnSearch:focus,
|
||||
#btnSearch:active {
|
||||
background: #ffffff;
|
||||
color: #374151;
|
||||
border: 1px solid #2563eb;
|
||||
box-shadow: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* 🔥 저장 버튼을 오른쪽 끝으로 */
|
||||
#btnSave {
|
||||
margin-left: auto;
|
||||
height: 34px;
|
||||
padding: 0 16px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #2563eb;
|
||||
background: #2563eb;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#btnSave:hover {
|
||||
background: #1d4ed8;
|
||||
}
|
||||
|
||||
#schMemberStatus {
|
||||
width: 130px;
|
||||
}
|
||||
|
||||
#schMemberName {
|
||||
width: 160px;
|
||||
}
|
||||
|
||||
#schRemainArea {
|
||||
width: 160px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#btnSuperSearch {
|
||||
margin-left: auto;
|
||||
height: 34px;
|
||||
padding: 0 16px;
|
||||
font-size: 13px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #2563eb;
|
||||
background: #2563eb;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#btnSuperSearch:hover {
|
||||
background: #1d4ed8;
|
||||
}
|
||||
|
||||
.grid-action-bar {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.btn-save {
|
||||
padding: 6px 14px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
background: #2f80ed;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-save:hover {
|
||||
background: #1f66d1;
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
관리자 요약 영역 (거래처관리자 상단)
|
||||
=============================== */
|
||||
|
||||
.adm-summary {
|
||||
border: 2px solid #1f6fd8;
|
||||
font-size: 13px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.adm-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 6px 10px;
|
||||
border-bottom: 1px solid #1f6fd8;
|
||||
}
|
||||
|
||||
.adm-row:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.adm-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.adm-item.right {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.label {
|
||||
font-weight: 600;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
.value {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.value.bold {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
|
||||
/* 사용량 */
|
||||
.adm-row.usage {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.usage-box {
|
||||
margin-left: auto;
|
||||
width: 520px;
|
||||
}
|
||||
|
||||
.usage-text {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-size: 12px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.usage-bar {
|
||||
display: flex;
|
||||
height: 22px;
|
||||
background: #eee;
|
||||
border-radius: 3px;
|
||||
overflow: hidden;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.usage-used {
|
||||
background: #ff6b6b;
|
||||
text-align: center;
|
||||
line-height: 22px;
|
||||
width: 60%;
|
||||
height: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.usage-remain {
|
||||
background: #4caf50;
|
||||
text-align: center;
|
||||
line-height: 22px;
|
||||
width: 40%;
|
||||
height: 100%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/*검색영역*/
|
||||
.adm-search {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
margin: 0 20px 10px;
|
||||
}
|
||||
|
||||
.adm-search input,
|
||||
.adm-search select {
|
||||
height: 32px;
|
||||
padding: 0 8px;
|
||||
font-size: 13px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #d1d5db;
|
||||
background: #fff;
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
.adm-search button {
|
||||
height: 32px;
|
||||
padding: 0 10px;
|
||||
font-size: 13px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #d1d5db;
|
||||
background: #ffffff;
|
||||
cursor: pointer;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.adm-search button:hover {
|
||||
background: #f9fafb;
|
||||
}
|
||||
|
||||
#btnSave_comp {
|
||||
background: #2563eb;
|
||||
border-color: #2563eb;
|
||||
color: #fff;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
#btnSave_comp:hover {
|
||||
background: #1d4ed8;
|
||||
}
|
||||
|
||||
#btnDelete {
|
||||
color: #dc2626;
|
||||
border-color: #dc2626;
|
||||
}
|
||||
|
||||
#btnDelete:hover {
|
||||
background: #fee2e2;
|
||||
}
|
||||
|
||||
#btnSearch {
|
||||
margin-left: auto;
|
||||
background: #f3f4f6;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
#btnAdd {
|
||||
border-color: #22c55e;
|
||||
color: #22c55e;
|
||||
}
|
||||
|
||||
#btnAdd:hover {
|
||||
background: #ecfdf5;
|
||||
}
|
||||
|
||||
/* 좌측 상단 홈 버튼 - 타이틀 높이 기준 정렬 */
|
||||
.btn-home-fixed {
|
||||
position: fixed;
|
||||
top: 14px;
|
||||
left: 16px;
|
||||
z-index: 2000;
|
||||
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
background: #000;
|
||||
color: #fff;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
/* ⭐ 반드시 SVG 크기 제한 */
|
||||
.btn-home-fixed .icon-home {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.adm-member-input {
|
||||
width: 140px;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
.btn-bulk {
|
||||
margin-right: 12px;
|
||||
background: #555;
|
||||
color: #080808;
|
||||
}
|
||||
|
||||
|
||||
/* ===============================
|
||||
관리자 페이지 타이틀 (슈퍼&거래처)
|
||||
=============================== */
|
||||
|
||||
.adm-title {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
margin: 12px 0 16px;
|
||||
}
|
||||
|
||||
/* 우측 상단 버튼 */
|
||||
.adm-title-actions {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* 구매이력 버튼 */
|
||||
.btn-history {
|
||||
padding: 6px 14px;
|
||||
font-size: 13px;
|
||||
border: 1px solid #999;
|
||||
background: #f5f5f5;
|
||||
cursor: pointer;
|
||||
right: 0;
|
||||
}
|
||||
.btn-history:hover {
|
||||
background: #e9e9e9;
|
||||
}
|
||||
|
||||
/* 상품등록 버튼 (강조 스타일) */
|
||||
.btn-product {
|
||||
padding: 6px 14px;
|
||||
font-size: 13px;
|
||||
border: 1px solid #1f6fd8;
|
||||
background: #1f6fd8;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn-product:hover {
|
||||
background: #185bb0;
|
||||
}
|
||||
|
||||
.btn-service {
|
||||
padding: 6px 14px;
|
||||
font-size: 13px;
|
||||
border: 1px solid #444;
|
||||
background: #444;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
공통
|
||||
=============================== */
|
||||
|
||||
body {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: #fff;
|
||||
border: 1px solid #ddd;
|
||||
padding: 16px 20px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* 버튼 공통 */
|
||||
button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
3700
kngil/css/common.css
Normal file
3700
kngil/css/common.css
Normal file
File diff suppressed because it is too large
Load Diff
456
kngil/css/faq/faq_default.css
Normal file
456
kngil/css/faq/faq_default.css
Normal file
@@ -0,0 +1,456 @@
|
||||
@charset "utf-8";
|
||||
|
||||
/* 초기화 */
|
||||
html {overflow-y:scroll}
|
||||
body {margin:0;padding:0;font-size:0.95em;_font-family:'Malgun Gothic', dotum, sans-serif;background:#fff}
|
||||
html, h1, h2, h3, h4, h5, h6, form, fieldset, img {margin:0;padding:0;border:0}
|
||||
h1, h2, h3, h4, h5, h6 {font-size:1em;_font-family:'Malgun Gothic', dotum, sans-serif}
|
||||
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block}
|
||||
|
||||
ul, dl,dt,dd {margin:0;padding:0;list-style:none}
|
||||
legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
|
||||
label, input, button, select, img {vertical-align:middle;font-size:1em}
|
||||
input, button {margin:0;padding:0;_font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em}
|
||||
input[type="submit"] {cursor:pointer}
|
||||
button {cursor:pointer}
|
||||
|
||||
textarea, select {_font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em}
|
||||
select {margin:0}
|
||||
p {margin:0;padding:0;word-break:break-all}
|
||||
hr {display:none}
|
||||
pre {overflow-x:scroll;font-size:1.1em}
|
||||
a {color:#000;text-decoration:none}
|
||||
|
||||
*, :after, :before {
|
||||
-webkit-box-sizing:border-box;
|
||||
-moz-box-sizing:border-box;
|
||||
box-sizing:border-box;
|
||||
}
|
||||
|
||||
input[type=text],input[type=password], textarea {
|
||||
-webkit-transition:all 0.30s ease-in-out;
|
||||
-moz-transition:all 0.30s ease-in-out;
|
||||
-ms-transition:all 0.30s ease-in-out;
|
||||
-o-transition:all 0.30s ease-in-out;
|
||||
outline:none;
|
||||
}
|
||||
|
||||
input[type=text]:focus,input[type=password]:focus, textarea:focus,select:focus {
|
||||
-webkit-box-shadow:0 0 5px #9ed4ff;
|
||||
-moz-box-shadow:0 0 5px #9ed4ff;
|
||||
box-shadow:0 0 5px #9ed4ff;
|
||||
border:1px solid #558ab7 !important;
|
||||
}
|
||||
|
||||
.placeholdersjs {color:#aaa !important}
|
||||
|
||||
/* 레이아웃 크기 지정 */
|
||||
#hd, #wrapper, #ft {min-width:1200px}
|
||||
|
||||
#hd_pop,
|
||||
#hd_wrapper,
|
||||
#tnb .inner,
|
||||
|
||||
#gnb .gnb_wrap,
|
||||
#container_wr,
|
||||
#ft_wr {width:1200px}
|
||||
|
||||
/* 팝업레이어 */
|
||||
#hd_pop {z-index:1000;position:relative;margin:0 auto;height:0}
|
||||
#hd_pop h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff}
|
||||
.hd_pops img {max-width:100%}
|
||||
.hd_pops_con {}
|
||||
.hd_pops_footer {padding:0;background:#000;color:#fff;text-align:left;position:relative}
|
||||
.hd_pops_footer:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.hd_pops_footer button {padding:10px;border:0;color:#fff}
|
||||
.hd_pops_footer .hd_pops_reject {background:#000;text-align:left}
|
||||
.hd_pops_footer .hd_pops_close {background:#393939;position:absolute;top:0;right:0}
|
||||
|
||||
/* 상단 레이아웃 */
|
||||
#hd {background:#212020}
|
||||
#hd_h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
|
||||
#tnb {border-bottom:1px solid #383838;margin:0 auto}
|
||||
#tnb:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#tnb .inner {margin:0 auto}
|
||||
|
||||
#hd_wrapper {position:relative;margin:0 auto;height:140px;zoom:1}
|
||||
#hd_wrapper:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
|
||||
#logo {float:left;padding:30px 0 0}
|
||||
|
||||
.hd_sch_wr {float:left;padding:30px 0;width:445px;margin-left:65px}
|
||||
#hd_sch h3 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
#hd_sch {border-radius:30px;overflow:hidden}
|
||||
#hd_sch #sch_stx {float:left;width:385px;height:45px;padding-left:10px;border-radius:30px 0 0 30px;background:#2c2c2c;border:0;border-right:0;font-size:1.25em;color:#fff}
|
||||
#hd_sch #sch_submit {float:left;width:60px;height:45px;border:0;background:#2c2c2c;color:#fff;border-radius:0 30px 30px 0;cursor:pointer;font-size:16px}
|
||||
|
||||
#hd_define {float:left}
|
||||
#hd_define:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#hd_define li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px}
|
||||
#hd_define li:last-child {padding-right:0;margin-right:0;border-right:0}
|
||||
#hd_define li a {display:inline-block;color:#919191}
|
||||
#hd_define li.active a {color:#fff}
|
||||
|
||||
|
||||
#hd_qnb {float:right;text-align:right}
|
||||
#hd_qnb:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#hd_qnb li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px}
|
||||
#hd_qnb li:last-child {padding-right:0;margin-right:0;border-right:0}
|
||||
#hd_qnb li span {display:block;margin-top:5px;font-size:0.92em}
|
||||
#hd_qnb li a {display:inline-block;color:#919191}
|
||||
#hd_qnb .visit .visit-num {display:inline-block;line-height:16px;padding:0 5px;margin-left:5px;border-radius:10px;background:#da22f5;color:#fff;font-size:10px}
|
||||
|
||||
|
||||
.hd_login {position:absolute;right:0;top:60px}
|
||||
.hd_login li {float:left;margin:0 5px;border-left:1px solid #616161;padding-left:10px;line-height:13px}
|
||||
.hd_login li:first-child {border-left:0}
|
||||
.hd_login a {color:#fff}
|
||||
|
||||
|
||||
/* 메인메뉴 */
|
||||
#gnb {position:relative;background:#fff}
|
||||
#gnb > h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
#gnb .gnb_wrap {margin:0 auto;position:relative}
|
||||
#gnb .gnb_wrap:hover, #gnb .gnb_wrap:focus, #gnb .gnb_wrap:active{z-index:3}
|
||||
#gnb #gnb_1dul {font-size:1.083em;padding:0;border-bottom:1px solid #e0e2e5;zoom:1}
|
||||
#gnb ul:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#gnb .gnb_1dli {float:left;line-height:55px;padding:0px;position:relative}
|
||||
#gnb .gnb_1dli:hover > a {color:#3a8afd;
|
||||
-webkit-transition:background-color 2s ease-out;
|
||||
-moz-transition:background-color 0.3s ease-out;
|
||||
-o-transition:background-color 0.3s ease-out;
|
||||
transition:background-color 0.3s ease-out}
|
||||
|
||||
.gnb_1dli .bg {position:absolute;top:24px;right:8px;display:inline-block;width:10px;height:10px;overflow:hidden;background:url('../img/gnb_bg2.gif') no-repeat 50% 50%;text-indent:-999px}
|
||||
.gnb_1da {display:block;font-weight:bold;padding:0 15px;color:#080808;text-decoration:none}
|
||||
.gnb_1dli.gnb_al_li_plus .gnb_1da{padding-right:25px}
|
||||
.gnb_2dli:first-child {border:0}
|
||||
.gnb_2dul {display:none;position:absolute;top:54px;min-width:140px;padding-top:2px}
|
||||
.gnb_2dul .gnb_2dul_box {border:1px solid #e0e2e5;border-top:0;padding:0;
|
||||
-webkit-box-shadow:0px 1px 5px rgba(97, 97, 97, 0.2);
|
||||
-moz-box-shadow:0px 1px 5px rgba(97, 97, 97, 0.2);
|
||||
box-shadow:0px 1px 5px rgba(97, 97, 97, 0.2)}
|
||||
.gnb_2da {display:block;padding:0 10px;line-height:40px;background:#fff;color:#080808;text-align:left;text-decoration:none}
|
||||
a.gnb_2da:hover {color:#3a8afd;background:#f7f7f8;
|
||||
-moz-transition:all 0.3s ease-out;
|
||||
-o-transition:all 0.3s ease-out;
|
||||
transition:all 0.3s ease-out}
|
||||
|
||||
.gnb_1dli_air .gnb_2da {}
|
||||
.gnb_1dli_on .gnb_2da {}
|
||||
.gnb_2da:focus, .gnb_2da:hover {color:#fff}
|
||||
.gnb_1dli_over .gnb_2dul {display:block;left:0}
|
||||
.gnb_1dli_over2 .gnb_2dul {display:block;right:0}
|
||||
.gnb_wrap .gnb_empty {padding:10px 0;width:100%;text-align:center;line-height:2.7em;color:#080808}
|
||||
.gnb_wrap .gnb_empty a {color:#3a8afd;text-decoration:underline}
|
||||
.gnb_wrap .gnb_al_ul .gnb_empty, .gnb_wrap .gnb_al_ul .gnb_empty a {color:#555}
|
||||
|
||||
#gnb .gnb_menu_btn {background:#4158d1;color:#fff;width:50px;height:55px;border:0;vertical-align:top;font-size:18px}
|
||||
#gnb .gnb_close_btn {background:#fff;color:#b6b9bb;width:50px;height:50px;border:0;vertical-align:top;font-size:18px;position:absolute;top:0;right:0}
|
||||
#gnb .gnb_mnal {float:right;padding:0}
|
||||
|
||||
#gnb_all {display:none;position:absolute;border:1px solid #c5d6da;width:100%;background:#fff;z-index:1000;-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2);
|
||||
-moz-box-shadow:0 2px 5px rgba(0,0,0,0.2);
|
||||
box-shadow:0 2px 5px rgba(0,0,0,0.2)}
|
||||
#gnb_all h2 {font-size:1.3em;padding:15px 20px;border-bottom:1px solid #e7eeef}
|
||||
#gnb_all .gnb_al_ul:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#gnb_all .gnb_al_ul > li:nth-child(5n+1) {border-left:0}
|
||||
#gnb_all .gnb_al_li {float:left;width:20%;min-height:150px;padding:20px;border-left:1px solid #e7eeef}
|
||||
#gnb_all .gnb_al_li .gnb_al_a {font-size:1.2em;display:block;position:relative;margin-bottom:10px;font-weight:bold;color:#3a8afd}
|
||||
#gnb_all .gnb_al_li li {line-height:2em}
|
||||
#gnb_all .gnb_al_li li a {color:#555}
|
||||
#gnb_all_bg {display:none;background:rgba(0,0,0,0.1);width:100%;height:100%;position:fixed;left:0;top:0;z-index:999}
|
||||
|
||||
/* 중간 레이아웃 */
|
||||
#wrapper {}
|
||||
#container_wr:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#container_wr {margin:0 auto;zoom:1}
|
||||
#aside {float:right;width:235px;padding:0;height:100%;margin:20px 0 20px 20px}
|
||||
|
||||
#container {position:relative;float:left;min-height:500px;height:auto !important;margin:20px 0;font-size:1em;width:930px;zoom:1}
|
||||
#container:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#container_title {font-size:1.333em;margin:0 auto;font-weight:bold}
|
||||
#container_title span {margin:0 auto 10px;display:block;line-height:30px}
|
||||
|
||||
.lt_wr {width:32%}
|
||||
.lt_wr:nth-child(3n+1) {clear:both}
|
||||
.latest_wr {margin-bottom:20px}
|
||||
.latest_wr:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.latest_top_wr {margin:0 -10px 20px}
|
||||
.latest_top_wr:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
|
||||
/* 하단 레이아웃 */
|
||||
#ft {background:#212020;margin:0 auto;text-align:center}
|
||||
#ft h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
#ft_wr {max-width:1240px;margin:0;padding:40px 0;position:relative;display:inline-block;text-align:left}
|
||||
#ft_wr:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#ft_wr .ft_cnt {width:25%;float:left;padding:0 20px}
|
||||
|
||||
#ft_link {text-align:left}
|
||||
#ft_link a {display:block;color:#fff;line-height:2em;font-weight:bold}
|
||||
#ft_company h2 {font-size:1.2em;margin-bottom:20px}
|
||||
#ft_company {font-weight:normal;color:#e3e3e3;line-height:2em}
|
||||
#ft_catch {margin:20px 0 10px}
|
||||
#ft_copy {text-align:center;width:1200px;margin:0 auto;padding:20px 0;color:#5b5b5b;font-size:0.92em;border-top:1px solid #383838}
|
||||
#top_btn {position:fixed;bottom:20px;right:20px;width:50px;height:50px;line-height:46px;border:2px solid #333;color:#333;text-align:center;font-size:15px;z-index:90;background:rgba(255,255,255,0.5)}
|
||||
#top_btn:hover {border-color:#3059c7;background:#3059c7;color:#fff}
|
||||
|
||||
/* 게시물 선택복사 선택이동 */
|
||||
#copymove {}
|
||||
#copymove .win_desc {text-align:center;display:block}
|
||||
#copymove .tbl_wrap {margin:20px}
|
||||
#copymove .win_btn {padding:0 20px 20px}
|
||||
.copymove_current {float:right;background:#ff3061;padding:5px;color:#fff;border-radius:3px}
|
||||
.copymove_currentbg {background:#f4f4f4}
|
||||
|
||||
/* 화면낭독기 사용자용 */
|
||||
#hd_login_msg {position:absolute;top:0;left:0;font-size:0;line-height:0;overflow:hidden}
|
||||
.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;width:0;height:0;margin:0 !important;padding:0 !important;font-size:0;line-height:0;border:0 !important;overflow:hidden !important}
|
||||
|
||||
/* 본문 바로가기 */
|
||||
#skip_to_container a {z-index:100000;position:absolute;top:0;left:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden}
|
||||
#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:2em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em}
|
||||
|
||||
/* ie6 이미지 너비 지정 */
|
||||
.img_fix {width:100%;height:auto}
|
||||
|
||||
/* 캡챠 자동등록(입력)방지 기본 -pc */
|
||||
#captcha {display:inline-block;position:relative}
|
||||
#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
|
||||
#captcha #captcha_img {height:40px;border:1px solid #898989;vertical-align:top;padding:0;margin:0}
|
||||
#captcha #captcha_mp3 {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat;text-indent:-999px;border-radius:3px}
|
||||
#captcha #captcha_reload {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat 0 -40px;text-indent:-999px;border-radius:3px}
|
||||
#captcha #captcha_key {margin:0 0 0 3px;padding:0 5px;width:90px;height:40px;border:1px solid #ccc;background:#fff;font-size:1.333em;font-weight:bold;text-align:center;border-radius:3px;vertical-align:top}
|
||||
#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em}
|
||||
|
||||
/* 캡챠 자동등록(입력)방지 기본 - mobile */
|
||||
#captcha.m_captcha audio {display:block;margin:0 0 5px;width:187px}
|
||||
#captcha.m_captcha #captcha_img {width:160px;height:60px;border:1px solid #e9e9e9;margin-bottom:3px;margin-top:5px;display:block}
|
||||
#captcha.m_captcha #captcha_reload {position:static;margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat 0 -40px;text-indent:-999px}
|
||||
#captcha.m_captcha #captcha_reload span {display:none}
|
||||
#captcha.m_captcha #captcha_key {margin:0;padding:0 5px;width:115px;height:29px;border:1px solid #b8c9c2;background:#f7f7f7;font-size:1.333em;font-weight:bold;text-align:center;line-height:29px;margin-left:3px}
|
||||
#captcha.m_captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em}
|
||||
#captcha.m_captcha #captcha_mp3 {width:31px;height:31px;background:url('../../../img/captcha2.png') no-repeat 0 0 ; vertical-align:top;overflow:hidden;cursor:pointer;text-indent:-9999px;border:none}
|
||||
|
||||
/* ckeditor 단축키 */
|
||||
.cke_sc {margin:0 0 5px;text-align:right}
|
||||
.btn_cke_sc {display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;line-height:1.9em;vertical-align:middle;cursor:pointer}
|
||||
.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f7f7f7;text-align:center}
|
||||
.cke_sc_def dl {margin:0 0 5px;text-align:left;zoom:1}
|
||||
.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9}
|
||||
.cke_sc_def dt {width:20%;font-weight:bold}
|
||||
.cke_sc_def dd {width:30%}
|
||||
|
||||
/* ckeditor 태그 기본값 */
|
||||
#bo_v_con ul {display:block;list-style-type:disc;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px}
|
||||
#bo_v_con ol {display:block;list-style-type:decimal;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px}
|
||||
#bo_v_con li {display:list-item}
|
||||
|
||||
/* 버튼 */
|
||||
a.btn,.btn {line-height:35px;height:35px;padding:0 10px;text-align:center;font-weight:bold;border:0;font-size:1.4em;
|
||||
-webkit-transition:background-color 0.3s ease-out;
|
||||
-moz-transition:background-color 0.3s ease-out;
|
||||
-o-transition:background-color 0.3s ease-out;
|
||||
transition:background-color 0.3s ease-out}
|
||||
|
||||
a.btn01 {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;vertical-align:middle}
|
||||
a.btn01:focus, a.btn01:hover {text-decoration:none}
|
||||
button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none}
|
||||
a.btn02 {display:inline-block;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none;vertical-align:middle}
|
||||
a.btn02:focus, .btn02:hover {text-decoration:none}
|
||||
button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none}
|
||||
|
||||
.btn_confirm {text-align:right} /* 서식단계 진행 */
|
||||
|
||||
.btn_submit {border:0;background:#3a8afd;color:#000;cursor:pointer;border-radius:3px}
|
||||
.btn_submit:hover {background:#2375eb}
|
||||
.btn_close {border:1px solid #dcdcdc;cursor:pointer;border-radius:3px;background:#fff}
|
||||
a.btn_close {text-align:center;line-height:50px}
|
||||
|
||||
a.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle}
|
||||
button.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle}
|
||||
.btn_cancel:hover {background:#aaa}
|
||||
a.btn_frmline, button.btn_frmline {display:inline-block;width:128px;padding:0 5px;height:40px;border:0;background:#434a54;border-radius:3px;color:#fff;text-decoration:none;vertical-align:top} /* 우편번호검색버튼 등 */
|
||||
a.btn_frmline {}
|
||||
button.btn_frmline {font-size:1em}
|
||||
|
||||
/* 게시판용 버튼 */
|
||||
a.btn_b01,.btn_b01 {display:inline-block;color:#bababa;text-decoration:none;vertical-align:middle;border:0;background:transparent}
|
||||
.btn_b01:hover, .btn_b01:hover {color:#000}
|
||||
a.btn_b02,.btn_b02 {display:inline-block;background:#253dbe;padding:0 10px;color:#fff;text-decoration:none;border:0;vertical-align:middle}
|
||||
a.btn_b02:hover, .btn_b02:hover {background:#0025eb}
|
||||
a.btn_b03, .btn_b03 {display:inline-block;background:#fff;border:1px solid #b9bdd3;color:#646982;text-decoration:none;vertical-align:middle}
|
||||
a.btn_b03:hover, .btn_b03:hover {background:#ebedf6}
|
||||
a.btn_b04, .btn_b04 {display:inline-block;background:#fff;border:1px solid #ccc;color:#707070;text-decoration:none;vertical-align:middle}
|
||||
a.btn_b04:hover, .btn_b04:hover {color:#333;background:#f9f9f9}
|
||||
a.btn_admin,.btn_admin {display:inline-block;color:#d13f4a;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */
|
||||
.btn_admin:hover, a.btn_admin:hover {color:#ff3746}
|
||||
|
||||
|
||||
/* 기본테이블 */
|
||||
.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0 5px;background:#fff;border-top:1px solid #ececec;border-bottom:1px solid #ececec}
|
||||
.tbl_wrap caption {padding:10px 0;font-weight:bold;text-align:left}
|
||||
.tbl_head01 {margin:0 0 10px}
|
||||
.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden}
|
||||
.tbl_head01 thead th {padding:20px 0;font-weight:normal;text-align:center;border-bottom:1px solid #ececec;height:40px}
|
||||
.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */
|
||||
.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center}
|
||||
.tbl_head01 tbody th {padding:8px 0;border-bottom:1px solid #e8e8e8}
|
||||
.tbl_head01 td {color:#666;padding:10px 5px;border-top:1px solid #ecf0f1;border-bottom:1px solid #ecf0f1;line-height:1.4em;height:60px;word-break:break-all}
|
||||
.tbl_head01 tbody tr:hover td {background:#fafafa}
|
||||
.tbl_head01 a:hover {text-decoration:underline}
|
||||
|
||||
.tbl_head02 {margin:0 0 10px}
|
||||
.tbl_head02 caption {padding:0;font-size:0;line-height:0;overflow:hidden}
|
||||
.tbl_head02 thead th {padding:5px 0;border-top:1px solid #d1dee2;border-bottom:1px solid #d1dee2;background:#e5ecef;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em}
|
||||
.tbl_head02 thead a {color:#383838}
|
||||
.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */
|
||||
.tbl_head02 tfoot th, .tbl_head02 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center}
|
||||
.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:#fff}
|
||||
.tbl_head02 td {padding:5px 3px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:#fff;line-height:1.4em;word-break:break-all}
|
||||
.tbl_head02 a {}
|
||||
|
||||
/* 폼 테이블 */
|
||||
.tbl_frm01 {margin:0 0 20px}
|
||||
.tbl_frm01 table {width:100%;border-collapse:collapse;border-spacing:0}
|
||||
.tbl_frm01 th {width:70px;padding:7px 13px;border:1px solid #e9e9e9;border-left:0;background:#f5f8f9;text-align:left}
|
||||
.tbl_frm01 td {padding:7px 10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:transparent}
|
||||
.wr_content textarea,.tbl_frm01 textarea,.form_01 textarea, .frm_input {border:1px solid #d0d3db;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;
|
||||
-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
}
|
||||
.tbl_frm01 textarea {padding:2px 2px 3px}
|
||||
.frm_input {height:40px}
|
||||
|
||||
.full_input {width:100%}
|
||||
.half_input {width:49.5%}
|
||||
.twopart_input {width:385px;margin-right:10px}
|
||||
.tbl_frm01 textarea, .write_div textarea {width:100%;height:100px}
|
||||
.tbl_frm01 a {text-decoration:none}
|
||||
.tbl_frm01 .frm_file {display:block;margin-bottom:5px}
|
||||
.tbl_frm01 .frm_info {display:block;padding:0 0 5px;line-height:1.4em}
|
||||
|
||||
/*기본 리스트*/
|
||||
.list_01 ul {border-top:1px solid #ececec}
|
||||
.list_01 li {border-bottom:1px solid #ececec;background:#fff;padding:10px 15px;list-style:none;position:relative}
|
||||
.list_01 li:nth-child(odd) {background:#f6f6f6}
|
||||
.list_01 li:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.list_01 li:hover {background:#f9f9f9}
|
||||
.list_01 li.empty_li {text-align:center;padding:20px 0;color:#666}
|
||||
|
||||
/*폼 리스트*/
|
||||
.form_01 h2 {font-size:1.167em}
|
||||
.form_01 li {margin-bottom:10px}
|
||||
.form_01 ul:after,
|
||||
.form_01 li:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.form_01 .left_input {float:left}
|
||||
.form_01 .margin_input {margin-right:1%}
|
||||
.form_01 textarea {height:100px;width:100%}
|
||||
.form_01 .frm_label {display:inline-block;width:130px}
|
||||
|
||||
/* 자료 없는 목록 */
|
||||
.empty_table {padding:50px 0 !important;text-align:center}
|
||||
.empty_list {padding:20px 0 !important;color:#666;text-align:center}
|
||||
|
||||
/* 필수입력 */
|
||||
.required, textarea.required {background-image:url('../img/require.png') !important;background-repeat:no-repeat !important;background-position:right top !important}
|
||||
|
||||
/* 테이블 항목별 정의 */
|
||||
.td_board {width:80px;text-align:center}
|
||||
.td_category {width:80px;text-align:center}
|
||||
.td_chk {width:30px;text-align:center}
|
||||
.td_date {width:60px;text-align:center}
|
||||
.td_datetime {width:110px;text-align:center}
|
||||
.td_group {width:80px;text-align:center}
|
||||
.td_mb_id {width:100px;text-align:center}
|
||||
.td_mng {width:80px;text-align:center}
|
||||
.td_name {width:100px;text-align:left}
|
||||
.td_nick {width:100px;text-align:center}
|
||||
.td_num {width:50px;text-align:center}
|
||||
.td_numbig {width:80px;text-align:center}
|
||||
.td_stat {width:60px;text-align:center}
|
||||
|
||||
.txt_active {color:#5d910b}
|
||||
.txt_done {color:#e8180c}
|
||||
.txt_expired {color:#ccc}
|
||||
.txt_rdy {color:#8abc2a}
|
||||
|
||||
/* 새창 기본 스타일 */
|
||||
.new_win {position:relative}
|
||||
.new_win .tbl_wrap {margin:0 20px}
|
||||
.new_win #win_title {font-size:1.3em;height:50px;line-height:30px;padding:10px 20px;background:#fff;color:#000;-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);
|
||||
-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);
|
||||
box-shadow:0 1px 10px rgba(0,0,0,.1)}
|
||||
.new_win #win_title .sv {font-size:0.75em;line-height:1.2em}
|
||||
.new_win .win_ul {margin-bottom:15px;padding:0 20px}
|
||||
.new_win .win_ul:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.new_win .win_ul li {float:left;background:#fff;text-align:center;padding:0 10px;border:1px solid #d6e9ff;border-radius:30px;margin-left:5px}
|
||||
.new_win .win_ul li:first-child {margin-left:0}
|
||||
.new_win .win_ul li a {display:block;padding:8px 0;color:#6794d3}
|
||||
.new_win .win_ul .selected {background:#3a8afd;border-color:#3a8afd;position:relative;z-index:5}
|
||||
.new_win .win_ul .selected a {color:#fff;font-weight:bold}
|
||||
.new_win .win_desc {position:relative;margin:10px;border-radius:5px;font-size:1em;background:#f2838f;color:#fff;line-height:50px;text-align:left;padding:0 20px}
|
||||
.new_win .win_desc i {font-size:1.2em;vertical-align:baseline}
|
||||
.new_win .win_desc:after {content:"";position:absolute;left:0;top:0;width:4px;height:50px;background:#da4453;border-radius:3px 0 0 3px}
|
||||
.new_win .frm_info {font-size:0.92em;color:#919191}
|
||||
.new_win .win_total {float:right;display:inline-block;line-height:30px;font-weight:normal;font-size:0.75em;color:#3a8afd;background:#f6f6f6;padding:0 10px;border-radius:5px}
|
||||
.new_win .new_win_con {margin:20px 0;padding:20px}
|
||||
.new_win .new_win_con:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.new_win .new_win_con2 {margin:20px 0}
|
||||
.new_win .btn_confirm:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.new_win .win_btn {text-align:center}
|
||||
.new_win .cert_btn {margin-bottom:30px;text-align:center}
|
||||
.new_win .btn_close {padding:0 20px;height:45px;overflow:hidden;cursor:pointer}
|
||||
.new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em}
|
||||
|
||||
/* 검색결과 색상 */
|
||||
.sch_word {color:#fff;background:#ff005a;padding:2px 5px 3px;line-height:18px;margin:0 2px}
|
||||
|
||||
/* 자바스크립트 alert 대안 */
|
||||
#validation_check {margin:100px auto;width:500px}
|
||||
#validation_check h1 {margin-bottom:20px;font-size:1.3em}
|
||||
#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff}
|
||||
|
||||
/* 사이드뷰 */
|
||||
.sv_wrap {position:relative;font-weight:normal}
|
||||
.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;font-size:0.92em;background:#333;
|
||||
-webkit-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
|
||||
-moz-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
|
||||
box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2)}
|
||||
.sv_wrap .sv:before {content:"";position:absolute;top:-6px;left:15px;width:0;height:0;border-style:solid;border-width:0 6px 6px 6px;border-color:transparent transparent #333 transparent}
|
||||
.sv_wrap .sv a {display:inline-block;margin:0;padding:0 10px;line-height:30px;width:100px;font-weight:normal;color:#bbb}
|
||||
.sv_wrap .sv a:hover {background:#000;color:#fff}
|
||||
.sv_member {color:#333}
|
||||
.sv_on {display:block !important;position:absolute;top:23px;left:0px;width:auto;height:auto}
|
||||
.sv_nojs .sv {display:block}
|
||||
|
||||
/* 페이징 */
|
||||
.pg_wrap {clear:both;float:left;display:inline-block}
|
||||
.pg_wrap:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
.pg {text-align:center}
|
||||
.pg_page, .pg_current {display:inline-block;vertical-align:middle;background:#eee;border:1px solid #eee}
|
||||
.pg a:focus, .pg a:hover {text-decoration:none}
|
||||
.pg_page {color:#959595;font-size:1.083em;height:30px;line-height:28px;padding:0 5px;min-width:30px;text-decoration:none;border-radius:3px}
|
||||
.pg_page:hover {background-color:#fafafa}
|
||||
.pg_start {text-indent:-999px;overflow:hidden;background:url('../img/btn_first.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
|
||||
.pg_prev {text-indent:-999px;overflow:hidden;background:url('../img/btn_prev.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
|
||||
.pg_end {text-indent:-999px;overflow:hidden;background:url('../img/btn_end.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
|
||||
.pg_next {text-indent:-999px;overflow:hidden;background:url('../img/btn_next.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
|
||||
.pg_start:hover,.pg_prev:hover,.pg_end:hover,.pg_next:hover {background-color:#fafafa}
|
||||
|
||||
.pg_current {display:inline-block;background:#3a8afd;border:1px solid #3a8afd;color:#fff;font-weight:bold;height:30px;line-height:30px;padding:0 10px;min-width:30px;border-radius:3px}
|
||||
|
||||
/* cheditor 이슈 */
|
||||
.cheditor-popup-window *, .cheditor-popup-window :after, .cheditor-popup-window :before {
|
||||
-webkit-box-sizing:content-box;
|
||||
-moz-box-sizing:content-box;
|
||||
box-sizing:content-box;
|
||||
}
|
||||
|
||||
/* Mobile화면으로 */
|
||||
#device_change {display:block;margin:0.3em;padding:0.5em 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center}
|
||||
|
||||
49
kngil/css/faq/faq_font.css
Normal file
49
kngil/css/faq/faq_font.css
Normal file
@@ -0,0 +1,49 @@
|
||||
@charset "utf-8";
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
src: url(/kngil/fonts/faq/NotoKR-Thin/notokr-thin.woff2) format('woff2'),
|
||||
url(/kngil/fonts/faq/NotoKR-Thin/notokr-thin.woff) format('woff'),
|
||||
url(/kngil/fonts/faq/NotoKR-Thin/notokr-thin.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url(/kngil/fonts/faq/NotoKR-Light/notokr-light.woff2) format('woff2'),
|
||||
url(/kngil/fonts/faq/NotoKR-Light/notokr-light.woff) format('woff'),
|
||||
url(/kngil/fonts/faq/NotoKR-Light/notokr-light.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(/kngil/fonts/faq/NotoKR-Regular/notokr-regular.woff2) format('woff2'),
|
||||
url(/kngil/fonts/faq/NotoKR-Regular/notokr-regular.woff) format('woff'),
|
||||
url(/kngil/fonts/faq/NotoKR-Regular/notokr-regular.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url(/kngil/fonts/faq/NotoKR-Medium/notokr-medium.woff2) format('woff2'),
|
||||
url(/kngil/fonts/faq/NotoKR-Medium/notokr-medium.woff) format('woff'),
|
||||
url(/kngil/fonts/faq/NotoKR-Medium/notokr-medium.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(/kngil/fonts/faq/NotoKR-Bold/notokr-bold.woff2) format('woff2'),
|
||||
url(/kngil/fonts/faq/NotoKR-Bold/notokr-bold.woff) format('woff'),
|
||||
url(/kngil/fonts/faq/NotoKR-Bold/notokr-bold.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
src: url(/kngil/fonts/faq/NotoKR-Black/notokr-black.woff2) format('woff2'),
|
||||
url(/kngil/fonts/faq/NotoKR-Black/notokr-black.woff) format('woff'),
|
||||
url(/kngil/fonts/faq/NotoKR-Black/notokr-black.otf) format('opentype');
|
||||
}
|
||||
47
kngil/css/faq/faq_reset.css
Normal file
47
kngil/css/faq/faq_reset.css
Normal file
@@ -0,0 +1,47 @@
|
||||
@charset "utf-8";
|
||||
|
||||
/* Reset */
|
||||
* {box-sizing: border-box;}
|
||||
html, body, h1, h2, h3, h4, h5, h6, div, p, pre, code, address, ul, ol, li, menu, nav, section, article, aside,
|
||||
dl ,dt, dd, table, thead, tbody, tfoot, label, caption, th, td, form, fieldset, legend, hr, input, button, textarea, object, figure, figcaption {margin:0; padding:0;}
|
||||
html, body {width:100%; height:100%; font-family: 'Noto Sans KR', sans-serif; }
|
||||
body {background:#fff; min-width:360px; -webkit-text-size-adjust:none;word-wrap:break-word;word-break:break-all;}
|
||||
body, input, select, textarea, button {background:none; border:none;}
|
||||
button {background: none; cursor: pointer; user-select: none;}
|
||||
ul, ol, li {list-style:none;}
|
||||
table {width:100%;border-spacing:0;border-collapse:collapse;}
|
||||
img, fieldset {border:0;}
|
||||
address, cite, code {font-style:normal;font-weight:normal;}
|
||||
em {font-style:normal;font-weight:bold;}
|
||||
i {font-style: normal;}
|
||||
label, img, input, select, textarea, button {font-family:inherit; vertical-align:middle;}
|
||||
caption, legend {line-height:0;font-size:1px;overflow:hidden;}
|
||||
hr{display:none;}
|
||||
main, header, section, nav, footer, aside, article, figure {display:block;}
|
||||
a {color:inherit; text-decoration:none;}
|
||||
a:hover {text-decoration:none;}
|
||||
/* Form */
|
||||
input[type=text]::placeholder, input::-webkit-input-placeholder{font-weight:500; color:#bdbdbd;}
|
||||
select:focus,
|
||||
textarea:focus,
|
||||
input:focus {border: 1; outline: none;}
|
||||
input[type=text][readonly],
|
||||
input[type=text][readonly]:focus {border:1;}
|
||||
input[type=tel][readonly],
|
||||
input[type=password][readonly],
|
||||
input[type=email][readonly],
|
||||
input[type=search][readonly],
|
||||
input[type=tel][disabled],
|
||||
input[type=text][disabled],
|
||||
input[type=password][disabled],
|
||||
input[type=search][disabled],
|
||||
input[type=email][disabled] {border-color:#c0c0c0; color:#666; -webkit-appearance:none; font-size:16px;}
|
||||
textarea[readonly],
|
||||
textarea[disabled] {padding:11px; font-size:16px; color:#666; font-weight:normal; line-height:140%; height:78px; background:#eaeaea;border:1px solid #c0c0c0;}
|
||||
input[type="number"]::-webkit-outer-spin-button,
|
||||
input[type="number"]::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
10333
kngil/css/faq/faq_style.css
Normal file
10333
kngil/css/faq/faq_style.css
Normal file
File diff suppressed because it is too large
Load Diff
33
kngil/css/faq/faq_theme_style.css
Normal file
33
kngil/css/faq/faq_theme_style.css
Normal file
@@ -0,0 +1,33 @@
|
||||
@charset "utf-8";
|
||||
|
||||
#bo_cate {margin-bottom:28px}
|
||||
#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
#bo_cate ul {zoom:1}
|
||||
#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""}
|
||||
#bo_cate li {display:inline-block;padding:2px}
|
||||
#bo_cate a {display:block;line-height:28px;padding:5px 15px;border-radius:30px;border:1px solid #d6e9ff;color:#6794d3}
|
||||
#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none;background:#3a8afd;color:#fff}
|
||||
#bo_cate #bo_cate_on {z-index:2;background:#3a8afd;color:#fff;font-weight:bold;border:1px solid #3a8afd;
|
||||
-webkit-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
|
||||
-moz-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
|
||||
box-shadow:inset 0 2px 5px rgb(33, 135, 202)}
|
||||
|
||||
#faq_wrap {margin:10px 0 30px}
|
||||
#faq_wrap h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
|
||||
.faq_admin {text-align:right}
|
||||
#faq_wrap ol {margin:0;padding:0;list-style:none}
|
||||
#faq_wrap li {border-bottom:1px solid #ececec;background:#fff;position:relative}
|
||||
#faq_wrap li:first-child {border-top:1px solid #ececec}
|
||||
#faq_wrap li h3 {min-height:50px;line-height:30px;padding:15px;padding-left:50px;position:relative}
|
||||
#faq_wrap li h3 .tit_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#c5cdd8;font-size:1.2em}
|
||||
#faq_wrap li h3 .tit_bg {display:inline-block;position:absolute;top:15px;left:15px;text-align:center;color:#000;font-size:1.6em}
|
||||
#faq_wrap li h3.faq_li_open a {color:#3a8afd}
|
||||
|
||||
#faq_con .con_inner {display:none;padding:5px 5px 20px 50px}
|
||||
#faq_con .con_inner .tit_bg {display:inline-block;position:absolute;top:10px;left:10px;text-align:center;background:#777;color:#fff;border-radius:50%;width:30px;line-height:30px;height:30px}
|
||||
#faq_con .con_inner .closer_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#3a8afd;font-size:1.2em}
|
||||
|
||||
#faq_sch {background:#f7f7f7;padding:30px;text-align:center;margin:0 0 10px}
|
||||
#faq_sch .sch_tit {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
|
||||
#faq_sch .frm_input {border:1px solid #d0d3db;width:300px;height:45px;border-radius:0;border-radius:3px}
|
||||
#faq_sch .btn_submit {padding:0 10px;height:45px;width:88px;font-size:1.083em;font-weight:bold;color:#fff;background:#434a54}
|
||||
1
kngil/css/lib/aos.min.css
vendored
Normal file
1
kngil/css/lib/aos.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
kngil/css/lib/jquery.mCustomScrollbar.min.css
vendored
Normal file
1
kngil/css/lib/jquery.mCustomScrollbar.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
kngil/css/lib/lenis.min.css
vendored
Normal file
1
kngil/css/lib/lenis.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
html.lenis,html.lenis body{height:auto}.lenis.lenis-smooth{scroll-behavior:auto !important}.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}.lenis.lenis-stopped{overflow:hidden}.lenis.lenis-smooth iframe{pointer-events:none}
|
||||
13
kngil/css/lib/swiper11.min.css
vendored
Normal file
13
kngil/css/lib/swiper11.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
4
kngil/css/qa/font-awesome.min.css
vendored
Normal file
4
kngil/css/qa/font-awesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
49
kngil/css/qa/qa_font.css
Normal file
49
kngil/css/qa/qa_font.css
Normal file
@@ -0,0 +1,49 @@
|
||||
@charset "utf-8";
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
src: url(/kngil/fonts/qa/NotoKR-Thin/notokr-thin.woff2) format('woff2'),
|
||||
url(/kngil/fonts/qa/font/NotoKR-Thin/notokr-thin.woff) format('woff'),
|
||||
url(/kngil/fonts/qa/font/NotoKR-Thin/notokr-thin.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url(/kngil/fonts/qa/NotoKR-Light/notokr-light.woff2) format('woff2'),
|
||||
url(/kngil/fonts/qa/NotoKR-Light/notokr-light.woff) format('woff'),
|
||||
url(/kngil/fonts/qa/NotoKR-Light/notokr-light.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(/kngil/fonts/qa/NotoKR-Regular/notokr-regular.woff2) format('woff2'),
|
||||
url(/kngil/fonts/qa/NotoKR-Regular/notokr-regular.woff) format('woff'),
|
||||
url(/kngil/fonts/qa/NotoKR-Regular/notokr-regular.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url(/kngil/fonts/qa/NotoKR-Medium/notokr-medium.woff2) format('woff2'),
|
||||
url(/kngil/fonts/qa/NotoKR-Medium/notokr-medium.woff) format('woff'),
|
||||
url(/kngil/fonts/qa/NotoKR-Medium/notokr-medium.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url(/kngil/fonts/qa/NotoKR-Bold/notokr-bold.woff2) format('woff2'),
|
||||
url(/kngil/fonts/qa/NotoKR-Bold/notokr-bold.woff) format('woff'),
|
||||
url(/kngil/fonts/qa/NotoKR-Bold/notokr-bold.otf) format('opentype');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Noto Sans KR';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
src: url(/kngil/fonts/qa/NotoKR-Black/notokr-black.woff2) format('woff2'),
|
||||
url(/kngil/fonts/qa/NotoKR-Black/notokr-black.woff) format('woff'),
|
||||
url(/kngil/fonts/qa/NotoKR-Black/notokr-black.otf) format('opentype');
|
||||
}
|
||||
47
kngil/css/qa/qa_reset.css
Normal file
47
kngil/css/qa/qa_reset.css
Normal file
@@ -0,0 +1,47 @@
|
||||
@charset "utf-8";
|
||||
|
||||
/* Reset */
|
||||
* {box-sizing: border-box;}
|
||||
html, body, h1, h2, h3, h4, h5, h6, div, p, pre, code, address, ul, ol, li, menu, nav, section, article, aside,
|
||||
dl ,dt, dd, table, thead, tbody, tfoot, label, caption, th, td, form, fieldset, legend, hr, input, button, textarea, object, figure, figcaption {margin:0; padding:0;}
|
||||
html, body {width:100%; height:100%; font-family: 'Noto Sans KR', sans-serif; }
|
||||
body {background:#fff; min-width:360px; -webkit-text-size-adjust:none;word-wrap:break-word;word-break:break-all;}
|
||||
body, input, select, textarea, button {background:none; border:none;}
|
||||
button {background: none; cursor: pointer; user-select: none;}
|
||||
ul, ol, li {list-style:none;}
|
||||
table {width:100%;border-spacing:0;border-collapse:collapse;}
|
||||
img, fieldset {border:0;}
|
||||
address, cite, code {font-style:normal;font-weight:normal;}
|
||||
em {font-style:normal;font-weight:bold;}
|
||||
i {font-style: normal;}
|
||||
label, img, input, select, textarea, button {font-family:inherit; vertical-align:middle;}
|
||||
caption, legend {line-height:0;font-size:1px;overflow:hidden;}
|
||||
hr{display:none;}
|
||||
main, header, section, nav, footer, aside, article, figure {display:block;}
|
||||
a {color:inherit; text-decoration:none;}
|
||||
a:hover {text-decoration:none;}
|
||||
/* Form */
|
||||
input[type=text]::placeholder, input::-webkit-input-placeholder{font-weight:500; color:#bdbdbd;}
|
||||
select:focus,
|
||||
textarea:focus,
|
||||
input:focus {border: 1; outline: none;}
|
||||
input[type=text][readonly],
|
||||
input[type=text][readonly]:focus {border:1;}
|
||||
input[type=tel][readonly],
|
||||
input[type=password][readonly],
|
||||
input[type=email][readonly],
|
||||
input[type=search][readonly],
|
||||
input[type=tel][disabled],
|
||||
input[type=text][disabled],
|
||||
input[type=password][disabled],
|
||||
input[type=search][disabled],
|
||||
input[type=email][disabled] {border-color:#c0c0c0; color:#666; -webkit-appearance:none; font-size:16px;}
|
||||
textarea[readonly],
|
||||
textarea[disabled] {padding:11px; font-size:16px; color:#666; font-weight:normal; line-height:140%; height:78px; background:#eaeaea;border:1px solid #c0c0c0;}
|
||||
input[type="number"]::-webkit-outer-spin-button,
|
||||
input[type="number"]::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
10333
kngil/css/qa/qa_style.css
Normal file
10333
kngil/css/qa/qa_style.css
Normal file
File diff suppressed because it is too large
Load Diff
7249
kngil/css/style.css
Normal file
7249
kngil/css/style.css
Normal file
File diff suppressed because it is too large
Load Diff
BIN
kngil/fonts/FontAwesome.otf
Normal file
BIN
kngil/fonts/FontAwesome.otf
Normal file
Binary file not shown.
5
kngil/fonts/NotoKR-Black/generator_config.txt
Normal file
5
kngil/fonts/NotoKR-Black/generator_config.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
||||
2827
kngil/fonts/NotoKR-Black/notokr-black-demo.html
Normal file
2827
kngil/fonts/NotoKR-Black/notokr-black-demo.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
kngil/fonts/NotoKR-Black/notokr-black.eot
Normal file
BIN
kngil/fonts/NotoKR-Black/notokr-black.eot
Normal file
Binary file not shown.
2457
kngil/fonts/NotoKR-Black/notokr-black.svg
Normal file
2457
kngil/fonts/NotoKR-Black/notokr-black.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 685 KiB |
BIN
kngil/fonts/NotoKR-Black/notokr-black.ttf
Normal file
BIN
kngil/fonts/NotoKR-Black/notokr-black.ttf
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-Black/notokr-black.woff
Normal file
BIN
kngil/fonts/NotoKR-Black/notokr-black.woff
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-Black/notokr-black.woff2
Normal file
BIN
kngil/fonts/NotoKR-Black/notokr-black.woff2
Normal file
Binary file not shown.
7
kngil/fonts/NotoKR-Black/specimen_files/easytabs.js
Normal file
7
kngil/fonts/NotoKR-Black/specimen_files/easytabs.js
Normal file
@@ -0,0 +1,7 @@
|
||||
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
|
||||
if(typeof param.defaultContent=="number")
|
||||
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
|
||||
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
|
||||
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
|
||||
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
|
||||
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
|
||||
129
kngil/fonts/NotoKR-Black/specimen_files/grid_12-825-55-15.css
Normal file
129
kngil/fonts/NotoKR-Black/specimen_files/grid_12-825-55-15.css
Normal file
@@ -0,0 +1,129 @@
|
||||
/*Notes about grid:
|
||||
Columns: 12
|
||||
Grid Width: 825px
|
||||
Column Width: 55px
|
||||
Gutter Width: 15px
|
||||
-------------------------------*/
|
||||
|
||||
|
||||
|
||||
.section {margin-bottom: 18px;
|
||||
}
|
||||
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
|
||||
.section {*zoom: 1;}
|
||||
|
||||
.section .firstcolumn,
|
||||
.section .firstcol {margin-left: 0;}
|
||||
|
||||
|
||||
/* Border on left hand side of a column. */
|
||||
.border {
|
||||
padding-left: 7px;
|
||||
margin-left: 7px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
/* Border with more whitespace, spans one column. */
|
||||
.colborder {
|
||||
padding-left: 42px;
|
||||
margin-left: 42px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Grid Classes */
|
||||
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
|
||||
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
|
||||
|
||||
|
||||
.width1, .grid1, .span-1 {width: 55px;}
|
||||
.width1_2cols,.grid1_2cols {width: 20px;}
|
||||
.width1_3cols,.grid1_3cols {width: 8px;}
|
||||
.width1_4cols,.grid1_4cols {width: 2px;}
|
||||
.input_width1 {width: 49px;}
|
||||
|
||||
.width2, .grid2, .span-2 {width: 125px;}
|
||||
.width2_3cols,.grid2_3cols {width: 31px;}
|
||||
.width2_4cols,.grid2_4cols {width: 20px;}
|
||||
.input_width2 {width: 119px;}
|
||||
|
||||
.width3, .grid3, .span-3 {width: 195px;}
|
||||
.width3_2cols,.grid3_2cols {width: 90px;}
|
||||
.width3_4cols,.grid3_4cols {width: 37px;}
|
||||
.input_width3 {width: 189px;}
|
||||
|
||||
.width4, .grid4, .span-4 {width: 265px;}
|
||||
.width4_3cols,.grid4_3cols {width: 78px;}
|
||||
.input_width4 {width: 259px;}
|
||||
|
||||
.width5, .grid5, .span-5 {width: 335px;}
|
||||
.width5_2cols,.grid5_2cols {width: 160px;}
|
||||
.width5_3cols,.grid5_3cols {width: 101px;}
|
||||
.width5_4cols,.grid5_4cols {width: 72px;}
|
||||
.input_width5 {width: 329px;}
|
||||
|
||||
.width6, .grid6, .span-6 {width: 405px;}
|
||||
.width6_4cols,.grid6_4cols {width: 90px;}
|
||||
.input_width6 {width: 399px;}
|
||||
|
||||
.width7, .grid7, .span-7 {width: 475px;}
|
||||
.width7_2cols,.grid7_2cols {width: 230px;}
|
||||
.width7_3cols,.grid7_3cols {width: 148px;}
|
||||
.width7_4cols,.grid7_4cols {width: 107px;}
|
||||
.input_width7 {width: 469px;}
|
||||
|
||||
.width8, .grid8, .span-8 {width: 545px;}
|
||||
.width8_3cols,.grid8_3cols {width: 171px;}
|
||||
.input_width8 {width: 539px;}
|
||||
|
||||
.width9, .grid9, .span-9 {width: 615px;}
|
||||
.width9_2cols,.grid9_2cols {width: 300px;}
|
||||
.width9_4cols,.grid9_4cols {width: 142px;}
|
||||
.input_width9 {width: 609px;}
|
||||
|
||||
.width10, .grid10, .span-10 {width: 685px;}
|
||||
.width10_3cols,.grid10_3cols {width: 218px;}
|
||||
.width10_4cols,.grid10_4cols {width: 160px;}
|
||||
.input_width10 {width: 679px;}
|
||||
|
||||
.width11, .grid11, .span-11 {width: 755px;}
|
||||
.width11_2cols,.grid11_2cols {width: 370px;}
|
||||
.width11_3cols,.grid11_3cols {width: 241px;}
|
||||
.width11_4cols,.grid11_4cols {width: 177px;}
|
||||
.input_width11 {width: 749px;}
|
||||
|
||||
.width12, .grid12, .span-12 {width: 825px;}
|
||||
.input_width12 {width: 819px;}
|
||||
|
||||
/* Subdivided grid spaces */
|
||||
.emptycols_left1, .prepend-1 {padding-left: 70px;}
|
||||
.emptycols_right1, .append-1 {padding-right: 70px;}
|
||||
.emptycols_left2, .prepend-2 {padding-left: 140px;}
|
||||
.emptycols_right2, .append-2 {padding-right: 140px;}
|
||||
.emptycols_left3, .prepend-3 {padding-left: 210px;}
|
||||
.emptycols_right3, .append-3 {padding-right: 210px;}
|
||||
.emptycols_left4, .prepend-4 {padding-left: 280px;}
|
||||
.emptycols_right4, .append-4 {padding-right: 280px;}
|
||||
.emptycols_left5, .prepend-5 {padding-left: 350px;}
|
||||
.emptycols_right5, .append-5 {padding-right: 350px;}
|
||||
.emptycols_left6, .prepend-6 {padding-left: 420px;}
|
||||
.emptycols_right6, .append-6 {padding-right: 420px;}
|
||||
.emptycols_left7, .prepend-7 {padding-left: 490px;}
|
||||
.emptycols_right7, .append-7 {padding-right: 490px;}
|
||||
.emptycols_left8, .prepend-8 {padding-left: 560px;}
|
||||
.emptycols_right8, .append-8 {padding-right: 560px;}
|
||||
.emptycols_left9, .prepend-9 {padding-left: 630px;}
|
||||
.emptycols_right9, .append-9 {padding-right: 630px;}
|
||||
.emptycols_left10, .prepend-10 {padding-left: 700px;}
|
||||
.emptycols_right10, .append-10 {padding-right: 700px;}
|
||||
.emptycols_left11, .prepend-11 {padding-left: 770px;}
|
||||
.emptycols_right11, .append-11 {padding-right: 770px;}
|
||||
.pull-1 {margin-left: -70px;}
|
||||
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
|
||||
.pull-2 {margin-left: -140px;}
|
||||
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
|
||||
.pull-3 {margin-left: -210px;}
|
||||
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
|
||||
.pull-4 {margin-left: -280px;}
|
||||
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
|
||||
396
kngil/fonts/NotoKR-Black/specimen_files/specimen_stylesheet.css
Normal file
396
kngil/fonts/NotoKR-Black/specimen_files/specimen_stylesheet.css
Normal file
@@ -0,0 +1,396 @@
|
||||
@import url('grid_12-825-55-15.css');
|
||||
|
||||
/*
|
||||
CSS Reset by Eric Meyer - Released under Public Domain
|
||||
http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center, dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend, table,
|
||||
caption, tbody, tfoot, thead, tr, th, td
|
||||
{margin: 0;padding: 0;border: 0;outline: 0;
|
||||
font-size: 100%;vertical-align: baseline;
|
||||
background: transparent;}
|
||||
body {line-height: 1;}
|
||||
ol, ul {list-style: none;}
|
||||
blockquote, q {quotes: none;}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {content: ''; content: none;}
|
||||
:focus {outline: 0;}
|
||||
ins {text-decoration: none;}
|
||||
del {text-decoration: line-through;}
|
||||
table {border-collapse: collapse;border-spacing: 0;}
|
||||
|
||||
|
||||
|
||||
|
||||
body {
|
||||
color: #000;
|
||||
background-color: #dcdcdc;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #1883ba;
|
||||
}
|
||||
|
||||
h1{
|
||||
font-size: 32px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h2{
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 865px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
|
||||
#header {
|
||||
padding: 20px;
|
||||
font-size: 36px;
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: #666;
|
||||
}
|
||||
#main_content {
|
||||
background-color: #fff;
|
||||
padding: 60px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
#footer p {
|
||||
margin: 0;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 50px;
|
||||
color: #333;
|
||||
font: 10px Arial, sans-serif;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
height: 31px;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li {
|
||||
float: left;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li a {
|
||||
display: block;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
font: bold 11px/11px 'Arial';
|
||||
text-transform: uppercase;
|
||||
padding: 10px 15px;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
|
||||
.tabs li a:hover {
|
||||
background-color: #00b3ff;
|
||||
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
color: #000;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
div.huge {
|
||||
|
||||
font-size: 120px;
|
||||
line-height: 1em;
|
||||
padding: 0;
|
||||
letter-spacing: -.02em;
|
||||
overflow: hidden;
|
||||
}
|
||||
div.glyph_range {
|
||||
font-size: 72px;
|
||||
line-height: 1.1em;
|
||||
}
|
||||
|
||||
.size10{ font-size: 10px; }
|
||||
.size11{ font-size: 11px; }
|
||||
.size12{ font-size: 12px; }
|
||||
.size13{ font-size: 13px; }
|
||||
.size14{ font-size: 14px; }
|
||||
.size16{ font-size: 16px; }
|
||||
.size18{ font-size: 18px; }
|
||||
.size20{ font-size: 20px; }
|
||||
.size24{ font-size: 24px; }
|
||||
.size30{ font-size: 30px; }
|
||||
.size36{ font-size: 36px; }
|
||||
.size48{ font-size: 48px; }
|
||||
.size60{ font-size: 60px; }
|
||||
.size72{ font-size: 72px; }
|
||||
.size90{ font-size: 90px; }
|
||||
|
||||
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row2 { height: 160px;}
|
||||
.psample_row3 { height: 160px;}
|
||||
.psample_row4 { height: 160px;}
|
||||
|
||||
.psample {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.psample p {
|
||||
line-height: 1.3em;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.psample span {
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
.white_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.black_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.fullreverse {
|
||||
background: #000 !important;
|
||||
color: #fff !important;
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
padding: 20px;
|
||||
margin-bottom:0;
|
||||
}
|
||||
|
||||
|
||||
.sample_table td {
|
||||
padding-top: 3px;
|
||||
padding-bottom:5px;
|
||||
padding-left: 5px;
|
||||
vertical-align: middle;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
|
||||
.sample_table td:first-child {
|
||||
background-color: #eee;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
padding-left: 0;
|
||||
padding: 5px;
|
||||
font: 11px/12px "Courier New", Courier, mono;
|
||||
}
|
||||
|
||||
code {
|
||||
white-space: pre;
|
||||
background-color: #eee;
|
||||
display: block;
|
||||
padding: 10px;
|
||||
margin-bottom: 18px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
|
||||
|
||||
.box {
|
||||
padding: 18px;
|
||||
margin-bottom: 18px;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
|
||||
|
||||
#bodycomparison {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 72px;
|
||||
height: 90px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#bodycomparison div{
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
display: inline;
|
||||
margin: 0 15px 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#bodycomparison div span{
|
||||
font: 10px Arial;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
#xheight {
|
||||
float: none;
|
||||
position: absolute;
|
||||
color: #d9f3ff;
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
}
|
||||
|
||||
.fontbody {
|
||||
position: relative;
|
||||
}
|
||||
.arialbody{
|
||||
font-family: Arial;
|
||||
position: relative;
|
||||
}
|
||||
.verdanabody{
|
||||
font-family: Verdana;
|
||||
position: relative;
|
||||
}
|
||||
.georgiabody{
|
||||
font-family: Georgia;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* @group Layout page
|
||||
*/
|
||||
|
||||
#layout h1 {
|
||||
font-size: 36px;
|
||||
line-height: 42px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h2 {
|
||||
font-size: 24px;
|
||||
line-height: 23px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h3 {
|
||||
font-size: 22px;
|
||||
line-height: 1.4em;
|
||||
margin-top: 1em;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
#layout p.byline {
|
||||
font-size: 12px;
|
||||
margin-top: 18px;
|
||||
line-height: 12px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#layout p {
|
||||
font-size: 14px;
|
||||
line-height: 21px;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
#layout p.large{
|
||||
font-size: 18px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
#layout .sidebar p{
|
||||
font-size: 12px;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
#layout p.caption {
|
||||
font-size: 10px;
|
||||
margin-top: -16px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Glyphs */
|
||||
|
||||
#glyph_chart div{
|
||||
background-color: #d9f3ff;
|
||||
color: black;
|
||||
float: left;
|
||||
font-size: 36px;
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 1px;
|
||||
margin-right: 1px;
|
||||
text-align: center;
|
||||
width: 1.2em;
|
||||
position: relative;
|
||||
padding: .6em .2em .2em;
|
||||
}
|
||||
|
||||
#glyph_chart div p {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
text-align: center;
|
||||
font: bold 9px Arial, sans-serif;
|
||||
background-color: #3a768f;
|
||||
width: 100%;
|
||||
color: #fff;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
|
||||
#glyphs h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Installing */
|
||||
|
||||
#installing {
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
#installing p,
|
||||
#glyphs p{
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 18px;
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#installing h3{
|
||||
font-size: 15px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
#rendering h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
.render_table td {
|
||||
font: 11px "Courier New", Courier, mono;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
16
kngil/fonts/NotoKR-Black/stylesheet.css
Normal file
16
kngil/fonts/NotoKR-Black/stylesheet.css
Normal file
@@ -0,0 +1,16 @@
|
||||
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'notokr-black';
|
||||
src: url('notokr-black.eot');
|
||||
src: url('notokr-black.eot?#iefix') format('embedded-opentype'),
|
||||
url('notokr-black.woff2') format('woff2'),
|
||||
url('notokr-black.woff') format('woff'),
|
||||
url('notokr-black.ttf') format('truetype'),
|
||||
url('notokr-black.svg#notokr-black') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
5
kngil/fonts/NotoKR-Bold/generator_config.txt
Normal file
5
kngil/fonts/NotoKR-Bold/generator_config.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
||||
2827
kngil/fonts/NotoKR-Bold/notokr-bold-demo.html
Normal file
2827
kngil/fonts/NotoKR-Bold/notokr-bold-demo.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.eot
Normal file
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.eot
Normal file
Binary file not shown.
2457
kngil/fonts/NotoKR-Bold/notokr-bold.svg
Normal file
2457
kngil/fonts/NotoKR-Bold/notokr-bold.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 687 KiB |
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.ttf
Normal file
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.ttf
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.woff
Normal file
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.woff
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.woff2
Normal file
BIN
kngil/fonts/NotoKR-Bold/notokr-bold.woff2
Normal file
Binary file not shown.
7
kngil/fonts/NotoKR-Bold/specimen_files/easytabs.js
Normal file
7
kngil/fonts/NotoKR-Bold/specimen_files/easytabs.js
Normal file
@@ -0,0 +1,7 @@
|
||||
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
|
||||
if(typeof param.defaultContent=="number")
|
||||
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
|
||||
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
|
||||
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
|
||||
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
|
||||
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
|
||||
129
kngil/fonts/NotoKR-Bold/specimen_files/grid_12-825-55-15.css
Normal file
129
kngil/fonts/NotoKR-Bold/specimen_files/grid_12-825-55-15.css
Normal file
@@ -0,0 +1,129 @@
|
||||
/*Notes about grid:
|
||||
Columns: 12
|
||||
Grid Width: 825px
|
||||
Column Width: 55px
|
||||
Gutter Width: 15px
|
||||
-------------------------------*/
|
||||
|
||||
|
||||
|
||||
.section {margin-bottom: 18px;
|
||||
}
|
||||
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
|
||||
.section {*zoom: 1;}
|
||||
|
||||
.section .firstcolumn,
|
||||
.section .firstcol {margin-left: 0;}
|
||||
|
||||
|
||||
/* Border on left hand side of a column. */
|
||||
.border {
|
||||
padding-left: 7px;
|
||||
margin-left: 7px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
/* Border with more whitespace, spans one column. */
|
||||
.colborder {
|
||||
padding-left: 42px;
|
||||
margin-left: 42px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Grid Classes */
|
||||
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
|
||||
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
|
||||
|
||||
|
||||
.width1, .grid1, .span-1 {width: 55px;}
|
||||
.width1_2cols,.grid1_2cols {width: 20px;}
|
||||
.width1_3cols,.grid1_3cols {width: 8px;}
|
||||
.width1_4cols,.grid1_4cols {width: 2px;}
|
||||
.input_width1 {width: 49px;}
|
||||
|
||||
.width2, .grid2, .span-2 {width: 125px;}
|
||||
.width2_3cols,.grid2_3cols {width: 31px;}
|
||||
.width2_4cols,.grid2_4cols {width: 20px;}
|
||||
.input_width2 {width: 119px;}
|
||||
|
||||
.width3, .grid3, .span-3 {width: 195px;}
|
||||
.width3_2cols,.grid3_2cols {width: 90px;}
|
||||
.width3_4cols,.grid3_4cols {width: 37px;}
|
||||
.input_width3 {width: 189px;}
|
||||
|
||||
.width4, .grid4, .span-4 {width: 265px;}
|
||||
.width4_3cols,.grid4_3cols {width: 78px;}
|
||||
.input_width4 {width: 259px;}
|
||||
|
||||
.width5, .grid5, .span-5 {width: 335px;}
|
||||
.width5_2cols,.grid5_2cols {width: 160px;}
|
||||
.width5_3cols,.grid5_3cols {width: 101px;}
|
||||
.width5_4cols,.grid5_4cols {width: 72px;}
|
||||
.input_width5 {width: 329px;}
|
||||
|
||||
.width6, .grid6, .span-6 {width: 405px;}
|
||||
.width6_4cols,.grid6_4cols {width: 90px;}
|
||||
.input_width6 {width: 399px;}
|
||||
|
||||
.width7, .grid7, .span-7 {width: 475px;}
|
||||
.width7_2cols,.grid7_2cols {width: 230px;}
|
||||
.width7_3cols,.grid7_3cols {width: 148px;}
|
||||
.width7_4cols,.grid7_4cols {width: 107px;}
|
||||
.input_width7 {width: 469px;}
|
||||
|
||||
.width8, .grid8, .span-8 {width: 545px;}
|
||||
.width8_3cols,.grid8_3cols {width: 171px;}
|
||||
.input_width8 {width: 539px;}
|
||||
|
||||
.width9, .grid9, .span-9 {width: 615px;}
|
||||
.width9_2cols,.grid9_2cols {width: 300px;}
|
||||
.width9_4cols,.grid9_4cols {width: 142px;}
|
||||
.input_width9 {width: 609px;}
|
||||
|
||||
.width10, .grid10, .span-10 {width: 685px;}
|
||||
.width10_3cols,.grid10_3cols {width: 218px;}
|
||||
.width10_4cols,.grid10_4cols {width: 160px;}
|
||||
.input_width10 {width: 679px;}
|
||||
|
||||
.width11, .grid11, .span-11 {width: 755px;}
|
||||
.width11_2cols,.grid11_2cols {width: 370px;}
|
||||
.width11_3cols,.grid11_3cols {width: 241px;}
|
||||
.width11_4cols,.grid11_4cols {width: 177px;}
|
||||
.input_width11 {width: 749px;}
|
||||
|
||||
.width12, .grid12, .span-12 {width: 825px;}
|
||||
.input_width12 {width: 819px;}
|
||||
|
||||
/* Subdivided grid spaces */
|
||||
.emptycols_left1, .prepend-1 {padding-left: 70px;}
|
||||
.emptycols_right1, .append-1 {padding-right: 70px;}
|
||||
.emptycols_left2, .prepend-2 {padding-left: 140px;}
|
||||
.emptycols_right2, .append-2 {padding-right: 140px;}
|
||||
.emptycols_left3, .prepend-3 {padding-left: 210px;}
|
||||
.emptycols_right3, .append-3 {padding-right: 210px;}
|
||||
.emptycols_left4, .prepend-4 {padding-left: 280px;}
|
||||
.emptycols_right4, .append-4 {padding-right: 280px;}
|
||||
.emptycols_left5, .prepend-5 {padding-left: 350px;}
|
||||
.emptycols_right5, .append-5 {padding-right: 350px;}
|
||||
.emptycols_left6, .prepend-6 {padding-left: 420px;}
|
||||
.emptycols_right6, .append-6 {padding-right: 420px;}
|
||||
.emptycols_left7, .prepend-7 {padding-left: 490px;}
|
||||
.emptycols_right7, .append-7 {padding-right: 490px;}
|
||||
.emptycols_left8, .prepend-8 {padding-left: 560px;}
|
||||
.emptycols_right8, .append-8 {padding-right: 560px;}
|
||||
.emptycols_left9, .prepend-9 {padding-left: 630px;}
|
||||
.emptycols_right9, .append-9 {padding-right: 630px;}
|
||||
.emptycols_left10, .prepend-10 {padding-left: 700px;}
|
||||
.emptycols_right10, .append-10 {padding-right: 700px;}
|
||||
.emptycols_left11, .prepend-11 {padding-left: 770px;}
|
||||
.emptycols_right11, .append-11 {padding-right: 770px;}
|
||||
.pull-1 {margin-left: -70px;}
|
||||
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
|
||||
.pull-2 {margin-left: -140px;}
|
||||
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
|
||||
.pull-3 {margin-left: -210px;}
|
||||
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
|
||||
.pull-4 {margin-left: -280px;}
|
||||
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
|
||||
396
kngil/fonts/NotoKR-Bold/specimen_files/specimen_stylesheet.css
Normal file
396
kngil/fonts/NotoKR-Bold/specimen_files/specimen_stylesheet.css
Normal file
@@ -0,0 +1,396 @@
|
||||
@import url('grid_12-825-55-15.css');
|
||||
|
||||
/*
|
||||
CSS Reset by Eric Meyer - Released under Public Domain
|
||||
http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center, dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend, table,
|
||||
caption, tbody, tfoot, thead, tr, th, td
|
||||
{margin: 0;padding: 0;border: 0;outline: 0;
|
||||
font-size: 100%;vertical-align: baseline;
|
||||
background: transparent;}
|
||||
body {line-height: 1;}
|
||||
ol, ul {list-style: none;}
|
||||
blockquote, q {quotes: none;}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {content: ''; content: none;}
|
||||
:focus {outline: 0;}
|
||||
ins {text-decoration: none;}
|
||||
del {text-decoration: line-through;}
|
||||
table {border-collapse: collapse;border-spacing: 0;}
|
||||
|
||||
|
||||
|
||||
|
||||
body {
|
||||
color: #000;
|
||||
background-color: #dcdcdc;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #1883ba;
|
||||
}
|
||||
|
||||
h1{
|
||||
font-size: 32px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h2{
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 865px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
|
||||
#header {
|
||||
padding: 20px;
|
||||
font-size: 36px;
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: #666;
|
||||
}
|
||||
#main_content {
|
||||
background-color: #fff;
|
||||
padding: 60px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
#footer p {
|
||||
margin: 0;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 50px;
|
||||
color: #333;
|
||||
font: 10px Arial, sans-serif;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
height: 31px;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li {
|
||||
float: left;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li a {
|
||||
display: block;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
font: bold 11px/11px 'Arial';
|
||||
text-transform: uppercase;
|
||||
padding: 10px 15px;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
|
||||
.tabs li a:hover {
|
||||
background-color: #00b3ff;
|
||||
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
color: #000;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
div.huge {
|
||||
|
||||
font-size: 120px;
|
||||
line-height: 1em;
|
||||
padding: 0;
|
||||
letter-spacing: -.02em;
|
||||
overflow: hidden;
|
||||
}
|
||||
div.glyph_range {
|
||||
font-size: 72px;
|
||||
line-height: 1.1em;
|
||||
}
|
||||
|
||||
.size10{ font-size: 10px; }
|
||||
.size11{ font-size: 11px; }
|
||||
.size12{ font-size: 12px; }
|
||||
.size13{ font-size: 13px; }
|
||||
.size14{ font-size: 14px; }
|
||||
.size16{ font-size: 16px; }
|
||||
.size18{ font-size: 18px; }
|
||||
.size20{ font-size: 20px; }
|
||||
.size24{ font-size: 24px; }
|
||||
.size30{ font-size: 30px; }
|
||||
.size36{ font-size: 36px; }
|
||||
.size48{ font-size: 48px; }
|
||||
.size60{ font-size: 60px; }
|
||||
.size72{ font-size: 72px; }
|
||||
.size90{ font-size: 90px; }
|
||||
|
||||
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row2 { height: 160px;}
|
||||
.psample_row3 { height: 160px;}
|
||||
.psample_row4 { height: 160px;}
|
||||
|
||||
.psample {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.psample p {
|
||||
line-height: 1.3em;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.psample span {
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
.white_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.black_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.fullreverse {
|
||||
background: #000 !important;
|
||||
color: #fff !important;
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
padding: 20px;
|
||||
margin-bottom:0;
|
||||
}
|
||||
|
||||
|
||||
.sample_table td {
|
||||
padding-top: 3px;
|
||||
padding-bottom:5px;
|
||||
padding-left: 5px;
|
||||
vertical-align: middle;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
|
||||
.sample_table td:first-child {
|
||||
background-color: #eee;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
padding-left: 0;
|
||||
padding: 5px;
|
||||
font: 11px/12px "Courier New", Courier, mono;
|
||||
}
|
||||
|
||||
code {
|
||||
white-space: pre;
|
||||
background-color: #eee;
|
||||
display: block;
|
||||
padding: 10px;
|
||||
margin-bottom: 18px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
|
||||
|
||||
.box {
|
||||
padding: 18px;
|
||||
margin-bottom: 18px;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
|
||||
|
||||
#bodycomparison {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 72px;
|
||||
height: 90px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#bodycomparison div{
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
display: inline;
|
||||
margin: 0 15px 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#bodycomparison div span{
|
||||
font: 10px Arial;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
#xheight {
|
||||
float: none;
|
||||
position: absolute;
|
||||
color: #d9f3ff;
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
}
|
||||
|
||||
.fontbody {
|
||||
position: relative;
|
||||
}
|
||||
.arialbody{
|
||||
font-family: Arial;
|
||||
position: relative;
|
||||
}
|
||||
.verdanabody{
|
||||
font-family: Verdana;
|
||||
position: relative;
|
||||
}
|
||||
.georgiabody{
|
||||
font-family: Georgia;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* @group Layout page
|
||||
*/
|
||||
|
||||
#layout h1 {
|
||||
font-size: 36px;
|
||||
line-height: 42px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h2 {
|
||||
font-size: 24px;
|
||||
line-height: 23px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h3 {
|
||||
font-size: 22px;
|
||||
line-height: 1.4em;
|
||||
margin-top: 1em;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
#layout p.byline {
|
||||
font-size: 12px;
|
||||
margin-top: 18px;
|
||||
line-height: 12px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#layout p {
|
||||
font-size: 14px;
|
||||
line-height: 21px;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
#layout p.large{
|
||||
font-size: 18px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
#layout .sidebar p{
|
||||
font-size: 12px;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
#layout p.caption {
|
||||
font-size: 10px;
|
||||
margin-top: -16px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Glyphs */
|
||||
|
||||
#glyph_chart div{
|
||||
background-color: #d9f3ff;
|
||||
color: black;
|
||||
float: left;
|
||||
font-size: 36px;
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 1px;
|
||||
margin-right: 1px;
|
||||
text-align: center;
|
||||
width: 1.2em;
|
||||
position: relative;
|
||||
padding: .6em .2em .2em;
|
||||
}
|
||||
|
||||
#glyph_chart div p {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
text-align: center;
|
||||
font: bold 9px Arial, sans-serif;
|
||||
background-color: #3a768f;
|
||||
width: 100%;
|
||||
color: #fff;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
|
||||
#glyphs h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Installing */
|
||||
|
||||
#installing {
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
#installing p,
|
||||
#glyphs p{
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 18px;
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#installing h3{
|
||||
font-size: 15px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
#rendering h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
.render_table td {
|
||||
font: 11px "Courier New", Courier, mono;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
16
kngil/fonts/NotoKR-Bold/stylesheet.css
Normal file
16
kngil/fonts/NotoKR-Bold/stylesheet.css
Normal file
@@ -0,0 +1,16 @@
|
||||
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'notokr-bold';
|
||||
src: url('notokr-bold.eot');
|
||||
src: url('notokr-bold.eot?#iefix') format('embedded-opentype'),
|
||||
url('notokr-bold.woff2') format('woff2'),
|
||||
url('notokr-bold.woff') format('woff'),
|
||||
url('notokr-bold.ttf') format('truetype'),
|
||||
url('notokr-bold.svg#notokr-bold') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
5
kngil/fonts/NotoKR-DemiLight/generator_config.txt
Normal file
5
kngil/fonts/NotoKR-DemiLight/generator_config.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
||||
2827
kngil/fonts/NotoKR-DemiLight/notokr-demilight-demo.html
Normal file
2827
kngil/fonts/NotoKR-DemiLight/notokr-demilight-demo.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.eot
Normal file
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.eot
Normal file
Binary file not shown.
2457
kngil/fonts/NotoKR-DemiLight/notokr-demilight.svg
Normal file
2457
kngil/fonts/NotoKR-DemiLight/notokr-demilight.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 714 KiB |
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.ttf
Normal file
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.ttf
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.woff
Normal file
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.woff
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.woff2
Normal file
BIN
kngil/fonts/NotoKR-DemiLight/notokr-demilight.woff2
Normal file
Binary file not shown.
7
kngil/fonts/NotoKR-DemiLight/specimen_files/easytabs.js
Normal file
7
kngil/fonts/NotoKR-DemiLight/specimen_files/easytabs.js
Normal file
@@ -0,0 +1,7 @@
|
||||
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
|
||||
if(typeof param.defaultContent=="number")
|
||||
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
|
||||
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
|
||||
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
|
||||
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
|
||||
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
|
||||
@@ -0,0 +1,129 @@
|
||||
/*Notes about grid:
|
||||
Columns: 12
|
||||
Grid Width: 825px
|
||||
Column Width: 55px
|
||||
Gutter Width: 15px
|
||||
-------------------------------*/
|
||||
|
||||
|
||||
|
||||
.section {margin-bottom: 18px;
|
||||
}
|
||||
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
|
||||
.section {*zoom: 1;}
|
||||
|
||||
.section .firstcolumn,
|
||||
.section .firstcol {margin-left: 0;}
|
||||
|
||||
|
||||
/* Border on left hand side of a column. */
|
||||
.border {
|
||||
padding-left: 7px;
|
||||
margin-left: 7px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
/* Border with more whitespace, spans one column. */
|
||||
.colborder {
|
||||
padding-left: 42px;
|
||||
margin-left: 42px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Grid Classes */
|
||||
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
|
||||
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
|
||||
|
||||
|
||||
.width1, .grid1, .span-1 {width: 55px;}
|
||||
.width1_2cols,.grid1_2cols {width: 20px;}
|
||||
.width1_3cols,.grid1_3cols {width: 8px;}
|
||||
.width1_4cols,.grid1_4cols {width: 2px;}
|
||||
.input_width1 {width: 49px;}
|
||||
|
||||
.width2, .grid2, .span-2 {width: 125px;}
|
||||
.width2_3cols,.grid2_3cols {width: 31px;}
|
||||
.width2_4cols,.grid2_4cols {width: 20px;}
|
||||
.input_width2 {width: 119px;}
|
||||
|
||||
.width3, .grid3, .span-3 {width: 195px;}
|
||||
.width3_2cols,.grid3_2cols {width: 90px;}
|
||||
.width3_4cols,.grid3_4cols {width: 37px;}
|
||||
.input_width3 {width: 189px;}
|
||||
|
||||
.width4, .grid4, .span-4 {width: 265px;}
|
||||
.width4_3cols,.grid4_3cols {width: 78px;}
|
||||
.input_width4 {width: 259px;}
|
||||
|
||||
.width5, .grid5, .span-5 {width: 335px;}
|
||||
.width5_2cols,.grid5_2cols {width: 160px;}
|
||||
.width5_3cols,.grid5_3cols {width: 101px;}
|
||||
.width5_4cols,.grid5_4cols {width: 72px;}
|
||||
.input_width5 {width: 329px;}
|
||||
|
||||
.width6, .grid6, .span-6 {width: 405px;}
|
||||
.width6_4cols,.grid6_4cols {width: 90px;}
|
||||
.input_width6 {width: 399px;}
|
||||
|
||||
.width7, .grid7, .span-7 {width: 475px;}
|
||||
.width7_2cols,.grid7_2cols {width: 230px;}
|
||||
.width7_3cols,.grid7_3cols {width: 148px;}
|
||||
.width7_4cols,.grid7_4cols {width: 107px;}
|
||||
.input_width7 {width: 469px;}
|
||||
|
||||
.width8, .grid8, .span-8 {width: 545px;}
|
||||
.width8_3cols,.grid8_3cols {width: 171px;}
|
||||
.input_width8 {width: 539px;}
|
||||
|
||||
.width9, .grid9, .span-9 {width: 615px;}
|
||||
.width9_2cols,.grid9_2cols {width: 300px;}
|
||||
.width9_4cols,.grid9_4cols {width: 142px;}
|
||||
.input_width9 {width: 609px;}
|
||||
|
||||
.width10, .grid10, .span-10 {width: 685px;}
|
||||
.width10_3cols,.grid10_3cols {width: 218px;}
|
||||
.width10_4cols,.grid10_4cols {width: 160px;}
|
||||
.input_width10 {width: 679px;}
|
||||
|
||||
.width11, .grid11, .span-11 {width: 755px;}
|
||||
.width11_2cols,.grid11_2cols {width: 370px;}
|
||||
.width11_3cols,.grid11_3cols {width: 241px;}
|
||||
.width11_4cols,.grid11_4cols {width: 177px;}
|
||||
.input_width11 {width: 749px;}
|
||||
|
||||
.width12, .grid12, .span-12 {width: 825px;}
|
||||
.input_width12 {width: 819px;}
|
||||
|
||||
/* Subdivided grid spaces */
|
||||
.emptycols_left1, .prepend-1 {padding-left: 70px;}
|
||||
.emptycols_right1, .append-1 {padding-right: 70px;}
|
||||
.emptycols_left2, .prepend-2 {padding-left: 140px;}
|
||||
.emptycols_right2, .append-2 {padding-right: 140px;}
|
||||
.emptycols_left3, .prepend-3 {padding-left: 210px;}
|
||||
.emptycols_right3, .append-3 {padding-right: 210px;}
|
||||
.emptycols_left4, .prepend-4 {padding-left: 280px;}
|
||||
.emptycols_right4, .append-4 {padding-right: 280px;}
|
||||
.emptycols_left5, .prepend-5 {padding-left: 350px;}
|
||||
.emptycols_right5, .append-5 {padding-right: 350px;}
|
||||
.emptycols_left6, .prepend-6 {padding-left: 420px;}
|
||||
.emptycols_right6, .append-6 {padding-right: 420px;}
|
||||
.emptycols_left7, .prepend-7 {padding-left: 490px;}
|
||||
.emptycols_right7, .append-7 {padding-right: 490px;}
|
||||
.emptycols_left8, .prepend-8 {padding-left: 560px;}
|
||||
.emptycols_right8, .append-8 {padding-right: 560px;}
|
||||
.emptycols_left9, .prepend-9 {padding-left: 630px;}
|
||||
.emptycols_right9, .append-9 {padding-right: 630px;}
|
||||
.emptycols_left10, .prepend-10 {padding-left: 700px;}
|
||||
.emptycols_right10, .append-10 {padding-right: 700px;}
|
||||
.emptycols_left11, .prepend-11 {padding-left: 770px;}
|
||||
.emptycols_right11, .append-11 {padding-right: 770px;}
|
||||
.pull-1 {margin-left: -70px;}
|
||||
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
|
||||
.pull-2 {margin-left: -140px;}
|
||||
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
|
||||
.pull-3 {margin-left: -210px;}
|
||||
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
|
||||
.pull-4 {margin-left: -280px;}
|
||||
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
|
||||
@@ -0,0 +1,396 @@
|
||||
@import url('grid_12-825-55-15.css');
|
||||
|
||||
/*
|
||||
CSS Reset by Eric Meyer - Released under Public Domain
|
||||
http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center, dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend, table,
|
||||
caption, tbody, tfoot, thead, tr, th, td
|
||||
{margin: 0;padding: 0;border: 0;outline: 0;
|
||||
font-size: 100%;vertical-align: baseline;
|
||||
background: transparent;}
|
||||
body {line-height: 1;}
|
||||
ol, ul {list-style: none;}
|
||||
blockquote, q {quotes: none;}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {content: ''; content: none;}
|
||||
:focus {outline: 0;}
|
||||
ins {text-decoration: none;}
|
||||
del {text-decoration: line-through;}
|
||||
table {border-collapse: collapse;border-spacing: 0;}
|
||||
|
||||
|
||||
|
||||
|
||||
body {
|
||||
color: #000;
|
||||
background-color: #dcdcdc;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #1883ba;
|
||||
}
|
||||
|
||||
h1{
|
||||
font-size: 32px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h2{
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 865px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
|
||||
#header {
|
||||
padding: 20px;
|
||||
font-size: 36px;
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: #666;
|
||||
}
|
||||
#main_content {
|
||||
background-color: #fff;
|
||||
padding: 60px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
#footer p {
|
||||
margin: 0;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 50px;
|
||||
color: #333;
|
||||
font: 10px Arial, sans-serif;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
height: 31px;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li {
|
||||
float: left;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li a {
|
||||
display: block;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
font: bold 11px/11px 'Arial';
|
||||
text-transform: uppercase;
|
||||
padding: 10px 15px;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
|
||||
.tabs li a:hover {
|
||||
background-color: #00b3ff;
|
||||
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
color: #000;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
div.huge {
|
||||
|
||||
font-size: 120px;
|
||||
line-height: 1em;
|
||||
padding: 0;
|
||||
letter-spacing: -.02em;
|
||||
overflow: hidden;
|
||||
}
|
||||
div.glyph_range {
|
||||
font-size: 72px;
|
||||
line-height: 1.1em;
|
||||
}
|
||||
|
||||
.size10{ font-size: 10px; }
|
||||
.size11{ font-size: 11px; }
|
||||
.size12{ font-size: 12px; }
|
||||
.size13{ font-size: 13px; }
|
||||
.size14{ font-size: 14px; }
|
||||
.size16{ font-size: 16px; }
|
||||
.size18{ font-size: 18px; }
|
||||
.size20{ font-size: 20px; }
|
||||
.size24{ font-size: 24px; }
|
||||
.size30{ font-size: 30px; }
|
||||
.size36{ font-size: 36px; }
|
||||
.size48{ font-size: 48px; }
|
||||
.size60{ font-size: 60px; }
|
||||
.size72{ font-size: 72px; }
|
||||
.size90{ font-size: 90px; }
|
||||
|
||||
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row2 { height: 160px;}
|
||||
.psample_row3 { height: 160px;}
|
||||
.psample_row4 { height: 160px;}
|
||||
|
||||
.psample {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.psample p {
|
||||
line-height: 1.3em;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.psample span {
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
.white_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.black_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.fullreverse {
|
||||
background: #000 !important;
|
||||
color: #fff !important;
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
padding: 20px;
|
||||
margin-bottom:0;
|
||||
}
|
||||
|
||||
|
||||
.sample_table td {
|
||||
padding-top: 3px;
|
||||
padding-bottom:5px;
|
||||
padding-left: 5px;
|
||||
vertical-align: middle;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
|
||||
.sample_table td:first-child {
|
||||
background-color: #eee;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
padding-left: 0;
|
||||
padding: 5px;
|
||||
font: 11px/12px "Courier New", Courier, mono;
|
||||
}
|
||||
|
||||
code {
|
||||
white-space: pre;
|
||||
background-color: #eee;
|
||||
display: block;
|
||||
padding: 10px;
|
||||
margin-bottom: 18px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
|
||||
|
||||
.box {
|
||||
padding: 18px;
|
||||
margin-bottom: 18px;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
|
||||
|
||||
#bodycomparison {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 72px;
|
||||
height: 90px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#bodycomparison div{
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
display: inline;
|
||||
margin: 0 15px 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#bodycomparison div span{
|
||||
font: 10px Arial;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
#xheight {
|
||||
float: none;
|
||||
position: absolute;
|
||||
color: #d9f3ff;
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
}
|
||||
|
||||
.fontbody {
|
||||
position: relative;
|
||||
}
|
||||
.arialbody{
|
||||
font-family: Arial;
|
||||
position: relative;
|
||||
}
|
||||
.verdanabody{
|
||||
font-family: Verdana;
|
||||
position: relative;
|
||||
}
|
||||
.georgiabody{
|
||||
font-family: Georgia;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* @group Layout page
|
||||
*/
|
||||
|
||||
#layout h1 {
|
||||
font-size: 36px;
|
||||
line-height: 42px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h2 {
|
||||
font-size: 24px;
|
||||
line-height: 23px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h3 {
|
||||
font-size: 22px;
|
||||
line-height: 1.4em;
|
||||
margin-top: 1em;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
#layout p.byline {
|
||||
font-size: 12px;
|
||||
margin-top: 18px;
|
||||
line-height: 12px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#layout p {
|
||||
font-size: 14px;
|
||||
line-height: 21px;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
#layout p.large{
|
||||
font-size: 18px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
#layout .sidebar p{
|
||||
font-size: 12px;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
#layout p.caption {
|
||||
font-size: 10px;
|
||||
margin-top: -16px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Glyphs */
|
||||
|
||||
#glyph_chart div{
|
||||
background-color: #d9f3ff;
|
||||
color: black;
|
||||
float: left;
|
||||
font-size: 36px;
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 1px;
|
||||
margin-right: 1px;
|
||||
text-align: center;
|
||||
width: 1.2em;
|
||||
position: relative;
|
||||
padding: .6em .2em .2em;
|
||||
}
|
||||
|
||||
#glyph_chart div p {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
text-align: center;
|
||||
font: bold 9px Arial, sans-serif;
|
||||
background-color: #3a768f;
|
||||
width: 100%;
|
||||
color: #fff;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
|
||||
#glyphs h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Installing */
|
||||
|
||||
#installing {
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
#installing p,
|
||||
#glyphs p{
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 18px;
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#installing h3{
|
||||
font-size: 15px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
#rendering h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
.render_table td {
|
||||
font: 11px "Courier New", Courier, mono;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
16
kngil/fonts/NotoKR-DemiLight/stylesheet.css
Normal file
16
kngil/fonts/NotoKR-DemiLight/stylesheet.css
Normal file
@@ -0,0 +1,16 @@
|
||||
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'notokr-demilight';
|
||||
src: url('notokr-demilight.eot');
|
||||
src: url('notokr-demilight.eot?#iefix') format('embedded-opentype'),
|
||||
url('notokr-demilight.woff2') format('woff2'),
|
||||
url('notokr-demilight.woff') format('woff'),
|
||||
url('notokr-demilight.ttf') format('truetype'),
|
||||
url('notokr-demilight.svg#notokr-demilight') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
5
kngil/fonts/NotoKR-Light/generator_config.txt
Normal file
5
kngil/fonts/NotoKR-Light/generator_config.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
||||
2827
kngil/fonts/NotoKR-Light/notokr-light-demo.html
Normal file
2827
kngil/fonts/NotoKR-Light/notokr-light-demo.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
kngil/fonts/NotoKR-Light/notokr-light.eot
Normal file
BIN
kngil/fonts/NotoKR-Light/notokr-light.eot
Normal file
Binary file not shown.
2457
kngil/fonts/NotoKR-Light/notokr-light.svg
Normal file
2457
kngil/fonts/NotoKR-Light/notokr-light.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 728 KiB |
BIN
kngil/fonts/NotoKR-Light/notokr-light.ttf
Normal file
BIN
kngil/fonts/NotoKR-Light/notokr-light.ttf
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-Light/notokr-light.woff
Normal file
BIN
kngil/fonts/NotoKR-Light/notokr-light.woff
Normal file
Binary file not shown.
BIN
kngil/fonts/NotoKR-Light/notokr-light.woff2
Normal file
BIN
kngil/fonts/NotoKR-Light/notokr-light.woff2
Normal file
Binary file not shown.
7
kngil/fonts/NotoKR-Light/specimen_files/easytabs.js
Normal file
7
kngil/fonts/NotoKR-Light/specimen_files/easytabs.js
Normal file
@@ -0,0 +1,7 @@
|
||||
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
|
||||
if(typeof param.defaultContent=="number")
|
||||
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
|
||||
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
|
||||
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
|
||||
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
|
||||
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
|
||||
129
kngil/fonts/NotoKR-Light/specimen_files/grid_12-825-55-15.css
Normal file
129
kngil/fonts/NotoKR-Light/specimen_files/grid_12-825-55-15.css
Normal file
@@ -0,0 +1,129 @@
|
||||
/*Notes about grid:
|
||||
Columns: 12
|
||||
Grid Width: 825px
|
||||
Column Width: 55px
|
||||
Gutter Width: 15px
|
||||
-------------------------------*/
|
||||
|
||||
|
||||
|
||||
.section {margin-bottom: 18px;
|
||||
}
|
||||
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
|
||||
.section {*zoom: 1;}
|
||||
|
||||
.section .firstcolumn,
|
||||
.section .firstcol {margin-left: 0;}
|
||||
|
||||
|
||||
/* Border on left hand side of a column. */
|
||||
.border {
|
||||
padding-left: 7px;
|
||||
margin-left: 7px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
/* Border with more whitespace, spans one column. */
|
||||
.colborder {
|
||||
padding-left: 42px;
|
||||
margin-left: 42px;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* The Grid Classes */
|
||||
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
|
||||
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
|
||||
|
||||
|
||||
.width1, .grid1, .span-1 {width: 55px;}
|
||||
.width1_2cols,.grid1_2cols {width: 20px;}
|
||||
.width1_3cols,.grid1_3cols {width: 8px;}
|
||||
.width1_4cols,.grid1_4cols {width: 2px;}
|
||||
.input_width1 {width: 49px;}
|
||||
|
||||
.width2, .grid2, .span-2 {width: 125px;}
|
||||
.width2_3cols,.grid2_3cols {width: 31px;}
|
||||
.width2_4cols,.grid2_4cols {width: 20px;}
|
||||
.input_width2 {width: 119px;}
|
||||
|
||||
.width3, .grid3, .span-3 {width: 195px;}
|
||||
.width3_2cols,.grid3_2cols {width: 90px;}
|
||||
.width3_4cols,.grid3_4cols {width: 37px;}
|
||||
.input_width3 {width: 189px;}
|
||||
|
||||
.width4, .grid4, .span-4 {width: 265px;}
|
||||
.width4_3cols,.grid4_3cols {width: 78px;}
|
||||
.input_width4 {width: 259px;}
|
||||
|
||||
.width5, .grid5, .span-5 {width: 335px;}
|
||||
.width5_2cols,.grid5_2cols {width: 160px;}
|
||||
.width5_3cols,.grid5_3cols {width: 101px;}
|
||||
.width5_4cols,.grid5_4cols {width: 72px;}
|
||||
.input_width5 {width: 329px;}
|
||||
|
||||
.width6, .grid6, .span-6 {width: 405px;}
|
||||
.width6_4cols,.grid6_4cols {width: 90px;}
|
||||
.input_width6 {width: 399px;}
|
||||
|
||||
.width7, .grid7, .span-7 {width: 475px;}
|
||||
.width7_2cols,.grid7_2cols {width: 230px;}
|
||||
.width7_3cols,.grid7_3cols {width: 148px;}
|
||||
.width7_4cols,.grid7_4cols {width: 107px;}
|
||||
.input_width7 {width: 469px;}
|
||||
|
||||
.width8, .grid8, .span-8 {width: 545px;}
|
||||
.width8_3cols,.grid8_3cols {width: 171px;}
|
||||
.input_width8 {width: 539px;}
|
||||
|
||||
.width9, .grid9, .span-9 {width: 615px;}
|
||||
.width9_2cols,.grid9_2cols {width: 300px;}
|
||||
.width9_4cols,.grid9_4cols {width: 142px;}
|
||||
.input_width9 {width: 609px;}
|
||||
|
||||
.width10, .grid10, .span-10 {width: 685px;}
|
||||
.width10_3cols,.grid10_3cols {width: 218px;}
|
||||
.width10_4cols,.grid10_4cols {width: 160px;}
|
||||
.input_width10 {width: 679px;}
|
||||
|
||||
.width11, .grid11, .span-11 {width: 755px;}
|
||||
.width11_2cols,.grid11_2cols {width: 370px;}
|
||||
.width11_3cols,.grid11_3cols {width: 241px;}
|
||||
.width11_4cols,.grid11_4cols {width: 177px;}
|
||||
.input_width11 {width: 749px;}
|
||||
|
||||
.width12, .grid12, .span-12 {width: 825px;}
|
||||
.input_width12 {width: 819px;}
|
||||
|
||||
/* Subdivided grid spaces */
|
||||
.emptycols_left1, .prepend-1 {padding-left: 70px;}
|
||||
.emptycols_right1, .append-1 {padding-right: 70px;}
|
||||
.emptycols_left2, .prepend-2 {padding-left: 140px;}
|
||||
.emptycols_right2, .append-2 {padding-right: 140px;}
|
||||
.emptycols_left3, .prepend-3 {padding-left: 210px;}
|
||||
.emptycols_right3, .append-3 {padding-right: 210px;}
|
||||
.emptycols_left4, .prepend-4 {padding-left: 280px;}
|
||||
.emptycols_right4, .append-4 {padding-right: 280px;}
|
||||
.emptycols_left5, .prepend-5 {padding-left: 350px;}
|
||||
.emptycols_right5, .append-5 {padding-right: 350px;}
|
||||
.emptycols_left6, .prepend-6 {padding-left: 420px;}
|
||||
.emptycols_right6, .append-6 {padding-right: 420px;}
|
||||
.emptycols_left7, .prepend-7 {padding-left: 490px;}
|
||||
.emptycols_right7, .append-7 {padding-right: 490px;}
|
||||
.emptycols_left8, .prepend-8 {padding-left: 560px;}
|
||||
.emptycols_right8, .append-8 {padding-right: 560px;}
|
||||
.emptycols_left9, .prepend-9 {padding-left: 630px;}
|
||||
.emptycols_right9, .append-9 {padding-right: 630px;}
|
||||
.emptycols_left10, .prepend-10 {padding-left: 700px;}
|
||||
.emptycols_right10, .append-10 {padding-right: 700px;}
|
||||
.emptycols_left11, .prepend-11 {padding-left: 770px;}
|
||||
.emptycols_right11, .append-11 {padding-right: 770px;}
|
||||
.pull-1 {margin-left: -70px;}
|
||||
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
|
||||
.pull-2 {margin-left: -140px;}
|
||||
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
|
||||
.pull-3 {margin-left: -210px;}
|
||||
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
|
||||
.pull-4 {margin-left: -280px;}
|
||||
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
|
||||
396
kngil/fonts/NotoKR-Light/specimen_files/specimen_stylesheet.css
Normal file
396
kngil/fonts/NotoKR-Light/specimen_files/specimen_stylesheet.css
Normal file
@@ -0,0 +1,396 @@
|
||||
@import url('grid_12-825-55-15.css');
|
||||
|
||||
/*
|
||||
CSS Reset by Eric Meyer - Released under Public Domain
|
||||
http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center, dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend, table,
|
||||
caption, tbody, tfoot, thead, tr, th, td
|
||||
{margin: 0;padding: 0;border: 0;outline: 0;
|
||||
font-size: 100%;vertical-align: baseline;
|
||||
background: transparent;}
|
||||
body {line-height: 1;}
|
||||
ol, ul {list-style: none;}
|
||||
blockquote, q {quotes: none;}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {content: ''; content: none;}
|
||||
:focus {outline: 0;}
|
||||
ins {text-decoration: none;}
|
||||
del {text-decoration: line-through;}
|
||||
table {border-collapse: collapse;border-spacing: 0;}
|
||||
|
||||
|
||||
|
||||
|
||||
body {
|
||||
color: #000;
|
||||
background-color: #dcdcdc;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #1883ba;
|
||||
}
|
||||
|
||||
h1{
|
||||
font-size: 32px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
h2{
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 865px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
|
||||
#header {
|
||||
padding: 20px;
|
||||
font-size: 36px;
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: #666;
|
||||
}
|
||||
#main_content {
|
||||
background-color: #fff;
|
||||
padding: 60px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
#footer p {
|
||||
margin: 0;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 50px;
|
||||
color: #333;
|
||||
font: 10px Arial, sans-serif;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
height: 31px;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li {
|
||||
float: left;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: #444;
|
||||
}
|
||||
.tabs li a {
|
||||
display: block;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
font: bold 11px/11px 'Arial';
|
||||
text-transform: uppercase;
|
||||
padding: 10px 15px;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
|
||||
.tabs li a:hover {
|
||||
background-color: #00b3ff;
|
||||
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
color: #000;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
div.huge {
|
||||
|
||||
font-size: 120px;
|
||||
line-height: 1em;
|
||||
padding: 0;
|
||||
letter-spacing: -.02em;
|
||||
overflow: hidden;
|
||||
}
|
||||
div.glyph_range {
|
||||
font-size: 72px;
|
||||
line-height: 1.1em;
|
||||
}
|
||||
|
||||
.size10{ font-size: 10px; }
|
||||
.size11{ font-size: 11px; }
|
||||
.size12{ font-size: 12px; }
|
||||
.size13{ font-size: 13px; }
|
||||
.size14{ font-size: 14px; }
|
||||
.size16{ font-size: 16px; }
|
||||
.size18{ font-size: 18px; }
|
||||
.size20{ font-size: 20px; }
|
||||
.size24{ font-size: 24px; }
|
||||
.size30{ font-size: 30px; }
|
||||
.size36{ font-size: 36px; }
|
||||
.size48{ font-size: 48px; }
|
||||
.size60{ font-size: 60px; }
|
||||
.size72{ font-size: 72px; }
|
||||
.size90{ font-size: 90px; }
|
||||
|
||||
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row1 { height: 120px;}
|
||||
.psample_row2 { height: 160px;}
|
||||
.psample_row3 { height: 160px;}
|
||||
.psample_row4 { height: 160px;}
|
||||
|
||||
.psample {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.psample p {
|
||||
line-height: 1.3em;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.psample span {
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
.white_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.black_blend {
|
||||
width: 100%;
|
||||
height: 61px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.fullreverse {
|
||||
background: #000 !important;
|
||||
color: #fff !important;
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
padding: 20px;
|
||||
margin-bottom:0;
|
||||
}
|
||||
|
||||
|
||||
.sample_table td {
|
||||
padding-top: 3px;
|
||||
padding-bottom:5px;
|
||||
padding-left: 5px;
|
||||
vertical-align: middle;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
|
||||
.sample_table td:first-child {
|
||||
background-color: #eee;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
padding-left: 0;
|
||||
padding: 5px;
|
||||
font: 11px/12px "Courier New", Courier, mono;
|
||||
}
|
||||
|
||||
code {
|
||||
white-space: pre;
|
||||
background-color: #eee;
|
||||
display: block;
|
||||
padding: 10px;
|
||||
margin-bottom: 18px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
|
||||
|
||||
.box {
|
||||
padding: 18px;
|
||||
margin-bottom: 18px;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
|
||||
|
||||
#bodycomparison {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 72px;
|
||||
height: 90px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#bodycomparison div{
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
display: inline;
|
||||
margin: 0 15px 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#bodycomparison div span{
|
||||
font: 10px Arial;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
#xheight {
|
||||
float: none;
|
||||
position: absolute;
|
||||
color: #d9f3ff;
|
||||
font-size: 72px;
|
||||
line-height: 90px;
|
||||
}
|
||||
|
||||
.fontbody {
|
||||
position: relative;
|
||||
}
|
||||
.arialbody{
|
||||
font-family: Arial;
|
||||
position: relative;
|
||||
}
|
||||
.verdanabody{
|
||||
font-family: Verdana;
|
||||
position: relative;
|
||||
}
|
||||
.georgiabody{
|
||||
font-family: Georgia;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* @group Layout page
|
||||
*/
|
||||
|
||||
#layout h1 {
|
||||
font-size: 36px;
|
||||
line-height: 42px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h2 {
|
||||
font-size: 24px;
|
||||
line-height: 23px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
#layout h3 {
|
||||
font-size: 22px;
|
||||
line-height: 1.4em;
|
||||
margin-top: 1em;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
#layout p.byline {
|
||||
font-size: 12px;
|
||||
margin-top: 18px;
|
||||
line-height: 12px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
#layout p {
|
||||
font-size: 14px;
|
||||
line-height: 21px;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
#layout p.large{
|
||||
font-size: 18px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
#layout .sidebar p{
|
||||
font-size: 12px;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
#layout p.caption {
|
||||
font-size: 10px;
|
||||
margin-top: -16px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Glyphs */
|
||||
|
||||
#glyph_chart div{
|
||||
background-color: #d9f3ff;
|
||||
color: black;
|
||||
float: left;
|
||||
font-size: 36px;
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 1px;
|
||||
margin-right: 1px;
|
||||
text-align: center;
|
||||
width: 1.2em;
|
||||
position: relative;
|
||||
padding: .6em .2em .2em;
|
||||
}
|
||||
|
||||
#glyph_chart div p {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
text-align: center;
|
||||
font: bold 9px Arial, sans-serif;
|
||||
background-color: #3a768f;
|
||||
width: 100%;
|
||||
color: #fff;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
|
||||
#glyphs h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Installing */
|
||||
|
||||
#installing {
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
#installing p,
|
||||
#glyphs p{
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 18px;
|
||||
font: 13px Arial, sans-serif;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#installing h3{
|
||||
font-size: 15px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
#rendering h1 {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
.render_table td {
|
||||
font: 11px "Courier New", Courier, mono;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
16
kngil/fonts/NotoKR-Light/stylesheet.css
Normal file
16
kngil/fonts/NotoKR-Light/stylesheet.css
Normal file
@@ -0,0 +1,16 @@
|
||||
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'notokr-light';
|
||||
src: url('notokr-light.eot');
|
||||
src: url('notokr-light.eot?#iefix') format('embedded-opentype'),
|
||||
url('notokr-light.woff2') format('woff2'),
|
||||
url('notokr-light.woff') format('woff'),
|
||||
url('notokr-light.ttf') format('truetype'),
|
||||
url('notokr-light.svg#notokr-light') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
|
||||
}
|
||||
5
kngil/fonts/NotoKR-Medium/generator_config.txt
Normal file
5
kngil/fonts/NotoKR-Medium/generator_config.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
|
||||
2827
kngil/fonts/NotoKR-Medium/notokr-medium-demo.html
Normal file
2827
kngil/fonts/NotoKR-Medium/notokr-medium-demo.html
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user