common.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. <?php
  2. declare(strict_types=1);
  3. // 应用公共文件
  4. use app\common\enum\FileEnum;
  5. use app\common\model\File;
  6. use app\common\service\UploadService;
  7. /**
  8. * @notes 生成密码加密密钥
  9. * @param string $plaintext
  10. * @param string $salt
  11. * @return string
  12. * @author 令狐冲
  13. * @date 2021/7/5 11:52
  14. */
  15. function create_password(string $plaintext, string $salt): string
  16. {
  17. return md5($salt . md5($plaintext . $salt));
  18. }
  19. /**
  20. * @notes 随机生成token值
  21. * @param string $extra
  22. * @return string
  23. * @author 令狐冲
  24. * @date 2021/7/1 19:04
  25. */
  26. function create_token(string $extra = ''): string
  27. {
  28. return md5($extra . time().uniqid('likeshop'));
  29. }
  30. function gift_card_pass(){
  31. $time = date('y').date('m').date('d').getNonceStr(6);
  32. return str_shuffle($time);
  33. }
  34. /*
  35. * 导出数据到日志文件
  36. * */
  37. function outFileLog($data,$filename='log',$title='data'){
  38. file_put_contents(runtime_path() . 'log/'.$filename.'.txt', PHP_EOL .date('Y-m-d h:i:s', time()).'~'.$title.':' . json_encode($data,JSON_UNESCAPED_UNICODE), FILE_APPEND);
  39. }
  40. //构建请求二维码参数
  41. //path是扫描二维码跳转的小程序路径,可以带参数?id=xxx
  42. //width是二维码宽度
  43. function getQrCode($ACCESS_TOKEN,$PAGES,$PATH='uploads/qrcode/',$NAME){
  44. //判断文件夹是否存在,不存在则创建
  45. if (!file_exists($PATH)) {
  46. mkdir ($PATH,0777,true);
  47. }
  48. // $qcode ="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=$ACCESS_TOKEN"; //方形二维码
  49. $qcode='https://api.weixin.qq.com/wxa/getwxacode?access_token='.$ACCESS_TOKEN; //圆形二维码
  50. $data = [
  51. 'width'=>120,
  52. 'path'=>$PAGES,
  53. 'is_hyaline'=>false,
  54. ];
  55. $param = json_encode($data);
  56. //POST参数
  57. $result = httpRequest( $qcode, $param,"POST");
  58. return $result;
  59. //生成二维码
  60. // file_put_contents($name.".png", $result);
  61. file_put_contents($PATH.$NAME.".png", $result);
  62. $base64_image ="data:image/jpeg;base64,".base64_encode($result);
  63. return $result;
  64. }
  65. //把请求发送到微信服务器换取二维码
  66. function httpRequest($url, $data='', $method='GET'){
  67. $curl = curl_init();
  68. curl_setopt($curl, CURLOPT_URL, $url);
  69. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  70. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  71. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  72. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  73. curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
  74. if($method=='POST')
  75. {
  76. curl_setopt($curl, CURLOPT_POST, 1);
  77. if ($data != '')
  78. {
  79. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  80. }
  81. }
  82. curl_setopt($curl, CURLOPT_TIMEOUT, 30);
  83. curl_setopt($curl, CURLOPT_HEADER, 0);
  84. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  85. $result = curl_exec($curl);
  86. curl_close($curl);
  87. return $result;
  88. }
  89. function getNonceStr($length = 32) {
  90. $chars = "ACEFGHMNQRTYabdefgijmnpqr";
  91. $str ="";
  92. for ( $i = 0; $i < $length; $i++ ) {
  93. $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
  94. }
  95. return $str;
  96. }
  97. /**
  98. * @notes 截取某字符字符串
  99. * @param $str
  100. * @param string $symbol
  101. * @return string
  102. * @author 令狐冲
  103. * @date 2021/7/7 18:42
  104. */
  105. function substr_symbol_behind($str, $symbol = '.')
  106. {
  107. $result = strripos($str, $symbol);
  108. if ($result === false) {
  109. return $str;
  110. };
  111. return substr($str, $result + 1);
  112. }
  113. /**
  114. * @notes 商品规格三维转二维
  115. * @param $array
  116. * @return array
  117. * @author cjhao
  118. * @date 2021/7/16 11:14
  119. */
  120. function array_converting($array):array
  121. {
  122. $list = array_map(function ($val){
  123. return array_column($val,'value');
  124. },$array);
  125. return $list;
  126. }
  127. /**
  128. * $list = [
  129. * [
  130. * 0 => "黑巧风暴"
  131. * 1 => "白桃乌龙"
  132. * ],
  133. * [
  134. * 0 => "4G"
  135. * 1 => "8G"
  136. * 2 => "12G"
  137. * ]
  138. * ]
  139. * 或
  140. * $color = ['黑色','白色'];
  141. * $memory = ['4G','6G']
  142. * @notes 返回笛卡尔积,可接收多个数组或一个二维数组
  143. * @return array|mixed
  144. * @author cjhao
  145. * @date 2021/7/13 14:47
  146. */
  147. function cartesian_product():array
  148. {
  149. $params = func_get_args();
  150. if (!is_array($params)) {
  151. return [];
  152. }
  153. if (count($params[0]) != count($params[0], 1)) {
  154. // $params = array_shift($params);
  155. $params = $params[0];
  156. }
  157. $firstArr = array_shift($params);
  158. array_walk($firstArr, function (&$val, $key) {
  159. $val = ['ids' => $key, 'spec_value' => $val];
  160. });
  161. //单个规格项目直接返回
  162. if (empty($params)) {
  163. return $firstArr;
  164. }
  165. $pCount = count($params);
  166. $specList = $firstArr;
  167. $separator = app\common\enum\GoodsEnum::SPEC_SEPARATOR;
  168. //多个规格项返回笛卡尔积
  169. for ($i = 0; $i < $pCount; $i++) {
  170. $tmp = [];
  171. foreach ($specList as $specVal) {
  172. foreach ($params[$i] as $paramKey => $paramVal) {
  173. $tmp[] = [
  174. 'ids' => $specVal['ids'].$separator.$paramKey,
  175. 'spec_value' => $specVal['spec_value'].$separator.$paramVal,
  176. ];
  177. }
  178. }
  179. $specList = $tmp;
  180. }
  181. return $specList;
  182. }
  183. /**
  184. * @notes 生成指定长度编码
  185. * @param int $len
  186. * @return string
  187. * @author 张无忌
  188. * @date 2021/7/20 15:52
  189. */
  190. function create_code($len=6)
  191. {
  192. $letter_all = range('A', 'Z');
  193. shuffle($letter_all);
  194. //排除I、O字母
  195. $letter_array = array_diff($letter_all, ['I', 'O']);
  196. //随机获取四位字母
  197. $letter = array_rand(array_flip($letter_array), 4);
  198. //排除1、0
  199. $num_array = range('2', '9');
  200. shuffle($num_array);
  201. //获取随机六位数字
  202. $num = array_rand(array_flip($num_array), $len);
  203. $code = implode('', array_merge($letter, $num));
  204. return $code;
  205. }
  206. /**
  207. * @notes 获取前几天的日期
  208. * @param int $day
  209. * @return array
  210. * @author 张无忌
  211. * @date 2021/7/21 15:53
  212. */
  213. function get_datetime($day=7)
  214. {
  215. $d = [];
  216. for ($i=1; $i<=$day; $i++) {
  217. $d[] = date('Y-m-d', strtotime('-'.$i.' days'));
  218. }
  219. return array_reverse($d);
  220. }
  221. /**
  222. * @notes 返回是否有下一页
  223. * @param $count
  224. * @param $page
  225. * @param $size
  226. * @return int
  227. * @author Tab
  228. * @date 2021/7/17 17:56
  229. */
  230. function is_more($count, $page, $size)
  231. {
  232. $more = 0;
  233. $last_page = ceil($count / $size);
  234. if ($last_page && $last_page > $page) {
  235. $more = 1;
  236. }
  237. return $more;
  238. }
  239. /**
  240. * 多级线性结构排序
  241. * 转换前:
  242. * [{"id":1,"pid":0,"name":"a"},{"id":2,"pid":0,"name":"b"},{"id":3,"pid":1,"name":"c"},
  243. * {"id":4,"pid":2,"name":"d"},{"id":5,"pid":4,"name":"e"},{"id":6,"pid":5,"name":"f"},
  244. * {"id":7,"pid":3,"name":"g"}]
  245. * 转换后:
  246. * [{"id":1,"pid":0,"name":"a","level":1},{"id":3,"pid":1,"name":"c","level":2},{"id":7,"pid":3,"name":"g","level":3},
  247. * {"id":2,"pid":0,"name":"b","level":1},{"id":4,"pid":2,"name":"d","level":2},{"id":5,"pid":4,"name":"e","level":3},
  248. * {"id":6,"pid":5,"name":"f","level":4}]
  249. * @param array $data 线性结构数组
  250. * @param string $symbol 名称前面加符号
  251. * @param string $name 名称
  252. * @param string $id_name 数组id名
  253. * @param string $parent_id_name 数组祖先id名
  254. * @param int $level 此值请勿给参数
  255. * @param int $parent_id 此值请勿给参数
  256. * @return array
  257. */
  258. function linear_to_tree($data, $sub_key_name = 'sub', $id_name = 'id', $parent_id_name = 'pid', $parent_id = 0)
  259. {
  260. $tree = [];
  261. foreach ($data as $row) {
  262. if ($row[$parent_id_name] == $parent_id) {
  263. $temp = $row;
  264. $child = linear_to_tree($data, $sub_key_name, $id_name, $parent_id_name, $row[$id_name]);
  265. if($child){
  266. $temp[$sub_key_name] = $child;
  267. }
  268. $tree[] = $temp;
  269. }
  270. }
  271. return $tree;
  272. }
  273. /**
  274. * @notes 通过时间生成订单编号
  275. * @param $table
  276. * @param $field
  277. * @param string $prefix
  278. * @param int $rand_suffix_length
  279. * @param array $pool
  280. * @return string
  281. * @author 段誉
  282. * @date 2021/7/23 14:15
  283. */
  284. function generate_sn($table, $field, $prefix = '', $rand_suffix_length = 4, $pool = []) : string
  285. {
  286. $suffix = '';
  287. for ($i = 0; $i < $rand_suffix_length; $i++) {
  288. if (empty($pool)) {
  289. $suffix .= rand(0, 9);
  290. } else {
  291. $suffix .= $pool[array_rand($pool)];
  292. }
  293. }
  294. $sn = $prefix . date('YmdHis') . $suffix;
  295. if ($table->where($field, $sn)->find()) {
  296. return generate_sn($table, $field, $prefix, $rand_suffix_length, $pool);
  297. }
  298. return $sn;
  299. }
  300. /**
  301. * @notes 随机生成邀请码
  302. * @param $length
  303. * @return string
  304. * @author Tab
  305. * @date 2021/7/26 11:17
  306. */
  307. function generate_code($length = 6)
  308. {
  309. // 去除字母IO数字012
  310. $letters = 'ABCDEFGHJKLMNPQRSTUVWXYZ3456789';
  311. // 随机起始索引
  312. $start = mt_rand(0, strlen($letters) - $length);
  313. // 打乱字符串
  314. $shuffleStr = str_shuffle($letters);
  315. // 截取字符
  316. $randomStr = substr($shuffleStr, $start, $length);
  317. // 判断是否已被使用
  318. $user = \app\common\model\User::where('code', $randomStr)->findOrEmpty();
  319. if($user->isEmpty()) {
  320. return $randomStr;
  321. }
  322. generate_code($length);
  323. }
  324. /**
  325. * User: 意象信息科技 lr
  326. * Desc: 下载文件
  327. * @param $url 文件url
  328. * @param $save_dir 保存目录
  329. * @param $file_name 文件名
  330. * @return string
  331. */
  332. function download_file($url, $save_dir, $file_name)
  333. {
  334. if (!file_exists($save_dir)) {
  335. mkdir($save_dir, 0775, true);
  336. }
  337. $file_src = $save_dir . $file_name;
  338. file_exists($file_src) && unlink($file_src);
  339. $ch = curl_init();
  340. curl_setopt($ch, CURLOPT_URL, $url);
  341. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  342. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  343. $file = curl_exec($ch);
  344. curl_close($ch);
  345. $resource = fopen($file_src, 'a');
  346. fwrite($resource, $file);
  347. fclose($resource);
  348. if (filesize($file_src) == 0) {
  349. unlink($file_src);
  350. return '';
  351. }
  352. return $file_src;
  353. }
  354. function create_user_sn($prefix = '', $length = 8)
  355. {
  356. $rand_str = '';
  357. for ($i = 0; $i < $length; $i++) {
  358. $rand_str .= mt_rand(0, 9);
  359. }
  360. $sn = $prefix . $rand_str;
  361. if (\app\common\model\User::where(['sn' => $sn])->find()) {
  362. return create_user_sn($prefix, $length);
  363. }
  364. return $sn;
  365. }
  366. /**
  367. * @notes 当前是否为cli模式
  368. * @return bool
  369. * @author 段誉
  370. * @date 2021/8/3 14:45
  371. */
  372. function is_cli()
  373. {
  374. return preg_match("/cli/i", php_sapi_name()) ? true : false;
  375. }
  376. /**
  377. * Notes:判断文件是否存在(远程和本地文件)
  378. * @param $file string 完整的文件链接
  379. * @return bool
  380. */
  381. function check_file_exists($file)
  382. {
  383. if ('http' == strtolower(substr($file, 0, 4))) {
  384. //远程文件
  385. $header = get_headers($file, true);
  386. return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
  387. }
  388. // 本地文件
  389. return file_exists($file);
  390. }
  391. /**
  392. * Notes:去掉名称中的表情
  393. * @param $str
  394. * @return string|string[]|null
  395. */
  396. function filterEmoji($str)
  397. {
  398. $str = preg_replace_callback(
  399. '/./u',
  400. function (array $match) {
  401. return strlen($match[0]) >= 4 ? '' : $match[0];
  402. },
  403. $str);
  404. return $str;
  405. }
  406. /**
  407. * 将图片切成圆角
  408. */
  409. function rounded_corner($src_img)
  410. {
  411. $w = imagesx($src_img);//微信头像宽度 正方形的
  412. $h = imagesy($src_img);//微信头像宽度 正方形的
  413. $w = min($w, $h);
  414. $h = $w;
  415. $img = imagecreatetruecolor($w, $h);
  416. //这一句一定要有
  417. imagesavealpha($img, true);
  418. //拾取一个完全透明的颜色,最后一个参数127为全透明
  419. $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
  420. imagefill($img, 0, 0, $bg);
  421. $r = $w / 2; //圆半径
  422. // $y_x = $r; //圆心X坐标
  423. // $y_y = $r; //圆心Y坐标
  424. for ($x = 0; $x < $w; $x++) {
  425. for ($y = 0; $y < $h; $y++) {
  426. $rgbColor = imagecolorat($src_img, $x, $y);
  427. if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
  428. imagesetpixel($img, $x, $y, $rgbColor);
  429. }
  430. }
  431. }
  432. unset($src_img);
  433. return $img;
  434. }
  435. /**
  436. * @notes 浮点数去除无效的0
  437. * @param $float
  438. * @return int|mixed|string
  439. * @author Tab
  440. * @date 2021/8/11 10:17
  441. */
  442. function clear_zero($float)
  443. {
  444. if($float == intval($float)) {
  445. return intval($float);
  446. }else if($float == sprintf('%.1f', $float)) {
  447. return sprintf('%.1f', $float);
  448. }
  449. return $float;
  450. }
  451. /**
  452. * @notes 获取文件扩展名
  453. * @param $file
  454. * @return array|string|string[]
  455. * @author 段誉
  456. * @date 2021/8/14 15:24
  457. */
  458. function get_extension($file)
  459. {
  460. return pathinfo($file, PATHINFO_EXTENSION);
  461. }
  462. /**
  463. * @notes 遍历指定目录下的文件(目标目录,排除文件)
  464. * @param $dir //目标文件
  465. * @param string $exclude_file //要排除的文件
  466. * @param string $target_suffix //指定后缀
  467. * @return array|false
  468. * @author 段誉
  469. * @date 2021/8/14 14:44
  470. */
  471. function get_scandir($dir, $exclude_file = '', $target_suffix = '')
  472. {
  473. if (!file_exists($dir) || empty(trim($dir))) {
  474. return [];
  475. }
  476. $files = scandir($dir);
  477. $res = [];
  478. foreach ($files as $item) {
  479. if ($item == "." || $item == ".." || $item == $exclude_file) {
  480. continue;
  481. }
  482. if (!empty($target_suffix)) {
  483. if (get_extension($item) == $target_suffix) {
  484. $res[] = $item;
  485. }
  486. } else {
  487. $res[] = $item;
  488. }
  489. }
  490. if (empty($item)) {
  491. return false;
  492. }
  493. return $res;
  494. }
  495. /**
  496. * @notes 解压压缩包
  497. * @param $file
  498. * @param $save_dir
  499. * @return bool
  500. * @author 段誉
  501. * @date 2021/8/14 15:27
  502. */
  503. function unzip($file, $save_dir)
  504. {
  505. if (!file_exists($file)) {
  506. return false;
  507. }
  508. $zip = new \ZipArchive();
  509. if ($zip->open($file) !== TRUE) {//中文文件名要使用ANSI编码的文件格式
  510. return false;
  511. }
  512. $zip->extractTo($save_dir);
  513. $zip->close();
  514. return true;
  515. }
  516. /**
  517. * @notes 删除目标目录
  518. * @param $path
  519. * @param $delDir
  520. * @return bool|void
  521. * @author 段誉
  522. * @date 2021/8/14 15:33
  523. */
  524. function del_target_dir($path, $delDir)
  525. {
  526. //没找到,不处理
  527. if (!file_exists($path)) {
  528. return false;
  529. }
  530. //打开目录句柄
  531. $handle = opendir($path);
  532. if ($handle) {
  533. while (false !== ($item = readdir($handle))) {
  534. if ($item != "." && $item != "..") {
  535. if (is_dir("$path/$item")) {
  536. del_target_dir("$path/$item", $delDir);
  537. } else {
  538. unlink("$path/$item");
  539. }
  540. }
  541. }
  542. closedir($handle);
  543. if ($delDir) {
  544. return rmdir($path);
  545. }
  546. } else {
  547. if (file_exists($path)) {
  548. return unlink($path);
  549. }
  550. return false;
  551. }
  552. }
  553. /**
  554. * @notes 本地版本
  555. * @return mixed
  556. * @author 段誉
  557. * @date 2021/8/14 15:33
  558. */
  559. function local_version()
  560. {
  561. if(!file_exists('./upgrade/')) {
  562. // 若文件夹不存在,先创建文件夹
  563. mkdir('./upgrade/', 0777, true);
  564. }
  565. if(!file_exists('./upgrade/version.json')) {
  566. // 获取本地版本号
  567. $version = config('project.version');
  568. $data = ['version' => $version];
  569. $src = './upgrade/version.json';
  570. // 新建文件
  571. file_put_contents($src, json_encode($data, JSON_UNESCAPED_UNICODE));
  572. }
  573. $json_string = file_get_contents('./upgrade/version.json');
  574. // 用参数true把JSON字符串强制转成PHP数组
  575. $data = json_decode($json_string, true);
  576. return $data;
  577. }
  578. /**
  579. * @notes 隐藏字符串
  580. * @param string $str 需要隐藏的字符串
  581. * @param string $replaceStr 隐藏的字符串符号
  582. * @param int $replaceLength 隐藏的字符串符号长度
  583. * @return string
  584. * @author cjhao
  585. * @date 2021/8/16 19:23
  586. */
  587. function hide_substr(string $str,string $replaceStr = '*',int $replaceLength = 3)
  588. {
  589. $strlen = mb_strlen($str, 'utf-8');
  590. $firstStr = mb_substr($str, 0, 1, 'utf-8');
  591. $lastStr = mb_substr($str, -1, 1, 'utf-8');
  592. if($strlen > 3){
  593. return $firstStr . str_repeat($replaceStr, $replaceLength) . $lastStr;
  594. }
  595. return $firstStr . str_repeat($replaceStr, $replaceLength);
  596. }
  597. function day_time(int $days = 7,bool $timestamp = false,bool $isBefore = true,$starting = '')
  598. {
  599. empty($starting) && $starting = strtotime(date('Y-m-d'));
  600. $time = $starting;
  601. if(false === $timestamp){
  602. $time = date('Y-m-d',$starting);
  603. }
  604. $dayList[] = $time;
  605. while ($days > 1){
  606. if($isBefore){
  607. $starting -= 86400;
  608. }else{
  609. $starting += 86400;
  610. }
  611. $time = $starting;
  612. if(false === $timestamp){
  613. $time = date('Y-m-d',$starting);
  614. }
  615. $dayList[] = $time;
  616. $days--;
  617. }
  618. return $dayList;
  619. }
  620. /**
  621. * @notes 自定义长度纯数字随机编码
  622. * @param $table
  623. * @param string $field
  624. * @param int $length
  625. * @param string $prefix
  626. * @return string
  627. * @author ljj
  628. * @date 2021/8/26 2:57 下午
  629. */
  630. function create_number_sn($table, $field = 'sn', $length = 8, $prefix = '')
  631. {
  632. $rand_str = '';
  633. for ($i = 0; $i < $length; $i++) {
  634. $rand_str .= mt_rand(0, 9);
  635. }
  636. $sn = $prefix . $rand_str;
  637. if ($table->where($field, $sn)->find()) {
  638. return generate_sn($table, $field = 'sn', $length = 8, $prefix = '');
  639. }
  640. return $sn;
  641. }
  642. /**
  643. * @notes 腾讯地图转百度地图(gcj02->bd09)
  644. * @param $lat
  645. * @param $lng
  646. * @return float[]
  647. * @author ljj
  648. * @date 2021/8/27 2:42 下午
  649. */
  650. function convert_gcj02_to_bd09($lat, $lng)
  651. {
  652. $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  653. $x = $lng;
  654. $y = $lat;
  655. $z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
  656. $theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
  657. $lng = $z * cos($theta) + 0.0065;
  658. $lat = $z * sin($theta) + 0.006;
  659. return array('lng' => $lng, 'lat' => $lat);
  660. }
  661. /**
  662. * @notes 百度地图BD09坐标---->中国正常GCJ02坐标
  663. * @param $lat
  664. * @param $lng
  665. * @return float[]|int[]
  666. * @author ljj
  667. * @date 2021/8/27 2:43 下午
  668. */
  669. function Convert_BD09_To_GCJ02($lat, $lng)
  670. {
  671. $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  672. $x = $lng - 0.0065;
  673. $y = $lat - 0.006;
  674. $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
  675. $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
  676. $lng = $z * cos($theta);
  677. $lat = $z * sin($theta);
  678. return array('lng' => $lng, 'lat' => $lat);
  679. }
  680. /**
  681. * @notes 浮点数去除无效的0
  682. * @param $float
  683. * @return int|mixed|string
  684. * @author Tab
  685. * @date 2021/9/18 11:06
  686. */
  687. function clearZero($float)
  688. {
  689. if($float == intval($float)) {
  690. return intval($float);
  691. }else if($float == sprintf('%.1f', $float)) {
  692. return sprintf('%.1f', $float);
  693. }
  694. return $float;
  695. }
  696. /**
  697. * @notes 获取要使用的图片(用于多图片可选的时候,例:规格图片、商品图片,有规格图时先用规格图,没有则使用商品图)
  698. * @author Tab
  699. * @date 2021/9/18 11:40
  700. */
  701. function get_image(array $images)
  702. {
  703. foreach ($images as $item) {
  704. if (empty($item)) {
  705. continue;
  706. }
  707. return \app\common\service\FileService::getFileUrl(trim($item, '/'));
  708. }
  709. return '';
  710. }
  711. /**
  712. * @notes 天数格式化 例:1 格式化后变为 01
  713. * @param $day
  714. * @return mixed|string
  715. * @author Tab
  716. * @date 2021/9/27 11:01
  717. */
  718. function day_format($day)
  719. {
  720. if ($day < 10) {
  721. return '0' . $day;
  722. }
  723. return $day;
  724. }
  725. /**
  726. * @notes 获取服务端ip
  727. * @return array|false|mixed|string
  728. * @author 段誉
  729. * @date 2021/10/9 15:29
  730. */
  731. function get_server_ip()
  732. {
  733. if (!isset($_SERVER)) {
  734. return getenv('SERVER_ADDR');
  735. }
  736. if($_SERVER['SERVER_ADDR']) {
  737. return $_SERVER['SERVER_ADDR'];
  738. }
  739. return $_SERVER['LOCAL_ADDR'];
  740. }
  741. function is_mobile()
  742. {
  743. if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
  744. return true;
  745. }
  746. if (isset($_SERVER['HTTP_VIA'])) {
  747. return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
  748. }
  749. if (isset($_SERVER['HTTP_USER_AGENT'])) {
  750. $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');
  751. if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
  752. return true;
  753. }
  754. }
  755. if (isset($_SERVER['HTTP_ACCEPT'])) {
  756. 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')))) {
  757. return true;
  758. }
  759. }
  760. return false;
  761. }
  762. /**
  763. * @notes 获取内容中的图片
  764. * @param string $str
  765. * @author ljj
  766. * @date 2023/3/14 5:14 下午
  767. */
  768. function getContentImage($str = '')
  769. {
  770. $result = '';
  771. if (!empty($str)) {
  772. preg_match_all('/<img[^>]*?src="([^"]*?)"[^>]*?>/i',$str,$result);
  773. }
  774. return $result;
  775. }
  776. /**
  777. * @notes 保存远程图片到本地
  778. * @param $file_name //图片名称
  779. * @param $absolute_path//绝对路径
  780. * @param string $save_url//保存路径
  781. * @return array
  782. * @author ljj
  783. * @date 2023/3/16 3:24 下午
  784. */
  785. function saveImageToLocal($file_name, $absolute_path, string $save_url = 'uploads/images/')
  786. {
  787. try {
  788. $data = file_get_contents($absolute_path);
  789. $fileName = $save_url . $file_name;
  790. $fileLocalFullName = public_path() . $fileName;
  791. $f = fopen($save_url . $file_name, "w");
  792. fwrite($f, $data);
  793. fclose($f);
  794. app('\app\Request')->setTempUploadLocalWithFiles([
  795. 'file' => [
  796. 'name' => $fileName,
  797. 'type' => '',
  798. 'size' => filesize($fileLocalFullName),
  799. 'tmp_name' => $fileLocalFullName,
  800. 'error' => 0,
  801. 'full_path' => $fileLocalFullName,
  802. ],
  803. ]);
  804. //写入数据库中
  805. $file = UploadService::image(0);
  806. } catch (\Throwable $e) {
  807. // var_dump($e->__toString());
  808. $file = [];
  809. }
  810. return $file;
  811. }
  812. /**
  813. * @notes 校验HTTP
  814. * @param $url
  815. * @return mixed|string
  816. * @author ljj
  817. * @date 2023/3/16 3:39 下午
  818. */
  819. function checkHttp($url)
  820. {
  821. $preg = "/^http(s)?:\\/\\/.+/";
  822. if(!preg_match($preg,$url))
  823. {
  824. $url = ltrim($url,'//');
  825. $url = 'http://'.$url;
  826. }
  827. return $url;
  828. }