// +---------------------------------------------------------------------- // 应用公共文件 use app\models\lala\LalaRatio; if (!function_exists('exception')) { /** * 抛出异常处理 * * @param string $msg 异常消息 * @param integer $code 异常代码 默认为0 * @param string $exception 异常类 * * @throws Exception */ function exception($msg, $code = 0, $exception = '') { $e = $exception ?: '\think\Exception'; throw new $e($msg, $code); } } if (!function_exists('sys_config')) { /** * 获取系统单个配置 * @param string $name * @param string $default * @return string */ function sys_config(string $name, $default = '', $catch = false) { if (empty($name)) return $default; $config = trim(app('sysConfig')->get($name, $default, $catch)); if ($config === '' || $config === false) { return $default; } else { return $config; } } } if (!function_exists('sys_data')) { /** * 获取系统单个配置 * @param string $name * @return array */ function sys_data(string $name, int $limit = 0) { return app('sysGroupData')->getData($name, $limit, true); } } if (!function_exists('filter_emoji')) { // 过滤掉emoji表情 function filter_emoji($str) { $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换 '/./u', function (array $match) { return strlen($match[0]) >= 4 ? '' : $match[0]; }, $str); return $str; } } if (!function_exists('str_middle_replace')) { /** TODO 系统未使用 * @param string $string 需要替换的字符串 * @param int $start 开始的保留几位 * @param int $end 最后保留几位 * @return string */ function str_middle_replace($string, $start, $end) { $strlen = mb_strlen($string, 'UTF-8');//获取字符串长度 $firstStr = mb_substr($string, 0, $start, 'UTF-8');//获取第一位 $lastStr = mb_substr($string, -1, $end, 'UTF-8');//获取最后一位 return $strlen == 2 ? $firstStr . str_repeat('*', mb_strlen($string, 'utf-8') - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr; } } if (!function_exists('sensitive_words_filter')) { /** * 敏感词过滤 * * @param string * @return string */ function sensitive_words_filter($str) { if (!$str) return ''; $file = app()->getAppPath() . 'public/static/plug/censorwords/CensorWords'; $words = file($file); foreach ($words as $word) { $word = str_replace(array("\r\n", "\r", "\n", "/", "<", ">", "=", " "), '', $word); if (!$word) continue; $ret = preg_match("/$word/", $str, $match); if ($ret) { return $match[0]; } } return ''; } } if (!function_exists('make_path')) { /** * 上传路径转化,默认路径 * @param $path * @param int $type * @param bool $force * @return string */ function make_path($path, int $type = 2, bool $force = false) { $path = DS . ltrim(rtrim($path)); switch ($type) { case 1: $path .= DS . date('Y'); break; case 2: $path .= DS . date('Y') . DS . date('m'); break; case 3: $path .= DS . date('Y') . DS . date('m') . DS . date('d'); break; } try { if (is_dir(app()->getRootPath() . 'public' . DS . 'uploads' . $path) == true || mkdir(app()->getRootPath() . 'public' . DS . 'uploads' . $path, 0777, true) == true) { return trim(str_replace(DS, '/', $path), '.'); } else return ''; } catch (\Exception $e) { if ($force) throw new \Exception($e->getMessage()); return '无法创建文件夹,请检查您的上传目录权限:' . app()->getRootPath() . 'public' . DS . 'uploads' . DS . 'attach' . DS; } } } if (!function_exists('curl_file_exist')) { /** * CURL 检测远程文件是否在 * @param $url * @return bool */ function curl_file_exist($url) { $ch = curl_init(); try { curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); $contents = curl_exec($ch); if (preg_match("/404/", $contents)) return false; if (preg_match("/403/", $contents)) return false; return true; } catch (\Exception $e) { return false; } } } if (!function_exists('set_file_url')) { /** * 设置附加路径 * @param $url * @return bool */ function set_file_url($image, $siteUrl = '') { if (!strlen(trim($siteUrl))) $siteUrl = sys_config('site_url'); $domainTop = substr($image, 0, 4); if ($domainTop == 'http') return $image; $image = str_replace('\\', '/', $image); return $siteUrl . $image; } } if (!function_exists('set_http_type')) { /** * 修改 https 和 http * @param $url $url 域名 * @param int $type 0 返回https 1 返回 http * @return string */ function set_http_type($url, $type = 0) { $domainTop = substr($url, 0, 5); if ($type) { if ($domainTop == 'https') $url = 'http' . substr($url, 5, strlen($url)); } else { if ($domainTop != 'https') $url = 'https:' . substr($url, 5, strlen($url)); } return $url; } } if (!function_exists('check_card')) { /** * 身份证验证 * @param $card * @return bool */ function check_card($card) { $city = [11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江 ", 31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南", 42 => "湖北 ", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏 ", 61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外 "]; $tip = ""; $match = "/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/"; $pass = true; if (!$card || !preg_match($match, $card)) { //身份证格式错误 $pass = false; } else if (!$city[substr($card, 0, 2)]) { //地址错误 $pass = false; } else { //18位身份证需要验证最后一位校验位 if (strlen($card) == 18) { $card = str_split($card); //∑(ai×Wi)(mod 11) //加权因子 $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //校验位 $parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; $sum = 0; $ai = 0; $wi = 0; for ($i = 0; $i < 17; $i++) { $ai = $card[$i]; $wi = $factor[$i]; $sum += $ai * $wi; } $last = $parity[$sum % 11]; if ($parity[$sum % 11] != $card[17]) { // $tip = "校验位错误"; $pass = false; } } else { $pass = false; } } if (!$pass) return false;/* 身份证格式错误*/ return true;/* 身份证格式正确*/ } } if (!function_exists('anonymity')) { /** * 匿名处理处理用户昵称 * @param $name * @return string */ function anonymity($name) { $strLen = mb_strlen($name, 'UTF-8'); $min = 3; if ($strLen <= 1) return '*'; if ($strLen <= $min) return mb_substr($name, 0, 1, 'UTF-8') . str_repeat('*', $min - 1); else return mb_substr($name, 0, 1, 'UTF-8') . str_repeat('*', $strLen - 1) . mb_substr($name, -1, 1, 'UTF-8'); } } if (!function_exists('sort_list_tier')) { /** * 分级排序 * @param $data * @param int $pid * @param string $field * @param string $pk * @param string $html * @param int $level * @param bool $clear * @return array */ function sort_list_tier($data, $pid = 0, $field = 'pid', $pk = 'id', $html = '|-----', $level = 1, $clear = true) { static $list = []; if ($clear) $list = []; foreach ($data as $k => $res) { if ($res[$field] == $pid) { $res['html'] = str_repeat($html, $level); $list[] = $res; unset($data[$k]); sort_list_tier($data, $res[$pk], $field, $pk, $html, $level + 1, false); } } return $list; } } if (!function_exists('time_tran')) { /** * 时间戳人性化转化 * @param $time * @return string */ function time_tran($time) { $t = time() - $time; $f = array( '31536000' => '年', '2592000' => '个月', '604800' => '星期', '86400' => '天', '3600' => '小时', '60' => '分钟', '1' => '秒' ); foreach ($f as $k => $v) { if (0 != $c = floor($t / (int)$k)) { return $c . $v . '前'; } } } } if (!function_exists('url_to_path')) { /** * url转换路径 * @param $url * @return string */ function url_to_path($url) { $path = trim(str_replace('/', DS, $url), DS); if (0 !== strripos($path, 'public')) $path = 'public' . DS . $path; return app()->getRootPath() . $path; } } if (!function_exists('path_to_url')) { /** * 路径转url路径 * @param $path * @return string */ function path_to_url($path) { return trim(str_replace(DS, '/', $path), '.'); } } if (!function_exists('image_to_base64')) { /** * 获取图片转为base64 * @param string $avatar * @return bool|string */ function image_to_base64($avatar = '', $timeout = 9) { try { $url = parse_url($avatar); $url = $url['host']; $header = [ 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0', 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding: gzip, deflate, br', 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Host:' . $url ]; $dir = pathinfo($url); $host = $dir['dirname']; $refer = $host . '/'; $curl = curl_init(); curl_setopt($curl, CURLOPT_REFERER, $refer); curl_setopt($curl, CURLOPT_URL, $avatar); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); $data = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($code == 200) { return "data:image/jpeg;base64," . base64_encode($data); } else { return false; } } catch (\Exception $e) { return false; } } } if (!function_exists('put_image')) { /** * 获取图片转为base64 * @param string $avatar * @return bool|string */ function put_image($url, $filename = '') { if ($url == '') { return false; } try { if ($filename == '') { $ext = pathinfo($url); if ($ext['extension'] != "jpg" && $ext['extension'] != "png" && $ext['extension'] != "jpeg") { return false; } $filename = time() . "." . $ext['extension']; } //文件保存路径 ob_start(); readfile($url); $img = ob_get_contents(); ob_end_clean(); $path = 'uploads/qrcode'; $fp2 = fopen($path . '/' . $filename, 'a'); fwrite($fp2, $img); fclose($fp2); return $path . '/' . $filename; } catch (\Exception $e) { return false; } } } if (!function_exists('debug_file')) { /** * 文件调试 * @param $content */ function debug_file($content, string $fileName = 'error', string $ext = 'txt') { $msg = '[' . date('Y-m-d H:i:s', time()) . '] [ DEBUG ] '; $pach = app()->getRuntimePath(); file_put_contents($pach . $fileName . '.' . $ext, $msg . print_r($content, true) . "\r\n", FILE_APPEND); } } if (!function_exists('sql_filter')) { /** * sql 参数过滤 * @param string $str * @return mixed */ function sql_filter(string $str) { $filter = ['select ', 'insert ', 'update ', 'delete ', 'drop', 'truncate ', 'declare', 'xp_cmdshell', '/add', ' or ', 'exec', 'create', 'chr', 'mid', ' and ', 'execute']; $toupper = array_map(function ($str) { return strtoupper($str); }, $filter); return str_replace(array_merge($filter, $toupper, ['%20']), '', $str); } } if (!function_exists('is_brokerage_statu')) { /** * 是否能成为推广人 * @param float $price * @return bool */ function is_brokerage_statu(float $price) { $storeBrokerageStatus = sys_config('store_brokerage_statu', 1); if ($storeBrokerageStatus == 1) { return false; } else { $storeBrokeragePrice = sys_config('store_brokerage_price', 0); return $price >= $storeBrokeragePrice; } } } if (!function_exists('array_unique_fb')) { /** * 二维数组去掉重复值 * @param $array * @return array */ function array_unique_fb($array) { $out = array(); foreach ($array as $key => $value) { if (!in_array($value, $out)) { $out[$key] = $value; } } $out = array_values($out); return $out; } } if (!function_exists('not_empty_check')) { /** * 非空验证 * @param $param * @return bool */ function not_empty_check($param) { if (is_array($param)) { return !(count($param) <= 0); } else { if ($param == '') { return false; } if ($param == null) { return false; } return true; } } } if (!function_exists('mobile_check')) { /** * 电话验证 * @param $param * @return bool */ function mobile_check($param) { if (!preg_match("/^1[3456789]\d{9}$/", $param)) { return false; } else { return true; } } } if (!function_exists('do_request')) { /** * CURL 请求接口 * @param string $url 请求地址 * @param array $data 请求参数 * @param array $header 请求头 * @param bool $post true:post请求 false:get请求 * @param bool $json post请求时 请求数据打包方式是否为json * @param int $format 数据打包为json格式时打包的格式值 来自json_encode * @param bool $form post请求时 请求数据是否为表单 同时为false时为http提交 优先级高于json * @return bool|false|string */ function do_request($url, $data, $header = null, $post = true, $json = false, $format = 0, $form = false) { $curl = curl_init(); if (!$post && $data) { $url = $url . '?' . http_build_query($data); } curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); if ($post) { curl_setopt($curl, CURLOPT_POST, 1); if (!$json && !$form) { curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); } else if ($json && !$form) { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data, $format)); } else { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); if ($header) { curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_HEADER, 0); } $result = curl_exec($curl); if (curl_errno($curl)) { return json_encode(['status' => curl_errno($curl), 'msg' => '请求失败']); } curl_close($curl); return $result; } } if (!function_exists('time_format')) { /** * 电话验证 * @param $param * @return bool */ function time_format($param) { return $param > 0 ? date('Y-m-d H:i:s', $param) : '--'; } } if (!function_exists('init_money_type')) { /** * @return array */ function init_money_type(): array { $money_type = sys_data('money_type'); // var_dump($money_type); $new = []; foreach ($money_type as $v) { $new[$v['code']] = $v['name']; } return $new; } } if (!function_exists('get_money_name')) { /** * @return string */ function get_money_name($code): string { if ($code == 'now_money') return '货款'; if ($code == 'brokerage_price' || $code == 'brokerage') return '佣金'; if ($code == 'integral') return '积分'; $money_type = sys_data('money_type'); foreach ($money_type as $v) { if ($v['code'] == $code) return $v['name']; } return '未知'; } } if (!function_exists('us_price')) { /** * @return float */ function us_price(): float { return 6.5; $rate = \crmeb\services\CacheService::get('rate', 0); if (!$rate) { $url = 'https://www.mycurrency.net/US.json'; $res = do_request($url, [], null, false); $res = json_decode($res, true); foreach ($res['rates'] ?: [] as $v) { if ($v['currency_code'] == 'CNY') { \crmeb\services\CacheService::set('rate', $v['rate'], 3600 * 6); return $v['rate']; } } return 0; } else { return $rate; } } } if (!function_exists('get_huobi_price')) { /** * @return float */ function get_huobi_price($type) { return 0; if (\think\facade\Env::get('app_debug')) return 0; $type = strtolower($type); $rate = \crmeb\services\CacheService::get('usdt_' . $type, 0); // var_dump($rate); if (!$rate) { $url = "https://api.huobi.de.com/market/detail/merged?symbol={$type}usdt"; $res = do_request($url, [], null, false, true); $res = json_decode($res, true); if ($res['status'] == 'error') { return 0; } else { \crmeb\services\CacheService::set('usdt_' . $type, $res['tick']['close'], 600); return $res['tick']['close']; } } else { return $rate; } } } if (!function_exists('arraySort')) { /** * @param $array * @param $keys * @param int $sort * @return array */ function arraySort($array, $keys, int $sort = SORT_DESC): array { $keysValue = []; foreach ($array as $k => $v) { $keysValue[$k] = $v[$keys]; } array_multisort($keysValue, $sort, $array); return $array; } } if (!function_exists('open_times')) { /** * @return array */ function open_times(): array { $times = sys_config('open_times'); $times = explode(',', $times); $open_times = []; foreach ($times as $v) { $open_time = date('Y-m-d') . ' ' . $v . ':00'; $open_time_value = strtotime(date('Y-m-d') . ' ' . $v . ':00'); $open_times[] = ['name' => $open_time, 'value' => $open_time_value]; } if (count($open_times)) { $open_time_value = strtotime('+1day', $open_times[0]['value']); $open_time = time_format($open_time_value); $open_times[] = ['name' => $open_time, 'value' => $open_time_value]; $open_time_value = strtotime('+1day', $open_times[1]['value']); $open_time = time_format($open_time_value); $open_times[] = ['name' => $open_time, 'value' => $open_time_value]; } return arraySort($open_times, 'value', SORT_ASC); } } if (!function_exists('get_hpool_price')) { /** * @param $unit * @return float */ function get_hpool_price($unit): float { $res = do_request('https://www.ihpool.com/api/home/list?type=eco', [], null, false); $res = json_decode($res, true); $price = 0; if (!isset($res['code']) || $res['code'] != 200) $price = 0; foreach ($res['data'] as $v) { if ($v['unit'] == $unit) { $price = bcdiv($v['income'], 1024, 8); break; } } return $price; } } if (!function_exists('get_fil_price')) { /** * @param $unit * @return float */ function get_fil_price(): float { $res = do_request('https://filfox.info/api/v1/overview', [], null, false); $res = json_decode($res, true); $price = 0; if (!isset($res['code']) || $res['code'] != 200) $price = 0; // foreach ($res['data'] as $v) { // if ($v['unit'] == $unit) { // $price = bcdiv($v['income'], 1024, 8); // break; // } // } $coins = $res['dailyCoinsMined']; $power = $res['totalQualityAdjPower']; $coins = bcdiv($coins, '1000000000000000000', 8); $power = bcdiv($power, bcpow(1024, 5), 8); $price = bcdiv($coins, $power, 8); $price = bcdiv($price, 1024, 8); return $price; } } if (!function_exists('get_lala_ratio')) { /** * @return string */ function get_lala_ratio($date = null): string { $money_types = sys_data('money_type'); $origin_ratio = 0; foreach ($money_types as $v) { if ($v['code'] == 'LALA') { $origin_ratio = $v['usdt_price']; $lala_ratio = LalaRatio::initRatio($date ?: date('Y-m-d')); $origin_ratio = bcmul($origin_ratio, bcdiv(bcadd(100, $lala_ratio), 100, 2), 8); // $origin_ratio = bcdiv(1, $origin_ratio, 8); } } return $origin_ratio; } }