刮刮后端接口
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

<?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;
}