367 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | ThinkPHP [ WE CAN DO IT JUST THINK ]
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | Author: 流年 <liu21st@gmail.com>
 | ||
| // +----------------------------------------------------------------------
 | ||
| 
 | ||
| use think\exception\ClassNotFoundException;
 | ||
| 
 | ||
| // 应用公共文件
 | ||
| 
 | ||
| if (!function_exists('widget')) {
 | ||
|     /**
 | ||
|      * 渲染输出Widget
 | ||
|      * @param string    $name Widget名称
 | ||
|      * @param array     $data 传入的参数
 | ||
|      * @return mixed
 | ||
|      * milo 2019-05-08 从TP5.1代码中拿来修改的
 | ||
|      */
 | ||
|     function widget($name, $data = [])
 | ||
|     {
 | ||
|         return action($name, $data, 'widget');
 | ||
|     }
 | ||
| }
 | ||
| if (!function_exists('action')) {
 | ||
|     /**
 | ||
|      * 调用模块的操作方法 参数格式 [模块/控制器/]操作
 | ||
|      * @param string        $url 调用地址
 | ||
|      * @param string|array  $vars 调用参数 支持字符串和数组
 | ||
|      * @param string        $layer 要调用的控制层名称
 | ||
|      * @param bool          $appendSuffix 是否添加类名后缀
 | ||
|      * @return mixed
 | ||
|      * milo 2019-05-08 从TP5.1代码中拿来修改的
 | ||
|      */
 | ||
|     function action($url, $vars = [], $layer = 'controller', $appendSuffix = false)
 | ||
|     {
 | ||
|         $info   = pathinfo($url);
 | ||
|         $action = $info['basename'];
 | ||
|         $module = '.' != $info['dirname'] ? $info['dirname'] : request()->controller();
 | ||
|         $class  = controller($module, $layer);
 | ||
|         if (is_scalar($vars)) {
 | ||
|             if (strpos($vars, '=')) {
 | ||
|                 parse_str($vars, $vars);
 | ||
|             } else {
 | ||
|                 $vars = [$vars];
 | ||
|             }
 | ||
|         }
 | ||
|         return app()->invokeMethod([$class, $action . config('route.action_suffix')], $vars);
 | ||
|     }
 | ||
| }
 | ||
| if (!function_exists('controller')) {
 | ||
|     /**
 | ||
|      * 实例化(分层)控制器 格式:[模块名/]控制器名
 | ||
|      * @access public
 | ||
|      * @param  string $name              资源地址
 | ||
|      * @param  string $layer             控制层名称
 | ||
|      * @param  bool   $appendSuffix      是否添加类名后缀
 | ||
|      * @param  string $empty             空控制器名称
 | ||
|      * @return object
 | ||
|      * @throws ClassNotFoundException
 | ||
|      * 
 | ||
|      * milo 2019-05-08 从TP5.1代码中拿来修改的
 | ||
|      */
 | ||
|     function controller($name, $layer = 'controller', $empty = '')
 | ||
|     {
 | ||
|         $class = parseClass($name, $layer);
 | ||
|         if (class_exists($class)) {
 | ||
|             return app()->make($class);
 | ||
|         } elseif ($empty && class_exists($emptyClass = app()->parseClass($layer, $empty))) {
 | ||
|             return app()->make($emptyClass);
 | ||
|         }
 | ||
| 
 | ||
|         throw new ClassNotFoundException('class not exists:' . $class, $class);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| if (!function_exists('parseClass')) {
 | ||
|     /**
 | ||
|      * 解析模块和类名
 | ||
|      * @access protected
 | ||
|      * @param  string $name         资源地址
 | ||
|      * @param  string $layer        验证层名称
 | ||
|      * @param  bool   $appendSuffix 是否添加类名后缀
 | ||
|      * @return array
 | ||
|      * 
 | ||
|      * milo 2019-05-08 从TP5.1代码中拿来修改的
 | ||
|      */
 | ||
|     function parseClass($name, $layer)
 | ||
|     {
 | ||
|         if (false !== strpos($name, '\\')) {
 | ||
|             $class  = $name;
 | ||
|         } else {
 | ||
|             if (strpos($name, '/')) {
 | ||
|                 $names = explode('/', $name, 2);
 | ||
|                 $name = $names[1];
 | ||
|             }
 | ||
|             $class = app()->parseClass($layer,$name);
 | ||
|         }
 | ||
|         return $class;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| if (!function_exists('randomStr')) {
 | ||
|     /**
 | ||
|      * 获取随机字符串
 | ||
|      * @param int $type 0:数字(默认);1:全部;2:小写字母;3:大写字母;4:字母;
 | ||
|      * @param int $len 字符串长度
 | ||
|      * @return string
 | ||
|      */
 | ||
|     function randomStr($type = 0,$len = 5)
 | ||
|     {
 | ||
|         $strPol = "0123456789";
 | ||
|         if($type == 1) {
 | ||
|             $strPol = "ABCDEFGHIJKLMOPQRSTUVWYZ0123456789abcdefghijklmopqrstuvwyz";
 | ||
|         } elseif ($type == 2) {
 | ||
|             $strPol = "abcdefghijklmopqrstuvwyz";
 | ||
|         } elseif ($type == 3) {
 | ||
|             $strPol = "ABCDEFGHIJKLMOPQRSTUVWYZ";
 | ||
|         } elseif ($type == 4) {
 | ||
|             $strPol = "ABCDEFGHIJKLMOPQRSTUVWYZabcdefghijklmopqrstuvwyz";
 | ||
|         }
 | ||
|         $max = strlen($strPol) - 1;
 | ||
|         $str = '';
 | ||
|         for ($i=0;$i<$len;$i++) {
 | ||
|             $str .= $strPol[rand(0,$max)];
 | ||
|         }
 | ||
|         return $str;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| if(!function_exists('isMobile')){
 | ||
|     //判断访问终端是否为移动端
 | ||
|     function isMobile()
 | ||
|     {  
 | ||
|         // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
 | ||
|         if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
 | ||
|             return true;
 | ||
|         }
 | ||
|         // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
 | ||
|         if (isset($_SERVER['HTTP_VIA'])) { 
 | ||
|             // 找不到为flase,否则为true
 | ||
|             return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
 | ||
|         } 
 | ||
|         // 脑残法,判断手机发送的客户端标志,兼容性有待提高。其中'MicroMessenger'是电脑微信
 | ||
|         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','MicroMessenger']; 
 | ||
|             // 从HTTP_USER_AGENT中查找手机浏览器的关键字
 | ||
|             if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
 | ||
|                 return true;
 | ||
|             }
 | ||
|         } 
 | ||
|         // 协议法,因为有可能不准确,放到最后判断
 | ||
|         if (isset ($_SERVER['HTTP_ACCEPT'])) { 
 | ||
|             // 如果只支持wml并且不支持html那一定是移动设备
 | ||
|             // 如果支持wml和html但是wml在html之前则是移动设备
 | ||
|             if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
 | ||
|                 return true;
 | ||
|             } 
 | ||
|         } 
 | ||
|         return false;
 | ||
|     }
 | ||
| }
 | ||
| //根据栏目获取路径
 | ||
| if(!function_exists('getUri')){
 | ||
|     function getUri($cate)
 | ||
|     {
 | ||
|         $url = '';
 | ||
|         if(!empty($cate)){
 | ||
|             if($cate['is_index']){
 | ||
|                 $url = '/';
 | ||
|             }elseif(!empty($cate['url'])){
 | ||
|                 $url = $cate['url'];
 | ||
|             }else{
 | ||
|                 $url = url($cate['template'].'/index', ['category_id' => $cate['id']]);
 | ||
|             }
 | ||
|         }
 | ||
|         return $url;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //根据文件大小转换为文字
 | ||
| if(!function_exists('sizeToStr')){
 | ||
|     function sizeToStr($size)
 | ||
|     {
 | ||
|         if(!is_numeric($size) || $size <= 0){
 | ||
|             return '';
 | ||
|         }
 | ||
|         $size = $size / 1024;
 | ||
|         if($size < 1024){
 | ||
|             return sprintf("%.2fK", $size);
 | ||
|         }
 | ||
|         $size = $size / 1024;
 | ||
|         if($size < 1024){
 | ||
|             return sprintf("%.2fM", $size);
 | ||
|         }
 | ||
|         $size = $size / 1024;
 | ||
|         return sprintf("%.2fG", $size);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //根据路径获取文件名
 | ||
| if(!function_exists('getKeyByPath')){
 | ||
|     function getKeyByPath($path)
 | ||
|     {
 | ||
|         return substr($path, strrpos($path, '/')+1);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //富文本中提取图片路径
 | ||
| if(!function_exists('getImageUrlFromText')){
 | ||
|     function getImageUrlFromText($content)
 | ||
|     {
 | ||
|         preg_match_all('/<img.*?src="(.*?)".*?>/is', $content, $imgs);
 | ||
|         $data = [];
 | ||
|         if(!empty($imgs) && !empty($imgs[1])){
 | ||
|             foreach($imgs[1] as $img){
 | ||
|                 if(substr($img, 0, 4) != 'http'){
 | ||
|                     $key = getKeyByPath($img);
 | ||
|                     $data[$key] = $img;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         return $data;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //富文本中提取视频路径
 | ||
| if(!function_exists('getVideoUrlFromText')){
 | ||
|     function getVideoUrlFromText($content)
 | ||
|     {
 | ||
|         preg_match_all('/<video.*?src="(.*?)".*?>/is', $content, $videos);
 | ||
|         $data = [];
 | ||
|         if(!empty($videos) && !empty($videos[1])){
 | ||
|             foreach($videos[1] as $video){
 | ||
|                 if(substr($video, 0, 4) != 'http'){
 | ||
|                     $key = getKeyByPath($video);
 | ||
|                     $data[$key] = $video;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         return $data;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //获取目录下的所有文件
 | ||
| if(!function_exists('getAllFilesByPath')){
 | ||
|     function getAllFilesByPath($path, $rootPath)
 | ||
|     {
 | ||
|         if(is_dir($path) && file_exists($path)){
 | ||
|             $items = scandir($path);
 | ||
|             $files = [];
 | ||
|             foreach($items as $item){
 | ||
|                 if(substr($item, 0, 1) != '.' && strpos($item, '_') == false){
 | ||
|                     $itemPath = $path . '/' . $item;
 | ||
|                     if(is_file($itemPath)){
 | ||
|                         $size = filesize($itemPath);
 | ||
|                         $files[$item] = [
 | ||
|                             'path' => str_replace($rootPath, '/', $itemPath),
 | ||
|                             'realPath' => $itemPath,
 | ||
|                             'size' => $size,
 | ||
|                             'sizeStr' => sizeToStr($size),
 | ||
|                             'suffix' => strtolower(substr($item, strrpos($item, '.')+1))    //后缀
 | ||
|                         ];
 | ||
|                     }elseif(is_dir($itemPath)){
 | ||
|                         $childFiles = getAllFilesByPath($itemPath, $rootPath);
 | ||
|                         if(!empty($childFiles)){
 | ||
|                             $files = array_merge($files, $childFiles);
 | ||
|                         }else{
 | ||
|                             rmdir($itemPath);
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             return $files;
 | ||
|         }
 | ||
|         return [];
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //过滤get输入
 | ||
| if(!function_exists('getFilter')){
 | ||
|     function getFilter($value){
 | ||
|         $getFilter = "'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
 | ||
|         $forArray = false;
 | ||
|         if(is_array($value)){
 | ||
|             $forFilter = implode($value);
 | ||
|             $forArray = true;
 | ||
|         }else{
 | ||
|             $forFilter = $value;
 | ||
|         }
 | ||
|         if (preg_match("/".$getFilter."/is", $forFilter) == 1){
 | ||
|             $value = $forArray ? [] : '';
 | ||
|         }
 | ||
|         return filterExp($value);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //过滤post录入
 | ||
| if(!function_exists($postFilter)){
 | ||
|     function postFilter($value){
 | ||
|         $postFilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
 | ||
|         $forArray = false;
 | ||
|         if(is_array($value)){
 | ||
|             $forFilter = implode($value);
 | ||
|             $forArray = true;
 | ||
|         }else{
 | ||
|             $forFilter = $value;
 | ||
|         }
 | ||
|         if (preg_match("/".$postFilter."/is", $forFilter) == 1){
 | ||
|             $value = $forArray ? [] : '';
 | ||
|         }
 | ||
|         return filterExp($value);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //过滤cookie数据
 | ||
| if(!function_exists('cookieFilter')){
 | ||
|     function cookieFilter($value){
 | ||
|         $cookieFilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
 | ||
|         $forArray = false;
 | ||
|         if(is_array($value)){
 | ||
|             $forFilter = implode($value);
 | ||
|             $forArray = true;
 | ||
|         }else{
 | ||
|             $forFilter = $value;
 | ||
|         }
 | ||
|         if (preg_match("/".$cookieFilter."/is", $forFilter) == 1){
 | ||
|             $value = $forArray ? [] : '';
 | ||
|         }
 | ||
|         return filterExp($value);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| if(!function_exists('filterExp')){
 | ||
|     function filterExp($value){
 | ||
|         $filter = '/^EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN$/i';
 | ||
|         $forArray = false;
 | ||
|         if(is_array($value)){
 | ||
|             $forFilter = implode($value);
 | ||
|             $forArray = true;
 | ||
|         }else{
 | ||
|             $forFilter = $value;
 | ||
|         }
 | ||
|         if (preg_match($filter, $forFilter) == 1){
 | ||
|             $value = $forArray ? [] : '';
 | ||
|         }
 | ||
|         return $value;
 | ||
|     }
 | ||
| }
 | ||
| if(!function_exists('arrayHtmlFilter')){
 | ||
|     function arrayHtmlFilter($arr) {
 | ||
|         foreach ($arr as $k => $one) {
 | ||
|             if(is_array($one)) {
 | ||
|                 $arr[$k] = arrayHtmlFilter($one);
 | ||
|             } else {
 | ||
|                 $one = trim($one);
 | ||
|                 $arr[$k] = strip_tags($one);
 | ||
|             }
 | ||
|         }
 | ||
|         return $arr;
 | ||
|     }
 | ||
| } |