瀏覽代碼

chore: use pdo instead of DatatablesHelper

M1Screw 2 年之前
父節點
當前提交
1a27476dfd

+ 5 - 5
app/routes.php

@@ -85,11 +85,12 @@ return static function (Slim\App $app): void {
 
         $group->get('/code_check', App\Controllers\UserController::class . ':codeCheck');
         $group->post('/code', App\Controllers\UserController::class . ':codePost');
-        $group->post('/ga_check', App\Controllers\UserController::class . ':checkGa');
-        $group->post('/ga_set', App\Controllers\UserController::class . ':setGa');
-        $group->get('/ga_reset', App\Controllers\UserController::class . ':resetGa');
+        // MFA
+        $group->post('/ga_check', App\Controllers\User\MFAController::class . ':checkGa');
+        $group->post('/ga_set', App\Controllers\User\MFAController::class . ':setGa');
+        $group->post('/ga_reset', App\Controllers\User\MFAController::class . ':resetGa');
+        // Telegram
         $group->post('/telegram_reset', App\Controllers\UserController::class . ':resetTelegram');
-        $group->post('/unblock', App\Controllers\UserController::class . ':unblock');
         $group->get('/bought', App\Controllers\UserController::class . ':bought');
         $group->delete('/bought', App\Controllers\UserController::class . ':deleteBoughtGet');
         $group->post('/url_reset', App\Controllers\UserController::class . ':resetURL');
@@ -142,7 +143,6 @@ return static function (Slim\App $app): void {
         $group->get('', App\Controllers\AdminController::class . ':index');
         $group->get('/', App\Controllers\AdminController::class . ':index');
 
-        $group->get('/sys', App\Controllers\AdminController::class . ':sys');
         $group->get('/invite', App\Controllers\AdminController::class . ':invite');
         $group->post('/invite', App\Controllers\AdminController::class . ':addInvite');
         $group->post('/chginvite', App\Controllers\AdminController::class . ':chgInvite');

+ 2 - 1
composer.json

@@ -41,7 +41,8 @@
         "sort-packages": true,
         "optimize-autoloader": true,
         "allow-plugins": {
-            "dealerdirect/phpcodesniffer-composer-installer": true
+            "dealerdirect/phpcodesniffer-composer-installer": true,
+            "php-http/discovery": true
         }
     },
     "require-dev": {

+ 4 - 4
resources/views/tabler/user/edit.tpl

@@ -522,7 +522,7 @@
 
     <script>
         var qrcode = new QRCode('qrcode', {
-            text: "{$user->getGAurl()}",
+            text: "{$gaurl}",
             width: 128,
             height: 128,
             colorDark: '#000000',
@@ -757,7 +757,7 @@
         $("#reset-2fa").click(function() {
             $.ajax({
                 type: "POST",
-                url: "/user/gareset",
+                url: "/user/ga_reset",
                 dataType: "json",
                 success: function(data) {
                     if (data.ret == 1) {
@@ -774,7 +774,7 @@
         $("#test-2fa").click(function() {
             $.ajax({
                 type: "POST",
-                url: "/user/gacheck",
+                url: "/user/ga_check",
                 dataType: "json",
                 data: {
                     code: $('#2fa-test-code').val()
@@ -794,7 +794,7 @@
         $("#save-2fa").click(function() {
             $.ajax({
                 type: "POST",
-                url: "/user/gaset",
+                url: "/user/ga_set",
                 dataType: "json",
                 data: {
                     enable: $('#ga-enable').val()

+ 2 - 2
resources/views/tabler/user/invite.tpl

@@ -50,9 +50,9 @@
                     </div>
                 </div>
                 <div class="col-12">
-                    <div class="card">
+                    <div class="card my-3">
                         <div class="card-header">
-                            <h3 class="card-title my-3">返利记录</h3>
+                            <h3 class="card-title">返利记录</h3>
                         </div>
                         {if $paybacks->count() != '0'}
                             <div class="table-responsive">

+ 0 - 6
src/Command/Job.php

@@ -24,7 +24,6 @@ use App\Models\UserSubscribeLog;
 use App\Services\Analytics;
 use App\Services\DB;
 use App\Services\Mail;
-use App\Utils\DatatablesHelper;
 use App\Utils\Telegram;
 use App\Utils\Tools;
 use Exception;
@@ -76,11 +75,6 @@ EOL;
         TelegramSession::where('datetime', '<', \time() - 900)->delete();
         // ------- 清理各表记录
 
-        // ------- 重置自增 ID
-        $db = new DatatablesHelper();
-        Tools::resetAutoIncrement($db, 'node_online_log');
-        // ------- 重置自增 ID
-
         // ------- 用户每日流量报告
         $users = User::all();
 

+ 3 - 4
src/Command/Tool.php

@@ -7,11 +7,11 @@ namespace App\Command;
 use App\Models\Node;
 use App\Models\Setting;
 use App\Models\User as ModelsUser;
-use App\Utils\GA;
 use App\Utils\Hash;
 use App\Utils\Tools;
 use Exception;
 use Ramsey\Uuid\Uuid;
+use Vectorface\GoogleAuthenticator;
 
 final class Tool extends Command
 {
@@ -218,9 +218,8 @@ EOL;
     {
         $users = ModelsUser::all();
         foreach ($users as $user) {
-            $ga = new GA();
+            $ga = new GoogleAuthenticator();
             $secret = $ga->createSecret();
-
             $user->ga_token = $secret;
             $user->save();
         }
@@ -299,7 +298,7 @@ EOL;
             $user->node_speedlimit = 0;
             $user->theme = $_ENV['theme'];
 
-            $ga = new GA();
+            $ga = new GoogleAuthenticator();
             $secret = $ga->createSecret();
             $user->ga_token = $secret;
             $user->ga_enable = 0;

+ 1 - 1
src/Command/Update.php

@@ -71,7 +71,7 @@ final class Update extends Command
 
             echo '新增 .config.php 配置项:' . $difference . ':' . $comment . PHP_EOL;
         }
-        echo '没有任何新.config.php 配置项需要添加' . PHP_EOL;
+        echo '没有任何新 .config.php 配置项需要添加' . PHP_EOL;
 
         file_put_contents(BASE_PATH . '/config/.config.php', $config_new);
         echo PHP_EOL . '迁移完成' . PHP_EOL;

+ 4 - 103
src/Controllers/AdminController.php

@@ -4,13 +4,13 @@ declare(strict_types=1);
 
 namespace App\Controllers;
 
-use App\Models\Coupon;
 use App\Models\User;
 use App\Services\Analytics;
-use App\Utils\DatatablesHelper;
+use App\Services\Config;
 use App\Utils\ResponseHelper;
 use App\Utils\Tools;
 use Ozdemir\Datatables\Datatables;
+use Ozdemir\Datatables\DB\MySQL;
 use Slim\Http\Response;
 use Slim\Http\ServerRequest;
 
@@ -33,19 +33,6 @@ final class AdminController extends BaseController
         );
     }
 
-    /**
-     * 统计信息
-     *
-     * @param array     $args
-     */
-    public function sys(ServerRequest $request, Response $response, array $args)
-    {
-        return $response->write(
-            $this->view()
-                ->fetch('admin/index.tpl')
-        );
-    }
-
     /**
      * 后台邀请返利页面
      *
@@ -76,13 +63,13 @@ final class AdminController extends BaseController
      */
     public function ajaxPayback(ServerRequest $request, Response $response, array $args)
     {
-        $datatables = new Datatables(new DatatablesHelper());
+        $datatables = new Datatables(new MySQL(Config::getDbConfig()));
         $datatables->query('Select payback.id,payback.total,payback.userid as event_user_id,event_user.user_name as event_user_name,payback.ref_by as ref_user_id,ref_user.user_name as ref_user_name,payback.ref_get,payback.datetime from payback,user as event_user,user as ref_user where event_user.id = payback.userid and ref_user.id = payback.ref_by');
         $datatables->edit('datetime', static function ($data) {
             return date('Y-m-d H:i:s', $data['datetime']);
         });
         return $response->write(
-            $datatables->generate()
+            (string) $datatables->generate()
         );
     }
 
@@ -156,90 +143,4 @@ final class AdminController extends BaseController
             'msg' => '邀请次数添加成功',
         ]);
     }
-
-    /**
-     * 后台商品优惠码页面
-     *
-     * @param array     $args
-     */
-    public function coupon(ServerRequest $request, Response $response, array $args)
-    {
-        return $response->write(
-            $this->view()
-                ->assign('table_config', ResponseHelper::buildTableConfig([
-                    'id' => 'ID',
-                    'code' => '优惠码',
-                    'expire' => '过期时间',
-                    'shop' => '限定商品ID',
-                    'credit' => '额度',
-                    'onetime' => '次数',
-                ], 'coupon/ajax'))
-                ->fetch('admin/coupon.tpl')
-        );
-    }
-
-    /**
-     * 后台商品优惠码页面 AJAX
-     *
-     * @param array     $args
-     */
-    public function ajaxCoupon(ServerRequest $request, Response $response, array $args)
-    {
-        $datatables = new Datatables(new DatatablesHelper());
-        $datatables->query('Select id,code,expire,shop,credit,onetime from coupon');
-        $datatables->edit('expire', static function ($data) {
-            return date('Y-m-d H:i:s', $data['expire']);
-        });
-        return $response->write(
-            $datatables->generate()
-        );
-    }
-
-    /**
-     * 添加优惠码
-     *
-     * @param array     $args
-     */
-    public function addCoupon(ServerRequest $request, Response $response, array $args)
-    {
-        $generate_type = (int) $request->getParam('generate_type');
-        $final_code = $request->getParam('prefix');
-        if (! isset($final_code) && \in_array($generate_type, [1, 3])) {
-            return $response->withJson([
-                'ret' => 0,
-                'msg' => '优惠码不能为空',
-            ]);
-        }
-        if ($generate_type === 1) {
-            if (Coupon::where('code', $final_code)->count() !== 0) {
-                return $response->withJson([
-                    'ret' => 0,
-                    'msg' => '优惠码已存在',
-                ]);
-            }
-        } else {
-            while (true) {
-                $code_str = Tools::genRandomChar(8);
-                if ($generate_type === 3) {
-                    $final_code .= $code_str;
-                } else {
-                    $final_code = $code_str;
-                }
-                if (Coupon::where('code', $final_code)->count() === 0) {
-                    break;
-                }
-            }
-        }
-        $code = new Coupon();
-        $code->onetime = $request->getParam('onetime');
-        $code->code = $final_code;
-        $code->expire = \time() + $request->getParam('expire') * 3600;
-        $code->shop = $request->getParam('shop');
-        $code->credit = $request->getParam('credit');
-        $code->save();
-        return $response->withJson([
-            'ret' => 1,
-            'msg' => '优惠码添加成功',
-        ]);
-    }
 }

+ 85 - 0
src/Controllers/User/MFAController.php

@@ -0,0 +1,85 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controllers\User;
+
+use App\Controllers\BaseController;
+use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+use Vectorface\GoogleAuthenticator;
+
+/**
+ *  MFAController
+ */
+final class MFAController extends BaseController
+{
+    /**
+     * @param array     $args
+     */
+    public function checkGa(ServerRequest $request, Response $response, array $args)
+    {
+        $code = $request->getParam('code');
+        if ($code === '') {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '二维码不能为空',
+            ]);
+        }
+        $user = $this->user;
+        $ga = new GoogleAuthenticator();
+        $rcode = $ga->verifyCode($user->ga_token, $code);
+        if (! $rcode) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '测试错误',
+            ]);
+        }
+        return $response->withJson([
+            'ret' => 1,
+            'msg' => '测试成功',
+        ]);
+    }
+
+    /**
+     * @param array     $args
+     */
+    public function setGa(ServerRequest $request, Response $response, array $args)
+    {
+        $enable = $request->getParam('enable');
+        if ($enable === '') {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '选项无效',
+            ]);
+        }
+        $user = $this->user;
+        $user->ga_enable = $enable;
+        $user->save();
+        return $response->withJson([
+            'ret' => 1,
+            'msg' => '设置成功',
+        ]);
+    }
+
+    /**
+     * @param array     $args
+     */
+    public function resetGa(ServerRequest $request, Response $response, array $args)
+    {
+        $ga = new GoogleAuthenticator();
+        $secret = $ga->createSecret();
+        $user = $this->user;
+        $user->ga_token = $secret;
+        if ($user->save()) {
+            return $response->withJson([
+                'ret' => 1,
+                'msg' => '重置成功',
+            ]);
+        }
+        return $response->withJson([
+            'ret' => 0,
+            'msg' => '重置失败',
+        ]);
+    }
+}

+ 6 - 65
src/Controllers/UserController.php

@@ -22,10 +22,11 @@ use App\Models\UserSubscribeLog;
 use App\Services\Auth;
 use App\Services\Captcha;
 use App\Services\Config;
+use App\Services\DB;
+use App\Services\MFA;
 use App\Services\Payment;
 use App\Utils\Check;
 use App\Utils\Cookie;
-use App\Utils\DatatablesHelper;
 use App\Utils\Hash;
 use App\Utils\QQWry;
 use App\Utils\ResponseHelper;
@@ -35,7 +36,6 @@ use App\Utils\URL;
 use Ramsey\Uuid\Uuid;
 use Slim\Http\Response;
 use Slim\Http\ServerRequest;
-use Vectorface\GoogleAuthenticator;
 use voku\helper\AntiXSS;
 
 /**
@@ -202,54 +202,6 @@ final class UserController extends BaseController
         ]);
     }
 
-    /**
-     * @param array     $args
-     */
-    public function checkGa(ServerRequest $request, Response $response, array $args)
-    {
-        $code = $request->getParam('code');
-        if ($code === '') {
-            return $response->withJson([
-                'ret' => 0,
-                'msg' => '二维码不能为空',
-            ]);
-        }
-        $user = $this->user;
-        $ga = new GoogleAuthenticator();
-        $rcode = $ga->verifyCode($user->ga_token, $code);
-        if (! $rcode) {
-            return $response->withJson([
-                'ret' => 0,
-                'msg' => '测试错误',
-            ]);
-        }
-        return $response->withJson([
-            'ret' => 1,
-            'msg' => '测试成功',
-        ]);
-    }
-
-    /**
-     * @param array     $args
-     */
-    public function setGa(ServerRequest $request, Response $response, array $args)
-    {
-        $enable = $request->getParam('enable');
-        if ($enable === '') {
-            return $response->withJson([
-                'ret' => 0,
-                'msg' => '选项无效',
-            ]);
-        }
-        $user = $this->user;
-        $user->ga_enable = $enable;
-        $user->save();
-        return $response->withJson([
-            'ret' => 1,
-            'msg' => '设置成功',
-        ]);
-    }
-
     /**
      * @param array     $args
      */
@@ -274,19 +226,6 @@ final class UserController extends BaseController
         ]);
     }
 
-    /**
-     * @param array     $args
-     */
-    public function resetGa(ServerRequest $request, Response $response, array $args)
-    {
-        $ga = new GoogleAuthenticator();
-        $secret = $ga->createSecret();
-        $user = $this->user;
-        $user->ga_token = $secret;
-        $user->save();
-        return $response->withStatus(302)->withHeader('Location', '/user/edit');
-    }
-
     /**
      * @param array     $args
      */
@@ -386,8 +325,8 @@ final class UserController extends BaseController
     public function media(ServerRequest $request, Response $response, array $args)
     {
         $results = [];
-        $db = new DatatablesHelper();
-        $nodes = $db->query('SELECT DISTINCT node_id FROM stream_media');
+        $pdo = DB::getPdo();
+        $nodes = $pdo->query('SELECT DISTINCT node_id FROM stream_media');
 
         foreach ($nodes as $node_id) {
             $node = Node::where('id', $node_id)->first();
@@ -453,12 +392,14 @@ final class UserController extends BaseController
         $themes = Tools::getDir(BASE_PATH . '/resources/views');
         $bind_token = TelegramSessionManager::addBindSession($this->user);
         $methods = Config::getSupportParam('method');
+        $gaurl = MFA::getGAurl($this->user);
 
         return $reponse->write($this->view()
             ->assign('user', $this->user)
             ->assign('themes', $themes)
             ->assign('bind_token', $bind_token)
             ->assign('methods', $methods)
+            ->assign('gaurl', $gaurl)
             ->assign('telegram_bot', $_ENV['telegram_bot'])
             ->registerClass('Config', Config::class)
             ->fetch('user/edit.tpl'));

+ 3 - 3
src/Models/Ip.php

@@ -4,7 +4,7 @@ declare(strict_types=1);
 
 namespace App\Models;
 
-use App\Utils\DatatablesHelper;
+use App\Services\DB;
 use App\Utils\QQWry;
 use App\Utils\Tools;
 
@@ -76,9 +76,9 @@ final class Ip extends Model
 
     public function getUserAliveIpCount()
     {
-        $db = new DatatablesHelper();
+        $pdo = DB::getPdo();
         $res = [];
-        foreach ($db->query('SELECT `userid`, COUNT(DISTINCT `ip`) AS `count` FROM `alive_ip` WHERE `datetime` >= UNIX_TIMESTAMP(NOW()) - 60 GROUP BY `userid`') as $line) {
+        foreach ($pdo->query('SELECT `userid`, COUNT(DISTINCT `ip`) AS `count` FROM `alive_ip` WHERE `datetime` >= UNIX_TIMESTAMP(NOW()) - 60 GROUP BY `userid`') as $line) {
             $res[strval($line['userid'])] = $line['count'];
         }
         return $res;

+ 0 - 5
src/Models/User.php

@@ -287,11 +287,6 @@ final class User extends Model
         return date('Ymd') !== date('Ymd', $this->last_check_in_time);
     }
 
-    public function getGAurl()
-    {
-        return 'otpauth://totp/' . urlencode($_ENV['appName'] . '-' . $this->email . '-两步验证码') . '?secret=' . $this->ga_token . '';
-    }
-
     /**
      * 获取用户的邀请码
      */

+ 13 - 0
src/Services/MFA.php

@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Services;
+
+final class MFA
+{
+    public static function getGAurl($user)
+    {
+        return 'otpauth://totp/' . rawurlencode($_ENV['appName'] . ' (' . $user->email . ')') . '?secret=' . $user->ga_token . '';
+    }
+}

+ 0 - 51
src/Utils/DatatablesHelper.php

@@ -1,51 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace App\Utils;
-
-use App\Services\Config;
-use Illuminate\Database\Capsule\Manager as Capsule;
-use Ozdemir\Datatables\DB\DatabaseInterface;
-
-final class DatatablesHelper implements DatabaseInterface
-{
-    private $escape = [];
-    private $connection;
-
-    public function __construct($config = null)
-    {
-        $capsule = new Capsule();
-        $capsule->addConnection(Config::getDbConfig(), 'default');
-        $this->connection = $capsule->getConnection('default');
-        $this->connection->query("set session sql_mode='';");
-    }
-
-    public function connect()
-    {
-        return $this;
-    }
-
-    public function query($query)
-    {
-        $data = $this->connection->select($query, $this->escape);
-        $row = [];
-        foreach ($data as $item) {
-            $row[] = (array) $item;
-        }
-        return $row;
-    }
-
-    public function count($query)
-    {
-        $query = 'Select count(*) as rowcount,' . substr($query, 6);
-        $data = $this->connection->select($query, $this->escape);
-        return $data[0]->rowcount;
-    }
-
-    public function escape($string)
-    {
-        $this->escape[':escape' . (count($this->escape) + 1)] = '%' . $string . '%';
-        return ':escape' . count($this->escape);
-    }
-}

+ 0 - 13
src/Utils/Tools.php

@@ -313,19 +313,6 @@ final class Tools
         }
     }
 
-    /**
-     * 重置自增列 ID
-     */
-    public static function resetAutoIncrement(DatatablesHelper $db, string $table): void
-    {
-        $maxid = $db->query(
-            "SELECT `auto_increment` AS `maxid` FROM `information_schema`.`tables` WHERE `table_schema` = '" . $_ENV['db_database'] . "' AND `table_name` = '" . $table . "'"
-        )[0]['maxid'];
-        if ($maxid >= 2000000000) {
-            $db->query('ALTER TABLE `' . $table . '` auto_increment = 1');
-        }
-    }
-
     /**
      * Eloquent 分页链接渲染
      *