Browse Source

Fix 极端条件下会触发中转节点端口获取错误

兔姬桑 3 years ago
parent
commit
1b8c7a211c
1 changed files with 304 additions and 309 deletions
  1. 304 309
      resources/views/admin/node/info.blade.php

+ 304 - 309
resources/views/admin/node/info.blade.php

@@ -438,334 +438,329 @@
     <script src="/assets/global/vendor/switchery/switchery.min.js"></script>
     <script src="/assets/global/js/Plugin/switchery.js"></script>
     <script>
-        const string = "{{strtolower(Str::random())}}";
-        $(document).ready(function() {
-            $('.relay-config').hide();
-            let v2_path = $('#v2_path');
-            switchSetting('single');
-            switchSetting('is_ddns');
-            @isset($node)
+      const string = "{{strtolower(Str::random())}}";
+      $(document).ready(function() {
+        $('.relay-config').hide();
+        let v2_path = $('#v2_path');
+          @isset($node)
+          @if($node->is_ddns)
+          $('#is_ddns').click();
+          @endif
+          @if($node->is_udp)
+          $('#is_udp').click();
+          @endif
+          @if($node->status)
+          $('#status').click();
+          @endif
+          $("input[name='is_display'][value='{{$node->is_display}}']").click();
+        $("input[name='detection_type'][value='{{$node->detection_type}}']").click();
+        $("input[name='type'][value='{{$node->type}}']").click();
+        $('#name').val('{{$node->name}}');
+        $('#server').val('{{$node->server}}');
+        $('#ip').val('{{$node->ip}}');
+        $('#ipv6').val('{{$node->ipv6}}');
+        $('#push_port').val('{{$node->push_port}}');
+        $('#traffic_rate').val('{{$node->traffic_rate}}');
+        $('#level').selectpicker('val', '{{$node->level}}');
+        $('#ruleGroup').selectpicker('val', '{{$node->rule_group_id}}');
+        $('#speed_limit').val('{{$node->speed_limit}}');
+        $('#client_limit').val('{{$node->client_limit}}');
+        $('#labels').selectpicker('val', {{$node->labels->pluck('id')}});
+        $('#country_code').selectpicker('val', '{{$node->country_code}}');
+        $('#relay_node_id').selectpicker('val', '{{$node->relay_node_id}}');
+        $('#description').val('{{$node->description}}');
+        $('#sort').val('{{$node->sort}}');
 
-            @if($node->is_ddns)
-            $('#is_ddns').click();
-            @endif
-            $('#name').val('{{$node->name}}');
-            $('#server').val('{{$node->server}}');
-            $('#ip').val('{{$node->ip}}');
-            $('#ipv6').val('{{$node->ipv6}}');
-            $('#push_port').val('{{$node->push_port}}');
-            $('#traffic_rate').val('{{$node->traffic_rate}}');
-            $('#level').selectpicker('val', '{{$node->level}}');
-            $('#ruleGroup').selectpicker('val', '{{$node->rule_group_id}}');
-            $('#speed_limit').val('{{$node->speed_limit}}');
-            $('#client_limit').val('{{$node->client_limit}}');
-            $('#labels').selectpicker('val', {{$node->labels->pluck('id')}});
-            $('#country_code').selectpicker('val', '{{$node->country_code}}');
-            $('#relay_node_id').selectpicker('val', '{{$node->relay_node_id}}');
-            $('#description').val('{{$node->description}}');
-            $('#sort').val('{{$node->sort}}');
-            @if($node->is_udp)
-            $('#is_udp').click();
-            @endif
-            @if($node->status)
-            $('#status').click();
-            @endif
-            $("input[name='is_display'][value='{{$node->is_display}}']").click();
-            $("input[name='detection_type'][value='{{$node->detection_type}}']").click();
-            @if(!empty($node->profile['passwd']) && $node->port)
-            $('#single').click();
-            $('#passwd').val('{{$node->profile['passwd']}}');
-            @endif
-            $('input[name = port]').val('{{$node->port}}');
-            $("input[name='type'][value='{{$node->type}}']").click();
+          @if(isset($node->relay_node_id))
+          $('#relay_port').val('{{$node->port}}');
+          @else
+          @switch($node->type)
+          @case(1)
+          @case(4)
+          $('#protocol').selectpicker('val', '{{$node->profile['protocol'] ?? null}}');
+        $('#protocol_param').val('{{$node->profile['protocol_param'] ?? null}}');
+        $('#obfs').selectpicker('val', '{{$node->profile['obfs'] ?? null}}');
+        $('#obfs_param').val('{{$node->profile['obfs_param'] ?? null}}');
+          @if(!empty($node->profile['passwd']) && $node->port)
+          $('#single').click();
+        $('#passwd').val('{{$node->profile['passwd']}}');
+          @endif
+          @case(0)
+          $('#method').selectpicker('val', '{{$node->profile['method'] ?? null}}');
+          @break
 
-            @if(isset($node->relay_node_id))
-            $('#relay_port').val('{{$node->port}}');
-            @else
-            @switch($node->type)
-            @case(1)
-            @case(4)
-            $('#protocol').selectpicker('val', '{{$node->profile['protocol'] ?? null}}');
-            $('#protocol_param').val('{{$node->profile['protocol_param'] ?? null}}');
-            $('#obfs').selectpicker('val', '{{$node->profile['obfs'] ?? null}}');
-            $('#obfs_param').val('{{$node->profile['obfs_param'] ?? null}}');
-            @case(0)
-            $('#method').selectpicker('val', '{{$node->profile['method'] ?? null}}');
-            @break
+          @case(2)
+        //V2Ray
+        $('#v2_alter_id').val('{{$node->profile['v2_alter_id'] ?? null}}');
+        $('#v2_method').selectpicker('val', '{{$node->profile['v2_method'] ?? null}}');
+        $('#v2_net').selectpicker('val', '{{$node->profile['v2_net'] ?? null}}');
+        $('#v2_type').selectpicker('val', '{{$node->profile['v2_type'] ?? null}}');
+        $('#v2_host').val('{{$node->profile['v2_host'] ?? null}}');
+        $('#v2_port').val('{{$node->port}}');
+        $('#v2_sni').val('{{$node->profile['v2_sni'] ?? null}}');
+        v2_path.val('{{$node->profile['v2_path'] ?? null}}');
+          @if($node->profile['v2_tls'] ?? false)
+          $('#v2_tls').click();
+          @endif
+          $('#tls_provider').val('{!! $node->tls_provider !!}');
 
-            @case(2)
-            //V2Ray
-            $('#v2_alter_id').val('{{$node->profile['v2_alter_id'] ?? null}}');
-            $('#v2_method').selectpicker('val', '{{$node->profile['v2_method'] ?? null}}');
-            $('#v2_net').selectpicker('val', '{{$node->profile['v2_net'] ?? null}}');
-            $('#v2_type').selectpicker('val', '{{$node->profile['v2_type'] ?? null}}');
-            $('#v2_host').val('{{$node->profile['v2_host'] ?? null}}');
-            $('#v2_port').val('{{$node->port}}');
-            $('#v2_sni').val('{{$node->profile['v2_sni'] ?? null}}');
-            v2_path.val('{{$node->profile['v2_path'] ?? null}}');
-            @if($node->profile['v2_tls'] ?? false)
-            $('#v2_tls').click();
-            @endif
-            $('#tls_provider').val('{!! $node->tls_provider !!}');
+          @break
+          @case(3)
+          $('#trojan_port').val('{{$node->port}}');
+          @break
+          @default
+          @endswitch
+          $('input[name = port]').val('{{$node->port}}');
+          @endif
 
-            @break
-            @case(3)
-            $('#trojan_port').val('{{$node->port}}');
-            @break
-            @default
-            @endswitch
-            @endif
+          @else
+          switchSetting('single');
+        switchSetting('is_ddns');
+        $('input[name=\'type\'][value=\'0\']').click();
+        $('#status').click();
+        $('#is_udp').click();
+        v2_path.val('/' + string);
+          @endisset
+          if ($('#obfs').val() === 'plain') {
+            $('.obfs_param').hide();
+          }
+      });
 
-            @else
-            $('input[name=\'type\'][value=\'0\']').click();
-            $('#status').click();
-            $('#is_udp').click();
-            v2_path.val('/' + string);
-            @endisset
-            if ($('#obfs').val() === 'plain') {
-                $('.obfs_param').hide();
-            }
-        });
-
-        // ajax同步提交
-        function Submit() {
-            $.ajax({
-                method: @isset($node) 'PUT' @else 'POST' @endisset,
-                url: '{{isset($node)? route('admin.node.update', $node) : route('admin.node.store')}}',
-                dataType: 'json',
-                data: {
-                    _token: '{{csrf_token()}}',
-                    is_ddns: document.getElementById('is_ddns').checked ? 1 : 0,
-                    name: $('#name').val(),
-                    server: $('#server').val(),
-                    ip: $('#ip').val(),
-                    ipv6: $('#ipv6').val(),
-                    push_port: $('#push_port').val(),
-                    traffic_rate: $('#traffic_rate').val(),
-                    level: $('#level').val(),
-                    rule_group_id: $('#ruleGroup').val(),
-                    speed_limit: $('#speed_limit').val(),
-                    client_limit: $('#client_limit').val(),
-                    labels: $('#labels').val(),
-                    country_code: $('#country_code option:selected').val(),
-                    description: $('#description').val(),
-                    sort: $('#sort').val(),
-                    is_udp: document.getElementById('is_udp').checked ? 1 : 0,
-                    status: document.getElementById('status').checked ? 1 : 0,
-                    type: $('input[name=\'type\']:checked').val(),
-                    method: $('#method').val(),
-                    protocol: $('#protocol').val(),
-                    protocol_param: $('#protocol_param').val(),
-                    obfs: $('#obfs').val(),
-                    obfs_param: $('#obfs_param').val(),
-                    is_display:  $('input[name=\'is_display\']:checked').val(),
-                    detection_type: $('input[name=\'detection_type\']:checked').val(),
-                    single: document.getElementById('single').checked ? 1 : 0,
-                    port: $('input[name="port"]:not([hidden])').val(),
-                    passwd: $('#passwd').val(),
-                    v2_alter_id: $('#v2_alter_id').val(),
-                    v2_method: $('#v2_method').val(),
-                    v2_net: $('#v2_net').val(),
-                    v2_type: $('#v2_type').val(),
-                    v2_host: $('#v2_host').val(),
-                    v2_path: $('#v2_path').val(),
-                    v2_sni: $('#v2_sni').val(),
-                    v2_tls: document.getElementById('v2_tls').checked ? 1 : 0,
-                    tls_provider: $('#tls_provider').val(),
-                    relay_node_id: $('#relay_node_id option:selected').val(),
-                },
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({
-                            title: ret.message,
-                            icon: 'success',
-                            timer: 1000,
-                            showConfirmButton: false,
-                        }).then(() => window.location.href = '{{route('admin.node.index').(Request::getQueryString()?('?'.Request::getQueryString()):'') }}');
-                    } else {
-                        swal.fire({title: '[错误 | Error]', text: ret.message, icon: 'error'});
-                    }
-                },
-                error: function(data) {
-                    let str = '';
-                    const errors = data.responseJSON;
-                    if ($.isEmptyObject(errors) === false) {
-                        $.each(errors.errors, function(index, value) {
-                            str += '<li>' + value + '</li>';
-                        });
-                        swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
-                    }
-                },
-            });
-
-            return false;
-        }
-
-        function switchSetting(id) {
-            let check = document.getElementById(id).checked ? 1 : 0;
-            switch (id) {
-                // 设置单端口多用户
-                case 'single':
-                    if (check) {
-                        $('.single-setting').show();
-                        $('#single_port').removeAttr('hidden').attr('required', true);
-                    } else {
-                        $('#single_port').removeAttr('required').attr('hidden', true);
-                        $('#passwd').val('');
-                        $('.single-setting').hide();
-                    }
-                    break;
-                // 设置是否使用DDNS
-                case 'is_ddns':
-                    if (check) {
-                        $('#ip').val('').attr('readonly', true);
-                        $('#ipv6').val('').attr('readonly', true);
-                        $('#server').attr('required', true);
-                    } else {
-                        $('#ip').removeAttr('readonly');
-                        $('#ipv6').removeAttr('readonly');
-                        $('#server').removeAttr('required');
-                    }
-                    break;
-                default:
-                    break;
+      function Submit() { // ajax同步提交
+        $.ajax({
+          method: @isset($node) 'PUT' @else 'POST' @endisset,
+          url: '{{isset($node)? route('admin.node.update', $node) : route('admin.node.store')}}',
+          dataType: 'json',
+          data: {
+            _token: '{{csrf_token()}}',
+            is_ddns: document.getElementById('is_ddns').checked ? 1 : 0,
+            name: $('#name').val(),
+            server: $('#server').val(),
+            ip: $('#ip').val(),
+            ipv6: $('#ipv6').val(),
+            push_port: $('#push_port').val(),
+            traffic_rate: $('#traffic_rate').val(),
+            level: $('#level').val(),
+            rule_group_id: $('#ruleGroup').val(),
+            speed_limit: $('#speed_limit').val(),
+            client_limit: $('#client_limit').val(),
+            labels: $('#labels').val(),
+            country_code: $('#country_code option:selected').val(),
+            description: $('#description').val(),
+            sort: $('#sort').val(),
+            is_udp: document.getElementById('is_udp').checked ? 1 : 0,
+            status: document.getElementById('status').checked ? 1 : 0,
+            type: $('input[name=\'type\']:checked').val(),
+            method: $('#method').val(),
+            protocol: $('#protocol').val(),
+            protocol_param: $('#protocol_param').val(),
+            obfs: $('#obfs').val(),
+            obfs_param: $('#obfs_param').val(),
+            is_display: $('input[name=\'is_display\']:checked').val(),
+            detection_type: $('input[name=\'detection_type\']:checked').val(),
+            single: document.getElementById('single').checked ? 1 : 0,
+            port: $('input[name="port"]:not([hidden])').val(),
+            passwd: $('#passwd').val(),
+            v2_alter_id: $('#v2_alter_id').val(),
+            v2_method: $('#v2_method').val(),
+            v2_net: $('#v2_net').val(),
+            v2_type: $('#v2_type').val(),
+            v2_host: $('#v2_host').val(),
+            v2_path: $('#v2_path').val(),
+            v2_sni: $('#v2_sni').val(),
+            v2_tls: document.getElementById('v2_tls').checked ? 1 : 0,
+            tls_provider: $('#tls_provider').val(),
+            relay_node_id: $('#relay_node_id option:selected').val(),
+          },
+          success: function(ret) {
+            if (ret.status === 'success') {
+              swal.fire({
+                title: ret.message,
+                icon: 'success',
+                timer: 1000,
+                showConfirmButton: false,
+              }).then(() => window.location.href = '{{route('admin.node.index').(Request::getQueryString()?('?'.Request::getQueryString()):'') }}');
+            } else {
+              swal.fire({title: '[错误 | Error]', text: ret.message, icon: 'error'});
             }
-        }
-
-        // 设置服务类型
-        $('input:radio[name=\'type\']').on('change', function() {
-            const type = parseInt($(this).val());
-            const $ss_setting = $('.ss-setting');
-            const $ssr_setting = $('.ssr-setting');
-            const $v2ray_setting = $('.v2ray-setting');
-            const $trojan_setting = $('.trojan-setting');
-            $ssr_setting.hide();
-            $ss_setting.hide();
-            $v2ray_setting.hide();
-            $trojan_setting.hide();
-            $('#v2_port').removeAttr('required').attr('hidden', true);
-            $('#trojan_port').removeAttr('required');
-            switch (type) {
-                case 0:
-                    $ss_setting.show();
-                    break;
-                case 2:
-                    $v2ray_setting.show();
-                    $('#v2_port').removeAttr('hidden').attr('required', true);
-                    $('#v2_net').selectpicker('val', 'tcp');
-                    break;
-                case 3:
-                    $trojan_setting.show();
-                    $('#trojan_port').removeAttr('hidden').attr('required', true);
-                    break;
-                case 1:
-                case 4:
-                    $ss_setting.show();
-                    $ssr_setting.show();
-                    break;
-                default:
+          },
+          error: function(data) {
+            let str = '';
+            const errors = data.responseJSON;
+            if ($.isEmptyObject(errors) === false) {
+              $.each(errors.errors, function(index, value) {
+                str += '<li>' + value + '</li>';
+              });
+              swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
             }
+          },
         });
 
-        $('#obfs').on('changed.bs.select', function() {
-            const obfs_param = $('.obfs_param');
-            if ($('#obfs').val() === 'plain') {
-                $('#obfs_param').val('');
-                obfs_param.hide();
-            } else {
-                obfs_param.show();
-            }
-        });
+        return false;
+      }
 
-        $('#relay_node_id').on('changed.bs.select', function() {
-            const relay = $('.relay-config');
-            const config = $('.proxy-config');
-            if ($('#relay_node_id').val() === '') {
-                relay.hide();
-                $('#relay_port').removeAttr('required').attr('hidden', true);
-                config.show();
+      function switchSetting(id) {
+        let check = document.getElementById(id).checked ? 1 : 0;
+        switch (id) {
+          case 'single': // 设置单端口多用户
+            if (check) {
+              $('.single-setting').show();
+              $('#single_port').removeAttr('hidden').attr('required', true);
             } else {
-                relay.show();
-                config.hide();
-                $('#relay_port').removeAttr('hidden').attr('required', true);
+              $('#single_port').removeAttr('required').attr('hidden', true);
+              $('#passwd').val('');
+              $('.single-setting').hide();
             }
-        });
+            break;
 
-        // 设置V2Ray详细设置
-        $('#v2_net').on('changed.bs.select', function() {
-            const type = $('.v2_type');
-            const type_option = $('#type_option');
-            const host = $('.v2_host');
-            const path = $('#v2_path');
-            const v2_other = $('[name="v2_other"]');
-            type.show();
-            host.show();
-            v2_other.show();
-            path.val('/' + string);
-            switch ($(this).val()) {
-                case 'kcp':
-                    type_option.attr('disabled', false);
-                    break;
-                case 'ws':
-                    type.hide();
-                    break;
-                case 'http':
-                    type.hide();
-                    break;
-                case 'domainsocket':
-                    type.hide();
-                    host.hide();
-                    break;
-                case 'quic':
-                    type_option.attr('disabled', false);
-                    path.val(string);
-                    break;
-                case 'tcp':
-                default:
-                    type_option.attr('disabled', true);
-                    break;
+          case 'is_ddns': // 设置是否使用DDNS
+            if (check) {
+              $('#ip').val('').attr('readonly', true);
+              $('#ipv6').val('').attr('readonly', true);
+              $('#server').attr('required', true);
+            } else {
+              $('#ip').removeAttr('readonly');
+              $('#ipv6').removeAttr('readonly');
+              $('#server').removeAttr('required');
             }
-            $('#v2_type').selectpicker('refresh');
-        });
+            break;
+          default:
+            break;
+        }
+      }
 
-        // 服务条款
-        function showTnc() {
-            const content =
-                '<ol>' +
-                '<li>请勿直接复制黏贴以下配置,SSR(R)会报错的</li>' +
-                '<li>确保服务器时间为CST</li>' +
-                '</ol>' +
-                '&emsp;&emsp;"additional_ports" : {<br />' +
-                '&emsp;&emsp;&emsp;"443": {<br />' +
-                '&emsp;&emsp;&emsp;&emsp;"passwd": "ProxyPanel",<br />' +
-                '&emsp;&emsp;&emsp;&emsp;"method": "none",<br />' +
-                '&emsp;&emsp;&emsp;&emsp;"protocol": "auth_chain_a",<br />' +
-                '&emsp;&emsp;&emsp;&emsp;"protocol_param": "#",<br />' +
-                '&emsp;&emsp;&emsp;&emsp;"obfs": "plain",<br />' +
-                '&emsp;&emsp;&emsp;&emsp;"obfs_param": "fe2.update.microsoft.com"<br />' +
-                '&emsp;&emsp;&emsp;}<br />' +
-                '&emsp;&emsp;},';
+      // 设置服务类型
+      $('input:radio[name=\'type\']').on('change', function() {
+        const type = parseInt($(this).val());
+        const $ss_setting = $('.ss-setting');
+        const $ssr_setting = $('.ssr-setting');
+        const $v2ray_setting = $('.v2ray-setting');
+        const $trojan_setting = $('.trojan-setting');
+        $ssr_setting.hide();
+        $ss_setting.hide();
+        $v2ray_setting.hide();
+        $trojan_setting.hide();
+        $('#v2_port').removeAttr('required').attr('hidden', true);
+        $('#trojan_port').removeAttr('required');
+        switch (type) {
+          case 0:
+            $ss_setting.show();
+            break;
+          case 2:
+            $v2ray_setting.show();
+            $('#v2_port').removeAttr('hidden').attr('required', true);
+            $('#v2_net').selectpicker('val', 'tcp');
+            break;
+          case 3:
+            $trojan_setting.show();
+            $('#trojan_port').removeAttr('hidden').attr('required', true);
+            break;
+          case 1:
+          case 4:
+            $ss_setting.show();
+            $ssr_setting.show();
+            break;
+          default:
+        }
+      });
 
-            swal.fire({
-                title: '[节点 user-config.json 配置示例]',
-                html: '<div class="p-10 bg-grey-900 text-white font-weight-300 text-left" style="line-height: 22px;">' +
-                    content + '</div>',
-                icon: 'info',
-            });
+      $('#obfs').on('changed.bs.select', function() {
+        const obfs_param = $('.obfs_param');
+        if ($('#obfs').val() === 'plain') {
+          $('#obfs_param').val('');
+          obfs_param.hide();
+        } else {
+          obfs_param.show();
         }
+      });
 
-        // 模式提示
-        function showPortsOnlyConfig() {
-            const content = '严格模式:"additional_ports_only": "true"'
-                + '<br><br>'
-                + '兼容模式:"additional_ports_only": "false"';
+      $('#relay_node_id').on('changed.bs.select', function() {
+        const relay = $('.relay-config');
+        const config = $('.proxy-config');
+        if ($('#relay_node_id').val() === '') {
+          relay.hide();
+          $('#relay_port').removeAttr('required').attr('hidden', true);
+          config.show();
+        } else {
+          relay.show();
+          config.hide();
+          $('#relay_port').removeAttr('hidden').attr('required', true);
+        }
+      });
 
-            swal.fire({
-                title: '[节点 user-config.json 配置示例]',
-                html: '<div class="p-10 bg-grey-900 text-white font-weight-300 text-left" style="line-height: 22px;">' +
-                    content + '</div>',
-                icon: 'info',
-            });
+      // 设置V2Ray详细设置
+      $('#v2_net').on('changed.bs.select', function() {
+        const type = $('.v2_type');
+        const type_option = $('#type_option');
+        const host = $('.v2_host');
+        const path = $('#v2_path');
+        const v2_other = $('[name="v2_other"]');
+        type.show();
+        host.show();
+        v2_other.show();
+        path.val('/' + string);
+        switch ($(this).val()) {
+          case 'kcp':
+            type_option.attr('disabled', false);
+            break;
+          case 'ws':
+            type.hide();
+            break;
+          case 'http':
+            type.hide();
+            break;
+          case 'domainsocket':
+            type.hide();
+            host.hide();
+            break;
+          case 'quic':
+            type_option.attr('disabled', false);
+            path.val(string);
+            break;
+          case 'tcp':
+          default:
+            type_option.attr('disabled', true);
+            break;
         }
+        $('#v2_type').selectpicker('refresh');
+      });
+
+      // 服务条款
+      function showTnc() {
+        const content =
+            '<ol>' +
+            '<li>请勿直接复制黏贴以下配置,SSR(R)会报错的</li>' +
+            '<li>确保服务器时间为CST</li>' +
+            '</ol>' +
+            '&emsp;&emsp;"additional_ports" : {<br />' +
+            '&emsp;&emsp;&emsp;"443": {<br />' +
+            '&emsp;&emsp;&emsp;&emsp;"passwd": "ProxyPanel",<br />' +
+            '&emsp;&emsp;&emsp;&emsp;"method": "none",<br />' +
+            '&emsp;&emsp;&emsp;&emsp;"protocol": "auth_chain_a",<br />' +
+            '&emsp;&emsp;&emsp;&emsp;"protocol_param": "#",<br />' +
+            '&emsp;&emsp;&emsp;&emsp;"obfs": "plain",<br />' +
+            '&emsp;&emsp;&emsp;&emsp;"obfs_param": "fe2.update.microsoft.com"<br />' +
+            '&emsp;&emsp;&emsp;}<br />' +
+            '&emsp;&emsp;},';
+
+        swal.fire({
+          title: '[节点 user-config.json 配置示例]',
+          html: '<div class="p-10 bg-grey-900 text-white font-weight-300 text-left" style="line-height: 22px;">' + content + '</div>',
+          icon: 'info',
+        });
+      }
+
+      // 模式提示
+      function showPortsOnlyConfig() {
+        const content = '严格模式:"additional_ports_only": "true"'
+            + '<br><br>'
+            + '兼容模式:"additional_ports_only": "false"';
+
+        swal.fire({
+          title: '[节点 user-config.json 配置示例]',
+          html: '<div class="p-10 bg-grey-900 text-white font-weight-300 text-left" style="line-height: 22px;">' + content + '</div>',
+          icon: 'info',
+        });
+      }
     </script>
 @endsection