Browse Source

Merge pull request #712 from v2board/dev

1.7.3
tokumeikoi 2 years ago
parent
commit
23b6364cc0
52 changed files with 248 additions and 222 deletions
  1. 2 2
      app/Http/Controllers/Admin/Server/GroupController.php
  2. 6 6
      app/Http/Controllers/Admin/Server/ManageController.php
  3. 12 12
      app/Http/Controllers/Admin/Server/VmessController.php
  4. 4 3
      app/Http/Controllers/Admin/StatController.php
  5. 1 1
      app/Http/Controllers/Admin/SystemController.php
  6. 6 0
      app/Http/Controllers/Admin/UserController.php
  7. 1 3
      app/Http/Controllers/Client/AppController.php
  8. 1 0
      app/Http/Controllers/Client/ClientController.php
  9. 14 5
      app/Http/Controllers/Client/Protocols/Clash.php
  10. 6 5
      app/Http/Controllers/Client/Protocols/ClashMeta.php
  11. 1 1
      app/Http/Controllers/Client/Protocols/Passwall.php
  12. 1 1
      app/Http/Controllers/Client/Protocols/QuantumultX.php
  13. 1 1
      app/Http/Controllers/Client/Protocols/SSRPlus.php
  14. 1 1
      app/Http/Controllers/Client/Protocols/SagerNet.php
  15. 1 1
      app/Http/Controllers/Client/Protocols/Shadowrocket.php
  16. 1 1
      app/Http/Controllers/Client/Protocols/Shadowsocks.php
  17. 6 5
      app/Http/Controllers/Client/Protocols/Stash.php
  18. 2 2
      app/Http/Controllers/Client/Protocols/Surfboard.php
  19. 2 2
      app/Http/Controllers/Client/Protocols/Surge.php
  20. 1 1
      app/Http/Controllers/Client/Protocols/V2rayN.php
  21. 1 1
      app/Http/Controllers/Client/Protocols/V2rayNG.php
  22. 1 1
      app/Http/Controllers/Passport/AuthController.php
  23. 12 12
      app/Http/Controllers/Server/DeepbworkController.php
  24. 3 2
      app/Http/Controllers/Server/UniProxyController.php
  25. 2 3
      app/Http/Controllers/User/ServerController.php
  26. 1 1
      app/Http/Controllers/User/UserController.php
  27. 1 1
      app/Http/Requests/Admin/OrderFetch.php
  28. 1 1
      app/Http/Requests/Admin/ServerVmessSave.php
  29. 1 1
      app/Http/Requests/Admin/ServerVmessUpdate.php
  30. 1 1
      app/Http/Requests/Admin/UserUpdate.php
  31. 1 1
      app/Http/Requests/Passport/AuthForget.php
  32. 1 1
      app/Http/Requests/Passport/AuthLogin.php
  33. 1 1
      app/Http/Requests/Passport/AuthRegister.php
  34. 1 1
      app/Http/Requests/Passport/CommSendEmailVerify.php
  35. 1 1
      app/Http/Requests/Staff/UserUpdate.php
  36. 7 7
      app/Http/Routes/AdminRoute.php
  37. 0 1
      app/Http/Routes/PassportRoute.php
  38. 2 2
      app/Models/ServerVmess.php
  39. 7 1
      app/Services/AuthService.php
  40. 24 32
      app/Services/OrderService.php
  41. 75 82
      app/Services/ServerService.php
  42. 3 0
      app/Services/UserService.php
  43. 3 3
      app/Utils/CacheKey.php
  44. 2 2
      app/Utils/Helper.php
  45. 1 1
      config/app.php
  46. 9 8
      database/install.sql
  47. 15 0
      database/update.sql
  48. 0 0
      public/assets/admin/umi.js
  49. 0 0
      public/theme/v2board/assets/components.async.js
  50. 0 0
      public/theme/v2board/assets/umi.js
  51. 0 0
      public/theme/v2board/assets/vendors.async.js
  52. 1 1
      resources/rules/default.clash.yaml

+ 2 - 2
app/Http/Controllers/Admin/Server/GroupController.php

@@ -5,7 +5,7 @@ namespace App\Http\Controllers\Admin\Server;
 use App\Models\Plan;
 use App\Models\ServerShadowsocks;
 use App\Models\ServerTrojan;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\ServerGroup;
 use App\Models\User;
 use App\Services\ServerService;
@@ -65,7 +65,7 @@ class GroupController extends Controller
             }
         }
 
-        $servers = ServerV2ray::all();
+        $servers = ServerVmess::all();
         foreach ($servers as $server) {
             if (in_array($request->input('id'), $server->group_id)) {
                 abort(500, '该组已被节点所使用,无法删除');

+ 6 - 6
app/Http/Controllers/Admin/Server/ManageController.php

@@ -2,7 +2,7 @@
 
 namespace App\Http\Controllers\Admin\Server;
 
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\ServerShadowsocks;
 use App\Models\ServerTrojan;
 use App\Services\ServerService;
@@ -24,22 +24,22 @@ class ManageController extends Controller
     {
         ini_set('post_max_size', '1m');
         DB::beginTransaction();
-        foreach ($request->input('sorts') as $k => $v) {
+        foreach ($request->input('sorts') ?? [] as $k => $v) {
             switch ($v['key']) {
                 case 'shadowsocks':
-                    if (!ServerShadowsocks::find($v['value'])->update(['sort' => $k + 1])) {
+                    if (!ServerShadowsocks::find($v['value'])->update(['sort' => $v['sort']])) {
                         DB::rollBack();
                         abort(500, '保存失败');
                     }
                     break;
-                case 'v2ray':
-                    if (!ServerV2ray::find($v['value'])->update(['sort' => $k + 1])) {
+                case 'vmess':
+                    if (!ServerVmess::find($v['value'])->update(['sort' => $v['sort']])) {
                         DB::rollBack();
                         abort(500, '保存失败');
                     }
                     break;
                 case 'trojan':
-                    if (!ServerTrojan::find($v['value'])->update(['sort' => $k + 1])) {
+                    if (!ServerTrojan::find($v['value'])->update(['sort' => $v['sort']])) {
                         DB::rollBack();
                         abort(500, '保存失败');
                     }

+ 12 - 12
app/Http/Controllers/Admin/Server/V2rayController.php → app/Http/Controllers/Admin/Server/VmessController.php

@@ -2,21 +2,21 @@
 
 namespace App\Http\Controllers\Admin\Server;
 
-use App\Http\Requests\Admin\ServerV2raySave;
-use App\Http\Requests\Admin\ServerV2rayUpdate;
+use App\Http\Requests\Admin\ServerVmessSave;
+use App\Http\Requests\Admin\ServerVmessUpdate;
 use App\Services\ServerService;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 
-class V2rayController extends Controller
+class VmessController extends Controller
 {
-    public function save(ServerV2raySave $request)
+    public function save(ServerVmessSave $request)
     {
         $params = $request->validated();
 
         if ($request->input('id')) {
-            $server = ServerV2ray::find($request->input('id'));
+            $server = ServerVmess::find($request->input('id'));
             if (!$server) {
                 abort(500, '服务器不存在');
             }
@@ -30,7 +30,7 @@ class V2rayController extends Controller
             ]);
         }
 
-        if (!ServerV2ray::create($params)) {
+        if (!ServerVmess::create($params)) {
             abort(500, '创建失败');
         }
 
@@ -42,7 +42,7 @@ class V2rayController extends Controller
     public function drop(Request $request)
     {
         if ($request->input('id')) {
-            $server = ServerV2ray::find($request->input('id'));
+            $server = ServerVmess::find($request->input('id'));
             if (!$server) {
                 abort(500, '节点ID不存在');
             }
@@ -52,13 +52,13 @@ class V2rayController extends Controller
         ]);
     }
 
-    public function update(ServerV2rayUpdate $request)
+    public function update(ServerVmessUpdate $request)
     {
         $params = $request->only([
             'show',
         ]);
 
-        $server = ServerV2ray::find($request->input('id'));
+        $server = ServerVmess::find($request->input('id'));
 
         if (!$server) {
             abort(500, '该服务器不存在');
@@ -76,12 +76,12 @@ class V2rayController extends Controller
 
     public function copy(Request $request)
     {
-        $server = ServerV2ray::find($request->input('id'));
+        $server = ServerVmess::find($request->input('id'));
         $server->show = 0;
         if (!$server) {
             abort(500, '服务器不存在');
         }
-        if (!ServerV2ray::create($server->toArray())) {
+        if (!ServerVmess::create($server->toArray())) {
             abort(500, '复制失败');
         }
 

+ 4 - 3
app/Http/Controllers/Admin/StatController.php

@@ -10,7 +10,7 @@ use App\Services\ServerService;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use App\Models\ServerGroup;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\Plan;
 use App\Models\User;
 use App\Models\Ticket;
@@ -99,8 +99,9 @@ class StatController extends Controller
     {
         $servers = [
             'shadowsocks' => ServerShadowsocks::where('parent_id', null)->get()->toArray(),
-            'v2ray' => ServerV2ray::where('parent_id', null)->get()->toArray(),
-            'trojan' => ServerTrojan::where('parent_id', null)->get()->toArray()
+            'v2ray' => ServerVmess::where('parent_id', null)->get()->toArray(),
+            'trojan' => ServerTrojan::where('parent_id', null)->get()->toArray(),
+            'vmess' => ServerVmess::where('parent_id', null)->get()->toArray()
         ];
         $startAt = strtotime('-1 day', strtotime(date('Y-m-d')));
         $endAt = strtotime(date('Y-m-d'));

+ 1 - 1
app/Http/Controllers/Admin/SystemController.php

@@ -9,7 +9,7 @@ use App\Utils\CacheKey;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use App\Models\ServerGroup;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\Plan;
 use App\Models\User;
 use App\Models\Ticket;

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

@@ -7,6 +7,7 @@ use App\Http\Requests\Admin\UserGenerate;
 use App\Http\Requests\Admin\UserSendMail;
 use App\Http\Requests\Admin\UserUpdate;
 use App\Jobs\SendEmailJob;
+use App\Services\AuthService;
 use App\Services\UserService;
 use App\Utils\Helper;
 use Illuminate\Http\Request;
@@ -128,6 +129,11 @@ class UserController extends Controller
             $params['invite_user_id'] = null;
         }
 
+        if (isset($params['banned']) && (int)$params['banned'] === 1) {
+            $authService = new AuthService($user);
+            $authService->removeAllSession();
+        }
+
         try {
             $user->update($params);
         } catch (\Exception $e) {

+ 1 - 3
app/Http/Controllers/Client/AppController.php

@@ -5,9 +5,7 @@ namespace App\Http\Controllers\Client;
 use App\Http\Controllers\Controller;
 use App\Services\ServerService;
 use App\Services\UserService;
-use App\Utils\Clash;
 use Illuminate\Http\Request;
-use App\Models\ServerV2ray;
 use Illuminate\Support\Facades\File;
 use Symfony\Component\Yaml\Yaml;
 
@@ -44,7 +42,7 @@ class AppController extends Controller
                 array_push($proxy, Protocols\Clash::buildShadowsocks($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 array_push($proxy, Protocols\Clash::buildVmess($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }

+ 1 - 0
app/Http/Controllers/Client/ClientController.php

@@ -40,6 +40,7 @@ class ClientController extends Controller
 
     private function setSubscribeInfoToServers(&$servers, $user)
     {
+        if (!isset($servers[0])) return;
         if (!(int)config('v2board.show_info_to_server_enable', 0)) return;
         $useTraffic = round($user['u'] / (1024*1024*1024), 2) + round($user['d'] / (1024*1024*1024), 2);
         $totalTraffic = round($user['transfer_enable'] / (1024*1024*1024), 2);

+ 14 - 5
app/Http/Controllers/Client/Protocols/Clash.php

@@ -34,6 +34,7 @@ class Clash
         } else {
             $config = Yaml::parseFile($defaultConfig);
         }
+        $this->patch($config);
         $proxy = [];
         $proxies = [];
 
@@ -49,7 +50,7 @@ class Clash
                 array_push($proxy, self::buildShadowsocks($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 array_push($proxy, self::buildVmess($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
@@ -78,11 +79,12 @@ class Clash
             $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies);
         }
         // Force the current subscription domain to be a direct rule
-        $subsDomain = $_SERVER['SERVER_NAME'];
-        $subsDomainRule = "DOMAIN,{$subsDomain},DIRECT";
-        array_unshift($config['rules'], $subsDomainRule);
+        $subsDomain = $_SERVER['HTTP_HOST'];
+        if ($subsDomain) {
+            array_unshift($config['rules'], "DOMAIN,{$subsDomain},DIRECT");
+        }
 
-        $yaml = Yaml::dump($config);
+        $yaml = Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
         $yaml = str_replace('$app_name', config('v2board.app_name', 'V2Board'), $yaml);
         return $yaml;
     }
@@ -172,4 +174,11 @@ class Clash
     {
         return @preg_match($exp, null) !== false;
     }
+
+    private function patch(&$config)
+    {
+        // fix clash x dns mode
+        preg_match('#(ClashX)[/ ]([0-9.]*)#', $_SERVER['HTTP_USER_AGENT'], $matches);
+        if (isset($matches[2]) && $matches[2] < '1.96.2') $config['dns']['enhanced-mode'] = 'redir-host';
+    }
 }

+ 6 - 5
app/Http/Controllers/Client/Protocols/ClashMeta.php

@@ -40,7 +40,7 @@ class ClashMeta
                 array_push($proxy, self::buildShadowsocks($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 array_push($proxy, self::buildVmess($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
@@ -69,11 +69,12 @@ class ClashMeta
             $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies);
         }
         // Force the current subscription domain to be a direct rule
-        $subsDomain = $_SERVER['SERVER_NAME'];
-        $subsDomainRule = "DOMAIN,{$subsDomain},DIRECT";
-        array_unshift($config['rules'], $subsDomainRule);
+        $subsDomain = $_SERVER['HTTP_HOST'];
+        if ($subsDomain) {
+            array_unshift($config['rules'], "DOMAIN,{$subsDomain},DIRECT");
+        }
 
-        $yaml = Yaml::dump($config);
+        $yaml = Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
         $yaml = str_replace('$app_name', config('v2board.app_name', 'V2Board'), $yaml);
         return $yaml;
     }

+ 1 - 1
app/Http/Controllers/Client/Protocols/Passwall.php

@@ -22,7 +22,7 @@ class Passwall
         $uri = '';
 
         foreach ($servers as $item) {
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'shadowsocks') {

+ 1 - 1
app/Http/Controllers/Client/Protocols/QuantumultX.php

@@ -25,7 +25,7 @@ class QuantumultX
             if ($item['type'] === 'shadowsocks') {
                 $uri .= self::buildShadowsocks($user['uuid'], $item);
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'trojan') {

+ 1 - 1
app/Http/Controllers/Client/Protocols/SSRPlus.php

@@ -22,7 +22,7 @@ class SSRPlus
         $uri = '';
 
         foreach ($servers as $item) {
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'shadowsocks') {

+ 1 - 1
app/Http/Controllers/Client/Protocols/SagerNet.php

@@ -21,7 +21,7 @@ class SagerNet
         $uri = '';
 
         foreach ($servers as $item) {
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'shadowsocks') {

+ 1 - 1
app/Http/Controllers/Client/Protocols/Shadowrocket.php

@@ -32,7 +32,7 @@ class Shadowrocket
             if ($item['type'] === 'shadowsocks') {
                 $uri .= self::buildShadowsocks($user['uuid'], $item);
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'trojan') {

+ 1 - 1
app/Http/Controllers/Client/Protocols/Shadowsocks.php

@@ -30,7 +30,7 @@ class Shadowsocks
 
         foreach ($servers as $item) {
             if ($item['type'] === 'shadowsocks'
-                && in_array($item['cipher'], ['aes-128-gcm', 'aes-256-gcm', 'aes-192-gcm'])
+                && in_array($item['cipher'], ['aes-128-gcm', 'aes-256-gcm', 'aes-192-gcm', 'chacha20-ietf-poly1305'])
             ) {
                 array_push($configs, self::SIP008($item, $user));
             }

+ 6 - 5
app/Http/Controllers/Client/Protocols/Stash.php

@@ -47,7 +47,7 @@ class Stash
                 array_push($proxy, self::buildShadowsocks($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 array_push($proxy, self::buildVmess($user['uuid'], $item));
                 array_push($proxies, $item['name']);
             }
@@ -76,11 +76,12 @@ class Stash
             $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies);
         }
         // Force the current subscription domain to be a direct rule
-        $subsDomain = $_SERVER['SERVER_NAME'];
-        $subsDomainRule = "DOMAIN,{$subsDomain},DIRECT";
-        array_unshift($config['rules'], $subsDomainRule);
+        $subsDomain = $_SERVER['HTTP_HOST'];
+        if ($subsDomain) {
+            array_unshift($config['rules'], "DOMAIN,{$subsDomain},DIRECT");
+        }
 
-        $yaml = Yaml::dump($config);
+        $yaml = Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
         $yaml = str_replace('$app_name', config('v2board.app_name', 'V2Board'), $yaml);
         return $yaml;
     }

+ 2 - 2
app/Http/Controllers/Client/Protocols/Surfboard.php

@@ -41,7 +41,7 @@ class Surfboard
                 // [Proxy Group]
                 $proxyGroup .= $item['name'] . ', ';
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 // [Proxy]
                 $proxies .= self::buildVmess($user['uuid'], $item);
                 // [Proxy Group]
@@ -65,7 +65,7 @@ class Surfboard
 
         // Subscription link
         $subsURL = Helper::getSubscribeUrl("/api/v1/client/subscribe?token={$user['token']}");
-        $subsDomain = $_SERVER['SERVER_NAME'];
+        $subsDomain = $_SERVER['HTTP_HOST'];
 
         $config = str_replace('$subs_link', $subsURL, $config);
         $config = str_replace('$subs_domain', $subsDomain, $config);

+ 2 - 2
app/Http/Controllers/Client/Protocols/Surge.php

@@ -41,7 +41,7 @@ class Surge
                 // [Proxy Group]
                 $proxyGroup .= $item['name'] . ', ';
             }
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 // [Proxy]
                 $proxies .= self::buildVmess($user['uuid'], $item);
                 // [Proxy Group]
@@ -65,7 +65,7 @@ class Surge
 
         // Subscription link
         $subsURL = Helper::getSubscribeUrl("/api/v1/client/subscribe?token={$user['token']}");
-        $subsDomain = $_SERVER['SERVER_NAME'];
+        $subsDomain = $_SERVER['HTTP_HOST'];
         $subsURL = 'https://' . $subsDomain . '/api/v1/client/subscribe?token=' . $user['token'];
 
         $config = str_replace('$subs_link', $subsURL, $config);

+ 1 - 1
app/Http/Controllers/Client/Protocols/V2rayN.php

@@ -24,7 +24,7 @@ class V2rayN
         $uri = '';
 
         foreach ($servers as $item) {
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'shadowsocks') {

+ 1 - 1
app/Http/Controllers/Client/Protocols/V2rayNG.php

@@ -22,7 +22,7 @@ class V2rayNG
         $uri = '';
 
         foreach ($servers as $item) {
-            if ($item['type'] === 'v2ray') {
+            if ($item['type'] === 'vmess') {
                 $uri .= self::buildVmess($user['uuid'], $item);
             }
             if ($item['type'] === 'shadowsocks') {

+ 1 - 1
app/Http/Controllers/Passport/AuthController.php

@@ -26,7 +26,7 @@ class AuthController extends Controller
             abort(404);
         }
         $params = $request->validate([
-            'email' => 'required|email',
+            'email' => 'required|email:strict',
             'redirect' => 'nullable'
         ]);
 

+ 12 - 12
app/Http/Controllers/Server/DeepbworkController.php

@@ -8,7 +8,7 @@ use App\Utils\CacheKey;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use App\Models\User;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\ServerLog;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
@@ -37,11 +37,11 @@ class DeepbworkController extends Controller
     {
         ini_set('memory_limit', -1);
         $nodeId = $request->input('node_id');
-        $server = ServerV2ray::find($nodeId);
+        $server = ServerVmess::find($nodeId);
         if (!$server) {
             abort(500, 'fail');
         }
-        Cache::put(CacheKey::get('SERVER_V2RAY_LAST_CHECK_AT', $server->id), time(), 3600);
+        Cache::put(CacheKey::get('SERVER_VMESS_LAST_CHECK_AT', $server->id), time(), 3600);
         $serverService = new ServerService();
         $users = $serverService->getAvailableUsers($server->group_id);
         $result = [];
@@ -69,7 +69,7 @@ class DeepbworkController extends Controller
     public function submit(Request $request)
     {
 //         Log::info('serverSubmitData:' . $request->input('node_id') . ':' . file_get_contents('php://input'));
-        $server = ServerV2ray::find($request->input('node_id'));
+        $server = ServerVmess::find($request->input('node_id'));
         if (!$server) {
             return response([
                 'ret' => 0,
@@ -78,13 +78,13 @@ class DeepbworkController extends Controller
         }
         $data = file_get_contents('php://input');
         $data = json_decode($data, true);
-        Cache::put(CacheKey::get('SERVER_V2RAY_ONLINE_USER', $server->id), count($data), 3600);
-        Cache::put(CacheKey::get('SERVER_V2RAY_LAST_PUSH_AT', $server->id), time(), 3600);
+        Cache::put(CacheKey::get('SERVER_VMESS_ONLINE_USER', $server->id), count($data), 3600);
+        Cache::put(CacheKey::get('SERVER_VMESS_LAST_PUSH_AT', $server->id), time(), 3600);
         $userService = new UserService();
         foreach ($data as $item) {
             $u = $item['u'];
             $d = $item['d'];
-            $userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'v2ray');
+            $userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'vmess');
         }
 
         return response([
@@ -112,7 +112,7 @@ class DeepbworkController extends Controller
 
     private function getV2RayConfig(int $nodeId, int $localPort)
     {
-        $server = ServerV2ray::find($nodeId);
+        $server = ServerVmess::find($nodeId);
         if (!$server) {
             abort(500, '节点不存在');
         }
@@ -129,7 +129,7 @@ class DeepbworkController extends Controller
         return $json;
     }
 
-    private function setDns(ServerV2ray $server, object $json)
+    private function setDns(ServerVmess $server, object $json)
     {
         if ($server->dnsSettings) {
             $dns = $server->dnsSettings;
@@ -142,7 +142,7 @@ class DeepbworkController extends Controller
         }
     }
 
-    private function setNetwork(ServerV2ray $server, object $json)
+    private function setNetwork(ServerVmess $server, object $json)
     {
         if ($server->networkSettings) {
             switch ($server->network) {
@@ -171,7 +171,7 @@ class DeepbworkController extends Controller
         }
     }
 
-    private function setRule(ServerV2ray $server, object $json)
+    private function setRule(ServerVmess $server, object $json)
     {
         $domainRules = array_filter(explode(PHP_EOL, config('v2board.server_v2ray_domain')));
         $protocolRules = array_filter(explode(PHP_EOL, config('v2board.server_v2ray_protocol')));
@@ -211,7 +211,7 @@ class DeepbworkController extends Controller
         }
     }
 
-    private function setTls(ServerV2ray $server, object $json)
+    private function setTls(ServerVMess $server, object $json)
     {
         if ((int)$server->tls) {
             $tlsSettings = $server->tlsSettings;

+ 3 - 2
app/Http/Controllers/Server/UniProxyController.php

@@ -9,7 +9,7 @@ use App\Utils\Helper;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use App\Models\ServerShadowsocks;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\ServerTrojan;
 use Illuminate\Support\Facades\Cache;
 
@@ -30,6 +30,7 @@ class UniProxyController extends Controller
             abort(500, 'token is error');
         }
         $this->nodeType = $request->input('node_type');
+        if ($this->nodeType === 'v2ray') $this->nodeType = 'vmess';
         $this->nodeId = $request->input('node_id');
         $this->serverService = new ServerService();
         $this->nodeInfo = $this->serverService->getServer($this->nodeId, $this->nodeType);
@@ -92,7 +93,7 @@ class UniProxyController extends Controller
                     $response['server_key'] = Helper::getShadowsocksServerKey($this->nodeInfo->created_at, 32);
                 }
                 break;
-            case 'v2ray':
+            case 'vmess':
                 $response = [
                     'server_port' => $this->nodeInfo->server_port,
                     'network' => $this->nodeInfo->network,

+ 2 - 3
app/Http/Controllers/User/ServerController.php

@@ -8,7 +8,7 @@ use App\Services\UserService;
 use App\Utils\CacheKey;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Cache;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\ServerLog;
 use App\Models\User;
 
@@ -26,8 +26,7 @@ class ServerController extends Controller
             $serverService = new ServerService();
             $servers = $serverService->getAvailableServers($user);
         }
-
-        $eTag = sha1(json_encode(array_column($servers, 'updated_at')));
+        $eTag = sha1(json_encode(array_column($servers, 'cache_key')));
         if (strpos($request->header('If-None-Match'), $eTag) !== false ) {
             abort(304);
         }

+ 1 - 1
app/Http/Controllers/User/UserController.php

@@ -39,7 +39,7 @@ class UserController extends Controller
         }
         $authService = new AuthService($user);
         return response([
-            'data' => $authService->delSession($request->input('session_id'))
+            'data' => $authService->removeSession($request->input('session_id'))
         ]);
     }
 

+ 1 - 1
app/Http/Requests/Admin/OrderFetch.php

@@ -14,7 +14,7 @@ class OrderFetch extends FormRequest
     public function rules()
     {
         return [
-            'filter.*.key' => 'required|in:email,trade_no,status,commission_status,user_id,invite_user_id,callback_no',
+            'filter.*.key' => 'required|in:email,trade_no,status,commission_status,user_id,invite_user_id,callback_no,commission_balance',
             'filter.*.condition' => 'required|in:>,<,=,>=,<=,模糊,!=',
             'filter.*.value' => ''
         ];

+ 1 - 1
app/Http/Requests/Admin/ServerV2raySave.php → app/Http/Requests/Admin/ServerVmessSave.php

@@ -4,7 +4,7 @@ namespace App\Http\Requests\Admin;
 
 use Illuminate\Foundation\Http\FormRequest;
 
-class ServerV2raySave extends FormRequest
+class ServerVmessSave extends FormRequest
 {
     /**
      * Get the validation rules that apply to the request.

+ 1 - 1
app/Http/Requests/Admin/ServerV2rayUpdate.php → app/Http/Requests/Admin/ServerVmessUpdate.php

@@ -4,7 +4,7 @@ namespace App\Http\Requests\Admin;
 
 use Illuminate\Foundation\Http\FormRequest;
 
-class ServerV2rayUpdate extends FormRequest
+class ServerVmessUpdate extends FormRequest
 {
     /**
      * Get the validation rules that apply to the request.

+ 1 - 1
app/Http/Requests/Admin/UserUpdate.php

@@ -14,7 +14,7 @@ class UserUpdate extends FormRequest
     public function rules()
     {
         return [
-            'email' => 'required|email',
+            'email' => 'required|email:strict',
             'password' => 'nullable|min:8',
             'transfer_enable' => 'numeric',
             'expired_at' => 'nullable|integer',

+ 1 - 1
app/Http/Requests/Passport/AuthForget.php

@@ -14,7 +14,7 @@ class AuthForget extends FormRequest
     public function rules()
     {
         return [
-            'email' => 'required|email',
+            'email' => 'required|email:strict',
             'password' => 'required|min:8',
             'email_code' => 'required'
         ];

+ 1 - 1
app/Http/Requests/Passport/AuthLogin.php

@@ -14,7 +14,7 @@ class AuthLogin extends FormRequest
     public function rules()
     {
         return [
-            'email' => 'required|email',
+            'email' => 'required|email:strict',
             'password' => 'required|min:8'
         ];
     }

+ 1 - 1
app/Http/Requests/Passport/AuthRegister.php

@@ -14,7 +14,7 @@ class AuthRegister extends FormRequest
     public function rules()
     {
         return [
-            'email' => 'required|email',
+            'email' => 'required|email:strict',
             'password' => 'required|min:8'
         ];
     }

+ 1 - 1
app/Http/Requests/Passport/CommSendEmailVerify.php

@@ -14,7 +14,7 @@ class CommSendEmailVerify extends FormRequest
     public function rules()
     {
         return [
-            'email' => 'required|email'
+            'email' => 'required|email:strict'
         ];
     }
 

+ 1 - 1
app/Http/Requests/Staff/UserUpdate.php

@@ -14,7 +14,7 @@ class UserUpdate extends FormRequest
     public function rules()
     {
         return [
-            'email' => 'required|email',
+            'email' => 'required|email:strict',
             'password' => 'nullable',
             'transfer_enable' => 'numeric',
             'expired_at' => 'nullable|integer',

+ 7 - 7
app/Http/Routes/AdminRoute.php

@@ -45,14 +45,14 @@ class AdminRoute
                 $router->post('viewConfig', 'Admin\\Server\\TrojanController@viewConfig');
             });
             $router->group([
-                'prefix' => 'server/v2ray'
+                'prefix' => 'server/vmess'
             ], function ($router) {
-                $router->get ('fetch', 'Admin\\Server\\V2rayController@fetch');
-                $router->post('save', 'Admin\\Server\\V2rayController@save');
-                $router->post('drop', 'Admin\\Server\\V2rayController@drop');
-                $router->post('update', 'Admin\\Server\\V2rayController@update');
-                $router->post('copy', 'Admin\\Server\\V2rayController@copy');
-                $router->post('sort', 'Admin\\Server\\V2rayController@sort');
+                $router->get ('fetch', 'Admin\\Server\\VmessController@fetch');
+                $router->post('save', 'Admin\\Server\\VmessController@save');
+                $router->post('drop', 'Admin\\Server\\VmessController@drop');
+                $router->post('update', 'Admin\\Server\\VmessController@update');
+                $router->post('copy', 'Admin\\Server\\VmessController@copy');
+                $router->post('sort', 'Admin\\Server\\VmessController@sort');
             });
             $router->group([
                 'prefix' => 'server/shadowsocks'

+ 0 - 1
app/Http/Routes/PassportRoute.php

@@ -20,7 +20,6 @@ class PassportRoute
             // Comm
             $router->post('/comm/sendEmailVerify', 'Passport\\CommController@sendEmailVerify');
             $router->post('/comm/pv', 'Passport\\CommController@pv');
-            $router->get ('/comm/config', 'Guest\\CommController@config');                                              // TODO:REMOVE:1.7.0
         });
     }
 }

+ 2 - 2
app/Models/ServerV2ray.php → app/Models/ServerVmess.php

@@ -4,9 +4,9 @@ namespace App\Models;
 
 use Illuminate\Database\Eloquent\Model;
 
-class ServerV2ray extends Model
+class ServerVmess extends Model
 {
-    protected $table = 'v2_server_v2ray';
+    protected $table = 'v2_server_vmess';
     protected $dateFormat = 'U';
     protected $guarded = ['id'];
     protected $casts = [

+ 7 - 1
app/Services/AuthService.php

@@ -84,7 +84,7 @@ class AuthService
         return (array)Cache::get(CacheKey::get("USER_SESSIONS", $this->user->id), []);
     }
 
-    public function delSession($sessionId)
+    public function removeSession($sessionId)
     {
         $cacheKey = CacheKey::get("USER_SESSIONS", $this->user->id);
         $sessions = (array)Cache::get($cacheKey, []);
@@ -95,4 +95,10 @@ class AuthService
         )) return false;
         return true;
     }
+
+    public function removeAllSession()
+    {
+        $cacheKey = CacheKey::get("USER_SESSIONS", $this->user->id);
+        return Cache::forget($cacheKey);
+    }
 }

+ 24 - 32
app/Services/OrderService.php

@@ -184,43 +184,35 @@ class OrderService
         $order->surplus_order_ids = array_column($orderModel->get()->toArray(), 'id');
     }
 
-    private function orderIsUsed(Order $order):bool
-    {
-        $month = self::STR_TO_TIME[$order->period];
-        $orderExpireDay = strtotime('+' . $month . ' month', $order->created_at);
-        if ($orderExpireDay < time()) return true;
-        return false;
-    }
-
     private function getSurplusValueByPeriod(User $user, Order $order)
     {
-        $orderModel = Order::where('user_id', $user->id)
+        $orders = Order::where('user_id', $user->id)
             ->where('period', '!=', 'reset_price')
-            ->where('status', 3);
-        $orders = $orderModel->get();
-        $orderSurplusMonth = 0;
-        $orderSurplusAmount = 0;
-        $userSurplusMonth = ($user->expired_at - time()) / 2678400;
-        foreach ($orders as $k => $item) {
-            // 兼容历史余留问题
-            if ($item->period === 'onetime_price') continue;
-            if ($this->orderIsUsed($item)) continue;
-            $orderSurplusMonth = $orderSurplusMonth + self::STR_TO_TIME[$item->period];
-            $orderSurplusAmount = $orderSurplusAmount + ($item['total_amount'] + $item['balance_amount'] + $item['surplus_amount'] - $item['refund_amount']);
-        }
-        if (!$orderSurplusMonth || !$orderSurplusAmount) return;
-        $monthUnitPrice = $orderSurplusAmount / $orderSurplusMonth;
-        // 如果用户过期月大于订单过期月
-        if ($userSurplusMonth > $orderSurplusMonth) {
-            $orderSurplusAmount = $orderSurplusMonth * $monthUnitPrice;
-        } else {
-            $orderSurplusAmount = $userSurplusMonth * $monthUnitPrice;
-        }
-        if (!$orderSurplusAmount) {
-            return;
+            ->where('period', '!=', 'onetime_price')
+            ->where('status', 3)
+            ->get()
+            ->toArray();
+        if (!$orders) return;
+        $orderAmountSum = 0;
+        $orderMonthSum = 0;
+        $lastValidateAt = 0;
+        foreach ($orders as $item) {
+            $period = self::STR_TO_TIME[$item['period']];
+            if (strtotime("+{$period} month", $item['created_at']) < time()) continue;
+            $lastValidateAt = $item['created_at'];
+            $orderMonthSum = $period + $orderMonthSum;
+            $orderAmountSum = $orderAmountSum + ($item['total_amount'] + $item['balance_amount'] + $item['surplus_amount'] - $item['refund_amount']);
         }
+        if (!$lastValidateAt) return;
+        $expiredAtByOrder = strtotime("+{$orderMonthSum} month", $lastValidateAt);
+        if ($expiredAtByOrder < time()) return;
+        $orderSurplusSecond = $expiredAtByOrder - time();
+        $orderRangeSecond = $expiredAtByOrder - $lastValidateAt;
+        $avgPrice = $orderAmountSum / $orderRangeSecond;
+        $orderSurplusAmount = $avgPrice * $orderSurplusSecond;
+        if (!$orderSurplusSecond || !$orderSurplusAmount) return;
         $order->surplus_amount = $orderSurplusAmount > 0 ? $orderSurplusAmount : 0;
-        $order->surplus_order_ids = array_column($orders->toArray(), 'id');
+        $order->surplus_order_ids = array_column($orders, 'id');
     }
 
     public function paid(string $callbackNo)

+ 75 - 82
app/Services/ServerService.php

@@ -6,7 +6,7 @@ use App\Models\ServerLog;
 use App\Models\ServerRoute;
 use App\Models\ServerShadowsocks;
 use App\Models\User;
-use App\Models\ServerV2ray;
+use App\Models\ServerVmess;
 use App\Models\ServerTrojan;
 use App\Utils\CacheKey;
 use App\Utils\Helper;
@@ -15,97 +15,89 @@ use Illuminate\Support\Facades\Cache;
 class ServerService
 {
 
-    public function getV2ray(User $user, $all = false):array
+    public function getAvailableVmess(User $user):array
     {
         $servers = [];
-        $model = ServerV2ray::orderBy('sort', 'ASC');
-        if (!$all) {
-            $model->where('show', 1);
-        }
-        $v2ray = $model->get();
-        for ($i = 0; $i < count($v2ray); $i++) {
-            $v2ray[$i]['type'] = 'v2ray';
-            $groupId = $v2ray[$i]['group_id'];
-            if (!in_array($user->group_id, $groupId)) continue;
-            if (strpos($v2ray[$i]['port'], '-') !== false) {
-                $v2ray[$i]['port'] = Helper::randomPort($v2ray[$i]['port']);
+        $model = ServerVmess::orderBy('sort', 'ASC');
+        $vmess = $model->get();
+        foreach ($vmess as $key => $v) {
+            if (!$v['show']) continue;
+            $vmess[$key]['type'] = 'vmess';
+            if (!in_array($user->group_id, $vmess[$key]['group_id'])) continue;
+            if (strpos($vmess[$key]['port'], '-') !== false) {
+                $vmess[$key]['port'] = Helper::randomPort($vmess[$key]['port']);
             }
-            if ($v2ray[$i]['parent_id']) {
-                $v2ray[$i]['last_check_at'] = Cache::get(CacheKey::get('SERVER_V2RAY_LAST_CHECK_AT', $v2ray[$i]['parent_id']));
+            if ($vmess[$key]['parent_id']) {
+                $vmess[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_VMESS_LAST_CHECK_AT', $vmess[$key]['parent_id']));
             } else {
-                $v2ray[$i]['last_check_at'] = Cache::get(CacheKey::get('SERVER_V2RAY_LAST_CHECK_AT', $v2ray[$i]['id']));
+                $vmess[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_VMESS_LAST_CHECK_AT', $vmess[$key]['id']));
             }
-            array_push($servers, $v2ray[$i]->toArray());
+            $servers[] = $vmess[$key]->toArray();
         }
 
 
         return $servers;
     }
 
-    public function getTrojan(User $user, $all = false):array
+    public function getAvailableTrojan(User $user):array
     {
         $servers = [];
         $model = ServerTrojan::orderBy('sort', 'ASC');
-        if (!$all) {
-            $model->where('show', 1);
-        }
         $trojan = $model->get();
-        for ($i = 0; $i < count($trojan); $i++) {
-            $trojan[$i]['type'] = 'trojan';
-            $groupId = $trojan[$i]['group_id'];
-            if (!in_array($user->group_id, $groupId)) continue;
-            if (strpos($trojan[$i]['port'], '-') !== false) {
-                $trojan[$i]['port'] = Helper::randomPort($trojan[$i]['port']);
+        foreach ($trojan as $key => $v) {
+            if (!$v['show']) continue;
+            $trojan[$key]['type'] = 'trojan';
+            if (!in_array($user->group_id, $trojan[$key]['group_id'])) continue;
+            if (strpos($trojan[$key]['port'], '-') !== false) {
+                $trojan[$key]['port'] = Helper::randomPort($trojan[$key]['port']);
             }
-            if ($trojan[$i]['parent_id']) {
-                $trojan[$i]['last_check_at'] = Cache::get(CacheKey::get('SERVER_TROJAN_LAST_CHECK_AT', $trojan[$i]['parent_id']));
+            if ($trojan[$key]['parent_id']) {
+                $trojan[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_TROJAN_LAST_CHECK_AT', $trojan[$key]['parent_id']));
             } else {
-                $trojan[$i]['last_check_at'] = Cache::get(CacheKey::get('SERVER_TROJAN_LAST_CHECK_AT', $trojan[$i]['id']));
+                $trojan[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_TROJAN_LAST_CHECK_AT', $trojan[$key]['id']));
             }
-            array_push($servers, $trojan[$i]->toArray());
+            $servers[] = $trojan[$key]->toArray();
         }
         return $servers;
     }
 
-    public function getShadowsocks(User $user, $all = false)
+    public function getAvailableShadowsocks(User $user)
     {
         $servers = [];
         $model = ServerShadowsocks::orderBy('sort', 'ASC');
-        if (!$all) {
-            $model->where('show', 1);
-        }
-        $shadowsocks = $model->get();
-        for ($i = 0; $i < count($shadowsocks); $i++) {
-            $shadowsocks[$i]['type'] = 'shadowsocks';
-            $groupId = $shadowsocks[$i]['group_id'];
-            if (!in_array($user->group_id, $groupId)) continue;
-            if (strpos($shadowsocks[$i]['port'], '-') !== false) {
-                $shadowsocks[$i]['port'] = Helper::randomPort($shadowsocks[$i]['port']);
+        $shadowsocks = $model->get()->keyBy('id');
+        foreach ($shadowsocks as $key => $v) {
+            if (!$v['show']) continue;
+            $shadowsocks[$key]['type'] = 'shadowsocks';
+            $shadowsocks[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_SHADOWSOCKS_LAST_CHECK_AT', $v['id']));
+            if (!in_array($user->group_id, $v['group_id'])) continue;
+            if (strpos($v['port'], '-') !== false) {
+                $shadowsocks[$key]['port'] = Helper::randomPort($v['port']);
             }
-            if ($shadowsocks[$i]['parent_id']) {
-                $shadowsocks[$i]['last_check_at'] = Cache::get(CacheKey::get('SERVER_SHADOWSOCKS_LAST_CHECK_AT', $shadowsocks[$i]['parent_id']));
-            } else {
-                $shadowsocks[$i]['last_check_at'] = Cache::get(CacheKey::get('SERVER_SHADOWSOCKS_LAST_CHECK_AT', $shadowsocks[$i]['id']));
+            if (isset($shadowsocks[$v['parent_id']])) {
+                $shadowsocks[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_SHADOWSOCKS_LAST_CHECK_AT', $v['parent_id']));
+                $shadowsocks[$key]['created_at'] = $shadowsocks[$v['parent_id']]['created_at'];
             }
-            array_push($servers, $shadowsocks[$i]->toArray());
+            $servers[] = $shadowsocks[$key]->toArray();
         }
         return $servers;
     }
 
-    public function getAvailableServers(User $user, $all = false)
+    public function getAvailableServers(User $user)
     {
         $servers = array_merge(
-            $this->getShadowsocks($user, $all),
-            $this->getV2ray($user, $all),
-            $this->getTrojan($user, $all)
+            $this->getAvailableShadowsocks($user),
+            $this->getAvailableVmess($user),
+            $this->getAvailableTrojan($user)
         );
         $tmp = array_column($servers, 'sort');
         array_multisort($tmp, SORT_ASC, $servers);
-        $servers = array_map(function ($server) {
+        return array_map(function ($server) {
             $server['port'] = (int)$server['port'];
+            $server['is_online'] = (time() - 300 > $server['last_check_at']) ? 0 : 1;
+            $server['cache_key'] = "{$server['type']}-{$server['id']}-{$server['updated_at']}-{$server['is_online']}";
             return $server;
         }, $servers);
-        return $servers;
     }
 
     public function getAvailableUsers($groupId)
@@ -157,45 +149,46 @@ class ServerService
         }
     }
 
-    public function getShadowsocksServers()
+    public function getAllShadowsocks()
     {
-        $server = ServerShadowsocks::orderBy('sort', 'ASC')->get();
-        for ($i = 0; $i < count($server); $i++) {
-            $server[$i]['type'] = 'shadowsocks';
+        $servers = ServerShadowsocks::orderBy('sort', 'ASC')
+            ->get()
+            ->toArray();
+        foreach ($servers as $k => $v) {
+            $servers[$k]['type'] = 'shadowsocks';
         }
-        return $server->toArray();
+        return $servers;
     }
 
-    public function getV2rayServers()
+    public function getAllVMess()
     {
-        $server = ServerV2ray::orderBy('sort', 'ASC')->get();
-        for ($i = 0; $i < count($server); $i++) {
-            $server[$i]['type'] = 'v2ray';
+        $servers = ServerVmess::orderBy('sort', 'ASC')
+            ->get()
+            ->toArray();
+        foreach ($servers as $k => $v) {
+            $servers[$k]['type'] = 'vmess';
         }
-        return $server->toArray();
+        return $servers;
     }
 
-    public function getTrojanServers()
+    public function getAllTrojan()
     {
-        $server = ServerTrojan::orderBy('sort', 'ASC')->get();
-        for ($i = 0; $i < count($server); $i++) {
-            $server[$i]['type'] = 'trojan';
+        $servers = ServerTrojan::orderBy('sort', 'ASC')
+            ->get()
+            ->toArray();
+        foreach ($servers as $k => $v) {
+            $servers[$k]['type'] = 'trojan';
         }
-        return $server->toArray();
+        return $servers;
     }
 
     private function mergeData(&$servers)
     {
         foreach ($servers as $k => $v) {
-            $serverType = strtoupper($servers[$k]['type']);
-            $servers[$k]['online'] = Cache::get(CacheKey::get("SERVER_{$serverType}_ONLINE_USER", $servers[$k]['parent_id'] ? $servers[$k]['parent_id'] : $servers[$k]['id']));
-            if ($servers[$k]['parent_id']) {
-                $servers[$k]['last_check_at'] = Cache::get(CacheKey::get("SERVER_{$serverType}_LAST_CHECK_AT", $servers[$k]['parent_id']));
-                $servers[$k]['last_push_at'] = Cache::get(CacheKey::get("SERVER_{$serverType}_LAST_PUSH_AT", $servers[$k]['parent_id']));
-            } else {
-                $servers[$k]['last_check_at'] = Cache::get(CacheKey::get("SERVER_{$serverType}_LAST_CHECK_AT", $servers[$k]['id']));
-                $servers[$k]['last_push_at'] = Cache::get(CacheKey::get("SERVER_{$serverType}_LAST_PUSH_AT", $servers[$k]['id']));
-            }
+            $serverType = strtoupper($v['type']);
+            $servers[$k]['online'] = Cache::get(CacheKey::get("SERVER_{$serverType}_ONLINE_USER", $v['parent_id'] ?? $v['id']));
+            $servers[$k]['last_check_at'] = Cache::get(CacheKey::get("SERVER_{$serverType}_LAST_CHECK_AT", $v['parent_id'] ?? $v['id']));
+            $servers[$k]['last_push_at'] = Cache::get(CacheKey::get("SERVER_{$serverType}_LAST_PUSH_AT", $v['parent_id'] ?? $v['id']));
             if ((time() - 300) >= $servers[$k]['last_check_at']) {
                 $servers[$k]['available_status'] = 0;
             } else if ((time() - 300) >= $servers[$k]['last_push_at']) {
@@ -209,9 +202,9 @@ class ServerService
     public function getAllServers()
     {
         $servers = array_merge(
-            $this->getShadowsocksServers(),
-            $this->getV2rayServers(),
-            $this->getTrojanServers()
+            $this->getAllShadowsocks(),
+            $this->getAllVMess(),
+            $this->getAllTrojan()
         );
         $this->mergeData($servers);
         $tmp = array_column($servers, 'sort');
@@ -234,8 +227,8 @@ class ServerService
     public function getServer($serverId, $serverType)
     {
         switch ($serverType) {
-            case 'v2ray':
-                return ServerV2ray::find($serverId);
+            case 'vmess':
+                return ServerVmess::find($serverId);
             case 'shadowsocks':
                 return ServerShadowsocks::find($serverId);
             case 'trojan':

+ 3 - 0
app/Services/UserService.php

@@ -44,6 +44,9 @@ class UserService
         $md = date('m-d', $expiredAt);
         $nowYear = strtotime(date("Y-{$md}"));
         $nextYear = strtotime('+1 year', $nowYear);
+        if ($nowYear > time()) {
+            return (int)(($nowYear - time()) / 86400);
+        }
         return (int)(($nextYear - time()) / 86400);
     }
 

+ 3 - 3
app/Utils/CacheKey.php

@@ -7,9 +7,9 @@ class CacheKey
     CONST KEYS = [
         'EMAIL_VERIFY_CODE' => '邮箱验证码',
         'LAST_SEND_EMAIL_VERIFY_TIMESTAMP' => '最后一次发送邮箱验证码时间',
-        'SERVER_V2RAY_ONLINE_USER' => '节点在线用户',
-        'SERVER_V2RAY_LAST_CHECK_AT' => '节点最后检查时间',
-        'SERVER_V2RAY_LAST_PUSH_AT' => '节点最后推送时间',
+        'SERVER_VMESS_ONLINE_USER' => '节点在线用户',
+        'SERVER_VMESS_LAST_CHECK_AT' => '节点最后检查时间',
+        'SERVER_VMESS_LAST_PUSH_AT' => '节点最后推送时间',
         'SERVER_TROJAN_ONLINE_USER' => 'trojan节点在线用户',
         'SERVER_TROJAN_LAST_CHECK_AT' => 'trojan节点最后检查时间',
         'SERVER_TROJAN_LAST_PUSH_AT' => 'trojan节点最后推送时间',

+ 2 - 2
app/Utils/Helper.php

@@ -30,8 +30,8 @@ class Helper
 
     public static function generateOrderNo(): string
     {
-        $randomChar = rand(10000, 99999);
-        return date('YmdHms') . $randomChar;
+        $randomChar = mt_rand(10000, 99999);
+        return date('YmdHms') . substr(microtime(), 2, 6) . $randomChar;
     }
 
     public static function exchange($from, $to)

+ 1 - 1
config/app.php

@@ -237,5 +237,5 @@ return [
     | The only modification by laravel config
     |
     */
-    'version' => '1.7.2.1671471846226'
+    'version' => '1.7.3.1672843907081'
 ];

+ 9 - 8
database/install.sql

@@ -134,7 +134,8 @@ CREATE TABLE `v2_order` (
                             `paid_at` int(11) DEFAULT NULL,
                             `created_at` int(11) NOT NULL,
                             `updated_at` int(11) NOT NULL,
-                            PRIMARY KEY (`id`)
+                            PRIMARY KEY (`id`),
+                            UNIQUE KEY `trade_no` (`trade_no`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
@@ -163,11 +164,11 @@ CREATE TABLE `v2_plan` (
                            `group_id` int(11) NOT NULL,
                            `transfer_enable` int(11) NOT NULL,
                            `speed_limit` int(11) DEFAULT NULL,
-                           `name` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
+                           `name` varchar(255) NOT NULL,
                            `show` tinyint(1) NOT NULL DEFAULT '0',
                            `sort` int(11) DEFAULT NULL,
                            `renew` tinyint(1) NOT NULL DEFAULT '1',
-                           `content` text CHARACTER SET utf8mb4,
+                           `content` text,
                            `month_price` int(11) DEFAULT NULL,
                            `quarter_price` int(11) DEFAULT NULL,
                            `half_year_price` int(11) DEFAULT NULL,
@@ -181,7 +182,7 @@ CREATE TABLE `v2_plan` (
                            `created_at` int(11) NOT NULL,
                            `updated_at` int(11) NOT NULL,
                            PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
 
 DROP TABLE IF EXISTS `v2_server_group`;
@@ -252,8 +253,8 @@ CREATE TABLE `v2_server_trojan` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='trojan伺服器表';
 
 
-DROP TABLE IF EXISTS `v2_server_v2ray`;
-CREATE TABLE `v2_server_v2ray` (
+DROP TABLE IF EXISTS `v2_server_vmess`;
+CREATE TABLE `v2_server_vmess` (
                                    `id` int(11) NOT NULL AUTO_INCREMENT,
                                    `group_id` varchar(255) NOT NULL,
                                    `route_id` varchar(255) DEFAULT NULL,
@@ -265,7 +266,7 @@ CREATE TABLE `v2_server_v2ray` (
                                    `tls` tinyint(4) NOT NULL DEFAULT '0',
                                    `tags` varchar(255) DEFAULT NULL,
                                    `rate` varchar(11) NOT NULL,
-                                   `network` text NOT NULL,
+                                   `network` varchar(11) NOT NULL,
                                    `rules` text,
                                    `networkSettings` text,
                                    `tlsSettings` text,
@@ -397,4 +398,4 @@ CREATE TABLE `v2_user` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
--- 2022-12-15 05:24:08
+-- 2023-03-07 13:10:15

+ 15 - 0
database/update.sql

@@ -642,3 +642,18 @@ CREATE TABLE `v2_server_route` (
 
 ALTER TABLE `v2_server_route`
     CHANGE `match` `match` text COLLATE 'utf8mb4_general_ci' NOT NULL AFTER `remarks`;
+
+ALTER TABLE `v2_order`
+    ADD UNIQUE `trade_no` (`trade_no`);
+
+ALTER TABLE `v2_plan`
+    CHANGE `content` `content` text COLLATE 'utf8mb4_general_ci' NULL AFTER `renew`;
+
+ALTER TABLE `v2_plan`
+    COLLATE 'utf8mb4_general_ci';
+
+ALTER TABLE `v2_server_v2ray`
+    RENAME TO `v2_server_vmess`;
+
+ALTER TABLE `v2_server_vmess`
+    CHANGE `network` `network` varchar(11) COLLATE 'utf8mb4_general_ci' NOT NULL AFTER `rate`;

File diff suppressed because it is too large
+ 0 - 0
public/assets/admin/umi.js


File diff suppressed because it is too large
+ 0 - 0
public/theme/v2board/assets/components.async.js


File diff suppressed because it is too large
+ 0 - 0
public/theme/v2board/assets/umi.js


File diff suppressed because it is too large
+ 0 - 0
public/theme/v2board/assets/vendors.async.js


+ 1 - 1
resources/rules/default.clash.yaml

@@ -17,7 +17,7 @@ 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:

Some files were not shown because too many files changed in this diff