= 0 ? true : false; } /** * @notes 检查文件是否可写 * @param string $dir * @return bool * @author 段誉 * @date 2021/12/28 18:27 */ function check_dir_write(string $dir = ''): bool { $route = root_path() . '/' . $dir; return is_writable($route); } /** * 多级线性结构排序 * 转换前: * [{"id":1,"pid":0,"name":"a"},{"id":2,"pid":0,"name":"b"},{"id":3,"pid":1,"name":"c"}, * {"id":4,"pid":2,"name":"d"},{"id":5,"pid":4,"name":"e"},{"id":6,"pid":5,"name":"f"}, * {"id":7,"pid":3,"name":"g"}] * 转换后: * [{"id":1,"pid":0,"name":"a","level":1},{"id":3,"pid":1,"name":"c","level":2},{"id":7,"pid":3,"name":"g","level":3}, * {"id":2,"pid":0,"name":"b","level":1},{"id":4,"pid":2,"name":"d","level":2},{"id":5,"pid":4,"name":"e","level":3}, * {"id":6,"pid":5,"name":"f","level":4}] * @param array $data 线性结构数组 * @param string $symbol 名称前面加符号 * @param string $name 名称 * @param string $id_name 数组id名 * @param string $parent_id_name 数组祖先id名 * @param int $level 此值请勿给参数 * @param int $parent_id 此值请勿给参数 * @return array */ function linear_to_tree($data, $sub_key_name = 'sub', $id_name = 'id', $parent_id_name = 'pid', $parent_id = 0) { $tree = []; foreach ($data as $row) { if ($row[$parent_id_name] == $parent_id) { $temp = $row; $child = linear_to_tree($data, $sub_key_name, $id_name, $parent_id_name, $row[$id_name]); if ($child) { $temp[$sub_key_name] = $child; } $tree[] = $temp; } } return $tree; } /** * @notes 删除目标目录 * @param $path * @param $delDir * @return bool|void * @author 段誉 * @date 2022/4/8 16:30 */ 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 下载文件 * @param $url * @param $saveDir * @param $fileName * @return string * @author 段誉 * @date 2022/9/16 9:53 */ function download_file($url, $saveDir, $fileName) { if (!file_exists($saveDir)) { mkdir($saveDir, 0775, true); } $fileSrc = $saveDir . $fileName; file_exists($fileSrc) && unlink($fileSrc); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $resource = fopen($fileSrc, 'a'); fwrite($resource, $file); fclose($resource); if (filesize($fileSrc) == 0) { unlink($fileSrc); return ''; } return $fileSrc; } /** * @notes 去除内容图片域名 * @param $content * @return array|string|string[] * @author 段誉 * @date 2022/9/26 10:43 */ function clear_file_domain($content) { $fileUrl = FileService::getFileUrl(); $pattern = '/]*\bsrc=["\']' . preg_quote($fileUrl, '/') . '([^"\']+)["\']/i'; return preg_replace($pattern, 'make($table)->where($field, $sn)->find()) { return generate_sn($table, $field, $prefix, $randSuffixLength, $pool); } return $sn; } /** * @notes 格式化金额 * @param $float * @return int|mixed|string * @author 段誉 * @date 2023/2/24 11:20 */ function format_amount($float) { if ($float == intval($float)) { return intval($float); } elseif ($float == sprintf('%.1f', $float)) { return sprintf('%.1f', $float); } return $float; } /** * @desc 全局报错方法 * @param string $msg * @param int $is_log 是否记录日志 默认记录 * @param int $code * @param int $show * @param array $data * @return mixed * @date 2024/6/6 15:57 * @author dagouzi */ function message(string $msg = 'error', int $is_log = 0, int $code = 0, int $show = 0, array $data = []) { $data = compact('code', 'is_log', 'show', 'msg', 'data'); $response = \think\Response::create($data, 'json', 200); throw new \think\exception\HttpResponseException($response); } /** * @notes bytes 动态转换单位 * @param int $bytes * @return string * @author 段誉 * @date 2023/2/23 18:43 */ function format_bytes($bytes) { if ($bytes > 1024 * 1024 * 1024 * 1024) { return round($bytes / 1024 / 1024 / 1024 / 1024, 2) . 'TB'; } elseif ($bytes > 1024 * 1024 * 1024) { return round($bytes / 1024 / 1024 / 1024, 2) . 'GB'; } elseif ($bytes > 1024 * 1024) { return round($bytes / 1024 / 1024, 2) . 'MB'; } elseif ($bytes > 1024) { return round($bytes / 1024, 2) . 'KB'; } else { return $bytes . 'B'; } } /** * 生成唯一ID * @return string */ function generate_unique_task_id(): string { return md5(date('YmdHis') . uniqid() . mt_rand(1000000, 9999999)); } /** * 面试ai 获取 评分 * @notes 格式化JSON * @param string $text * @return array * @author dagouzi * @date 2025/3/24 15:57 */ function format_json($text) { // 使用正则表达式匹配JSON部分 $jsonPattern = '/\{(?:[^{}]|(?R))*\}/'; preg_match($jsonPattern,$text, $matches); // 输出匹配到的JSON字符串 $jsonString = $matches[0] ?? 'No JSON found'; $result = json_decode($jsonString, true); return $result; } function clogger($log_content, $log_filename = 'log'){ return ''; $max_size = 500000; $path = public_path().'/logs/knowledge'; !is_dir($path) && mkdir($path, 0777, true); file_put_contents($path.'/'.date('Ymd').'_'.$log_filename.'.log', $log_content.PHP_EOL, FILE_APPEND); } /** * @notes 卡密编码 * @param $table * @param $field * @param string $prefix * @param int $randSuffixLength * @param int $ruleType 生成规则:1-批次编号+随机字母;2-批次编号+随机数字; * @return string * @author ljj * @date 2024/5/8 10:14 上午 */ function card_sn($table, $field, $prefix = 'K', $randSuffixLength = 6, $ruleType = 2) : string { $string = $prefix; $letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; for ($i = 0; $i < $randSuffixLength; $i++) { if ($ruleType == 1) { $string .= $letters[rand(0, strlen($letters) - 1)]; } if ($ruleType == 2) { $string .= rand(0, 9); } } if (app()->make($table)->where($field, $string)->find()) { return generate_sn($table, $field, $prefix, $randSuffixLength, $ruleType); } return $string; }