<% var admTitle = typeof adminPageTitle !== 'undefined' ? adminPageTitle : '학습센터 관리'; %> <%= admTitle %> - XAVIS <% if (typeof filters === 'undefined') { filters = { q: '', type: 'all', tag: '' }; } %> <% if (typeof availableTags === 'undefined') { availableTags = []; } %> <% if (typeof pagination === 'undefined') { pagination = { page: 1, totalPages: 1, totalCount: 0, hasPrev: false, hasNext: false, prevQuery: '', nextQuery: '', pages: [] }; } %> <% if (typeof adminRequested === 'undefined') { adminRequested = false; } %> <% if (typeof adminMode === 'undefined') { adminMode = false; } %> <% if (typeof tokenRaw === 'undefined') { tokenRaw = ''; } %> <% if (typeof returnQuery === 'undefined') { returnQuery = ''; } %> <% if (typeof retryQueued === 'undefined') { retryQueued = 0; } %> <% if (typeof eventsCleared === 'undefined') { eventsCleared = false; } %> <% if (typeof lectures === 'undefined') { lectures = []; } %> <% if (typeof thumbnailQueueInfo === 'undefined') { thumbnailQueueInfo = { pending: 0, working: false, maxRetry: 2 }; } %> <% if (typeof thumbnailStatusSummary === 'undefined') { thumbnailStatusSummary = { ready: 0, processing: 0, failed: 0, pending: 0 }; } %> <% if (typeof recentEvents === 'undefined') { recentEvents = []; } %> <% if (typeof failureReasons === 'undefined') { failureReasons = []; } %> <% var adminBasePath = typeof adminBasePath !== 'undefined' ? adminBasePath : '/admin'; %> <% var viewerBasePath = typeof viewerBasePath !== 'undefined' ? viewerBasePath : '/learning'; %> <% var navMenu = typeof navActiveMenu !== 'undefined' ? navActiveMenu : 'learning'; %>
<%- include('partials/nav', { activeMenu: navMenu, adminMode: typeof adminMode !== 'undefined' ? adminMode : false }) %>

<%= admTitle %>

목록 보기

관리자 모드

<% if (adminMode) { %> 활성 비활성화 <% } else { %> 비활성
<% } %>
<% if (retryQueued > 0) { %>

실패 건 재시도 <%= retryQueued %>건이 큐에 등록되었습니다.

<% } %> <% if (adminMode) { %>
큐: <%= thumbnailQueueInfo.pending %> 워커: <%= thumbnailQueueInfo.working ? "작동중" : "대기" %> 실패 재시도 최대: <%= thumbnailQueueInfo.maxRetry %>
PPT 썸네일 - 준비완료 <%= thumbnailStatusSummary.ready %> 처리중 <%= thumbnailStatusSummary.processing %> 대기 <%= thumbnailStatusSummary.pending %> 실패 <%= thumbnailStatusSummary.failed %>
<% } else { %> <% if (adminRequested) { %>

입력한 토큰이 올바르지 않습니다. 다시 확인해주세요.

<% } %>

삭제·썸네일 관리는 관리자 토큰을 입력한 뒤 활성화를 눌러주세요.

<% } %>
>

유튜브 강의 등록

PDF/PowerPoint 강의 등록

동영상 파일 등록

MP4·WebM·MOV 파일을 서버에 저장한 뒤 브라우저에서 재생합니다. (용량 제한은 서버 설정 LECTURE_VIDEO_MAX_MB, 기본 500MB)

웹 링크 강의 등록

외부 사이트(http/https)를 카드로 등록합니다. (유튜브는 위 «유튜브 강의 등록»을 사용하세요.)

등록된 강의

총 <%= pagination.totalCount %>건
<% if (!adminMode && lectures.length > 0) { %>

수정·삭제를 하려면 위에서 관리자 토큰을 입력하고 관리자 활성화를 눌러주세요.

<% } %>
<% if (!lectures.length) { %>

등록된 항목이 없습니다.

<% } else { %>
<% lectures.forEach((lecture) => { %>
<% if (adminMode) { %>
수정
<% } %> <% var _externalUrl = (lecture.type === "link" || lecture.type === "news") && (lecture.newsUrl || "").trim(); %> <% if (_externalUrl) { %> <% } else { %> <% } %>
<% if (lecture.type === "ppt") { %> <% if (lecture.thumbnailUrl) { %> <%= lecture.title %> 썸네일 <% } else { %> 썸네일 <%= lecture.thumbnailStatus || "pending" %> <% } %> PPT <% if (lecture.previewTitle && lecture.previewTitle !== "제목 없음") { %><%= lecture.previewTitle %><% } %> <% } else if (lecture.type === "news") { %> <% if (lecture.thumbnailUrl) { %> <% } %> 뉴스 <% if (!lecture.thumbnailUrl) { %>외부 링크<% } %> <% } else if (lecture.type === "link") { %> <% if (lecture.thumbnailUrl) { %> <% } %> 웹 링크 <% if (!lecture.thumbnailUrl) { %>외부 페이지<% } %> <% } else if (lecture.type === "video") { %> 동영상 파일 업로드 영상 <% } else { %> <% const ytThumb = typeof getYoutubeThumbnailUrl === 'function' ? getYoutubeThumbnailUrl(lecture.youtubeUrl) : null; %> <% if (ytThumb) { %> <%= lecture.title %> 썸네일 <% } %> YouTube 영상 강의 <% } %>
<% if (lecture.type === "youtube") { %>YouTube<% } else if (lecture.type === "news") { %>뉴스<% } else if (lecture.type === "link") { %>링크<% } else if (lecture.type === "video") { %>동영상<% } else { %>PPT<% } %>

<%= lecture.title %>

<%= lecture.description || "" %>

<% (lecture.tags || []).forEach((t) => { %>#<%= t %><% }) %>
<%= new Date(lecture.createdAt).toLocaleString("ko-KR") %>
<% if (adminMode && lecture.type === "ppt") { %>
"><%= lecture.thumbnailStatus || "pending" %> <% if (lecture.thumbnailError) { %><%= lecture.thumbnailError %><% } %>
<% } %>
<% }) %>
<% if (pagination.totalPages > 1) { %> <% } %> <% } %>
<% if (adminMode) { %>

썸네일 로그

<% if (eventsCleared) { %>

썸네일 이벤트 로그가 초기화되었습니다.

<% } %>

이벤트 로그 페이지 열기

실패 원인 TOP

<% if (!failureReasons.length) { %>

최근 실패 원인이 없습니다.

<% } else { %>
    <% failureReasons.slice(0, 5).forEach((item) => { %>
  • <%= item.count %>회 <%= item.reason %>
  • <% }) %>
<% } %>

최근 썸네일 이벤트

<% if (!recentEvents.length) { %>

이벤트 로그가 없습니다.

<% } else { %>
    <% recentEvents.forEach((evt) => { %>
  • <%= evt.type %> <%= evt.lectureTitle || evt.lectureId %> <%= new Date(evt.at).toLocaleString("ko-KR") %>
  • <% }) %>
<% } %>
<% } %>