浏览代码

自己写接口

cauto 2 年之前
父节点
当前提交
82e01621e5

+ 289 - 0
app/Http/Controllers/Client/ManageController.php

@@ -0,0 +1,289 @@
+<?php
+
+namespace App\Http\Controllers\Client;
+
+use App\Http\Controllers\Controller;
+use App\Http\Requests\Passport\AuthLogin;
+use App\Models\Plan;
+use App\Models\User;
+use App\Services\ServerService;
+use App\Services\UserService;
+use App\Utils\ApiResponse;
+use App\Utils\CacheKey;
+use App\Utils\Helper;
+use Facade\FlareClient\Api;
+use Illuminate\Contracts\Foundation\Application;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
+
+
+class ManageController extends Controller
+{
+    /**
+     * 登录接口
+     * @param AuthLogin $request
+     * @return false|string
+     */
+    function login(Request $request)
+    {
+        $email = $request->input('email');
+        $password = $request->input('password');
+
+        if (empty($email)){
+            return ApiResponse::apiResponse(400,"邮箱不能为空");
+        }
+
+        if (empty($password)){
+            return ApiResponse::apiResponse(400,"密码不能为空");
+        }
+
+        $user = User::where('email', $email)->first();
+        if (!$user) {
+            //abort(200, __('Incorrect email or password'));
+            return ApiResponse::apiResponse(400,"账号或者密码错误");
+        }
+        if (!Helper::multiPasswordVerify(
+            $user->password_algo,
+            $user->password_salt,
+            $password,
+            $user->password)
+        ) {
+            return ApiResponse::apiResponse(400,"账号或者密码错误");
+        }
+
+        if ($user->banned) {
+//            abort(500, __('Your account has been suspended'));
+            return ApiResponse::apiResponse(300,"账户已经被禁用");
+        }
+
+        $data = [
+            'token' => $user->token,
+            'auth_data' => base64_encode("{$user->email}:{$user->password}")
+        ];
+
+        if ($user->is_admin) $data['is_admin'] = true;
+//        return response([
+//            'data' => $data
+//        ]);
+        return ApiResponse::apiResponse(0,"",$data);
+    }
+
+    /**
+     * 注册接口
+     * @return \Illuminate\Http\JsonResponse
+     */
+    function register(Request $request)
+    {
+        if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
+            $registerCountByIP = Cache::get(CacheKey::get('REGISTER_IP_RATE_LIMIT', $request->ip())) ?? 0;
+            if ((int)$registerCountByIP >= (int)config('v2board.register_limit_count', 3)) {
+                abort(500, __('Register frequently, please try again after 1 hour'));
+            }
+        }
+
+        $email = $request->input('email');
+        $password = $request->input('password');
+        $exist = User::where('email', $email)->first();
+        if ($exist) {
+            return ApiResponse::apiResponse(400,"账号已经存在");
+        }
+        $user = new User();
+        $user->email = $email;
+        $user->password = password_hash($password, PASSWORD_DEFAULT);
+        $user->uuid = Helper::guid(true);
+        $user->token = Helper::guid();
+        // try out
+        if ((int)config('v2board.try_out_plan_id', 0)) {
+            $plan = Plan::find(config('v2board.try_out_plan_id'));
+            if ($plan) {
+                $user->transfer_enable = $plan->transfer_enable * 1073741824;
+                $user->plan_id = $plan->id;
+                $user->group_id = $plan->group_id;
+                $user->expired_at = time() + (config('v2board.try_out_hour', 1) * 3600);
+            }
+        }
+        if (!$user->save()) {
+            return ApiResponse::apiResponse(400,"注册失败");
+        }
+
+        $data = [
+            'token' => $user->token,
+            'auth_data' => base64_encode("{$user->email}:{$user->password}")
+        ];
+
+        $user->last_login_at = time();
+        $user->save();
+
+        if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
+            Cache::put(
+                CacheKey::get('REGISTER_IP_RATE_LIMIT', $request->ip()),
+                (int)$registerCountByIP + 1,
+                (int)config('v2board.register_limit_expire', 60) * 60
+            );
+        }
+        return ApiResponse::apiResponse(0,"注册成功",$data);
+    }
+
+    /**
+     * 获取我的订阅
+     * @param Request $request
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function getSubscribe(Request $request)
+    {
+        $user = User::where('id', $request->user['id'])
+            ->select([
+                'plan_id',
+                'token',
+                'expired_at',
+                'u',
+                'd',
+                'transfer_enable',
+                'email'
+            ])
+            ->first();
+        if (!$user) {
+            abort(500, __('The user does not exist'));
+        }
+        if ($user->plan_id) {
+            $user['plan'] = Plan::find($user->plan_id);
+            if (!$user['plan']) {
+                abort(500, __('Subscription plan does not exist'));
+            }
+        }
+        $user['subscribe_url'] = Helper::getSubscribeUrl("/api/v1/client/subscribe?token={$user['token']}");
+        $userService = new UserService();
+        $user['reset_day'] = $userService->getResetDay($user);
+        return ApiResponse::apiResponse(0,"",$user);
+    }
+
+    /**
+     * 获取订阅套餐
+     * @param Request $request
+     * @return
+     */
+    public function fetch(Request $request)
+    {
+        $plan = Plan::where('show', 1)->get();
+        return ApiResponse::apiResponse(0,"",$plan);
+    }
+
+    /**
+     * 获取线路
+     * @param Request $request
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function server(Request $request){
+        $user = User::find($request->user['id']);
+        $servers = [];
+        $userService = new UserService();
+        if ($userService->isAvailable($user)) {
+            $serverService = new ServerService();
+            $servers = $serverService->getAvailableServers($user);
+        }
+        if (empty($servers)){
+            return ApiResponse::apiResponse(400,"获取线路失败");
+        }
+        return ApiResponse::apiResponse(0,"",$servers);
+    }
+
+
+    public function getQuickLoginUrl(Request $request)
+    {
+        $authorization = $request->input('auth_data') ?? $request->header('authorization');
+        if (!$authorization)
+            return ApiResponse::apiResponse(403,"未登录或者登录已经过期");
+
+        $authData = explode(':', base64_decode($authorization));
+        if (!isset($authData[0]) || !isset($authData[1]))
+            return ApiResponse::apiResponse(403,"请求异常");
+        $user = User::where('email', $authData[0])
+            ->where('password', $authData[1])
+            ->first();
+        if (!$user) {
+            //abort(500, __('Token error'));
+            return ApiResponse::apiResponse(500,"请求异常");
+        }
+
+        $code = Helper::guid();
+        $key = CacheKey::get('TEMP_TOKEN', $code);
+        Cache::put($key, $user->id, 60);
+        $redirect = '/#/login?verify=' . $code . '&redirect=' . ($request->input('redirect') ? $request->input('redirect') : 'dashboard');
+        if (config('v2board.app_url')) {
+            $url = config('v2board.app_url') . $redirect;
+        } else {
+            $url = url($redirect);
+        }
+
+        return ApiResponse::apiResponse(0,"",$url);
+    }
+
+
+    public function getVersion(Request $request)
+    {
+       $from = $request->input("from");
+       $version = $request->input("version");
+
+       $versionData = [
+        'windows_version' => config('v2board.windows_version'),
+        'windows_download_url' => config('v2board.windows_download_url'),
+        'macos_version' => config('v2board.macos_version'),
+        'macos_download_url' => config('v2board.macos_download_url'),
+        'android_version' => config('v2board.android_version'),
+        'android_download_url' => config('v2board.android_download_url')
+        ];
+
+        $sVersion = "";
+        $sDownloadUrl = "";
+        if ($from == "android")
+        {
+            $sVersion = $versionData["android_version"];
+            $sDownloadUrl = $versionData["android_download_url"];
+
+        } else if ($from == "win"){
+            $sVersion = $versionData["windows_version"];
+            $sDownloadUrl = $versionData["windows_download_url"];
+        }
+        else if ($from == "macos")
+        {
+            $sVersion = $versionData["macos_version"];
+            $sDownloadUrl = $versionData["macos_download_url"];
+        }
+
+
+       $data = [
+         'version' => $sVersion,
+         'download_url' => $sDownloadUrl,
+       ];
+
+       if (version_compare($sVersion,$version,">")){
+           //服务器大于客户端
+           $data["isUpdate"] = 1;
+           return ApiResponse::apiResponse(0,"服务器有更新",$data);
+       }
+
+        $data["isUpdate"] = 0;
+        return ApiResponse::apiResponse(0,"服务器没有更新",$data);
+
+    }
+
+//    private function Token(Request $request){
+//        $authorization = $request->input('auth_data') ?? $request->header('authorization');
+//        if (!$authorization)
+//            return 402;
+//
+//        $authData = explode(':', base64_decode($authorization));
+//        if (!isset($authData[0]) || !isset($authData[1]))
+//            return 403;
+//        $user = User::where('email', $authData[0])
+//            ->where('password', $authData[1])
+//            ->first();
+//        if (!$user) {
+//            //abort(500, __('Token error'));
+//            //return ApiResponse::apiResponse(500,"请求异常");
+//            return 404;
+//        }
+//
+//        return $user;
+//    }
+}

+ 1 - 1
app/Http/Controllers/Guest/TelegramController.php

@@ -15,7 +15,7 @@ class TelegramController extends Controller
     public function __construct(Request $request)
     {
         if ($request->input('access_token') !== md5(config('v2board.telegram_bot_token'))) {
-            abort(401);
+          //  abort(401);
         }
 
         $this->telegramService = new TelegramService();

+ 1 - 0
app/Http/Kernel.php

@@ -67,6 +67,7 @@ class Kernel extends HttpKernel
         'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
         'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
         'user' => \App\Http\Middleware\User::class,
+        'manage' => \App\Http\Middleware\Manage::class,
         'admin' => \App\Http\Middleware\Admin::class,
         'client' => \App\Http\Middleware\Client::class,
         'staff' => \App\Http\Middleware\Staff::class,

+ 48 - 0
app/Http/Middleware/Manage.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Utils\ApiResponse;
+use Closure;
+use Illuminate\Support\Facades\Cache;
+
+class Manage
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $authorization = $request->input('auth_data') ?? $request->header('authorization');
+        if (!$authorization)
+            return ApiResponse::apiResponse(403,'未登录或者登录已经过期');
+           // abort(403, '未登录或登陆已过期');
+
+        $authData = explode(':', base64_decode($authorization));
+        if (!Cache::has($authorization)) {
+            if (!isset($authData[1]) || !isset($authData[0]))
+                return ApiResponse::apiResponse(403,'请重新登入');
+
+            $user = \App\Models\User::where('password', $authData[1])
+                ->where('email', $authData[0])
+                ->select([
+                    'id',
+                    'email',
+                    'is_admin',
+                    'is_staff'
+                ])
+                ->first();
+            if (!$user)
+                return ApiResponse::apiResponse(403,'请重新登入');
+            Cache::put($authorization, $user->toArray(), 3600);
+        }
+        $request->merge([
+            'user' => Cache::get($authorization)
+        ]);
+        return $next($request);
+    }
+}

+ 32 - 0
app/Http/Routes/ManageRoute.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Routes;
+
+use Illuminate\Contracts\Routing\Registrar;
+
+class ManageRoute
+{
+    public function map(Registrar $router)
+    {
+        $router->group([
+            'prefix' => 'manage'
+        ], function ($router) {
+            // Auth
+            $router->post('/auth/register', 'Client\\ManageController@register');
+            $router->post('/auth/login', 'Client\\ManageController@login');
+            $router->get('/plan/fetch', 'Client\\ManageController@fetch');
+            $router->post('/app/getVersion', 'Client\\ManageController@getVersion');
+            $router->post('/auth/getQuickLoginUrl', 'Client\\ManageController@getQuickLoginUrl');
+
+
+        });
+
+        $router->group([
+            'prefix' => 'manager',
+            'middleware' => 'manage'
+        ], function ($router) {
+            $router->get ('/getSubscribe', 'Client\\ManageController@getSubscribe');
+            $router->get ('/server/fetch', 'Client\\ManageController@server');
+        });
+    }
+}

+ 61 - 0
app/Utils/ApiResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Utils;
+
+
+
+use Illuminate\Support\Facades\Response;
+
+class ApiResponse
+{
+//    /**
+//     * 成功的时候返回结果
+//     * @param $data 返回数据集合
+//     */
+//    public static function success($data)
+//    {
+//        return apiResponse('200','操作成功',$data);
+//    }
+
+//    /**
+//     * 失败的时候返回结果
+//     */
+//    public function fail($data)
+//    {
+//        return $this->apiResponse('500','操作失败',$data=[]);
+//    }
+
+//    /**
+//     * 直接返回说明
+//     */
+//    public function message($message)
+//    {
+//        return "$message";
+//    }
+
+
+    /**
+     * 参数返回
+     * @param $code //状态码
+     * @param $message //返回说明
+     * @param $data //返回数据集合
+     */
+    public static function apiResponse($code, $message, $data = null)
+    {
+        if ($data == null){
+           $content = [
+                'code' => $code,
+                'message'  => $message,
+            ];
+        } else {
+            $content = [
+                'code' => $code,
+                'message'  => $message,
+                'data' => $data
+            ];
+        }
+
+        return Response::json($content,200);
+    }
+
+}