_layout.blade.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <!DOCTYPE html>
  2. <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="description"
  8. content="御宅云加速器,采用开源加速引擎,顶级IDC集群,全线高端刀片服务器!为网游用户解决延迟、掉线、卡机等问题,让你游戏更爽快!告别高延迟!外服加速72小时免费试用。海外直连专线,外服游戏加速效果业界顶尖!支持加速绝地求生、H1Z1、GTA5、CS:GO,以及LOL英雄联盟、DNF地下城与勇士、CF穿越火线、CSGO等上百款热门中外网游。">
  9. <meta name="keywords" content="御宅云 绅士世界 加速器 网游加速器 外服加速器 超快感 远征军 海外游戏加速 steam加速 免费加速器 游戏加速 H1Z1加速器 绝地求生加速器 大逃杀加速 绝地加速 GTA加速 CSGO加速">
  10. <meta name="author" content="绅士世界御宅云">
  11. <meta name="copyright" content="御宅云">
  12. <title>@yield('title')</title>
  13. <link href="{{ asset('favicon.ico') }}" rel="shortcut icon apple-touch-icon">
  14. <!-- 样式表/Stylesheets -->
  15. <link href="/assets/bundle/app.min.css" rel="stylesheet">
  16. <link href="https://cdn.jsdelivr.net/npm/flag-icons@7/css/flag-icons.min.css" rel="stylesheet">
  17. @yield('layout_css')
  18. <!-- 字体/Fonts -->
  19. <link href="/assets/global/fonts/web-icons/web-icons.min.css" rel="stylesheet">
  20. <link href="https://fonts.loli.net" rel="preconnect">
  21. <link href="https://gstatic.loli.net" rel="preconnect" crossorigin>
  22. <link href="https://fonts.loli.net/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
  23. rel="stylesheet">
  24. <!-- Scripts -->
  25. <script src="/assets/global/vendor/breakpoints/breakpoints.min.js"></script>
  26. <script>
  27. Breakpoints();
  28. </script>
  29. @if (config('theme.skin'))
  30. <link id="skinStyle" href="/assets/css/skins/{{ config('theme.skin') }}.min.css" rel="stylesheet">
  31. @endif
  32. </head>
  33. <body class="animsition @yield('body_class')">
  34. @yield('layout_content')
  35. <!-- 核心/Core -->
  36. <script src="/assets/global/vendor/babel-external-helpers/babel-external-helpers.js"></script>
  37. <script src="/assets/global/vendor/jquery/jquery.min.js"></script>
  38. <script src="/assets/global/vendor/popper-js/umd/popper.min.js"></script>
  39. <script src="/assets/global/vendor/bootstrap/bootstrap.min.js"></script>
  40. <script src="/assets/global/vendor/animsition/animsition.min.js"></script>
  41. <script src="/assets/global/vendor/mousewheel/jquery.mousewheel.min.js"></script>
  42. <script src="/assets/global/vendor/asscrollbar/jquery-asScrollbar.min.js"></script>
  43. <script src="/assets/global/vendor/asscrollable/jquery-asScrollable.min.js"></script>
  44. <script src="/assets/global/vendor/ashoverscroll/jquery-asHoverScroll.min.js"></script>
  45. <!-- 插件/Plugins -->
  46. <script src="/assets/global/vendor/screenfull/screenfull.min.js"></script>
  47. <script src="/assets/global/vendor/slidepanel/jquery-slidePanel.min.js"></script>
  48. <!-- 脚本/Scripts -->
  49. <script src="/assets/global/js/Component.js"></script>
  50. <script src="/assets/global/js/Plugin.js"></script>
  51. <script src="/assets/global/js/Base.js"></script>
  52. <script src="/assets/global/js/Config.js"></script>
  53. <script src="/assets/js/Section/Menubar.js"></script>
  54. <script src="/assets/js/Section/Sidebar.js"></script>
  55. <script src="/assets/js/Section/PageAside.js"></script>
  56. <script src="/assets/js/Plugin/menu.js"></script>
  57. <!-- 设置/Config -->
  58. <script src="/assets/global/js/config/colors.js"></script>
  59. <script>
  60. Config.set("assets", "/assets");
  61. </script>
  62. <!-- 页面/Page -->
  63. <script src="/assets/js/Site.js"></script>
  64. <script src="/assets/global/js/Plugin/asscrollable.js"></script>
  65. <script src="/assets/global/js/Plugin/slidepanel.js"></script>
  66. <script>
  67. // Create and append link element to load the font CSS asynchronously
  68. const link = document.createElement("link");
  69. link.rel = 'stylesheet';
  70. link.href = 'https://fonts.loli.net/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap';
  71. document.head.appendChild(link);
  72. // Apply font to body after font has loaded
  73. link.onload = function() {
  74. document.body.style.fontFamily = 'Roboto, system-ui, sans-serif';
  75. };
  76. (function(document, window, $) {
  77. "use strict";
  78. const Site = window.Site;
  79. $(document).ready(function() {
  80. Site.run();
  81. });
  82. })(document, window, jQuery);
  83. @auth
  84. document.addEventListener("DOMContentLoaded", async function() {
  85. const avatarElements = Array.from(document.querySelectorAll("img[data-uid]"));
  86. let avatarData = JSON.parse(localStorage.getItem("avatarData")) || {};
  87. const fetchPromises = {};
  88. // Group img elements by uid
  89. const uidToElementsMap = groupElementsByUid(avatarElements);
  90. for (const [uid, elements] of Object.entries(uidToElementsMap)) {
  91. if (avatarData[uid]) {
  92. updateElementsSrc(elements, avatarData[uid]);
  93. } else if (!fetchPromises[uid]) {
  94. const {
  95. username,
  96. qq
  97. } = elements[0].dataset;
  98. fetchPromises[uid] = fetchAndCacheAvatar(uid, username, qq).then(imgUrl => {
  99. avatarData[uid] = imgUrl;
  100. localStorage.setItem("avatarData", JSON.stringify(avatarData));
  101. updateElementsSrc(elements, imgUrl);
  102. }).catch(error => {
  103. console.error(`Error fetching avatar for uid ${uid}:`, error);
  104. updateElementsSrc(elements, ""); // Or set to a default URL
  105. });
  106. }
  107. }
  108. });
  109. function groupElementsByUid(elements) {
  110. return elements.reduce((acc, el) => {
  111. const uid = el.dataset.uid;
  112. if (!acc[uid]) acc[uid] = [];
  113. acc[uid].push(el);
  114. return acc;
  115. }, {});
  116. }
  117. function updateElementsSrc(elements, src) {
  118. elements.forEach(el => el.src = src);
  119. }
  120. async function fetchAndCacheAvatar(uid, username, qq) {
  121. const response = await fetch(`{{ route('getAvatar') }}?username=${username}&qq=${qq}`);
  122. const url = await response.json();
  123. if (/@qq\.com/.test(username) || qq) {
  124. return url;
  125. }
  126. const imgResponse = await fetch(url);
  127. if (url === imgResponse.url) {
  128. const type = imgResponse.headers.get("Content-Type");
  129. const imgBlob = await imgResponse.blob();
  130. const base64String = await blobToBase64(imgBlob);
  131. return `data:${type};base64,${base64String}`;
  132. } else {
  133. return imgResponse.url;
  134. }
  135. }
  136. async function blobToBase64(blob) {
  137. return new Promise((resolve, reject) => {
  138. const reader = new FileReader();
  139. reader.onload = () => resolve(reader.result.split(",")[1]);
  140. reader.onerror = () => reject("Error converting blob to base64");
  141. reader.readAsDataURL(blob);
  142. });
  143. }
  144. @endauth
  145. </script>
  146. @yield('layout_javascript')
  147. </body>
  148. </html>