middleware('auth.jwt', ['except' => ['login', 'register', 'shop','version','versionwin','buy','test','updateNodelPass']]); auth()->shouldUse('api'); } public function test(Request $request){ $query = User::activeUser()->where('expired_at', '<', date('Y-m-d H:i:s', strtotime('-2 hour')))->toSql(); return response()->json(['ret' => 1, 'data' => $query,'datatime' => date('Y-m-d H:i:s', strtotime('-2 hour'))], 200); } public function version(Request $request){ $version = AppUpdate::where('appname','=','android')->first(); return response()->json(['ret' => 1, 'data' => $version], 200); } public function versionwin(Request $request){ $version = AppUpdate::where('appname','=','win')->first(); return response()->json(['ret' => 1, 'data' => $version], 200); } public function login(Request $request) { $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required|string|min:6', ]); if ($validator->fails()) { return response()->json(['ret' => 0, 'msg' => "账号密码错误(账号是邮箱)"], 200); } if ($token = auth()->attempt($validator->validated())) { return $this->createNewToken($token); } return response()->json(['ret' => 0, 'msg' => '账号密码错误'], 200); } protected function createNewToken($token) { $userinfo = auth()->user()->profile(); return response()->json([ 'ret' => 1, 'data' => [ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth()->factory()->getTTL() * 60, 'user' => $userinfo, 'affurl' => route('register', ['aff' => Auth::id()]), 'tutorial' => 'https://ruanjian.xiazi.buzz/', 'swoftdownload' => 'https://ruanjian.xiazi.buzz/', ] ]); } public function register(Request $request) { $validator = Validator::make($request->all(), [ 'username' => 'required|string|between:2,100', 'email' => 'required|string|email|max:100|unique:user', 'password' => 'required|string|min:6', ]); if ($validator->fails()) { return response()->json(['ret' => 0, 'msg' => implode("", $validator->errors()->all())]); } if (!sysConfig('is_register')) { return response()->json(['ret' => 0, 'msg' => "暂停注册,升级服务器"]); } $transfer_enable = MB * ((int) sysConfig('default_traffic')); // 创建新用户 $user = Helpers::addUser($request->email, $request->password, $transfer_enable, sysConfig('default_days'), null, $request->username); // 注册失败,抛出异常 if (!$user) { return response()->json(['ret' => 0, 'msg' => "错误"]); } if ($token = auth()->attempt($validator->validated())) { return $this->createNewToken($token); } return response()->json(['ret' => 0, 'msg' => "错误"]); } public function logout() { auth()->logout(); return response()->json(['ret' => 0,'data'=>'ok']); } public function authUser(){ $user = auth()->user(); $userinfo = $user->profile(); if (empty($userinfo)){ return response()->json(['ret' => 0, 'msg' => "错误"]); } //判断到期 $expireTime = $user["expired_at"]; if ($expireTime < date('Y-m-d H:i:s')){ return response()->json(['ret' => 445, 'msg' => "用户到期,请即使续费"], 200); } $usedTraffic = $user->usedTraffic(); if ($usedTraffic >= $userinfo["transfer_enable"]){ return response()->json(['ret' => 446, 'msg' => "流量已经用完,联系客服免费重置流量"], 200); } //获取节点 $query = $user->nodes()->with(['labels', 'level_table','onlineLogs']); $nodeList = $query->where(function ($q){ $q->where('type','=',0)->orwhere('type','=',4); })->orderByDesc('sort')->orderBy('id')->get(); $firstnode = []; $is_hk = false; $temp = array(); $result = array(); foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-5 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; if ($node->country_code == "hk" && $node->online_users != 0){ $firstnode[] = $node; $is_hk = true; } else { if (!$is_hk){ $firstnode[] = $node; } } } //找到人数最小的 $min["key"] = ""; $min["value"] = 0; $keys = "online_users"; $midormax = $this->phpMaxMin($firstnode,$keys); // foreach ($firstnode as $key => $val){ // if($min['key'] === ''){ // $min['key'] = $key; // $min['value'] = $val[$keys]; // //$temp[$key] = $val[$keys]; // } // if($min['value'] > $val[$keys]){ // $result[$key] = $val; // $min['key'] = $key; // $min['value'] = $val[$keys]; // } // } // if (empty($result) ){ // return response()->json(['ret' => 0, 'msg' => "数据为空"], 201); // } foreach ($firstnode as $key => $v ){ if($key == $midormax["min"]["key"]) { $servers = $v->config($user); $servers[$keys] = $firstnode[$key][$keys]; } } return response()->json(['ret' => 1, 'data' => $servers], 200); } function getMinAndMaxInArray($arr,$keys = '') { if(empty($arr)) { return array(10,10); } $disArr = array(); foreach($arr as $value) { $disArr[] = floatval($value[$keys]); } sort($disArr); $resArr = !empty($disArr) ? array($disArr[0],$disArr[count($disArr)-1]) : array(10,10); unset($disArr); return $resArr; } public function phpMaxMin($arr = [],$keys = ''){ $max['key'] = ''; $max['value'] = ''; $min['key'] = ''; $min['value'] = ''; foreach ($arr as $key => $val){ if($max['key'] === ''){ $max['key'] = $key; $max['value'] = $val[$keys]; } if((int)$max['value'] < $val[$keys]){ $max['key'] = $key; $max['value'] = $val[$keys]; } if($min['key'] === ''){ $min['key'] = $key; $min['value'] = $val[$keys]; } if((int)$min['value'] > $val[$keys]){ $min['key'] = $key; $min['value'] = $val[$keys]; } } $array['max'] = $max; $array['min'] = $min; return $array; } public function refresh() { return $this->createNewToken(auth()->refresh()); } public function userProfile() { return response()->json(['ret' => 1, 'data' => auth()->user()->profile()]); } public function iosprofile(Request $request){ $zfversion = $request->input("zfversion"); $version = "1.0.6"; //比客户端大才能返回正确大数据 $data = auth()->user()->profile(); if(version_compare($zfversion,$version,"<")){ $data["zfshow"] = 1; } else { $data["zfshow"] = 0; } return response()->json(['ret' => 1, 'data' => $data]); } public function updateNodelPass(){ //$nodelist = Node::where('single','=',1)->where('ip','=','192.248.167.49')->get(); $nodelist = Node::where('single','=',1)->update([ "passwd" => Str::random() ]); //Vc6ykqt49zUD39R2 return response()->json(['ret' => 1, 'data' => $nodelist]); } public function nodeList(int $id = null) { $user = auth()->user(); // $nodes = $user->nodes()->get(); $query = $user->nodes()->with(['labels', 'level_table','onlineLogs']); $nodeList = $query->where(function ($q){ $q->where('type','=',0)->orwhere('type','=',4)->orwhere('vless','=',0); })->orderByDesc('sort')->orderBy('id')->get(); //$nodeList = $query->orderByDesc('sort')->orderBy('id')->get(); //var_dump($nodes); die(); if (isset($id)) { $nodes = $user->nodes()->get(); $node = $nodes->find($id); if (empty($node)) { return response()->json([], 204); } return response()->json($node->config($user)); } $temp = array(); $servers = []; $firstnode = []; foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-5 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; $firstnode[] = $node; } foreach ($firstnode as $key => $val){ $servers[] = $val->config($user); $servers[$key]["online_users"] = $firstnode[$key]["online_users"]; } return response()->json(['ret' => 1, 'data' => $servers]); } public function buy(Request $request){ return Redirect::route('login'); } public function shop() { $shop = Goods::whereStatus(1)->where('type', '<=', '2')->orderByDesc('type')->orderByDesc('sort')->get(); return response()->json($shop); } }