DB 테이블 정보 및 스크립트 수정(20260303)

This commit is contained in:
2026-03-03 16:26:10 +09:00
parent 98554a1699
commit e5d65f0829
5 changed files with 990 additions and 180 deletions

View File

@@ -1,12 +1,595 @@
-- 팀원들이 공통으로 사용할 초기 테이블 구조 생성 -- 컨텐츠 등록
CREATE TABLE IF NOT EXISTS users ( CREATE TABLE `edu`.`contents` (
id INT AUTO_INCREMENT PRIMARY KEY, `content_id` VARCHAR(20) NOT NULL COMMENT '콘텐츠ID', -- 콘텐츠ID
username VARCHAR(50) NOT NULL, `category_code` VARCHAR(20) NULL COMMENT '카테고리', -- 카테고리
email VARCHAR(100) NOT NULL, `category_group` VARCHAR(20) NULL COMMENT '케테고리구분', -- 케테고리구분
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP `title` VARCHAR(200) NULL COMMENT '콘텐츠명', -- 콘텐츠명
); `description` TEXT NULL COMMENT '콘텐츠설명', -- 콘텐츠설명
`description2` TEXT NULL COMMENT '콘텐츠설명2', -- 콘텐츠설명2
`content_url` VARCHAR(200) NULL COMMENT '콘텐츠url', -- 콘텐츠url
`thumbnail_url` VARCHAR(200) NULL COMMENT '썸네일url', -- 썸네일url
`base_year` CHAR(4) NULL COMMENT '기준년도', -- 기준년도
`start_date` DATE NULL COMMENT '기준일자', -- 기준일자
`end_date` DATE NULL COMMENT '종료일자', -- 종료일자
`sort_order` INTEGER NULL COMMENT '정렬순번', -- 정렬순번
`goal_code` VARCHAR(20) NULL COMMENT '학습목표코드', -- 학습목표코드
`image_name` VARCHAR(200) NULL COMMENT '대표이미지명', -- 대표이미지명
`image_path` VARCHAR(200) NULL COMMENT '이미지경로', -- 이미지경로
`is_offer` CHAR(1) NULL COMMENT '추천콘텐츠적용여부', -- 추천콘텐츠적용여부
`offer_id` VARCHAR(20) NULL COMMENT '제안ID', -- 제안ID
`issue_type_code` VARCHAR(20) NULL COMMENT '인사이트이슈구분', -- 인사이트이슈구분
`is_active` CHAR(1) NULL COMMENT '사용여부', -- 사용여부
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '컨텐츠 등록';
-- 초기 테스트를 위한 더미 데이터 삽입 (선택 사항) -- 컨텐츠 등록
INSERT INTO users (username, email) VALUES ALTER TABLE `edu`.`contents`
('test_user_1', 'user1@hmac-edu.com'), ADD CONSTRAINT `PK_contents` -- 컨텐츠 등록 기본키
('test_user_2', 'user2@hmac-edu.com'); PRIMARY KEY (
`content_id` -- 콘텐츠ID
);
-- 마이클래스 학습목표 등록
CREATE TABLE `edu`.`learning_goals` (
`goal_code` VARCHAR(20) NOT NULL COMMENT '학습목표 코드', -- 학습목표 코드
`title` VARCHAR(200) NULL COMMENT '학습목표제목', -- 학습목표제목
`base_year` CHAR(4) NULL COMMENT '기준년도', -- 기준년도
`end_date` DATE NULL COMMENT '종료일', -- 종료일
`is_active` CHAR(1) NULL COMMENT '사용여부', -- 사용여부
`sort_order` INTEGER NULL COMMENT '정렬순번', -- 정렬순번
`remarks` VARCHAR(200) NULL COMMENT '비고', -- 비고
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '마이클래스 학습목표 등록';
-- 마이클래스 학습목표 등록
ALTER TABLE `edu`.`learning_goals`
ADD CONSTRAINT `PK_learning_goals` -- 마이클래스 학습목표 등록 기본키
PRIMARY KEY (
`goal_code` -- 학습목표 코드
);
-- 코드상세
CREATE TABLE `edu`.`codes` (
`group_code` VARCHAR(10) NOT NULL COMMENT '메인코드', -- 메인코드
`code` VARCHAR(10) NOT NULL COMMENT '서브코드', -- 서브코드
`base_code` VARCHAR(20) NOT NULL COMMENT '기준코드', -- 기준코드
`code_name` VARCHAR(250) NULL COMMENT '코드명', -- 코드명
`is_active` CHAR(1) NULL COMMENT '사용구분', -- 사용구분
`desc01` VARCHAR(250) NULL COMMENT '설명1', -- 설명1
`desc02` VARCHAR(250) NULL COMMENT '설명2', -- 설명2
`desc03` VARCHAR(250) NULL COMMENT '설명3', -- 설명3
`desc04` VARCHAR(250) NULL COMMENT '설명4', -- 설명4
`desc05` VARCHAR(250) NULL COMMENT '설명5', -- 설명5
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '코드상세';
-- 코드상세
ALTER TABLE `edu`.`codes`
ADD CONSTRAINT `PK_codes` -- 코드상세 기본키
PRIMARY KEY (
`group_code`, -- 메인코드
`code` -- 서브코드
);
-- 통합인사정보
CREATE TABLE `edu`.`users` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`name` VARCHAR(100) NULL COMMENT '성명', -- 성명
`dept_name` VARCHAR(100) NULL COMMENT '부서', -- 부서
`rank_name` VARCHAR(100) NULL COMMENT '직위', -- 직위
`join_date` DATE NULL COMMENT '입사일', -- 입사일
`belong_comp` VARCHAR(100) NULL COMMENT '소속회사', -- 소속회사
`working_cpmp` VARCHAR(100) NULL COMMENT '근무회사', -- 근무회사
`intra_pw` VARCHAR(20) NULL COMMENT 'password' -- password
)
COMMENT '통합인사정보';
-- 통합인사정보
ALTER TABLE `edu`.`users`
ADD CONSTRAINT `PK_users` -- 통합인사정보 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 댓글정보
CREATE TABLE `edu`.`comments` (
`id` VARCHAR(12) NOT NULL COMMENT '댓글ID', -- 댓글ID
`parent_id` VARCHAR(12) NULL COMMENT '상위댓글ID', -- 상위댓글ID
`sys_comp_code` VARCHAR(20) NULL COMMENT '기준법인', -- 기준법인
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`comment` VARCHAR(255) NULL COMMENT '내용', -- 내용
`content_id` INTEGER NULL COMMENT '콘텐츠ID', -- 콘텐츠ID
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '댓글정보';
-- 댓글정보
ALTER TABLE `edu`.`comments`
ADD CONSTRAINT `PK_comments` -- 댓글정보 기본키
PRIMARY KEY (
`id` -- 댓글ID
);
-- 학습이력
CREATE TABLE `edu`.`learning_histories` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`content_id` VARCHAR(20) NOT NULL COMMENT '콘텐츠ID', -- 콘텐츠ID
`first_viewed_at` DATETIME NULL COMMENT '최초시청일시', -- 최초시청일시
`last_viewed_at` DATETIME NULL COMMENT '최종시청일시', -- 최종시청일시
`watch_tm` DECIMAL(18) NULL COMMENT '영상시작길이', -- 영상시작길이
`content_tm` DECIMAL(18) NULL COMMENT '영상길이', -- 영상길이
`all_tm` DECIMAL(18) NULL COMMENT '누적시청시간', -- 누적시청시간
`completed_at` DATETIME NULL COMMENT '학습완료일시', -- 학습완료일시
`comment` VARCHAR(200) NULL COMMENT '한줄소감', -- 한줄소감
`is_watching` CHAR(1) NULL COMMENT '시청중컨텐츠여부' -- 시청중컨텐츠여부
)
COMMENT '학습이력';
-- 학습이력
ALTER TABLE `edu`.`learning_histories`
ADD CONSTRAINT `PK_learning_histories` -- 학습이력 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`content_id` -- 콘텐츠ID
);
-- 컨텐츠저장
CREATE TABLE `edu`.`content_wishlist` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`content_id` INTEGER NOT NULL COMMENT '콘텐츠ID', -- 콘텐츠ID
`favorited_at` DATETIME NULL COMMENT '찜한일시', -- 찜한일시
`is_active` CHAR(1) NULL COMMENT '사용여부', -- 사용여부
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '컨텐츠저장';
-- 컨텐츠저장
ALTER TABLE `edu`.`content_wishlist`
ADD CONSTRAINT `PK_content_wishlist` -- 컨텐츠저장 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`content_id` -- 콘텐츠ID
);
-- 사용자 키워드
CREATE TABLE `edu`.`user_keywords` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`keyword_code` VARCHAR(20) NOT NULL COMMENT '키워드코드', -- 키워드코드
`keyword_name` VARCHAR(100) NULL COMMENT '키워드명', -- 키워드명
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '사용자 키워드';
-- 사용자 키워드
ALTER TABLE `edu`.`user_keywords`
ADD CONSTRAINT `PK_user_keywords` -- 사용자 키워드 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`keyword_code` -- 키워드코드
);
-- 컨텐츠제안하기
CREATE TABLE `edu`.`content_offer` (
`offer_id` VARCHAR(20) NOT NULL COMMENT '제안ID', -- 제안ID
`type_code` VARCHAR(20) NULL COMMENT '제안구분', -- 제안구분
`title` VARCHAR(200) NULL COMMENT '제목', -- 제목
`reference_url` VARCHAR(255) NULL COMMENT 'URL', -- URL
`reason` TEXT NULL COMMENT '추천이유', -- 추천이유
`status_code` VARCHAR(20) NULL COMMENT '제안상태', -- 제안상태
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_at` TIMESTAMP NULL COMMENT '수정일', -- 수정일
`member_id` VARCHAR(20) NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NULL COMMENT '기준법인' -- 기준법인
)
COMMENT '컨텐츠제안하기';
-- 컨텐츠제안하기
ALTER TABLE `edu`.`content_offer`
ADD CONSTRAINT `PK_content_offer` -- 컨텐츠제안하기 기본키
PRIMARY KEY (
`offer_id` -- 제안ID
);
-- 년도별학습레벨
CREATE TABLE `edu`.`yearly_learning_stats` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`stats_year` CHAR(4) NOT NULL COMMENT '년도', -- 년도
`learning_level` VARCHAR(20) NULL COMMENT '학습레벨', -- 학습레벨
`total_minutes` DECIMAL(18) NULL COMMENT '총학습시간(분)', -- 총학습시간(분)
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '년도별학습레벨';
-- 년도별학습레벨
ALTER TABLE `edu`.`yearly_learning_stats`
ADD CONSTRAINT `PK_yearly_learning_stats` -- 년도별학습레벨 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`stats_year` -- 년도
);
-- 컨텐츠 키워드
CREATE TABLE `edu`.`content_keywords` (
`content_id` VARCHAR(20) NOT NULL COMMENT '콘텐츠ID', -- 콘텐츠ID
`keyword_code` VARCHAR(20) NOT NULL COMMENT '키워드코드', -- 키워드코드
`is_active` CHAR(1) NULL COMMENT '사용여부', -- 사용여부
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '컨텐츠 키워드';
-- 컨텐츠 키워드
ALTER TABLE `edu`.`content_keywords`
ADD CONSTRAINT `PK_content_keywords` -- 컨텐츠 키워드 기본키
PRIMARY KEY (
`content_id`, -- 콘텐츠ID
`keyword_code` -- 키워드코드
);
-- 접속이력
CREATE TABLE `edu`.`access_history` (
`accessed_at` TIMESTAMP NOT NULL COMMENT '접속일시', -- 접속일시
`member_id` VARCHAR(20) NOT NULL COMMENT '사번', -- 사번
`sys_comp_code` VARCHAR(20) NULL COMMENT '기준법인', -- 기준법인
`ip_address` VARCHAR(20) NULL COMMENT '접속IP' -- 접속IP
)
COMMENT '접속이력';
-- 접속이력
ALTER TABLE `edu`.`access_history`
ADD CONSTRAINT `PK_access_history` -- 접속이력 기본키
PRIMARY KEY (
`accessed_at` -- 접속일시
);
-- 코드마스터
CREATE TABLE `edu`.`code_group` (
`group_code` VARCHAR(10) NOT NULL COMMENT '메인코드', -- 메인코드
`group_name` VARCHAR(250) NULL COMMENT '코드명', -- 코드명
`is_active` CHAR(1) NULL COMMENT '사용구분', -- 사용구분
`sort_order` INTEGER NULL COMMENT '정렬구분', -- 정렬구분
`comment` VARCHAR(250) NULL COMMENT '코멘트', -- 코멘트
`desc01` VARCHAR(250) NULL COMMENT '설명1', -- 설명1
`desc02` VARCHAR(250) NULL COMMENT '설명2', -- 설명2
`desc03` VARCHAR(250) NULL COMMENT '설명3', -- 설명3
`desc04` VARCHAR(250) NULL COMMENT '설명4', -- 설명4
`desc05` VARCHAR(250) NULL COMMENT '설명5', -- 설명5
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '코드마스터';
-- 코드마스터
ALTER TABLE `edu`.`code_group`
ADD CONSTRAINT `PK_code_group` -- 코드마스터 기본키
PRIMARY KEY (
`group_code` -- 메인코드
);
-- 첨부파일
CREATE TABLE `edu`.`files` (
`content_id` VARCHAR(20) NOT NULL COMMENT '콘텐츠ID', -- 콘텐츠ID
`id` INTEGER NOT NULL COMMENT '파일ID', -- 파일ID
`file_name` VARCHAR(200) NULL COMMENT '파일명', -- 파일명
`file_type` VARCHAR(20) NULL COMMENT '파일구분', -- 파일구분
`file_path` VARCHAR(200) NULL COMMENT '저장위치', -- 저장위치
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '첨부파일';
-- 첨부파일
ALTER TABLE `edu`.`files`
ADD CONSTRAINT `PK_files` -- 첨부파일 기본키
PRIMARY KEY (
`content_id`, -- 콘텐츠ID
`id` -- 파일ID
);
-- 선택학습목표
CREATE TABLE `edu`.`user_learning_goals` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`goal_code` VARCHAR(20) NOT NULL COMMENT '학습목표 코드', -- 학습목표 코드
`quarter` VARCHAR(20) NULL COMMENT '분기', -- 분기
`completed_date` DATE NULL COMMENT '학습완료일', -- 학습완료일
`is_active` CHAR(1) NULL COMMENT '사용여부', -- 사용여부
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '선택학습목표';
-- 선택학습목표
ALTER TABLE `edu`.`user_learning_goals`
ADD CONSTRAINT `PK_user_learning_goals` -- 선택학습목표 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`goal_code` -- 학습목표 코드
);
-- 법인별키워드
CREATE TABLE `edu`.`recommend_keywords` (
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`keyword_code` VARCHAR(20) NOT NULL COMMENT '키워드코드', -- 키워드코드
`is_active` CHAR(1) NULL COMMENT '사용여부', -- 사용여부
`created_by` VARCHAR(20) NULL COMMENT '등록자', -- 등록자
`created_at` TIMESTAMP NULL COMMENT '등록일', -- 등록일
`updated_by` VARCHAR(20) NULL COMMENT '수정자', -- 수정자
`updated_at` TIMESTAMP NULL COMMENT '수정일' -- 수정일
)
COMMENT '법인별키워드';
-- 법인별키워드
ALTER TABLE `edu`.`recommend_keywords`
ADD CONSTRAINT `PK_recommend_keywords` -- 법인별키워드 기본키
PRIMARY KEY (
`sys_comp_code`, -- 기준법인
`keyword_code` -- 키워드코드
);
-- 뱃지정보
CREATE TABLE `edu`.`user_badges` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`seq` INTEGER NOT NULL COMMENT '순번', -- 순번
`badge_code` VARCHAR(20) NULL COMMENT '뱃지코드', -- 뱃지코드
`issued_at` DATETIME NULL COMMENT '지급일자' -- 지급일자
)
COMMENT '뱃지정보';
-- 뱃지정보
ALTER TABLE `edu`.`user_badges`
ADD CONSTRAINT `PK_user_badges` -- 뱃지정보 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`seq` -- 순번
);
-- 검색어이력
CREATE TABLE `edu`.`search_logs` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`sys_comp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`seq` INTEGER NOT NULL COMMENT '순번', -- 순번
`keyword` VARCHAR(50) NULL COMMENT '검색어', -- 검색어
`searched_at` DATETIME NULL COMMENT '등록일' -- 등록일
)
COMMENT '검색어이력';
-- 검색어이력
ALTER TABLE `edu`.`search_logs`
ADD CONSTRAINT `PK_search_logs` -- 검색어이력 기본키
PRIMARY KEY (
`member_id`, -- id
`sys_comp_code`, -- 기준법인
`seq` -- 순번
);
-- 알람이력
CREATE TABLE `edu`.`notifications` (
`member_id` VARCHAR(20) NOT NULL COMMENT 'id', -- id
`corp_code` VARCHAR(20) NOT NULL COMMENT '기준법인', -- 기준법인
`seq` INTEGER NOT NULL COMMENT '순번', -- 순번
`type_code` VARCHAR(20) NULL COMMENT '알람코드', -- 알람코드
`message` VARCHAR(255) NULL COMMENT '알람내용', -- 알람내용
`sent_at` DATETIME NULL COMMENT '알람일시' -- 알람일시
)
COMMENT '알람이력';
-- 알람이력
ALTER TABLE `edu`.`notifications`
ADD CONSTRAINT `PK_notifications` -- 알람이력 기본키
PRIMARY KEY (
`member_id`, -- id
`corp_code`, -- 기준법인
`seq` -- 순번
);
-- 코드상세
ALTER TABLE `edu`.`codes`
ADD CONSTRAINT `FK_code_group_TO_codes` -- 코드마스터 -> 코드상세
FOREIGN KEY (
`group_code` -- 메인코드
)
REFERENCES `edu`.`code_group` ( -- 코드마스터
`group_code` -- 메인코드
);
-- 댓글정보
ALTER TABLE `edu`.`comments`
ADD CONSTRAINT `FK_users_TO_comments` -- 통합인사정보 -> 댓글정보
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 학습이력
ALTER TABLE `edu`.`learning_histories`
ADD CONSTRAINT `FK_users_TO_learning_histories` -- 통합인사정보 -> 학습이력
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 학습이력
ALTER TABLE `edu`.`learning_histories`
ADD CONSTRAINT `FK_contents_TO_learning_histories` -- 컨텐츠 등록 -> 학습이력
FOREIGN KEY (
`content_id` -- 콘텐츠ID
)
REFERENCES `edu`.`contents` ( -- 컨텐츠 등록
`content_id` -- 콘텐츠ID
);
-- 컨텐츠저장
ALTER TABLE `edu`.`content_wishlist`
ADD CONSTRAINT `FK_users_TO_content_wishlist` -- 통합인사정보 -> 컨텐츠저장
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 사용자 키워드
ALTER TABLE `edu`.`user_keywords`
ADD CONSTRAINT `FK_users_TO_user_keywords` -- 통합인사정보 -> 사용자 키워드
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 컨텐츠제안하기
ALTER TABLE `edu`.`content_offer`
ADD CONSTRAINT `FK_users_TO_content_offer` -- 통합인사정보 -> 컨텐츠제안하기
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 년도별학습레벨
ALTER TABLE `edu`.`yearly_learning_stats`
ADD CONSTRAINT `FK_users_TO_yearly_learning_stats` -- 통합인사정보 -> 년도별학습레벨
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 컨텐츠 키워드
ALTER TABLE `edu`.`content_keywords`
ADD CONSTRAINT `FK_contents_TO_content_keywords` -- 컨텐츠 등록 -> 컨텐츠 키워드
FOREIGN KEY (
`content_id` -- 콘텐츠ID
)
REFERENCES `edu`.`contents` ( -- 컨텐츠 등록
`content_id` -- 콘텐츠ID
);
-- 첨부파일
ALTER TABLE `edu`.`files`
ADD CONSTRAINT `FK_contents_TO_files` -- 컨텐츠 등록 -> 첨부파일
FOREIGN KEY (
`content_id` -- 콘텐츠ID
)
REFERENCES `edu`.`contents` ( -- 컨텐츠 등록
`content_id` -- 콘텐츠ID
);
-- 선택학습목표
ALTER TABLE `edu`.`user_learning_goals`
ADD CONSTRAINT `FK_users_TO_user_learning_goals` -- 통합인사정보 -> 선택학습목표
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 선택학습목표
ALTER TABLE `edu`.`user_learning_goals`
ADD CONSTRAINT `FK_learning_goals_TO_user_learning_goals` -- 마이클래스 학습목표 등록 -> 선택학습목표
FOREIGN KEY (
`goal_code` -- 학습목표 코드
)
REFERENCES `edu`.`learning_goals` ( -- 마이클래스 학습목표 등록
`goal_code` -- 학습목표 코드
);
-- 뱃지정보
ALTER TABLE `edu`.`user_badges`
ADD CONSTRAINT `FK_users_TO_user_badges` -- 통합인사정보 -> 뱃지정보
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 검색어이력
ALTER TABLE `edu`.`search_logs`
ADD CONSTRAINT `FK_users_TO_search_logs` -- 통합인사정보 -> 검색어이력
FOREIGN KEY (
`member_id`, -- id
`sys_comp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);
-- 알람이력
ALTER TABLE `edu`.`notifications`
ADD CONSTRAINT `FK_users_TO_notifications` -- 통합인사정보 -> 알람이력
FOREIGN KEY (
`member_id`, -- id
`corp_code` -- 기준법인
)
REFERENCES `edu`.`users` ( -- 통합인사정보
`member_id`, -- id
`sys_comp_code` -- 기준법인
);

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
@charset "UTF-8"; @charset "UTF-8";
:root { :root {
/* text - 텍스트 색상 */ /* text - 텍스트 색상 */
--text-intro-base: #1b1810; --text-intro-base: #1b1810;
@@ -33,41 +34,32 @@
--bg-base: #e4ddcf; --bg-base: #e4ddcf;
--bg-primary: #ece3d2; --bg-primary: #ece3d2;
--bg-secondary: --bg-secondary:
radial-gradient( radial-gradient(93.89% 93.89% at 49.32% 6.11%,
93.89% 93.89% at 49.32% 6.11%,
rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.11) 86.06%, rgba(255, 255, 255, 0.11) 86.06%,
rgba(134, 114, 77, 0.2) 88.94% rgba(134, 114, 77, 0.2) 88.94%),
),
linear-gradient(180deg, #f9f6f0 0%, #e6ddcc 100%); linear-gradient(180deg, #f9f6f0 0%, #e6ddcc 100%);
--bg-main-card: rgba(255, 255, 255, 0.6); --bg-main-card: rgba(255, 255, 255, 0.6);
--bg-intro-mask: #1b1810; --bg-intro-mask: #1b1810;
--bg-intro: linear-gradient( --bg-intro: linear-gradient(180deg,
180deg, #f9f5f2 0%,
#f9f5f2 0%, #fff 18.77%,
#fff 18.77%, #fff 41.8%,
#fff 41.8%, #ece8e4 100%);
#ece8e4 100%
);
--bg-main: --bg-main:
linear-gradient( linear-gradient(90deg,
90deg, #0f3025 0%,
#0f3025 0%, #194335 38%,
#194335 38%, #0b221b 87.51%,
#0b221b 87.51%, #0d231c 100%) top / 100% 114px no-repeat,
#0d231c 100%
)
top / 100% 114px no-repeat,
#ece3d2; #ece3d2;
--bg-video: #1b1b1b; --bg-video: #1b1b1b;
--bg-comment: #2a2a2a; --bg-comment: #2a2a2a;
--bg-nav: linear-gradient( --bg-nav: linear-gradient(90deg,
90deg, #0f3025 0%,
#0f3025 0%, #194335 38%,
#194335 38%, #0b221b 87.51%,
#0b221b 87.51%, #0d231c 100%);
#0d231c 100%
);
--bg-nav-depth: #fff; --bg-nav-depth: #fff;
--bg-nav-alerts: #ff2200; --bg-nav-alerts: #ff2200;
--bg-nav-alerts-hover: #188f6b; --bg-nav-alerts-hover: #188f6b;
@@ -190,85 +182,111 @@
transform: translateY(0); transform: translateY(0);
} }
} }
@keyframes arrow-next { @keyframes arrow-next {
0%, 100% {
0%,
100% {
right: 72px; right: 72px;
} }
50% { 50% {
right: 50px; right: 50px;
} }
} }
@keyframes bounce { @keyframes bounce {
0%, 100% {
0%,
100% {
transform: translateX(-50%) translateY(0); transform: translateX(-50%) translateY(0);
} }
50% { 50% {
transform: translateX(-50%) translateY(-12px); transform: translateX(-50%) translateY(-12px);
} }
} }
@keyframes slideUp { @keyframes slideUp {
to { to {
opacity: 1; opacity: 1;
transform: translateY(0); transform: translateY(0);
} }
} }
@keyframes scroll-down { @keyframes scroll-down {
0% { 0% {
transform-origin: 50% 100%; transform-origin: 50% 100%;
transform: scaleY(1); transform: scaleY(1);
} }
50% { 50% {
transform-origin: 50% 100%; transform-origin: 50% 100%;
transform: scaleY(0); transform: scaleY(0);
} }
50.1% { 50.1% {
transform-origin: 50% 0; transform-origin: 50% 0;
transform: scaleY(0); transform: scaleY(0);
} }
to { to {
transform-origin: 50% 0; transform-origin: 50% 0;
transform: scaleY(1); transform: scaleY(1);
} }
} }
@keyframes pulse { @keyframes pulse {
0%, 100% {
0%,
100% {
opacity: 0.2; opacity: 0.2;
} }
50% { 50% {
opacity: 0.4; opacity: 0.4;
} }
} }
@keyframes borderFadeIn { @keyframes borderFadeIn {
from { from {
opacity: 0; opacity: 0;
transform: scale(0.95); transform: scale(0.95);
} }
to { to {
opacity: 1; opacity: 1;
transform: scale(1); transform: scale(1);
} }
} }
@keyframes borderPulse { @keyframes borderPulse {
0%, 100% {
0%,
100% {
border-color: #fff; border-color: #fff;
box-shadow: 0 0 20px rgba(255, 255, 255, 0.4); box-shadow: 0 0 20px rgba(255, 255, 255, 0.4);
} }
50% { 50% {
border-color: #fff; border-color: #fff;
box-shadow: 0 0 30px rgba(255, 255, 255, 0.6); box-shadow: 0 0 30px rgba(255, 255, 255, 0.6);
} }
} }
@font-face { @font-face {
font-family: "YeogiOttaeJalnan"; font-family: "YeogiOttaeJalnan";
src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_four@1.2/JalnanOTF00.woff") format("woff"); src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_four@1.2/JalnanOTF00.woff") format("woff");
font-weight: normal; font-weight: normal;
font-display: swap; font-display: swap;
} }
.intro { .intro {
background: var(--bg-intro); background: var(--bg-intro);
background-attachment: fixed; background-attachment: fixed;
overflow: auto; overflow: auto;
} }
.intro .container { .intro .container {
position: relative; position: relative;
top: 0; top: 0;
@@ -286,12 +304,18 @@
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
} }
.intro .text-ani { .intro .text-ani {
display: none; display: none;
} }
.intro .text-ani:has(.welcome span.show), .intro .text-ani:has(.update-line span.show), .intro .text-ani:has(.card.show), .intro .text-ani.animating {
.intro .text-ani:has(.welcome span.show),
.intro .text-ani:has(.update-line span.show),
.intro .text-ani:has(.card.show),
.intro .text-ani.animating {
display: block; display: block;
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .text-ani:has(.card.show) { .intro .text-ani:has(.card.show) {
display: flex; display: flex;
@@ -301,83 +325,102 @@
width: 100%; width: 100%;
} }
} }
.intro .text-area { .intro .text-area {
min-height: 160px; min-height: 160px;
margin-bottom: 34px; margin-bottom: 34px;
text-align: center; text-align: center;
} }
.intro .text-area:has(.greeting.hidden, .update-text.hidden) { .intro .text-area:has(.greeting.hidden, .update-text.hidden) {
min-height: 0; min-height: 0;
margin-bottom: 0; margin-bottom: 0;
} }
.intro .greeting { .intro .greeting {
font-size: 36px; font-size: 36px;
font-weight: 300; font-weight: 300;
line-height: 1.2; line-height: 1.2;
} }
@media only screen and (min-width: 1024px) { @media only screen and (min-width: 1024px) {
.intro .greeting { .intro .greeting {
height: 656px; height: 656px;
} }
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .greeting { .intro .greeting {
font-size: 2.8rem; font-size: 2.8rem;
min-height: 15.8rem; min-height: 15.8rem;
} }
.intro .greeting p.welcome > *:nth-child(5) {
.intro .greeting p.welcome>*:nth-child(5) {
display: block; display: block;
line-height: 0; line-height: 0;
} }
} }
.intro .name { .intro .name {
font-weight: 500; font-weight: 500;
} }
.intro .welcome span { .intro .welcome span {
display: inline-block; display: inline-block;
opacity: 0; opacity: 0;
transform: translateY(20px); transform: translateY(20px);
} }
.intro .welcome span.show { .intro .welcome span.show {
animation: fadeInUp 0.4s forwards; animation: fadeInUp 0.4s forwards;
} }
.intro .welcome em { .intro .welcome em {
font-weight: 500; font-weight: 500;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .welcome { .intro .welcome {
margin-top: 2rem; margin-top: 2rem;
} }
} }
.intro .update-text { .intro .update-text {
text-align: center; text-align: center;
} }
.intro .update-line { .intro .update-line {
overflow: hidden; overflow: hidden;
font-size: 36px; font-size: 36px;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .update-line { .intro .update-line {
font-size: 2.8rem; font-size: 2.8rem;
} }
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .update-line:last-child { .intro .update-line:last-child {
margin-top: 2rem; margin-top: 2rem;
} }
} }
.intro .update-line.bold, .intro .update-line.bold,
.intro .update-line em { .intro .update-line em {
font-weight: 500; font-weight: 500;
} }
.intro .update-line > span {
.intro .update-line>span {
display: inline-block; display: inline-block;
opacity: 0; opacity: 0;
transform: translateY(100%); transform: translateY(100%);
} }
.intro .update-line > span.show {
.intro .update-line>span.show {
animation: slideUp 0.6s forwards; animation: slideUp 0.6s forwards;
} }
.intro .cta-text { .intro .cta-text {
position: relative; position: relative;
width: 100vw; width: 100vw;
@@ -387,12 +430,14 @@
line-height: 1.2; line-height: 1.2;
text-align: center; text-align: center;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .cta-text { .intro .cta-text {
font-size: 2.8rem; font-size: 2.8rem;
} }
} }
.intro .cta-text > div {
.intro .cta-text>div {
width: 100vw; width: 100vw;
height: var(--window-inner-height); height: var(--window-inner-height);
display: flex; display: flex;
@@ -400,34 +445,41 @@
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
} }
.intro .cta-text > div:not(.mask) {
.intro .cta-text>div:not(.mask) {
position: relative; position: relative;
z-index: 1; z-index: 1;
cursor: default; cursor: default;
} }
.intro .cta-text > div:not(.mask) .text-section {
.intro .cta-text>div:not(.mask) .text-section {
opacity: 0; opacity: 0;
transform: translateY(20px); transform: translateY(20px);
} }
.intro .cta-text > div:not(.mask) .text-section:has(.show) {
.intro .cta-text>div:not(.mask) .text-section:has(.show) {
background-image: url(../images/intro/promise.svg); background-image: url(../images/intro/promise.svg);
background-position: bottom; background-position: bottom;
background-size: 586px auto; background-size: 586px auto;
background-repeat: no-repeat; background-repeat: no-repeat;
animation: fadeInUp 0.5s forwards; animation: fadeInUp 0.5s forwards;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .cta-text > div:not(.mask) .text-section:has(.show) { .intro .cta-text>div:not(.mask) .text-section:has(.show) {
background-size: 120% auto; background-size: 120% auto;
} }
} }
.intro .cta-text > div:not(.mask) p {
.intro .cta-text>div:not(.mask) p {
opacity: 0; opacity: 0;
transform: translateY(20px); transform: translateY(20px);
} }
.intro .cta-text > div:not(.mask) p.show {
.intro .cta-text>div:not(.mask) p.show {
animation: fadeInUp 0.5s forwards; animation: fadeInUp 0.5s forwards;
} }
.intro .cta-text .text-section { .intro .cta-text .text-section {
height: 260px; height: 260px;
translate: 0 -35%; translate: 0 -35%;
@@ -437,6 +489,7 @@
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .cta-text .text-section { .intro .cta-text .text-section {
width: calc(100% - 32px); width: calc(100% - 32px);
@@ -445,12 +498,15 @@
translate: 0 -40%; translate: 0 -40%;
} }
} }
.intro .cta-text .text-section.show { .intro .cta-text .text-section.show {
animation: opacity 0.5s forwards; animation: opacity 0.5s forwards;
} }
.intro .cta-text em { .intro .cta-text em {
font-weight: 500; font-weight: 500;
} }
.intro .cta-btn { .intro .cta-btn {
position: absolute; position: absolute;
top: 50%; top: 50%;
@@ -472,6 +528,7 @@
transform: translate(-50%, 25%) translateY(50px); transform: translate(-50%, 25%) translateY(50px);
transition: all 0.3s; transition: all 0.3s;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .cta-btn { .intro .cta-btn {
width: calc(100% - 32px); width: calc(100% - 32px);
@@ -480,16 +537,19 @@
font-size: 28px; font-size: 28px;
} }
} }
@media only screen and (min-width: 992px) { @media only screen and (min-width: 992px) {
.intro .cta-btn { .intro .cta-btn {
box-shadow: 0 -4px 4px 0 #e18d36 inset, 4px 4px 12px -4px rgba(220, 196, 172, 0.85); box-shadow: 0 -4px 4px 0 #e18d36 inset, 4px 4px 12px -4px rgba(220, 196, 172, 0.85);
} }
} }
.intro .cta-btn.show { .intro .cta-btn.show {
opacity: 1; opacity: 1;
transform: translate(-50%, 25%) translateY(0); transform: translate(-50%, 25%) translateY(0);
transition: all 0.3s linear; transition: all 0.3s linear;
} }
.intro .cta-btn::after { .intro .cta-btn::after {
content: " "; content: " ";
position: absolute; position: absolute;
@@ -505,12 +565,13 @@
position: absolute; position: absolute;
inset: 0; inset: 0;
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor; -webkit-mask-composite: xor;
mask-composite: exclude; mask-composite: exclude;
pointer-events: none; pointer-events: none;
border-radius: inherit; border-radius: inherit;
} }
.intro .cta-btn .ico-arrow { .intro .cta-btn .ico-arrow {
position: absolute; position: absolute;
top: 50%; top: 50%;
@@ -526,6 +587,7 @@
transform: translateY(-50%); transform: translateY(-50%);
animation: arrow-next 3s infinite ease-in-out; animation: arrow-next 3s infinite ease-in-out;
} }
.intro .mask { .intro .mask {
position: absolute; position: absolute;
top: 0; top: 0;
@@ -554,6 +616,7 @@
transition: mask-size 0.2s linear; transition: mask-size 0.2s linear;
transition: mask-size 0.2s linear, -webkit-mask-size 0.2s linear; transition: mask-size 0.2s linear, -webkit-mask-size 0.2s linear;
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .mask { .intro .mask {
-webkit-mask-image: none; -webkit-mask-image: none;
@@ -561,27 +624,33 @@
clip-path: circle(0% at 50% 50%); clip-path: circle(0% at 50% 50%);
transition: clip-path 3.5s ease-out; transition: clip-path 3.5s ease-out;
} }
.intro .mask.expand { .intro .mask.expand {
clip-path: circle(300% at 50% 50%); clip-path: circle(300% at 50% 50%);
} }
} }
.intro .mask .text-section { .intro .mask .text-section {
background-image: url(../images/intro/promise_b.svg); background-image: url(../images/intro/promise_b.svg);
background-position: bottom; background-position: bottom;
background-size: auto; background-size: auto;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .mask .text-section { .intro .mask .text-section {
background-size: 95% auto; background-size: 95% auto;
} }
} }
.intro .mask .mask-text { .intro .mask .mask-text {
color: #fff; color: #fff;
} }
.intro .mask .mask-text em { .intro .mask .mask-text em {
font-style: normal; font-style: normal;
} }
.intro .content-area { .intro .content-area {
margin-top: 34px; margin-top: 34px;
display: flex; display: flex;
@@ -589,6 +658,7 @@
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .content-area { .intro .content-area {
flex: 1 1 0; flex: 1 1 0;
@@ -597,6 +667,7 @@
align-items: stretch; align-items: stretch;
} }
} }
.intro .card { .intro .card {
opacity: 0; opacity: 0;
transform: translateY(60px); transform: translateY(60px);
@@ -611,12 +682,14 @@
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
} }
@media only screen and (min-width: 992px) { @media only screen and (min-width: 992px) {
.intro .card { .intro .card {
flex: 0 0 calc(50% - 12px); flex: 0 0 calc(50% - 12px);
padding: 60px 32px 48px; padding: 60px 32px 48px;
} }
} }
@media only screen and (min-width: 1200px) { @media only screen and (min-width: 1200px) {
.intro .card { .intro .card {
flex: 1 1 0; flex: 1 1 0;
@@ -624,6 +697,7 @@
padding: 86px 22px 68px; padding: 86px 22px 68px;
} }
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .card { .intro .card {
flex: 1 1 0; flex: 1 1 0;
@@ -640,26 +714,31 @@
border-radius: 12px; border-radius: 12px;
} }
} }
.intro .card.show { .intro .card.show {
opacity: 1; opacity: 1;
transform: translateY(0); transform: translateY(0);
} }
.intro .card-list { .intro .card-list {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
gap: 20px; gap: 20px;
} }
@media only screen and (min-width: 1200px) { @media only screen and (min-width: 1200px) {
.intro .card-list { .intro .card-list {
flex-wrap: nowrap; flex-wrap: nowrap;
} }
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .card-list { .intro .card-list {
gap: 2.4rem; gap: 2.4rem;
} }
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .card-list { .intro .card-list {
flex-direction: column; flex-direction: column;
@@ -671,6 +750,7 @@
align-items: stretch; align-items: stretch;
} }
} }
.intro .card-num { .intro .card-num {
font-family: YeogiOttaeJalnan; font-family: YeogiOttaeJalnan;
font-size: 120px; font-size: 120px;
@@ -682,11 +762,13 @@
-webkit-background-clip: text; -webkit-background-clip: text;
background-clip: text; background-clip: text;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .card-num { .intro .card-num {
font-size: 6rem; font-size: 6rem;
} }
} }
.intro .card-title { .intro .card-title {
margin-top: -46px; margin-top: -46px;
margin-bottom: 42px; margin-bottom: 42px;
@@ -694,30 +776,36 @@
font-weight: 300; font-weight: 300;
line-height: 1.2; line-height: 1.2;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .card-title { .intro .card-title {
font-size: 2.4rem; font-size: 2.4rem;
} }
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .card-title { .intro .card-title {
margin-top: -32px; margin-top: -32px;
margin-bottom: 0; margin-bottom: 0;
} }
} }
.intro .card-desc { .intro .card-desc {
font-size: 24px; font-size: 24px;
} }
@media only screen and (max-width: 1023px) { @media only screen and (max-width: 1023px) {
.intro .card-desc { .intro .card-desc {
font-size: 1.6rem; font-size: 1.6rem;
} }
} }
@media only screen and (max-width: 991px) { @media only screen and (max-width: 991px) {
.intro .card-desc { .intro .card-desc {
display: none; display: none;
} }
} }
.intro .card em { .intro .card em {
font-weight: 700; font-weight: 700;
} }
@@ -745,18 +833,22 @@
gap: 24px; gap: 24px;
transform: translateX(-50%); transform: translateX(-50%);
} }
.scroll-indicator.hidden { .scroll-indicator.hidden {
opacity: 0; opacity: 0;
pointer-events: none; pointer-events: none;
} }
.scroll-indicator.sec2 .bar { .scroll-indicator.sec2 .bar {
height: 60px; height: 60px;
} }
.scroll-indicator span { .scroll-indicator span {
font-size: 16px; font-size: 16px;
color: var(--text-intro-base); color: var(--text-intro-base);
opacity: 0.8; opacity: 0.8;
} }
.scroll-indicator .bar { .scroll-indicator .bar {
width: 2px; width: 2px;
height: 110px; height: 110px;
@@ -764,6 +856,7 @@
background-color: rgba(0, 0, 0, 0.3); background-color: rgba(0, 0, 0, 0.3);
transition: height 0.5s linear; transition: height 0.5s linear;
} }
.scroll-indicator .bar::before { .scroll-indicator .bar::before {
content: " "; content: " ";
display: block; display: block;

View File

@@ -1376,6 +1376,11 @@ class ContentManager {
return CONFIG.IMAGE_PATHS.BASE; return CONFIG.IMAGE_PATHS.BASE;
} }
// type이 file인 경우 YouTube 썸네일 사용 불가 → 기본 이미지 반환
if (chapterInfo.chapter.type === 'file') {
return CONFIG.IMAGE_PATHS.BASE;
}
const firstLesson = chapterInfo.chapter.lessons[0]; const firstLesson = chapterInfo.chapter.lessons[0];
if (!firstLesson.url) { if (!firstLesson.url) {
return CONFIG.IMAGE_PATHS.BASE; return CONFIG.IMAGE_PATHS.BASE;
@@ -2934,7 +2939,7 @@ class PuzzleModalManager {
static _createLearningList(modal, chapter, chapterIndex, modalState) { static _createLearningList(modal, chapter, chapterIndex, modalState) {
try { try {
const domUtils = typeof DOMUtils !== 'undefined' ? DOMUtils : null; const domUtils = typeof DOMUtils !== 'undefined' ? DOMUtils : null;
const eventManager = typeof eventManager !== 'undefined' ? eventManager : null; const _eventManager = typeof eventManager !== 'undefined' ? eventManager : null;
const errorHandler = typeof ErrorHandler !== 'undefined' ? ErrorHandler : null; const errorHandler = typeof ErrorHandler !== 'undefined' ? ErrorHandler : null;
const list = domUtils?.$(".learning-list", modal) || modal.querySelector(".learning-list"); const list = domUtils?.$(".learning-list", modal) || modal.querySelector(".learning-list");
@@ -3040,8 +3045,8 @@ class PuzzleModalManager {
} }
}; };
if (eventManager) { if (_eventManager) {
const listenerId = eventManager.on(link, "click", clickHandler); const listenerId = _eventManager.on(link, "click", clickHandler);
// 리스너 ID를 modal에 저장하여 나중에 정리할 수 있도록 // 리스너 ID를 modal에 저장하여 나중에 정리할 수 있도록
if (!modal._learningListListenerIds) { if (!modal._learningListListenerIds) {
modal._learningListListenerIds = []; modal._learningListListenerIds = [];
@@ -3927,7 +3932,7 @@ function updatePieceGaugeByCompletion(pieceId) {
function initializeOverlay() { function initializeOverlay() {
try { try {
const domUtils = typeof DOMUtils !== 'undefined' ? DOMUtils : null; const domUtils = typeof DOMUtils !== 'undefined' ? DOMUtils : null;
const eventManager = typeof eventManager !== 'undefined' ? eventManager : null; const _eventManager = typeof eventManager !== 'undefined' ? eventManager : null;
const errorHandler = typeof ErrorHandler !== 'undefined' ? ErrorHandler : null; const errorHandler = typeof ErrorHandler !== 'undefined' ? ErrorHandler : null;
const overlay = domUtils?.$("#overlay") || document.getElementById("overlay"); const overlay = domUtils?.$("#overlay") || document.getElementById("overlay");
@@ -3947,8 +3952,8 @@ function initializeOverlay() {
} }
}; };
if (eventManager) { if (_eventManager) {
eventManager.on(overlay, "click", clickHandler); _eventManager.on(overlay, "click", clickHandler);
} else { } else {
overlay.addEventListener("click", clickHandler); overlay.addEventListener("click", clickHandler);
} }

View File

@@ -13,7 +13,7 @@
/> />
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/css/lib/swiper11.min.css" /> <link rel="stylesheet" type="text/css" href="/css/lib/swiper11.min.css" />