common.php 20 KB

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