You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
7.5 KiB
277 lines
7.5 KiB
<?php
|
|
// 应用公共文件
|
|
use \Firebase\JWT\JWT;
|
|
use Firebase\JWT\Key;
|
|
|
|
/**
|
|
* 生成验签
|
|
* @param $data
|
|
* @return string
|
|
*/
|
|
function signToken($data): string
|
|
{
|
|
$key = 'LAL@lc!'; //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当于加密中常用的 盐-salt
|
|
$token = array(
|
|
"iss" => $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;
|
|
}
|