$sn])->findOrEmpty(); if (!$user->isEmpty()) { return create_user_sn($prefix, $length); } return $sn; } //生成用户邀请码 function generate_invite_code() { $letter_all = range('A', 'Z'); shuffle($letter_all); //排除I、O字母 $letter_array = array_diff($letter_all, ['I', 'O', 'D']); //排除1、0 $num_array = range('2', '9'); shuffle($num_array); $pattern = array_merge($num_array, $letter_array, $num_array); shuffle($pattern); $pattern = array_values($pattern); $code = ''; for ($i = 0; $i < 6; $i++) { $code .= $pattern[mt_rand(0, count($pattern) - 1)]; } $code = strtoupper($code); $check = User::where('distribution_code', $code)->findOrEmpty(); if (!$check->isEmpty()) { return generate_invite_code(); } return $code; } /** * User: 意象信息科技 lr * Desc: 数组成功拼装 * @param string $msg * @param array $data * @param int $code * @param int $show * @return array */ function data_success($msg = '', $data = [], $code = 1, $show = 1) { $result = [ 'code' => $code, 'msg' => $msg, 'data' => $data, 'show' => $show, ]; return $result; } /** * User: 意象信息科技 lr * Desc: 组装失败数据 * @param string $msg * @param array $data * @param int $code * @param int $show * @return array */ function data_error($msg = '', $data = [], $code = 0, $show = 1) { $result = [ 'code' => $code, 'msg' => $msg, 'data' => $data, 'show' => $show, ]; return $result; } /** * User: 意象信息科技 cjh * Desc: 返回是否有下一页 * @param $count (总记录数) * @param $page (当前页码) * @param $size (每页记录数) * @return int */ function is_more($count, $page, $size) { $more = 0; $last_page = ceil($count / $size); //总页数、也是最后一页 if ($last_page && $last_page > $page) { $more = 1; } return $more; } /** * User: 意象信息科技 lr * Desc:生成密码密文 * @param $plaintext string 明文 * @param $salt string 密码盐 * @return string */ function create_password($plaintext, $salt) { $salt = md5('y' . $salt . 'x'); $salt .= '2021'; return md5($plaintext . $salt); } /** * User: 意象信息科技 mjf * Desc: 用时间生成订单编号 * @param $table * @param $field * @param string $prefix * @param int $rand_suffix_length * @param array $pool * @return string * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ function createSn($table, $field, $prefix = '', $rand_suffix_length = 4, $pool = []) { $suffix = ''; for ($i = 0; $i < $rand_suffix_length; $i++) { if (empty($pool)) { $suffix .= rand(0, 9); } else { $suffix .= $pool[array_rand($pool)]; } } $sn = $prefix . date('YmdHis') . $suffix; if (Db::name($table)->where($field, $sn)->find()) { return createSn($table, $field, $prefix, $rand_suffix_length, $pool); } return $sn; } /** * User: 意象信息科技 lr * Desc: 表单多维数据转换 * 例: * 转换前:{"x":0,"a":[1,2,3],"b":[11,22,33],"c":[111,222,3333,444],"d":[1111,2222,3333]} * 转换为:[{"a":1,"b":11,"c":111,"d":1111},{"a":2,"b":22,"c":222,"d":2222},{"a":3,"b":33,"c":3333,"d":3333}] * @param $arr array 表单二维数组 * @param $fill boolean fill为false,返回数据长度取最短,反之取最长,空值自动补充 * @return array */ function form_to_linear($arr, $fill = false) { $keys = []; $count = $fill ? 0 : PHP_INT_MAX; foreach ($arr as $k => $v) { if (is_array($v)) { $keys[] = $k; $count = $fill ? max($count, count($v)) : min($count, count($v)); } } if (empty($keys)) { return []; } $data = []; for ($i = 0; $i < $count; $i++) { foreach ($keys as $v) { $data[$i][$v] = isset($arr[$v][$i]) ? $arr[$v][$i] : null; } } return $data; } /** * note 生成验证码 * @param int $length 验证码长度 * @return string */ function create_sms_code($length = 4) { $code = ''; for ($i = 0; $i < $length; $i++) { $code .= rand(0, 9); } return $code; } /** * 生成商品编码 * 8位 */ function create_goods_code($shop_id) { $code = mt_rand(10000000, 99999999); $goods = Goods::where([ 'code' => $code, 'shop_id' => $shop_id, 'del' => 0 ])->findOrEmpty(); if($goods->isEmpty()) { return $code; } create_goods_code(); } /** * 图片去除域名 */ function clearDomain($x) { if(is_array($x)) { $newX = []; foreach($x as $v) { $newX[] = trim(UrlServer::setFileUrl($v)); } return $newX; } return trim(UrlServer::setFileUrl($x)); } /* * 生成优惠券码 排除1、0、I、O相似的数字和字母 */ function create_coupon_code() { $letter_all = range('A', 'Z'); shuffle($letter_all); //排除I、O字母 $letter_array = array_diff($letter_all, ['I', 'O']); //随机获取四位字母 $letter = array_rand(array_flip($letter_array), 4); //排除1、0 $num_array = range('2', '9'); shuffle($num_array); //获取随机六位数字 $num = array_rand(array_flip($num_array), 6); $code = implode('', array_merge($letter, $num)); do { $exist_code =\app\common\model\coupon\CouponList::where(['del' => 0, 'coupon_code' => $code])->find(); } while ($exist_code); return $code; } /** * 浮点数去除无效的0 */ function clearZero($float) { if($float == intval($float)) { return intval($float); }else if($float == sprintf('%.1f', $float)) { return sprintf('%.1f', $float); } return $float; } /** * 是否在cli模式 */ if (!function_exists('is_cli')) { function is_cli() { return preg_match("/cli/i", php_sapi_name()) ? true : false; } } function real_path() { if (substr(strtolower(PHP_OS), 0, 3) == 'win') { $ini = ini_get_all(); $path = $ini['extension_dir']['local_value']; $php_path = str_replace('\\', '/', $path); $php_path = str_replace(array('/ext/', '/ext'), array('/', '/'), $php_path); $real_path = $php_path . 'php.exe'; } else { $real_path = PHP_BINDIR . '/php'; } if (strpos($real_path, 'ephp.exe') !== FALSE) { $real_path = str_replace('ephp.exe', 'php.exe', $real_path); } return $real_path; } /** * 是否为移动端 */ function is_mobile() { if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) { return true; } if (isset($_SERVER['HTTP_VIA'])) { return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false; } if (isset($_SERVER['HTTP_USER_AGENT'])) { $clientkeywords = array('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'); if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) { return true; } } if (isset($_SERVER['HTTP_ACCEPT'])) { if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'textml') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'textml')))) { return true; } } return false; } /** * Notes:判断文件是否存在(远程和本地文件) * @param $file string 完整的文件链接 * @return bool */ function check_file_exists($file) { //远程文件 if ('http' == strtolower(substr($file, 0, 4))) { $header = get_headers($file, true); return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304')); } else { return file_exists($file); } } /** * 将图片切成圆角 */ function rounded_corner($src_img) { $w = imagesx($src_img);//微信头像宽度 正方形的 $h = imagesy($src_img);//微信头像宽度 正方形的 $w = min($w, $h); $h = $w; $img = imagecreatetruecolor($w, $h); //这一句一定要有 imagesavealpha($img, true); //拾取一个完全透明的颜色,最后一个参数127为全透明 $bg = imagecolorallocatealpha($img, 255, 255, 255, 127); imagefill($img, 0, 0, $bg); $r = $w / 2; //圆半径 // $y_x = $r; //圆心X坐标 // $y_y = $r; //圆心Y坐标 for ($x = 0; $x < $w; $x++) { for ($y = 0; $y < $h; $y++) { $rgbColor = imagecolorat($src_img, $x, $y); if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); } } } unset($src_img); return $img; } /** * Notes:去掉名称中的表情 * @param $str * @return string|string[]|null * @author: cjhao 2021/3/29 15:56 */ function filterEmoji($str) { $str = preg_replace_callback( '/./u', function (array $match) { return strlen($match[0]) >= 4 ? '' : $match[0]; }, $str); return $str; } /*** * 生成海报自动适应标题 * @param $size * @param int $angle * @param $fontfile * @param $string * @param $width * @param $height * @param $bg_height * @return string */ function auto_adapt($size, $angle = 0, $fontfile, $string, $width, $height, $bg_height) { $content = ""; // 将字符串拆分成一个个单字 保存到数组 letter 中 for ($i = 0; $i < mb_strlen($string); $i++) { $letters[] = mb_substr($string, $i, 1); } foreach ($letters as $letter) { $str = $content . " " . $letter; $box = imagettfbbox($size, $angle, $fontfile, $str); $total_height = $box[1] + $height; if ($bg_height[1] - $total_height < $size) { break; } //右下角X位置,判断拼接后的字符串是否超过预设的宽度 if (($box[2] > $width) && ($content !== "")) { if ($bg_height[1] - $total_height < $size * 2) { break; } $content .= "\n"; } $content .= $letter; } return $content; } /** * Notes:生成一个范围内的随机浮点数 * @param int $min 最小值 * @param int $max 最大值 * @return float|int 返回随机数 */ function random_float($min = 0, $max = 1) { return $min + mt_rand() / mt_getrandmax() * ($max - $min); } /** * Notes: 获取文件扩展名 * @param $file * @author 段誉(2021/7/7 18:03) * @return mixed */ if (!function_exists('get_extension')) { function get_extension($file) { return pathinfo($file, PATHINFO_EXTENSION); } } /** * Notes: 遍历指定目录下的文件(目标目录,排除文件) * @param $dir 目标文件 * @param string $exclude_file 要排除的文件 * @param string $target_suffix 指定后缀 * @author 段誉(2021/7/7 18:04) * @return array|bool */ if (!function_exists('get_scandir')) { function get_scandir($dir, $exclude_file = '', $target_suffix = '') { if (!file_exists($dir)) { return []; } if (empty(trim($dir))) { return false; } $files = scandir($dir); $res = []; foreach ($files as $item) { if ($item == "." || $item == ".." || $item == $exclude_file) { continue; } if (!empty($target_suffix)) { if (get_extension($item) == $target_suffix) { $res[] = $item; } } else { $res[] = $item; } } if (empty($item)) { return false; } return $res; } } /** * Notes: 解压压缩包 * @param $file 压缩包路径 * @param $save_dir 保存路径 * @author 段誉(2021/7/7 18:11) * @return bool */ if (!function_exists('unzip')) { function unzip($file, $save_dir) { if (!file_exists($file)) { return false; } $zip = new \ZipArchive(); if ($zip->open($file) !== TRUE) {//中文文件名要使用ANSI编码的文件格式 return false; } $zip->extractTo($save_dir); $zip->close(); return true; } } /** * Notes: 删除目标目录 * @param $path * @param $delDir * @author 段誉(2021/7/7 18:19) * @return bool */ if (!function_exists('del_target_dir')) { function del_target_dir($path, $delDir) { //没找到,不处理 if (!file_exists($path)) { return false; } $handle = opendir($path); if ($handle) { while (false !== ($item = readdir($handle))) { if ($item != "." && $item != "..") { if (is_dir("$path/$item")) { del_target_dir("$path/$item", $delDir); } else { unlink("$path/$item"); } } } closedir($handle); if ($delDir) { return rmdir($path); } } else { if (file_exists($path)) { return unlink($path); } return false; } } } /** * Notes: 获取本地版本数据 * @return mixed * @author 段誉(2021/7/7 18:18) */ if (!function_exists('local_version')) { function local_version() { if(!file_exists('./upgrade/')) { // 若文件夹不存在,先创建文件夹 mkdir('./upgrade/', 0777, true); } if(!file_exists('./upgrade/version.json')) { // 获取本地版本号 $version = config('project.version'); $data = ['version' => $version]; $src = './upgrade/version.json'; // 新建文件 file_put_contents($src, json_encode($data, JSON_UNESCAPED_UNICODE)); } $json_string = file_get_contents('./upgrade/version.json'); // 用参数true把JSON字符串强制转成PHP数组 $data = json_decode($json_string, true); return $data; } } /** * Notes: 获取ip * @author 段誉(2021/7/9 10:19) * @return array|false|mixed|string */ if (!function_exists('get_client_ip')) { function get_client_ip() { if (!isset($_SERVER)) { return getenv('SERVER_ADDR'); } if($_SERVER['SERVER_ADDR']) { return $_SERVER['SERVER_ADDR']; } return $_SERVER['LOCAL_ADDR']; } } /** * @notes 友好时间提示 * @param $time * @return false|string * @author 段誉 * @date 2022/5/6 9:45 */ function friend_date($time) { if (empty($time)) { return false; } $d = time() - intval($time); $ld = $time - mktime(0, 0, 0, 0, 0, date('Y')); //年 $md = $time - mktime(0, 0, 0, date('m'), 0, date('Y')); //月 $byd = $time - mktime(0, 0, 0, date('m'), date('d') - 2, date('Y')); //前天 $yd = $time - mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); //昨天 $dd = $time - mktime(0, 0, 0, date('m'), date('d'), date('Y')); //今天 $td = $time - mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); //明天 if (0 == $d) { return '刚刚'; } switch ($d) { case $d < $td : $fdate = '后天' . date('H:i', $time); break; case $d < 0: $fdate = '明天' . date('H:i', $time); break; case $d < 60: $fdate = $d . '秒前'; break; case $d < 3600: $fdate = floor($d / 60) . '分钟前'; break; case $d < $dd : $fdate = floor($d / 3600) . '小时前'; break; case $d < $yd : $fdate = '昨天' . date('H:i', $time); break; case $d < $byd : $fdate = '前天' . date('H:i', $time); break; case $d < $md : $fdate = date('m月d日 H:i', $time); break; case $d < $ld : $fdate = date('m月d日', $time); break; default : $fdate = date('Y年m月d日', $time); break; } return $fdate; }