$key, //签发者 可以为空 "aud" => '', //面象的用户,可以为空 "iat" => time(), //签发时间 "nbf" => time() + 3, //在什么时候jwt开始生效 (这里表示生成100秒后才生效) "exp" => time() + 7200, //token 过期时间 "data" => $data //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对 ); return JWT::encode($token, $key, "HS384"); //根据参数生成了token,可选:HS256、HS384、HS512、RS256、ES256等 } /** * 验证token * @param $token * @return array|int[] */ function checkToken($token): array { $key = 'LAL@lc!'; $status = array("code" => 2); try { JWT::$leeway = 60; //当前时间减去60,把时间留点余地 $decoded = JWT::decode($token, new Key($key, 'HS384')); //同上的方式,这里要和签发的时候对应 $arr = (array)$decoded; $res['code'] = 200; $res['data'] = $arr['data']; $res['data'] = json_decode(json_encode($res['data']), true);//将stdObj类型转换为array return $res; } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 $status['msg'] = "签名不正确"; return $status; } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 $status['msg'] = "token失效"; return $status; } catch (\Firebase\JWT\ExpiredException $e) { // token过期 $status['msg'] = "token失效"; return $status; } catch (Exception $e) { //其他错误 $status['msg'] = "未知错误"; return $status; } } /** * 获取随机字符 * @param int $length * @return string */ function generate_random_str(int $length = 8): string { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $str = ''; $maxIndex = strlen($characters) - 1; for ($i = 0; $i < $length; $i++) { $randomIndex = mt_rand(0, $maxIndex); $str .= $characters[$randomIndex]; } return $str; } /** * 返回图片路径 * @param $imageUrl * @return string */ function get_image_url($imageUrl):string { $domain = \think\facade\Request::instance()->domain(); $url = config('filesystem.disks.public.url'); $strpos1 = strpos($imageUrl,'http'); $strpos2 = strpos($imageUrl,$url); if ($strpos1 !== false || $strpos2 !== false) { return $imageUrl; } else { return $domain . $url . '/' . $imageUrl; } } /** * 返回跳转链接地址 * @param $jump_url * @return string */ function get_jump_url($jump_url):string { $domain = \think\facade\Request::instance()->domain(); $strpos1 = strpos($jump_url,'http'); $strpos2 = strpos($jump_url,$domain); if ($strpos1 !== false || $strpos2 !== false) { return $jump_url; } else { return $domain . $jump_url; } } /** * 赋予符号 * @param $value * @param $symbol */ function give_symbol(&$value,$symbol = '+') { $value = $symbol . $value; } /** * 手机号处理 * @param $phoneNumber * @return string */ function format_phone_number($phoneNumber):string { $prefix = substr($phoneNumber, 0, 3); $suffix = substr($phoneNumber, -4); return $prefix . '****' . $suffix; } /** * 获取自定义随机头像 */ function rand_avatar() { $avatarArr = return_image_name('avatar') ?: config('custom.avatar'); $rand = rand(0,count($avatarArr)-1); return $avatarArr[$rand] ?: ''; } /** * 获取目录下面的图片文件 * @param string $path * @return array */ function return_image_name(string $path = 'icon'):array { $public_path = public_path(); $imageDir = $public_path . '/storage/'.$path; $files = scandir($imageDir); // 获取目标文件夹下的文件名 // 过滤掉当前目录('.')和上级目录('..') $files = array_diff($files, ['.', '..']); $imageExtensions = ['jpg', 'jpeg', 'png', 'gif']; foreach ($files as $key => $imageName) { # 获取文件后缀 $extension = pathinfo($imageName, PATHINFO_EXTENSION); # 过滤不是图片的文件或目录 if (!in_array(strtolower($extension),$imageExtensions)) { unset($files[$key]); continue; } # 组合路径 $files[$key] = $path . '/' . $imageName; } # 排序覆盖数组索引 sort($files); return $files; } /** * 返回图片链接 * @param string $path // 获取目录下面的图片文件 * @param bool $is_http // true = 图片完整访问路径 * @return string */ function rand_icon(string $path = 'icon',bool $is_http = false):string { $files = return_image_name($path); if (empty($files)) return ''; $rand = rand(0,count($files)-1); $imageUrl = $files[$rand] ?: ''; if ($is_http) { $domain = \think\facade\Request::instance()->domain(); $url = config('filesystem.disks.public.url'); return $domain . $url . '/' . $imageUrl; } return $imageUrl; } /** * 返回金额 * @param $number * @return string */ function format_money($number):string { $units = array('元',"万元", "亿元"); $unitMaxValue = 10000; // 单位最大值 $unitIndex = 0; // 单位索引 if ($number >= $unitMaxValue && $number % $unitMaxValue === 0) { while ($number >= $unitMaxValue && $unitIndex <= count($units) - 1) { $number = round($number / $unitMaxValue); $unitIndex++; } $formattedNumber = round($number, 0) . $units[$unitIndex]; } elseif ($number % $unitMaxValue === 0) { $formattedNumber = round($number / $unitMaxValue,0) . $units[0]; } else { $formattedNumber = round($number,0) . '元'; } return $formattedNumber; } /** * 返回人数 * @param $number * @return string */ function format_people_count($number):string { if ($number >= 100000000) { // 大于等于1亿,返回x亿人 $count = floor($number / 100000000); return $count . '亿人'; } elseif ($number >= 10000) { // 大于等于1万,返回x万人 $count = floor($number / 10000); return $count . '万人'; } elseif ($number >= 1000) { // 大于等于1万,返回x万人 $count = floor($number / 10000); return $count . '万人'; } else { // 小于1万,直接返回人数 return $number . '人'; } } /** * 获取近几个月数据 * @param int $start * @return array */ function get_near_month_datetime(int $start = 4):array { $dateArr = []; for ($i = $start; $i >= 1; $i--) { $last_month = date('m',strtotime("-{$i} month")); $start_time = date("Y-{$last_month}-01 00:00:00"); $end_time = date("Y-m-d 23:59:59",strtotime('+1 month',strtotime($start_time)) - 86400); $dateArr[$last_month] = [ 'start_time' => $start_time, 'end_time' => $end_time ]; } $month = date("m"); $dateArr[$month] = [ 'start_time' => date("Y-{$month}-01 00:00:00"), 'end_time' => date("Y-m-d H:i:s") ]; return $dateArr; }