常用封装之二common.php

<?php

use think\facade\Db;
use think\facade\Cache;
use think\facade\Log;

// 应用公共文件
if (!function_exists('JsonMessage')) {
    function JsonMessage($data = [], $http_status = 200, string $url = '')
    {
        // header('Content-Type:application/json');
        $result = [];

        is_null($data) && $data = '无数据';

        if (is_string($data)) {

            list($code, $msg) = explode('#', strpos($data, '#') ? (string) $data : '10000#' . $data);
        } else {
            $code    = 200;
            $msg     = '请求成功';

            if (is_string($http_status)) {
                $msg = $http_status;

                $http_status = 200;
            }

            if (is_numeric($data)) {
                if ($data > 0) {
                    $msg = "成功更新{$data}条数据";
                } else {
                    $msg = "无数据更新";
                }
                $data = [];
            } elseif ($data instanceof \think\Paginator) {
                $data = $data->toArray();
                $data = [
                    'total' => $data['total'],
                    'limit' => $data['per_page'],
                    'page'  => $data['current_page'],
                    'data'  => $data['data'],
                ];
            }

            if (isset($data['total'])) {
                $result = $data;
            } else {
                $result['data'] = $data === true ? [] : $data;
            }
        }

        if (!empty($url)) {
            $result['wait'] = 2;
            $result['url']  = $url;
        }

        $json = array_merge(['code' => intval($code), 'msg' => $msg], $result);

        return \think\Response::create(
            $json,
            input('?get.callback') ? 'jsonp' : 'json',
            $http_status
        )->options([
            'json_encode_param' => JSON_UNESCAPED_UNICODE | JSON_BIGINT_AS_STRING
        ]);
    }
}

if (!function_exists('JsonSuccess')) {
    function JsonSuccess(string $message = 'success', string $url = '')
    {
        return JsonMessage([], $message, $url);
    }
}

if (!function_exists('JsonError')) {
    function JsonError(string $message = '操作失败')
    {
        return JsonMessage($message);
    }
}

/**
 * 手动抛出json异常
 */
if (!function_exists('ErrorException')) {
    function ErrorException(string $message = '', int $code = 10000, int $http_status = 200)
    {
        throw new \app\admin\ErrorException($message, $code, $http_status);
    }
}

if (!function_exists('NotFoundException')) {
    function NotFoundException(string $message = '', int $code = 10000, int $http_status = 200)
    {
        throw new \app\home\NotFoundException($message, $code, $http_status);
    }
}

/**
 * 生成唯一标志
 */
if (!function_exists('uuid')) {
    function uuid()
    {
        $chars = md5(uniqid(mt_rand(), true));
        $uuid = substr($chars, 0, 8)
            . substr($chars, 8, 4)
            . substr($chars, 12, 4)
            . substr($chars, 16, 4)
            . substr($chars, 20, 12);
        return $uuid;
    }
}

if (!function_exists('filter_words')) {
    function filter_words($str)
    {
        $farr = array(
            "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU",
            "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
            "/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is"
        );
        $str = preg_replace($farr, '', $str);
        return $str;
    }
}

/**
 * 密码hash加密
 */
// if (!function_exists('passwordHash')) {
//     function passwordHash(string $password)
//     {
//         return password_hash($password, PASSWORD_DEFAULT);
//     }
// }

// if (!function_exists('passwordCheck')) {
//     function passwordCheck(string $password, string $hash)
//     {
//         return password_verify($password, $hash);
//     }
// }

function pwd2hash(string $pwd)
{
    return md5($pwd . md5($pwd));
}

function pwdverify(string $passwd = null, string $hash = null)
{
    try {
        $pwd_salt = session('pwd_salt');
        if (!$pwd_salt || !is_string($pwd_salt)) {
            throw new Exception('pwd_salt is null.');
        }

        if ($hash !== md5($passwd . $pwd_salt)) {
            throw new Exception('pwdword is error.');
        }
        session('pwd_salt', null);
        return true;
    } catch (\Exception $e) {
        session('pwd_salt', null);
        return false;
    }
}

function pwdsalt(string $salt = null)
{
    if (is_null($salt)) {
        $salt = sha1(random_bytes(10));
        session('pwd_salt', $salt);
        return $salt;
    }
    $sess_salt = session('pwd_salt');
    if (!$sess_salt) {
        return false;
    }
    return $sess_salt == $salt;
}

/**
 * code hash
 */
if (!function_exists('code_hash')) {
    function code_hash()
    {
        if ($hash = session('code.hash')) {
            return $hash;
        }

        $hash = sha1(mt_rand(1000000, 9999999));
        session('code.hash', $hash);
        return $hash;
    }
}

if (!function_exists('code_check')) {
    function code_check(string $hash)
    {
        $code = session('code.hash');
        session('code.hash', null);
        if (!empty($code) && $code === $hash) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('code_check')) {
    function captcha_check(string $code)
    {
        if (!session('captcha')) {
            return false;
        }
        $key = session('captcha.key');
        $code = mb_strtolower($code, 'UTF-8');
        $res = password_verify($code, $key);
        if ($res) {
            session('captcha', null);
        }
        return $res;
    }
}



/**
 * 无限极分类 - 数组结构
 * @param $list          [ 分类数组 ]
 * @param $parentIndex   [ 父类index ]
 * @param int $pid       [ 顶级ID ]
 * @param int $level     [ 等级 ]
 * @return array
 */
if (!function_exists('list_to_son')) {
    function list_to_son($list, $parentIndex = 'parent_id', $pid = 0, $level = 0, $strRepeat = '- -', &$tree = [])
    {
        foreach ($list as $key => $val) {
            if ($val[$parentIndex] == $pid) {
                $val['level'] = $level;
                $val['html']  = $level == 0 ? '' : str_repeat($strRepeat . ' ', $level);
                $tree[] = $val;
                list_to_son($list, $parentIndex, $val['id'], $level + 1, $strRepeat, $tree);
            }
        }
        return $tree;
    }
}

/**
 * 无限极分类 - 树状结构
 * @param $items        [ 分类数组 ]
 * @param $parentIndex  [ 父类index ]
 * @return array
 */
if (!function_exists('list_to_tree')) {
    function list_to_tree($list, $pid = 0, $parentIndex = 'parent_id', $child = 'child')
    {
        $tree = [];
        foreach ($list as $key => $val) {
            if ($val[$parentIndex] == $pid) {
                unset($list[$key]);
                if (!empty($list)) {
                    $children = list_to_tree($list, $val['id'], $parentIndex);
                    if (!empty($children)) {
                        $val[$child] = $children;
                    }
                }
                $tree[] = $val;
            }
        }
        return $tree;
    }
}

/**
 * 根据子类id查找出所有父级分类信息
 *
 */
if (!function_exists('get_parent_list')) {
    function get_parent_list($list, $id, $parentIndex = 'parent_id')
    {
        static $arr = [];
        foreach ($list as $val) {
            if ($val['id'] == $id) { //父级分类id等于所查找的id
                $arr[] = $val;
                if ($val[$parentIndex] > 0) {
                    get_parent_list($list, $val[$parentIndex]);
                }
            }
        }
        return $arr;
    }
}

/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
if (!function_exists('list_sort_by')) {
    function list_sort_by($list, $field, $sortby = 'asc')
    {
        if (is_array($list)) {
            $refer = $resultSet = array();
            foreach ($list as $i => $data) {
                $refer[$i] = &$data[$field];
            }

            switch ($sortby) {
                case 'asc': // 正向排序
                    asort($refer);
                    break;
                case 'desc': // 逆向排序
                    arsort($refer);
                    break;
                case 'nat': // 自然排序
                    natcasesort($refer);
                    break;
            }
            foreach ($refer as $key => $val) {
                $resultSet[] = &$list[$key];
            }

            return $resultSet;
        }
        return false;
    }
}

/**
 * 浏览器判断
 */
if (!function_exists('is_mobile')) {
    function is_mobile()
    {
        if (isset($_SERVER['HTTP_USER_AGENT'])) {
            $clientKeywords = [
                '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'
            ];
            // 从HTTP_USER_AGENT中查找手机浏览器的关键字
            if (preg_match("/(" . implode('|', $clientKeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
                return true;
            }
        }

        if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return true;
        }

        if (isset($_SERVER['HTTP_VIA'])) {
            return true;
        }

        return false;
    }
}

/**
 * 获取图片访问路径
 */
if (!function_exists('image_url')) {
    function image_url(string $path)
    {
        $driver = ['image' => 'image', 'oss' => 'oss'];
        $name = explode(':', $path);
        if (!empty($driver[$name[0]])) {
            try {
                $url = app('filesystem')->disk($driver[$name[0]])->getUrl($name[1]);
            } catch (Exception $e) {
                $url = '';
            }
        }
        return !empty($url) ? $url : $path;
    }
}

if (!function_exists('thumb_img')) {
    function thumb_img(string $path, $src = null)
    {
        $name = explode(':', $path);
        $temp = !empty($name[1]) ? $name[1] : $name[0];

        $disk = app('filesystem')->disk('thumb');
        if ($disk->has($temp)) {
            return $disk->getUrl($temp);
        }

        //生成缩略图
        try {
            if (is_null($src)) {
                $src = image_url($path);
            }
            new app\http\service\skylar\ResizeImage($src, 200, 200, $temp);
            return $disk->getUrl($temp);
        } catch (\Exception $e) {
            Log::record(['file' => $e->getFile(), 'line' => $e->getLine(), 'msg' => $e->getMessage()], 'notice');
            return $e->getMessage();
        }
    }
}

if (!function_exists('cms_redirect')) {
    function cms_redirect(string $url)
    {
        throw new \think\exception\HttpResponseException(\think\Response::create($url, 'redirect', 302));
    }
}

/**
 * 系统配置
 * @param $key
 */
// if (!function_exists('setting')) {
//     function setting(string $key)
//     {
//         return \app\model\SystemSetting::Setting($key);
//     }
// }


/**
 * 系统设置
 *
 * @Description
 * @example
 * @author uftd@qq.com
 * @date 2020-12-23
 * @param string $key
 * @param array $value
 * @return void
 */
function SystemSetting(string $key, array $value = [])
{
    $param = explode('.', $key);
    if (empty($value)) {
        $config = Cache::get(config('cache.prefix.config') . $param[0]); //直接获取缓存文件
        if (empty($config)) {
            //缓存文件不存在就读取数据库
            $res = Db::name('system_setting')->where("group", $param[0])->select();
            if ($res) {
                foreach ($res as $k => $val) {
                    $config[$val['key']] = $val['value'];
                }
                Cache::tag('config')->set(config('cache.prefix.config') . $param[0], $config);
            }
        }
        if (count($param) > 1) {
            return $config[$param[1]] ?? '';
        } else {
            return $config ?? [];
        }
    } else {
        //更新缓存
        $result =  Db::name('system_setting')->where("group", $param[0])->select();
        if ($result) {
            $temp = [];
            foreach ($result as $val) {
                $temp[$val['key']] = $val['value'];
            }
            foreach ($value as $k => $v) {
                $v = trim($v);
                $newArr = array('key' => $k, 'value' => is_array($v) ? json_encode($v) : $v, 'group' => $param[0]);
                if (!isset($temp[$k])) {
                    Db::name('system_setting')->insert($newArr); //新key数据插入数据库
                } else {
                    if ($v != $temp[$k])
                        Db::name('system_setting')->where("key", $k)->save($newArr); //缓存key存在且值有变更新此项
                }
            }
            //更新后的数据库记录
            $newRes = Db::name('system_setting')->where("group", $param[0])->select();
            foreach ($newRes as $rs) {
                $newData[$rs['key']] = $rs['value'];
            }
        } else {
            foreach ($value as $k => $v) {
                $newArr[] = array('key' => $k, 'value' => trim($v), 'group' => $param[0]);
            }
            Db::name('system_setting')->insertAll($newArr);
            $newData = $value;
        }
        return  Cache::tag('config')->set(config('cache.prefix.config') . $param[0], $newData);
    }
}

function SkyAuth(int $auth_id, int $user_id = null)
{
    $auth = null;
    if (is_null($user_id)) {
        /**
         * 从session拿,以后要改
         */
        $user = session('user');
        $auth = !empty($user['auth_node']['node']) ? $user['auth_node']['node'] : [];

        if ($auth === 'all') {
            return true;
        }
    }
    if (!is_array($auth)) {
        return false;
    }
    return in_array($auth_id, $auth);
}

 

posted @ 2022-04-13 10:24  糖粿  阅读(107)  评论(0编辑  收藏  举报