index.blade.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <!-- Required meta tags -->
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  7. {{-- <META http-equiv="refresh" content="1">--}}
  8. <title>{{env('APP_ENV').' '.__('auto.管理控制台')}}</title>
  9. <!-- plugins:css -->
  10. <link rel="stylesheet" href="/assets/vendors/iconfonts/mdi/css/materialdesignicons.min.css">
  11. <link rel="stylesheet" href="/assets/vendors/css/vendor.bundle.base.css">
  12. <!-- endinject -->
  13. <!-- inject:css -->
  14. <link rel="stylesheet" href="/assets/css/style.css">
  15. <!-- endinject -->
  16. <link rel="shortcut icon" href="/assets/images/favicon.png" />
  17. <style>
  18. /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
  19. ::-webkit-scrollbar
  20. {
  21. width: 0px;
  22. height: 0px;
  23. background-color: #F5F5F5;
  24. }
  25. .sidebar .nav .nav-item.active > .nav-link .menu-title {
  26. color: #343a40;
  27. font-family: "ubuntu-medium", sans-serif;
  28. }
  29. .sidebar .nav .nav-item.active > .nav-link i {
  30. color: #bba8bff5;
  31. }
  32. .sidebar .nav.sub-menu .nav-item .nav-link.active {
  33. color: #343a40;
  34. background: transparent;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <div class="container-scroller">
  40. <!-- partial:partials/_navbar.html -->
  41. <nav class="navbar default-layout-navbar col-lg-12 col-12 p-0 fixed-top d-flex flex-row">
  42. <div class="text-center navbar-brand-wrapper d-flex align-items-center justify-content-center">
  43. <button class="navbar-toggler navbar-toggler-right d-lg-none align-self-center" type="button" data-toggle="offcanvas">
  44. <span class="mdi mdi-menu"></span>
  45. </button>
  46. <a class="navbar-brand brand-logo" href="/admin/bx_nb">
  47. {{-- <img src="/uploads/config/20181107/5be269ef937d1.png" alt="logo"/>--}}
  48. </a>
  49. <a class="navbar-brand brand-logo-mini" href="/admin/bx_nb"><img src="/assets/images/logo-mini.svg" alt="logo"/></a>
  50. </div>
  51. <div class="navbar-menu-wrapper d-flex align-items-stretch">
  52. <div class="search-field d-none d-md-block">
  53. </div>
  54. <ul class="navbar-nav navbar-nav-right">
  55. <li class="nav-item nav-profile dropdown">
  56. <a class="nav-link dropdown-toggle" id="profileDropdown" href="#" data-toggle="dropdown" aria-expanded="false">
  57. {{-- <div class="nav-profile-img">--}}
  58. {{-- <img src="{{ session('admin')->avatar }}" alt="image">--}}
  59. {{-- <span class="availability-status online"></span>--}}
  60. {{-- </div>--}}
  61. {{-- <div class="nav-profile-text">--}}
  62. {{-- <p class="mb-1 text-black">{{ session('admin')->account }}</p>--}}
  63. {{-- </div>--}}
  64. </a>
  65. <div class="dropdown-menu navbar-dropdown" aria-labelledby="profileDropdown">
  66. <a class="dropdown-item" onclick="editInfo({{ session('admin')->id }})" href="javascript:;">
  67. <i class="mdi mdi-border-color mr-2 text-success"></i>
  68. {{__('auto.修改信息')}}}
  69. </a>
  70. <div class="dropdown-divider"></div>
  71. <a class="dropdown-item" href="/logout">
  72. <i class="mdi mdi-logout mr-2 text-primary"></i>
  73. {{__('auto.退出登录')}}
  74. </a>
  75. </div>
  76. </li>
  77. <li class="nav-item d-none d-lg-block full-screen-link">
  78. <a class="nav-link">
  79. <i class="mdi mdi-fullscreen" id="fullscreen-button"></i>
  80. </a>
  81. </li>
  82. <li class="nav-item dropdown">
  83. <a class="nav-link count-indicator dropdown-toggle" id="messageDropdown" href="/admin/complaint/opinion" data-toggle="dropdown" aria-expanded="false">
  84. <i class="mdi mdi-email-outline"></i>
  85. <div id="add_text" style="color: red;font-size: 20px;font-family: 'Microsoft YaHei';">
  86. </div>
  87. </a>
  88. </li>
  89. <li class="nav-item dropdown">
  90. <a class="nav-link count-indicator dropdown-toggle" id="notificationDropdown" href="#" data-toggle="dropdown">
  91. <i class="mdi mdi-bell-outline"></i>
  92. <div id="xitong_text" style="color: red;font-size: 20px;font-family: 'Microsoft YaHei';">
  93. </div>
  94. </a>
  95. </li>
  96. </ul>
  97. </div>
  98. </nav>
  99. <!-- partial -->
  100. <div class="container-fluid page-body-wrapper">
  101. <!-- partial:partials/_sidebar.html -->
  102. <nav class="sidebar sidebar-offcanvas" id="sidebar" style="overflow:auto;max-height: calc(100vh - 70px);width:{{session('admin')->locale=="zh_CN"?"230px":"250px"}}">
  103. <ul class="nav">
  104. {{-- <li class="nav-item nav-profile">--}}
  105. {{-- <a href="#" class="nav-link">--}}
  106. {{-- <div class="nav-profile-image">--}}
  107. {{-- <img src="{{ session('admin')->avatar }}" alt="profile">--}}
  108. {{-- <span class="login-status online"></span>--}}
  109. {{-- </div>--}}
  110. {{-- <div class="nav-profile-text d-flex flex-column">--}}
  111. {{-- <span class="font-weight-bold mb-2">{{ session('admin')->account }}</span>--}}
  112. {{-- <span class="text-secondary text-small">{{ session('admin')->nickname }}</span>--}}
  113. {{-- </div>--}}
  114. {{-- <i class="mdi mdi-bookmark-check text-success nav-profile-badge"></i>--}}
  115. {{-- </a>--}}
  116. {{-- </li>--}}
  117. <li class="nav-item">
  118. <a class="nav-link" href="{{ url('console') }}" data-url="{{ url('console') }}" target="main">
  119. <span class="menu-title">@lang('menu.游戏概况')</span>
  120. <i class="mdi mdi-home menu-icon"></i>
  121. </a>
  122. </li>
  123. @foreach($menu as $k=>$v)
  124. @if($v->hasChild)
  125. <li class="nav-item">
  126. <a class="nav-link" data-toggle="collapse" href="#system-pages-{{$v->id}}" aria-expanded="false" aria-controls="general-pages">
  127. <span class="menu-title">{{ $v->name }}</span>
  128. <i class="menu-arrow"></i>
  129. <i class="{{ $v->icon }} menu-icon"></i>
  130. </a>
  131. <div class="collapse" id="system-pages-{{$v->id}}">
  132. <ul class="nav flex-column sub-menu">
  133. @foreach($v->children as $key=>$val)
  134. <li class="nav-item"> <a class="nav-link" target="main" data-url="{{ $val->url }}" href="{{ $val->url }}">{{ $val->name }}</a></li>
  135. @endforeach
  136. </ul>
  137. </div>
  138. </li>
  139. @else
  140. <li class="nav-item">
  141. <a class="nav-link" target="main" data-url="{{ $v->url }}" href="{{ $v->url }}">
  142. <span class="menu-title">{{ $v->name }}</span>
  143. <i class="{{ $v->icon }} menu-icon"></i>
  144. </a>
  145. </li>
  146. @endif
  147. @endforeach
  148. @if(session('admin')->roles[0]->id == 1)
  149. <li class="nav-item">
  150. <a
  151. class="nav-link"
  152. data-toggle="collapse"
  153. href="#system-pages"
  154. aria-expanded="false"
  155. aria-controls="general-pages"
  156. >
  157. <span class="menu-title">{{__('auto.系统设置')}}</span>
  158. <i class="menu-arrow"></i>
  159. <i class="mdi mdi-settings menu-icon"></i>
  160. </a>
  161. <div class="collapse" id="system-pages">
  162. <ul class="nav flex-column sub-menu">
  163. @if (hidden() != 'general_administrator')
  164. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/menu/list">菜单</a></li>
  165. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/permission/list">权限</a></li>
  166. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/role/list">角色</a></li>
  167. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/administrator/list">管理员</a></li>
  168. @endif
  169. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/burying_point/weight">埋点权重配置</a></li>
  170. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/IpWhiteList/list">IP白名单管理</a></li>
  171. <li class="nav-item"> <a class="nav-link" target="main" href="/admin/login_ip/list">后台账号登录管理IP管理</a></li>
  172. </ul>
  173. </div>
  174. </li>
  175. @endif
  176. {{--<li class="nav-item sidebar-actions">--}}
  177. {{--<span class="nav-link">--}}
  178. {{--<div class="border-bottom">--}}
  179. {{--<h6 class="font-weight-normal mb-3">Projects</h6> --}}
  180. {{--</div>--}}
  181. {{--<button class="btn btn-block btn-lg btn-gradient-primary mt-4">+ Add a project</button>--}}
  182. {{--<div class="mt-4">--}}
  183. {{--<div class="border-bottom">--}}
  184. {{--<p class="text-secondary">Categories</p> --}}
  185. {{--</div>--}}
  186. {{--<ul class="gradient-bullet-list mt-4">--}}
  187. {{--<li>Free</li>--}}
  188. {{--<li>Pro</li>--}}
  189. {{--</ul>--}}
  190. {{--</div>--}}
  191. {{--</span>--}}
  192. {{--</li>--}}
  193. </ul>
  194. </nav>
  195. <iframe id="mainiframe" name="main" width="100%" src="{{ url('console') }}" frameborder="0" scrolling="auto" marginheight="0" marginwidth="0"></iframe>
  196. <!-- main-panel ends -->
  197. </div>
  198. <!-- page-body-wrapper ends -->
  199. </div>
  200. <!-- container-scroller -->
  201. <script src="/assets/js/jquery-3.0.0.min.js"></script>
  202. <script src="/assets/layer/layer.js"></script>
  203. <script>
  204. var ws = {};//new WebSocket('ws://8.129.90.91:9500') // 内网
  205. // var ws = new WebSocket('ws://65.1.231.63:9500') // 外网
  206. var message_num = 0
  207. var withdrawal_num = 0
  208. ws.onopen = function () {
  209. // Web Socket 已连接上,使用 send() 方法发送数据
  210. var data = '{"type":"get_count"}'
  211. ws.send(data)
  212. };
  213. ws.onmessage = function (evt) {
  214. var received_msg = evt.data;
  215. if (received_msg == ''){
  216. return;
  217. }
  218. received_msg = JSON.parse(received_msg)
  219. var type = received_msg.type
  220. switch (type) {
  221. case 'ping':
  222. ws.send('pong')
  223. break;
  224. case 'back_count':
  225. var message_count = received_msg.message_count
  226. var withdrawal_count = received_msg.withdrawal_count
  227. if (message_count > 0){
  228. if (message_num != message_count){
  229. playSound()
  230. message_num = message_count
  231. }
  232. $("#add_text").html('<span class="count-symbol bg-warning">&nbsp;&nbsp;'+message_count+'&nbsp;&nbsp;</span>')
  233. }else {
  234. $("#add_text").html('')
  235. }
  236. if (withdrawal_count > 0){
  237. if (withdrawal_num != message_count){
  238. withdrawal_num = withdrawal_count
  239. playSound()
  240. }
  241. $("#xitong_text").html('<span class="count-symbol bg-danger">&nbsp;&nbsp;'+withdrawal_count+'&nbsp;&nbsp;</span>')
  242. }else {
  243. $("#xitong_text").html('')
  244. }
  245. var data = '{"type":"get_count"}'
  246. ws.send(data)
  247. break
  248. }
  249. }
  250. ws.onclose = function () {
  251. // 关闭 websocket
  252. console.log('关闭socket')
  253. };
  254. function playSound() {
  255. var borswer = window.navigator.userAgent.toLowerCase();
  256. if(borswer.indexOf('ie') >= 0) {
  257. var strEmbed = '<embed name="embedPlay" src="/mp3/yinxiao.mp3" autostart="true" hidden="true" loop="false" />';
  258. if($('body').find('embed').length <= 0) {
  259. $('body').append(strEmbed);
  260. }
  261. var embed = document.embedPlay;
  262. //浏览器不支持audio,则使用embed播放
  263. embed.volume = 100;
  264. } else {
  265. //非IE内核浏览器
  266. var strAudio = '<audio id="audioPlay" src="/mp3/yinxiao.mp3" hidden="true" autoplay="autoplay"/>';
  267. if($('body').find('audio').length <= 0) {
  268. $('body').append(strAudio);
  269. }
  270. var audio = $('#audioPlay')[0];
  271. audio.play()
  272. }
  273. }
  274. </script>
  275. <script>
  276. function updateURLParam(param, value) {
  277. if(value.includes("system-pages"))return;
  278. var currentURL = window.location.href + '#';
  279. if(value.includes('{{ url('console') }}')){
  280. window.history.replaceState(null, null, currentURL.split('#')[0]);
  281. return
  282. }
  283. var regex = new RegExp(param + "=.*?#");
  284. var newURL = currentURL.replace(regex, param + "=" + value + "#");
  285. if (!regex.test(currentURL)) {
  286. newURL = currentURL + param + "=" + value;
  287. }
  288. window.history.replaceState(null, null, newURL.slice(0, -1));
  289. }
  290. document.addEventListener('DOMContentLoaded', function () {
  291. // 恢复菜单状态
  292. const collapsedItems = localStorage.getItem('collapsedItems');
  293. if (collapsedItems) {
  294. const ids = JSON.parse(collapsedItems);
  295. ids.forEach(id => {
  296. const element = document.getElementById(id);
  297. if (element) {
  298. element.classList.add('show');
  299. }
  300. });
  301. }
  302. // 添加事件监听器来保存菜单状态
  303. document.querySelectorAll('.nav-link[data-toggle="collapse"]').forEach(link => {
  304. link.addEventListener('click', function () {
  305. const targetId = link.getAttribute('href').substring(1);
  306. const targetElement = document.getElementById(targetId);
  307. if (targetElement) {
  308. let collapsedItems = localStorage.getItem('collapsedItems');
  309. collapsedItems = collapsedItems ? JSON.parse(collapsedItems) : [];
  310. if (targetElement.classList.contains('show')) {
  311. const index = collapsedItems.indexOf(targetId);
  312. if (index > -1) {
  313. collapsedItems.splice(index, 1);
  314. }
  315. } else {
  316. if (!collapsedItems.includes(targetId)) {
  317. collapsedItems.push(targetId);
  318. }
  319. }
  320. localStorage.setItem('collapsedItems', JSON.stringify(collapsedItems));
  321. }
  322. });
  323. });
  324. document.querySelectorAll('.nav-link').forEach(link => {
  325. link.addEventListener('click', function (e) {
  326. e.preventDefault();
  327. const url = link.getAttribute('href');
  328. if(url=="#")return;
  329. if(url.includes("system-pages"))return;
  330. document.getElementById('mainiframe').src = url;
  331. updateURLParam('page', url);
  332. });
  333. });
  334. const urlParams = new URLSearchParams(window.location.hash);
  335. const page = urlParams.get('#page')
  336. if (page) {
  337. document.getElementById('mainiframe').src = page;
  338. } else {
  339. document.getElementById('mainiframe').src = '{{ url('console') }}';
  340. }
  341. });
  342. function reurl(){
  343. url = location.href;
  344. var times = url.split("?t=");
  345. if(times[1] != 1){
  346. url += "?t=1";
  347. self.location.replace(url);
  348. }
  349. }
  350. οnlοad=reurl
  351. function editInfo(id) {
  352. var page = layer.open({
  353. type: 2,
  354. title: '{{__('auto.修改个人信息')}}',
  355. shadeClose: true,
  356. shade: 0.8,
  357. area: ['70%', '90%'],
  358. content: '/edit/info/'+id
  359. });
  360. }
  361. </script>
  362. <!-- plugins:js -->
  363. <script src="/assets/vendors/js/vendor.bundle.base.js"></script>
  364. <script src="/assets/vendors/js/vendor.bundle.addons.js"></script>
  365. <!-- endinject -->
  366. <!-- Plugin js for this page-->
  367. <!-- End plugin js for this page-->
  368. <!-- inject:js -->
  369. <script src="/assets/js/off-canvas.js"></script>
  370. {{--<script src="/assets/js/misc.js"></script>--}}
  371. <!-- endinject -->
  372. <!-- Custom js for this page-->
  373. <script src="/assets/js/dashboard.js"></script>
  374. <!-- End custom js for this page-->
  375. </body>
  376. </html>