Browse Source

feat: money log display for admin

M1Screw 2 years ago
parent
commit
644b25e170

+ 12 - 9
app/routes.php

@@ -204,11 +204,6 @@ return static function (Slim\App $app): void {
         $group->post('/detect/log/ajax', App\Controllers\Admin\DetectController::class . ':ajaxLog');
         $group->get('/detect/ban', App\Controllers\Admin\DetectController::class . ':ban');
         $group->post('/detect/ban/ajax', App\Controllers\Admin\DetectController::class . ':ajaxBan');
-        // IP Mange
-        $group->get('/login', App\Controllers\Admin\IpController::class . ':login');
-        $group->get('/alive', App\Controllers\Admin\IpController::class . ':alive');
-        $group->post('/login/ajax', App\Controllers\Admin\IpController::class . ':ajaxLogin');
-        $group->post('/alive/ajax', App\Controllers\Admin\IpController::class . ':ajaxAlive');
         // User Mange
         $group->get('/user', App\Controllers\Admin\UserController::class . ':index');
         $group->get('/user/{id}/edit', App\Controllers\Admin\UserController::class . ':edit');
@@ -223,17 +218,25 @@ return static function (Slim\App $app): void {
         $group->post('/coupon/ajax', App\Controllers\Admin\CouponController::class . ':ajax');
         $group->delete('/coupon/{id}', App\Controllers\Admin\CouponController::class . ':delete');
         $group->post('/coupon/{id}/disable', App\Controllers\Admin\CouponController::class . ':disable');
-        // Subscribe Log Mange
+        // 登录日志 & 在线IP
+        $group->get('/login', App\Controllers\Admin\IpController::class . ':login');
+        $group->get('/alive', App\Controllers\Admin\IpController::class . ':alive');
+        $group->post('/login/ajax', App\Controllers\Admin\IpController::class . ':ajaxLogin');
+        $group->post('/alive/ajax', App\Controllers\Admin\IpController::class . ':ajaxAlive');
+        // 订阅日志
         $group->get('/subscribe', App\Controllers\Admin\SubscribeLogController::class . ':index');
-        $group->post('/subscribe/ajax', App\Controllers\Admin\SubscribeLogController::class . ':ajaxSubscribeLog');
+        $group->post('/subscribe/ajax', App\Controllers\Admin\SubscribeLogController::class . ':ajax');
         // 邀请日志
         $group->get('/invite', App\Controllers\Admin\InviteController::class . ':invite');
         $group->post('/invite/update_invite', App\Controllers\Admin\InviteController::class . ':update');
         $group->post('/invite/add_invite', App\Controllers\Admin\InviteController::class . ':add');
         $group->post('/invite/ajax', App\Controllers\Admin\InviteController::class . ':ajax');
-        // Traffic Log Mange
+        // 流量日志
         $group->get('/trafficlog', App\Controllers\Admin\TrafficLogController::class . ':index');
-        $group->post('/trafficlog/ajax', App\Controllers\Admin\TrafficLogController::class . ':ajaxTrafficLog');
+        $group->post('/trafficlog/ajax', App\Controllers\Admin\TrafficLogController::class . ':ajax');
+        // 用户余额日志
+        $group->get('/moneylog', App\Controllers\Admin\TrafficLogController::class . ':log');
+        $group->post('/moneylog/ajax', App\Controllers\Admin\TrafficLogController::class . ':ajax');
         // 设置中心
         $group->get('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':billing');
         $group->post('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':saveBilling');

+ 0 - 1
config/.config.example.php

@@ -160,7 +160,6 @@ $_ENV['jump_delay']             = 1200;                  //跳转延时,单位
 
 $_ENV['checkNodeIp']            = true;                 //是否webapi验证节点ip
 $_ENV['keep_connect']           = false;               // 流量耗尽用户限速至 1Mbps
-$_ENV['money_from_admin']       = false;            //是否开启管理员修改用户余额时创建充值记录
 
 #Cloudflare
 $_ENV['cloudflare_enable']      = false;         //是否开启 Cloudflare 解析

+ 0 - 3
resources/views/tabler/admin/log/invite.tpl

@@ -163,9 +163,6 @@
                 { data: '{$key}' },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false },
-            ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
                 "<'row card-footer d-flex align-items-center'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",

+ 94 - 0
resources/views/tabler/admin/log/money.tpl

@@ -0,0 +1,94 @@
+{include file='admin/tabler_header.tpl'}
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">余额记录</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">查看用户的余额记录</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="row row-deck row-cards">
+                <div class="col-12">
+                    <div class="card">
+                        <div class="table-responsive">
+                            <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
+                                <thead>
+                                    <tr>
+                                        {foreach $details['field'] as $key => $value}
+                                            <th>{$value}</th>
+                                        {/foreach}
+                                    </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script>
+        var table = $('#data_table').DataTable({
+            ajax: {
+                url: '/admin/moneylog/ajax',
+                type: 'POST',
+                dataSrc: 'money_logs'
+            },
+            "autoWidth":false,
+            'iDisplayLength': 10,
+            'scrollX': true,
+            'order': [
+                [0, 'desc']
+            ],
+            columns: [
+                {foreach $details['field'] as $key => $value}
+                { data: '{$key}' },
+                {/foreach}
+            ],
+            "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
+                "<'row'<'col-sm-12'tr>>" +
+                "<'row card-footer d-flex align-items-center'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
+            language: {
+                "sProcessing": "处理中...",
+                "sLengthMenu": "显示 _MENU_ 条",
+                "sZeroRecords": "没有匹配结果",
+                "sInfo": "第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
+                "sInfoEmpty": "第 0 至 0 项结果,共 0 项",
+                "sInfoFiltered": "(在 _MAX_ 项中查找)",
+                "sInfoPostFix": "",
+                "sSearch": "<i class=\"ti ti-search\"></i> ",
+                "sUrl": "",
+                "sEmptyTable": "表中数据为空",
+                "sLoadingRecords": "载入中...",
+                "sInfoThousands": ",",
+                "oPaginate": {
+                    "sFirst": "首页",
+                    "sPrevious": "<i class=\"ti ti-arrow-left\"></i>",
+                    "sNext": "<i class=\"ti ti-arrow-right\"></i>",
+                    "sLast": "末页"
+                },
+                "oAria": {
+                    "sSortAscending": ": 以升序排列此列",
+                    "sSortDescending": ": 以降序排列此列"
+                }
+            }
+        });
+
+        function loadTable() {
+            table;
+        }
+
+        loadTable();
+    </script>
+
+{include file='admin/tabler_footer.tpl'}

+ 4 - 0
resources/views/tabler/admin/tabler_header.tpl

@@ -177,6 +177,10 @@
                                         <i class="ti ti-friends"></i>&nbsp;
                                         邀请
                                     </a>
+                                    <a class="dropdown-item" href="/admin/moneylog">
+                                        <i class="ti ti-coin"></i>&nbsp;
+                                        余额
+                                    </a>
                                     <a class="dropdown-item" href="/admin/alive">
                                         <i class="ti ti-router"></i>&nbsp;
                                         在线IP

+ 59 - 0
src/Controllers/Admin/MoneyController.php

@@ -0,0 +1,59 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controllers\Admin;
+
+use App\Controllers\BaseController;
+use App\Models\UserMoneyLog;
+use App\Utils\Tools;
+use Exception;
+use Psr\Http\Message\ResponseInterface;
+use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+
+final class MoneyController extends BaseController
+{
+    public static array $details =
+    [
+        'field' => [
+            'id' => '事件ID',
+            'user_id' => '用户ID',
+            'before' => '变动前余额',
+            'after' => '变动后余额',
+            'amount' => '变动金额',
+            'remark' => '备注',
+            'create_time' => '变动时间',
+        ],
+    ];
+
+    /**
+     * 后台用户余额记录页面
+     *
+     * @throws Exception
+     */
+    public function log(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
+    {
+        return $response->write(
+            $this->view()
+                ->assign('details', self::$details)
+                ->fetch('admin/log/money.tpl')
+        );
+    }
+
+    /**
+     * 后台用户余额记录页面 AJAX
+     */
+    public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
+    {
+        $money_logs = UserMoneyLog::orderBy('id', 'desc')->get();
+
+        foreach ($money_logs as $money_log) {
+            $money_log->create_time = Tools::toDateTime((int) $money_log->create_time);
+        }
+
+        return $response->withJson([
+            'money_logs' => $money_logs,
+        ]);
+    }
+}

+ 1 - 1
src/Controllers/Admin/SubscribeLogController.php

@@ -46,7 +46,7 @@ final class SubscribeLogController extends BaseController
     /**
      * 后台订阅记录页面 AJAX
      */
-    public function ajaxSubscribeLog(ServerRequest $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
         $length = $request->getParam('length');
         $page = $request->getParam('start') / $length + 1;

+ 1 - 1
src/Controllers/Admin/TrafficLogController.php

@@ -42,7 +42,7 @@ final class TrafficLogController extends BaseController
     /**
      * 后台流量记录页面 AJAX
      */
-    public function ajaxTrafficLog(ServerRequest $request, Response $response, array $args): ResponseInterface
+    public function ajax(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
         $length = $request->getParam('length');
         $page = $request->getParam('start') / $length + 1;

+ 8 - 2
src/Controllers/Admin/UserController.php

@@ -7,6 +7,7 @@ namespace App\Controllers\Admin;
 use App\Controllers\AuthController;
 use App\Controllers\BaseController;
 use App\Models\User;
+use App\Models\UserMoneyLog;
 use App\Services\Auth;
 use App\Utils\Cookie;
 use App\Utils\Hash;
@@ -168,12 +169,17 @@ final class UserController extends BaseController
             $user->cleanLink();
         }
 
-        $user->addMoneyLog($request->getParam('money') - $user->money);
+        if ($request->getParam('money') !== '' && $request->getParam('money') !== null) {
+            $money = (double) $request->getParam('money');
+            $diff = $money - $user->money;
+            $remark = ($diff > 0 ? '管理员添加余额' : '管理员扣除余额');
+            (new UserMoneyLog())->addMoneyLog($id, $user->money, $money, $diff, $remark);
+            $user->money = $money;
+        }
 
         $user->email = $request->getParam('email');
         $user->user_name = $request->getParam('user_name');
         $user->remark = $request->getParam('remark');
-        $user->money = $request->getParam('money');
         $user->is_admin = $request->getParam('is_admin') === 'true' ? 1 : 0;
         $user->ga_enable = $request->getParam('ga_enable') === 'true' ? 1 : 0;
         $user->use_new_shop = $request->getParam('use_new_shop') === 'true' ? 1 : 0;

+ 1 - 8
src/Controllers/User/InvoiceController.php

@@ -108,14 +108,7 @@ final class InvoiceController extends BaseController
         $user->money -= $invoice->price;
         $user->save();
 
-        $money_log = new UserMoneyLog();
-        $money_log->user_id = $user->id;
-        $money_log->before = $money_before;
-        $money_log->after = $user->money;
-        $money_log->amount = -$invoice->price;
-        $money_log->remark = '支付账单 #' . $invoice->id;
-        $money_log->create_time = time();
-        $money_log->save();
+        (new UserMoneyLog())->addMoneyLog($user->id, $money_before, $user->money, -$invoice->price, '支付账单 #' . $invoice->id);
 
         $invoice->status = 'paid_balance';
         $invoice->update_time = time();

+ 0 - 19
src/Models/User.php

@@ -541,25 +541,6 @@ final class User extends Model
         return '多个有效套餐无法显示.';
     }
 
-    /**
-     * 手动修改用户余额时增加充值记录,受限于 Config
-     *
-     * @param mixed $total 金额
-     */
-    public function addMoneyLog(mixed $total): void
-    {
-        if ($_ENV['money_from_admin'] && $total !== 0.00) {
-            $codeq = new Code();
-            $codeq->code = ($total > 0 ? '管理员赏赐' : '管理员惩戒');
-            $codeq->isused = 1;
-            $codeq->type = -1;
-            $codeq->number = $total;
-            $codeq->usedatetime = date('Y-m-d H:i:s');
-            $codeq->userid = $this->id;
-            $codeq->save();
-        }
-    }
-
     /**
      * 发送邮件
      */

+ 13 - 0
src/Models/UserMoneyLog.php

@@ -4,8 +4,21 @@ declare(strict_types=1);
 
 namespace App\Models;
 
+use function time;
+
 final class UserMoneyLog extends Model
 {
     protected $connection = 'default';
     protected $table = 'user_money_log';
+
+    public function addMoneyLog(int $user_id, float $before, float $after, float $amount, string $remark): void
+    {
+        $this->user_id = $user_id;
+        $this->before = $before;
+        $this->after = $after;
+        $this->amount = $amount;
+        $this->remark = $remark;
+        $this->create_time = time();
+        $this->save();
+    }
 }