function.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: pijh
  5. * Date: 2017/8/20
  6. * Time: 00:33.
  7. */
  8. use Illuminate\Support\Arr;
  9. use Illuminate\Support\Facades\Storage;
  10. if (!function_exists('user_admin_config')) {
  11. function user_admin_config($key = null, $value = null)
  12. {
  13. $session = session();
  14. if (!$config = $session->get('admin.config')) {
  15. $config = config('admin');
  16. $config['lang'] = config('app.locale');
  17. }
  18. if (is_array($key)) {
  19. // 保存
  20. foreach ($key as $k => $v) {
  21. Arr::set($config, $k, $v);
  22. }
  23. $session->put('admin.config', $config);
  24. return;
  25. }
  26. if (null === $key) {
  27. return $config;
  28. }
  29. return Arr::get($config, $key, $value);
  30. }
  31. }
  32. // 生成随机码
  33. function create_invite_code()
  34. {
  35. $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  36. $rand = $code[rand(0, 25)]
  37. . strtoupper(dechex(date('m')))
  38. . date('d')
  39. . substr(time(), -5)
  40. . substr(microtime(), 2, 5)
  41. . sprintf('%02d', rand(0, 99));
  42. for (
  43. $a = md5($rand, true),
  44. $s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  45. $d = '',
  46. $f = 0;
  47. $f < 6;
  48. $g = ord($a[$f]),
  49. $d .= $s[($g ^ ord($a[$f + 8])) - $g & 0x1F],
  50. $f++
  51. ) {
  52. }
  53. return $d;
  54. }
  55. /**
  56. * 时间格式化(时间戳).
  57. *
  58. * @return false|string
  59. */
  60. function uc_time_ago($ptime)
  61. {
  62. date_default_timezone_set('PRC');
  63. $etime = time() - $ptime;
  64. switch ($etime) {
  65. case $etime <= 60:
  66. $msg = '刚刚';
  67. break;
  68. case $etime > 60 && $etime <= 60 * 60:
  69. $msg = floor($etime / 60) . '分钟前';
  70. break;
  71. case $etime > 60 * 60 && $etime <= 24 * 60 * 60:
  72. $msg = date('Ymd', $ptime) == date('Ymd', time()) ? '今天 ' . date('H:i', $ptime) : '昨天 ' . date('H:i', $ptime);
  73. break;
  74. case $etime > 24 * 60 * 60 && $etime <= 2 * 24 * 60 * 60:
  75. $msg = date('Ymd', $ptime) + 1 == date('Ymd', time()) ? '昨天 ' . date('H:i', $ptime) : '前天 ' . date('H:i', $ptime);
  76. break;
  77. case $etime > 2 * 24 * 60 * 60 && $etime <= 12 * 30 * 24 * 60 * 60:
  78. $msg = date('Y', $ptime) == date('Y', time()) ? date('m-d H:i', $ptime) : date('Y-m-d H:i', $ptime);
  79. break;
  80. default:
  81. $msg = date('Y-m-d H:i', $ptime);
  82. }
  83. return $msg;
  84. }
  85. /**
  86. * 获取IP地址归属地.
  87. *
  88. * @return string
  89. */
  90. function get_ip_address($ip)
  91. {
  92. if ('127.0.0.1' == $ip) {
  93. return 'Localhost';
  94. }
  95. $url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip;
  96. $ch = curl_init($url);
  97. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  98. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
  99. $location = curl_exec($ch);
  100. $location = json_decode($location, true);
  101. curl_close($ch);
  102. if (false != $location && 0 === $location['code']) {
  103. return $location['data']['region'] . $location['data']['city'] . $location['data']['county'] . '・' . $location['data']['isp'];
  104. }
  105. return 'unknown';
  106. }
  107. /**
  108. * 递归查询获取分类树结构.
  109. *
  110. * @param int $pid
  111. * @param int $level
  112. * @param array $tree
  113. * @param string $pidField
  114. * @param string $showField
  115. *
  116. * @return array
  117. */
  118. function get_tree_list(&$data, $pid = 0, $level = 0, &$tree = [], $pidField = 'pid', $showField = 'name')
  119. {
  120. foreach ($data as $key => &$value) {
  121. if ($value[$pidField] == $pid) {
  122. $value['level'] = $level;
  123. $value['level'] && $value[$showField] = '&nbsp;' . $value[$showField];
  124. $value[$showField] = str_repeat('ㅡ', $value['level']) . $value[$showField];
  125. $tree[] = $value;
  126. unset($data[$key]);
  127. get_tree_list($data, $value['id'], $level + 1, $tree);
  128. }
  129. }
  130. unset($value);
  131. return $tree;
  132. }
  133. /**
  134. * 递归查询获取分类树结构带child.
  135. *
  136. * @param int $pid
  137. * @param int $level
  138. * @param string $pidField
  139. *
  140. * @return array
  141. */
  142. function get_tree_list_with_child(&$data, $pid = 0, $level = 0, $pidField = 'pid')
  143. {
  144. $tree = [];
  145. foreach ($data as $key => &$value) {
  146. if ($value[$pidField] == $pid) {
  147. $value['level'] = $level;
  148. $value['child'] = get_tree_list_with_child($data, $value['id'], $level + 1);
  149. $tree[] = $value;
  150. unset($data[$key]);
  151. }
  152. }
  153. unset($value);
  154. return $tree;
  155. }
  156. /**
  157. * 打印sql语句,在sql语句之前调用.
  158. */
  159. function dump_sql()
  160. {
  161. \DB::listen(function ($query) {
  162. $bindings = $query->bindings;
  163. $i = 0;
  164. $rawSql = preg_replace_callback('/\?/', function ($matches) use ($bindings, &$i) {
  165. $item = isset($bindings[$i]) ? $bindings[$i] : $matches[0];
  166. $i++;
  167. return 'string' == gettype($item) ? "'$item'" : $item;
  168. }, $query->sql);
  169. echo $rawSql . "\n<br /><br />\n";
  170. });
  171. }
  172. function create_guid($namespace = null)
  173. {
  174. static $guid = '';
  175. $uid = uniqid('', true);
  176. $data = $namespace;
  177. $data .= $_SERVER['REQUEST_TIME']; // 请求那一刻的时间戳
  178. $data .= $_SERVER['HTTP_USER_AGENT']; // 获取访问者在用什么操作系统
  179. $data .= $_SERVER['SERVER_ADDR']; // 服务器IP
  180. $data .= $_SERVER['SERVER_PORT']; // 端口号
  181. $data .= $_SERVER['REMOTE_ADDR']; // 远程IP
  182. $data .= $_SERVER['REMOTE_PORT']; // 端口信息
  183. $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
  184. $guid = substr($hash, 0, 8);
  185. return $guid;
  186. }
  187. function create_order_number()
  188. {
  189. return date('Ymd') . str_pad(mt_rand(1, 999999), 6, '0', STR_PAD_LEFT);
  190. }
  191. /**
  192. * curl 请求
  193. *
  194. * @param null $header
  195. * @param null $data
  196. */
  197. function curlRequest($url, $header = null, $data = null)
  198. {
  199. $ch = curl_init();
  200. curl_setopt($ch, CURLOPT_URL, $url);
  201. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  202. curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
  203. curl_setopt($ch, CURLOPT_HEADER, 1);
  204. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  205. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  206. if ($data) {
  207. curl_setopt($ch, CURLOPT_POST, 1);
  208. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  209. }
  210. if ($header) {
  211. curl_setopt($ch, CURLOPT_HEADER, $header);
  212. }
  213. $ret = curl_exec($ch);
  214. curl_close($ch);
  215. return $ret;
  216. }
  217. /**
  218. * 数字金额转换成中文大写金额的函数.
  219. *
  220. * @return string
  221. */
  222. function cny($num)
  223. {
  224. $c1 = '零壹贰叁肆伍陆柒捌玖';
  225. $c2 = '分角元拾佰仟万拾佰仟亿';
  226. $num = round($num, 2);
  227. $num = $num * 100;
  228. if (strlen($num) > 10) {
  229. return '数据太长,没有这么大的钱吧,检查下';
  230. }
  231. $i = 0;
  232. $c = '';
  233. while (1) {
  234. if (0 == $i) {
  235. $n = substr($num, strlen($num) - 1, 1);
  236. } else {
  237. $n = $num % 10;
  238. }
  239. $p1 = substr($c1, 3 * $n, 3);
  240. $p2 = substr($c2, 3 * $i, 3);
  241. if ('0' != $n || ('0' == $n && ('亿' == $p2 || '万' == $p2 || '元' == $p2))) {
  242. $c = $p1 . $p2 . $c;
  243. } else {
  244. $c = $p1 . $c;
  245. }
  246. $i = $i + 1;
  247. $num = $num / 10;
  248. $num = (int) $num;
  249. if (0 == $num) {
  250. break;
  251. }
  252. }
  253. $j = 0;
  254. $slen = strlen($c);
  255. while ($j < $slen) {
  256. $m = substr($c, $j, 6);
  257. if ('零元' == $m || '零万' == $m || '零亿' == $m || '零零' == $m) {
  258. $left = substr($c, 0, $j);
  259. $right = substr($c, $j + 3);
  260. $c = $left . $right;
  261. $j = $j - 3;
  262. $slen = $slen - 3;
  263. }
  264. $j = $j + 3;
  265. }
  266. if ('零' == substr($c, strlen($c) - 3, 3)) {
  267. $c = substr($c, 0, strlen($c) - 3);
  268. }
  269. if (empty($c)) {
  270. return '零元整';
  271. }
  272. return $c . '整';
  273. }
  274. if (!function_exists('valid_url')) {
  275. /**
  276. * 路径助手函数.
  277. *
  278. * @param null $disk_name
  279. * @param false $temp
  280. * @param DateTimeInterface|null $expiration
  281. *
  282. * @return string|null
  283. */
  284. function valid_url($url, $disk_name = null, $temp = false, $expiration = null)
  285. {
  286. if (is_null($url)) {
  287. return null;
  288. }
  289. if (filter_var($url, FILTER_VALIDATE_URL)) {
  290. return $url;
  291. }
  292. if ($temp) {
  293. $expiration = $expiration ?: now()->addMinutes(30);
  294. return Storage::disk($disk_name)->temporaryUrl($url, $expiration);
  295. }
  296. return Storage::disk($disk_name)->url($url);
  297. }
  298. }
  299. if (!function_exists('user')) {
  300. /**
  301. * 获取用户登录信息.
  302. *
  303. * @return \Illuminate\Contracts\Auth\Authenticatable|\App\Models\User
  304. */
  305. function user()
  306. {
  307. return auth('api')->user();
  308. }
  309. }
  310. if (!function_exists('save2Oss')) {
  311. /**
  312. * @create JianJia.Zhou<z656123456@gmail.com>
  313. *
  314. * @param string $type
  315. *
  316. * @throws Exception
  317. */
  318. function save2Oss(string $path, $type = 'images'): string
  319. {
  320. try {
  321. $endpoint = 'http://' . env('ALI_OSS_BUCKET') . '.' . env('ALI_OSS_ENDPOINT');
  322. $ossClient = new \OSS\OssClient(env('ALI_OSS_ACCESS_ID'), env('ALI_OSS_ACCESS_SECRET'), $endpoint, true);
  323. $filename = explode('/', $path);
  324. $filename = array_pop($filename);
  325. $object = $type . '/' . $filename;
  326. $ossClient->uploadFile(env('ALI_OSS_BUCKET'), $object, $path);
  327. unlink($path);
  328. return $endpoint . '/' . $object;
  329. } catch (\OSS\Core\OssException $e) {
  330. // dd($e->getMessage());
  331. throw new Exception($e->getMessage());
  332. }
  333. }
  334. }