Files
jianbing/app/common.php
2025-05-26 17:26:41 +08:00

472 lines
12 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// 应用公共文件
use app\common\service\FileService;
use think\helper\Str;
use think\facade\{Db, Config};
/**
* @notes 生成密码加密密钥
* @param string $plaintext
* @param string $salt
* @return string
* @author 段誉
* @date 2021/12/28 18:24
*/
function create_password(string $plaintext, string $salt) : string
{
return md5($salt . md5($plaintext . $salt));
}
/**
* @notes 随机生成token值
* @param string $extra
* @return string
* @author 段誉
* @date 2021/12/28 18:24
*/
function create_token(string $extra = '') : string
{
$salt = env('project.unique_identification', 'likeadmin');
$encryptSalt = md5( $salt . uniqid());
return md5($salt . $extra . time() . $encryptSalt);
}
/**
* User: 意象信息科技 cjh
* Desc: 返回是否有下一页
* @param $count 总记录数
* @param $page 当前页码
* @param $size 每页记录数
* @return int
*/
function is_more($count, $page, $size)
{
$more = 0;
$last_page = ceil($count / $size); //总页数、也是最后一页
if ($last_page && $last_page > $page) {
$more = 1;
}
return $more;
}
/**
* @notes 截取某字符字符串
* @param $str
* @param string $symbol
* @return string
* @author 段誉
* @date 2021/12/28 18:24
*/
function substr_symbol_behind($str, $symbol = '.') : string
{
$result = strripos($str, $symbol);
if ($result === false) {
return $str;
}
return substr($str, $result + 1);
}
/**
* @notes 对比php版本
* @param string $version
* @return bool
* @author 段誉
* @date 2021/12/28 18:27
*/
function compare_php(string $version) : bool
{
return version_compare(PHP_VERSION, $version) >= 0 ? true : false;
}
function check_is_image($image) : bool
{
try {
if (function_exists('exif_imagetype')) {
$ImageType = exif_imagetype($image);
} else {
$info = getimagesize($image);
$ImageType = $info ? $info[2] : false;
}
} catch (\Exception $e) {
return false;
}
return in_array($ImageType, [1, 2, 3, 6]);
}
function data_success($msg = '', $data = [], $code = 1, $show = 1)
{
$result = [
'code' => $code,
'msg' => $msg,
'data' => $data,
'show' => $show,
];
return $result;
}
function data_error($msg = '', $data = [], $code = 0, $show = 1)
{
$result = [
'code' => $code,
'msg' => $msg,
'data' => $data,
'show' => $show,
];
return $result;
}
/**
* @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);
}
function is_https()
{
if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
return true;
} elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
return true;
} elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
return true;
}
return false;
}
/**
* 多级线性结构排序
* 转换前:
* [{"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 = 'children', $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;
}
/**
* User: 意象信息科技 lr
* Desc: 表单多维数据转换
* 例:
* 转换前:{"x":0,"a":[1,2,3],"b":[11,22,33],"c":[111,222,3333,444],"d":[1111,2222,3333]}
* 转换为:[{"a":1,"b":11,"c":111,"d":1111},{"a":2,"b":22,"c":222,"d":2222},{"a":3,"b":33,"c":3333,"d":3333}]
* @param $arr array 表单二维数组
* @param $fill boolean fill为false返回数据长度取最短反之取最长空值自动补充
* @return array
*/
function form_to_linear($arr, $fill = false)
{
$keys = [];
$count = $fill ? 0 : PHP_INT_MAX;
foreach ($arr as $k => $v) {
if (is_array($v)) {
$keys[] = $k;
$count = $fill ? max($count, count($v)) : min($count, count($v));
}
}
if (empty($keys)) {
return [];
}
$data = [];
for ($i = 0; $i < $count; $i++) {
foreach ($keys as $v) {
$data[$i][$v] = isset($arr[$v][$i]) ? $arr[$v][$i] : null;
}
}
return $data;
}
/**
* 生成会员码
* @return 会员码
*/
function create_user_sn($prefix = '', $length = 8)
{
$rand_str = '';
for ($i = 0; $i < $length; $i++) {
$rand_str .= mt_rand(0, 9);
}
$sn = $prefix . $rand_str;
if (Db::name('user')->where(['sn' => $sn])->find()) {
return create_user_sn($prefix, $length);
}
return $sn;
}
//生成用户邀请码
function generate_invite_code()
{
$letter_all = range('A', 'Z');
shuffle($letter_all);
//排除I、O字母
$letter_array = array_diff($letter_all, ['I', 'O', 'D']);
//排除1、0
$num_array = range('2', '9');
shuffle($num_array);
$pattern = array_merge($num_array, $letter_array, $num_array);
shuffle($pattern);
$pattern = array_values($pattern);
$code = '';
for ($i = 0; $i < 6; $i++) {
$code .= $pattern[mt_rand(0, count($pattern) - 1)];
}
$code = strtoupper($code);
$check = Db::name('user')->where('distribution_code', $code)->find();
if ($check) {
return generate_invite_code();
}
return $code;
}
/**
* User: 意象信息科技 mjf
* Desc: 用时间生成订单编号
* @param $table
* @param $field
* @param string $prefix
* @param int $rand_suffix_length
* @param array $pool
* @return string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
function createSn($table, $field, $prefix = '', $rand_suffix_length = 4, $pool = [])
{
$suffix = '';
for ($i = 0; $i < $rand_suffix_length; $i++) {
if (empty($pool)) {
$suffix .= rand(0, 9);
} else {
$suffix .= $pool[array_rand($pool)];
}
}
$sn = $prefix . date('YmdHis') . $suffix;
if (Db::name($table)->where($field, $sn)->find()) {
return createSn($table, $field, $prefix, $rand_suffix_length, $pool);
}
return $sn;
}
/**
* @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 = '/<img[^>]*\bsrc=["\']'.preg_quote($fileUrl, '/').'([^"\']+)["\']/i';
return preg_replace($pattern, '<img src="$1"', $content);
}
/**
* @notes 设置内容图片域名
* @param $content
* @return array|string|string[]|null
* @author 段誉
* @date 2024/2/5 16:36
*/
function get_file_domain($content)
{
$fileUrl = FileService::getFileUrl();
$imgPreg = '/(<img .*?src=")(?!https?:\/\/)([^"]*)(".*?>)/is';
$videoPreg = '/(<video .*?src=")(?!https?:\/\/)([^"]*)(".*?>)/is';
$content = preg_replace($imgPreg, "\${1}$fileUrl\${2}\${3}", $content);
$content = preg_replace($videoPreg, "\${1}$fileUrl\${2}\${3}", $content);
return $content;
}
/**
* @notes uri小写
* @param $data
* @return array|string[]
* @author 段誉
* @date 2022/7/19 14:50
*/
function lower_uri($data)
{
if (!is_array($data)) {
$data = [$data];
}
return array_map(function ($item) {
return strtolower(Str::camel($item));
}, $data);
}
/**
* @notes 获取无前缀数据表名
* @param $tableName
* @return mixed|string
* @author 段誉
* @date 2022/12/12 15:23
*/
function get_no_prefix_table_name($tableName)
{
$tablePrefix = config('database.connections.mysql.prefix');
$prefixIndex = strpos($tableName, $tablePrefix);
if ($prefixIndex !== 0 || $prefixIndex === false) {
return $tableName;
}
$tableName = substr_replace($tableName, '', 0, strlen($tablePrefix));
return trim($tableName);
}
/**
* @notes 生成编码
* @param $table
* @param $field
* @param string $prefix
* @param int $randSuffixLength
* @param array $pool
* @return string
* @author 段誉
* @date 2023/2/23 11:35
*/
function generate_sn($table, $field, $prefix = '', $randSuffixLength = 4, $pool = []) : string
{
$suffix = '';
for ($i = 0; $i < $randSuffixLength; $i++) {
if (empty($pool)) {
$suffix .= rand(0, 9);
} else {
$suffix .= $pool[array_rand($pool)];
}
}
$sn = $prefix . date('YmdHis') . $suffix;
if (app()->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;
}