Browse Source

feature: user filter & user generate

Tokumeikoi 4 years ago
parent
commit
7a2967f41c

+ 1 - 5
app/Http/Controllers/Admin/Server/ShadowsocksController.php

@@ -5,11 +5,7 @@ namespace App\Http\Controllers\Admin\Server;
 use App\Http\Requests\Admin\ServerShadowsocksSave;
 use App\Http\Requests\Admin\ServerShadowsocksSort;
 use App\Http\Requests\Admin\ServerShadowsocksUpdate;
-use App\Http\Requests\Admin\ServerV2raySave;
-use App\Http\Requests\Admin\ServerV2raySort;
-use App\Http\Requests\Admin\ServerV2rayUpdate;
 use App\Models\ServerShadowsocks;
-use App\Services\ServerService;
 use App\Utils\CacheKey;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
@@ -113,7 +109,7 @@ class ShadowsocksController extends Controller
         if (!$server) {
             abort(500, '服务器不存在');
         }
-        if (!Server::create($server->toArray())) {
+        if (!ServerShadowsocks::create($server->toArray())) {
             abort(500, '复制失败');
         }
 

+ 115 - 7
app/Http/Controllers/Admin/UserController.php

@@ -2,28 +2,50 @@
 
 namespace App\Http\Controllers\Admin;
 
+use App\Http\Requests\Admin\UserFetch;
+use App\Http\Requests\Admin\UserGenerate;
 use App\Http\Requests\Admin\UserUpdate;
+use App\Utils\Helper;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use App\Models\Order;
 use App\Models\User;
 use App\Models\Plan;
+use Illuminate\Support\Facades\DB;
 
 class UserController extends Controller
 {
-    public function fetch(Request $request)
+
+    private function filter(Request $request, $builder)
+    {
+        if ($request->input('filter')) {
+            $request->validate([
+                'filter' => 'array',
+                'filter.*.key' => 'required|in:email,transfer_enable,d,expired_at,uuid,token',
+                'filter.*.condition' => 'required|in:>,<,=,>=,<=',
+                'filter.*.value' => 'required'
+            ]);
+            foreach ($request->input('filter') as $filter) {
+                if ($filter['key'] === 'email' && $filter['condition'] === '=') {
+                    $builder->where($filter['key'], 'like', '%' . $filter['value'] . '%');
+                    continue;
+                }
+                if ($filter['key'] === 'd' || $filter['key'] === 'transfer_enable') {
+                    $filter['value'] = $filter['value'] * 1073741824;
+                }
+                $builder->where($filter['key'], $filter['condition'], $filter['value']);
+            }
+        }
+    }
+
+    public function fetch(UserFetch $request)
     {
         $current = $request->input('current') ? $request->input('current') : 1;
         $pageSize = $request->input('pageSize') >= 10 ? $request->input('pageSize') : 10;
         $sortType = in_array($request->input('sort_type'), ['ASC', 'DESC']) ? $request->input('sort_type') : 'DESC';
         $sort = $request->input('sort') ? $request->input('sort') : 'created_at';
         $userModel = User::orderBy($sort, $sortType);
-        if ($request->input('email')) {
-            $userModel->where('email', 'like', '%' . $request->input('email') . '%');
-        }
-        if ($request->input('invite_user_id')) {
-            $userModel->where('invite_user_id', $request->input('invite_user_id'));
-        }
+        $this->filter($request, $userModel);
         $total = $userModel->count();
         $res = $userModel->forPage($current, $pageSize)
             ->get();
@@ -84,4 +106,90 @@ class UserController extends Controller
             'data' => true
         ]);
     }
+
+    public function export(Request $request)
+    {
+        $userModel = new User();
+        $this->filter($request, $userModel);
+        $res = $userModel->get();
+        $plan = Plan::get();
+        for ($i = 0; $i < count($res); $i++) {
+            for ($k = 0; $k < count($plan); $k++) {
+                if ($plan[$k]['id'] == $res[$i]['plan_id']) {
+                    $res[$i]['plan_name'] = $plan[$k]['name'];
+                }
+            }
+        }
+    }
+
+    public function generate(UserGenerate $request)
+    {
+        if ($request->input('email_prefix')) {
+            if ($request->input('plan_id')) {
+                $plan = Plan::find($request->input('plan_id'));
+                if (!$plan) {
+                    abort(500, '订阅计划不存在');
+                }
+            }
+            $user = [
+                'email' => $request->input('email_prefix') . '@' . $request->input('email_suffix'),
+                'plan_id' => isset($plan->id) ? $plan->id : NULL,
+                'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
+                'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
+                'expired_at' => $request->input('expired_at') ?? NULL,
+                'uuid' => Helper::guid(true),
+                'token' => Helper::guid()
+            ];
+            $user['password'] = password_hash($request->input('password') ?? $user['email'], PASSWORD_DEFAULT);
+            if (!User::create($user)) {
+                abort(500, '生成失败');
+            }
+            return response([
+                'data' => true
+            ]);
+        }
+        if ($request->input('count')) {
+            $this->multiGenerate($request);
+        }
+    }
+
+    private function multiGenerate(Request $request)
+    {
+        if ($request->input('plan_id')) {
+            $plan = Plan::find($request->input('plan_id'));
+            if (!$plan) {
+                abort(500, '订阅计划不存在');
+            }
+        }
+        $users = [];
+        for ($i = 0;$i < $request->input('count');$i++) {
+            $user = [
+                'email' => Helper::randomChar(6) . '@' . $request->input('email_suffix'),
+                'plan_id' => isset($plan->id) ? $plan->id : NULL,
+                'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
+                'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
+                'expired_at' => $request->input('expired_at') ?? NULL,
+                'uuid' => Helper::guid(true),
+                'token' => Helper::guid(),
+                'created_at' => time(),
+                'updated_at' => time()
+            ];
+            $user['password'] = password_hash($request->input('password') ?? $user['email'], PASSWORD_DEFAULT);
+            array_push($users, $user);
+        }
+        DB::beginTransaction();
+        if (!User::insert($users)) {
+            DB::rollBack();
+            abort(500, '生成失败');
+        }
+        DB::commit();
+        $data = "账号,密码,过期时间,UUID,创建时间\r\n";
+        foreach($users as $user) {
+            $expireDate = $user['expired_at'] === NULL ? '长期有效' : $user['expired_at'];
+            $createDate = date('Y-m-d H:i:s', $user['created_at']);
+            $password = $request->input('password') ?? $user['email'];
+            $data .= "{$user['email']},{$password},{$expireDate},{$user['uuid']},{$createDate}\r\n";
+        }
+        echo $data;
+    }
 }

+ 28 - 0
app/Http/Requests/Admin/UserFetch.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Http\Requests\Admin;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class UserFetch extends FormRequest
+{
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        return [
+            'filter.*.key' => 'required|in:email,transfer_enable,d,expired_at,uuid,token',
+            'filter.*.condition' => 'required|in:>,<,=,>=,<=',
+            'filter.*.value' => 'required'
+        ];
+    }
+
+    public function messages()
+    {
+        return [
+        ];
+    }
+}

+ 31 - 0
app/Http/Requests/Admin/UserGenerate.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Http\Requests\Admin;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class UserGenerate extends FormRequest
+{
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        return [
+            'count' => 'nullable|integer|max:500',
+            'expired_at' => 'nullable|integer',
+            'plan_id' => 'nullable|integer',
+            'email_prefix' => 'nullable',
+            'email_suffix' => 'required',
+            'password' => 'nullable'
+        ];
+    }
+
+    public function messages()
+    {
+        return [
+        ];
+    }
+}

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

@@ -67,6 +67,7 @@ class AdminRoute
             $router->get ('/user/fetch', 'Admin\\UserController@fetch');
             $router->post('/user/update', 'Admin\\UserController@update');
             $router->get ('/user/getUserInfoById', 'Admin\\UserController@getUserInfoById');
+            $router->post('/user/generate', 'Admin\\UserController@generate');
             // Stat
             $router->get ('/stat/getOverride', 'Admin\\StatController@getOverride');
             // Notice

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


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


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