nodeList.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. @extends('admin.layouts')
  2. @section('css')
  3. <link href="/assets/global/plugins/datatables/datatables.min.css" rel="stylesheet" type="text/css" />
  4. <link href="/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" type="text/css" />
  5. @endsection
  6. @section('content')
  7. <!-- BEGIN CONTENT BODY -->
  8. <div class="page-content" style="padding-top:0;">
  9. <!-- BEGIN PAGE BASE CONTENT -->
  10. <div class="row">
  11. <div class="col-md-12">
  12. <div class="note note-info">
  13. <p>节点绑定域名推荐使用<a href="https://www.namesilo.com/?rid=326ec20pa" target="_blank">Namesilo</a>,本面板支持自动更新DNS <a href="https://github.com/ssrpanel/SSRPanel/wiki/%E8%B4%AD%E4%B9%B0%E5%9F%9F%E5%90%8D%EF%BC%88%E8%87%AA%E5%B8%A6%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4%EF%BC%89" target="_blank" style="color:red;">[购买域名]</a></p>
  14. <p>状态显示为'离线':1.后端进程挂掉;2.节点和数据库之间的时区不一致或者通信延迟过高;3.服务器真的宕机。<a href="https://github.com/ssrpanel/ssrpanel/wiki/VPS%E6%8E%A8%E8%8D%90&%E8%B4%AD%E4%B9%B0%E7%BB%8F%E9%AA%8C" target="_blank" style="color:red;">[VPS推荐]</a></p>
  15. <p>务必检查各节点服务器的时间是否同步。<a href="https://github.com/ssrpanel/SSRPanel/wiki/%E5%8D%95%E7%AB%AF%E5%8F%A3%E5%A4%9A%E7%94%A8%E6%88%B7%E7%9A%84%E5%9D%91" target="_blank" style="color:red;">[时间校准]</a></p>
  16. </div>
  17. </div>
  18. </div>
  19. <div class="row">
  20. <div class="col-md-12">
  21. <!-- BEGIN EXAMPLE TABLE PORTLET-->
  22. <div class="portlet light bordered">
  23. <div class="portlet-title">
  24. <div class="caption font-dark">
  25. <span class="caption-subject bold uppercase"> 节点列表 </span>
  26. </div>
  27. <div class="actions">
  28. <div class="btn-group">
  29. <button class="btn sbold blue" onclick="addNode()"> 添加节点 </button>
  30. </div>
  31. </div>
  32. </div>
  33. <div class="portlet-body">
  34. <div class="table-scrollable table-scrollable-borderless">
  35. <table class="table table-hover table-light">
  36. <thead>
  37. <tr>
  38. <th> <span class="node-id"><a href="javascript:showIdTips();">ID</a></span> </th>
  39. <th> 类型 </th>
  40. <th> 名称 </th>
  41. <th> IP </th>
  42. <th> 域名 </th>
  43. <th> 存活 </th>
  44. <th> 状态 </th>
  45. <th> 在线 </th>
  46. <th> <span class="node-flow"><a href="javascript:showFlowTips();">产生流量</a></span> </th>
  47. <th> 流量比例 </th>
  48. <th> 扩展 </th>
  49. <th> 操作 </th>
  50. </tr>
  51. </thead>
  52. <tbody>
  53. @if($nodeList->isEmpty())
  54. <tr>
  55. <td colspan="11" style="text-align: center;">暂无数据</td>
  56. </tr>
  57. @else
  58. @foreach($nodeList as $node)
  59. <tr class="odd gradeX">
  60. <td> {{$node->id}} </td>
  61. <td>
  62. <span class="label {{$node->status ? 'label-info' : 'label-default'}}">{{$node->type == 2 ? 'V2Ray' : 'Shadowsocks(R)'}}</span>
  63. </td>
  64. <td> {{$node->name}} </td>
  65. <td>
  66. @if($node->is_nat)
  67. <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">NAT</span>
  68. @else
  69. <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">{{$node->ip}}</span>
  70. @endif
  71. </td>
  72. <td> <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">{{$node->server}}</span> </td>
  73. <td> <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">{{$node->uptime}}</span> </td>
  74. <td> <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">{{$node->load}}</span> </td>
  75. <td> <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">{{$node->online_users}}</span> </td>
  76. <td> {{$node->transfer}} </td>
  77. <td> <span class="label {{$node->status ? 'label-danger' : 'label-default'}}">{{$node->traffic_rate}}</span> </td>
  78. <td>
  79. @if($node->compatible) <span class="label label-info">兼</span> @endif
  80. @if($node->single) <span class="label label-info">单</span> @endif
  81. @if(!$node->is_subscribe) <span class="label label-info"><s>订</s></span> @endif
  82. </td>
  83. <td>
  84. <div class="btn-group">
  85. <a class="btn btn-default dropdown-toggle" data-toggle="dropdown" href="javascript:;" aria-expanded="false"> 操作
  86. <i class="fa fa-angle-down"></i>
  87. </a>
  88. <ul class="dropdown-menu">
  89. <li>
  90. <a href="javascript:editNode('{{$node->id}}');"> 编辑 </a>
  91. </li>
  92. <li>
  93. <a href="javascript:delNode('{{$node->id}}');"> 删除 </a>
  94. </li>
  95. <li>
  96. <a href="javascript:nodeMonitor('{{$node->id}}');"> 流量概况 </a>
  97. </li>
  98. </ul>
  99. </div>
  100. </td>
  101. </tr>
  102. @endforeach
  103. @endif
  104. </tbody>
  105. </table>
  106. </div>
  107. <div class="row">
  108. <div class="col-md-4 col-sm-4">
  109. <div class="dataTables_info" role="status" aria-live="polite">共 {{$nodeList->total()}} 个节点</div>
  110. </div>
  111. <div class="col-md-8 col-sm-8">
  112. <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
  113. {{ $nodeList->links() }}
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. <!-- END EXAMPLE TABLE PORTLET-->
  120. </div>
  121. </div>
  122. <!-- END PAGE BASE CONTENT -->
  123. </div>
  124. <!-- END CONTENT BODY -->
  125. @endsection
  126. @section('script')
  127. <script type="text/javascript">
  128. // 添加节点
  129. function addNode() {
  130. window.location.href = '{{url('admin/addNode')}}';
  131. }
  132. // 编辑节点
  133. function editNode(id) {
  134. window.location.href = '{{url('admin/editNode?id=')}}' + id + '&page=' + '{{Request::get('page', 1)}}';
  135. }
  136. // 删除节点
  137. function delNode(id) {
  138. layer.confirm('确定删除节点?', {icon: 2, title:'警告'}, function(index) {
  139. $.post("{{url('admin/delNode')}}", {id:id, _token:'{{csrf_token()}}'}, function(ret) {
  140. layer.msg(ret.message, {time:1000}, function() {
  141. if (ret.status == 'success') {
  142. window.location.reload();
  143. }
  144. });
  145. });
  146. layer.close(index);
  147. });
  148. }
  149. // 节点流量监控
  150. function nodeMonitor(id) {
  151. window.location.href = '{{url('admin/nodeMonitor?id=')}}' + id + '&page=' + '{{Request::get('page', 1)}}';
  152. }
  153. // 显示提示
  154. function showIdTips() {
  155. layer.tips('对应SSR(R)后端usermysql.json中的nodeid', '.node-id', {
  156. tips: [3, '#3595CC'],
  157. time: 1200
  158. });
  159. }
  160. // 显示提示
  161. function showFlowTips() {
  162. layer.tips('如果服务器使用锐速等加速工具,则实际产生的流量会超出以下的值', '.node-flow', {
  163. tips: [3, '#3595CC'],
  164. time: 1200
  165. });
  166. }
  167. // 修正table的dropdown
  168. $('.table-scrollable').on('show.bs.dropdown', function () {
  169. $('.table-scrollable').css( "overflow", "inherit" );
  170. });
  171. $('.table-scrollable').on('hide.bs.dropdown', function () {
  172. $('.table-scrollable').css( "overflow", "auto" );
  173. });
  174. </script>
  175. @endsection