Initial commit: 교육 프로젝트 배포
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
<?php
|
||||
/**
|
||||
* myclass_db_helper.php
|
||||
* DB 데이터 연동 헬퍼 함수 모음
|
||||
* - 사용자 정보 조회
|
||||
* - 학습 목표 조회
|
||||
* - 년도/분기/남은일수 계산
|
||||
*/
|
||||
|
||||
// ========== 년도/분기/남은일수 계산 함수 ==========
|
||||
|
||||
/**
|
||||
* 현재 분기 및 목표 날짜 정보 계산
|
||||
* @return array ['year' => 2026, 'quarter' => '1분기', 'quarter_num' => 1, 'target_date' => '2026-03-31', 'target_date_kr' => '3월 31일', 'days_remaining' => 12]
|
||||
*/
|
||||
function getQuarterInfo() {
|
||||
$today = new DateTime('now', new DateTimeZone('Asia/Seoul'));
|
||||
$year = (int) $today->format('Y');
|
||||
$month = (int) $today->format('m');
|
||||
|
||||
// 분기 결정
|
||||
$quarter_num = ceil($month / 3);
|
||||
$quarter_text = $quarter_num . '분기';
|
||||
|
||||
// 각 분기의 마지막 날짜
|
||||
$quarter_end_dates = [
|
||||
1 => '03-31', // 1분기: 3월 31일
|
||||
2 => '06-30', // 2분기: 6월 30일
|
||||
3 => '09-30', // 3분기: 9월 30일
|
||||
4 => '12-31', // 4분기: 12월 31일
|
||||
];
|
||||
|
||||
$target_date_str = $year . '-' . $quarter_end_dates[$quarter_num];
|
||||
$target_date = new DateTime($target_date_str, new DateTimeZone('Asia/Seoul'));
|
||||
|
||||
// 남은 일수 계산
|
||||
$interval = $today->diff($target_date);
|
||||
$days_remaining = max(0, (int) $interval->format('%a'));
|
||||
|
||||
// 한글 날짜 (월월일일 형식)
|
||||
$month_kr = (int) explode('-', $quarter_end_dates[$quarter_num])[0];
|
||||
$day_kr = (int) explode('-', $quarter_end_dates[$quarter_num])[1];
|
||||
$target_date_kr = $month_kr . '월 ' . $day_kr . '일';
|
||||
|
||||
return [
|
||||
'year' => $year,
|
||||
'quarter_num' => $quarter_num,
|
||||
'quarter_text' => $quarter_text,
|
||||
'target_date' => $target_date_str,
|
||||
'target_date_kr' => $target_date_kr,
|
||||
'days_remaining' => $days_remaining,
|
||||
'days_display' => 'D-' . $days_remaining,
|
||||
];
|
||||
}
|
||||
|
||||
// ========== 사용자 정보 조회 함수 ==========
|
||||
|
||||
/**
|
||||
* 세션에서 사용자 정보 조회
|
||||
* 실제 DB 연결 후 필요에 따라 DB 조회로 변경 가능
|
||||
* @return array ['id' => 1, 'name' => '홍길동', 'position' => '선임연구원', 'company' => '한맥기술']
|
||||
*/
|
||||
function getUserInfo() {
|
||||
// TODO: 실제 DB 연결 시 아래 함수 사용
|
||||
// return getUserInfoFromDB($_SESSION['user_id'] ?? null);
|
||||
|
||||
// 현재는 세션 정보 기반 반환
|
||||
if (isset($_SESSION['user_name']) && isset($_SESSION['user_position'])) {
|
||||
return [
|
||||
'id' => $_SESSION['user_id'] ?? 1,
|
||||
'name' => $_SESSION['user_name'] ?? '사용자',
|
||||
'position' => $_SESSION['user_position'] ?? '사원',
|
||||
'company' => $_SESSION['user_company'] ?? '회사명',
|
||||
'rank' => $_SESSION['user_rank'] ?? 1250,
|
||||
];
|
||||
}
|
||||
|
||||
// 기본값 (테스트용)
|
||||
return [
|
||||
'id' => 1,
|
||||
'name' => '홍길동',
|
||||
'position' => '선임연구원',
|
||||
'company' => '한맥기술',
|
||||
'rank' => 1250,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* DB에서 사용자 정보 조회 (DB 연결 후 사용)
|
||||
* @param int $user_id
|
||||
* @return array|null
|
||||
*/
|
||||
function getUserInfoFromDB($user_id) {
|
||||
global $mysqli; // DB 연결 객체 필요
|
||||
|
||||
if (!$user_id) return null;
|
||||
|
||||
// TODO: 실제 테이블명과 필드명으로 수정
|
||||
$query = "SELECT id, name, position, company, rank FROM users WHERE id = ? LIMIT 1";
|
||||
|
||||
if ($stmt = $mysqli->prepare($query)) {
|
||||
$stmt->bind_param('i', $user_id);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
$user = $result->fetch_assoc();
|
||||
$stmt->close();
|
||||
return $user;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// ========== 학습 목표 조회 함수 ==========
|
||||
|
||||
/**
|
||||
* 모든 학습 목표 조회
|
||||
* @return array
|
||||
*/
|
||||
function getLearningGoals() {
|
||||
// 기본 목표 배열 (현재 코드에서 사용하는 것과 동일)
|
||||
return [
|
||||
['id' => 1, 'title' => '자기이해와 강점 찾기', 'desc' => '나의 성향, 가치관, 강점 등을 탐색하고 이해하며 자기인식을 높이는 과정', 'icon' => 'target', 'gif' => 'ico_target.gif', 'json' => 'ico_target.json'],
|
||||
['id' => 2, 'title' => '효과적인\n의사소통 배우기', 'desc' => '상황에 맞는 말하기와 경청을 통해 타인과 원활하게 소통하는 방법을 익히는 과정', 'icon' => 'email', 'gif' => 'ico_email.gif', 'json' => 'ico_email.json'],
|
||||
['id' => 3, 'title' => '감정 조절과 자기관리', 'desc' => '다양한 감정을 인식하고 조절하여 안정적인 삶을 유지하는 자기관리 훈련 과정', 'icon' => 'emoji', 'gif' => 'ico_emoji.gif', 'json' => 'ico_emoji.json'],
|
||||
['id' => 4, 'title' => '비판적 사고와 문제 해결', 'desc' => '다양한 관점에서 생각하고 문제 상황을 논리적으로 해결하는 능력을 기르는 과정', 'icon' => 'lightbulb', 'gif' => 'ico_lightbulb.gif', 'json' => 'ico_lightbulb.json'],
|
||||
['id' => 5, 'title' => '협업과 팀워크 기르기', 'desc' => '타인과 협력하며 공동의 목표를 위해 함께 노력하는 태도와 기술을 기르는 과정', 'icon' => 'puzzle', 'gif' => 'ico_puzzle.gif', 'json' => 'ico_puzzle.json'],
|
||||
['id' => 6, 'title' => '커리어 탐색과 역량 개발', 'desc' => '직무와 산업의 흐름을 이해하고, 자신의 커리어 방향성과 필요한 역량을 점검·계획하는 과정', 'icon' => 'target', 'gif' => 'ico_target.gif', 'json' => 'ico_target.json'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* DB에서 학습 목표 조회 (DB 연결 후 사용)
|
||||
* @return array
|
||||
*/
|
||||
function getLearningGoalsFromDB() {
|
||||
global $mysqli; // DB 연결 객체 필요
|
||||
|
||||
// TODO: 실제 테이블명으로 수정 (예: edu_learning_goals)
|
||||
$query = "SELECT id, title, description as desc, icon, gif_filename as gif, json_filename as json FROM edu_learning_goals ORDER BY id ASC";
|
||||
|
||||
$result = $mysqli->query($query);
|
||||
if (!$result) return [];
|
||||
|
||||
$goals = [];
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$goals[] = $row;
|
||||
}
|
||||
|
||||
return $goals;
|
||||
}
|
||||
|
||||
/**
|
||||
* 사용자의 선택된 학습 목표 조회
|
||||
* @param int $user_id
|
||||
* @param int $year
|
||||
* @param int $quarter
|
||||
* @return array|null ['goal_id' => 1, 'selected_at' => '2026-01-15', 'completion_status' => 'in_progress']
|
||||
*/
|
||||
function getUserSelectedGoal($user_id, $year, $quarter) {
|
||||
global $mysqli; // DB 연결 객체 필요
|
||||
|
||||
// TODO: 실제 테이블명으로 수정 (예: edu_user_learning_progress)
|
||||
$query = "SELECT goal_id, selected_at, completion_status FROM edu_user_learning_progress
|
||||
WHERE user_id = ? AND year = ? AND quarter = ? LIMIT 1";
|
||||
|
||||
if ($stmt = $mysqli->prepare($query)) {
|
||||
$stmt->bind_param('iii', $user_id, $year, $quarter);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
$goal = $result->fetch_assoc();
|
||||
$stmt->close();
|
||||
return $goal;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 사용자의 완료된 목표 내역 조회
|
||||
* @param int $user_id
|
||||
* @return array []id => 1, 2, 3]
|
||||
*/
|
||||
function getCompletedGoals($user_id) {
|
||||
global $mysqli; // DB 연결 객체 필요
|
||||
|
||||
// TODO: 실제 테이블명으로 수정
|
||||
$query = "SELECT goal_id FROM edu_user_learning_progress
|
||||
WHERE user_id = ? AND completion_status = 'completed'
|
||||
ORDER BY completed_at DESC";
|
||||
|
||||
$completed = [];
|
||||
if ($stmt = $mysqli->prepare($query)) {
|
||||
$stmt->bind_param('i', $user_id);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$completed[] = (int) $row['goal_id'];
|
||||
}
|
||||
$stmt->close();
|
||||
}
|
||||
|
||||
return $completed;
|
||||
}
|
||||
|
||||
// ========== 유틸리티 함수 ==========
|
||||
|
||||
/**
|
||||
* 순위 정보 조회 (더미 데이터)
|
||||
* @return array
|
||||
*/
|
||||
function getRankingList() {
|
||||
// TODO: DB에서 실제 순위 데이터 조회
|
||||
return [
|
||||
['rank' => 1, 'medal' => 'gold', 'name' => '박길동', 'company' => '바론컨설턴트'],
|
||||
['rank' => 2, 'medal' => 'silver', 'name' => '홍길동', 'company' => '한맥기술'],
|
||||
['rank' => 3, 'medal' => 'bronze', 'name' => '김철수', 'company' => '삼안'],
|
||||
['rank' => 4, 'medal' => 'none', 'name' => '박철수', 'company' => '바른컨설턴트'],
|
||||
['rank' => 5, 'medal' => 'none', 'name' => '김영희', 'company' => '한맥기술'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 안내 문구 생성
|
||||
* @param string $mode (initial, completed, additional)
|
||||
* @param array $user
|
||||
* @param array $quarterInfo
|
||||
* @param array $completedGoal
|
||||
* @return string HTML
|
||||
*/
|
||||
function generatePageIntro($mode, $user, $quarterInfo, $completedGoal = null) {
|
||||
$year_kr = substr($quarterInfo['year'], 2); // 26
|
||||
|
||||
if ($mode === 'completed') {
|
||||
return <<<HTML
|
||||
<div class="page-title">
|
||||
<h3>2026년도 {$quarterInfo['quarter_num']}분기의 첫번째 목표를 완성했어요!</h3>
|
||||
<p><em>다음 목표를 선택</em>해, 나만의 책장을 더 풍성하게 채워보세요.</p>
|
||||
</div>
|
||||
HTML;
|
||||
}
|
||||
|
||||
if ($mode === 'additional') {
|
||||
$goal_title = isset($completedGoal['title']) ? htmlspecialchars($completedGoal['title'], ENT_QUOTES, 'UTF-8') : '목표';
|
||||
return <<<HTML
|
||||
<div class="page-title">
|
||||
<h3><em>축하합니다.</em> <strong>[$goal_title]</strong>, 빛나는 책장을 완성했어요.</h3>
|
||||
<p><em>다음 책장</em>을 열어볼까요?</p>
|
||||
</div>
|
||||
HTML;
|
||||
}
|
||||
|
||||
// 초기 상태 (목표 선택)
|
||||
$user_name = htmlspecialchars($user['name'] ?? '사용자', ENT_QUOTES, 'UTF-8');
|
||||
$user_position = htmlspecialchars($user['position'] ?? '', ENT_QUOTES, 'UTF-8');
|
||||
$days_display = $quarterInfo['days_display'];
|
||||
$target_date = $quarterInfo['target_date_kr'];
|
||||
|
||||
return <<<HTML
|
||||
<div class="page-title page-title--goal" data-state="initial">
|
||||
<h3><em>{$user_name} {$user_position}</em>님, <strong>{$year_kr}년도 {$quarterInfo['quarter_num']}분기 학습 목표</strong>를 골라볼까요?</h3>
|
||||
<p class="page-title-deadline"><span class="deadline-highlight">{$days_display}<small>({$target_date})</small></span><span class="deadline-body">까지 <strong>선택한 목표</strong>와 함께 배움을 채워가세요.</span></p>
|
||||
</div>
|
||||
HTML;
|
||||
}
|
||||
Reference in New Issue
Block a user