& false === strpos($class, '/')) { return alias_import($class); } if (isset($_file[$class . $baseUrl])) return true; else $_file[$class . $baseUrl] = true; $class_strut = explode('/', $class); if (empty($baseUrl)) { if ('@' == $class_strut[0] || APP_NAME == $class_strut[0]) { $baseUrl = dirname(LIB_PATH); $class = substr_replace($class, basename(LIB_PATH).'/', 0, strlen($class_strut[0]) + 1); }elseif ('think' == strtolower($class_strut[0])){ $baseUrl = CORE_PATH; $class = substr($class,6); }elseif (in_array(strtolower($class_strut[0]), array('org', 'com'))) { $baseUrl = LIBRARY_PATH; }else { $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1); $baseUrl = APP_PATH . '../' . $class_strut[0] . '/'.basename(LIB_PATH).'/'; } } if (substr($baseUrl, -1) != '/') $baseUrl .= '/'; $classfile = $baseUrl . $class . $ext; if (!class_exists(basename($class),false)) { return require_cache($classfile); } } function load($name, $baseUrl='', $ext='.php') { $name = str_replace(array('.', '#'), array('/', '.'), $name); if (empty($baseUrl)) { if (0 === strpos($name, '@/')) { $baseUrl = COMMON_PATH; $name = substr($name, 2); } else { $baseUrl = EXTEND_PATH . 'Function/'; } } if (substr($baseUrl, -1) != '/') $baseUrl .= '/'; require_cache($baseUrl . $name . $ext); } function vendor($class, $baseUrl = '', $ext='.php') { if (empty($baseUrl)) $baseUrl = VENDOR_PATH; return import($class, $baseUrl, $ext); } function alias_import($alias, $classfile='') { static $_alias = array(); if (is_string($alias)) { if(isset($_alias[$alias])) { return require_cache($_alias[$alias]); }elseif ('' !== $classfile) { $_alias[$alias] = $classfile; return; } }elseif (is_array($alias)) { $_alias = array_merge($_alias,$alias); return; } return false; } function D($name='') { if(empty($name)) return new Model; static $_model = array(); if(isset($_model[$name])) return $_model[$name]; if(strpos($name,'://')) { $name = str_replace('://','/Model/',$name); }else{ $name = C('DEFAULT_APP').'/Model/'.$name; } import($name.'Model'); $class = basename($name.'Model'); if(class_exists($class)) { $model = new $class(); }else { $model = new Model(basename($name)); } $_model[$name] = $model; return $model; } function M($name='', $tablePrefix='',$connection='') { static $_model = array(); if(strpos($name,':')) { list($class,$name) = explode(':',$name); }else{ $class = 'Model'; } if (!isset($_model[$name . '_' . $class])) $_model[$name . '_' . $class] = new $class($name,$tablePrefix,$connection); return $_model[$name . '_' . $class]; } function A($name) { static $_action = array(); if(isset($_action[$name])) return $_action[$name]; if(strpos($name,'://')) { $name = str_replace('://','/Action/',$name); }else{ $name = '@/Action/'.$name; } import($name.'Action'); $class = basename($name.'Action'); if(class_exists($class,false)) { $action = new $class(); $_action[$name] = $action; return $action; }else { return false; } } function R($url,$vars=array()) { $info = pathinfo($url); $action = $info['basename']; $module = $info['dirname']; $class = A($module); if($class) return call_user_func_array(array(&$class,$action),$vars); else return false; } function L($name=null, $value=null) { static $_lang = array(); if (empty($name)) return $_lang; if (is_string($name)) { $name = strtoupper($name); if (is_null($value)) return isset($_lang[$name]) ? $_lang[$name] : $name; $_lang[$name] = $value; return; } if (is_array($name)) $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER)); return; } function C($name=null, $value=null) { static $_config = array(); if (empty($name)) return $_config; if (is_string($name)) { if (!strpos($name, '.')) { $name = strtolower($name); if (is_null($value)) return isset($_config[$name]) ? $_config[$name] : null; $_config[$name] = $value; return; } $name = explode('.', $name); $name[0] = strtolower($name[0]); if (is_null($value)) return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null; $_config[$name[0]][$name[1]] = $value; return; } if (is_array($name)){ return $_config = array_merge($_config, array_change_key_case($name)); } return null; } function tag($tag, &$params=NULL) { $extends = C('extends.' . $tag); $tags = C('tags.' . $tag); if (!empty($tags)) { if(empty($tags['_overlay']) && !empty($extends)) { $tags = array_unique(array_merge($extends,$tags)); }elseif(isset($tags['_overlay'])){ unset($tags['_overlay']); } }elseif(!empty($extends)) { $tags = $extends; } if($tags) { if(APP_DEBUG) { G($tag.'Start'); Log::record('Tag[ '.$tag.' ] --START--',Log::INFO); } foreach ($tags as $key=>$name) { if(!is_int($key)) { $name = $key; } B($name, $params); } if(APP_DEBUG) { Log::record('Tag[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]',Log::INFO); } }else{ return false; } } function add_tag_behavior($tag,$behavior,$path='') { $array = C('tags.'.$tag); if(!$array) { $array = array(); } if($path) { $array[$behavior] = $path; }else{ $array[] = $behavior; } C('tags.'.$tag,$array); } function filter($name, &$content) { $class = $name . 'Filter'; require_cache(LIB_PATH . 'Filter/' . $class . '.class.php'); $filter = new $class(); $content = $filter->run($content); } function B($name, &$params=NULL) { $class = $name.'Behavior'; G('behaviorStart'); $behavior = new $class(); $behavior->run($params); if(APP_DEBUG) { G('behaviorEnd'); Log::record('Run '.$name.' Behavior [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]',Log::INFO); } } function W($name, $data=array(), $return=false) { $class = $name . 'Widget'; require_cache(LIB_PATH . 'Widget/' . $class . '.class.php'); if (!class_exists($class)) throw_exception(L('_CLASS_NOT_EXIST_') . ':' . $class); $widget = Think::instance($class); $content = $widget->render($data); if ($return) return $content; else echo $content; } function strip_whitespace($content) { $stripStr = ''; $tokens = token_get_all($content); $last_space = false; for ($i = 0, $j = count($tokens); $i < $j; $i++) { if (is_string($tokens[$i])) { $last_space = false; $stripStr .= $tokens[$i]; } else { switch ($tokens[$i][0]) { case T_COMMENT: case T_DOC_COMMENT: break; case T_WHITESPACE: if (!$last_space) { $stripStr .= ' '; $last_space = true; } break; case T_START_HEREDOC: $stripStr .= "<<__toString()); } static public function appError($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_ERROR: case E_USER_ERROR: $errorStr = "[$errno] $errstr ".basename($errfile)." 第 $errline 行."; if(C('LOG_RECORD')) Log::write($errorStr,Log::ERR); halt($errorStr); break; case E_STRICT: case E_USER_WARNING: case E_USER_NOTICE: default: $errorStr = "[$errno] $errstr ".basename($errfile)." 第 $errline 行."; Log::record($errorStr,Log::NOTICE); break; } } public function __set($name ,$value) { if(property_exists($this,$name)) $this->$name = $value; } public function __get($name) { return isset($this->$name)?$this->$name:null; } } class ThinkException extends Exception { private $type; private $extra; public function __construct($message,$code=0,$extra=false) { parent::__construct($message,$code); $this->type = get_class($this); $this->extra = $extra; } public function __toString() { $trace = $this->getTrace(); if($this->extra) array_shift($trace); $this->class = $trace[0]['class']; $this->function = $trace[0]['function']; $this->file = $trace[0]['file']; $this->line = $trace[0]['line']; $file = file($this->file); $traceInfo=''; $time = date('y-m-d H:i:m'); foreach($trace as $t) { $traceInfo .= '['.$time.'] '.$t['file'].' ('.$t['line'].') '; $traceInfo .= $t['class'].$t['type'].$t['function'].'('; $traceInfo .= implode(', ', $t['args']); $traceInfo .=")\n"; } $error['message'] = $this->message; $error['type'] = $this->type; $error['detail'] = L('_MODULE_').'['.MODULE_NAME.'] '.L('_ACTION_').'['.ACTION_NAME.']'."\n"; $error['detail'] .= ($this->line-2).': '.$file[$this->line-3]; $error['detail'] .= ($this->line-1).': '.$file[$this->line-2]; $error['detail'] .= ''.($this->line).': '.$file[$this->line-1].''; $error['detail'] .= ($this->line+1).': '.$file[$this->line]; $error['detail'] .= ($this->line+2).': '.$file[$this->line+1]; $error['class'] = $this->class; $error['function'] = $this->function; $error['file'] = $this->file; $error['line'] = $this->line; $error['trace'] = $traceInfo; if(C('LOG_EXCEPTION_RECORD')) { Log::Write('('.$this->type.') '.$this->message); } return $error ; } } abstract class Behavior { protected $options = array(); public function __construct() { if(!empty($this->options)) { foreach ($this->options as $name=>$val){ if(NULL !== C($name)) { $this->options[$name] = C($name); }else{ C($name,$val); } } array_change_key_case($this->options); } } public function __get($name){ return $this->options[strtolower($name)]; } abstract public function run(&$params); } class ReadHtmlCacheBehavior extends Behavior { protected $options = array( 'HTML_CACHE_ON'=>false, 'HTML_CACHE_TIME'=>60, 'HTML_CACHE_RULES'=>array(), 'HTML_FILE_SUFFIX'=>'.html', ); public function run(&$params){ if(C('HTML_CACHE_ON')) { if(($cacheTime = $this->requireHtmlCache()) && $this->checkHTMLCache(HTML_FILE_NAME,$cacheTime)) { readfile(HTML_FILE_NAME); exit(); } } } static private function requireHtmlCache() { $htmls = C('HTML_CACHE_RULES'); if(!empty($htmls)) { $moduleName = strtolower(MODULE_NAME); if(isset($htmls[$moduleName.':'.ACTION_NAME])) { $html = $htmls[$moduleName.':'.ACTION_NAME]; }elseif(isset($htmls[$moduleName.':'])){ $html = $htmls[$moduleName.':']; }elseif(isset($htmls[ACTION_NAME])){ $html = $htmls[ACTION_NAME]; }elseif(isset($htmls['*'])){ $html = $htmls['*']; }elseif(isset($htmls['empty:index']) && !class_exists(MODULE_NAME.'Action')){ $html = $htmls['empty:index']; }elseif(isset($htmls[$moduleName.':_empty']) && $this->isEmptyAction(MODULE_NAME,ACTION_NAME)){ $html = $htmls[$moduleName.':_empty']; } if(!empty($html)) { $rule = $html[0]; $rule = preg_replace('/{\$(_\w+)\.(\w+)\|(\w+)}/e',"\\3(\$\\1['\\2'])",$rule); $rule = preg_replace('/{\$(_\w+)\.(\w+)}/e',"\$\\1['\\2']",$rule); $rule = preg_replace('/{(\w+)\|(\w+)}/e',"\\2(\$_GET['\\1'])",$rule); $rule = preg_replace('/{(\w+)}/e',"\$_GET['\\1']",$rule); $rule = str_ireplace( array('{:app}','{:module}','{:action}','{:group}'), array(APP_NAME,MODULE_NAME,ACTION_NAME,defined('GROUP_NAME')?GROUP_NAME:''), $rule); $rule = preg_replace('/{|(\w+)}/e',"\\1()",$rule); if(!empty($html[2])) $rule = $html[2]($rule); $cacheTime = isset($html[1])?$html[1]:C('HTML_CACHE_TIME'); define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX')); return $cacheTime; } } return false; } static public function checkHTMLCache($cacheFile='',$cacheTime='') { if(!is_file($cacheFile)){ return false; }elseif (filemtime(C('TEMPLATE_NAME')) > filemtime($cacheFile)) { return false; }elseif(!is_numeric($cacheTime) && function_exists($cacheTime)){ return $cacheTime($cacheFile); }elseif ($cacheTime != 0 && time() > filemtime($cacheFile)+$cacheTime) { return false; } return true; } static private function isEmptyAction($module,$action) { $className = $module.'Action'; $class=new $className; return !method_exists($class,$action); } } class CheckRouteBehavior extends Behavior { protected $options = array( 'URL_ROUTER_ON' => false, 'URL_ROUTE_RULES' => array(), ); public function run(&$return){ $regx = trim($_SERVER['PATH_INFO'],'/'); if(empty($regx)) return $return = true; if(!C('URL_ROUTER_ON')) return $return = false; $routes = C('URL_ROUTE_RULES'); if(!empty($routes)) { $Group_name = substr($_SERVER['PATH_INFO'],1,5); $depr = ($Group_name =='Admin'||strpos(C('MOBILE_URL'),$_SERVER['HTTP_HOST'])!==false)?C('URL_PATHINFO_DEPR_ADMIN'):C('URL_PATHINFO_DEPR'); $regx = str_replace($depr,'/',$regx); foreach ($routes as $rule=>$route){ if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { return $return = $this->parseRegex($matches,$route,$regx); }else{ $len1= substr_count($regx,'/'); $len2 = substr_count($rule,'/'); if($len1>=$len2) { if('$' == substr($rule,-1,1)) { if($len1 != $len2) { continue; }else{ $rule = substr($rule,0,-1); } } $match = $this->checkUrlMatch($regx,$rule); if($match) return $return = $this->parseRule($rule,$route,$regx); } } } } $return = false; } private function checkUrlMatch($regx,$rule) { $m1 = explode('/',$regx); $m2 = explode('/',$rule); $match = true; foreach ($m2 as $key=>$val){ if(':' == substr($val,0,1)) { if(strpos($val,'\\')) { $type = substr($val,-1); if('d'==$type && !is_numeric($m1[$key])) { $match = false; break; } }elseif(strpos($val,'^')){ $array = explode('|',substr(strstr($val,'^'),1)); if(in_array($m1[$key],$array)) { $match = false; break; } } }elseif(0 !== strcasecmp($val,$m1[$key])){ $match = false; break; } } return $match; } private function parseUrl($url) { $var = array(); if(false !== strpos($url,'?')) { $info = parse_url($url); $path = explode('/',$info['path']); parse_str($info['query'],$var); }elseif(strpos($url,'/')){ $path = explode('/',$url); }else{ parse_str($url,$var); } if(isset($path)) { $var[C('VAR_ACTION')] = array_pop($path); if(!empty($path)) { $var[C('VAR_MODULE')] = array_pop($path); } if(!empty($path)) { $var[C('VAR_GROUP')] = array_pop($path); } } return $var; } private function parseRule($rule,$route,$regx) { $url = is_array($route)?$route[0]:$route; $paths = explode('/',$regx); $matches = array(); $rule = explode('/',$rule); foreach ($rule as $item){ if(0===strpos($item,':')) { if($pos = strpos($item,'^') ) { $var = substr($item,1,$pos-1); }elseif(strpos($item,'\\')){ $var = substr($item,1,-2); }else{ $var = substr($item,1); } $matches[$var] = array_shift($paths); }else{ array_shift($paths); } } if(0=== strpos($url,'/') || 0===strpos($url,'http')) { if(strpos($url,':')) { $values = array_values($matches); $url = preg_replace('/:(\d)/e','$values[\\1-1]',$url); } header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301); exit; }else{ $var = $this->parseUrl($url); $values = array_values($matches); foreach ($var as $key=>$val){ if(0===strpos($val,':')) { $var[$key] = $values[substr($val,1)-1]; } } $var = array_merge($matches,$var); if($paths) { preg_replace('@(\w+)\/([^,\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/',$paths)); } if(is_array($route) && isset($route[1])) { parse_str($route[1],$params); $var = array_merge($var,$params); } $_GET = array_merge($var,$_GET); } return true; } private function parseRegex($matches,$route,$regx) { $url = is_array($route)?$route[0]:$route; $url = preg_replace('/:(\d)/e','$matches[\\1]',$url); if(0=== strpos($url,'/') || 0===strpos($url,'http')) { header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301); exit; }else{ $var = $this->parseUrl($url); $regx = substr_replace($regx,'',0,strlen($matches[0])); if($regx) { preg_replace('@(\w+)\/([^,\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', $regx); } if(is_array($route) && isset($route[1])) { parse_str($route[1],$params); $var = array_merge($var,$params); } $_GET = array_merge($var,$_GET); } return true; } } class LocationTemplateBehavior extends Behavior { public function run(&$templateFile){ if(!file_exists_case($templateFile)) $templateFile = $this->parseTemplateFile($templateFile); } private function parseTemplateFile($templateFile) { if(''==$templateFile) { $templateFile = C('TEMPLATE_NAME'); }elseif(false === strpos($templateFile,C('TMPL_TEMPLATE_SUFFIX'))){ $path = explode(':',$templateFile); $action = array_pop($path); $module = !empty($path)?array_pop($path):MODULE_NAME; if(!empty($path)) { $path = dirname(THEME_PATH).'/'.array_pop($path).'/'; }else{ $path = THEME_PATH; } $depr = defined('GROUP_NAME')?C('TMPL_FILE_DEPR'):'/'; $templateFile = $path.$module.$depr.$action.C('TMPL_TEMPLATE_SUFFIX'); } if(!file_exists_case($templateFile)) throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$templateFile.']'); return $templateFile; } } class ParseTemplateBehavior extends Behavior { protected $options = array( 'TMPL_ENGINE_TYPE' => 'Think', 'TMPL_CACHFILE_SUFFIX' => '.php', 'TMPL_DENY_FUNC_LIST' => 'echo,exit', 'TMPL_DENY_PHP' =>false, 'TMPL_L_DELIM' => '{', 'TMPL_R_DELIM' => '}', 'TMPL_VAR_IDENTIFY' => 'array', 'TMPL_STRIP_SPACE' => true, 'TMPL_CACHE_ON' => true, 'TMPL_CACHE_TIME' => 0, 'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', 'LAYOUT_ON' => false, 'LAYOUT_NAME' => 'layout', 'TAGLIB_BEGIN' => '<', 'TAGLIB_END' => '>', 'TAGLIB_LOAD' => true, 'TAGLIB_BUILD_IN' => 'cx', 'TAGLIB_PRE_LOAD' => '', ); public function run(&$_data){ $engine = strtolower(C('TMPL_ENGINE_TYPE')); if('think'==$engine){ if($this->checkCache($_data['file'])) { extract($_data['var'], EXTR_OVERWRITE); include C('CACHE_PATH').md5($_data['file']).C('TMPL_CACHFILE_SUFFIX'); }else{ $tpl = Think::instance('ThinkTemplate'); $tpl->fetch($_data['file'],$_data['var']); } }else{ $class = 'Template'.ucwords($engine); if(is_file(CORE_PATH.'Driver/Template/'.$class.'.class.php')) { $path = CORE_PATH; }else{ $path = EXTEND_PATH; } if(require_cache($path.'Driver/Template/'.$class.'.class.php')) { $tpl = new $class; $tpl->fetch($_data['file'],$_data['var']); }else { throw_exception(L('_NOT_SUPPERT_').': ' . $class); } } } protected function checkCache($tmplTemplateFile) { if (!C('TMPL_CACHE_ON')) return false; $tmplCacheFile = C('CACHE_PATH').md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX'); if(!is_file($tmplCacheFile)){ return false; }elseif (filemtime($tmplTemplateFile) > filemtime($tmplCacheFile)) { return false; }elseif (C('TMPL_CACHE_TIME') != 0 && time() > filemtime($tmplCacheFile)+C('TMPL_CACHE_TIME')) { return false; } if(C('LAYOUT_ON')) { $layoutFile = THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX'); if(filemtime($layoutFile) > filemtime($tmplCacheFile)) { return false; } } return true; } } class ContentReplaceBehavior extends Behavior { protected $options = array( 'TMPL_PARSE_STRING'=>array(), ); public function run(&$content){ $content = $this->templateContentReplace($content); } protected function templateContentReplace($content) { $replace = array( '__TMPL__' => APP_TMPL_PATH, '__ROOT__' => __ROOT__, '__APP__' => __APP__, '__GROUP__' => defined('GROUP_NAME')?__GROUP__:__APP__, '__ACTION__' => __ACTION__, '__SELF__' => __SELF__, '__URL__' => __URL__, '../Public' => APP_TMPL_PATH.'Public', '__PUBLIC__' => __ROOT__.'/Public', '__MODULE__' => MODULE_NAME, ); if(is_array(Cew_filter',$content); return $content; } } function encrypt($txt, $key = 'abcd9667676effff') { $s = urlencode(base64_encode(xxtea_encrypt($txt, $key))); $s = str_replace('%2F', '%252F', $s); return $s; } function decrypt($txt, $key = 'abcd9667676effff') { $txt = str_replace('%252F', '%2F', $txt); return xxtea_decrypt(base64_decode(urldecode($txt)), $key); } function xxtea_decrypt($str, $key) { if ($str == "") { return ""; } $v = str2long($str, false); $k = str2long($key, false); if (count($k) < 4) { for ($i = count($k); $i < 4; $i++) { $k[$i] = 0; } } $n = count($v) - 1; $z = $v[$n]; $y = $v[0]; $delta = 0x9E3779B9; $q = floor(6 + 52 / ($n + 1)); $sum = int32($q * $delta); while ($sum != 0) { $e = $sum >> 2 & 3; for ($p = $n; $p > 0; $p--) { $z = $v[$p - 1]; $mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)); $y = $v[$p] = int32($v[$p] - $mx); } $z = $v[$n]; $mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)); $y = $v[0] = int32($v[0] - $mx); $sum = int32($sum - $delta); } return long2str($v, true); } function xxtea_encrypt($str, $key) { if ($str == "") { return ""; } $v = str2long($str, true); $k = str2long($key, false); if (count($k) < 4) { for ($i = count($k); $i < 4; $i++) { $k[$i] = 0; } } $n = count($v) - 1; $z = $v[$n]; $y = $v[0]; $delta = 0x9E3779B9; $q = floor(6 + 52 / ($n + 1)); $sum = 0; while (0 < $q--) { $sum = int32($sum + $delta); $e = $sum >> 2 & 3; for ($p = 0; $p < $n; $p++) { $y = $v[$p + 1]; $mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)); $z = $v[$p] = int32($v[$p] + $mx); } $y = $v[0]; $mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)); $z = $v[$n] = int32($v[$n] + $mx); } return long2str($v, false); } function long2str($v, $w) { $len = count($v); $n = ($len - 1) << 2; if ($w) { $m = $v[$len - 1]; if (($m < $n - 3) || ($m > $n)) return false; $n = $m; } $s = array(); for ($i = 0; $i < $len; $i++) { $s[$i] = pack("V", $v[$i]); } if ($w) { return substr(join('', $s), 0, $n); } else { return join('', $s); } } function str2long($s, $w) { $v = unpack("V*", $s. str_repeat("\0", (4 - strlen($s) % 4) & 3)); $v = array_values($v); if ($w) { $v[count($v)] = strlen($s); } return $v; } function int32($n) { while ($n >= 2147483648) $n -= 4294967296; while ($n <= -2147483649) $n += 4294967296; return (int)$n; } function getweek($time) { $week = Date('w', strtotime($time)); $array = array( '0' => '日','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六', ); return '星期'.$array[$week]; } function getPosition($pos){ $res = $pos < 10 ? '00'.$pos : ($pos < 100 ? '0'.$pos : $pos); return $res; } function getReadLog() { import ( '@.ORG.Cookie' ); $list = unserialize(Cookie::get('readlog')); foreach($list as &$v){ $t = time() - $v['t']; if( $t < 60 ) { $v['t'] = $t.'秒'; }elseif( $t < 3600 ) { $v['t'] = intval($t/60).'分鐘'; }elseif($t < 86400 ) { $v['t'] = intval($t/3600).'小時'; }elseif($t < 86400*10){ $v['t'] = intval($t/86400).'天'; }else{ $v['t'] = '很久'; } } return $list; } function auto_charset($fContents,$from='',$to=''){ if(empty($from)) $from = C('TEMPLATE_CHARSET'); if(empty($to)) $to = C('OUTPUT_CHARSET'); $from = strtoupper($from)=='UTF8'? 'utf-8':$from; $to = strtoupper($to)=='UTF8'? 'utf-8':$to; if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){ return $fContents; } if(is_string($fContents) ) { if(function_exists('mb_convert_encoding')){ return mb_convert_encoding ($fContents, $to, $from); }elseif(function_exists('iconv')){ return iconv($from,$to,$fContents); }else{ halt(L('_NO_AUTO_CHARSET_')); return $fContents; } } elseif(is_array($fContents)){ foreach ( $fContents as $key => $val ) { $_key = auto_charset($key,$from,$to); $fContents[$_key] = auto_charset($val,$from,$to); if($key != $_key ) { unset($fContents[$key]); } } return $fContents; } elseif(is_object($fContents)) { $vars = get_object_vars($fContents); foreach($vars as $key=>$val) { $fContents->$key = auto_charset($val,$from,$to); } return $fContents; } else{ return $fContents; } } function getExpireTime($time){ $now = time(); if( $time < $now ) { return '已無效'; } return floor(($time - $now)/86400).'天'; } function getShareStatus($status){ $status == 1 ? $status = '未審核' : ( $status == 0 ? $status = '審核通過' : $status = '審核不通過'); return $status; } function getRegion($id) { $arr = C('REGION'); return $arr[$id]; } function getstatus($status){ $status == 1 ? $status = '連載' : $status = '完結'; return $status; } function getStuat($stuat) { $stuat == 1 ? $res = '未審核' : ( $stuat == 2 ? $res = '審核不通過' : $res = '已審核'); return $res; } function getUserName($uid){ if( !$uid ) { return ''; } $user = D('member')->field('username')->where("uid=$uid")->find(); return $user['username']; } function getComicName($id){ if( !$id ) { return ''; } $comic = D('comic')->field('name')->where("id=$id")->find(); return $comic['name']; } function getSeriesName($id){ if( !$id ) { return ''; } $series = D('comicSeries')->field('name')->where("id=$id")->find(); return $series['name']; } function delStr($str) { return str_replace(array('(',')'),array('',''),$str); } function getzhname($name){ if( !$name ) { return ''; } $preg="/[^\x{4e00}-\x{9fa5}a-zA-Z\d]/iuU"; while(preg_match($preg,$name)){ $name=preg_replace($preg,'',$name); } return $name; } function SendMail($username,$address,$title,$message) { require_once (APP_PATH."Common/class.phpmailer.php"); require_once (APP_PATH."Common/class.smtp.php"); $mail=new PHPMailer(); $mail->IsSMTP(); $mail->IsHTML(TRUE); $mail->CharSet='UTF-8'; $mail->AddAddress($address, $username); $mail->Body=$message; $mail->From=C('MAIL_ADDRESS'); $mail->FromName=C('MAIL_FROM_NAME'); $mail->Subject=$title; $mail->Host=C('MAIL_SMTP'); $mail->SMTPAuth=true; $mail->Username=C('MAIL_LOGINNAME'); $mail->Password=C('MAIL_PASSWORD'); return($mail->Send()); } function isToday($time) { if( $time >= strtotime(Date('Y-m-d')) ) { return 'today'; }else{ return ''; } } function getReadLevel($lv, $next = false){ if( $next ) { $lv += 1; if( $lv < 2 ) { $lv = 2; } } if( $lv > 6 ){ $lv = 6; } $array = array( '1' => '一級', '2' => '二級', '3' => '三級', '4' => '四級', '5' => '五級', '6' => '六級', ); return $array[$lv] ? $array[$lv] : '一級'; } function getReadReward($lv, $next = false){ if( $next ) { $lv += 1; if( $lv < 2 ) { $lv = 2; } } if( $lv > 6 ){ $lv = 6; } $array = array( '1' => '1.00', '2' => '1.01', '3' => '1.03', '4' => '1.05', '5' => '1.08', '6' => '1.10', ); return $array[$lv] ? $array[$lv] : '1.00'; } function getShareLevel($lv, $next = false){ if( $next ) { $lv += 1; if( $lv < 2 ) { $lv = 2; } } if( $lv > 5 ) { $lv = 5; } $array = array( '1' => '普通漫迷', '2' => '資深漫迷', '3' => '白金漫迷', '4' => '翡翠漫迷', '5' => '鑽石漫迷', ); return $array[$lv] ? $array[$lv] : '普通漫迷'; } function getShareReward($lv, $next = false){ if( $next ) { $lv += 1; if( $lv < 2 ) { $lv = 2; } } if( $lv > 5 ){ $lv = 5; } $array = array( '1' => '2.00', '2' => '2.50', '3' => '3.00', '4' => '3.50', '5' => '4.00', ); return $array[$lv] ? $array[$lv] : '2.00'; } function getPromotionLevel($num){ if( $num < 100 ) { return 1; }elseif( $num < 500 ) { return 2; }elseif( $num < 1000 ) { return 3; }elseif( $num < 2000 ) { return 4; }elseif( $num < 5000 ) { return 5; }elseif( $num < 10000 ) { return 6; }elseif( $num < 25000 ) { return 7; }elseif( $num < 50000 ) { return 8; }elseif( $num < 100000 ) { return 9; }elseif( $num < 200000 ) { return 10; }elseif( $num < 500000 ) { return 11; }else{ return 12; } } function getPromotionRateByLevel($lv, $next = false){ if( $next ) { $lv += 1; if( $lv < 2 ) { $lv = 2; } } if( $lv < 3 ) { return 0; }elseif( $lv < 4 ) { return 0.01; }elseif( $lv < 5 ) { return 0.02; }elseif( $lv < 6 ) { return 0.03; }elseif( $lv < 7 ) { return 0.04; }elseif( $lv < 8 ) { return 0.05; }elseif( $lv < 9 ) { return 0.06; }elseif( $lv < 10 ) { return 0.07; }elseif( $lv < 11 ) { return 0.08; }elseif( $lv < 12 ) { return 0.09; }else{ return 0.1; } } function getPromotionRate($num){ if( $num < 500 ) { return 0; }elseif( $num < 1000 ) { return 0.01; }elseif( $num < 2000 ) { return 0.02; }elseif( $num < 5000 ) { return 0.03; }elseif( $num < 10000 ) { return 0.04; }elseif( $num < 25000 ) { return 0.05; }elseif( $num < 50000 ) { return 0.06; }elseif( $num < 100000 ) { return 0.07; }elseif( $num < 200000 ) { return 0.08; }elseif( $num < 500000 ) { return 0.09; }else{ return 0.1; } } function getMessageInfo($id){ if( !$id ){ return ''; } $msg = D('message')->field('title')->where(array('id'=>$id))->find(); return $msg['title']; } function getMessageTime($id){ if( !$id ){ return ''; } $msg = D('message')->field('addtime')->where(array('id'=>$id))->find(); return Date('Y-m-d H:i', $msg['addtime']); } function is_mobile_ext() { static $is_mobile; if ( isset($is_mobile) ) return $is_mobile; if ( empty($_SERVER['HTTP_USER_AGENT']) ) { $is_mobile = false; } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) { $is_mobile = true; } else { $is_mobile = false; } return $is_mobile; } function getMailGateWay($email){ list($host,$ext) = explode('@', $email); switch(strtolower($ext)){ case 'gmail.com': $gateWay = 'http://gmail.com'; break; default: $gateWay = 'http://mail.'.$ext; break; } return $gateWay; } function getShopName($id){ if( !$id ) { return ''; } $comic = D('shop')->field('name')->where("id=$id")->find(); return $comic['name']; } L(array ( '_MODULE_NOT_EXIST_' => '无法加载模块', '_ERROR_ACTION_' => '非法操作', '_LANGUAGE_NOT_LOAD_' => '无法加载语言包', '_TEMPLATE_NOT_EXIST_' => '模板不存在', '_MODULE_' => '模块', '_ACTION_' => '操作', '_ACTION_NOT_EXIST_' => '控制器不存在或者没有定义', '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义', '_VALID_ACCESS_' => '没有权限', '_XML_TAG_ERROR_' => 'XML标签语法错误', '_DATA_TYPE_INVALID_' => '非法数据对象!', '_OPERATION_WRONG_' => '操作出现错误', '_NOT_LOAD_DB_' => '无法加载数据库', '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库', '_NO_DB_CONFIG_' => '没有定义数据库配置', '_NOT_SUPPERT_' => '系统不支持', '_CACHE_TYPE_INVALID_' => '无法加载缓存类型', '_FILE_NOT_WRITEABLE_' => '目录(文件)不可写', '_METHOD_NOT_EXIST_' => '您所请求的方法不存在!', '_CLASS_NOT_EXIST_' => '实例化一个不存在的类!', '_CLASS_CONFLICT_' => '类名冲突', '_TEMPLATE_ERROR_' => '模板引擎错误', '_CACHE_WRITE_ERROR_' => '缓存文件写入失败!', '_TAGLIB_NOT_EXIST_' => '标签库未定义', '_OPERATION_FAIL_' => '操作失败!', '_OPERATION_SUCCESS_' => '操作成功!', '_SELECT_NOT_EXIST_' => '记录不存在!', '_EXPRESS_ERROR_' => '表达式错误', '_TOKEN_ERROR_' => '表单令牌错误', '_RECORD_HAS_UPDATE_' => '记录已经更新', '_NOT_ALLOW_PHP_' => '模板禁用PHP代码', ));C(array ( 'app_status' => 'debug', 'app_file_case' => false, 'app_autoload_path' => '@.Extend/Common,@.Extend/Lib,', 'app_tags_on' => true, 'app_sub_domain_deploy' => 1, 'app_sub_domain_rules' => array ( 'm' => array ( 0 => 'm/', ), ), 'app_sub_domain_deny' => array ( ), 'app_group_list' => 'Home,Admin,m', 'cookie_expire' => 86400, 'cookie_domain' => '', 'cookie_path' => '/', 'cookie_prefix' => 'mh_', 'default_app' => '@', 'default_lang' => 'zh-cn', 'default_theme' => '', 'default_group' => 'Home', 'default_module' => 'index', 'default_action' => 'index', 'default_charset' => 'utf-8', 'default_timezone' => 'PRC', 'default_ajax_return' => 'JSON', 'default_filter' => 'htmlspecialchars', 'db_type' => 'mysql', 'db_host' => 'localhost', 'db_name' => '', 'db_user' => 'root', 'db_pwd' => '', 'db_port' => '', 'db_prefix' => 'think_', 'db_fieldtype_check' => false, 'db_fields_cache' => true, 'db_charset' => 'utf8', 'db_deploy_type' => 0, 'db_rw_separate' => false, 'db_master_num' => 1, 'db_sql_build_cache' => false, 'db_sql_build_queue' => 'file', 'db_sql_build_length' => 20, 'data_cache_time' => '1800', 'data_cache_compress' => false, 'data_cache_check' => false, 'data_cache_type' => 'Memcache', 'data_cache_path' => '/data/webroot/k886.net/mh/mh/Runtime/Temp/', 'data_cache_subdir' => false, 'data_path_level' => 1, 'error_message' => '您浏览的页面暂时发生了错误!请稍后再试~', 'error_page' => '', 'show_error_msg' => false, 'log_record' => false, 'log_type' => 3, 'log_dest' => '', 'log_extra' => '', 'log_level' => 'EMERG,ALERT,CRIT,ERR', 'log_file_size' => 2097152, 'log_exception_record' => false, 'session_auto_start' => true, 'session_options' => array ( ), 'session_type' => '', 'session_prefix' => '', 'var_session_id' => 'session_id', 'tmpl_content_type' => 'text/html', 'tmpl_action_error' => '/data/webroot/k886.net/mh/ThinkPHP/Tpl/dispatch_jump.tpl', 'tmpl_action_success' => '/data/webroot/k886.net/mh/ThinkPHP/Tpl/dispatch_jump.tpl', 'tmpl_exception_file' => '/data/webroot/k886.net/mh/ThinkPHP/Tpl/think_exception.tpl', 'tmpl_detect_theme' => false, 'tmpl_template_suffix' => '.html', 'tmpl_file_depr' => '/', 'url_case_insensitive' => false, 'url_model' => 2, 'url_pathinfo_depr' => '-', 'url_pathinfo_fetch' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', 'url_html_suffix' => '', 'var_group' => 'g', 'var_module' => 'm', 'var_action' => 'a', 'var_ajax_submit' => 'ajax', 'var_pathinfo' => 's', 'var_url_params' => '_URL_', 'var_template' => 't', 'load_ext_config' => 'db_config', 'url_pathinfo_depr_admin' => '/', 'user_auth_on' => true, 'user_auth_type' => 1, 'user_auth_key' => 'authId', 'admin_auth_key' => 'administrator', 'user_auth_model' => 'User', 'auth_pwd_encoder' => 'md5', 'user_auth_gateway' => '/Admin/Public/login', 'not_auth_module' => 'Public', 'require_auth_module' => '', 'not_auth_action' => '', 'require_auth_action' => '', 'guest_auth_on' => false, 'guest_auth_id' => 0, 'db_like_fields' => 'title|remark', 'rbac_role_table' => 'role', 'rbac_user_table' => 'role_user', 'rbac_access_table' => 'access', 'rbac_node_table' => 'node', 'public_key' => '972b27859503eed43edea25b09264404', 'title' => '漫画在線_漫畫線上看_漫畫連載 - 看漫畫', 'keyword' => '漫画在線,漫畫線上看,漫畫連載,完结漫画,火影忍者漫畫,火影,妖精的 尾巴,航海王,死神,漫畫線上看', 'description' => '看漫畫提供最新更新漫畫,漫畫排行榜,連載漫畫,完結漫畫,日韓漫畫,國產漫畫,歐美漫畫等海量的漫畫資源,支持漫画在線,漫畫線上看,漫畫連載,完结漫画,漫畫線上看等方式,提供火影忍者,妖精的尾巴,海贼王,死神等 漫画的第一时间更新!', 'var_page' => 'page', 'page_rollpage' => 8, 'show_page_trace' => false, 'app_debug' => false, 'mail_address' => 'postmaster@mail.k886.net', 'mail_smtp' => 'smtp.mailgun.org', 'mail_loginname' => 'postmaster@mail.k886.net', 'mail_password' => '72fe6e1b65760a8fd8d531260930fdff', 'mail_from_name' => 'K886看漫畫服務管理員', 'region' => array ( 1 => '日本', 2 => '大陸', 3 => '港台', 4 => '歐美', 5 => '韓國', 6 => '其他', ), 'validate_key' => '972b2785944503eed43edea25b09264404', 'image_url' => 'https://img.k886.net/', 'default_author' => 'k886.net 看漫畫', 'hidden_comic_type' => '', 'hidden_comic_typea' => '27', 'violation_conf' => array ( 1 => array ( 'name' => '上傳侵害漫畫著作權遭原作舉報,沒有正確申報「原文網址」的漫畫', 'credit' => 60, ), 2 => array ( 'name' => '同一篇漫畫自己重複發表多次', 'credit' => 50, ), 3 => array ( 'name' => '上傳無意義,過於簡短、低質內容', 'credit' => 30, ), 4 => array ( 'name' => '推廣漫畫或招攬會員時濫發垃圾訊息、各類廣告,未遵守他站規範', 'credit' => 30, ), 5 => array ( 'name' => '過於血腥和暴力的內容', 'credit' => 20, ), ), 'max_read_log_num' => 5, 'site_name' => '看漫畫', 'copyright' => 'Copyright www.k886.net 看漫畫 All rights reserved', 'site_prefix' => '', 'mobile_url' => 'https://m.k886.net/', 'money_per_read' => 0.025, 'max_per_read' => 1, 'money_per_share' => 0.1, 'max_per_share' => 1, 'money_per_pro' => 0.001, 'max_per_pro' => 1, 'extends' => array ( 'app_init' => array ( ), 'app_begin' => array ( 0 => 'ReadHtmlCache', ), 'route_check' => array ( 0 => 'CheckRoute', ), 'app_end' => array ( ), 'path_info' => array ( ), 'action_begin' => array ( ), 'action_end' => array ( ), 'view_begin' => array ( ), 'view_template' => array ( 0 => 'LocationTemplate', ), 'view_parse' => array ( 0 => 'ParseTemplate', ), 'view_filter' => array ( 0 => 'ContentReplace', 1 => 'TokenBuild', 2 => 'WriteHtmlCache', 3 => 'ShowRuntime', ), 'view_end' => array ( 0 => 'ShowPageTrace', ), ), ));G('loadTime');Think::Start();