Browse Source

Clients Subscribe Update

BrettonYe 2 years ago
parent
commit
2110a2c504
62 changed files with 1069 additions and 534 deletions
  1. 32 31
      app/Components/Client/Clash.php
  2. 8 2
      app/Components/Client/QuantumultX.php
  3. 0 43
      app/Components/Client/Surfboard.php
  4. 2 0
      app/Components/Client/Surge.php
  5. 12 12
      app/Components/Client/URLSchemes.php
  6. 0 45
      app/Components/Client/V2rayN.php
  7. 103 109
      app/Helpers/ClientConfig.php
  8. 6 6
      app/Http/Controllers/UserController.php
  9. 1 1
      app/Models/Order.php
  10. 2 2
      app/Models/Payment.php
  11. 17 2
      app/Services/ProxyService.php
  12. 3 3
      resources/lang/en/admin.php
  13. 1 0
      resources/lang/en/auth.php
  14. 4 3
      resources/lang/en/common.php
  15. 1 1
      resources/lang/en/errors.php
  16. 1 1
      resources/lang/en/model.php
  17. 21 0
      resources/lang/en/user.php
  18. 2 2
      resources/lang/ja/admin.php
  19. 1 0
      resources/lang/ja/auth.php
  20. 4 3
      resources/lang/ja/common.php
  21. 21 0
      resources/lang/ja/user.php
  22. 3 3
      resources/lang/ko/admin.php
  23. 1 0
      resources/lang/ko/auth.php
  24. 5 4
      resources/lang/ko/common.php
  25. 21 0
      resources/lang/ko/user.php
  26. 5 5
      resources/lang/vi/admin.php
  27. 4 3
      resources/lang/vi/auth.php
  28. 5 4
      resources/lang/vi/common.php
  29. 21 0
      resources/lang/vi/user.php
  30. 2 2
      resources/lang/zh_CN/admin.php
  31. 1 0
      resources/lang/zh_CN/auth.php
  32. 4 3
      resources/lang/zh_CN/common.php
  33. 21 0
      resources/lang/zh_CN/user.php
  34. 37 9
      resources/rules/default.clash.yaml
  35. 96 63
      resources/rules/default.surfboard.conf
  36. 532 10
      resources/rules/default.surge.conf
  37. 1 1
      resources/views/admin/config/emailFilter.blade.php
  38. 1 1
      resources/views/admin/logs/userMonitor.blade.php
  39. 2 2
      resources/views/admin/marketing/pushList.blade.php
  40. 1 1
      resources/views/admin/node/auth.blade.php
  41. 2 2
      resources/views/admin/node/info.blade.php
  42. 1 1
      resources/views/admin/node/monitor.blade.php
  43. 1 1
      resources/views/admin/rule/index.blade.php
  44. 2 3
      resources/views/admin/shop/info.blade.php
  45. 1 1
      resources/views/admin/ticket/index.blade.php
  46. 1 1
      resources/views/admin/ticket/reply.blade.php
  47. 2 2
      resources/views/admin/user/info.blade.php
  48. 1 1
      resources/views/auth/login.blade.php
  49. 2 2
      resources/views/auth/register.blade.php
  50. 1 1
      resources/views/components/alert.blade.php
  51. 10 10
      resources/views/components/payment/detail.blade.php
  52. 1 1
      resources/views/components/system/input-test.blade.php
  53. 0 93
      resources/views/components/ticket/reply.blade.php
  54. 8 8
      resources/views/user/components/notification.blade.php
  55. 15 15
      resources/views/user/components/payment/manual.blade.php
  56. 8 7
      resources/views/user/components/purchase.blade.php
  57. 3 3
      resources/views/user/profile.blade.php
  58. 1 1
      resources/views/user/services.blade.php
  59. 1 1
      resources/views/user/ticketList.blade.php
  60. 1 1
      resources/views/vendor/log-viewer/remark/logs.blade.php
  61. 1 1
      resources/views/vendor/log-viewer/remark/show.blade.php
  62. 1 1
      update.sh

+ 32 - 31
app/Components/Client/Clash.php

@@ -3,8 +3,10 @@
 namespace App\Components\Client;
 
 /*
- * 本文件依据Clash文件编辑
- * https://github.com/Dreamacro/clash/tree/master/adapters/outbound
+ * 本文件依据
+ * https://github.com/Dreamacro/clash/tree/master/adapter/outbound
+ * https://github.com/Dreamacro/clash/wiki/Configuration#all-configuration-options
+ * https://lancellc.gitbook.io/clash/clash-config-file/proxies/config-a-shadowsocks-proxy
  *
  */
 
@@ -13,44 +15,44 @@ class Clash
     public static function buildShadowsocks($server)
     {
         return [
-            'name' => $server['name'],
-            'type' => 'ss',
-            'server' => $server['host'],
-            'port' => $server['port'],
+            'name'     => $server['name'],
+            'type'     => 'ss',
+            'server'   => $server['host'],
+            'port'     => $server['port'],
             'password' => $server['passwd'],
-            'cipher' => $server['method'],
-            'udp' => $server['udp'],
+            'cipher'   => $server['method'],
+            'udp'      => $server['udp'],
         ];
     }
 
     public static function buildShadowsocksr($server)
     {
         return [
-            'name' => $server['name'],
-            'type' => 'ssr',
-            'server' => $server['host'],
-            'port' => $server['port'],
-            'password' => $server['passwd'],
-            'cipher' => $server['method'],
-            'obfs' => $server['obfs'],
-            'protocol' => $server['protocol'],
-            'obfs-param' => $server['obfs_param'],
+            'name'           => $server['name'],
+            'type'           => 'ssr',
+            'server'         => $server['host'],
+            'port'           => $server['port'],
+            'password'       => $server['passwd'],
+            'cipher'         => $server['method'],
+            'obfs'           => $server['obfs'],
+            'obfs-param'     => $server['obfs_param'],
+            'protocol'       => $server['protocol'],
             'protocol-param' => $server['protocol_param'],
-            'udp' => $server['udp'],
+            'udp'            => $server['udp'],
         ];
     }
 
     public static function buildVmess($server)
     {
         $array = [
-            'name' => $server['name'],
-            'type' => 'vmess',
-            'server' => $server['host'],
-            'port' => $server['port'],
-            'uuid' => $server['uuid'],
+            'name'    => $server['name'],
+            'type'    => 'vmess',
+            'server'  => $server['host'],
+            'port'    => $server['port'],
+            'uuid'    => $server['uuid'],
             'alterId' => $server['v2_alter_id'],
-            'cipher' => $server['method'],
-            'udp' => $server['udp'],
+            'cipher'  => $server['method'],
+            'udp'     => $server['udp'],
         ];
 
         if ($server['v2_tls']) {
@@ -65,7 +67,6 @@ class Clash
             if ($server['v2_host']) {
                 $array['ws-opts']['headers'] = ['Host' => $server['v2_host']];
             }
-            // TODO: 2022.06.01 remove it
             $array['ws-path'] = $server['v2_path'];
             if ($server['v2_host']) {
                 $array['ws-headers'] = ['Host' => $server['v2_host']];
@@ -78,12 +79,12 @@ class Clash
     public static function buildTrojan($server)
     {
         $array = [
-            'name' => $server['name'],
-            'type' => 'trojan',
-            'server' => $server['host'],
-            'port' => $server['port'],
+            'name'     => $server['name'],
+            'type'     => 'trojan',
+            'server'   => $server['host'],
+            'port'     => $server['port'],
             'password' => $server['passwd'],
-            'udp' => $server['udp'],
+            'udp'      => $server['udp'],
         ];
 
         if (! empty($server['sni'])) {

+ 8 - 2
app/Components/Client/QuantumultX.php

@@ -2,6 +2,12 @@
 
 namespace App\Components\Client;
 
+/*
+ * 本文件依据
+ * https://github.com/crossutility/Quantumult-X/blob/master/server-complete.snippet
+ *
+ */
+
 class QuantumultX
 {
     public static function buildShadowsocks($server)
@@ -43,7 +49,7 @@ class QuantumultX
             "method={$server['method']}",
             "password={$server['uuid']}",
             'fast-open=true',
-            'udp-relay=true',
+            "udp-relay={$server['udp']}",
             "tag={$server['name']}",
         ];
 
@@ -82,7 +88,7 @@ class QuantumultX
             // Tips: allowInsecure=false = tls-verification=true
             // $server['allow_insecure'] ? 'tls-verification=false' : 'tls-verification=true',
             'fast-open=true',
-            'udp-relay=true',
+            "udp-relay={$server['udp']}",
             "tag={$server['name']}",
         ]);
 

+ 0 - 43
app/Components/Client/Surfboard.php

@@ -1,43 +0,0 @@
-<?php
-
-namespace App\Components\Client;
-
-class Surfboard
-{
-    public static function buildShadowsocks($server)
-    {
-        $config = array_filter([
-            "{$server['name']}=custom",
-            $server['host'],
-            $server['port'],
-            $server['method'],
-            $server['passwd'],
-            sysConfig('website_url').'/clients/SSEncrypt.module',
-            'tfo=true',
-            "udp-relay={$server['udp']}",
-        ]);
-
-        return implode(',', $config).PHP_EOL;
-    }
-
-    public static function buildVmess($server)
-    {
-        $config = [
-            "{$server['name']}=vmess",
-            $server['host'],
-            $server['port'],
-            "username={$server['uuid']}",
-            'tfo=true',
-            "udp-relay={$server['udp']}",
-        ];
-
-        if ($server['v2_tls']) {
-            array_push($config, 'tls=true', "sni={$server['v2_host']}");
-        }
-        if ($server['v2_net'] === 'ws') {
-            array_push($config, 'ws=true', "ws-path={$server['v2_path']}", "ws-headers=Host:{$server['v2_host']}");
-        }
-
-        return implode(',', $config).PHP_EOL;
-    }
-}

+ 2 - 0
app/Components/Client/Surge.php

@@ -26,6 +26,7 @@ class Surge
             $server['host'],
             $server['port'],
             "username={$server['uuid']}",
+            'vmess-aead=true',
             'tfo=true',
             "udp-relay={$server['udp']}",
         ];
@@ -50,6 +51,7 @@ class Surge
             $server['sni'] ? "sni={$server['sni']}" : '',
             'tfo=true',
             "udp-relay={$server['udp']}",
+            // "skip-cert-verify={$server['allow_insecure']}"
         ]);
 
         return implode(',', $config).PHP_EOL;

+ 12 - 12
app/Components/Client/URLSchemes.php

@@ -35,18 +35,18 @@ class URLSchemes
     public static function buildVmess($server)
     {
         $config = [
-            'v'    => '2',
-            'ps'   => $server['name'],
-            'add'  => $server['host'],
-            'port' => $server['port'],
-            'id'   => $server['uuid'],
-            'aid'  => $server['v2_alter_id'],
-            'net'  => $server['v2_net'],
-            'type' => $server['v2_type'],
-            'host' => $server['v2_host'],
-            'path' => $server['v2_path'],
-            'tls'  => $server['v2_tls'],
-            'sni' => $server['v2_sni'],
+            'v'      => '2',
+            'ps'     => $server['name'],
+            'add'    => $server['host'],
+            'port'   => $server['port'],
+            'id'     => $server['uuid'],
+            'aid'    => $server['v2_alter_id'],
+            'net'    => $server['v2_net'],
+            'type'   => $server['v2_type'],
+            'host'   => $server['v2_host'],
+            'path'   => $server['v2_path'],
+            'tls'    => $server['v2_tls'],
+            'sni'    => $server['v2_sni'],
             'remark' => $server['name'],
         ];
 

+ 0 - 45
app/Components/Client/V2rayN.php

@@ -1,45 +0,0 @@
-<?php
-
-namespace App\Components\Client;
-
-class V2rayN
-{
-    public static function buildShadowsocksr($server)
-    {
-        $setting = "{$server['host']}:{$server['port']}:{$server['protocol']}:{$server['method']}:{$server['obfs']}:";
-
-        return 'ssr://'.base64url_encode($setting.base64url_encode($server['passwd']).'/?obfsparam='.base64url_encode($server['obfs_param']).'&protoparam='.base64url_encode($server['protocol_param']).'&remarks='.base64url_encode($server['name']).'&group='.base64url_encode($server['group']).'&udpport='.$server['udp'].'&uot=0').PHP_EOL;
-    }
-
-    public static function buildVmess($server)
-    {
-        $config = [
-            'v' => '2',
-            'ps' => $server['name'],
-            'add' => $server['host'],
-            'port' => $server['port'],
-            'id' => $server['uuid'],
-            'aid' => $server['v2_alter_id'],
-            'net' => $server['v2_net'],
-            'type' => $server['v2_type'],
-            'host' => $server['v2_host'],
-            'path' => $server['v2_path'],
-            'tls' => $server['v2_tls'],
-            'sni' => $server['v2_sni'],
-            'remark' => $server['name'],
-        ];
-
-        return 'vmess://'.base64_encode(json_encode($config)).PHP_EOL;
-    }
-
-    public static function buildTrojan($server)
-    {
-        $name = rawurlencode($server['name']);
-        $query = '';
-        if (array_key_exists('sni', $server)) {
-            $query = "?sni={$server['sni']}";
-        }
-
-        return "trojan://{$server['passwd']}@{$server['host']}:{$server['port']}{$query}#{$name}".PHP_EOL;
-    }
-}

+ 103 - 109
app/Helpers/ClientConfig.php

@@ -8,57 +8,51 @@ use App\Components\Client\Surfboard;
 use App\Components\Client\Surge;
 use App\Components\Client\URLSchemes;
 use App\Components\Client\V2rayN;
-use App\Models\User;
 use File;
 use Symfony\Component\Yaml\Yaml;
 
 trait ClientConfig
 {
-    private function clientConfig(array $servers, string $target)
+    private function clientConfig(string $target)
     {
-        if (str_contains($target, 'quantumult x')) {
-            return $this->quantumultX(self::$user, $servers);
+        if (str_contains($target, 'quantumult%20x')) {
+            return $this->quantumultX();
         }
         if (str_contains($target, 'quantumult')) {
-            return $this->quantumult(self::$user, $servers);
+            return $this->quantumult();
         }
         if (str_contains($target, 'clash')) {
-            return $this->clash($servers);
+            return $this->clash();
         }
         if (str_contains($target, 'bob_vpn')) {
-            return $this->clash($servers, 'bob');
+            return $this->clash('bob');
         }
         if (str_contains($target, 'surfboard')) {
-            return $this->surfboard(self::$user, $servers);
+            return $this->surfboard();
         }
         if (str_contains($target, 'surge')) {
-            return $this->surge($target, self::$user, $servers);
+            return $this->surge($target);
         }
         if (str_contains($target, 'shadowrocket')) {
-            return $this->shadowrocket(self::$user, $servers);
+            return $this->shadowrocket();
         }
-        if (str_contains($target, 'v2rayn')) {
-            return $this->v2rayN(self::$user, $servers);
-        }
-        if (str_contains($target, 'v2rayng')) {
-            return $this->v2rayN(self::$user, $servers);
-        }
-        if (str_contains($target, 'v2rayu')) {
-            return $this->v2rayN(self::$user, $servers);
+        if (str_contains($target, 'v2rayn') || str_contains($target, 'v2rayng') || str_contains($target, 'v2rayu')) {
+            return $this->v2rayN();
         }
 //            if (strpos($target, 'shadowsocks') !== false) {
-//                exit($this->shaodowsocksSIP008($servers));
+//                exit($this->shaodowsocksSIP008());
 //            }
-        return $this->origin($servers);
+        return $this->origin();
     }
 
-    private function quantumultX(User $user, array $servers = []): string
+    private function quantumultX(): string
     {
+        $user = $this->getUser();
         $uri = '';
         if (sysConfig('is_custom_subscribe')) {
-            header("subscription-userinfo: upload={$user->u}; download={$user->d}; total={$user->transfer_enable}; expire={$user->expiration_date}");
+            header("subscription-userinfo: upload=$user->u; download=$user->d; total=$user->transfer_enable; expire=$user->expiration_date");
         }
-        foreach ($servers as $server) {
+        foreach ($this->getServers() as $server) {
             if ($server['type'] === 'shadowsocks') {
                 $uri .= QuantumultX::buildShadowsocks($server);
             }
@@ -76,19 +70,20 @@ trait ClientConfig
         return base64_encode($uri);
     }
 
-    private function quantumult(User $user, array $servers = []): string
+    private function quantumult(): string
     {
+        $user = $this->getUser();
         if (sysConfig('is_custom_subscribe')) {
-            header("subscription-userinfo: upload={$user->u}; download={$user->d}; total={$user->transfer_enable}; expire={$user->expiration_date}");
+            header("subscription-userinfo: upload=$user->u; download=$user->d; total=$user->transfer_enable; expire=$user->expiration_date");
         }
 
-        return $this->origin($servers);
+        return $this->origin();
     }
 
-    private function origin(array $servers = [], bool $encode = true): string
+    private function origin(bool $encode = true): string
     {
         $uri = '';
-        foreach ($servers as $server) {
+        foreach ($this->getServers() as $server) {
             if ($server['type'] === 'shadowsocks') {
                 $uri .= URLSchemes::buildShadowsocks($server);
             }
@@ -106,8 +101,16 @@ trait ClientConfig
         return $encode ? base64_encode($uri) : $uri;
     }
 
-    private function clash(array $servers, $client = false)
+    private function clash($client = false)
     {
+        $user = $this->getUser();
+        $webName = sysConfig('website_name');
+        header("content-disposition:attachment;filename*=UTF-8''".rawurlencode($webName));
+        header('profile-update-interval: 24');
+        header('profile-web-page-url:'.sysConfig('website_url'));
+        if (sysConfig('is_custom_subscribe')) {
+            header("subscription-userinfo: upload=$user->u; download=$user->d; total=$user->transfer_enable; expire=$user->expired_at");
+        }
         $custom_path = '/resources/rules/custom.clash.yaml';
         if ($client === 'bob') {
             $file_path = '/resources/rules/bob.clash.yaml';
@@ -119,7 +122,7 @@ trait ClientConfig
 
         $config = Yaml::parseFile(base_path().$file_path);
 
-        foreach ($servers as $server) {
+        foreach ($this->getServers() as $server) {
             if ($server['type'] === 'shadowsocks') {
                 $proxy[] = Clash::buildShadowsocks($server);
                 $proxies[] = $server['name'];
@@ -146,133 +149,124 @@ trait ClientConfig
             $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies ?? []);
         }
 
-        return str_replace('$app_name', sysConfig('website_name'), Yaml::dump($config));
+        array_unshift($config['rules'], 'DOMAIN,'.$_SERVER['HTTP_HOST'].',DIRECT'); // Set current sub-domain to be direct
+
+        return str_replace('$app_name', $webName, Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE));
     }
 
-    private function surfboard(User $user, array $servers = [])
+    private function surfboard()
     {
-        $proxies = '';
-        $proxyGroup = '';
-
-        foreach ($servers as $server) {
-            if ($server['type'] === 'shadowsocks') {
-                $proxies .= Surfboard::buildShadowsocks($server);
-                $proxyGroup .= $server['name'].', ';
-            }
-            if ($server['type'] === 'v2ray') {
-                $proxies .= Surfboard::buildVmess($server);
-                $proxyGroup .= $server['name'].', ';
-            }
-        }
-
         $defaultConfig = base_path().'/resources/rules/default.surfboard.conf';
         $customConfig = base_path().'/resources/rules/custom.surfboard.conf';
-        if (File::exists($customConfig)) {
-            $config = file_get_contents($customConfig);
-        } else {
-            $config = file_get_contents($defaultConfig);
-        }
 
-        // Subscription link
-        $subsURL = route('sub', $user->subscribe->code);
-
-        return str_replace(['$subs_link', '$proxies', '$proxy_group'], [$subsURL, $proxies, rtrim($proxyGroup, ', ')], $config);
+        return $this->sugerLike($customConfig, $defaultConfig);
     }
 
-    private function surge(string $target, User $user, array $servers = [])
+    private function surge(string $target)
     {
-        $proxies = '';
-        $proxyGroup = '';
-
-        foreach ($servers as $server) {
-            if ($server['type'] === 'shadowsocks') {
-                $proxies .= Surge::buildShadowsocks($server);
-                $proxyGroup .= $server['name'].', ';
-            }
-            if ($server['type'] === 'v2ray') {
-                $proxies .= Surge::buildVmess($server);
-                $proxyGroup .= $server['name'].', ';
-            }
-            if ($server['type'] === 'trojan') {
-                $proxies .= Surge::buildTrojan($server);
-                $proxyGroup .= $server['name'].', ';
-            }
-        }
-
-        if (str_contains($target, 'list')) {
-            return $proxies;
-        }
-
         $defaultConfig = base_path().'/resources/rules/default.surge.conf';
         $customConfig = base_path().'/resources/rules/custom.surge.conf';
-        if (File::exists($customConfig)) {
-            $config = file_get_contents($customConfig);
-        } else {
-            $config = file_get_contents($defaultConfig);
-        }
-
-        // Subscription link
-        $subsURL = route('sub', $user->subscribe->code);
 
-        return str_replace(['$subs_link', '$proxies', '$proxy_group'], [$subsURL, $proxies, rtrim($proxyGroup, ', ')], $config);
+        return $this->sugerLike($customConfig, $defaultConfig, $target);
     }
 
-    private function shadowrocket(User $user, array $servers = []): string
+    private function shadowrocket(): string
     {
         //display remaining traffic and expire date
         $uri = '';
+        $user = $this->getUser();
         if (sysConfig('is_custom_subscribe')) {
             $upload = flowAutoShow($user->u);
             $download = flowAutoShow($user->d);
             $totalTraffic = flowAutoShow($user->transfer_enable);
-            $uri = "STATUS=📤:{$upload}📥:{$download}⏳:{$totalTraffic}📅:{$user->expiration_date}\r\n";
+            $uri = "STATUS=📤:{$upload}📥:{$download}⏳:{$totalTraffic}📅:$user->expiration_date\r\n";
         }
-        $uri .= $this->origin($servers, false);
+        $uri .= $this->origin(false);
 
         return base64_encode($uri);
     }
 
-    private function v2rayN(User $user, array $servers)
+    private function v2rayN()
     {
         $uri = '';
+        $user = $this->getUser();
         if (sysConfig('is_custom_subscribe')) {
             $text = '';
             if ($user->expiration_date > date('Y-m-d')) {
                 if ($user->transfer_enable === 0) {
-                    $text .= '剩余流量:0';
+                    $text .= trans('user.account.remain').': 0';
                 } else {
-                    $text .= '剩余流量:'.flowAutoShow($user->transfer_enable);
+                    $text .= trans('user.account.remain').': '.flowAutoShow($user->transfer_enable);
                 }
-                $text .= ', 过期时间:'.$user->expiration_date;
+                $text .= ', '.trans('model.user.expired_date').": $user->expiration_date";
             } else {
-                $text .= '账户已过期,请续费后使用';
+                $text .= trans('reason.user.account.reason.expired');
             }
             $uri .= $this->failedProxyReturn($text, 2);
         }
 
-        foreach ($servers as $server) {
-            if ($server['type'] === 'shadowsocksr') {
-                $uri .= V2rayN::buildShadowsocksr($server);
-            }
-            if ($server['type'] === 'v2ray') {
-                $uri .= V2rayN::buildVmess($server);
-            }
-            if ($server['type'] === 'trojan') {
-                $uri .= V2rayN::buildTrojan($server);
+        return $uri.$this->origin();
+    }
+
+    private function shaodowsocksSIP008(): string
+    {
+        foreach ($this->getServers() as $server) {
+            if ($server['type'] === 'shadowsocks') {
+                $configs[] = URLSchemes::buildShadowsocksSIP008($server);
             }
         }
 
-        return base64_encode($uri);
+        return json_encode(['version' => 1, 'remark' => sysConfig('website_name'), 'servers' => $configs ?? []], JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
     }
 
-    private function shaodowsocksSIP008(array $servers): string
+    /**
+     * @param  string  $customConfig
+     * @param  string  $defaultConfig
+     * @param  string  $target
+     * @return array|false|string|string[]
+     */
+    private function sugerLike(string $customConfig, string $defaultConfig, string $target = '')
     {
-        foreach ($servers as $server) {
+        if (File::exists($customConfig)) {
+            $config = file_get_contents($customConfig);
+        } else {
+            $config = file_get_contents($defaultConfig);
+        }
+
+        $proxies = '';
+        $proxyGroup = '';
+        $user = $this->getUser();
+        $webName = sysConfig('website_name');
+        header("content-disposition:attachment;filename*=UTF-8''".rawurlencode($webName).'.conf');
+        foreach ($this->getServers() as $server) {
             if ($server['type'] === 'shadowsocks') {
-                $configs[] = URLSchemes::buildShadowsocksSIP008($server);
+                $proxies .= Surge::buildShadowsocks($server);
+                $proxyGroup .= $server['name'].', ';
+            }
+            if ($server['type'] === 'v2ray') {
+                $proxies .= Surge::buildVmess($server);
+                $proxyGroup .= $server['name'].', ';
+            }
+            if ($server['type'] === 'trojan') {
+                $proxies .= Surge::buildTrojan($server);
+                $proxyGroup .= $server['name'].', ';
             }
         }
 
-        return json_encode(['version' => 1, 'remark' => sysConfig('website_name'), 'servers' => $configs ?? []], JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
+        if (str_contains($target, 'list')) {
+            return $proxies;
+        }
+
+        if (sysConfig('is_custom_subscribe')) {
+            $upload = flowAutoShow($user->u);
+            $download = flowAutoShow($user->d);
+            $totalTraffic = flowAutoShow($user->transfer_enable);
+            $subscribeInfo = "title=$webName".trans('user.subscribe.info.title').', content='.trans('user.subscribe.info.upload').": $upload\\n".trans('user.subscribe.info.download').": $download\\n".trans('user.subscribe.info.total').": $totalTraffic\\n".trans('model.user.expired_date').": $user->expired_at";
+            $config = str_replace('$subscribe_info', $subscribeInfo, $config);
+        }
+
+        return str_replace(['$subs_link', '$subs_domain', '$proxies', '$proxy_group'],
+            [route('sub', $user->subscribe->code), $_SERVER['HTTP_HOST'], $proxies, rtrim($proxyGroup, ', ')],
+            $config);
     }
 }

+ 6 - 6
app/Http/Controllers/UserController.php

@@ -342,10 +342,10 @@ class UserController extends Controller
                 // 通知相关管理员
                 Notification::send(User::find(1), new TicketReplied($reply, route('admin.ticket.edit', $ticket)));
 
-                return Response::json(['status' => 'success', 'message' => trans('user.ticket.reply').trans('common.success')]);
+                return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.ticket.reply')])]);
             }
 
-            return Response::json(['status' => 'fail', 'message' => trans('user.ticket.reply').trans('common.failed')]);
+            return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('user.ticket.reply')])]);
         }
 
         return view('user.replyTicket', [
@@ -479,13 +479,13 @@ class UserController extends Controller
 
             DB::commit();
 
-            return Response::json(['status' => 'success', 'message' => trans('common.replace').trans('common.success')]);
+            return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.replace')])]);
         } catch (Exception $e) {
             DB::rollBack();
 
             Log::error(trans('user.subscribe.error').':'.$e->getMessage());
 
-            return Response::json(['status' => 'fail', 'message' => trans('common.replace').trans('common.failed').$e->getMessage()]);
+            return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.replace')]).$e->getMessage()]);
         }
     }
 
@@ -518,10 +518,10 @@ class UserController extends Controller
         }
 
         if ((new CouponService($request->input('coupon_sn')))->charge()) {
-            return Response::json(['status' => 'success', 'message' => trans('user.recharge').trans('common.success')]);
+            return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.recharge')])]);
         }
 
-        return Response::json(['status' => 'fail', 'message' => trans('user.recharge').trans('common.failed')]);
+        return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('user.recharge')])]);
     }
 
     public function switchCurrency(string $code)// 切换语言

+ 1 - 1
app/Models/Order.php

@@ -177,7 +177,7 @@ class Order extends Model
         return [
             0 => trans('common.payment.credit'),
             1 => trans('common.payment.alipay'),
-            2 => 'QQ',
+            2 => trans('common.payment.qq'),
             3 => trans('common.payment.wechat'),
             4 => trans('common.payment.crypto'),
             5 => 'PayPal',

+ 2 - 2
app/Models/Payment.php

@@ -65,10 +65,10 @@ class Payment extends Model
     {
         switch ($this->attributes['status']) {
             case -1:
-                $status_label = trans('common.payment.status.fail');
+                $status_label = trans('common.failed_item', ['attribute' => trans('user.pay')]);
                 break;
             case 1:
-                $status_label = trans('common.payment.status.success');
+                $status_label = trans('common.success_item', ['attribute' => trans('user.pay')]);
                 break;
             case 0:
             default:

+ 17 - 2
app/Services/ProxyService.php

@@ -14,6 +14,7 @@ class ProxyService extends BaseService
     use ClientConfig;
 
     private static $user;
+    private static $servers;
 
     public function __construct()
     {
@@ -31,6 +32,11 @@ class ProxyService extends BaseService
         self::$user = $user;
     }
 
+    public function getServers()
+    {
+        return self::$servers;
+    }
+
     public function getProxyText($target, $type = null)
     {
         $servers = $this->getNodeList($type);
@@ -47,7 +53,9 @@ class ProxyService extends BaseService
             $servers = Arr::random($servers, $max);
         }
 
-        return $this->clientConfig($servers, $target);
+        $this->setServers($servers);
+
+        return $this->clientConfig($target);
     }
 
     public function getNodeList($type = null, $isConfig = true)
@@ -186,7 +194,9 @@ class ProxyService extends BaseService
             return null;
         }
 
-        return $this->clientConfig($servers, $target);
+        $this->setServers($servers);
+
+        return $this->clientConfig($target);
     }
 
     public function getUserProxyConfig(array $server, bool $is_url): ?string // 用户显示用代理信息
@@ -211,4 +221,9 @@ class ProxyService extends BaseService
 
         return $data;
     }
+
+    private function setServers(array $servers)
+    {
+        self::$servers = $servers;
+    }
 }

+ 3 - 3
resources/lang/en/admin.php

@@ -521,7 +521,7 @@ return [
         'is_captcha'                    => 'Captcha',
         'is_checkin'                    => 'Check-in Reward',
         'is_clear_log'                  => 'Clean Logs',
-        'is_custom_subscribe'           => 'Various Subscriptions',
+        'is_custom_subscribe'           => 'Advanced Subscription',
         'is_email_filtering'            => 'Email Filtering',
         'is_forbid_robot'               => 'Forbid Bots Access',
         'is_free_code'                  => 'Free Invitation Code',
@@ -610,7 +610,6 @@ return [
         'wechat_qrcode'                 => 'WeChat QrCode',
         'wechat_secret'                 => 'Enterprise WeChat Secret',
         'wechat_token'                  => 'Enterprise WeChat Token',
-
         'hint'           => [
             'account_expire_notification'   => 'Notify users that their accounts are about to expire',
             'active_times'                  => 'The number of times a user can activate an account via email within 1 day',
@@ -749,7 +748,7 @@ return [
             ],
         ],
         'notification'   => [
-            'channel' => [
+            'channel'   => [
                 'telegram'   => 'Telegram',
                 'wechat'     => 'Enterprise WeChat',
                 'dingtalk'   => 'DingTalk',
@@ -762,6 +761,7 @@ return [
                 'tg_chat'    => 'TG Chat',
                 'site'       => 'Site Popup',
             ],
+            'send_test' => 'Send Test Message',
         ],
         'forbid'         => [
             'mainland' => 'Forbid Chinese Mainland Access',

+ 1 - 0
resources/lang/en/auth.php

@@ -95,4 +95,5 @@ return [
     'request'         => 'Request',
     'throttle'        => 'Too many login attempts. Please try again in :seconds seconds.',
     'tos'             => 'Terms of Service',
+    'one-click_login' => 'One-Click Login',
 ];

+ 4 - 3
resources/lang/en/common.php

@@ -41,7 +41,9 @@ return [
     'goto'            => 'Goto',
     'warning'         => 'Warning',
     'success'         => 'Successfully',
+    'success_item'    => 'Successful :attribute',
     'failed'          => 'Failed',
+    'failed_item'     => ':attribute Failed',
     'update'          => 'Update',
     'update_action'   => 'Update :action',
     'none'            => 'None',
@@ -78,14 +80,13 @@ return [
     'unlimited'       => 'Unlimited',
     'payment'         => [
         'credit' => 'Balance',
-        'wechat' => 'WeChat',
         'alipay' => 'Alipay',
+        'qq'     => 'QQ Wallet',
+        'wechat' => 'WeChat Pay ',
         'crypto' => 'Crypto',
         'manual' => 'Manual Payment',
         'status' => [
             'wait'    => 'Awaiting payment',
-            'fail'    => 'Payment Failed',
-            'success' => 'Payment successful',
         ],
     ],
     'order'           => [

+ 1 - 1
resources/lang/en/errors.php

@@ -22,7 +22,7 @@ return [
         'unknown'      => 'Unknown subscribe URL! Please get a new one!',
         'sub_baned'    => 'Subscribe banned! Visit the web for detail',
         'user'         => 'Wrong URL, Account not exist!',
-        'user_disable' => 'Account Banned!',
+        'user_disable' => 'Account Disabled! Contact Support!',
         'baned_until'  => 'Account has been banned until :time, Please wait to unlock!',
         'out'          => 'OUT OF DATA! Please consider to purchase new data or reset it!',
         'expired'      => 'Account Expired! Please renew your purchase!',

+ 1 - 1
resources/lang/en/model.php

@@ -36,7 +36,7 @@ return [
         'sort'        => 'Priority',
         'description' => 'Description',
         'type'        => 'Type',
-        'level'       => 'Rank',
+        'level'       => 'Level',
     ],
     'country'          => [
         'code' => 'ISO Territory Code',

+ 21 - 0
resources/lang/en/user.php

@@ -181,6 +181,12 @@ return [
         'v2ray_only'       => 'Subscribe V2Ray Only',
         'trojan_only'      => 'Subscribe Trojan Only',
         'error'            => 'Exchange Link Error',
+        'info'             => [
+            'title'    => 'Account Summary [Not Live]',
+            'upload'   => 'Upload',
+            'download' => 'Download',
+            'total'    => 'Plan Traffic',
+        ],
     ],
     'ticket'              => [
         'attribute'           => 'Ticket',
@@ -212,4 +218,19 @@ return [
         'title' => 'Knowledge Base',
         'basic' => 'Basic',
     ],
+    'manual'              => [
+        'red_packet'     => 'Alipay red packet',
+        'hint'           => 'After scanning the code to pay, please continue to press 👇[Next]. After pressing 👇[Submit], the manual payment will be reviewed by the administrator!',
+        'step_1'         => 'Information',
+        'step_1_title'   => 'How to use manual payment correctly',
+        'step_2'         => 'Pay',
+        'step_2_title'   => 'Get the payment QR code and make payment',
+        'step_3'         => 'Complete',
+        'step_3_title'   => 'Waiting for payment to be manually confirmed',
+        'remark'         => 'Remark Username',
+        'remark_content' => 'Fill in the account used for login to speed up the review of the payment!',
+        'payment_hint'   => 'When you pay, please pay the corresponding amount',
+        'pre'            => 'Previous',
+        'next'           => 'Next',
+    ],
 ];

+ 2 - 2
resources/lang/ja/admin.php

@@ -611,7 +611,6 @@ return [
         'wechat_qrcode'                 => 'やみのQRコード',
         'wechat_secret'                 => 'WeChat アプリキー',
         'wechat_token'                  => 'WeChat AppEN',
-
         'hint'           => [
             'account_expire_notification'   => 'ユーザーに通知して締め切られます',
             'active_times'                  => '24時間、メールからアカウントを使用した回数',
@@ -751,7 +750,7 @@ return [
             ],
         ],
         'notification'   => [
-            'channel' => [
+            'channel'   => [
                 'telegram'   => 'TGテレックス',
                 'wechat'     => 'マイクロ信企業',
                 'dingtalk'   => 'ピン留め',
@@ -764,6 +763,7 @@ return [
                 'tg_chat'    => 'TGジャム',
                 'site'       => '通知',
             ],
+            'send_test' => 'テストメールの送信',
         ],
         'forbid'         => [
             'mainland' => '連合の排除',

+ 1 - 0
resources/lang/ja/auth.php

@@ -94,4 +94,5 @@ return [
     'request'         => '取込',
     'throttle'        => 'ログインの試行回数が多すぎます。:seconds 秒後にお試しください。',
     'tos'             => '使用条件',
+    'one-click_login' => 'ワンタッチログイン',
 ];

+ 4 - 3
resources/lang/ja/common.php

@@ -41,7 +41,9 @@ return [
     'goto'            => 'ホット',
     'warning'         => 'アラート',
     'success'         => '成功しました。',
+    'success_item'    => ':attribute にして下さい。',
     'failed'          => '失敗',
+    'failed_item'     => ':attribute は不正です。',
     'update'          => 'より新しい',
     'update_action'   => '更新:action',
     'none'            => 'いいえ',
@@ -78,14 +80,13 @@ return [
     'unlimited'       => '無制限',
     'payment'         => [
         'credit' => '残高',
-        'wechat' => 'マイクロレター',
         'alipay' => 'アリペイ',
+        'qq'     => 'QQウォレット',
+        'wechat' => 'WeChat 支払う',
         'crypto' => 'バーチャル通貨',
         'manual' => '自動決済',
         'status' => [
             'wait'    => '未支払',
-            'fail'    => '支払いに失敗しました',
-            'success' => 'お支払い完了',
         ],
     ],
     'order'           => [

+ 21 - 0
resources/lang/ja/user.php

@@ -181,6 +181,12 @@ return [
         'v2ray_only'       => 'V2Ray のみ購読する',
         'trojan_only'      => 'Trojan のみ登録',
         'error'            => '例外',
+        'info'             => [
+            'title'    => 'アカウント概要 [非实时]',
+            'upload'   => 'アップロードデータ',
+            'download' => '通信量のダウンロード',
+            'total'    => 'パックトラフィック',
+        ],
     ],
     'ticket'              => [
         'attribute'           => 'チケット',
@@ -212,4 +218,19 @@ return [
         'title' => 'コンセンサス',
         'basic' => '親しくさ',
     ],
+    'manual'              => [
+        'red_packet'     => 'PayPalギフト',
+        'hint'           => 'コードを評価した後、👇(次へ)をクリックして「:backhand_index_hinting_down:」までお支払いを完了してください。',
+        'step_1'         => '判断',
+        'step_1_title'   => '適切に人工的な決済方法',
+        'step_2'         => 'お支払い',
+        'step_2_title'   => 'お支払いに QR コードを取得してください。',
+        'step_3'         => '完了',
+        'step_3_title'   => '保留中の支払いが承認されるまでお待ちください',
+        'remark'         => '口座番号',
+        'remark_content' => 'ログインフォームに残っているアカウント。これは手動で確認することができます。',
+        'payment_hint'   => 'お支払いで、金額に対応します(ほとんど払えない場合)',
+        'pre'            => '戻る',
+        'next'           => '次へ',
+    ],
 ];

+ 3 - 3
resources/lang/ko/admin.php

@@ -535,7 +535,7 @@ return [
         'is_WeChatPay'                  => '微信支付',
         'iYuu_token'                    => 'IYUU令牌',
         'maintenance_content'           => '维护介绍内容',
-        'maintenance_mode'              => '维护模式',
+        'maintenance_mode'              => 'Maintenance Mode',
         'maintenance_time'              => '维护结束时间',
         'min_port'                      => '端口范围',
         'min_rand_traffic'              => '流量范围',
@@ -610,7 +610,6 @@ return [
         'wechat_qrcode'                 => '微 信二维码',
         'wechat_secret'                 => '微信企业应用密钥',
         'wechat_token'                  => '微信企业应用TOKEN',
-
         'hint'           => [
             'account_expire_notification'   => '通知用户账号即将到期',
             'active_times'                  => '24小时内可以通过邮件激活账号次数',
@@ -749,7 +748,7 @@ return [
             ],
         ],
         'notification'   => [
-            'channel' => [
+            'channel'   => [
                 'telegram'   => 'TG电报',
                 'wechat'     => '微信企业',
                 'dingtalk'   => '钉钉',
@@ -762,6 +761,7 @@ return [
                 'tg_chat'    => 'TG酱',
                 'site'       => '站内通知',
             ],
+            'send_test' => '发送测试消息',
         ],
         'forbid'         => [
             'mainland' => '阻拦大陆',

+ 1 - 0
resources/lang/ko/auth.php

@@ -94,4 +94,5 @@ return [
     'request'         => '획득',
     'throttle'        => '너무 많은 로그인을 시도하였습니다. :seconds 초 후에 다시 시도하십시오.',
     'tos'             => '이용 약관',
+    'one-click_login' => '一键登录',
 ];

+ 5 - 4
resources/lang/ko/common.php

@@ -41,7 +41,9 @@ return [
     'goto'            => '이전',
     'warning'         => '경고',
     'success'         => '성공',
+    'success_item'    => ':attribute成功',
     'failed'          => '실패',
+    'failed_item'     => ':attribute失败',
     'update'          => '갱신',
     'update_action'   => '갱신:action',
     'none'            => '없음',
@@ -78,14 +80,13 @@ return [
     'unlimited'       => '无限制',
     'payment'         => [
         'credit' => '余额',
-        'wechat' => '微信',
         'alipay' => '支付宝',
+        'qq'     => 'QQ钱包',
+        'wechat' => '微信支付',
         'crypto' => '虚拟货币',
         'manual' => '人工支付',
         'status' => [
             'wait'    => '待支付',
-            'fail'    => '支付失败',
-            'success' => '支付成功',
         ],
     ],
     'order'           => [
@@ -140,7 +141,7 @@ return [
     'import'          => '导 入',
     'or'              => '或',
     'more'            => '더 보기',
-    'to'              => '',
+    'to'              => '',
     'to_be_send'      => '待发送',
     'developing'      => '开发中!敬请期待',
 ];

+ 21 - 0
resources/lang/ko/user.php

@@ -181,6 +181,12 @@ return [
         'v2ray_only'       => 'V2Ray 만 구독',
         'trojan_only'      => 'Trojan 만 구독',
         'error'            => '구독 주소 변경 오류',
+        'info'             => [
+            'title'    => '账号摘要 [非实时]',
+            'upload'   => '上载流量',
+            'download' => '下载流量',
+            'total'    => '套餐流量',
+        ],
     ],
     'ticket'              => [
         'attribute'           => '문의',
@@ -212,4 +218,19 @@ return [
         'title' => '知 识 库',
         'basic' => '基 础',
     ],
+    'manual'              => [
+        'red_packet'     => '支付宝领红包',
+        'hint'           => '扫码支付后, 请继续点击👇【下一步】,直到👇【提 交】才算正式支付完成!!!',
+        'step_1'         => '须知',
+        'step_1_title'   => '如何正确人工支付',
+        'step_2'         => '결제',
+        'step_2_title'   => '获取支付二维码,进行支付',
+        'step_3'         => '完成',
+        'step_3_title'   => '等待支付被人工核对',
+        'remark'         => '备注账号',
+        'remark_content' => '填入登录使用的账号,在人工核对中可以对号审核!',
+        'payment_hint'   => '支付时,请充值对应金额(多不退,少要补)',
+        'pre'            => '上一步',
+        'next'           => '下一步',
+    ],
 ];

+ 5 - 5
resources/lang/vi/admin.php

@@ -535,7 +535,7 @@ return [
         'is_WeChatPay'                  => '微信支付',
         'iYuu_token'                    => 'IYUU令牌',
         'maintenance_content'           => '维护介绍内容',
-        'maintenance_mode'              => '维护模式',
+        'maintenance_mode'              => 'Trạng Thái Bảo Trì',
         'maintenance_time'              => '维护结束时间',
         'min_port'                      => '端口范围',
         'min_rand_traffic'              => '流量范围',
@@ -544,7 +544,7 @@ return [
         'node_offline_notification'     => '节点离线提醒',
         'oauth_path'                    => '第三方登录平台',
         'offline_check_times'           => '离线提醒次数',
-        'password_reset_notification'   => '重置密码',
+        'password_reset_notification'   => 'Đặt Lại Mật Khẩu',
         'paybeaver_app_id'              => 'App ID',
         'paybeaver_app_secret'          => 'App Secret',
         'payjs_key'                     => '通信密钥',
@@ -610,7 +610,6 @@ return [
         'wechat_qrcode'                 => '微 信二维码',
         'wechat_secret'                 => '微信企业应用密钥',
         'wechat_token'                  => '微信企业应用TOKEN',
-
         'hint'           => [
             'account_expire_notification'   => '通知用户账号即将到期',
             'active_times'                  => '24小时内可以通过邮件激活账号次数',
@@ -749,11 +748,11 @@ return [
             ],
         ],
         'notification'   => [
-            'channel' => [
+            'channel'   => [
                 'telegram'   => 'TG电报',
                 'wechat'     => '微信企业',
                 'dingtalk'   => '钉钉',
-                'email'      => '邮箱',
+                'email'      => 'email',
                 'bark'       => 'Bark',
                 'serverchan' => 'ServerChan',
                 'pushdeer'   => 'PushDeer',
@@ -762,6 +761,7 @@ return [
                 'tg_chat'    => 'TG酱',
                 'site'       => '站内通知',
             ],
+            'send_test' => '发送测试消息',
         ],
         'forbid'         => [
             'mainland' => '阻拦大陆',

+ 4 - 3
resources/lang/vi/auth.php

@@ -62,11 +62,11 @@ return [
     ],
     'optional'        => '可选',
     'password'        => [
-        'forget'   => '忘记密码?',
+        'forget'   => 'Quên Mật Khẩu?',
         'new'      => '输入新密码',
         'original' => '原密码',
         'reset'    => [
-            'attribute' => '重置密码',
+            'attribute' => 'Đặt Lại Mật Khẩu',
             'error'     => [
                 'disabled' => '本站关闭了密码重置子系统,有事请联系 :email ',
                 'failed'   => '重设密码失败',
@@ -90,8 +90,9 @@ return [
         'promotion' => '还没有账号?请去',
         'success'   => '注册成功',
     ],
-    'remember_me'     => '记住我',
+    'remember_me'     => 'Ghi Nhớ',
     'request'         => '获 取',
     'throttle'        => 'Vượt quá số lần đăng nhập cho phép. Vui lòng thử lại sau :seconds giây.',
     'tos'             => '用户条款',
+    'one-click_login' => '一键登录',
 ];

+ 5 - 4
resources/lang/vi/common.php

@@ -41,7 +41,9 @@ return [
     'goto'            => '前 往',
     'warning'         => '警 告',
     'success'         => '成功',
+    'success_item'    => ':attribute成功',
     'failed'          => '失败',
+    'failed_item'     => ':attribute失败',
     'update'          => '更 新',
     'update_action'   => '更新:action',
     'none'            => '无',
@@ -78,14 +80,13 @@ return [
     'unlimited'       => '无限制',
     'payment'         => [
         'credit' => 'Số dư',
-        'wechat' => 'WeChat',
         'alipay' => '支付宝',
+        'qq'     => 'QQ钱包',
+        'wechat' => '微信支付',
         'crypto' => '虚拟货币',
         'manual' => '人工支付',
         'status' => [
             'wait'    => '待支付',
-            'fail'    => '支付失败',
-            'success' => '支付成功',
         ],
     ],
     'order'           => [
@@ -140,7 +141,7 @@ return [
     'import'          => '导 入',
     'or'              => '或',
     'more'            => '更多',
-    'to'              => '',
+    'to'              => 'tới',
     'to_be_send'      => '待发送',
     'developing'      => '开发中!敬请期待',
 ];

+ 21 - 0
resources/lang/vi/user.php

@@ -181,6 +181,12 @@ return [
         'v2ray_only'       => '只订阅V2Ray',
         'trojan_only'      => '只订阅Trojan',
         'error'            => '更换订阅地址异常',
+        'info'             => [
+            'title'    => '账号摘要 [非实时]',
+            'upload'   => '上载流量',
+            'download' => '下载流量',
+            'total'    => '套餐流量',
+        ],
     ],
     'ticket'              => [
         'attribute'           => '工单',
@@ -212,4 +218,19 @@ return [
         'title' => '知 识 库',
         'basic' => '基 础',
     ],
+    'manual'              => [
+        'red_packet'     => '支付宝领红包',
+        'hint'           => '扫码支付后, 请继续点击👇【下一步】,直到👇【提 交】才算正式支付完成!!!',
+        'step_1'         => '须知',
+        'step_1_title'   => '如何正确人工支付',
+        'step_2'         => '支付',
+        'step_2_title'   => '获取支付二维码,进行支付',
+        'step_3'         => '完成',
+        'step_3_title'   => '等待支付被人工核对',
+        'remark'         => '备注账号',
+        'remark_content' => '填入登录使用的账号,在人工核对中可以对号审核!',
+        'payment_hint'   => '支付时,请充值对应金额(多不退,少要补)',
+        'pre'            => '上一步',
+        'next'           => '下一步',
+    ],
 ];

+ 2 - 2
resources/lang/zh_CN/admin.php

@@ -610,7 +610,6 @@ return [
         'wechat_qrcode'                 => '微 信二维码',
         'wechat_secret'                 => '微信企业应用密钥',
         'wechat_token'                  => '微信企业应用TOKEN',
-
         'hint'           => [
             'account_expire_notification'   => '通知用户账号即将到期',
             'active_times'                  => '24小时内可以通过邮件激活账号次数',
@@ -749,7 +748,7 @@ return [
             ],
         ],
         'notification'   => [
-            'channel' => [
+            'channel'   => [
                 'telegram'   => 'TG电报',
                 'wechat'     => '微信企业',
                 'dingtalk'   => '钉钉',
@@ -762,6 +761,7 @@ return [
                 'tg_chat'    => 'TG酱',
                 'site'       => '站内通知',
             ],
+            'send_test' => '发送测试消息',
         ],
         'forbid'         => [
             'mainland' => '阻拦大陆',

+ 1 - 0
resources/lang/zh_CN/auth.php

@@ -94,4 +94,5 @@ return [
     'request'         => '获 取',
     'throttle'        => '您尝试的登录次数过多,请 :seconds 秒后再试。',
     'tos'             => '用户条款',
+    'one-click_login' => '一键登录',
 ];

+ 4 - 3
resources/lang/zh_CN/common.php

@@ -41,7 +41,9 @@ return [
     'goto'            => '前 往',
     'warning'         => '警 告',
     'success'         => '成功',
+    'success_item'    => ':attribute成功',
     'failed'          => '失败',
+    'failed_item'     => ':attribute失败',
     'update'          => '更 新',
     'update_action'   => '更新:action',
     'none'            => '无',
@@ -78,14 +80,13 @@ return [
     'unlimited'       => '无限制',
     'payment'         => [
         'credit' => '余额',
-        'wechat' => '微信',
         'alipay' => '支付宝',
+        'qq'     => 'QQ钱包',
+        'wechat' => '微信支付',
         'crypto' => '虚拟货币',
         'manual' => '人工支付',
         'status' => [
             'wait'    => '待支付',
-            'fail'    => '支付失败',
-            'success' => '支付成功',
         ],
     ],
     'order'           => [

+ 21 - 0
resources/lang/zh_CN/user.php

@@ -181,6 +181,12 @@ return [
         'v2ray_only'       => '只订阅V2Ray',
         'trojan_only'      => '只订阅Trojan',
         'error'            => '更换订阅地址异常',
+        'info'             => [
+            'title'    => '账号摘要 [非实时]',
+            'upload'   => '上载流量',
+            'download' => '下载流量',
+            'total'    => '套餐流量',
+        ],
     ],
     'ticket'              => [
         'attribute'           => '工单',
@@ -212,4 +218,19 @@ return [
         'title' => '知 识 库',
         'basic' => '基 础',
     ],
+    'manual'              => [
+        'red_packet'     => '支付宝领红包',
+        'hint'           => '扫码支付后, 请继续点击👇【下一步】,直到👇【提 交】才算正式支付完成!!!',
+        'step_1'         => '须知',
+        'step_1_title'   => '如何正确人工支付',
+        'step_2'         => '支付',
+        'step_2_title'   => '获取支付二维码,进行支付',
+        'step_3'         => '完成',
+        'step_3_title'   => '等待支付被人工核对',
+        'remark'         => '备注账号',
+        'remark_content' => '填入登录使用的账号,在人工核对中可以对号审核!',
+        'payment_hint'   => '支付时,请充值对应金额(多不退,少要补)',
+        'pre'            => '上一步',
+        'next'           => '下一步',
+    ],
 ];

+ 37 - 9
resources/rules/default.clash.yaml

@@ -17,15 +17,17 @@ dns:
   default-nameserver:
     - 223.5.5.5
     - 119.29.29.29
-  enhanced-mode: redir-host
+  enhanced-mode: fake-ip
   fake-ip-range: 198.18.0.1/16
   use-hosts: true
   nameserver:
     - https://doh.pub/dns-query
+    - https://dns.alidns.com/dns-query
   fallback:
-    - tls://1.0.0.1:853
-    - https://cloudflare-dns.com/dns-query
-    - https://dns.google/dns-query
+    - https://doh.dns.sb/dns-query
+    - https://dns.cloudflare.com/dns-query
+    - https://dns.twnic.tw/dns-query
+    - tls://8.8.4.4:853
   fallback-filter:
     geoip: true
     ipcidr:
@@ -43,6 +45,10 @@ rules:
   # 自定义规则
   ## 您可以在此处插入您补充的自定义规则(请注意保持缩进)
 
+  # Google 中国服务
+  - DOMAIN-SUFFIX,services.googleapis.cn,$app_name
+  - DOMAIN-SUFFIX,xn--ngstr-lra8j.com,$app_name
+
   # Apple
   - DOMAIN,safebrowsing.urlsec.qq.com,DIRECT # 如果您并不信任此服务提供商或防止其下载消耗过多带宽资源,可以进入 Safari 设置,关闭 Fraudulent Website Warning 功能,并使用 REJECT 策略。
   - DOMAIN,safebrowsing.googleapis.com,DIRECT # 如果您并不信任此服务提供商或防止其下载消耗过多带宽资源,可以进入 Safari 设置,关闭 Fraudulent Website Warning 功能,并使用 REJECT 策略。
@@ -79,9 +85,6 @@ rules:
   # - DOMAIN,e.crashlytics.com,REJECT //注释此选项有助于大多数App开发者分析崩溃信息;如果您拒绝一切崩溃数据统计、搜集,请取消 # 注释。
 
   # 国内网站
-  - DOMAIN-SUFFIX,cn,DIRECT
-  - DOMAIN-KEYWORD,-cn,DIRECT
-
   - DOMAIN-SUFFIX,126.com,DIRECT
   - DOMAIN-SUFFIX,126.net,DIRECT
   - DOMAIN-SUFFIX,127.net,DIRECT
@@ -136,7 +139,6 @@ rules:
   - DOMAIN-SUFFIX,lecloud.com,DIRECT
   - DOMAIN-SUFFIX,lemicp.com,DIRECT
   - DOMAIN-SUFFIX,licdn.com,DIRECT
-  - DOMAIN-SUFFIX,linkedin.com,DIRECT
   - DOMAIN-SUFFIX,luoo.net,DIRECT
   - DOMAIN-SUFFIX,meituan.com,DIRECT
   - DOMAIN-SUFFIX,meituan.net,DIRECT
@@ -385,6 +387,8 @@ rules:
   - DOMAIN-SUFFIX,kat.cr,$app_name
   - DOMAIN-SUFFIX,klip.me,$app_name
   - DOMAIN-SUFFIX,libsyn.com,$app_name
+  - DOMAIN-SUFFIX,linkedin.com,$app_name
+  - DOMAIN-SUFFIX,line-apps.com,$app_name
   - DOMAIN-SUFFIX,linode.com,$app_name
   - DOMAIN-SUFFIX,lithium.com,$app_name
   - DOMAIN-SUFFIX,littlehj.com,$app_name
@@ -536,6 +540,26 @@ rules:
   - IP-CIDR6,2001:b28:f23d::/48,$app_name,no-resolve
   - IP-CIDR6,2001:b28:f23f::/48,$app_name,no-resolve
 
+  # Google 中国服务 services.googleapis.cn
+  - IP-CIDR,120.232.181.162/32,$app_name,no-resolve
+  - IP-CIDR,120.241.147.226/32,$app_name,no-resolve
+  - IP-CIDR,120.253.253.226/32,$app_name,no-resolve
+  - IP-CIDR,120.253.255.162/32,$app_name,no-resolve
+  - IP-CIDR,120.253.255.34/32,$app_name,no-resolve
+  - IP-CIDR,120.253.255.98/32,$app_name,no-resolve
+  - IP-CIDR,180.163.150.162/32,$app_name,no-resolve
+  - IP-CIDR,180.163.150.34/32,$app_name,no-resolve
+  - IP-CIDR,180.163.151.162/32,$app_name,no-resolve
+  - IP-CIDR,180.163.151.34/32,$app_name,no-resolve
+  - IP-CIDR,203.208.39.0/24,$app_name,no-resolve
+  - IP-CIDR,203.208.40.0/24,$app_name,no-resolve
+  - IP-CIDR,203.208.41.0/24,$app_name,no-resolve
+  - IP-CIDR,203.208.43.0/24,$app_name,no-resolve
+  - IP-CIDR,203.208.50.0/24,$app_name,no-resolve
+  - IP-CIDR,220.181.174.162/32,$app_name,no-resolve
+  - IP-CIDR,220.181.174.226/32,$app_name,no-resolve
+  - IP-CIDR,220.181.174.34/32,$app_name,no-resolve
+
   # LAN
   - DOMAIN,injections.adguard.org,DIRECT
   - DOMAIN,local.adguard.org,DIRECT
@@ -549,6 +573,10 @@ rules:
   - IP-CIDR,224.0.0.0/4,DIRECT
   - IP-CIDR6,fe80::/10,DIRECT
 
+  # 剩余未匹配的国内网站
+  - DOMAIN-SUFFIX,cn,DIRECT
+  - DOMAIN-KEYWORD,-cn,DIRECT
+
   # 最终规则
   - GEOIP,CN,DIRECT
-  - MATCH,$app_name
+  - MATCH,$app_name

+ 96 - 63
resources/rules/default.surfboard.conf

@@ -1,13 +1,19 @@
 #!MANAGED-CONFIG $subs_link interval=43200 strict=true
+# Thanks @Hackl0us SS-Rule-Snippet
 
 [General]
 loglevel = notify
-interface = 127.0.0.1
-skip-proxy = localhost, *.local, injections.adguard.org, local.adguard.org, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32
 ipv6 = true
-dns-server = 1.2.4.8, 114.114.114.114, 223.5.5.5, 119.29.29.29
-exclude-simple-hostnames = true
-enhanced-mode-by-rule = true
+skip-proxy = localhost, *.local, injections.adguard.org, local.adguard.org, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32
+tls-provider = default
+show-error-page-for-reject = true
+dns-server = 223.6.6.6, 119.29.29.29, 119.28.28.28
+test-timeout = 5
+internet-test-url = http://bing.com
+proxy-test-url = http://www.gstatic.com/generate_204
+
+[Panel]
+SubscribeInfo = $subscribe_info, style=info
 
 # Surfboard 的服务器和策略组配置方式与 Surge 类似, 可以参考 Surge 的规则配置手册: https://manual.nssurge.com/
 
@@ -21,33 +27,25 @@ fallback = fallback, $proxy_group, url=http://www.gstatic.com/generate_204, inte
 
 [Rule]
 # 自定义规则
-## 您可以在这里插入自定义规则
+## 您可以在此处插入自定义规则
+DOMAIN-SUFFIX,tophub.today,DIRECT
+DOMAIN-SUFFIX,netmarble.com,Proxy
+DOMAIN-SUFFIX,worldflipper.jp,Proxy
+DOMAIN-SUFFIX,naver.com,Proxy
+DOMAIN-SUFFIX,smartmediarep.com,Proxy
+DOMAIN-SUFFIX,technews.tw,Proxy
 
-# Google Service
-DOMAIN-SUFFIX,googleapis.cn,Proxy
-DOMAIN-KEYWORD,ampproject,Proxy
-DOMAIN-SUFFIX,android.com,Proxy
-DOMAIN-SUFFIX,g.co,Proxy
-DOMAIN-SUFFIX,ggpht.com,Proxy
-DOMAIN-SUFFIX,goo.gl,Proxy
-DOMAIN-KEYWORD,gstatic,Proxy
-DOMAIN-SUFFIX,gvt0.com,Proxy
-DOMAIN-SUFFIX,gvt1.com,Proxy
-DOMAIN-SUFFIX,gvt2.com,Proxy
-DOMAIN-SUFFIX,gvt3.com,Proxy
-DOMAIN-SUFFIX,appspot.com,Proxy,force-remote-dns
-DOMAIN-KEYWORD,google,Proxy,force-remote-dns
+# 强制订阅域名直连
+DOMAIN,$subs_domain,DIRECT
+
+# Google 中国服务
+DOMAIN-SUFFIX,services.googleapis.cn,Proxy
+DOMAIN-SUFFIX,xn--ngstr-lra8j.com,Proxy
 
 # Apple
-DOMAIN,safebrowsing.urlsec.qq.com,DIRECT
-DOMAIN,safebrowsing.googleapis.com,DIRECT
 DOMAIN,developer.apple.com,Proxy
 DOMAIN-SUFFIX,digicert.com,Proxy
-DOMAIN,ocsp.apple.com,Proxy
-DOMAIN,ocsp.comodoca.com,Proxy
-DOMAIN,ocsp.usertrust.com,Proxy
-DOMAIN,ocsp.sectigo.com,Proxy
-DOMAIN,ocsp.verisign.net,Proxy
+USER-AGENT,com.apple.trustd*,Proxy
 DOMAIN-SUFFIX,apple-dns.net,Proxy
 DOMAIN,testflight.apple.com,Proxy
 DOMAIN,sandbox.itunes.apple.com,Proxy
@@ -55,10 +53,17 @@ DOMAIN,itunes.apple.com,Proxy
 DOMAIN-SUFFIX,apps.apple.com,Proxy
 DOMAIN-SUFFIX,blobstore.apple.com,Proxy
 DOMAIN,cvws.icloud-content.com,Proxy
+DOMAIN,safebrowsing.urlsec.qq.com,DIRECT
+DOMAIN,safebrowsing.googleapis.com,DIRECT
+USER-AGENT,com.apple.appstored*,DIRECT
+USER-AGENT,AppStore*,DIRECT
 DOMAIN-SUFFIX,mzstatic.com,DIRECT
 DOMAIN-SUFFIX,itunes.apple.com,DIRECT
 DOMAIN-SUFFIX,icloud.com,DIRECT
 DOMAIN-SUFFIX,icloud-content.com,DIRECT
+USER-AGENT,cloudd*,DIRECT
+USER-AGENT,*com.apple.WebKit*,DIRECT
+USER-AGENT,*com.apple.*,DIRECT
 DOMAIN-SUFFIX,me.com,DIRECT
 DOMAIN-SUFFIX,aaplimg.com,DIRECT
 DOMAIN-SUFFIX,cdn20.com,DIRECT
@@ -73,8 +78,8 @@ DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
 DOMAIN-SUFFIX,apple-mapkit.com,DIRECT
 
 # 国内网站
-DOMAIN-SUFFIX,cn,DIRECT
-DOMAIN-KEYWORD,-cn,DIRECT
+USER-AGENT,MicroMessenger Client*,DIRECT
+USER-AGENT,WeChat*,DIRECT
 
 DOMAIN-SUFFIX,126.com,DIRECT
 DOMAIN-SUFFIX,126.net,DIRECT
@@ -87,6 +92,7 @@ DOMAIN-SUFFIX,air-matters.com,DIRECT
 DOMAIN-SUFFIX,aixifan.com,DIRECT
 DOMAIN-KEYWORD,alicdn,DIRECT
 DOMAIN-KEYWORD,alipay,DIRECT
+DOMAIN-KEYWORD,aliyun,DIRECT
 DOMAIN-KEYWORD,taobao,DIRECT
 DOMAIN-SUFFIX,amap.com,DIRECT
 DOMAIN-SUFFIX,autonavi.com,DIRECT
@@ -115,7 +121,6 @@ DOMAIN-SUFFIX,frdic.com,DIRECT
 DOMAIN-SUFFIX,g-cores.com,DIRECT
 DOMAIN-SUFFIX,godic.net,DIRECT
 DOMAIN-SUFFIX,gtimg.com,DIRECT
-DOMAIN,cdn.hockeyapp.net,DIRECT
 DOMAIN-SUFFIX,hongxiu.com,DIRECT
 DOMAIN-SUFFIX,hxcdn.net,DIRECT
 DOMAIN-SUFFIX,iciba.com,DIRECT
@@ -130,7 +135,6 @@ DOMAIN-SUFFIX,le.com,DIRECT
 DOMAIN-SUFFIX,lecloud.com,DIRECT
 DOMAIN-SUFFIX,lemicp.com,DIRECT
 DOMAIN-SUFFIX,licdn.com,DIRECT
-DOMAIN-SUFFIX,linkedin.com,DIRECT
 DOMAIN-SUFFIX,luoo.net,DIRECT
 DOMAIN-SUFFIX,meituan.com,DIRECT
 DOMAIN-SUFFIX,meituan.net,DIRECT
@@ -177,7 +181,7 @@ DOMAIN-SUFFIX,taobao.com,DIRECT
 DOMAIN-SUFFIX,tencent.com,DIRECT
 DOMAIN-SUFFIX,tenpay.com,DIRECT
 DOMAIN-SUFFIX,tianyancha.com,DIRECT
-DOMAIN-SUFFIX,tmall.com,DIRECT
+DOMAIN-KEYWORD,.tmall.com,DIRECT
 DOMAIN-SUFFIX,tudou.com,DIRECT
 DOMAIN-SUFFIX,umetrip.com,DIRECT
 DOMAIN-SUFFIX,upaiyun.com,DIRECT
@@ -203,36 +207,36 @@ DOMAIN-SUFFIX,zhimg.com,DIRECT
 DOMAIN-SUFFIX,zimuzu.tv,DIRECT
 DOMAIN-SUFFIX,zoho.com,DIRECT
 
-# 常见广告域名屏蔽
-DOMAIN-KEYWORD,admarvel,REJECT
-DOMAIN-KEYWORD,admaster,REJECT
-DOMAIN-KEYWORD,adsage,REJECT
-DOMAIN-KEYWORD,adsmogo,REJECT
-DOMAIN-KEYWORD,adsrvmedia,REJECT
-DOMAIN-KEYWORD,adwords,REJECT
-DOMAIN-KEYWORD,adservice,REJECT
-DOMAIN-SUFFIX,appsflyer.com,REJECT
-DOMAIN-KEYWORD,domob,REJECT
-DOMAIN-SUFFIX,doubleclick.net,REJECT
-DOMAIN-KEYWORD,duomeng,REJECT
-DOMAIN-KEYWORD,dwtrack,REJECT
-DOMAIN-KEYWORD,guanggao,REJECT
-DOMAIN-KEYWORD,lianmeng,REJECT
-DOMAIN-SUFFIX,mmstat.com,REJECT
-DOMAIN-KEYWORD,mopub,REJECT
-DOMAIN-KEYWORD,omgmta,REJECT
-DOMAIN-KEYWORD,openx,REJECT
-DOMAIN-KEYWORD,partnerad,REJECT
-DOMAIN-KEYWORD,pingfore,REJECT
-DOMAIN-KEYWORD,supersonicads,REJECT
-DOMAIN-KEYWORD,uedas,REJECT
-DOMAIN-KEYWORD,umeng,REJECT
-DOMAIN-KEYWORD,usage,REJECT
-DOMAIN-SUFFIX,vungle.com,REJECT
-DOMAIN-KEYWORD,wlmonitor,REJECT
-DOMAIN-KEYWORD,zjtoolbar,REJECT
+# 常见广告
+DOMAIN-KEYWORD,admarvel,REJECT-TINYGIF
+DOMAIN-KEYWORD,admaster,REJECT-TINYGIF
+DOMAIN-KEYWORD,adsage,REJECT-TINYGIF
+DOMAIN-KEYWORD,adsmogo,REJECT-TINYGIF
+DOMAIN-KEYWORD,adsrvmedia,REJECT-TINYGIF
+DOMAIN-KEYWORD,adwords,REJECT-TINYGIF
+DOMAIN-KEYWORD,adservice,REJECT-TINYGIF
+DOMAIN-SUFFIX,appsflyer.com,REJECT-TINYGIF
+DOMAIN-KEYWORD,domob,REJECT-TINYGIF
+DOMAIN-SUFFIX,doubleclick.net,REJECT-TINYGIF
+DOMAIN-KEYWORD,duomeng,REJECT-TINYGIF
+DOMAIN-KEYWORD,dwtrack,REJECT-TINYGIF
+DOMAIN-KEYWORD,guanggao,REJECT-TINYGIF
+DOMAIN-KEYWORD,lianmeng,REJECT-TINYGIF
+DOMAIN-SUFFIX,mmstat.com,REJECT-TINYGIF
+DOMAIN-KEYWORD,mopub,REJECT-TINYGIF
+DOMAIN-KEYWORD,omgmta,REJECT-TINYGIF
+DOMAIN-KEYWORD,openx,REJECT-TINYGIF
+DOMAIN-KEYWORD,partnerad,REJECT-TINYGIF
+DOMAIN-KEYWORD,pingfore,REJECT-TINYGIF
+DOMAIN-KEYWORD,supersonicads,REJECT-TINYGIF
+DOMAIN-KEYWORD,uedas,REJECT-TINYGIF
+DOMAIN-KEYWORD,umeng,REJECT-TINYGIF
+DOMAIN-KEYWORD,usage,REJECT-TINYGIF
+DOMAIN-SUFFIX,vungle.com,REJECT-TINYGIF
+DOMAIN-KEYWORD,wlmonitor,REJECT-TINYGIF
+DOMAIN-KEYWORD,zjtoolbar,REJECT-TINYGIF
 
-# 抗 DNS 污染
+## 抗 DNS 污染
 DOMAIN-KEYWORD,amazon,Proxy
 DOMAIN-KEYWORD,google,Proxy
 DOMAIN-KEYWORD,gmail,Proxy
@@ -246,9 +250,8 @@ DOMAIN-KEYWORD,dropbox,Proxy
 DOMAIN-SUFFIX,twimg.com,Proxy
 DOMAIN-KEYWORD,blogspot,Proxy
 DOMAIN-SUFFIX,youtu.be,Proxy
-DOMAIN-KEYWORD,whatsapp,Proxy
 
-# 国外网站
+## 常见国外域名列表
 DOMAIN-SUFFIX,9to5mac.com,Proxy
 DOMAIN-SUFFIX,abpchina.org,Proxy
 DOMAIN-SUFFIX,adblockplus.org,Proxy
@@ -347,9 +350,12 @@ DOMAIN-SUFFIX,gmodules.com,Proxy
 DOMAIN-SUFFIX,godaddy.com,Proxy
 DOMAIN-SUFFIX,golang.org,Proxy
 DOMAIN-SUFFIX,gongm.in,Proxy
+DOMAIN-SUFFIX,goo.gl,Proxy
 DOMAIN-SUFFIX,goodreaders.com,Proxy
 DOMAIN-SUFFIX,goodreads.com,Proxy
 DOMAIN-SUFFIX,gravatar.com,Proxy
+DOMAIN-SUFFIX,gstatic.com,Proxy
+DOMAIN-SUFFIX,gvt0.com,Proxy
 DOMAIN-SUFFIX,hockeyapp.net,Proxy
 DOMAIN-SUFFIX,hotmail.com,Proxy
 DOMAIN-SUFFIX,icons8.com,Proxy
@@ -376,6 +382,8 @@ DOMAIN-SUFFIX,justgetflux.com,Proxy
 DOMAIN-SUFFIX,kat.cr,Proxy
 DOMAIN-SUFFIX,klip.me,Proxy
 DOMAIN-SUFFIX,libsyn.com,Proxy
+DOMAIN-SUFFIX,linkedin.com,Proxy
+DOMAIN-SUFFIX,line-apps.com,Proxy
 DOMAIN-SUFFIX,linode.com,Proxy
 DOMAIN-SUFFIX,lithium.com,Proxy
 DOMAIN-SUFFIX,littlehj.com,Proxy
@@ -518,6 +526,7 @@ DOMAIN-SUFFIX,ytimg.com,Proxy
 # Telegram
 DOMAIN-SUFFIX,telegra.ph,Proxy
 DOMAIN-SUFFIX,telegram.org,Proxy
+
 IP-CIDR,91.108.4.0/22,Proxy,no-resolve
 IP-CIDR,91.108.8.0/21,Proxy,no-resolve
 IP-CIDR,91.108.16.0/22,Proxy,no-resolve
@@ -527,6 +536,26 @@ IP-CIDR6,2001:67c:4e8::/48,Proxy,no-resolve
 IP-CIDR6,2001:b28:f23d::/48,Proxy,no-resolve
 IP-CIDR6,2001:b28:f23f::/48,Proxy,no-resolve
 
+# Google 中国服务 services.googleapis.cn
+IP-CIDR,120.232.181.162/32,Proxy,no-resolve
+IP-CIDR,120.241.147.226/32,Proxy,no-resolve
+IP-CIDR,120.253.253.226/32,Proxy,no-resolve
+IP-CIDR,120.253.255.162/32,Proxy,no-resolve
+IP-CIDR,120.253.255.34/32,Proxy,no-resolve
+IP-CIDR,120.253.255.98/32,Proxy,no-resolve
+IP-CIDR,180.163.150.162/32,Proxy,no-resolve
+IP-CIDR,180.163.150.34/32,Proxy,no-resolve
+IP-CIDR,180.163.151.162/32,Proxy,no-resolve
+IP-CIDR,180.163.151.34/32,Proxy,no-resolve
+IP-CIDR,203.208.39.0/24,Proxy,no-resolve
+IP-CIDR,203.208.40.0/24,Proxy,no-resolve
+IP-CIDR,203.208.41.0/24,Proxy,no-resolve
+IP-CIDR,203.208.43.0/24,Proxy,no-resolve
+IP-CIDR,203.208.50.0/24,Proxy,no-resolve
+IP-CIDR,220.181.174.162/32,Proxy,no-resolve
+IP-CIDR,220.181.174.226/32,Proxy,no-resolve
+IP-CIDR,220.181.174.34/32,Proxy,no-resolve
+
 # LAN
 DOMAIN-SUFFIX,local,DIRECT
 IP-CIDR,127.0.0.0/8,DIRECT
@@ -538,6 +567,10 @@ IP-CIDR,100.64.0.0/10,DIRECT
 IP-CIDR,224.0.0.0/4,DIRECT
 IP-CIDR6,fe80::/10,DIRECT
 
+# 剩余未匹配的国内网站
+DOMAIN-SUFFIX,cn,DIRECT
+DOMAIN-KEYWORD,-cn,DIRECT
+
 # 最终规则
 GEOIP,CN,DIRECT
 FINAL,Proxy

+ 532 - 10
resources/rules/default.surge.conf

@@ -1,12 +1,13 @@
 #!MANAGED-CONFIG $subs_link interval=43200 strict=true
 # Surge 的规则配置手册: https://manual.nssurge.com/
+# Thanks @Hackl0us SS-Rule-Snippet
 
 [General]
 loglevel = notify
 # 从 Surge iOS 4 / Surge Mac 3.3.0 起,工具开始支持 DoH
 doh-server = https://doh.pub/dns-query
 # https://dns.alidns.com/dns-query, https://13800000000.rubyfish.cn/, https://dns.google/dns-query
-dns-server = 223.5.5.5, 114.114.114.114
+dns-server = 223.5.5.5, 8.8.8.8
 tun-excluded-routes = 0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 255.255.255.255/32
 skip-proxy = localhost, *.local, injections.adguard.org, local.adguard.org, captive.apple.com, guzzoni.apple.com, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32
 
@@ -27,6 +28,7 @@ ipv6 = true
 
 test-timeout = 4
 proxy-test-url = http://www.gstatic.com/generate_204
+geoip-maxmind-url = https://unpkg.zhimg.com/[email protected]/Country.mmdb
 
 [Replica]
 hide-apple-request = true
@@ -34,6 +36,9 @@ hide-crashlytics-request = true
 use-keyword-filter = false
 hide-udp = false
 
+[Panel]
+SubscribeInfo = $subscribe_info, style=info
+
 # -----------------------------
 # Surge 的几种策略配置规范,请参考 https://manual.nssurge.com/policy/proxy.html
 # 不同的代理策略有*很多*可选参数,请参考上方连接的 Parameters 一段,根据需求自行添加参数。
@@ -55,19 +60,536 @@ fallback = fallback, $proxy_group, url=http://www.gstatic.com/generate_204, inte
 # 自定义规则
 ## 您可以在此处插入自定义规则
 
-# 实用规则片段集
-# RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/Apple-News.list,Proxy
-RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/Apple-proxy.list,Proxy
-RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/Apple-direct.list,DIRECT
-RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/CN.list,DIRECT
-RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/common-ad-keyword.list,REJECT-TINYGIF
-RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/Basic/foreign.list,Proxy
-RULE-SET,https://cdn.jsdelivr.net/gh/Hackl0us/SS-Rule-Snippet@master/Rulesets/Surge/App/social/Telegram.list,Proxy
+# 强制订阅域名直连
+DOMAIN,$subs_domain,DIRECT
+
+# Google 中国服务
+DOMAIN-SUFFIX,services.googleapis.cn,Proxy
+DOMAIN-SUFFIX,xn--ngstr-lra8j.com,Proxy
+
+# Apple
+DOMAIN,developer.apple.com,Proxy
+DOMAIN-SUFFIX,digicert.com,Proxy
+USER-AGENT,com.apple.trustd*,Proxy
+DOMAIN-SUFFIX,apple-dns.net,Proxy
+DOMAIN,testflight.apple.com,Proxy
+DOMAIN,sandbox.itunes.apple.com,Proxy
+DOMAIN,itunes.apple.com,Proxy
+DOMAIN-SUFFIX,apps.apple.com,Proxy
+DOMAIN-SUFFIX,blobstore.apple.com,Proxy
+DOMAIN,cvws.icloud-content.com,Proxy
+DOMAIN,safebrowsing.urlsec.qq.com,DIRECT
+DOMAIN,safebrowsing.googleapis.com,DIRECT
+USER-AGENT,com.apple.appstored*,DIRECT
+USER-AGENT,AppStore*,DIRECT
+DOMAIN-SUFFIX,mzstatic.com,DIRECT
+DOMAIN-SUFFIX,itunes.apple.com,DIRECT
+DOMAIN-SUFFIX,icloud.com,DIRECT
+DOMAIN-SUFFIX,icloud-content.com,DIRECT
+USER-AGENT,cloudd*,DIRECT
+USER-AGENT,*com.apple.WebKit*,DIRECT
+USER-AGENT,*com.apple.*,DIRECT
+DOMAIN-SUFFIX,me.com,DIRECT
+DOMAIN-SUFFIX,aaplimg.com,DIRECT
+DOMAIN-SUFFIX,cdn20.com,DIRECT
+DOMAIN-SUFFIX,cdn-apple.com,DIRECT
+DOMAIN-SUFFIX,akadns.net,DIRECT
+DOMAIN-SUFFIX,akamaiedge.net,DIRECT
+DOMAIN-SUFFIX,edgekey.net,DIRECT
+DOMAIN-SUFFIX,mwcloudcdn.com,DIRECT
+DOMAIN-SUFFIX,mwcname.com,DIRECT
+DOMAIN-SUFFIX,apple.com,DIRECT
+DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
+DOMAIN-SUFFIX,apple-mapkit.com,DIRECT
+
+# 国内网站
+USER-AGENT,MicroMessenger Client*,DIRECT
+USER-AGENT,WeChat*,DIRECT
+
+DOMAIN-SUFFIX,126.com,DIRECT
+DOMAIN-SUFFIX,126.net,DIRECT
+DOMAIN-SUFFIX,127.net,DIRECT
+DOMAIN-SUFFIX,163.com,DIRECT
+DOMAIN-SUFFIX,360buyimg.com,DIRECT
+DOMAIN-SUFFIX,36kr.com,DIRECT
+DOMAIN-SUFFIX,acfun.tv,DIRECT
+DOMAIN-SUFFIX,air-matters.com,DIRECT
+DOMAIN-SUFFIX,aixifan.com,DIRECT
+DOMAIN-KEYWORD,alicdn,DIRECT
+DOMAIN-KEYWORD,alipay,DIRECT
+DOMAIN-KEYWORD,aliyun,DIRECT
+DOMAIN-KEYWORD,taobao,DIRECT
+DOMAIN-SUFFIX,amap.com,DIRECT
+DOMAIN-SUFFIX,autonavi.com,DIRECT
+DOMAIN-KEYWORD,baidu,DIRECT
+DOMAIN-SUFFIX,bdimg.com,DIRECT
+DOMAIN-SUFFIX,bdstatic.com,DIRECT
+DOMAIN-SUFFIX,bilibili.com,DIRECT
+DOMAIN-SUFFIX,bilivideo.com,DIRECT
+DOMAIN-SUFFIX,caiyunapp.com,DIRECT
+DOMAIN-SUFFIX,clouddn.com,DIRECT
+DOMAIN-SUFFIX,cnbeta.com,DIRECT
+DOMAIN-SUFFIX,cnbetacdn.com,DIRECT
+DOMAIN-SUFFIX,cootekservice.com,DIRECT
+DOMAIN-SUFFIX,csdn.net,DIRECT
+DOMAIN-SUFFIX,ctrip.com,DIRECT
+DOMAIN-SUFFIX,dgtle.com,DIRECT
+DOMAIN-SUFFIX,dianping.com,DIRECT
+DOMAIN-SUFFIX,douban.com,DIRECT
+DOMAIN-SUFFIX,doubanio.com,DIRECT
+DOMAIN-SUFFIX,duokan.com,DIRECT
+DOMAIN-SUFFIX,easou.com,DIRECT
+DOMAIN-SUFFIX,ele.me,DIRECT
+DOMAIN-SUFFIX,feng.com,DIRECT
+DOMAIN-SUFFIX,fir.im,DIRECT
+DOMAIN-SUFFIX,frdic.com,DIRECT
+DOMAIN-SUFFIX,g-cores.com,DIRECT
+DOMAIN-SUFFIX,godic.net,DIRECT
+DOMAIN-SUFFIX,gtimg.com,DIRECT
+DOMAIN-SUFFIX,hongxiu.com,DIRECT
+DOMAIN-SUFFIX,hxcdn.net,DIRECT
+DOMAIN-SUFFIX,iciba.com,DIRECT
+DOMAIN-SUFFIX,ifeng.com,DIRECT
+DOMAIN-SUFFIX,ifengimg.com,DIRECT
+DOMAIN-SUFFIX,ipip.net,DIRECT
+DOMAIN-SUFFIX,iqiyi.com,DIRECT
+DOMAIN-SUFFIX,jd.com,DIRECT
+DOMAIN-SUFFIX,jianshu.com,DIRECT
+DOMAIN-SUFFIX,knewone.com,DIRECT
+DOMAIN-SUFFIX,le.com,DIRECT
+DOMAIN-SUFFIX,lecloud.com,DIRECT
+DOMAIN-SUFFIX,lemicp.com,DIRECT
+DOMAIN-SUFFIX,licdn.com,DIRECT
+DOMAIN-SUFFIX,luoo.net,DIRECT
+DOMAIN-SUFFIX,meituan.com,DIRECT
+DOMAIN-SUFFIX,meituan.net,DIRECT
+DOMAIN-SUFFIX,mi.com,DIRECT
+DOMAIN-SUFFIX,miaopai.com,DIRECT
+DOMAIN-SUFFIX,microsoft.com,DIRECT
+DOMAIN-SUFFIX,microsoftonline.com,DIRECT
+DOMAIN-SUFFIX,miui.com,DIRECT
+DOMAIN-SUFFIX,miwifi.com,DIRECT
+DOMAIN-SUFFIX,mob.com,DIRECT
+DOMAIN-SUFFIX,netease.com,DIRECT
+DOMAIN-SUFFIX,office.com,DIRECT
+DOMAIN-KEYWORD,officecdn,DIRECT
+DOMAIN-SUFFIX,office365.com,DIRECT
+DOMAIN-SUFFIX,oschina.net,DIRECT
+DOMAIN-SUFFIX,ppsimg.com,DIRECT
+DOMAIN-SUFFIX,pstatp.com,DIRECT
+DOMAIN-SUFFIX,qcloud.com,DIRECT
+DOMAIN-SUFFIX,qdaily.com,DIRECT
+DOMAIN-SUFFIX,qdmm.com,DIRECT
+DOMAIN-SUFFIX,qhimg.com,DIRECT
+DOMAIN-SUFFIX,qhres.com,DIRECT
+DOMAIN-SUFFIX,qidian.com,DIRECT
+DOMAIN-SUFFIX,qihucdn.com,DIRECT
+DOMAIN-SUFFIX,qiniu.com,DIRECT
+DOMAIN-SUFFIX,qiniucdn.com,DIRECT
+DOMAIN-SUFFIX,qiyipic.com,DIRECT
+DOMAIN-SUFFIX,qq.com,DIRECT
+DOMAIN-SUFFIX,qqurl.com,DIRECT
+DOMAIN-SUFFIX,rarbg.to,DIRECT
+DOMAIN-SUFFIX,ruguoapp.com,DIRECT
+DOMAIN-SUFFIX,segmentfault.com,DIRECT
+DOMAIN-SUFFIX,sinaapp.com,DIRECT
+DOMAIN-SUFFIX,smzdm.com,DIRECT
+DOMAIN-SUFFIX,snapdrop.net,DIRECT
+DOMAIN-SUFFIX,sogou.com,DIRECT
+DOMAIN-SUFFIX,sogoucdn.com,DIRECT
+DOMAIN-SUFFIX,sohu.com,DIRECT
+DOMAIN-SUFFIX,soku.com,DIRECT
+DOMAIN-SUFFIX,speedtest.net,DIRECT
+DOMAIN-SUFFIX,sspai.com,DIRECT
+DOMAIN-SUFFIX,suning.com,DIRECT
+DOMAIN-SUFFIX,taobao.com,DIRECT
+DOMAIN-SUFFIX,tencent.com,DIRECT
+DOMAIN-SUFFIX,tenpay.com,DIRECT
+DOMAIN-SUFFIX,tianyancha.com,DIRECT
+DOMAIN-KEYWORD,.tmall.com,DIRECT
+DOMAIN-SUFFIX,tudou.com,DIRECT
+DOMAIN-SUFFIX,umetrip.com,DIRECT
+DOMAIN-SUFFIX,upaiyun.com,DIRECT
+DOMAIN-SUFFIX,upyun.com,DIRECT
+DOMAIN-SUFFIX,veryzhun.com,DIRECT
+DOMAIN-SUFFIX,weather.com,DIRECT
+DOMAIN-SUFFIX,weibo.com,DIRECT
+DOMAIN-SUFFIX,xiami.com,DIRECT
+DOMAIN-SUFFIX,xiami.net,DIRECT
+DOMAIN-SUFFIX,xiaomicp.com,DIRECT
+DOMAIN-SUFFIX,ximalaya.com,DIRECT
+DOMAIN-SUFFIX,xmcdn.com,DIRECT
+DOMAIN-SUFFIX,xunlei.com,DIRECT
+DOMAIN-SUFFIX,yhd.com,DIRECT
+DOMAIN-SUFFIX,yihaodianimg.com,DIRECT
+DOMAIN-SUFFIX,yinxiang.com,DIRECT
+DOMAIN-SUFFIX,ykimg.com,DIRECT
+DOMAIN-SUFFIX,youdao.com,DIRECT
+DOMAIN-SUFFIX,youku.com,DIRECT
+DOMAIN-SUFFIX,zealer.com,DIRECT
+DOMAIN-SUFFIX,zhihu.com,DIRECT
+DOMAIN-SUFFIX,zhimg.com,DIRECT
+DOMAIN-SUFFIX,zimuzu.tv,DIRECT
+DOMAIN-SUFFIX,zoho.com,DIRECT
+
+# 常见广告
+DOMAIN-KEYWORD,admarvel,REJECT-TINYGIF
+DOMAIN-KEYWORD,admaster,REJECT-TINYGIF
+DOMAIN-KEYWORD,adsage,REJECT-TINYGIF
+DOMAIN-KEYWORD,adsmogo,REJECT-TINYGIF
+DOMAIN-KEYWORD,adsrvmedia,REJECT-TINYGIF
+DOMAIN-KEYWORD,adwords,REJECT-TINYGIF
+DOMAIN-KEYWORD,adservice,REJECT-TINYGIF
+DOMAIN-SUFFIX,appsflyer.com,REJECT-TINYGIF
+DOMAIN-KEYWORD,domob,REJECT-TINYGIF
+DOMAIN-SUFFIX,doubleclick.net,REJECT-TINYGIF
+DOMAIN-KEYWORD,duomeng,REJECT-TINYGIF
+DOMAIN-KEYWORD,dwtrack,REJECT-TINYGIF
+DOMAIN-KEYWORD,guanggao,REJECT-TINYGIF
+DOMAIN-KEYWORD,lianmeng,REJECT-TINYGIF
+DOMAIN-SUFFIX,mmstat.com,REJECT-TINYGIF
+DOMAIN-KEYWORD,mopub,REJECT-TINYGIF
+DOMAIN-KEYWORD,omgmta,REJECT-TINYGIF
+DOMAIN-KEYWORD,openx,REJECT-TINYGIF
+DOMAIN-KEYWORD,partnerad,REJECT-TINYGIF
+DOMAIN-KEYWORD,pingfore,REJECT-TINYGIF
+DOMAIN-KEYWORD,supersonicads,REJECT-TINYGIF
+DOMAIN-KEYWORD,uedas,REJECT-TINYGIF
+DOMAIN-KEYWORD,umeng,REJECT-TINYGIF
+DOMAIN-KEYWORD,usage,REJECT-TINYGIF
+DOMAIN-SUFFIX,vungle.com,REJECT-TINYGIF
+DOMAIN-KEYWORD,wlmonitor,REJECT-TINYGIF
+DOMAIN-KEYWORD,zjtoolbar,REJECT-TINYGIF
+
+## 抗 DNS 污染
+DOMAIN-KEYWORD,amazon,Proxy
+DOMAIN-KEYWORD,google,Proxy
+DOMAIN-KEYWORD,gmail,Proxy
+DOMAIN-KEYWORD,youtube,Proxy
+DOMAIN-KEYWORD,facebook,Proxy
+DOMAIN-SUFFIX,fb.me,Proxy
+DOMAIN-SUFFIX,fbcdn.net,Proxy
+DOMAIN-KEYWORD,twitter,Proxy
+DOMAIN-KEYWORD,instagram,Proxy
+DOMAIN-KEYWORD,dropbox,Proxy
+DOMAIN-SUFFIX,twimg.com,Proxy
+DOMAIN-KEYWORD,blogspot,Proxy
+DOMAIN-SUFFIX,youtu.be,Proxy
+
+## 常见国外域名列表
+DOMAIN-SUFFIX,9to5mac.com,Proxy
+DOMAIN-SUFFIX,abpchina.org,Proxy
+DOMAIN-SUFFIX,adblockplus.org,Proxy
+DOMAIN-SUFFIX,adobe.com,Proxy
+DOMAIN-SUFFIX,akamaized.net,Proxy
+DOMAIN-SUFFIX,alfredapp.com,Proxy
+DOMAIN-SUFFIX,amplitude.com,Proxy
+DOMAIN-SUFFIX,ampproject.org,Proxy
+DOMAIN-SUFFIX,android.com,Proxy
+DOMAIN-SUFFIX,angularjs.org,Proxy
+DOMAIN-SUFFIX,aolcdn.com,Proxy
+DOMAIN-SUFFIX,apkpure.com,Proxy
+DOMAIN-SUFFIX,appledaily.com,Proxy
+DOMAIN-SUFFIX,appshopper.com,Proxy
+DOMAIN-SUFFIX,appspot.com,Proxy
+DOMAIN-SUFFIX,arcgis.com,Proxy
+DOMAIN-SUFFIX,archive.org,Proxy
+DOMAIN-SUFFIX,armorgames.com,Proxy
+DOMAIN-SUFFIX,aspnetcdn.com,Proxy
+DOMAIN-SUFFIX,att.com,Proxy
+DOMAIN-SUFFIX,awsstatic.com,Proxy
+DOMAIN-SUFFIX,azureedge.net,Proxy
+DOMAIN-SUFFIX,azurewebsites.net,Proxy
+DOMAIN-SUFFIX,bing.com,Proxy
+DOMAIN-SUFFIX,bintray.com,Proxy
+DOMAIN-SUFFIX,bit.com,Proxy
+DOMAIN-SUFFIX,bit.ly,Proxy
+DOMAIN-SUFFIX,bitbucket.org,Proxy
+DOMAIN-SUFFIX,bjango.com,Proxy
+DOMAIN-SUFFIX,bkrtx.com,Proxy
+DOMAIN-SUFFIX,blog.com,Proxy
+DOMAIN-SUFFIX,blogcdn.com,Proxy
+DOMAIN-SUFFIX,blogger.com,Proxy
+DOMAIN-SUFFIX,blogsmithmedia.com,Proxy
+DOMAIN-SUFFIX,blogspot.com,Proxy
+DOMAIN-SUFFIX,blogspot.hk,Proxy
+DOMAIN-SUFFIX,bloomberg.com,Proxy
+DOMAIN-SUFFIX,box.com,Proxy
+DOMAIN-SUFFIX,box.net,Proxy
+DOMAIN-SUFFIX,cachefly.net,Proxy
+DOMAIN-SUFFIX,chromium.org,Proxy
+DOMAIN-SUFFIX,cl.ly,Proxy
+DOMAIN-SUFFIX,cloudflare.com,Proxy
+DOMAIN-SUFFIX,cloudfront.net,Proxy
+DOMAIN-SUFFIX,cloudmagic.com,Proxy
+DOMAIN-SUFFIX,cmail19.com,Proxy
+DOMAIN-SUFFIX,cnet.com,Proxy
+DOMAIN-SUFFIX,cocoapods.org,Proxy
+DOMAIN-SUFFIX,comodoca.com,Proxy
+DOMAIN-SUFFIX,crashlytics.com,Proxy
+DOMAIN-SUFFIX,culturedcode.com,Proxy
+DOMAIN-SUFFIX,d.pr,Proxy
+DOMAIN-SUFFIX,danilo.to,Proxy
+DOMAIN-SUFFIX,dayone.me,Proxy
+DOMAIN-SUFFIX,db.tt,Proxy
+DOMAIN-SUFFIX,deskconnect.com,Proxy
+DOMAIN-SUFFIX,disq.us,Proxy
+DOMAIN-SUFFIX,disqus.com,Proxy
+DOMAIN-SUFFIX,disquscdn.com,Proxy
+DOMAIN-SUFFIX,dnsimple.com,Proxy
+DOMAIN-SUFFIX,docker.com,Proxy
+DOMAIN-SUFFIX,dribbble.com,Proxy
+DOMAIN-SUFFIX,droplr.com,Proxy
+DOMAIN-SUFFIX,duckduckgo.com,Proxy
+DOMAIN-SUFFIX,dueapp.com,Proxy
+DOMAIN-SUFFIX,dytt8.net,Proxy
+DOMAIN-SUFFIX,edgecastcdn.net,Proxy
+DOMAIN-SUFFIX,edgekey.net,Proxy
+DOMAIN-SUFFIX,edgesuite.net,Proxy
+DOMAIN-SUFFIX,engadget.com,Proxy
+DOMAIN-SUFFIX,entrust.net,Proxy
+DOMAIN-SUFFIX,eurekavpt.com,Proxy
+DOMAIN-SUFFIX,evernote.com,Proxy
+DOMAIN-SUFFIX,fabric.io,Proxy
+DOMAIN-SUFFIX,fast.com,Proxy
+DOMAIN-SUFFIX,fastly.net,Proxy
+DOMAIN-SUFFIX,fc2.com,Proxy
+DOMAIN-SUFFIX,feedburner.com,Proxy
+DOMAIN-SUFFIX,feedly.com,Proxy
+DOMAIN-SUFFIX,feedsportal.com,Proxy
+DOMAIN-SUFFIX,fiftythree.com,Proxy
+DOMAIN-SUFFIX,firebaseio.com,Proxy
+DOMAIN-SUFFIX,flexibits.com,Proxy
+DOMAIN-SUFFIX,flickr.com,Proxy
+DOMAIN-SUFFIX,flipboard.com,Proxy
+DOMAIN-SUFFIX,g.co,Proxy
+DOMAIN-SUFFIX,gabia.net,Proxy
+DOMAIN-SUFFIX,geni.us,Proxy
+DOMAIN-SUFFIX,gfx.ms,Proxy
+DOMAIN-SUFFIX,ggpht.com,Proxy
+DOMAIN-SUFFIX,ghostnoteapp.com,Proxy
+DOMAIN-SUFFIX,git.io,Proxy
+DOMAIN-KEYWORD,github,Proxy
+DOMAIN-SUFFIX,globalsign.com,Proxy
+DOMAIN-SUFFIX,gmodules.com,Proxy
+DOMAIN-SUFFIX,godaddy.com,Proxy
+DOMAIN-SUFFIX,golang.org,Proxy
+DOMAIN-SUFFIX,gongm.in,Proxy
+DOMAIN-SUFFIX,goo.gl,Proxy
+DOMAIN-SUFFIX,goodreaders.com,Proxy
+DOMAIN-SUFFIX,goodreads.com,Proxy
+DOMAIN-SUFFIX,gravatar.com,Proxy
+DOMAIN-SUFFIX,gstatic.com,Proxy
+DOMAIN-SUFFIX,gvt0.com,Proxy
+DOMAIN-SUFFIX,hockeyapp.net,Proxy
+DOMAIN-SUFFIX,hotmail.com,Proxy
+DOMAIN-SUFFIX,icons8.com,Proxy
+DOMAIN-SUFFIX,ifixit.com,Proxy
+DOMAIN-SUFFIX,ift.tt,Proxy
+DOMAIN-SUFFIX,ifttt.com,Proxy
+DOMAIN-SUFFIX,iherb.com,Proxy
+DOMAIN-SUFFIX,imageshack.us,Proxy
+DOMAIN-SUFFIX,img.ly,Proxy
+DOMAIN-SUFFIX,imgur.com,Proxy
+DOMAIN-SUFFIX,imore.com,Proxy
+DOMAIN-SUFFIX,instapaper.com,Proxy
+DOMAIN-SUFFIX,ipn.li,Proxy
+DOMAIN-SUFFIX,is.gd,Proxy
+DOMAIN-SUFFIX,issuu.com,Proxy
+DOMAIN-SUFFIX,itgonglun.com,Proxy
+DOMAIN-SUFFIX,itun.es,Proxy
+DOMAIN-SUFFIX,ixquick.com,Proxy
+DOMAIN-SUFFIX,j.mp,Proxy
+DOMAIN-SUFFIX,js.revsci.net,Proxy
+DOMAIN-SUFFIX,jshint.com,Proxy
+DOMAIN-SUFFIX,jtvnw.net,Proxy
+DOMAIN-SUFFIX,justgetflux.com,Proxy
+DOMAIN-SUFFIX,kat.cr,Proxy
+DOMAIN-SUFFIX,klip.me,Proxy
+DOMAIN-SUFFIX,libsyn.com,Proxy
+DOMAIN-SUFFIX,linkedin.com,Proxy
+DOMAIN-SUFFIX,line-apps.com,Proxy
+DOMAIN-SUFFIX,linode.com,Proxy
+DOMAIN-SUFFIX,lithium.com,Proxy
+DOMAIN-SUFFIX,littlehj.com,Proxy
+DOMAIN-SUFFIX,live.com,Proxy
+DOMAIN-SUFFIX,live.net,Proxy
+DOMAIN-SUFFIX,livefilestore.com,Proxy
+DOMAIN-SUFFIX,llnwd.net,Proxy
+DOMAIN-SUFFIX,macid.co,Proxy
+DOMAIN-SUFFIX,macromedia.com,Proxy
+DOMAIN-SUFFIX,macrumors.com,Proxy
+DOMAIN-SUFFIX,mashable.com,Proxy
+DOMAIN-SUFFIX,mathjax.org,Proxy
+DOMAIN-SUFFIX,medium.com,Proxy
+DOMAIN-SUFFIX,mega.co.nz,Proxy
+DOMAIN-SUFFIX,mega.nz,Proxy
+DOMAIN-SUFFIX,megaupload.com,Proxy
+DOMAIN-SUFFIX,microsofttranslator.com,Proxy
+DOMAIN-SUFFIX,mindnode.com,Proxy
+DOMAIN-SUFFIX,mobile01.com,Proxy
+DOMAIN-SUFFIX,modmyi.com,Proxy
+DOMAIN-SUFFIX,msedge.net,Proxy
+DOMAIN-SUFFIX,myfontastic.com,Proxy
+DOMAIN-SUFFIX,name.com,Proxy
+DOMAIN-SUFFIX,nextmedia.com,Proxy
+DOMAIN-SUFFIX,nsstatic.net,Proxy
+DOMAIN-SUFFIX,nssurge.com,Proxy
+DOMAIN-SUFFIX,nyt.com,Proxy
+DOMAIN-SUFFIX,nytimes.com,Proxy
+DOMAIN-SUFFIX,omnigroup.com,Proxy
+DOMAIN-SUFFIX,onedrive.com,Proxy
+DOMAIN-SUFFIX,onenote.com,Proxy
+DOMAIN-SUFFIX,ooyala.com,Proxy
+DOMAIN-SUFFIX,openvpn.net,Proxy
+DOMAIN-SUFFIX,openwrt.org,Proxy
+DOMAIN-SUFFIX,orkut.com,Proxy
+DOMAIN-SUFFIX,osxdaily.com,Proxy
+DOMAIN-SUFFIX,outlook.com,Proxy
+DOMAIN-SUFFIX,ow.ly,Proxy
+DOMAIN-SUFFIX,paddleapi.com,Proxy
+DOMAIN-SUFFIX,parallels.com,Proxy
+DOMAIN-SUFFIX,parse.com,Proxy
+DOMAIN-SUFFIX,pdfexpert.com,Proxy
+DOMAIN-SUFFIX,periscope.tv,Proxy
+DOMAIN-SUFFIX,pinboard.in,Proxy
+DOMAIN-SUFFIX,pinterest.com,Proxy
+DOMAIN-SUFFIX,pixelmator.com,Proxy
+DOMAIN-SUFFIX,pixiv.net,Proxy
+DOMAIN-SUFFIX,playpcesor.com,Proxy
+DOMAIN-SUFFIX,playstation.com,Proxy
+DOMAIN-SUFFIX,playstation.com.hk,Proxy
+DOMAIN-SUFFIX,playstation.net,Proxy
+DOMAIN-SUFFIX,playstationnetwork.com,Proxy
+DOMAIN-SUFFIX,pushwoosh.com,Proxy
+DOMAIN-SUFFIX,rime.im,Proxy
+DOMAIN-SUFFIX,servebom.com,Proxy
+DOMAIN-SUFFIX,sfx.ms,Proxy
+DOMAIN-SUFFIX,shadowsocks.org,Proxy
+DOMAIN-SUFFIX,sharethis.com,Proxy
+DOMAIN-SUFFIX,shazam.com,Proxy
+DOMAIN-SUFFIX,skype.com,Proxy
+DOMAIN-SUFFIX,smartdnsProxy.com,Proxy
+DOMAIN-SUFFIX,smartmailcloud.com,Proxy
+DOMAIN-SUFFIX,sndcdn.com,Proxy
+DOMAIN-SUFFIX,sony.com,Proxy
+DOMAIN-SUFFIX,soundcloud.com,Proxy
+DOMAIN-SUFFIX,sourceforge.net,Proxy
+DOMAIN-SUFFIX,spotify.com,Proxy
+DOMAIN-SUFFIX,squarespace.com,Proxy
+DOMAIN-SUFFIX,sstatic.net,Proxy
+DOMAIN-SUFFIX,st.luluku.pw,Proxy
+DOMAIN-SUFFIX,stackoverflow.com,Proxy
+DOMAIN-SUFFIX,startpage.com,Proxy
+DOMAIN-SUFFIX,staticflickr.com,Proxy
+DOMAIN-SUFFIX,steamcommunity.com,Proxy
+DOMAIN-SUFFIX,symauth.com,Proxy
+DOMAIN-SUFFIX,symcb.com,Proxy
+DOMAIN-SUFFIX,symcd.com,Proxy
+DOMAIN-SUFFIX,tapbots.com,Proxy
+DOMAIN-SUFFIX,tapbots.net,Proxy
+DOMAIN-SUFFIX,tdesktop.com,Proxy
+DOMAIN-SUFFIX,techcrunch.com,Proxy
+DOMAIN-SUFFIX,techsmith.com,Proxy
+DOMAIN-SUFFIX,thepiratebay.org,Proxy
+DOMAIN-SUFFIX,theverge.com,Proxy
+DOMAIN-SUFFIX,time.com,Proxy
+DOMAIN-SUFFIX,timeinc.net,Proxy
+DOMAIN-SUFFIX,tiny.cc,Proxy
+DOMAIN-SUFFIX,tinypic.com,Proxy
+DOMAIN-SUFFIX,tmblr.co,Proxy
+DOMAIN-SUFFIX,todoist.com,Proxy
+DOMAIN-SUFFIX,trello.com,Proxy
+DOMAIN-SUFFIX,trustasiassl.com,Proxy
+DOMAIN-SUFFIX,tumblr.co,Proxy
+DOMAIN-SUFFIX,tumblr.com,Proxy
+DOMAIN-SUFFIX,tweetdeck.com,Proxy
+DOMAIN-SUFFIX,tweetmarker.net,Proxy
+DOMAIN-SUFFIX,twitch.tv,Proxy
+DOMAIN-SUFFIX,txmblr.com,Proxy
+DOMAIN-SUFFIX,typekit.net,Proxy
+DOMAIN-SUFFIX,ubertags.com,Proxy
+DOMAIN-SUFFIX,ublock.org,Proxy
+DOMAIN-SUFFIX,ubnt.com,Proxy
+DOMAIN-SUFFIX,ulyssesapp.com,Proxy
+DOMAIN-SUFFIX,urchin.com,Proxy
+DOMAIN-SUFFIX,usertrust.com,Proxy
+DOMAIN-SUFFIX,v.gd,Proxy
+DOMAIN-SUFFIX,v2ex.com,Proxy
+DOMAIN-SUFFIX,vimeo.com,Proxy
+DOMAIN-SUFFIX,vimeocdn.com,Proxy
+DOMAIN-SUFFIX,vine.co,Proxy
+DOMAIN-SUFFIX,vivaldi.com,Proxy
+DOMAIN-SUFFIX,vox-cdn.com,Proxy
+DOMAIN-SUFFIX,vsco.co,Proxy
+DOMAIN-SUFFIX,vultr.com,Proxy
+DOMAIN-SUFFIX,w.org,Proxy
+DOMAIN-SUFFIX,w3schools.com,Proxy
+DOMAIN-SUFFIX,webtype.com,Proxy
+DOMAIN-SUFFIX,wikiwand.com,Proxy
+DOMAIN-SUFFIX,wikileaks.org,Proxy
+DOMAIN-SUFFIX,wikimedia.org,Proxy
+DOMAIN-SUFFIX,wikipedia.com,Proxy
+DOMAIN-SUFFIX,wikipedia.org,Proxy
+DOMAIN-SUFFIX,windows.com,Proxy
+DOMAIN-SUFFIX,windows.net,Proxy
+DOMAIN-SUFFIX,wire.com,Proxy
+DOMAIN-SUFFIX,wordpress.com,Proxy
+DOMAIN-SUFFIX,workflowy.com,Proxy
+DOMAIN-SUFFIX,wp.com,Proxy
+DOMAIN-SUFFIX,wsj.com,Proxy
+DOMAIN-SUFFIX,wsj.net,Proxy
+DOMAIN-SUFFIX,xda-developers.com,Proxy
+DOMAIN-SUFFIX,xeeno.com,Proxy
+DOMAIN-SUFFIX,xiti.com,Proxy
+DOMAIN-SUFFIX,yahoo.com,Proxy
+DOMAIN-SUFFIX,yimg.com,Proxy
+DOMAIN-SUFFIX,ying.com,Proxy
+DOMAIN-SUFFIX,yoyo.org,Proxy
+DOMAIN-SUFFIX,ytimg.com,Proxy
+
+# Telegram
+DOMAIN-SUFFIX,telegra.ph,Proxy
+DOMAIN-SUFFIX,telegram.org,Proxy
+
+IP-CIDR,91.108.4.0/22,Proxy,no-resolve
+IP-CIDR,91.108.8.0/21,Proxy,no-resolve
+IP-CIDR,91.108.16.0/22,Proxy,no-resolve
+IP-CIDR,91.108.56.0/22,Proxy,no-resolve
+IP-CIDR,149.154.160.0/20,Proxy,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,Proxy,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,Proxy,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,Proxy,no-resolve
+
+# Google 中国服务 services.googleapis.cn
+IP-CIDR,120.232.181.162/32,Proxy,no-resolve
+IP-CIDR,120.241.147.226/32,Proxy,no-resolve
+IP-CIDR,120.253.253.226/32,Proxy,no-resolve
+IP-CIDR,120.253.255.162/32,Proxy,no-resolve
+IP-CIDR,120.253.255.34/32,Proxy,no-resolve
+IP-CIDR,120.253.255.98/32,Proxy,no-resolve
+IP-CIDR,180.163.150.162/32,Proxy,no-resolve
+IP-CIDR,180.163.150.34/32,Proxy,no-resolve
+IP-CIDR,180.163.151.162/32,Proxy,no-resolve
+IP-CIDR,180.163.151.34/32,Proxy,no-resolve
+IP-CIDR,203.208.39.0/24,Proxy,no-resolve
+IP-CIDR,203.208.40.0/24,Proxy,no-resolve
+IP-CIDR,203.208.41.0/24,Proxy,no-resolve
+IP-CIDR,203.208.43.0/24,Proxy,no-resolve
+IP-CIDR,203.208.50.0/24,Proxy,no-resolve
+IP-CIDR,220.181.174.162/32,Proxy,no-resolve
+IP-CIDR,220.181.174.226/32,Proxy,no-resolve
+IP-CIDR,220.181.174.34/32,Proxy,no-resolve
+
 RULE-SET,LAN,DIRECT
 
+# 剩余未匹配的国内网站
+DOMAIN-SUFFIX,cn,DIRECT
+DOMAIN-KEYWORD,-cn,DIRECT
+
 # 最终规则
 GEOIP,CN,DIRECT
 FINAL,Proxy,dns-failed
 
 [URL Rewrite]
-^https?://(www.)?(g|google).cn https://www.google.com 302
+^https?://(www.)?(g|google).cn https://www.google.com 302

+ 1 - 1
resources/views/admin/config/emailFilter.blade.php

@@ -64,7 +64,7 @@
             <div class="modal-dialog modal-simple modal-center modal-lg">
                 <div class="modal-content">
                     <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                             <span aria-hidden="true">×</span>
                         </button>
                         <h4 class="modal-title"> {{ trans('admin.action.add_item', ['attribute' => trans('admin.setting.email.tail')]) }} </h4>

+ 1 - 1
resources/views/admin/logs/userMonitor.blade.php

@@ -6,7 +6,7 @@
                 <h2 class="panel-title">{{ trans('admin.monitor.user') }}</h2>
             </div>
             <div class="alert alert-info alert-dismissible">
-                <button class="close" data-dismiss="alert" aria-label="Close">
+                <button class="close" data-dismiss="alert" aria-label="{{ trans('common.close') }}">
                     <span aria-hidden="true">&times;</span><span class="sr-only">{{trans('common.close')}}</span>
                 </button>
                 <h4 class="block">{{$username}}</h4>

+ 2 - 2
resources/views/admin/marketing/pushList.blade.php

@@ -31,7 +31,7 @@
                     </div>
                 </form>
                 {{--                <div class="alert alert-info alert-dismissible" role="alert">--}}
-                {{--                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">--}}
+                {{--                    <button type="button" class="close" data-dismiss="alert" aria-label="{{ trans('common.close') }}">--}}
                 {{--                        <span aria-hidden="true">×</span></button>--}}
                 {{--                    仅会推送给关注了您的消息通道的用户 @can('admin.system.index')<a href="{{route('admin.system.index')}}" class="alert-link" target="_blank">设置PushBear</a> @else 设置PushBear @endcan--}}
                 {{--                </div>--}}
@@ -82,7 +82,7 @@
             <div class="modal-dialog modal-lg modal-center">
                 <div class="modal-content">
                     <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                             <span aria-hidden="true">×</span>
                         </button>
                         <h4 class="modal-title">{{ trans('admin.marketing.push.send') }}</h4>

+ 1 - 1
resources/views/admin/node/auth.blade.php

@@ -81,7 +81,7 @@
             <div class="modal-dialog modal-simple modal-center modal-lg">
                 <div class="modal-content">
                     <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                             <span aria-hidden="true">×</span>
                         </button>
                         <h4 class="modal-title">

+ 2 - 2
resources/views/admin/node/info.blade.php

@@ -17,7 +17,7 @@
                 </h2>
             </div>
             <div class="alert alert-info" role="alert">
-                <button class="close" data-dismiss="alert" aria-label="Close">
+                <button class="close" data-dismiss="alert" aria-label="{{ trans('common.close') }}">
                     <span aria-hidden="true">&times;</span>
                     <span class="sr-only">{{trans('common.close')}}</span>
                 </button>
@@ -118,7 +118,7 @@
                                     </div>
                                     <div class="form-group row">
                                         <label for="description" class="col-md-3 col-form-label"> {{ trans('model.common.description') }} </label>
-                                        <input type="text" class="form-control col-md-6" name="description" id="description" placeholder="简单描述">
+                                        <input type="text" class="form-control col-md-6" name="description" id="description">
                                     </div>
                                     <div class="form-group row">
                                         <label for="sort" class="col-md-3 col-form-label">{{ trans('model.common.sort') }}</label>

+ 1 - 1
resources/views/admin/node/monitor.blade.php

@@ -6,7 +6,7 @@
                 <h2 class="panel-title">{{ trans('admin.monitor.node') }}</h2>
             </div>
             <div class="alert alert-info alert-dismissible">
-                <button class="close" data-dismiss="alert" aria-label="Close">
+                <button class="close" data-dismiss="alert" aria-label="{{ trans('common.close') }}">
                     <span aria-hidden="true">&times;</span><span class="sr-only">{{trans('common.close')}}</span>
                 </button>
                 <h4 class="block">{{$nodeName}}

+ 1 - 1
resources/views/admin/rule/index.blade.php

@@ -91,7 +91,7 @@
             <div class="modal-dialog modal-simple modal-center">
                 <div class="modal-content">
                     <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                             <span aria-hidden="true">×</span>
                         </button>
                         <h4 class="modal-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.rule.attribute')]) }}</h4>

+ 2 - 3
resources/views/admin/shop/info.blade.php

@@ -120,16 +120,15 @@
                             </div>
                             <div class="form-group row">
                                 <label class="col-md-2 col-form-label" for="invite_num">{{ trans('model.goods.invite_num') }}</label>
-                                <div class="col-md-4 input-group">
+                                <div class="col-md-4">
                                     <input type="number" class="form-control" name="invite_num" id="invite_num" value="0" required/>
-                                    <span class="input-group-text">枚</span>
                                 </div>
                             </div>
                             <div class="form-group row">
                                 <label class="col-md-2 col-form-label" for="limit_num">{{ trans('model.goods.limit_num') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" class="form-control" name="limit_num" id="limit_num" value="0" required/>
-                                    <span class="input-group-text"></span>
+                                    <span class="input-group-text">{{ trans('admin.times') }}</span>
                                     <span class="text-help"> {{ trans('admin.goods.info.limit_num_hint') }} </span>
                                 </div>
                             </div>

+ 1 - 1
resources/views/admin/ticket/index.blade.php

@@ -98,7 +98,7 @@
             <div class="modal-dialog modal-simple modal-center modal-lg">
                 <div class="modal-content">
                     <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                             <span aria-hidden="true">×</span>
                         </button>
                         <h4 class="modal-title"> {{trans('user.ticket.new')}} </h4>

+ 1 - 1
resources/views/admin/ticket/reply.blade.php

@@ -46,7 +46,7 @@
         <div class="modal-dialog modal-simple modal-sidebar">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title">

+ 2 - 2
resources/views/admin/user/info.blade.php

@@ -69,7 +69,7 @@
                                             <p class="form-control"> {{$user->credit}} </p>
                                             @can('admin.user.updateCredit')
                                                 <div class="input-group-append">
-                                                    <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#handle_user_credit">充值</button>
+                                                    <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#handle_user_credit">{{ trans('admin.goods.type.top_up') }}</button>
                                                 </div>
                                             @endcan
                                         </div>
@@ -310,7 +310,7 @@
                 <div class="modal-dialog modal-simple modal-center">
                     <div class="modal-content">
                         <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                            <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                                 <span aria-hidden="true">×</span>
                             </button>
                             <h4 class="modal-title">{{ trans('user.recharge') }}</h4>

+ 1 - 1
resources/views/auth/login.blade.php

@@ -34,7 +34,7 @@
     @if(sysConfig('oauth_path'))
         <div class="pb-5">
             <div class="line">
-                <span> 一键登录 </span>
+                <span> {{ trans('auth.one-click_login') }} </span>
             </div>
             @foreach (json_decode(sysConfig('oauth_path')) as $item)
                 @if ($item === 'telegram')

+ 2 - 2
resources/views/auth/register.blade.php

@@ -122,7 +122,7 @@
         <div class="modal-dialog modal-simple modal-sidebar modal-lg">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close mr-15" data-dismiss="modal" aria-label="Close" style="position:absolute;">
+                    <button type="button" class="close mr-15" data-dismiss="modal" aria-label="{{ trans('common.close') }}" style="position:absolute;">
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title">{{sysConfig('website_name')}}- {{trans('auth.tos')}} <small>2019年11月28日10:49</small></h4>
@@ -141,7 +141,7 @@
         <div class="modal-dialog modal-simple modal-sidebar modal-lg">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close mr-15" data-dismiss="modal" aria-label="Close" style="position:absolute;">
+                    <button type="button" class="close mr-15" data-dismiss="modal" aria-label="{{ trans('common.close') }}" style="position:absolute;">
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title">{{sysConfig('website_name')}}- {{trans('auth.aup')}} <small>2019年11月28日10:49</small></h4>

+ 1 - 1
resources/views/components/alert.blade.php

@@ -1,5 +1,5 @@
 <div {{ $attributes->merge(['class' => 'alert  alert-dismissible alert-'.$type]) }} role="alert">
-    <button class="close" data-dismiss="alert" aria-label="Close">
+    <button class="close" data-dismiss="alert" aria-label="{{ trans('common.close') }}">
         <span aria-hidden="true">&times;</span><span class="sr-only">{{trans('common.close')}}</span>
     </button>
     @if(is_array($message))

+ 10 - 10
resources/views/components/payment/detail.blade.php

@@ -35,13 +35,13 @@
                         <div class="panel-body">
                             <ul class="list-group">
                                 <li class="list-group-item">
-                                    订单原价:{{ $order->origin_amount_tag }}
+                                    {{ trans('model.order.original_price') }}: {{ $order->origin_amount_tag }}
                                 </li>
                                 <li class="list-group-item">
-                                    实际支付金额:{{ $order->origin_amount_tag }}
+                                    {{ trans('model.order.price') }}: {{ $order->origin_amount_tag }}
                                 </li>
                                 <li class="list-group-item">
-                                    {{ trans('user.payment_method') }}
+                                    {{ trans('user.payment_method') }}:
                                     {{ $order->pay_way === 1 ? trans('user.shop.pay_credit') : trans('user.shop.pay_online') }}
                                 </li>
                                 <li class="list-group-item">
@@ -53,7 +53,7 @@
                                     </li>
                                 @endif
                                 <li class="list-group-item">
-                                    {{ trans('common.status.attribute') }}{!! $order->status_label !!}
+                                    {{ trans('common.status.attribute') }}: {!! $order->status_label !!}
                                 </li>
                             </ul>
                         </div>
@@ -63,25 +63,25 @@
                     <div class="panel panel-line panel-default">
                         <div class="panel-heading">
                             <h3 class="panel-title">
-                                <i class="icon wb-user-circle" aria-hidden="true"></i> 用户信息
+                                <i class="icon wb-user-circle" aria-hidden="true"></i> {{ trans('admin.ticket.user_info') }}
                             </h3>
                         </div>
                         <div class="panel-body">
                             <ul class="list-group">
                                 <li class="list-group-item">
-                                    {{ trans('model.user.nickname') }}{{ $user->nickname }}
+                                    {{ trans('model.user.nickname') }}: {{ $user->nickname }}
                                 </li>
                                 <li class="list-group-item">
-                                    {{ trans('model.user.username') }}{{ $user->username }}
+                                    {{ trans('model.user.username') }}: {{ $user->username }}
                                 </li>
                                 <li class="list-group-item">
-                                    {{ trans('user.attribute.data') }}:{{ flowAutoShow($user->used_traffic) }} / {{ flowAutoShow($user->transfer_enable) }}
+                                    {{ trans('model.user.traffic_used') }}: {{ flowAutoShow($user->used_traffic) }} / {{ flowAutoShow($user->transfer_enable) }}
                                 </li>
                                 <li class="list-group-item">
-                                    余额:{{ $user->credit }}
+                                    {{ trans('model.user.credit') }}: {{ $user->credit }}
                                 </li>
                                 <li class="list-group-item">
-                                    过期时间:{{ $user->expiration_date }}
+                                    {{ trans('model.user.expired_date') }}: {{ $user->expiration_date }}
                                 </li>
                             </ul>
                         </div>

+ 1 - 1
resources/views/components/system/input-test.blade.php

@@ -10,7 +10,7 @@
                 </span>
             </div>
             @if(trans('admin.system.hint.'.$code) !== 'admin.system.hint.'.$code)
-                <span class="text-help"> {!! trans('admin.system.hint.'.$code) !!} @can('admin.test.notify')(<a href="javascript:sendTestNotification('{{$test}}');">发送测试消息</a>)@endcan</span>
+                <span class="text-help"> {!! trans('admin.system.hint.'.$code) !!} @can('admin.test.notify')(<a href="javascript:sendTestNotification('{{$test}}');">{{ trans('admin.system.notification.send_test') }}</a>)@endcan</span>
             @endisset
         </div>
     </div>

+ 0 - 93
resources/views/components/ticket/reply.blade.php

@@ -1,93 +0,0 @@
-@extends('_layout')
-@section('title', sysConfig('website_name'))
-@section('body_class','page-login-v3 layout-full')
-@section('layout_css')
-    <style>
-        .layout-full {
-            margin-right: auto !important;
-            margin-left: auto !important;
-        }
-
-        @media (min-width: 992px) {
-            .layout-full {
-                max-width: 75vw;
-            }
-        }
-
-        @media (min-width: 1200px) {
-            .layout-full {
-                max-width: 50vw;
-            }
-        }
-    </style>
-@endsection
-@section('layout_content')
-    <div class="page vertical-align " data-animsition-in="fade-in" data-animsition-out="fade-out">
-        <div class="page-content container vertical-align-middle">
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="panel panel-line @if( $order->status === 2 ) panel-success @else panel-danger @endif">
-                        <div class="panel-heading">
-                            <h3 class="panel-title">
-                                <i class="icon wb-shopping-cart" aria-hidden="true"></i> {{trans('user.invoice.detail')}}
-                            </h3>
-                        </div>
-                        <div class="panel-body">
-                            <ul class="list-group">
-                                <li class="list-group-item">
-                                    订单原价:{{ $order->origin_amount_tag }}
-                                </li>
-                                <li class="list-group-item">
-                                    实际支付金额:{{ $order->origin_amount_tag }}
-                                </li>
-                                <li class="list-group-item">
-                                    {{ trans('user.payment_method') }}:
-                                    {{ $order->pay_way === 1 ? trans('user.shop.pay_credit') : trans('user.shop.pay_online') }}
-                                </li>
-                                <li class="list-group-item">
-                                    {{ trans('user.bought_at') }}: {{ $order->created_at }}
-                                </li>
-                                @if($order->expired_at)
-                                    <li class="list-group-item">
-                                        {{ trans('common.expired_at') }}: {{ $order->expired_at }}
-                                    </li>
-                                @endif
-                                <li class="list-group-item">
-                                    {{ trans('common.status.attribute') }}:{!! $order->status_label !!}
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-md-6">
-                    <div class="panel panel-line panel-default">
-                        <div class="panel-heading">
-                            <h3 class="panel-title">
-                                <i class="icon wb-user-circle" aria-hidden="true"></i> 用户信息
-                            </h3>
-                        </div>
-                        <div class="panel-body">
-                            <ul class="list-group">
-                                <li class="list-group-item">
-                                    {{ trans('model.user.nickname') }}:{{ $user->nickname }}
-                                </li>
-                                <li class="list-group-item">
-                                    {{ trans('model.user.username') }}:{{ $user->username }}
-                                </li>
-                                <li class="list-group-item">
-                                    {{ trans('user.attribute.data') }}:{{ flowAutoShow($user->used_traffic) }} / {{ flowAutoShow($user->transfer_enable) }}
-                                </li>
-                                <li class="list-group-item">
-                                    余额:{{ $user->credit }}
-                                </li>
-                                <li class="list-group-item">
-                                    过期时间:{{ $user->expiration_date }}
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-@endsection

+ 8 - 8
resources/views/user/components/notification.blade.php

@@ -39,13 +39,13 @@
                 </div>
             </div>
         @endif
-        <div class="dropdown-menu-footer">
-            <a class="dropdown-menu-footer-btn" href="javascript:void(0)" role="button">
-                <i class="icon wb-settings" aria-hidden="true"></i>
-            </a>
-            <a class="dropdown-item" href="javascript:void(0)" role="menuitem">
-                All notifications
-            </a>
-        </div>
+{{--        <div class="dropdown-menu-footer">--}}
+{{--            <a class="dropdown-menu-footer-btn" href="javascript:void(0)" role="button">--}}
+{{--                <i class="icon wb-settings" aria-hidden="true"></i>--}}
+{{--            </a>--}}
+{{--            <a class="dropdown-item" href="javascript:void(0)" role="menuitem">--}}
+{{--                All notifications--}}
+{{--            </a>--}}
+{{--        </div>--}}
     </div>
 </li>

+ 15 - 15
resources/views/user/components/payment/manual.blade.php

@@ -64,7 +64,7 @@
 @section('content')
     <div id="ad">
         <button class="btn btn-pure btn-outline-light icon wb-close" type="button" onclick="document.getElementById('ad').style.display = 'none'"></button>
-        <img src="{{asset('assets/images/help/作者要饭求放过.PNG')}}" alt="支付宝领红包">
+        <img src="{{asset('assets/images/help/作者要饭求放过.PNG')}}" alt="{{ trans('user.manual.red_packet') }}">
     </div>
     <div class="page-content container">
         <div class="panel panel-bordered">
@@ -75,28 +75,28 @@
             </div>
             <div class="panel-body">
                 <div class="alert alert-info text-center">
-                    <p>扫完二维码,支付完成后。记得回来 点击👇【下一步】 直到 点击👇【{{trans('common.submit')}}】 才算正式支付完成呦!</p>
+                    <p>{{ trans('user.manual.hint') }}</p>
                 </div>
                 <div class="steps row w-p100">
                     <div class="step col-lg-4 current">
                         <span class="step-number">1</span>
                         <div class="step-desc">
-                            <span class="step-title">须知</span>
-                            <p>如何正确使用本支付</p>
+                            <span class="step-title">{{ trans('user.manual.step_1') }}</span>
+                            <p>{{ trans('user.manual.step_1_title') }}</p>
                         </div>
                     </div>
                     <div class="step col-lg-4">
                         <span class="step-number">2</span>
                         <div class="step-desc">
-                            <span class="step-title">支付</span>
-                            <p>获取支付二维码,进行支付</p>
+                            <span class="step-title">{{ trans('user.manual.step_2') }}</span>
+                            <p>{{ trans('user.manual.step_2_title') }}</p>
                         </div>
                     </div>
                     <div class="step col-lg-4">
                         <span class="step-number">3</span>
                         <div class="step-desc">
-                            <span class="step-title">完成</span>
-                            <p>等待支付被确认</p>
+                            <span class="step-title">{{ trans('user.manual.step_3') }}</span>
+                            <p>{{ trans('user.manual.step_3_title') }}</p>
                         </div>
                     </div>
                 </div>
@@ -114,17 +114,17 @@
                 <div class="tab">
                     <div class="wechat hide">
                         <div class="mx-auto text-center">
-                            <h4>备注账号</h4>
+                            <h4>{{ trans('user.manual.remark') }}</h4>
                             <img class="w-lg-350 w-md-p50 w-p100 mb-10" src="{{asset('assets/images/help/manual_wechat1.png')}}" alt=""/>
-                            <h4>填入登录使用的账号</h4>
+                            <h4>{{ trans('user.manual.remark_content') }}</h4>
                             <img class="w-lg-350 w-md-p50 w-p100 mb-10" src="{{asset('assets/images/help/manual_wechat2.png')}}" alt=""/>
                         </div>
                     </div>
                     <div class="alipay hide">
                         <div class="mx-auto text-center">
-                            <h4>备注账号</h4>
+                            <h4>{{ trans('user.manual.remark') }}</h4>
                             <img class="w-lg-350 w-md-p50 w-p100 mb-10" src="{{asset('assets/images/help/manual_alipay1.png')}}" alt=""/>
-                            <h4>填入登录使用的账号</h4>
+                            <h4>{{ trans('user.manual.remark_content') }}</h4>
                             <img class="w-lg-350 w-md-p50 w-p100 mb-10" src="{{asset('assets/images/help/manual_alipay2.png')}}" alt=""/>
                         </div>
                     </div>
@@ -154,7 +154,7 @@
 
                 <div class="tab">
                     <div class="alert alert-danger text-center">
-                        支付时,请充值正确金额(多不退,少要补)
+                        {{ trans('user.manual.payment_hint') }}
                     </div>
                     <div class="mx-auto w-md-p50 w-lg-p25">
                         <ul class="list-group list-group-dividered">
@@ -168,8 +168,8 @@
                 </div>
 
                 <div class="clearfix">
-                    <button type="button" class="btn btn-lg btn-default float-left" id="prevBtn" onclick="nextPrev(-1)">上一步</button>
-                    <button type="button" class="btn btn-lg btn-primary float-right" id="nextBtn" onclick="nextPrev(1)">下一步</button>
+                    <button type="button" class="btn btn-lg btn-default float-left" id="prevBtn" onclick="nextPrev(-1)">{{ trans('user.manual.pre') }}</button>
+                    <button type="button" class="btn btn-lg btn-primary float-right" id="nextBtn" onclick="nextPrev(1)">{{ trans('user.manual.next') }}</button>
                 </div>
             </div>
         </div>

+ 8 - 7
resources/views/user/components/purchase.blade.php

@@ -1,22 +1,22 @@
 @if(sysConfig('is_AliPay'))
     <button class="btn btn-round btn-outline-default mt-2" onclick="pay('{{sysConfig('is_AliPay')}}','1')">
-        <img src="/assets/images/payment/alipay.svg" height="36px" alt="alipay"/>
+        <img src="/assets/images/payment/alipay.svg" height="36px" alt="{{ trans('common.payment.alipay') }}"/>
     </button>
 @endif
 @if(sysConfig('is_QQPay'))
     <button class="btn btn-round btn-outline-default mt-2" onclick="pay('{{sysConfig('is_QQPay')}}','2')">
-        <img src="/assets/images/payment/qqpay.svg" height="36px" alt="qq"/>
+        <img src="/assets/images/payment/qqpay.svg" height="36px" alt="{{ trans('common.payment.alipay') }}"/>
     </button>
 @endif
 @if(sysConfig('is_WeChatPay'))
     <button class="btn btn-round btn-outline-default mt-2" onclick="pay('{{sysConfig('is_WeChatPay')}}','3')">
-        <img src="/assets/images/payment/wechatpay.svg" height="36px" alt="wechat"/>
+        <img src="/assets/images/payment/wechatpay.svg" height="36px" alt="{{ trans('common.payment.wechat') }}"/>
     </button>
 @endif
 @if(strpos(sysConfig('is_otherPay'), 'bitpayx') !== false)
     <button class="btn btn-round btn-outline-default mt-2" onclick="pay('bitpayx','4')">
-        <img src="/assets/images/payment/btc.svg" height="36px" alt="other"/>
-        <span class="font-size-24 black"> {{trans('common.payment.crypto')}} </span>
+        <img src="/assets/images/payment/btc.svg" height="36px" alt="{{ trans('common.payment.crypto') }}"/>
+        <span class="font-size-24 black"> {{ trans('common.payment.crypto') }} </span>
     </button>
 @endif
 @if(strpos(sysConfig('is_otherPay'), 'paypal') !== false)
@@ -26,11 +26,12 @@
 @endif
 @if(strpos(sysConfig('is_otherPay'), 'stripe') !== false)
     <button class="btn btn-round btn-outline-default mt-2" onclick="pay('stripe','6')">
-        <img src="/assets/images/payment/stripe.svg" height="40px" alt="stripe"/>
+        <img src="/assets/images/payment/stripe.svg" height="40px" alt="Stripe"/>
     </button>
 @endif
 @if(sysConfig('alipay_qrcode') || sysConfig('wechat_qrcode'))
     <button class="btn btn-round btn-outline-default mt-2" onclick="pay('manual','7')">
-        <img src="/assets/images/payment/pay.svg" height="40px" alt="pay"/> <span class="font-size-18 font-weight-bold"> 人工支付 </span>
+        <img src="/assets/images/payment/pay.svg" height="40px" alt="{{ trans('common.payment.manual') }}"/>
+        <span class="font-size-18 font-weight-bold"> {{ trans('common.payment.manual' )}} </span>
     </button>
 @endif

+ 3 - 3
resources/views/user/profile.blade.php

@@ -27,7 +27,7 @@
                             <img src="{{Auth::getUser()->avatar}}" alt="{{trans('common.avatar')}}" />
                         </a>
                         <h4 class="user-name">{{Auth::getUser()->nickname}}</h4>
-                        <p class="user-job"><i class="fa-brands fa-weixin fa-lg mr-10" aria-hidden="true"></i> {{trans('common.payment.wechat')}}:
+                        <p class="user-job"><i class="fa-brands fa-weixin fa-lg mr-10" aria-hidden="true"></i> {{trans('model.user.wechat')}}:
                             @if(Auth::getUser()->wechat) {{Auth::getUser()->wechat}} @else {{trans('common.none')}} @endif</p>
                         <p class="user-location"><i class="fa-brands fa-qq fa-lg mr-10" aria-hidden="true"></i> QQ:
                             @if(Auth::getUser()->qq) {{Auth::getUser()->qq}} @else {{trans('common.none')}} @endif</p>
@@ -103,11 +103,11 @@
                                         <input type="text" class="form-control col-md-6 round" name="nickname" id="nickname" value="{{Auth::getUser()->nickname}}"/>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="wechat" class="col-md-5 col-form-label">{{trans('common.payment.wechat')}}</label>
+                                        <label for="wechat" class="col-md-5 col-form-label">{{trans('model.user.wechat')}}</label>
                                         <input type="text" class="form-control col-md-6 round" name="wechat" id="wechat" value="{{Auth::getUser()->wechat}}"/>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="qq" class="col-md-5 col-form-label">QQ</label>
+                                        <label for="qq" class="col-md-5 col-form-label">{{trans('model.user.qq')}}</label>
                                         <input type="number" class="form-control col-md-6 round" name="qq" id="qq" value="{{Auth::getUser()->qq}}"/>
                                     </div>
                                     <div class="form-actions">

+ 1 - 1
resources/views/user/services.blade.php

@@ -101,7 +101,7 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span></button>
                     <h4 class="modal-title">{{trans('user.recharge_credit')}}</h4>
                 </div>

+ 1 - 1
resources/views/user/ticketList.blade.php

@@ -104,7 +104,7 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title"> {{trans('user.ticket.new')}} </h4>

+ 1 - 1
resources/views/vendor/log-viewer/remark/logs.blade.php

@@ -73,7 +73,7 @@
         <div class="modal-dialog modal-simple modal-center">
             <form id="deleteLogForm" class="modal-content" action="{{ route('log-viewer::logs.delete') }}" method="POST">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title">@lang('Delete log file')</h4>

+ 1 - 1
resources/views/vendor/log-viewer/remark/show.blade.php

@@ -215,7 +215,7 @@
         <div class="modal-dialog modal-simple modal-center">
             <form id="deleteLogForm" class="modal-content" action="{{ route('log-viewer::logs.delete') }}" method="POST">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title">@lang('Delete log file')</h4>

+ 1 - 1
update.sh

@@ -40,6 +40,6 @@ git fetch --all && git reset --hard origin/master && git pull
 check_sys
 check_composer
 php artisan optimize:clear
-composer install
+composer update
 php artisan panel:update
 set_permissions