app.blade.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <!DOCTYPE html>
  2. <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  6. <meta name="apple-mobile-web-app-title" content="{{ config('meta_application_name') }}"/>
  7. @if($metaViewport = config('meta_viewport'))
  8. <meta name="viewport" content="{{ $metaViewport }}"/>
  9. @else
  10. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  11. @endif
  12. @if($metaRobots = config('meta_robots'))
  13. <meta name="robots" content="{{ $metaRobots }}"/>
  14. @endif
  15. @if($metaAuthor = config('meta_author'))
  16. <meta name="author" content="{{ $metaAuthor }}"/>
  17. @endif
  18. @if($metaKeywords = config('meta_keywords'))
  19. <meta name="keywords" content="{{ $metaKeywords }}"/>
  20. @endif
  21. @if($metaDescription = config('meta_description'))
  22. <meta name="description" content="{{ $metaDescription }}"/>
  23. @endif
  24. {{-- 정규 주소(canonical). ?page= 같은 파라미터가 붙은 주소가 별도 페이지로 색인되는 것을 막는다. --}}
  25. <link rel="canonical" href="{{ url()->current() }}"/>
  26. {!! config('meta_adds_info') !!}
  27. <!-- CSRF Token -->
  28. <meta name="csrf-token" content="{{ csrf_token() }}"/>
  29. <title>{{ config('site_title', config('app.name')) }}</title>
  30. @if($siteFavicon = config('site_favicon'))
  31. <link rel="icon" type="image/x-icon" href="{{ asset($siteFavicon) }}"/>
  32. <link rel="shortcut icon" type="image/x-icon" href="{{ asset($siteFavicon) }}"/>
  33. @endif
  34. @vite(['resources/sass/app.scss', 'resources/js/app.js'])
  35. <link rel="stylesheet" href="{{ asset('css/mobile/layout.css') }}"/>
  36. @stack('styles')
  37. <script>
  38. // 자바스크립트에서 사용하는 전역변수 선언
  39. var BASE_URL = "{{ BASE_URL }}";
  40. var FULL_URL = "{{ FULL_URL }}";
  41. var ADMIN_URL = "{{ ADMIN_URL }}";
  42. var CHARSET = "{{ CHARSET }}";
  43. var DATE = "{{ DATE }}";
  44. var DATETIME = "{{ DATETIME }}";
  45. var IP_ADDRESS = "{{ IP_ADDRESS }}";
  46. var REFERER = "{{ REFERER }}";
  47. var USER_AGENT = "{{ USER_AGENT }}";
  48. var DEVICE = "{{ DEVICE }}";
  49. var PLATFORM = "{{ PLATFORM }}";
  50. var BROWSER = "{{ BROWSER }}";
  51. var IS_USER = {{ IS_USER }};
  52. var IS_ADMIN = {{ IS_ADMIN }};
  53. var IS_FRONT = 1;
  54. var CSRF = "{{ csrf_token() }}";
  55. </script>
  56. <!--[if lt IE 9]>
  57. <script src="{{ asset('js/common/html5shiv.min.js') }}" defer></script>
  58. <script src="{{ asset('js/common/respond.min.js') }}" defer></script>
  59. <script src="{{ asset('js/common/ie8-responsive-file-warning.js') }}" defer></script>
  60. <![endif]-->
  61. <script src="{{ asset('/js/common/common.js') }}" defer></script>
  62. <script src="{{ asset('/js/common/jquery.validate.extension.js') }}" defer></script>
  63. <script src="{{ asset('/js/front.js') }}" defer></script>
  64. <!-- Google tag (gtag.js) -->
  65. <script async src="https://www.googletagmanager.com/gtag/js?id=G-RPBF1M8JNY"></script>
  66. <script>
  67. window.dataLayer = window.dataLayer || [];
  68. function gtag(){dataLayer.push(arguments);}
  69. gtag('js', new Date());
  70. gtag('config', 'G-RPBF1M8JNY');
  71. </script>
  72. </head>
  73. <body id="app">
  74. {{-- 상단 --}}
  75. <header id="header">
  76. <nav class="navbar">
  77. <div class="container-fluid">
  78. <button type="button" class="navbar-toggler" data-bs-toggle="offcanvas" data-bs-target="#navbarMenu" aria-controls="navbarMenu">
  79. <span class="navbar-toggler-icon"></span>
  80. </button>
  81. <a href="/" class="navbar-brand" target="_self">
  82. {{ config('app.name') }}
  83. </a>
  84. <button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbarSearch" aria-controls="navbarSearch" aria-expanded="false" aria-label="Toggle search">
  85. <i class="fa-solid fa-magnifying-glass"></i>
  86. </button>
  87. <div id="navbarSearch" class="collapse navbar-collapse">
  88. <form name="f_search" id="fSearch" role="search" method="get" action="{{ route('recently') }}" accept-charset="UTF-8">
  89. <input type="search" name="search" size="10" class="form-control me-2" placeholder="검색어를 입력해주세요." aria-label="Search"/>
  90. <button type="submit" class="btn btn-outline-success">검색</button>
  91. </form>
  92. </div>
  93. </div>
  94. </nav>
  95. {{-- 왼쪽 메뉴 --}}
  96. <div id="navbarMenu" class="offcanvas offcanvas-start" tabindex="-1" aria-labelledby="navbarMenuLabel">
  97. <div class="offcanvas-header">
  98. <h5 id="navbarMenuLabel" class="offcanvas-title">{{ config('app.name') }}</h5>
  99. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>
  100. </div>
  101. <div class="offcanvas-header gap-2">
  102. @guest
  103. @if (Route::has('login'))
  104. <a href="{{ route('login') }}" class="btn btn-dark btn-sm w-100">{{ __('Login') }}</a>
  105. @endif
  106. @if (Route::has('register'))
  107. <a href="{{ route('register') }}" class="btn btn-dark btn-sm w-100">{{ __('Register') }}</a>
  108. @endif
  109. @else
  110. <div class="dropdown">
  111. <a href="#" id="account" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-bs-offset="-5,1">
  112. {{ $user->nickname ?: $user->name }}님 <span class="caret"></span>
  113. </a>
  114. <div class="dropdown-menu dropdown-menu-right">
  115. @admin
  116. <a href="{{ route('admin.index') }}" class="dropdown-item" target="_blank">관리자</a>
  117. @endadmin
  118. <a href="{{ route('account.profile') }}" class="dropdown-item">내 정보</a>
  119. <div class="dropdown-divider"></div>
  120. <a href="{{ route('logout') }}" class="dropdown-item">{{ __('Logout') }}</a>
  121. <form id="logoutForm" class="hide" action="{{ route('logout') }}" method="POST">@csrf</form>
  122. </div>
  123. </div>
  124. @endguest
  125. </div>
  126. <div class="offcanvas-body">
  127. <nav id="nav">
  128. <div class="nav flex-column mb-auto">
  129. <a href="/recently" class="nav-link">최신글 보기</a>
  130. @if($topMenu)
  131. @php
  132. $buildSubMenu = function ($categories) use (&$buildSubMenu, $subMenu) {
  133. $html = '<ul class="dropdown-menu">';
  134. foreach ($categories as $cate) {
  135. $meta = $subMenu[$cate->id];
  136. $hasClass = "";
  137. if($meta->hasChildren) {
  138. $hasClass = 'class="has-children"';
  139. }
  140. $html .= sprintf('<li %s><a href="%s" class="dropdown-item" target="%s" %s>%s <small>($d)</small></a>', $hasClass, $meta->url, $meta->target, $meta->custom, $meta->name, $meta->postCount);
  141. $html .= $buildSubMenu($cate->children);
  142. $html .= '</li>';
  143. }
  144. $html .= '</ul>';
  145. return $html;
  146. };
  147. @endphp
  148. @foreach($topMenu[0] as $row)
  149. <div class="dropdown">
  150. <a href="{{ $row->url }}" target="{{ $row->target }}" {{ $row->custom }} class="nav-link @if(!$row->isLeaf) dropdown-toggle @endif"
  151. @if(!$row->isLeaf) data-bs-toggle="dropdown" role="button" aria-expanded="false" data-bs-offset="0,-25" @endif>
  152. {{ $row->name }} @if($row->board_id) <small>({{ $row->postCount }})</small> @endif
  153. </a>
  154. @if($row->hasChildren)
  155. <ul class="dropdown-menu">
  156. @foreach($row->children as $mn)
  157. @php $meta = $subMenu[$mn->id]; @endphp
  158. <li @if($meta->hasChildren) class="has-children" @endif>
  159. <a href="{{ $meta->url }}" class="dropdown-item" target="{{ $meta->target }}" {{ $meta->custom }}>{{ $meta->name }}({{ $meta->postCount }})</a>
  160. @if($meta->hasChildren)
  161. @php echo $buildSubMenu($mn->children) @endphp
  162. @endif
  163. </li>
  164. @endforeach
  165. </ul>
  166. @endif
  167. </div>
  168. @endforeach
  169. @endif
  170. <a href="{{ route('tag.index') }}" class="nav-link @if($isTab) active @endif">
  171. 태그
  172. </a>
  173. </div>
  174. </nav>
  175. <!-- 쿠팡 광고 -->
  176. <div class="ad-coupang">
  177. <iframe src="https://coupa.ng/cdvhzK" width="100%" height="75" frameborder="0" scrolling="no" referrerpolicy="unsafe-url"></iframe>
  178. <iframe src="https://ads-partners.coupang.com/widgets.html?id=637907&template=carousel&trackingCode=AF0305179&subId=blog202302&width=100&height=140&tsource=" width="100%" height="140" frameborder="0" scrolling="no" referrerpolicy="unsafe-url" browsingtopics></iframe>
  179. <small>
  180. 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
  181. </small>
  182. </div>
  183. <hr/>
  184. <table>
  185. <caption>방문자 수</caption>
  186. <tr>
  187. <th>오늘</th>
  188. <td>{{ $visitorTodayCount }}</td>
  189. </tr>
  190. <tr>
  191. <th>어제</th>
  192. <td>{{ $visitorYesterdayCount }}</td>
  193. </tr>
  194. <tr>
  195. <th>누적</th>
  196. <td>{{ $visitorTotalCount }}</td>
  197. </tr>
  198. </table>
  199. <address>&copy; 2022~{{ date('Y') }} {{ config('company_name') }}. All rights reserved.</address>
  200. </div>
  201. </div>
  202. </header>
  203. <main id="main">
  204. @yield('content')
  205. </main>
  206. {{-- 하단 --}}
  207. <footer id="footer">
  208. <div class="container-fluid">
  209. <div class="row text-center align-items-center">
  210. <div class="col-sm-12 col-lg-9 col-md-9 p-4 pb-0 p-sm-4 pb-sm-0 p-md-4 p-lg-4 text-md-start">
  211. <ul>
  212. {{-- 개인정보처리방침 / 이메일주소무단수집거부 임시 비활성화
  213. <li>
  214. <a href="{{ route('document', 'privacy') }}">개인정보처리방침</a>
  215. </li>
  216. <li class="divider"></li>
  217. <li>
  218. <a href="{{ route('document', 'refusal') }}">이메일주소무단수집거부</a>
  219. </li>
  220. <li class="divider"></li>
  221. --}}
  222. <li>
  223. <a href="{{ route('document', 'proposal') }}">제휴 문의</a>
  224. </li>
  225. </ul>
  226. </div>
  227. <div class="col-sm-12 col-lg-3 col-md-3 p-4 p-md-4 text-md-end">
  228. <a href="https://ccl.cckorea.org/" title="https://ccl.cckorea.org/" target="_blank">
  229. <img src="/images/cc-license.png" alt="BY NC ND EU"/>
  230. </a>
  231. </div>
  232. </div>
  233. <div class="row text-center text-md-start">
  234. <div class="col ps-4 pe-4 pb-4">
  235. <address>
  236. &copy; 2022~{{ date('Y') }} {{ config('company_name') }}. All rights reserved.
  237. </address>
  238. </div>
  239. </div>
  240. </div>
  241. </footer>
  242. @stack('scripts')
  243. @include('component.loading')
  244. @include('component.popup')
  245. @include('component.alert')
  246. </body>
  247. </html>