Public Source Viewer

비나래아카이브 개발자 포털

실제 서비스 구조를 살펴볼 수 있는 공개용 코드 뷰어입니다. 인증, 세션, 외부 연동, 토큰, 관리자 식별 등 보안상 민감한 구현은 파일 단위 또는 줄 단위로 검열됩니다.

Redacted View
view/hinana/archiveSearch.ejs
공개 가능
1 <!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>아카이브 통합 검색</title>
2 <link rel="stylesheet" href="/vendors/bootstrap/css/bootstrap.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css"><link rel="stylesheet" href="/css/theme.css">
3 <style>
4 body{background:var(--bg-main);color:var(--text-primary)}.shell{max-width:1180px;margin:auto;padding:22px}.head{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-color);padding-bottom:16px}.head h1{font-size:1.5rem;font-weight:900;margin:0}.head a{color:var(--text-primary)}
5 .search{display:grid;grid-template-columns:1fr 190px auto;gap:8px;margin:22px 0}.search input,.search select{padding:11px;border:1px solid var(--border-color);background:var(--bg-secondary);color:var(--text-primary);border-radius:5px}.search button{border:0;background:var(--accent-color);color:#fff;font-weight:800;padding:0 20px;border-radius:5px}
6 .summary{font-size:.82rem;color:var(--text-secondary);margin-bottom:10px}.results{border-top:1px solid var(--border-color)}.result{display:grid;grid-template-columns:145px 1fr auto;gap:18px;padding:17px 4px;border-bottom:1px solid var(--border-color);align-items:start}.type{font-size:.72rem;font-weight:850;text-transform:uppercase;color:var(--accent-color)}.result h2{font-size:1rem;margin:0 0 6px;font-weight:850}.result p{font-size:.84rem;color:var(--text-secondary);margin:0;line-height:1.55}.result a{color:var(--text-primary);text-decoration:none}.date{font-size:.72rem;color:var(--text-secondary);white-space:nowrap}.lock{margin-left:5px}.empty{padding:60px 0;text-align:center;color:var(--text-secondary)}
7 @media(max-width:700px){.search{grid-template-columns:1fr}.search button{padding:11px}.result{grid-template-columns:1fr;gap:5px}.date{grid-row:1;justify-self:end}.type{grid-row:1}.result>div:nth-child(2){grid-column:1/-1}}
8 [SECURITY REDACTED] 민감한 설정/인증/토큰 관련 코드입니다.
9 <form class="search" method="GET"><input name="q" value="<%= query %>" placeholder="제목, 본문, 일본어, 한국어 검색"><select name="type"><option value="">모든 자료</option><% [['blog','블로그'],['japanese','일본어 라운지'],['ai-view','공개 AI 원문'],['ai-note','AI 노트'],['personal-note','개인 노트'],['voicepeak','Voicepeak']].forEach(option=>{ %><option value="<%= option[0] %>" <%= type===option[0]?'selected':'' %>><%= option[1] %></option><% }) %></select><button><i class="bi bi-search"></i> 검색</button></form>
10 <div class="summary"><%= query ? '검색 결과' : '최근 자료' %> <strong><%= results.length %></strong>건 · 개인 자료는 소유자에게만 표시됩니다.</div><section class="results"><% if(!results.length){ %><div class="empty">조건에 맞는 자료가 없습니다.</div><% } %><% results.forEach(item=>{ %><article class="result"><div class="type"><%= item.typeLabel %><% if(item.restricted){ %><i class="bi bi-lock-fill lock" title="비공개 자료"></i><% } %></div><div><h2><a href="<%= item.url %>"><%= item.title %></a></h2><p><%= item.excerpt %></p></div><time class="date"><%= item.date && typeof fmtDate==='function'?fmtDate(item.date,true):'' %></time></article><% }) %></section></main></body></html>
11