diff --git a/Application/Admin/Controller/LoginController.class.php b/Application/Admin/Controller/LoginController.class.php
index 7271ee1..14e3db0 100644
--- a/Application/Admin/Controller/LoginController.class.php
+++ b/Application/Admin/Controller/LoginController.class.php
@@ -77,17 +77,11 @@ class LoginController extends Controller {
if($member->save($data)){
//发送验证码邮件
session('token',$token);
- require "./././././ThinkPHP/Library/Org/Net/Mail.class.php";
- $ip = get_client_ip();
- $time = date("Y-m-d h:i:sa");
- $con='您好,您的后台管理账户 '.$username.' 于 '.$time.' 被尝试登录,登录IP地址为 '.$ip.' 如果该操作非您本人操作,可能帐号信息已经被泄露,请您及时修改密码。 ';
- SendMail($user['email'],'应急响应中心后台登录提示',$con,'应急响应中心');
$this->success("请先完成验证",U('Login/svalid?email=').$user['email']);
}
- //定向之后台主页
-
}
+
//验证码
public function verify(){
ob_clean();
diff --git a/Application/Admin/Controller/PostController.class.php b/Application/Admin/Controller/PostController.class.php
index 87decab..03d9dba 100644
--- a/Application/Admin/Controller/PostController.class.php
+++ b/Application/Admin/Controller/PostController.class.php
@@ -138,9 +138,16 @@ class PostController extends BaseController
{
$member = M('member');
$record = M('record');
+ $post = M('post');
+ $adminId = session('adminId');
+
$user_id = I('get.uid',0,'intval');
$jifen = I('post.jifen',0,'intval');
$jinbi = I('post.jinbi',0,'intval');
+ $pid = I('post.pid',0,'intval');
+ $token = I('post.token');
+
+ //添加积分记录
$data['type'] = 1;
$data['name'] = '增加积分/安全币';
$data['content'] = '+积分:'.$jifen.' +安全币:'.$jinbi;
@@ -148,9 +155,20 @@ class PostController extends BaseController
$user = $member->where('id='.$user_id)-> select();
$data['user'] = $user[0]['username'];
$data['operator'] = session('adminname');
+
+ //单个报告奖励详情
+ $pdata['bounty'] = '+积分:'.$jifen.' +安全币:'.$jinbi;
+
+ $manager = M('manager')-> where(array('id'=>$adminId)) -> find();
+
+ if($token != $manager['token']){
+ $this->error("非法请求");
+ }
+
$result1 = $member->where('id='.$user_id)->setInc('jifen',$jifen);
$result2 = $member->where('id='.$user_id)->setInc('jinbi',$jinbi);
$result3 = $record -> add($data);
+ $result4 = $post->where('id='.$pid) -> field('bounty') -> save($pdata);
if($result1 && $result2){
$this->success("增加积分/安全币成功", U('post/index'));
}else{
@@ -160,7 +178,7 @@ class PostController extends BaseController
/**
* 生成session key
- */
+
public function session(){
$id = I('get.id',0,'intval');
$str = '1234567890';
@@ -176,7 +194,7 @@ class PostController extends BaseController
$this->error("授权失败");
}
}
-
+ */
/**
添加报告评论
diff --git a/Application/Admin/View/Index/index.html b/Application/Admin/View/Index/index.html
index 5ddfaa5..721ad3c 100644
--- a/Application/Admin/View/Index/index.html
+++ b/Application/Admin/View/Index/index.html
@@ -61,7 +61,7 @@
{$v.title}
- {$v.time|date="Y/m/d",###}
+ {$v.update_time|date="Y/m/d",###}
diff --git a/Application/Admin/View/Post/review.html b/Application/Admin/View/Post/review.html
index aace5f4..2d44b1d 100644
--- a/Application/Admin/View/Post/review.html
+++ b/Application/Admin/View/Post/review.html
@@ -1,33 +1,54 @@
-
+
漏洞列表
-ESRCMS-01
+审核报告
-
{$post.title|htmlspecialchars_decode|waf}
+
[SRC-{$post.time|date="Y",###}-{$post.id}] {$post.title|htmlspecialchars_decode|waf}
-
+
-
-
+
+
+
+
报告奖励: {$post.bounty}
+
报告时间: {$post.time|date="Y-m-d H:i:s",###}
+
+
+
报告状态: 审核中
+ 已忽略
+ 已确认
+ 已修复
+
+
漏洞危害: 无影响
+ 低危
+ 中危
+ 高危
+
+
+
+
+
报告内容:
{$post.content|htmlspecialchars_decode|waf}
+
+
来源:外部报告
@@ -36,6 +57,11 @@
+
+
+
-
-
-
-
-
-
Martin
-
核心白帽子
-
-
-发起QQ会话
-
-
-
-
-
-
-
-
-
-
+
diff --git a/Application/Runtime/Cache/Admin/08308a7b2a5d82fe34b60174fa528d71.php b/Application/Runtime/Cache/Admin/08308a7b2a5d82fe34b60174fa528d71.php
new file mode 100644
index 0000000..00e18c0
--- /dev/null
+++ b/Application/Runtime/Cache/Admin/08308a7b2a5d82fe34b60174fa528d71.php
@@ -0,0 +1,1367 @@
+
+
+
+
+
+
跳转提示
+
+
+
+
+
+
+
:)
+
+
+
:(
+
+
+
+
+页面自动 跳转 等待时间:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Application/Runtime/Cache/Admin/32ec6c906c117a7c2bf504769276d87a.php b/Application/Runtime/Cache/Admin/32ec6c906c117a7c2bf504769276d87a.php
new file mode 100644
index 0000000..7efc576
--- /dev/null
+++ b/Application/Runtime/Cache/Admin/32ec6c906c117a7c2bf504769276d87a.php
@@ -0,0 +1,78 @@
+
+
+
+
+
SRCMS - 企业安全应急响应与缺陷管理中心
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Application/Runtime/Cache/Admin/66dc9bed425dcf808e9142606813d78c.php b/Application/Runtime/Cache/Admin/66dc9bed425dcf808e9142606813d78c.php
new file mode 100644
index 0000000..c92c638
--- /dev/null
+++ b/Application/Runtime/Cache/Admin/66dc9bed425dcf808e9142606813d78c.php
@@ -0,0 +1,534 @@
+
+
+
+
关于我们 - 企业安全应急响应与缺陷管理中心
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Application/Runtime/Cache/Admin/b595b808c2ebeeeb0478ffc30bb4e87a.php b/Application/Runtime/Cache/Admin/b595b808c2ebeeeb0478ffc30bb4e87a.php
new file mode 100644
index 0000000..91ca241
--- /dev/null
+++ b/Application/Runtime/Cache/Admin/b595b808c2ebeeeb0478ffc30bb4e87a.php
@@ -0,0 +1,599 @@
+
+
+
+
控制台 - 企业安全应急响应与缺陷管理中心
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Application/Runtime/Cache/Admin/b928d37d637c8c543ee3a821f9b0198a.php b/Application/Runtime/Cache/Admin/b928d37d637c8c543ee3a821f9b0198a.php
new file mode 100644
index 0000000..b0554f3
--- /dev/null
+++ b/Application/Runtime/Cache/Admin/b928d37d637c8c543ee3a821f9b0198a.php
@@ -0,0 +1,94 @@
+
+
+
+SRCMS - 企业安全应急响应与缺陷管理中心
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Application/Runtime/Data/_fields/srcms.manager.php b/Application/Runtime/Data/_fields/srcms.manager.php
new file mode 100644
index 0000000..15927e1
--- /dev/null
+++ b/Application/Runtime/Data/_fields/srcms.manager.php
@@ -0,0 +1 @@
+a:10:{i:0;s:2:"id";i:1;s:8:"username";i:2;s:5:"email";i:3;s:8:"password";i:4;s:5:"token";i:5;s:8:"login_ip";i:6;s:9:"create_at";i:7;s:9:"update_at";s:3:"_pk";s:2:"id";s:5:"_type";a:8:{s:2:"id";s:6:"int(2)";s:8:"username";s:11:"varchar(20)";s:5:"email";s:12:"varchar(100)";s:8:"password";s:11:"varchar(32)";s:5:"token";s:12:"varchar(255)";s:8:"login_ip";s:11:"varchar(20)";s:9:"create_at";s:11:"varchar(11)";s:9:"update_at";s:11:"varchar(11)";}}
\ No newline at end of file
diff --git a/Application/Runtime/Data/_fields/srcms.member.php b/Application/Runtime/Data/_fields/srcms.member.php
index 33ea1a6..ae874fe 100644
--- a/Application/Runtime/Data/_fields/srcms.member.php
+++ b/Application/Runtime/Data/_fields/srcms.member.php
@@ -1 +1 @@
-a:14:{i:0;s:2:"id";i:1;s:8:"username";i:2;s:5:"email";i:3;s:4:"salt";i:4;s:8:"password";i:5;s:6:"avatar";i:6;s:9:"create_at";i:7;s:9:"update_at";i:8;s:8:"login_ip";i:9;s:6:"status";i:10;s:4:"type";i:11;s:5:"jifen";s:3:"_pk";s:2:"id";s:5:"_type";a:12:{s:2:"id";s:7:"int(11)";s:8:"username";s:11:"varchar(20)";s:5:"email";s:12:"varchar(100)";s:4:"salt";s:10:"varchar(9)";s:8:"password";s:11:"varchar(32)";s:6:"avatar";s:12:"varchar(255)";s:9:"create_at";s:11:"varchar(11)";s:9:"update_at";s:11:"varchar(11)";s:8:"login_ip";s:11:"varchar(20)";s:6:"status";s:10:"tinyint(1)";s:4:"type";s:10:"tinyint(1)";s:5:"jifen";s:7:"int(10)";}}
\ No newline at end of file
+a:28:{i:0;s:2:"id";i:1;s:3:"pid";i:2;s:8:"username";i:3;s:8:"realname";i:4;s:4:"team";i:5;s:5:"email";i:6;s:4:"salt";i:7;s:8:"password";i:8;s:5:"token";i:9;s:6:"avatar";i:10;s:7:"address";i:11;s:11:"description";i:12;s:8:"bankcode";i:13;s:6:"idcode";i:14;s:7:"zipcode";i:15;s:6:"alipay";i:16;s:3:"tel";i:17;s:7:"website";i:18;s:8:"qqnumber";i:19;s:9:"create_at";i:20;s:9:"update_at";i:21;s:8:"login_ip";i:22;s:6:"status";i:23;s:4:"type";i:24;s:5:"jifen";i:25;s:5:"jinbi";s:3:"_pk";s:2:"id";s:5:"_type";a:26:{s:2:"id";s:7:"int(11)";s:3:"pid";s:12:"varchar(255)";s:8:"username";s:11:"varchar(20)";s:8:"realname";s:12:"varchar(100)";s:4:"team";s:12:"varchar(255)";s:5:"email";s:12:"varchar(100)";s:4:"salt";s:10:"varchar(9)";s:8:"password";s:11:"varchar(32)";s:5:"token";s:12:"varchar(255)";s:6:"avatar";s:12:"varchar(255)";s:7:"address";s:12:"varchar(255)";s:11:"description";s:12:"varchar(255)";s:8:"bankcode";s:12:"varchar(255)";s:6:"idcode";s:12:"varchar(255)";s:7:"zipcode";s:12:"varchar(255)";s:6:"alipay";s:12:"varchar(255)";s:3:"tel";s:12:"varchar(255)";s:7:"website";s:12:"varchar(255)";s:8:"qqnumber";s:12:"varchar(255)";s:9:"create_at";s:11:"varchar(11)";s:9:"update_at";s:11:"varchar(11)";s:8:"login_ip";s:11:"varchar(20)";s:6:"status";s:10:"tinyint(1)";s:4:"type";s:10:"tinyint(1)";s:5:"jifen";s:7:"int(10)";s:5:"jinbi";s:12:"varchar(255)";}}
\ No newline at end of file
diff --git a/Application/Runtime/Data/_fields/srcms.order.php b/Application/Runtime/Data/_fields/srcms.order.php
new file mode 100644
index 0000000..af6a73c
--- /dev/null
+++ b/Application/Runtime/Data/_fields/srcms.order.php
@@ -0,0 +1 @@
+a:14:{i:0;s:2:"id";i:1;s:6:"userid";i:2;s:8:"username";i:3;s:8:"realname";i:4;s:7:"zipcode";i:5;s:7:"address";i:6;s:3:"tel";i:7;s:6:"alipay";i:8;s:3:"gid";i:9;s:5:"price";i:10;s:11:"update_time";i:11;s:6:"finish";s:3:"_pk";s:2:"id";s:5:"_type";a:12:{s:2:"id";s:7:"int(10)";s:6:"userid";s:12:"varchar(255)";s:8:"username";s:11:"varchar(50)";s:8:"realname";s:11:"varchar(50)";s:7:"zipcode";s:11:"varchar(10)";s:7:"address";s:12:"varchar(100)";s:3:"tel";s:7:"int(15)";s:6:"alipay";s:11:"varchar(50)";s:3:"gid";s:12:"varchar(100)";s:5:"price";s:12:"varchar(255)";s:11:"update_time";s:12:"varchar(255)";s:6:"finish";s:6:"int(2)";}}
\ No newline at end of file
diff --git a/Application/Runtime/Data/_fields/srcms.page.php b/Application/Runtime/Data/_fields/srcms.page.php
new file mode 100644
index 0000000..c737471
--- /dev/null
+++ b/Application/Runtime/Data/_fields/srcms.page.php
@@ -0,0 +1 @@
+a:8:{i:0;s:2:"id";i:1;s:5:"title";i:2;s:4:"name";i:3;s:6:"author";i:4;s:7:"content";i:5;s:11:"update_time";s:3:"_pk";s:2:"id";s:5:"_type";a:6:{s:2:"id";s:7:"int(11)";s:5:"title";s:12:"varchar(100)";s:4:"name";s:12:"varchar(100)";s:6:"author";s:12:"varchar(100)";s:7:"content";s:4:"text";s:11:"update_time";s:12:"varchar(255)";}}
\ No newline at end of file
diff --git a/Application/Runtime/Data/_fields/srcms.post.php b/Application/Runtime/Data/_fields/srcms.post.php
index 632542d..f201e58 100644
--- a/Application/Runtime/Data/_fields/srcms.post.php
+++ b/Application/Runtime/Data/_fields/srcms.post.php
@@ -1 +1 @@
-a:14:{i:0;s:2:"id";i:1;s:7:"session";i:2;s:5:"title";i:3;s:7:"content";i:4;s:6:"advise";i:5;s:4:"time";i:6;s:3:"day";i:7;s:7:"cate_id";i:8;s:7:"user_id";i:9;s:4:"rank";i:10;s:4:"type";i:11;s:7:"visible";s:3:"_pk";s:2:"id";s:5:"_type";a:12:{s:2:"id";s:7:"int(11)";s:7:"session";s:11:"varchar(15)";s:5:"title";s:12:"varchar(255)";s:7:"content";s:4:"text";s:6:"advise";s:12:"varchar(255)";s:4:"time";s:11:"varchar(11)";s:3:"day";s:10:"tinyint(1)";s:7:"cate_id";s:7:"int(11)";s:7:"user_id";s:7:"int(11)";s:4:"rank";s:10:"tinyint(1)";s:4:"type";s:10:"tinyint(1)";s:7:"visible";s:6:"int(2)";}}
\ No newline at end of file
+a:15:{i:0;s:2:"id";i:1;s:7:"session";i:2;s:5:"title";i:3;s:7:"content";i:4;s:6:"advise";i:5;s:4:"time";i:6;s:3:"day";i:7;s:7:"cate_id";i:8;s:7:"user_id";i:9;s:4:"rank";i:10;s:6:"bounty";i:11;s:4:"type";i:12;s:7:"visible";s:3:"_pk";s:2:"id";s:5:"_type";a:13:{s:2:"id";s:7:"int(11)";s:7:"session";s:12:"varchar(255)";s:5:"title";s:12:"varchar(255)";s:7:"content";s:4:"text";s:6:"advise";s:12:"varchar(255)";s:4:"time";s:11:"varchar(11)";s:3:"day";s:10:"tinyint(1)";s:7:"cate_id";s:7:"int(11)";s:7:"user_id";s:7:"int(11)";s:4:"rank";s:10:"tinyint(1)";s:6:"bounty";s:12:"varchar(255)";s:4:"type";s:10:"tinyint(1)";s:7:"visible";s:6:"int(2)";}}
\ No newline at end of file
diff --git a/Application/Runtime/common~runtime.php b/Application/Runtime/common~runtime.php
index 14840e3..a9d447d 100644
--- a/Application/Runtime/common~runtime.php
+++ b/Application/Runtime/common~runtime.php
@@ -1 +1 @@
-' == substr($content, -2)) $content = substr($content, 0, -2); return $content.'}'; } function T($template='',$layer=''){ if(false === strpos($template,'://')){ $template = 'http://'.str_replace(':', '/',$template); } $info = parse_url($template); $file = $info['host'].(isset($info['path'])?$info['path']:''); $module = isset($info['user'])?$info['user'].'/':MODULE_NAME.'/'; $extend = $info['scheme']; $layer = $layer?$layer:C('DEFAULT_V_LAYER'); $auto = C('AUTOLOAD_NAMESPACE'); if($auto && isset($auto[$extend])){ $baseUrl = $auto[$extend].$module.$layer.'/'; }elseif(C('VIEW_PATH')){ $baseUrl = C('VIEW_PATH'); }elseif(defined('TMPL_PATH')){ $baseUrl = TMPL_PATH.$module; }else{ $baseUrl = APP_PATH.$module.$layer.'/'; } $theme = substr_count($file,'/')<2 ? C('DEFAULT_THEME') : ''; $depr = C('TMPL_FILE_DEPR'); if('' == $file) { $file = CONTROLLER_NAME . $depr . ACTION_NAME; }elseif(false === strpos($file, '/')){ $file = CONTROLLER_NAME . $depr . $file; }elseif('/' != $depr){ $file = substr_count($file,'/')>1 ? substr_replace($file,$depr,strrpos($file,'/'),1) : str_replace('/', $depr, $file); } return $baseUrl.($theme?$theme.'/':'').$file.C('TMPL_TEMPLATE_SUFFIX'); } function I($name,$default='',$filter=null,$datas=null) { static $_PUT = null; if(strpos($name,'/')){ list($name,$type) = explode('/',$name,2); }elseif(C('VAR_AUTO_STRING')){ $type = 's'; } if(strpos($name,'.')) { list($method,$name) = explode('.',$name,2); }else{ $method = 'param'; } switch(strtolower($method)) { case 'get' : $input =& $_GET; break; case 'post' : $input =& $_POST; break; case 'put' : if(is_null($_PUT)){ parse_str(file_get_contents('php://input'), $_PUT); } $input = $_PUT; break; case 'param' : switch($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': if(is_null($_PUT)){ parse_str(file_get_contents('php://input'), $_PUT); } $input = $_PUT; break; default: $input = $_GET; } break; case 'path' : $input = array(); if(!empty($_SERVER['PATH_INFO'])){ $depr = C('URL_PATHINFO_DEPR'); $input = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); } break; case 'request' : $input =& $_REQUEST; break; case 'session' : $input =& $_SESSION; break; case 'cookie' : $input =& $_COOKIE; break; case 'server' : $input =& $_SERVER; break; case 'globals' : $input =& $GLOBALS; break; case 'data' : $input =& $datas; break; default: return null; } if(''==$name) { $data = $input; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { if(is_string($filters)){ $filters = explode(',',$filters); } foreach($filters as $filter){ $data = array_map_recursive($filter,$data); } } }elseif(isset($input[$name])) { $data = $input[$name]; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { if(is_string($filters)){ if(0 === strpos($filters,'/')){ if(1 !== preg_match($filters,(string)$data)){ return isset($default) ? $default : null; } }else{ $filters = explode(',',$filters); } }elseif(is_int($filters)){ $filters = array($filters); } if(is_array($filters)){ foreach($filters as $filter){ if(function_exists($filter)) { $data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); }else{ $data = filter_var($data,is_int($filter) ? $filter : filter_id($filter)); if(false === $data) { return isset($default) ? $default : null; } } } } } if(!empty($type)){ switch(strtolower($type)){ case 'a': $data = (array)$data; break; case 'd': $data = (int)$data; break; case 'f': $data = (float)$data; break; case 'b': $data = (boolean)$data; break; case 's': default: $data = (string)$data; } } }else{ $data = isset($default)?$default:null; } is_array($data) && array_walk_recursive($data,'think_filter'); return $data; } function array_map_recursive($filter, $data) { $result = array(); foreach ($data as $key => $val) { $result[$key] = is_array($val) ? array_map_recursive($filter, $val) : call_user_func($filter, $val); } return $result; } function N($key, $step=0,$save=false) { static $_num = array(); if (!isset($_num[$key])) { $_num[$key] = (false !== $save)? S('N_'.$key) : 0; } if (empty($step)){ return $_num[$key]; }else{ $_num[$key] = $_num[$key] + (int)$step; } if(false !== $save){ S('N_'.$key,$_num[$key],$save); } return null; } function parse_name($name, $type=0) { if ($type) { return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name)); } else { return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_")); } } function require_cache($filename) { static $_importFiles = array(); if (!isset($_importFiles[$filename])) { if (file_exists_case($filename)) { require $filename; $_importFiles[$filename] = true; } else { $_importFiles[$filename] = false; } } return $_importFiles[$filename]; } function file_exists_case($filename) { if (is_file($filename)) { if (IS_WIN && APP_DEBUG) { if (basename(realpath($filename)) != basename($filename)) return false; } return true; } return false; } function import($class, $baseUrl = '', $ext=EXT) { static $_file = array(); $class = str_replace(array('.', '#'), array('/', '.'), $class); if (isset($_file[$class . $baseUrl])) return true; else $_file[$class . $baseUrl] = true; $class_strut = explode('/', $class); if (empty($baseUrl)) { if ('@' == $class_strut[0] || MODULE_NAME == $class_strut[0]) { $baseUrl = MODULE_PATH; $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1); }elseif ('Common' == $class_strut[0]) { $baseUrl = COMMON_PATH; $class = substr($class, 7); }elseif (in_array($class_strut[0],array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$class_strut[0])) { $baseUrl = LIB_PATH; }else { $baseUrl = APP_PATH; } } if (substr($baseUrl, -1) != '/') $baseUrl .= '/'; $classfile = $baseUrl . $class . $ext; if (!class_exists(basename($class),false)) { return require_cache($classfile); } return null; } function load($name, $baseUrl='', $ext='.php') { $name = str_replace(array('.', '#'), array('/', '.'), $name); if (empty($baseUrl)) { if (0 === strpos($name, '@/')) { $baseUrl = MODULE_PATH.'Common/'; $name = substr($name, 2); } else { $array = explode('/', $name); $baseUrl = APP_PATH . array_shift($array).'/Common/'; $name = implode('/',$array); } } 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 D($name='',$layer='') { if(empty($name)) return new Think\Model; static $_model = array(); $layer = $layer? : C('DEFAULT_M_LAYER'); if(isset($_model[$name.$layer])) return $_model[$name.$layer]; $class = parse_res_name($name,$layer); if(class_exists($class)) { $model = new $class(basename($name)); }elseif(false === strpos($name,'/')){ if(!C('APP_USE_NAMESPACE')){ import('Common/'.$layer.'/'.$class); }else{ $class = '\\Common\\'.$layer.'\\'.$name.$layer; } $model = class_exists($class)? new $class($name) : new Think\Model($name); }else { Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE); $model = new Think\Model(basename($name)); } $_model[$name.$layer] = $model; return $model; } function M($name='', $tablePrefix='',$connection='') { static $_model = array(); if(strpos($name,':')) { list($class,$name) = explode(':',$name); }else{ $class = 'Think\\Model'; } $guid = (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class; if (!isset($_model[$guid])) $_model[$guid] = new $class($name,$tablePrefix,$connection); return $_model[$guid]; } function parse_res_name($name,$layer,$level=1){ if(strpos($name,'://')) { list($extend,$name) = explode('://',$name); }else{ $extend = ''; } if(strpos($name,'/') && substr_count($name, '/')>=$level){ list($module,$name) = explode('/',$name,2); }else{ $module = defined('MODULE_NAME') ? MODULE_NAME : '' ; } $array = explode('/',$name); if(!C('APP_USE_NAMESPACE')){ $class = parse_name($name, 1); import($module.'/'.$layer.'/'.$class.$layer); }else{ $class = $module.'\\'.$layer; foreach($array as $name){ $class .= '\\'.parse_name($name, 1); } if($extend){ $class = $extend.'\\'.$class; } } return $class.$layer; } function controller($name,$path=''){ $layer = C('DEFAULT_C_LAYER'); if(!C('APP_USE_NAMESPACE')){ $class = parse_name($name, 1).$layer; import(MODULE_NAME.'/'.$layer.'/'.$class); }else{ $class = ( $path ? basename(ADDON_PATH).'\\'.$path : MODULE_NAME ).'\\'.$layer; $array = explode('/',$name); foreach($array as $name){ $class .= '\\'.parse_name($name, 1); } $class .= $layer; } if(class_exists($class)) { return new $class(); }else { return false; } } function A($name,$layer='',$level=0) { static $_action = array(); $layer = $layer? : C('DEFAULT_C_LAYER'); $level = $level? : ($layer == C('DEFAULT_C_LAYER')?C('CONTROLLER_LEVEL'):1); if(isset($_action[$name.$layer])) return $_action[$name.$layer]; $class = parse_res_name($name,$layer,$level); if(class_exists($class)) { $action = new $class(); $_action[$name.$layer] = $action; return $action; }else { return false; } } function R($url,$vars=array(),$layer='') { $info = pathinfo($url); $action = $info['basename']; $module = $info['dirname']; $class = A($module,$layer); if($class){ if(is_string($vars)) { parse_str($vars,$vars); } return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars); }else{ return false; } } function tag($tag, &$params=NULL) { \Think\Hook::listen($tag,$params); } function B($name, $tag='',&$params=NULL) { if(''==$tag){ $name .= 'Behavior'; } return \Think\Hook::exec($name,$tag,$params); } 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 .= "<<' . $label . htmlspecialchars($output, ENT_QUOTES) . ''; } else { $output = $label . print_r($var, true); } } else { ob_start(); var_dump($var); $output = ob_get_clean(); if (!extension_loaded('xdebug')) { $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); $output = '' . $label . htmlspecialchars($output, ENT_QUOTES) . ' '; } } if ($echo) { echo($output); return null; }else return $output; } function layout($layout) { if(false !== $layout) { C('LAYOUT_ON',true); if(is_string($layout)) { C('LAYOUT_NAME',$layout); } }else{ C('LAYOUT_ON',false); } } function U($url='',$vars='',$suffix=true,$domain=false) { $info = parse_url($url); $url = !empty($info['path'])?$info['path']:ACTION_NAME; if(isset($info['fragment'])) { $anchor = $info['fragment']; if(false !== strpos($anchor,'?')) { list($anchor,$info['query']) = explode('?',$anchor,2); } if(false !== strpos($anchor,'@')) { list($anchor,$host) = explode('@',$anchor, 2); } }elseif(false !== strpos($url,'@')) { list($url,$host) = explode('@',$info['path'], 2); } if(isset($host)) { $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.')); }elseif($domain===true){ $domain = $_SERVER['HTTP_HOST']; if(C('APP_SUB_DOMAIN_DEPLOY') ) { $domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.'); foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) { $rule = is_array($rule)?$rule[0]:$rule; if(false === strpos($key,'*') && 0=== strpos($url,$rule)) { $domain = $key.strstr($domain,'.'); $url = substr_replace($url,'',0,strlen($rule)); break; } } } } if(is_string($vars)) { parse_str($vars,$vars); }elseif(!is_array($vars)){ $vars = array(); } if(isset($info['query'])) { parse_str($info['query'],$params); $vars = array_merge($params,$vars); } $depr = C('URL_PATHINFO_DEPR'); $urlCase = C('URL_CASE_INSENSITIVE'); if($url) { if(0=== strpos($url,'/')) { $route = true; $url = substr($url,1); if('/' != $depr) { $url = str_replace('/',$depr,$url); } }else{ if('/' != $depr) { $url = str_replace('/',$depr,$url); } $url = trim($url,$depr); $path = explode($depr,$url); $var = array(); $varModule = C('VAR_MODULE'); $varController = C('VAR_CONTROLLER'); $varAction = C('VAR_ACTION'); $var[$varAction] = !empty($path)?array_pop($path):ACTION_NAME; $var[$varController] = !empty($path)?array_pop($path):CONTROLLER_NAME; if($maps = C('URL_ACTION_MAP')) { if(isset($maps[strtolower($var[$varController])])) { $maps = $maps[strtolower($var[$varController])]; if($action = array_search(strtolower($var[$varAction]),$maps)){ $var[$varAction] = $action; } } } if($maps = C('URL_CONTROLLER_MAP')) { if($controller = array_search(strtolower($var[$varController]),$maps)){ $var[$varController] = $controller; } } if($urlCase) { $var[$varController] = parse_name($var[$varController]); } $module = ''; if(!empty($path)) { $var[$varModule] = implode($depr,$path); }else{ if(C('MULTI_MODULE')) { if(MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')){ $var[$varModule]= MODULE_NAME; } } } if($maps = C('URL_MODULE_MAP')) { if($_module = array_search(strtolower($var[$varModule]),$maps)){ $var[$varModule] = $_module; } } if(isset($var[$varModule])){ $module = $var[$varModule]; unset($var[$varModule]); } } } if(C('URL_MODEL') == 0) { $url = __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var)); if($urlCase){ $url = strtolower($url); } if(!empty($vars)) { $vars = http_build_query($vars); $url .= '&'.$vars; } }else{ if(isset($route)) { $url = __APP__.'/'.rtrim($url,$depr); }else{ $module = (defined('BIND_MODULE') && BIND_MODULE==$module )? '' : $module; $url = __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var)); } if($urlCase){ $url = strtolower($url); } if(!empty($vars)) { foreach ($vars as $var => $val){ if('' !== trim($val)) $url .= $depr . $var . $depr . urlencode($val); } } if($suffix) { $suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix; if($pos = strpos($suffix, '|')){ $suffix = substr($suffix, 0, $pos); } if($suffix && '/' != substr($url,-1)){ $url .= '.'.ltrim($suffix,'.'); } } } if(isset($anchor)){ $url .= '#'.$anchor; } if($domain) { $url = (is_ssl()?'https://':'http://').$domain.$url; } return $url; } function W($name, $data=array()) { return R($name,$data,'Widget'); } function is_ssl() { if(isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))){ return true; }elseif(isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'] )) { return true; } return false; } function redirect($url, $time=0, $msg='') { $url = str_replace(array("\n", "\r"), '', $url); if (empty($msg)) $msg = "系统将在{$time}秒之后自动跳转到{$url}!"; if (!headers_sent()) { if (0 === $time) { header('Location: ' . $url); } else { header("refresh:{$time};url={$url}"); echo($msg); } exit(); } else { $str = " "; if ($time != 0) $str .= $msg; exit($str); } } function S($name,$value='',$options=null) { static $cache = ''; if(is_array($options)){ $type = isset($options['type'])?$options['type']:''; $cache = Think\Cache::getInstance($type,$options); }elseif(is_array($name)) { $type = isset($name['type'])?$name['type']:''; $cache = Think\Cache::getInstance($type,$name); return $cache; }elseif(empty($cache)) { $cache = Think\Cache::getInstance(); } if(''=== $value){ return $cache->get($name); }elseif(is_null($value)) { return $cache->rm($name); }else { if(is_array($options)) { $expire = isset($options['expire'])?$options['expire']:NULL; }else{ $expire = is_numeric($options)?$options:NULL; } return $cache->set($name, $value, $expire); } } function F($name, $value='', $path=DATA_PATH) { static $_cache = array(); $filename = $path . $name . '.php'; if ('' !== $value) { if (is_null($value)) { if(false !== strpos($name,'*')){ return false; }else{ unset($_cache[$name]); return Think\Storage::unlink($filename,'F'); } } else { Think\Storage::put($filename,serialize($value),'F'); $_cache[$name] = $value; return null; } } if (isset($_cache[$name])) return $_cache[$name]; if (Think\Storage::has($filename,'F')){ $value = unserialize(Think\Storage::read($filename,'F')); $_cache[$name] = $value; } else { $value = false; } return $value; } function to_guid_string($mix) { if (is_object($mix)) { return spl_object_hash($mix); } elseif (is_resource($mix)) { $mix = get_resource_type($mix) . strval($mix); } else { $mix = serialize($mix); } return md5($mix); } function xml_encode($data, $root='think', $item='item', $attr='', $id='id', $encoding='utf-8') { if(is_array($attr)){ $_attr = array(); foreach ($attr as $key => $value) { $_attr[] = "{$key}=\"{$value}\""; } $attr = implode(' ', $_attr); } $attr = trim($attr); $attr = empty($attr) ? '' : " {$attr}"; $xml = ""; $xml .= "<{$root}{$attr}>"; $xml .= data_to_xml($data, $item, $id); $xml .= "{$root}>"; return $xml; } function data_to_xml($data, $item='item', $id='id') { $xml = $attr = ''; foreach ($data as $key => $val) { if(is_numeric($key)){ $id && $attr = " {$id}=\"{$key}\""; $key = $item; } $xml .= "<{$key}{$attr}>"; $xml .= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val; $xml .= "{$key}>"; } return $xml; } function session($name='',$value='') { $prefix = C('SESSION_PREFIX'); if(is_array($name)) { if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']); if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){ session_id($_REQUEST[C('VAR_SESSION_ID')]); }elseif(isset($name['id'])) { session_id($name['id']); } if('common' == APP_MODE){ ini_set('session.auto_start', 0); } if(isset($name['name'])) session_name($name['name']); if(isset($name['path'])) session_save_path($name['path']); if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']); if(isset($name['expire'])) { ini_set('session.gc_maxlifetime', $name['expire']); ini_set('session.cookie_lifetime', $name['expire']); } if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0); if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0); if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']); if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']); if(isset($name['type'])) C('SESSION_TYPE',$name['type']); if(C('SESSION_TYPE')) { $type = C('SESSION_TYPE'); $class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type)); $hander = new $class(); session_set_save_handler( array(&$hander,"open"), array(&$hander,"close"), array(&$hander,"read"), array(&$hander,"write"), array(&$hander,"destroy"), array(&$hander,"gc")); } if(C('SESSION_AUTO_START')) session_start(); }elseif('' === $value){ if(''===$name){ return $prefix ? $_SESSION[$prefix] : $_SESSION; }elseif(0===strpos($name,'[')) { if('[pause]'==$name){ session_write_close(); }elseif('[start]'==$name){ session_start(); }elseif('[destroy]'==$name){ $_SESSION = array(); session_unset(); session_destroy(); }elseif('[regenerate]'==$name){ session_regenerate_id(); } }elseif(0===strpos($name,'?')){ $name = substr($name,1); if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]); }else{ return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]); } }elseif(is_null($name)){ if($prefix) { unset($_SESSION[$prefix]); }else{ $_SESSION = array(); } }elseif($prefix){ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null; }else{ return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null; } }else{ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null; }else{ return isset($_SESSION[$name])?$_SESSION[$name]:null; } } }elseif(is_null($value)){ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); if($prefix){ unset($_SESSION[$prefix][$name1][$name2]); }else{ unset($_SESSION[$name1][$name2]); } }else{ if($prefix){ unset($_SESSION[$prefix][$name]); }else{ unset($_SESSION[$name]); } } }else{ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); if($prefix){ $_SESSION[$prefix][$name1][$name2] = $value; }else{ $_SESSION[$name1][$name2] = $value; } }else{ if($prefix){ $_SESSION[$prefix][$name] = $value; }else{ $_SESSION[$name] = $value; } } } return null; } function cookie($name='', $value='', $option=null) { $config = array( 'prefix' => C('COOKIE_PREFIX'), 'expire' => C('COOKIE_EXPIRE'), 'path' => C('COOKIE_PATH'), 'domain' => C('COOKIE_DOMAIN'), 'secure' => C('COOKIE_SECURE'), 'httponly' => C('COOKIE_HTTPONLY'), ); if (!is_null($option)) { if (is_numeric($option)) $option = array('expire' => $option); elseif (is_string($option)) parse_str($option, $option); $config = array_merge($config, array_change_key_case($option)); } if(!empty($config['httponly'])){ ini_set("session.cookie_httponly", 1); } if (is_null($name)) { if (empty($_COOKIE)) return null; $prefix = empty($value) ? $config['prefix'] : $value; if (!empty($prefix)) { foreach ($_COOKIE as $key => $val) { if (0 === stripos($key, $prefix)) { setcookie($key, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); unset($_COOKIE[$key]); } } } return null; }elseif('' === $name){ return $_COOKIE; } $name = $config['prefix'] . str_replace('.', '_', $name); if ('' === $value) { if(isset($_COOKIE[$name])){ $value = $_COOKIE[$name]; if(0===strpos($value,'think:')){ $value = substr($value,6); return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true)); }else{ return $value; } }else{ return null; } } else { if (is_null($value)) { setcookie($name, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); unset($_COOKIE[$name]); } else { if(is_array($value)){ $value = 'think:'.json_encode(array_map('urlencode',$value)); } $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0; setcookie($name, $value, $expire, $config['path'], $config['domain'],$config['secure'],$config['httponly']); $_COOKIE[$name] = $value; } } return null; } function load_ext_file($path) { if($files = C('LOAD_EXT_FILE')) { $files = explode(',',$files); foreach ($files as $file){ $file = $path.'Common/'.$file.'.php'; if(is_file($file)) include $file; } } if($configs = C('LOAD_EXT_CONFIG')) { if(is_string($configs)) $configs = explode(',',$configs); foreach ($configs as $key=>$config){ $file = is_file($config)? $config : $path.'Conf/'.$config.CONF_EXT; if(is_file($file)) { is_numeric($key)?C(load_config($file)):C($key,load_config($file)); } } } } function get_client_ip($type = 0,$adv=false) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if($adv){ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown',$arr); if(false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } }elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } $long = sprintf("%u",ip2long($ip)); $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); return $ip[$type]; } function send_http_status($code) { static $_status = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Moved Temporarily ', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 509 => 'Bandwidth Limit Exceeded' ); if(isset($_status[$code])) { header('HTTP/1.1 '.$code.' '.$_status[$code]); header('Status:'.$code.' '.$_status[$code]); } } function think_filter(&$value){ if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){ $value .= ' '; } } function in_array_case($value,$array){ return in_array(strtolower($value),array_map('strtolower',$array)); }}namespace {function dd($data) { echo ""; print_r($data); echo " "; } function getSortedCategory($data,$pid=0,$html="|---",$level=0) { $temp = array(); foreach ($data as $k => $v) { if($v['pid'] == $pid){ $str = str_repeat($html, $level); $v['html'] = $str; $temp[] = $v; $temp = array_merge($temp,getSortedCategory($data,$v['id'],'|---',$level+1)); } } return $temp; } function getSettingValueDataByKey($key) { return M('setting')->getByKey($key); } function getSettingValueFieldByKey($key,$field) { return M('setting')->getFieldByKey($key,$field); }}namespace Think{ class Hook { static private $tags = array(); static public function add($tag,$name) { if(!isset(self::$tags[$tag])){ self::$tags[$tag] = array(); } if(is_array($name)){ self::$tags[$tag] = array_merge(self::$tags[$tag],$name); }else{ self::$tags[$tag][] = $name; } } static public function import($data,$recursive=true) { if(!$recursive){ self::$tags = array_merge(self::$tags,$data); }else{ foreach ($data as $tag=>$val){ if(!isset(self::$tags[$tag])) self::$tags[$tag] = array(); if(!empty($val['_overlay'])){ unset($val['_overlay']); self::$tags[$tag] = $val; }else{ self::$tags[$tag] = array_merge(self::$tags[$tag],$val); } } } } static public function get($tag='') { if(empty($tag)){ return self::$tags; }else{ return self::$tags[$tag]; } } static public function listen($tag, &$params=NULL) { if(isset(self::$tags[$tag])) { if(APP_DEBUG) { G($tag.'Start'); trace('[ '.$tag.' ] --START--','','INFO'); } foreach (self::$tags[$tag] as $name) { APP_DEBUG && G($name.'_start'); $result = self::exec($name, $tag,$params); if(APP_DEBUG){ G($name.'_end'); trace('Run '.$name.' [ RunTime:'.G($name.'_start',$name.'_end',6).'s ]','','INFO'); } if(false === $result) { return ; } } if(APP_DEBUG) { trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO'); } } return; } static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ $tag = 'run'; } $addon = new $name(); return $addon->$tag($params); } }}namespace Think{ class App { static public function init() { load_ext_file(COMMON_PATH); C('LOG_PATH', realpath(LOG_PATH).'/Common/'); define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); define('IS_GET', REQUEST_METHOD =='GET' ? true : false); define('IS_POST', REQUEST_METHOD =='POST' ? true : false); define('IS_PUT', REQUEST_METHOD =='PUT' ? true : false); define('IS_DELETE', REQUEST_METHOD =='DELETE' ? true : false); Dispatcher::dispatch(); if(C('REQUEST_VARS_FILTER')){ array_walk_recursive($_GET, 'think_filter'); array_walk_recursive($_POST, 'think_filter'); array_walk_recursive($_REQUEST, 'think_filter'); } Hook::listen('url_dispatch'); define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false); C('TMPL_EXCEPTION_FILE',realpath(C('TMPL_EXCEPTION_FILE'))); return ; } static public function exec() { if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ $module = false; }elseif(C('ACTION_BIND_CLASS')){ $layer = C('DEFAULT_C_LAYER'); if(is_dir(MODULE_PATH.$layer.'/'.CONTROLLER_NAME)){ $namespace = MODULE_NAME.'\\'.$layer.'\\'.CONTROLLER_NAME.'\\'; }else{ $namespace = MODULE_NAME.'\\'.$layer.'\\_empty\\'; } $actionName = strtolower(ACTION_NAME); if(class_exists($namespace.$actionName)){ $class = $namespace.$actionName; }elseif(class_exists($namespace.'_empty')){ $class = $namespace.'_empty'; }else{ E(L('_ERROR_ACTION_').':'.ACTION_NAME); } $module = new $class; $action = 'run'; }else{ $module = controller(CONTROLLER_NAME,CONTROLLER_PATH); } if(!$module) { if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) { header("Content-type:image/png"); exit(base64_decode(App::logo())); } $module = A('Empty'); if(!$module){ E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME); } } if(!isset($action)){ $action = ACTION_NAME.C('ACTION_SUFFIX'); } try{ if(!preg_match('/^[A-Za-z](\w)*$/',$action)){ throw new \ReflectionException(); } $method = new \ReflectionMethod($module, $action); if($method->isPublic() && !$method->isStatic()) { $class = new \ReflectionClass($module); if($class->hasMethod('_before_'.$action)) { $before = $class->getMethod('_before_'.$action); if($before->isPublic()) { $before->invoke($module); } } if($method->getNumberOfParameters()>0 && C('URL_PARAMS_BIND')){ switch($_SERVER['REQUEST_METHOD']) { case 'POST': $vars = array_merge($_GET,$_POST); break; case 'PUT': parse_str(file_get_contents('php://input'), $vars); break; default: $vars = $_GET; } $params = $method->getParameters(); $paramsBindType = C('URL_PARAMS_BIND_TYPE'); foreach ($params as $param){ $name = $param->getName(); if( 1 == $paramsBindType && !empty($vars) ){ $args[] = array_shift($vars); }elseif( 0 == $paramsBindType && isset($vars[$name])){ $args[] = $vars[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); }else{ E(L('_PARAM_ERROR_').':'.$name); } } if(C('URL_PARAMS_SAFE')){ $filters = C('URL_PARAMS_FILTER')?:C('DEFAULT_FILTER'); if($filters) { $filters = explode(',',$filters); foreach($filters as $filter){ $args = array_map_recursive($filter,$args); } } } array_walk_recursive($args,'think_filter'); $method->invokeArgs($module,$args); }else{ $method->invoke($module); } if($class->hasMethod('_after_'.$action)) { $after = $class->getMethod('_after_'.$action); if($after->isPublic()) { $after->invoke($module); } } }else{ throw new \ReflectionException(); } } catch (\ReflectionException $e) { $method = new \ReflectionMethod($module,'__call'); $method->invokeArgs($module,array($action,'')); } return ; } static public function run() { Hook::listen('app_init'); App::init(); Hook::listen('app_begin'); if(!IS_CLI){ session(C('SESSION_OPTIONS')); } G('initTime'); App::exec(); Hook::listen('app_end'); return ; } static public function logo(){ return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/9+69+8xuNtkHJAFCSIAkhMgjCCJQUi0GtEIVbP8Qq9LH2No6TmfaztjO2OnUdvqHFMfOVFTqIK0vUEEeqUBARCsEeYQkEPJoEvIiELLvvc9z+p27u2F3s5tsBB1OZiebu5dzf7/v/L7f952zMM8cWIwY+Mk2ulCp92Fnq3XvnzArr2NZnYNldDp0Gw+/OEQ4+obQn5D+4Ubb22+YOGsWi/Todh8AHglKEGkEsnHBQ162511GZFgW6ZCBM9/W4H3iNSQqIe09O196dLKX7d1O39OViP/wthtkND62if/wj/DbMpph8BY/m9xy8BoBmQk+mHqZQGNy4JYRwCoRbwa8l4JXw6M+orJxpU0U6ToKy/5bQsAiTeokGKkTx46RRxxEUgrwGgF4MWNNEJCGgYTvpgnY1IJWg5RzfqLgvcIgktX0i8dmMlFA8qCQ5L0Z/WObPLUxT1i4lWSYDISoEfBYGvM+LlMQQdkLHoWRRZ8zYQI62Thswe5WTORGwNXDcGjqeOA9AF7B8rhzsxMBEoJ8oJKaqPu4hblHMCMPwl9XeNWyb8xkB/DDGYKfMAE6aFL7xesZ389JlgG3XHEMI6UPDOP6JHHu67T2pwNPI69mCP4rEaBDUAJaKc/AOuXiwH07VCS3w5+UQMAuF/WqGI+yFIwVNBwemBD4r0wgQiKoFZa00sEYTwss32lA1tPwVxtc8jQ5/gWCwmGCyUD8vRT0sHBFW4GJDvZmrJFWRY1EkrGA6ZB8/10fOZSSj0E6F+BSP7xidiIzhBmKB09lEwHPkG+UQIyEN44EBiT5vrv2uJXyPQqSqO930fxvcvwbR/+JAkD9EfASgI9EHlp6YiHO4W+cAB20SnrFqxBbNljiXf1Pl1K2S0HCWfiog3YlAD5RGwwxK6oUjTweuVigLjyB0mX410mAFnMoVK1lvvUvgt8fUJH0JVyjuvcmg4dE5mUiFtD24AZ4qBVELxXKS+pMxN43kSdzNwudJ+bQbLlmnxvPOQoCugSap1GnSRoG8KOiKbH+rIA0lEeSAg3y6eeQ6XI2nrYnrPM89bUTgI0Pdqvl50vlNbtZxDUBcLBK0kPd5jPziyLdojJIN0pq5/mdzwL4UVvVInV5ncQEPNOUxa9d0TU+CW5l+FoI0GSDKHVVSOs+0KOsZoxwOzSZNFGv0mQ9avyLCh2Hpm+70Y0YJoJVgmQv822wnDC8Miq6VjJ5IFed0QD1YiAbT+nQE8v/RMZfmgmcCRHIIu7Bmcp39oM9fqEychcA747KxQ/AEyqQonl7hATtJmnhO2XYtgcia01aSbVMenAXrIomPcLgEBA4liGBzFZAT8zBYqW6brI67wg8sFVhxBhwLwBP2+tqBQqqK7VJKGh/BRrfTr6nWL7nYBaZdBJHqrX3kPEPap56xwE/GvjJTRMADeMCdcGpGXL1Xh4ZL8BDOlWkUpegfi0CeDzeA5YITzEnddv+IXL+UYCmqIvqC9UlUC/ki9FipwVjunL3yX7dOTLeXmVMAhbsGporPfyOBTm/BJ23gTVehsvXRnSewagUfpBXF3p5pygKS7OceqTjb7h2vjr/XKm0ZofKSI2Q/J102wHzatZkJPYQ5JoKsuK+EoHJakVzubzuLQDepCKllTZi9AG0DYg9ZLxhFaZsOu7bvlmVI5oPXJMQJcHxHClSln1apFTvAimeg48u0RWFeZW4lVcjbQWZuIQK1KozZfIDO6CSQmQQXdpBaiKZyEWThVK1uEc6v7V7uK0ysduExPZx4vysDR+4SelhBYm0R6LBuR4PXts8MYMcJPsINo4YZCDLj0sgB0/vLpPXvA2Tn42Cv5rsLulGubzW0sEd3d4W/mJt2Kck+DzDMijfPLOjyrDhXSh852B+OvflqAkoyXO1cYfujtc/i3jJSAwhgfFlp20laMLOku/bC7prgqW7lCn4auE5NhcXPd3M7x70+IceSgZvNljCd9k3fLjYsPElqLR14PXQZqD2ZNkkrAB79UeJUebFQmXpf8ZcAQt2XrMQdyNUVBqZoUzAFyp3V3xi/MubUA/mCT4Fhf038PC8XplhWnCmnK/ZzyC2BSTRSqKVOuY2kB8Jia0lvvRIVoP+vVWJbYarf6p655E2/nANBMCWkgD49DA0VAMyI1OLFMYCXiU9bmzi9/y5i/vsaTpHPHidTofzLbM65vMPva9HlovgXp0AvjtaqYMfDD0/4mAsYE92pxa+9k1QgCnRVObCpojpzsKTPvayPetTEgBdwnssjuc0kOBFX+q3HwRQxdrOLAqeYRjkMk/trTSu2Z9Lik7CfF0AvjtqAhS4NHobGXUnB5DQs8hG8p/wMX1r4+8xkmyvQ50JVq72TVeXbz3HvpWaQJi57hJYTw4kGbtS+C2TigQUtZUX+X27QQq2ePBZBru/0lxTm8fOOQ5yaZOZMAV+he4FqIMB+LQB0UgMSajANX29j+vbmly8ipRvHeSQoQOkM5iFXcPQCVwDMs5RBCQmaPOyvbNd6uwvQJ183BZQG3Zc+Eiv7vQOKu8YeDmMcJlt2ckyftVeMIGLBCmdMHl/tFILYwGPjXWO3zOfSq/+om+oa7Mlh2fpSsRGLp7RAW3FUVjNHgiMhyE6zBFjM2BdkdJGO7nP1kJXWAtBuBpPIAu7f+hhu7bFXIuC5xWrf0X2xreykOsUyKkF2gwadbrXDcXrfKxR43zGcSj4t/cCgr+a1iy6EjE5GYktUCl9fwfMeylyooGF48bN2IGLTw8x7StS7sj8TF9FmPGWQhm3rRR+o9lhvjJvSYAdfDUevI1M6bnX/OwWaDMOQ8RPgKRo0eulBTdT8AW2kl8e9L7UHghHwMfLiZPNoSpx0yugpQZaFqKWqxVSM3a2pN1SAhC2jf94I7ybBI7EL5A2Wvu5ht3xsoEt4+Ay/abXgCQAxyOeDsDlTCQzy75ohcGgv9Tra9uiymRUYTLrswOLlCdfAQf7HPDQQ4ErAH5EDXB9cMxWYpjtXApRncojS0sbV/cCgHTHwGNBJy+1PQE2x56FpaVR7wfQGZ37V+V+19EiHNvR6q1fRUjqvbjbMq1/qfHxbTrE10ePY2gPFk48D2CVMTf1AF4PXvyYR9dV6Wf7H413m3xTWQvYGhQ7mfYwA5mAX+18Vue05v/8jG/fZX/IW5MKPKtjSYlt0ellxh+/BOCPAwYaeVr0QofZFxJWVWC8znG70au6llVmktsF0bfHF6k8fvZ5esZJbwHwwnjg59tXz6sL/P0NUZDuSNu1mnJ8Vab17+cy005A9wtOpp3i0bZdpJLUil00semAwN45LgEViZYe3amNye0B6A9chviSlzXVsFtyN5/1H3gaNmMpn8Fz0GpYFp6Zw615H/LpUuRQQDMCL82n5DpBSawkvzIdN2ypiT8nSLth8Pk9jnjwdFzH3W4XW6KMBfwB569NdcGX93mC16tTflcArcYUc/mFuYbV+8zY0SAjAVoNErNgWjtwumJ3wbn/HlBFYdxHvSkJJEc+Ngal9opSwyo9YlITX2C/P/+gf8sxURSLR+mcZUmeqaS9wrh6vxW5zxFCOqFi90RbDWq/YwZmnu1+a6OvdpvRqkNxxe44lyl4OobEnpKA6Uox5EfH9xzPs/HRKrTPWdIQrK1VZDU7ETiD3Obpl+8wPPCRBbkbwNtpW9AbBe5L1SMlj3tdTxk/9W47JUmqS5HU+JzYymUKXjtWVmT9RenIhgXc+nroWLyxXJhmL112OdB8GCsk4f8oZJucnvmmtR85mBn10GZ0EKSCMUSAR3ukcXd5s7LvLD3me61WkuTCpJzYAyRurMB44EdEJzTfU271lUJC03YjXJXzYOGZwN4D8eB5jlfLrdWfzGRW7icMPfiSO6Oe7s20bmhdgLX4Z23B+s3JgQESzUDiMboSzDMHFpNMwccGePauhfwjzwnI2wu9zKGgEFg80jcZ7MHllk07s1H+5yojtUQTlH4nFdLKTGwDmPbIklOb1L1zO4T6N8NCuDLFLS/C63c0eNRimZ++s5BMBHxU11jHchI9oFVUxRh/eMDzHEzGYu0Lg8gJ7oS/tFCwoic44fyUtix0n/46vP4bf+//BRgAYwDDar4ncHIAAAAASUVORK5CYII='; } }}namespace Think{ class Dispatcher { static public function dispatch() { $varPath = C('VAR_PATHINFO'); $varAddon = C('VAR_ADDON'); $varModule = C('VAR_MODULE'); $varController = C('VAR_CONTROLLER'); $varAction = C('VAR_ACTION'); $urlCase = C('URL_CASE_INSENSITIVE'); if(isset($_GET[$varPath])) { $_SERVER['PATH_INFO'] = $_GET[$varPath]; unset($_GET[$varPath]); }elseif(IS_CLI){ $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; } if(C('APP_SUB_DOMAIN_DEPLOY')) { $rules = C('APP_SUB_DOMAIN_RULES'); if(isset($rules[$_SERVER['HTTP_HOST']])) { define('APP_DOMAIN',$_SERVER['HTTP_HOST']); $rule = $rules[APP_DOMAIN]; }else{ if(strpos(C('APP_DOMAIN_SUFFIX'),'.')){ $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -3); }else{ $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -2); } if(!empty($domain)) { $subDomain = implode('.', $domain); define('SUB_DOMAIN',$subDomain); $domain2 = array_pop($domain); if($domain) { $domain3 = array_pop($domain); } if(isset($rules[$subDomain])) { $rule = $rules[$subDomain]; }elseif(isset($rules['*.' . $domain2]) && !empty($domain3)){ $rule = $rules['*.' . $domain2]; $panDomain = $domain3; }elseif(isset($rules['*']) && !empty($domain2) && 'www' != $domain2 ){ $rule = $rules['*']; $panDomain = $domain2; } } } if(!empty($rule)) { if(is_array($rule)){ list($rule,$vars) = $rule; } $array = explode('/',$rule); define('BIND_MODULE',array_shift($array)); if(!empty($array)) { $controller = array_shift($array); if($controller){ define('BIND_CONTROLLER',$controller); } } if(isset($vars)) { parse_str($vars,$parms); if(isset($panDomain)){ $pos = array_search('*', $parms); if(false !== $pos) { $parms[$pos] = $panDomain; } } $_GET = array_merge($_GET,$parms); } } } if(!isset($_SERVER['PATH_INFO'])) { $types = explode(',',C('URL_PATHINFO_FETCH')); foreach ($types as $type){ if(0===strpos($type,':')) { $_SERVER['PATH_INFO'] = call_user_func(substr($type,1)); break; }elseif(!empty($_SERVER[$type])) { $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type],$_SERVER['SCRIPT_NAME']))? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; break; } } } $depr = C('URL_PATHINFO_DEPR'); define('MODULE_PATHINFO_DEPR', $depr); if(empty($_SERVER['PATH_INFO'])) { $_SERVER['PATH_INFO'] = ''; define('__INFO__',''); define('__EXT__',''); }else{ define('__INFO__',trim($_SERVER['PATH_INFO'],'/')); define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'],PATHINFO_EXTENSION))); $_SERVER['PATH_INFO'] = __INFO__; if(!defined('BIND_MODULE') && (!C('URL_ROUTER_ON') || !Route::check())){ if (__INFO__ && C('MULTI_MODULE')){ $paths = explode($depr,__INFO__,2); $allowList = C('MODULE_ALLOW_LIST'); $module = preg_replace('/\.' . __EXT__ . '$/i', '',$paths[0]); if( empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))){ $_GET[$varModule] = $module; $_SERVER['PATH_INFO'] = isset($paths[1])?$paths[1]:''; } } } } define('__SELF__',strip_tags($_SERVER[C('URL_REQUEST_URI')])); define('MODULE_NAME', defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule)); if( MODULE_NAME && (defined('BIND_MODULE') || !in_array_case(MODULE_NAME,C('MODULE_DENY_LIST')) ) && is_dir(APP_PATH.MODULE_NAME)){ define('MODULE_PATH', APP_PATH.MODULE_NAME.'/'); C('CACHE_PATH',CACHE_PATH.MODULE_NAME.'/'); C('LOG_PATH', realpath(LOG_PATH).'/'.MODULE_NAME.'/'); Hook::listen('module_check'); if(is_file(MODULE_PATH.'Conf/config'.CONF_EXT)) C(load_config(MODULE_PATH.'Conf/config'.CONF_EXT)); if('common' != APP_MODE && is_file(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT)) C(load_config(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT)); if(APP_STATUS && is_file(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)) C(load_config(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)); if(is_file(MODULE_PATH.'Conf/alias.php')) Think::addMap(include MODULE_PATH.'Conf/alias.php'); if(is_file(MODULE_PATH.'Conf/tags.php')) Hook::import(include MODULE_PATH.'Conf/tags.php'); if(is_file(MODULE_PATH.'Common/function.php')) include MODULE_PATH.'Common/function.php'; load_ext_file(MODULE_PATH); }else{ E(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME); } if(!defined('__APP__')){ $urlMode = C('URL_MODEL'); if($urlMode == URL_COMPAT ){ define('PHP_FILE',_PHP_FILE_.'?'.$varPath.'='); }elseif($urlMode == URL_REWRITE ) { $url = dirname(_PHP_FILE_); if($url == '/' || $url == '\\') $url = ''; define('PHP_FILE',$url); }else { define('PHP_FILE',_PHP_FILE_); } define('__APP__',strip_tags(PHP_FILE)); } $moduleName = defined('MODULE_ALIAS')? MODULE_ALIAS : MODULE_NAME; define('__MODULE__',(defined('BIND_MODULE') || !C('MULTI_MODULE'))? __APP__ : __APP__.'/'.($urlCase ? strtolower($moduleName) : $moduleName)); if('' != $_SERVER['PATH_INFO'] && (!C('URL_ROUTER_ON') || !Route::check()) ){ Hook::listen('path_info'); if(C('URL_DENY_SUFFIX') && preg_match('/\.('.trim(C('URL_DENY_SUFFIX'),'.').')$/i', $_SERVER['PATH_INFO'])){ send_http_status(404); exit; } $_SERVER['PATH_INFO'] = preg_replace(C('URL_HTML_SUFFIX')? '/\.('.trim(C('URL_HTML_SUFFIX'),'.').')$/i' : '/\.'.__EXT__.'$/i', '', $_SERVER['PATH_INFO']); $depr = C('URL_PATHINFO_DEPR'); $paths = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); if(!defined('BIND_CONTROLLER')) { if(C('CONTROLLER_LEVEL')>1){ $_GET[$varController] = implode('/',array_slice($paths,0,C('CONTROLLER_LEVEL'))); $paths = array_slice($paths, C('CONTROLLER_LEVEL')); }else{ $_GET[$varController] = array_shift($paths); } } if(!defined('BIND_ACTION')){ $_GET[$varAction] = array_shift($paths); } $var = array(); if(C('URL_PARAMS_BIND') && 1 == C('URL_PARAMS_BIND_TYPE')){ $var = $paths; }else{ preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){$var[$match[1]]=strip_tags($match[2]);}, implode('/',$paths)); } $_GET = array_merge($var,$_GET); } define('CONTROLLER_PATH', self::getSpace($varAddon,$urlCase)); define('CONTROLLER_NAME', defined('BIND_CONTROLLER')? BIND_CONTROLLER : self::getController($varController,$urlCase)); define('ACTION_NAME', defined('BIND_ACTION')? BIND_ACTION : self::getAction($varAction,$urlCase)); $controllerName = defined('CONTROLLER_ALIAS')? CONTROLLER_ALIAS : CONTROLLER_NAME; define('__CONTROLLER__',__MODULE__.$depr.(defined('BIND_CONTROLLER')? '': ( $urlCase ? parse_name($controllerName) : $controllerName )) ); define('__ACTION__',__CONTROLLER__.$depr.(defined('ACTION_ALIAS')?ACTION_ALIAS:ACTION_NAME)); $_REQUEST = array_merge($_POST,$_GET,$_COOKIE); } static private function getSpace($var,$urlCase) { $space = !empty($_GET[$var])?strip_tags($_GET[$var]):''; unset($_GET[$var]); return $space; } static private function getController($var,$urlCase) { $controller = (!empty($_GET[$var])? $_GET[$var]:C('DEFAULT_CONTROLLER')); unset($_GET[$var]); if($maps = C('URL_CONTROLLER_MAP')) { if(isset($maps[strtolower($controller)])) { define('CONTROLLER_ALIAS',strtolower($controller)); return ucfirst($maps[CONTROLLER_ALIAS]); }elseif(array_search(strtolower($controller),$maps)){ return ''; } } if($urlCase) { $controller = parse_name($controller,1); } return strip_tags(ucfirst($controller)); } static private function getAction($var,$urlCase) { $action = !empty($_POST[$var]) ? $_POST[$var] : (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_ACTION')); unset($_POST[$var],$_GET[$var]); if($maps = C('URL_ACTION_MAP')) { if(isset($maps[strtolower(CONTROLLER_NAME)])) { $maps = $maps[strtolower(CONTROLLER_NAME)]; if(isset($maps[strtolower($action)])) { define('ACTION_ALIAS',strtolower($action)); if(is_array($maps[ACTION_ALIAS])){ parse_str($maps[ACTION_ALIAS][1],$vars); $_GET = array_merge($_GET,$vars); return $maps[ACTION_ALIAS][0]; }else{ return $maps[ACTION_ALIAS]; } }elseif(array_search(strtolower($action),$maps)){ return ''; } } } return strip_tags( $urlCase? strtolower($action) : $action ); } static private function getModule($var) { $module = (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_MODULE')); unset($_GET[$var]); if($maps = C('URL_MODULE_MAP')) { if(isset($maps[strtolower($module)])) { define('MODULE_ALIAS',strtolower($module)); return ucfirst($maps[MODULE_ALIAS]); }elseif(array_search(strtolower($module),$maps)){ return ''; } } return strip_tags(ucfirst($module)); } }}namespace Think{ class Route { public static function check(){ $depr = C('URL_PATHINFO_DEPR'); $regx = preg_replace('/\.'.__EXT__.'$/i','',trim($_SERVER['PATH_INFO'],$depr)); if('/' != $depr){ $regx = str_replace($depr,'/',$regx); } $maps = C('URL_MAP_RULES'); if(isset($maps[$regx])) { $var = self::parseUrl($maps[$regx]); $_GET = array_merge($var, $_GET); return true; } $routes = C('URL_ROUTE_RULES'); if(!empty($routes)) { foreach ($routes as $rule=>$route){ if(is_numeric($rule)){ $rule = array_shift($route); } if(is_array($route) && isset($route[2])){ $options = $route[2]; if(isset($options['ext']) && __EXT__ != $options['ext']){ continue; } if(isset($options['method']) && REQUEST_METHOD != strtoupper($options['method'])){ continue; } if(!empty($options['callback']) && is_callable($options['callback'])) { if(false === call_user_func($options['callback'])) { continue; } } } if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { if($route instanceof \Closure) { $result = self::invokeRegx($route, $matches); return is_bool($result) ? $result : exit; }else{ return self::parseRegex($matches,$route,$regx); } }else{ $len1 = substr_count($regx,'/'); $len2 = substr_count($rule,'/'); if($len1>=$len2 || strpos($rule,'[')) { if('$' == substr($rule,-1,1)) { if($len1 != $len2) { continue; }else{ $rule = substr($rule,0,-1); } } $match = self::checkUrlMatch($regx,$rule); if(false !== $match) { if($route instanceof \Closure) { $result = self::invokeRule($route, $match); return is_bool($result) ? $result : exit; }else{ return self::parseRule($rule,$route,$regx); } } } } } } return false; } private static function checkUrlMatch($regx,$rule) { $m1 = explode('/',$regx); $m2 = explode('/',$rule); $var = array(); foreach ($m2 as $key=>$val){ if(0 === strpos($val,'[:')){ $val = substr($val,1,-1); } if(':' == substr($val,0,1)) { if($pos = strpos($val,'|')){ $val = substr($val,1,$pos-1); } if(strpos($val,'\\')) { $type = substr($val,-1); if('d'==$type) { if(isset($m1[$key]) && !is_numeric($m1[$key])) return false; } $name = substr($val, 1, -2); }elseif($pos = strpos($val,'^')){ $array = explode('-',substr(strstr($val,'^'),1)); if(in_array($m1[$key],$array)) { return false; } $name = substr($val, 1, $pos - 1); }else{ $name = substr($val, 1); } $var[$name] = isset($m1[$key])?$m1[$key]:''; }elseif(0 !== strcasecmp($val,$m1[$key])){ return false; } } return $var; } private static 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_CONTROLLER')] = array_pop($path); } if(!empty($path)) { $var[C('VAR_MODULE')] = array_pop($path); } } return $var; } private static function parseRule($rule,$route,$regx) { $url = is_array($route)?$route[0]:$route; $paths = explode('/',$regx); $matches = array(); $rule = explode('/',$rule); foreach ($rule as $item){ $fun = ''; if(0 === strpos($item,'[:')){ $item = substr($item,1,-1); } if(0===strpos($item,':')) { if($pos = strpos($item,'|')){ $fun = substr($item,$pos+1); $item = substr($item,0,$pos); } 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] = !empty($fun)? $fun(array_shift($paths)) : 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_callback('/:(\d+)/', function($match) use($values){ return $values[$match[1] - 1]; }, $url); } header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301); exit; }else{ $var = self::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(!empty($paths)) { preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){ $var[strtolower($match[1])]=strip_tags($match[2]);}, implode('/',$paths)); } if(is_array($route) && isset($route[1])) { if(is_array($route[1])){ $params = $route[1]; }else{ parse_str($route[1],$params); } $var = array_merge($var,$params); } $_GET = array_merge($var,$_GET); } return true; } private static function parseRegex($matches,$route,$regx) { $url = is_array($route)?$route[0]:$route; $url = preg_replace_callback('/:(\d+)/', function($match) use($matches){return $matches[$match[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 = self::parseUrl($url); foreach($var as $key=>$val){ if(strpos($val,'|')){ list($val,$fun) = explode('|',$val); $var[$key] = $fun($val); } } $regx = substr_replace($regx,'',0,strlen($matches[0])); if($regx) { preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){ $var[strtolower($match[1])] = strip_tags($match[2]); }, $regx); } if(is_array($route) && isset($route[1])) { if(is_array($route[1])){ $params = $route[1]; }else{ parse_str($route[1],$params); } $var = array_merge($var,$params); } $_GET = array_merge($var,$_GET); } return true; } static private function invokeRegx($closure, $var = array()) { $reflect = new \ReflectionFunction($closure); $params = $reflect->getParameters(); $args = array(); array_shift($var); foreach ($params as $param){ if(!empty($var)) { $args[] = array_shift($var); }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); } } return $reflect->invokeArgs($args); } static private function invokeRule($closure, $var = array()) { $reflect = new \ReflectionFunction($closure); $params = $reflect->getParameters(); $args = array(); foreach ($params as $param){ $name = $param->getName(); if(isset($var[$name])) { $args[] = $var[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); } } return $reflect->invokeArgs($args); } }}namespace Think{ abstract class Controller { protected $view = null; protected $config = array(); public function __construct() { Hook::listen('action_begin',$this->config); $this->view = Think::instance('Think\View'); if(method_exists($this,'_initialize')) $this->_initialize(); } protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { $this->view->display($templateFile,$charset,$contentType,$content,$prefix); } protected function show($content,$charset='',$contentType='',$prefix='') { $this->view->display('',$charset,$contentType,$content,$prefix); } protected function fetch($templateFile='',$content='',$prefix='') { return $this->view->fetch($templateFile,$content,$prefix); } protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') { $content = $this->fetch($templateFile); $htmlpath = !empty($htmlpath)?$htmlpath:HTML_PATH; $htmlfile = $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX'); Storage::put($htmlfile,$content,'html'); return $content; } protected function theme($theme){ $this->view->theme($theme); return $this; } protected function assign($name,$value='') { $this->view->assign($name,$value); return $this; } public function __set($name,$value) { $this->assign($name,$value); } public function get($name='') { return $this->view->get($name); } public function __get($name) { return $this->get($name); } public function __isset($name) { return $this->get($name); } public function __call($method,$args) { if( 0 === strcasecmp($method,ACTION_NAME.C('ACTION_SUFFIX'))) { if(method_exists($this,'_empty')) { $this->_empty($method,$args); }elseif(file_exists_case($this->view->parseTemplate())){ $this->display(); }else{ E(L('_ERROR_ACTION_').':'.ACTION_NAME); } }else{ E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); return; } } protected function error($message='',$jumpUrl='',$ajax=false) { $this->dispatchJump($message,0,$jumpUrl,$ajax); } protected function success($message='',$jumpUrl='',$ajax=false) { $this->dispatchJump($message,1,$jumpUrl,$ajax); } protected function ajaxReturn($data,$type='',$json_option=0) { if(empty($type)) $type = C('DEFAULT_AJAX_RETURN'); switch (strtoupper($type)){ case 'JSON' : header('Content-Type:application/json; charset=utf-8'); exit(json_encode($data,$json_option)); case 'XML' : header('Content-Type:text/xml; charset=utf-8'); exit(xml_encode($data)); case 'JSONP': header('Content-Type:application/json; charset=utf-8'); $handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER'); exit($handler.'('.json_encode($data,$json_option).');'); case 'EVAL' : header('Content-Type:text/html; charset=utf-8'); exit($data); default : Hook::listen('ajax_return',$data); } } protected function redirect($url,$params=array(),$delay=0,$msg='') { $url = U($url,$params); redirect($url,$delay,$msg); } private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false) { if(true === $ajax || IS_AJAX) { $data = is_array($ajax)?$ajax:array(); $data['info'] = $message; $data['status'] = $status; $data['url'] = $jumpUrl; $this->ajaxReturn($data); } if(is_int($ajax)) $this->assign('waitSecond',$ajax); if(!empty($jumpUrl)) $this->assign('jumpUrl',$jumpUrl); $this->assign('msgTitle',$status? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_')); if($this->get('closeWin')) $this->assign('jumpUrl','javascript:window.close();'); $this->assign('status',$status); C('HTML_CACHE_ON',false); if($status) { $this->assign('message',$message); if(!isset($this->waitSecond)) $this->assign('waitSecond','1'); if(!isset($this->jumpUrl)) $this->assign("jumpUrl",$_SERVER["HTTP_REFERER"]); $this->display(C('TMPL_ACTION_SUCCESS')); }else{ $this->assign('error',$message); if(!isset($this->waitSecond)) $this->assign('waitSecond','3'); if(!isset($this->jumpUrl)) $this->assign('jumpUrl',"javascript:history.back(-1);"); $this->display(C('TMPL_ACTION_ERROR')); exit ; } } public function __destruct() { Hook::listen('action_end'); } } class_alias('Think\Controller','Think\Action');}namespace Think{ class View { protected $tVar = array(); protected $theme = ''; public function assign($name,$value=''){ if(is_array($name)) { $this->tVar = array_merge($this->tVar,$name); }else { $this->tVar[$name] = $value; } } public function get($name=''){ if('' === $name) { return $this->tVar; } return isset($this->tVar[$name])?$this->tVar[$name]:false; } public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { G('viewStartTime'); Hook::listen('view_begin',$templateFile); $content = $this->fetch($templateFile,$content,$prefix); $this->render($content,$charset,$contentType); Hook::listen('view_end'); } private function render($content,$charset='',$contentType=''){ if(empty($charset)) $charset = C('DEFAULT_CHARSET'); if(empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE'); header('Content-Type:'.$contentType.'; charset='.$charset); header('Cache-control: '.C('HTTP_CACHE_CONTROL')); header('X-Powered-By:ThinkPHP'); echo $content; } public function fetch($templateFile='',$content='',$prefix='') { if(empty($content)) { $templateFile = $this->parseTemplate($templateFile); if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile); }else{ defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath()); } ob_start(); ob_implicit_flush(0); if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { $_content = $content; extract($this->tVar, EXTR_OVERWRITE); empty($_content)?include $templateFile:eval('?>'.$_content); }else{ $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix); Hook::listen('view_parse',$params); } $content = ob_get_clean(); Hook::listen('view_filter',$content); return $content; } public function parseTemplate($template='') { if(is_file($template)) { return $template; } $depr = C('TMPL_FILE_DEPR'); $template = str_replace(':', $depr, $template); $module = MODULE_NAME; if(strpos($template,'@')){ list($module,$template) = explode('@',$template); } defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath($module)); if('' == $template) { $template = CONTROLLER_NAME . $depr . ACTION_NAME; }elseif(false === strpos($template, $depr)){ $template = CONTROLLER_NAME . $depr . $template; } $file = THEME_PATH.$template.C('TMPL_TEMPLATE_SUFFIX'); if(C('TMPL_LOAD_DEFAULTTHEME') && THEME_NAME != C('DEFAULT_THEME') && !is_file($file)){ $file = dirname(THEME_PATH).'/'.C('DEFAULT_THEME').'/'.$template.C('TMPL_TEMPLATE_SUFFIX'); } return $file; } protected function getThemePath($module=MODULE_NAME){ $theme = $this->getTemplateTheme(); $tmplPath = C('VIEW_PATH'); if(!$tmplPath){ $tmplPath = defined('TMPL_PATH')? TMPL_PATH.$module.'/' : APP_PATH.$module.'/'.C('DEFAULT_V_LAYER').'/'; } return $tmplPath.$theme; } public function theme($theme){ $this->theme = $theme; return $this; } private function getTemplateTheme() { if($this->theme) { $theme = $this->theme; }else{ $theme = C('DEFAULT_THEME'); if(C('TMPL_DETECT_THEME')) { $t = C('VAR_TEMPLATE'); if (isset($_GET[$t])){ $theme = $_GET[$t]; }elseif(cookie('think_template')){ $theme = cookie('think_template'); } if(!in_array($theme,explode(',',C('THEME_LIST')))){ $theme = C('DEFAULT_THEME'); } cookie('think_template',$theme,864000); } } defined('THEME_NAME') || define('THEME_NAME', $theme); return $theme?$theme . '/':''; } }}namespace Behavior{ class BuildLiteBehavior { public function run(&$params) { if(!defined('BUILD_LITE_FILE')) return ; $litefile = C('RUNTIME_LITE_FILE',null,RUNTIME_PATH.'lite.php'); if(is_file($litefile)) return; $defs = get_defined_constants(TRUE); $content = 'namespace {$GLOBALS[\'_beginTime\'] = microtime(TRUE);'; if(MEMORY_LIMIT_ON) { $content .= '$GLOBALS[\'_startUseMems\'] = memory_get_usage();'; } unset($defs['user']['BUILD_LITE_FILE']); $content .= $this->buildArrayDefine($defs['user']).'}'; $filelist = is_file(CONF_PATH.'lite.php')? include CONF_PATH.'lite.php': array( THINK_PATH.'Common/functions.php', COMMON_PATH.'Common/function.php', CORE_PATH . 'Think'.EXT, CORE_PATH . 'Hook'.EXT, CORE_PATH . 'App'.EXT, CORE_PATH . 'Dispatcher'.EXT, CORE_PATH . 'Log'.EXT, CORE_PATH . 'Log/Driver/File'.EXT, CORE_PATH . 'Route'.EXT, CORE_PATH . 'Controller'.EXT, CORE_PATH . 'View'.EXT, CORE_PATH . 'Storage'.EXT, CORE_PATH . 'Storage/Driver/File'.EXT, CORE_PATH . 'Exception'.EXT, BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT, BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT, ); foreach ($filelist as $file){ if(is_file($file)) { $content .= compile($file); } } $content = preg_replace('/\$runtimefile = RUNTIME_PATH(.+?)(if\(APP_STATUS)/','\2',$content,1); $content .= "\nnamespace { Think\Think::addMap(".var_export(\Think\Think::getMap(),true).");"; $content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(\Think\Hook::get(),true).');Think\Think::start();}'; file_put_contents($litefile,strip_whitespace(' $val) { $key = strtoupper($key); $content .= 'defined(\'' . $key . '\') or '; if (is_int($val) || is_float($val)) { $content .= "define('" . $key . "'," . $val . ');'; } elseif (is_bool($val)) { $val = ($val) ? 'true' : 'false'; $content .= "define('" . $key . "'," . $val . ');'; } elseif (is_string($val)) { $content .= "define('" . $key . "','" . addslashes($val) . "');"; } $content .= "\n"; } return $content; } }}namespace Behavior{ use Think\Storage; use Think\Think; class ParseTemplateBehavior { public function run(&$_data){ $engine = strtolower(C('TMPL_ENGINE_TYPE')); $_content = empty($_data['content'])?$_data['file']:$_data['content']; $_data['prefix'] = !empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX'); if('think'==$engine){ if((!empty($_data['content']) && $this->checkContentCache($_data['content'],$_data['prefix'])) || $this->checkCache($_data['file'],$_data['prefix'])) { Storage::load(C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX'),$_data['var']); }else{ $tpl = Think::instance('Think\\Template'); $tpl->fetch($_content,$_data['var'],$_data['prefix']); } }else{ if(strpos($engine,'\\')){ $class = $engine; }else{ $class = 'Think\\Template\\Driver\\'.ucwords($engine); } if(class_exists($class)) { $tpl = new $class; $tpl->fetch($_content,$_data['var']); }else { E(L('_NOT_SUPPORT_').': ' . $class); } } } protected function checkCache($tmplTemplateFile,$prefix='') { if (!C('TMPL_CACHE_ON')) return false; $tmplCacheFile = C('CACHE_PATH').$prefix.md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX'); if(!Storage::has($tmplCacheFile)){ return false; }elseif (filemtime($tmplTemplateFile) > Storage::get($tmplCacheFile,'mtime')) { return false; }elseif (C('TMPL_CACHE_TIME') != 0 && time() > Storage::get($tmplCacheFile,'mtime')+C('TMPL_CACHE_TIME')) { return false; } if(C('LAYOUT_ON')) { $layoutFile = THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX'); if(filemtime($layoutFile) > Storage::get($tmplCacheFile,'mtime')) { return false; } } return true; } protected function checkContentCache($tmplContent,$prefix='') { if(Storage::has(C('CACHE_PATH').$prefix.md5($tmplContent).C('TMPL_CACHFILE_SUFFIX'))){ return true; }else{ return false; } } }}namespace Behavior{ class ContentReplaceBehavior { public function run(&$content){ $content = $this->templateContentReplace($content); } protected function templateContentReplace($content) { $replace = array( '__ROOT__' => __ROOT__, '__APP__' => __APP__, '__MODULE__' => __MODULE__, '__ACTION__' => __ACTION__, '__SELF__' => __SELF__, '__CONTROLLER__'=> __CONTROLLER__, '__URL__' => __CONTROLLER__, '__PUBLIC__' => __ROOT__.'/Public', ); if(is_array(C('TMPL_PARSE_STRING')) ) $replace = array_merge($replace,C('TMPL_PARSE_STRING')); $content = str_replace(array_keys($replace),array_values($replace),$content); return $content; } }} namespace { Think\Think::addMap(array ( 'Think\\Log' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Log.class.php', 'Think\\Log\\Driver\\File' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Log/Driver/File.class.php', 'Think\\Exception' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Exception.class.php', 'Think\\Model' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Model.class.php', 'Think\\Db' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Db.class.php', 'Think\\Template' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Template.class.php', 'Think\\Cache' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Cache.class.php', 'Think\\Cache\\Driver\\File' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Cache/Driver/File.class.php', 'Think\\Storage' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP\\Library/Think/Storage.class.php', )); L(array ( '_MODULE_NOT_EXIST_' => '无法加载模块', '_CONTROLLER_NOT_EXIST_' => '无法加载控制器', '_ERROR_ACTION_' => '非法操作', '_LANGUAGE_NOT_LOAD_' => '无法加载语言包', '_TEMPLATE_NOT_EXIST_' => '模板不存在', '_MODULE_' => '模块', '_ACTION_' => '操作', '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义', '_VALID_ACCESS_' => '没有权限', '_XML_TAG_ERROR_' => 'XML标签语法错误', '_DATA_TYPE_INVALID_' => '非法数据对象!', '_OPERATION_WRONG_' => '操作出现错误', '_NOT_LOAD_DB_' => '无法加载数据库', '_NO_DB_DRIVER_' => '无法加载数据库驱动', '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库', '_NO_DB_CONFIG_' => '没有定义数据库配置', '_NOT_SUPPORT_' => '系统不支持', '_CACHE_TYPE_INVALID_' => '无法加载缓存类型', '_FILE_NOT_WRITABLE_' => '目录(文件)不可写', '_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代码', '_PARAM_ERROR_' => '参数错误或者未定义', '_ERROR_QUERY_EXPRESS_' => '错误的查询条件', )); C(array ( 'APP_USE_NAMESPACE' => true, 'APP_SUB_DOMAIN_DEPLOY' => false, 'APP_SUB_DOMAIN_RULES' => array ( ), 'APP_DOMAIN_SUFFIX' => '', 'ACTION_SUFFIX' => '', 'MULTI_MODULE' => true, 'MODULE_DENY_LIST' => array ( 0 => 'Common', 1 => 'Runtime', ), 'CONTROLLER_LEVEL' => 1, 'APP_AUTOLOAD_LAYER' => 'Controller,Model', 'APP_AUTOLOAD_PATH' => '', 'COOKIE_EXPIRE' => 0, 'COOKIE_DOMAIN' => '', 'COOKIE_PATH' => '/', 'COOKIE_PREFIX' => '', 'COOKIE_SECURE' => false, 'COOKIE_HTTPONLY' => '', 'DEFAULT_M_LAYER' => 'Model', 'DEFAULT_C_LAYER' => 'Controller', 'DEFAULT_V_LAYER' => 'View', 'DEFAULT_LANG' => 'zh-cn', 'DEFAULT_THEME' => '', 'DEFAULT_MODULE' => 'Home', 'DEFAULT_CONTROLLER' => 'Index', 'DEFAULT_ACTION' => 'index', 'DEFAULT_CHARSET' => 'utf-8', 'DEFAULT_TIMEZONE' => 'PRC', 'DEFAULT_AJAX_RETURN' => 'JSON', 'DEFAULT_JSONP_HANDLER' => 'jsonpReturn', 'DEFAULT_FILTER' => 'htmlspecialchars', 'DB_TYPE' => '', 'DB_HOST' => '', 'DB_NAME' => '', 'DB_USER' => '', 'DB_PWD' => '', 'DB_PORT' => '', 'DB_PREFIX' => '', 'DB_PARAMS' => array ( ), 'DB_DEBUG' => true, 'DB_FIELDS_CACHE' => true, 'DB_CHARSET' => 'utf8', 'DB_DEPLOY_TYPE' => 0, 'DB_RW_SEPARATE' => false, 'DB_MASTER_NUM' => 1, 'DB_SLAVE_NO' => '', 'DATA_CACHE_TIME' => 0, 'DATA_CACHE_COMPRESS' => false, 'DATA_CACHE_CHECK' => false, 'DATA_CACHE_PREFIX' => '', 'DATA_CACHE_TYPE' => 'File', 'DATA_CACHE_PATH' => './Application/Runtime/Temp/', 'DATA_CACHE_KEY' => '', 'DATA_CACHE_SUBDIR' => false, 'DATA_PATH_LEVEL' => 1, 'ERROR_MESSAGE' => '页面错误!请稍后再试~', 'ERROR_PAGE' => '', 'SHOW_ERROR_MSG' => true, 'TRACE_MAX_RECORD' => 100, 'LOG_RECORD' => false, 'LOG_TYPE' => 'File', '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' => '', 'TMPL_CONTENT_TYPE' => 'text/html', 'TMPL_ACTION_ERROR' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP/Tpl/dispatch_jump.tpl', 'TMPL_ACTION_SUCCESS' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP/Tpl/dispatch_jump.tpl', 'TMPL_EXCEPTION_FILE' => 'C:\\phpStudy\\WWW\\dev\\ThinkPHP/Tpl/think_exception.tpl', 'TMPL_DETECT_THEME' => false, 'TMPL_TEMPLATE_SUFFIX' => '.html', 'TMPL_FILE_DEPR' => '/', '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_PREFIX' => '', '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' => '', 'URL_CASE_INSENSITIVE' => true, 'URL_MODEL' => 0, 'URL_PATHINFO_DEPR' => '/', 'URL_PATHINFO_FETCH' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', 'URL_REQUEST_URI' => 'REQUEST_URI', 'URL_HTML_SUFFIX' => 'html', 'URL_DENY_SUFFIX' => 'ico|png|gif|jpg', 'URL_PARAMS_BIND' => true, 'URL_PARAMS_BIND_TYPE' => 0, 'URL_PARAMS_FILTER' => false, 'URL_PARAMS_FILTER_TYPE' => '', 'URL_ROUTER_ON' => false, 'URL_ROUTE_RULES' => array ( ), 'URL_MAP_RULES' => array ( ), 'VAR_MODULE' => 'm', 'VAR_ADDON' => 'addon', 'VAR_CONTROLLER' => 'c', 'VAR_ACTION' => 'a', 'VAR_AJAX_SUBMIT' => 'ajax', 'VAR_JSONP_HANDLER' => 'callback', 'VAR_PATHINFO' => 's', 'VAR_TEMPLATE' => 't', 'VAR_AUTO_STRING' => false, 'HTTP_CACHE_CONTROL' => 'private', 'CHECK_APP_DIR' => true, 'FILE_UPLOAD_TYPE' => 'Local', 'DATA_CRYPT_TYPE' => 'Think', 'MODULE_ALLOW_LIST' => array ( 0 => 'Home', 1 => 'Admin', ), 'LOAD_EXT_CONFIG' => 'db', 'SUPER_ADMIN_ID' => 1, 'DEFAULT_SCORE' => 100, 'MAIL_ADDRESS' => 'xxxx@126.com', 'MAIL_SMTP' => 'smtp.126.com', 'MAIL_LOGINNAME' => 'xxxxx', 'MAIL_PASSWORD' => 'xxxxx', 'MAIL_CHARSET' => 'UTF-8', 'MAIL_AUTH' => true, 'MAIL_HTML' => true, ));Think\Hook::import(array ( 'app_init' => array ( 0 => 'Behavior\\BuildLiteBehavior', ), 'app_begin' => array ( 0 => 'Behavior\\ReadHtmlCacheBehavior', ), 'app_end' => array ( 0 => 'Behavior\\ShowPageTraceBehavior', ), 'view_parse' => array ( 0 => 'Behavior\\ParseTemplateBehavior', ), 'template_filter' => array ( 0 => 'Behavior\\ContentReplaceBehavior', ), 'view_filter' => array ( 0 => 'Behavior\\WriteHtmlCacheBehavior', ), ));}
\ No newline at end of file
+' == substr($content, -2)) $content = substr($content, 0, -2); return $content.'}'; } function T($template='',$layer=''){ if(false === strpos($template,'://')){ $template = 'http://'.str_replace(':', '/',$template); } $info = parse_url($template); $file = $info['host'].(isset($info['path'])?$info['path']:''); $module = isset($info['user'])?$info['user'].'/':MODULE_NAME.'/'; $extend = $info['scheme']; $layer = $layer?$layer:C('DEFAULT_V_LAYER'); $auto = C('AUTOLOAD_NAMESPACE'); if($auto && isset($auto[$extend])){ $baseUrl = $auto[$extend].$module.$layer.'/'; }elseif(C('VIEW_PATH')){ $baseUrl = C('VIEW_PATH'); }elseif(defined('TMPL_PATH')){ $baseUrl = TMPL_PATH.$module; }else{ $baseUrl = APP_PATH.$module.$layer.'/'; } $theme = substr_count($file,'/')<2 ? C('DEFAULT_THEME') : ''; $depr = C('TMPL_FILE_DEPR'); if('' == $file) { $file = CONTROLLER_NAME . $depr . ACTION_NAME; }elseif(false === strpos($file, '/')){ $file = CONTROLLER_NAME . $depr . $file; }elseif('/' != $depr){ $file = substr_count($file,'/')>1 ? substr_replace($file,$depr,strrpos($file,'/'),1) : str_replace('/', $depr, $file); } return $baseUrl.($theme?$theme.'/':'').$file.C('TMPL_TEMPLATE_SUFFIX'); } function I($name,$default='',$filter=null,$datas=null) { static $_PUT = null; if(strpos($name,'/')){ list($name,$type) = explode('/',$name,2); }elseif(C('VAR_AUTO_STRING')){ $type = 's'; } if(strpos($name,'.')) { list($method,$name) = explode('.',$name,2); }else{ $method = 'param'; } switch(strtolower($method)) { case 'get' : $input =& $_GET; break; case 'post' : $input =& $_POST; break; case 'put' : if(is_null($_PUT)){ parse_str(file_get_contents('php://input'), $_PUT); } $input = $_PUT; break; case 'param' : switch($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': if(is_null($_PUT)){ parse_str(file_get_contents('php://input'), $_PUT); } $input = $_PUT; break; default: $input = $_GET; } break; case 'path' : $input = array(); if(!empty($_SERVER['PATH_INFO'])){ $depr = C('URL_PATHINFO_DEPR'); $input = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); } break; case 'request' : $input =& $_REQUEST; break; case 'session' : $input =& $_SESSION; break; case 'cookie' : $input =& $_COOKIE; break; case 'server' : $input =& $_SERVER; break; case 'globals' : $input =& $GLOBALS; break; case 'data' : $input =& $datas; break; default: return null; } if(''==$name) { $data = $input; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { if(is_string($filters)){ $filters = explode(',',$filters); } foreach($filters as $filter){ $data = array_map_recursive($filter,$data); } } }elseif(isset($input[$name])) { $data = $input[$name]; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { if(is_string($filters)){ if(0 === strpos($filters,'/')){ if(1 !== preg_match($filters,(string)$data)){ return isset($default) ? $default : null; } }else{ $filters = explode(',',$filters); } }elseif(is_int($filters)){ $filters = array($filters); } if(is_array($filters)){ foreach($filters as $filter){ if(function_exists($filter)) { $data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); }else{ $data = filter_var($data,is_int($filter) ? $filter : filter_id($filter)); if(false === $data) { return isset($default) ? $default : null; } } } } } if(!empty($type)){ switch(strtolower($type)){ case 'a': $data = (array)$data; break; case 'd': $data = (int)$data; break; case 'f': $data = (float)$data; break; case 'b': $data = (boolean)$data; break; case 's': default: $data = (string)$data; } } }else{ $data = isset($default)?$default:null; } is_array($data) && array_walk_recursive($data,'think_filter'); return $data; } function array_map_recursive($filter, $data) { $result = array(); foreach ($data as $key => $val) { $result[$key] = is_array($val) ? array_map_recursive($filter, $val) : call_user_func($filter, $val); } return $result; } function N($key, $step=0,$save=false) { static $_num = array(); if (!isset($_num[$key])) { $_num[$key] = (false !== $save)? S('N_'.$key) : 0; } if (empty($step)){ return $_num[$key]; }else{ $_num[$key] = $_num[$key] + (int)$step; } if(false !== $save){ S('N_'.$key,$_num[$key],$save); } return null; } function parse_name($name, $type=0) { if ($type) { return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name)); } else { return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_")); } } function require_cache($filename) { static $_importFiles = array(); if (!isset($_importFiles[$filename])) { if (file_exists_case($filename)) { require $filename; $_importFiles[$filename] = true; } else { $_importFiles[$filename] = false; } } return $_importFiles[$filename]; } function file_exists_case($filename) { if (is_file($filename)) { if (IS_WIN && APP_DEBUG) { if (basename(realpath($filename)) != basename($filename)) return false; } return true; } return false; } function import($class, $baseUrl = '', $ext=EXT) { static $_file = array(); $class = str_replace(array('.', '#'), array('/', '.'), $class); if (isset($_file[$class . $baseUrl])) return true; else $_file[$class . $baseUrl] = true; $class_strut = explode('/', $class); if (empty($baseUrl)) { if ('@' == $class_strut[0] || MODULE_NAME == $class_strut[0]) { $baseUrl = MODULE_PATH; $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1); }elseif ('Common' == $class_strut[0]) { $baseUrl = COMMON_PATH; $class = substr($class, 7); }elseif (in_array($class_strut[0],array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$class_strut[0])) { $baseUrl = LIB_PATH; }else { $baseUrl = APP_PATH; } } if (substr($baseUrl, -1) != '/') $baseUrl .= '/'; $classfile = $baseUrl . $class . $ext; if (!class_exists(basename($class),false)) { return require_cache($classfile); } return null; } function load($name, $baseUrl='', $ext='.php') { $name = str_replace(array('.', '#'), array('/', '.'), $name); if (empty($baseUrl)) { if (0 === strpos($name, '@/')) { $baseUrl = MODULE_PATH.'Common/'; $name = substr($name, 2); } else { $array = explode('/', $name); $baseUrl = APP_PATH . array_shift($array).'/Common/'; $name = implode('/',$array); } } 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 D($name='',$layer='') { if(empty($name)) return new Think\Model; static $_model = array(); $layer = $layer? : C('DEFAULT_M_LAYER'); if(isset($_model[$name.$layer])) return $_model[$name.$layer]; $class = parse_res_name($name,$layer); if(class_exists($class)) { $model = new $class(basename($name)); }elseif(false === strpos($name,'/')){ if(!C('APP_USE_NAMESPACE')){ import('Common/'.$layer.'/'.$class); }else{ $class = '\\Common\\'.$layer.'\\'.$name.$layer; } $model = class_exists($class)? new $class($name) : new Think\Model($name); }else { Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE); $model = new Think\Model(basename($name)); } $_model[$name.$layer] = $model; return $model; } function M($name='', $tablePrefix='',$connection='') { static $_model = array(); if(strpos($name,':')) { list($class,$name) = explode(':',$name); }else{ $class = 'Think\\Model'; } $guid = (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class; if (!isset($_model[$guid])) $_model[$guid] = new $class($name,$tablePrefix,$connection); return $_model[$guid]; } function parse_res_name($name,$layer,$level=1){ if(strpos($name,'://')) { list($extend,$name) = explode('://',$name); }else{ $extend = ''; } if(strpos($name,'/') && substr_count($name, '/')>=$level){ list($module,$name) = explode('/',$name,2); }else{ $module = defined('MODULE_NAME') ? MODULE_NAME : '' ; } $array = explode('/',$name); if(!C('APP_USE_NAMESPACE')){ $class = parse_name($name, 1); import($module.'/'.$layer.'/'.$class.$layer); }else{ $class = $module.'\\'.$layer; foreach($array as $name){ $class .= '\\'.parse_name($name, 1); } if($extend){ $class = $extend.'\\'.$class; } } return $class.$layer; } function controller($name,$path=''){ $layer = C('DEFAULT_C_LAYER'); if(!C('APP_USE_NAMESPACE')){ $class = parse_name($name, 1).$layer; import(MODULE_NAME.'/'.$layer.'/'.$class); }else{ $class = ( $path ? basename(ADDON_PATH).'\\'.$path : MODULE_NAME ).'\\'.$layer; $array = explode('/',$name); foreach($array as $name){ $class .= '\\'.parse_name($name, 1); } $class .= $layer; } if(class_exists($class)) { return new $class(); }else { return false; } } function A($name,$layer='',$level=0) { static $_action = array(); $layer = $layer? : C('DEFAULT_C_LAYER'); $level = $level? : ($layer == C('DEFAULT_C_LAYER')?C('CONTROLLER_LEVEL'):1); if(isset($_action[$name.$layer])) return $_action[$name.$layer]; $class = parse_res_name($name,$layer,$level); if(class_exists($class)) { $action = new $class(); $_action[$name.$layer] = $action; return $action; }else { return false; } } function R($url,$vars=array(),$layer='') { $info = pathinfo($url); $action = $info['basename']; $module = $info['dirname']; $class = A($module,$layer); if($class){ if(is_string($vars)) { parse_str($vars,$vars); } return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars); }else{ return false; } } function tag($tag, &$params=NULL) { \Think\Hook::listen($tag,$params); } function B($name, $tag='',&$params=NULL) { if(''==$tag){ $name .= 'Behavior'; } return \Think\Hook::exec($name,$tag,$params); } 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 .= "<<' . $label . htmlspecialchars($output, ENT_QUOTES) . ''; } else { $output = $label . print_r($var, true); } } else { ob_start(); var_dump($var); $output = ob_get_clean(); if (!extension_loaded('xdebug')) { $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); $output = '' . $label . htmlspecialchars($output, ENT_QUOTES) . ' '; } } if ($echo) { echo($output); return null; }else return $output; } function layout($layout) { if(false !== $layout) { C('LAYOUT_ON',true); if(is_string($layout)) { C('LAYOUT_NAME',$layout); } }else{ C('LAYOUT_ON',false); } } function U($url='',$vars='',$suffix=true,$domain=false) { $info = parse_url($url); $url = !empty($info['path'])?$info['path']:ACTION_NAME; if(isset($info['fragment'])) { $anchor = $info['fragment']; if(false !== strpos($anchor,'?')) { list($anchor,$info['query']) = explode('?',$anchor,2); } if(false !== strpos($anchor,'@')) { list($anchor,$host) = explode('@',$anchor, 2); } }elseif(false !== strpos($url,'@')) { list($url,$host) = explode('@',$info['path'], 2); } if(isset($host)) { $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.')); }elseif($domain===true){ $domain = $_SERVER['HTTP_HOST']; if(C('APP_SUB_DOMAIN_DEPLOY') ) { $domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.'); foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) { $rule = is_array($rule)?$rule[0]:$rule; if(false === strpos($key,'*') && 0=== strpos($url,$rule)) { $domain = $key.strstr($domain,'.'); $url = substr_replace($url,'',0,strlen($rule)); break; } } } } if(is_string($vars)) { parse_str($vars,$vars); }elseif(!is_array($vars)){ $vars = array(); } if(isset($info['query'])) { parse_str($info['query'],$params); $vars = array_merge($params,$vars); } $depr = C('URL_PATHINFO_DEPR'); $urlCase = C('URL_CASE_INSENSITIVE'); if($url) { if(0=== strpos($url,'/')) { $route = true; $url = substr($url,1); if('/' != $depr) { $url = str_replace('/',$depr,$url); } }else{ if('/' != $depr) { $url = str_replace('/',$depr,$url); } $url = trim($url,$depr); $path = explode($depr,$url); $var = array(); $varModule = C('VAR_MODULE'); $varController = C('VAR_CONTROLLER'); $varAction = C('VAR_ACTION'); $var[$varAction] = !empty($path)?array_pop($path):ACTION_NAME; $var[$varController] = !empty($path)?array_pop($path):CONTROLLER_NAME; if($maps = C('URL_ACTION_MAP')) { if(isset($maps[strtolower($var[$varController])])) { $maps = $maps[strtolower($var[$varController])]; if($action = array_search(strtolower($var[$varAction]),$maps)){ $var[$varAction] = $action; } } } if($maps = C('URL_CONTROLLER_MAP')) { if($controller = array_search(strtolower($var[$varController]),$maps)){ $var[$varController] = $controller; } } if($urlCase) { $var[$varController] = parse_name($var[$varController]); } $module = ''; if(!empty($path)) { $var[$varModule] = implode($depr,$path); }else{ if(C('MULTI_MODULE')) { if(MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')){ $var[$varModule]= MODULE_NAME; } } } if($maps = C('URL_MODULE_MAP')) { if($_module = array_search(strtolower($var[$varModule]),$maps)){ $var[$varModule] = $_module; } } if(isset($var[$varModule])){ $module = $var[$varModule]; unset($var[$varModule]); } } } if(C('URL_MODEL') == 0) { $url = __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var)); if($urlCase){ $url = strtolower($url); } if(!empty($vars)) { $vars = http_build_query($vars); $url .= '&'.$vars; } }else{ if(isset($route)) { $url = __APP__.'/'.rtrim($url,$depr); }else{ $module = (defined('BIND_MODULE') && BIND_MODULE==$module )? '' : $module; $url = __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var)); } if($urlCase){ $url = strtolower($url); } if(!empty($vars)) { foreach ($vars as $var => $val){ if('' !== trim($val)) $url .= $depr . $var . $depr . urlencode($val); } } if($suffix) { $suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix; if($pos = strpos($suffix, '|')){ $suffix = substr($suffix, 0, $pos); } if($suffix && '/' != substr($url,-1)){ $url .= '.'.ltrim($suffix,'.'); } } } if(isset($anchor)){ $url .= '#'.$anchor; } if($domain) { $url = (is_ssl()?'https://':'http://').$domain.$url; } return $url; } function W($name, $data=array()) { return R($name,$data,'Widget'); } function is_ssl() { if(isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))){ return true; }elseif(isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'] )) { return true; } return false; } function redirect($url, $time=0, $msg='') { $url = str_replace(array("\n", "\r"), '', $url); if (empty($msg)) $msg = "系统将在{$time}秒之后自动跳转到{$url}!"; if (!headers_sent()) { if (0 === $time) { header('Location: ' . $url); } else { header("refresh:{$time};url={$url}"); echo($msg); } exit(); } else { $str = " "; if ($time != 0) $str .= $msg; exit($str); } } function S($name,$value='',$options=null) { static $cache = ''; if(is_array($options)){ $type = isset($options['type'])?$options['type']:''; $cache = Think\Cache::getInstance($type,$options); }elseif(is_array($name)) { $type = isset($name['type'])?$name['type']:''; $cache = Think\Cache::getInstance($type,$name); return $cache; }elseif(empty($cache)) { $cache = Think\Cache::getInstance(); } if(''=== $value){ return $cache->get($name); }elseif(is_null($value)) { return $cache->rm($name); }else { if(is_array($options)) { $expire = isset($options['expire'])?$options['expire']:NULL; }else{ $expire = is_numeric($options)?$options:NULL; } return $cache->set($name, $value, $expire); } } function F($name, $value='', $path=DATA_PATH) { static $_cache = array(); $filename = $path . $name . '.php'; if ('' !== $value) { if (is_null($value)) { if(false !== strpos($name,'*')){ return false; }else{ unset($_cache[$name]); return Think\Storage::unlink($filename,'F'); } } else { Think\Storage::put($filename,serialize($value),'F'); $_cache[$name] = $value; return null; } } if (isset($_cache[$name])) return $_cache[$name]; if (Think\Storage::has($filename,'F')){ $value = unserialize(Think\Storage::read($filename,'F')); $_cache[$name] = $value; } else { $value = false; } return $value; } function to_guid_string($mix) { if (is_object($mix)) { return spl_object_hash($mix); } elseif (is_resource($mix)) { $mix = get_resource_type($mix) . strval($mix); } else { $mix = serialize($mix); } return md5($mix); } function xml_encode($data, $root='think', $item='item', $attr='', $id='id', $encoding='utf-8') { if(is_array($attr)){ $_attr = array(); foreach ($attr as $key => $value) { $_attr[] = "{$key}=\"{$value}\""; } $attr = implode(' ', $_attr); } $attr = trim($attr); $attr = empty($attr) ? '' : " {$attr}"; $xml = ""; $xml .= "<{$root}{$attr}>"; $xml .= data_to_xml($data, $item, $id); $xml .= "{$root}>"; return $xml; } function data_to_xml($data, $item='item', $id='id') { $xml = $attr = ''; foreach ($data as $key => $val) { if(is_numeric($key)){ $id && $attr = " {$id}=\"{$key}\""; $key = $item; } $xml .= "<{$key}{$attr}>"; $xml .= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val; $xml .= "{$key}>"; } return $xml; } function session($name='',$value='') { $prefix = C('SESSION_PREFIX'); if(is_array($name)) { if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']); if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){ session_id($_REQUEST[C('VAR_SESSION_ID')]); }elseif(isset($name['id'])) { session_id($name['id']); } if('common' == APP_MODE){ ini_set('session.auto_start', 0); } if(isset($name['name'])) session_name($name['name']); if(isset($name['path'])) session_save_path($name['path']); if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']); if(isset($name['expire'])) { ini_set('session.gc_maxlifetime', $name['expire']); ini_set('session.cookie_lifetime', $name['expire']); } if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0); if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0); if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']); if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']); if(isset($name['type'])) C('SESSION_TYPE',$name['type']); if(C('SESSION_TYPE')) { $type = C('SESSION_TYPE'); $class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type)); $hander = new $class(); session_set_save_handler( array(&$hander,"open"), array(&$hander,"close"), array(&$hander,"read"), array(&$hander,"write"), array(&$hander,"destroy"), array(&$hander,"gc")); } if(C('SESSION_AUTO_START')) session_start(); }elseif('' === $value){ if(''===$name){ return $prefix ? $_SESSION[$prefix] : $_SESSION; }elseif(0===strpos($name,'[')) { if('[pause]'==$name){ session_write_close(); }elseif('[start]'==$name){ session_start(); }elseif('[destroy]'==$name){ $_SESSION = array(); session_unset(); session_destroy(); }elseif('[regenerate]'==$name){ session_regenerate_id(); } }elseif(0===strpos($name,'?')){ $name = substr($name,1); if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]); }else{ return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]); } }elseif(is_null($name)){ if($prefix) { unset($_SESSION[$prefix]); }else{ $_SESSION = array(); } }elseif($prefix){ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null; }else{ return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null; } }else{ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null; }else{ return isset($_SESSION[$name])?$_SESSION[$name]:null; } } }elseif(is_null($value)){ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); if($prefix){ unset($_SESSION[$prefix][$name1][$name2]); }else{ unset($_SESSION[$name1][$name2]); } }else{ if($prefix){ unset($_SESSION[$prefix][$name]); }else{ unset($_SESSION[$name]); } } }else{ if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); if($prefix){ $_SESSION[$prefix][$name1][$name2] = $value; }else{ $_SESSION[$name1][$name2] = $value; } }else{ if($prefix){ $_SESSION[$prefix][$name] = $value; }else{ $_SESSION[$name] = $value; } } } return null; } function cookie($name='', $value='', $option=null) { $config = array( 'prefix' => C('COOKIE_PREFIX'), 'expire' => C('COOKIE_EXPIRE'), 'path' => C('COOKIE_PATH'), 'domain' => C('COOKIE_DOMAIN'), 'secure' => C('COOKIE_SECURE'), 'httponly' => C('COOKIE_HTTPONLY'), ); if (!is_null($option)) { if (is_numeric($option)) $option = array('expire' => $option); elseif (is_string($option)) parse_str($option, $option); $config = array_merge($config, array_change_key_case($option)); } if(!empty($config['httponly'])){ ini_set("session.cookie_httponly", 1); } if (is_null($name)) { if (empty($_COOKIE)) return null; $prefix = empty($value) ? $config['prefix'] : $value; if (!empty($prefix)) { foreach ($_COOKIE as $key => $val) { if (0 === stripos($key, $prefix)) { setcookie($key, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); unset($_COOKIE[$key]); } } } return null; }elseif('' === $name){ return $_COOKIE; } $name = $config['prefix'] . str_replace('.', '_', $name); if ('' === $value) { if(isset($_COOKIE[$name])){ $value = $_COOKIE[$name]; if(0===strpos($value,'think:')){ $value = substr($value,6); return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true)); }else{ return $value; } }else{ return null; } } else { if (is_null($value)) { setcookie($name, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']); unset($_COOKIE[$name]); } else { if(is_array($value)){ $value = 'think:'.json_encode(array_map('urlencode',$value)); } $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0; setcookie($name, $value, $expire, $config['path'], $config['domain'],$config['secure'],$config['httponly']); $_COOKIE[$name] = $value; } } return null; } function load_ext_file($path) { if($files = C('LOAD_EXT_FILE')) { $files = explode(',',$files); foreach ($files as $file){ $file = $path.'Common/'.$file.'.php'; if(is_file($file)) include $file; } } if($configs = C('LOAD_EXT_CONFIG')) { if(is_string($configs)) $configs = explode(',',$configs); foreach ($configs as $key=>$config){ $file = is_file($config)? $config : $path.'Conf/'.$config.CONF_EXT; if(is_file($file)) { is_numeric($key)?C(load_config($file)):C($key,load_config($file)); } } } } function get_client_ip($type = 0,$adv=false) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if($adv){ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown',$arr); if(false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } }elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } $long = sprintf("%u",ip2long($ip)); $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); return $ip[$type]; } function send_http_status($code) { static $_status = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Moved Temporarily ', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 509 => 'Bandwidth Limit Exceeded' ); if(isset($_status[$code])) { header('HTTP/1.1 '.$code.' '.$_status[$code]); header('Status:'.$code.' '.$_status[$code]); } } function think_filter(&$value){ if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){ $value .= ' '; } } function in_array_case($value,$array){ return in_array(strtolower($value),array_map('strtolower',$array)); }}namespace {function dd($data) { echo ""; print_r($data); echo " "; } function getSortedCategory($data,$pid=0,$html="|---",$level=0) { $temp = array(); foreach ($data as $k => $v) { if($v['pid'] == $pid){ $str = str_repeat($html, $level); $v['html'] = $str; $temp[] = $v; $temp = array_merge($temp,getSortedCategory($data,$v['id'],'|---',$level+1)); } } return $temp; } function getSettingValueDataByKey($key) { return M('setting')->getByKey($key); } function getSettingValueFieldByKey($key,$field) { return M('setting')->getFieldByKey($key,$field); }}namespace Think{ class Hook { static private $tags = array(); static public function add($tag,$name) { if(!isset(self::$tags[$tag])){ self::$tags[$tag] = array(); } if(is_array($name)){ self::$tags[$tag] = array_merge(self::$tags[$tag],$name); }else{ self::$tags[$tag][] = $name; } } static public function import($data,$recursive=true) { if(!$recursive){ self::$tags = array_merge(self::$tags,$data); }else{ foreach ($data as $tag=>$val){ if(!isset(self::$tags[$tag])) self::$tags[$tag] = array(); if(!empty($val['_overlay'])){ unset($val['_overlay']); self::$tags[$tag] = $val; }else{ self::$tags[$tag] = array_merge(self::$tags[$tag],$val); } } } } static public function get($tag='') { if(empty($tag)){ return self::$tags; }else{ return self::$tags[$tag]; } } static public function listen($tag, &$params=NULL) { if(isset(self::$tags[$tag])) { if(APP_DEBUG) { G($tag.'Start'); trace('[ '.$tag.' ] --START--','','INFO'); } foreach (self::$tags[$tag] as $name) { APP_DEBUG && G($name.'_start'); $result = self::exec($name, $tag,$params); if(APP_DEBUG){ G($name.'_end'); trace('Run '.$name.' [ RunTime:'.G($name.'_start',$name.'_end',6).'s ]','','INFO'); } if(false === $result) { return ; } } if(APP_DEBUG) { trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO'); } } return; } static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ $tag = 'run'; } $addon = new $name(); return $addon->$tag($params); } }}namespace Think{ class App { static public function init() { load_ext_file(COMMON_PATH); C('LOG_PATH', realpath(LOG_PATH).'/Common/'); define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); define('IS_GET', REQUEST_METHOD =='GET' ? true : false); define('IS_POST', REQUEST_METHOD =='POST' ? true : false); define('IS_PUT', REQUEST_METHOD =='PUT' ? true : false); define('IS_DELETE', REQUEST_METHOD =='DELETE' ? true : false); Dispatcher::dispatch(); if(C('REQUEST_VARS_FILTER')){ array_walk_recursive($_GET, 'think_filter'); array_walk_recursive($_POST, 'think_filter'); array_walk_recursive($_REQUEST, 'think_filter'); } Hook::listen('url_dispatch'); define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false); C('TMPL_EXCEPTION_FILE',realpath(C('TMPL_EXCEPTION_FILE'))); return ; } static public function exec() { if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ $module = false; }elseif(C('ACTION_BIND_CLASS')){ $layer = C('DEFAULT_C_LAYER'); if(is_dir(MODULE_PATH.$layer.'/'.CONTROLLER_NAME)){ $namespace = MODULE_NAME.'\\'.$layer.'\\'.CONTROLLER_NAME.'\\'; }else{ $namespace = MODULE_NAME.'\\'.$layer.'\\_empty\\'; } $actionName = strtolower(ACTION_NAME); if(class_exists($namespace.$actionName)){ $class = $namespace.$actionName; }elseif(class_exists($namespace.'_empty')){ $class = $namespace.'_empty'; }else{ E(L('_ERROR_ACTION_').':'.ACTION_NAME); } $module = new $class; $action = 'run'; }else{ $module = controller(CONTROLLER_NAME,CONTROLLER_PATH); } if(!$module) { if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) { header("Content-type:image/png"); exit(base64_decode(App::logo())); } $module = A('Empty'); if(!$module){ E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME); } } if(!isset($action)){ $action = ACTION_NAME.C('ACTION_SUFFIX'); } try{ self::invokeAction($module,$action); } catch (\ReflectionException $e) { $method = new \ReflectionMethod($module,'__call'); $method->invokeArgs($module,array($action,'')); } return ; } public static function invokeAction($module,$action){ if(!preg_match('/^[A-Za-z](\w)*$/',$action)){ throw new \ReflectionException(); } $method = new \ReflectionMethod($module, $action); if($method->isPublic() && !$method->isStatic()) { $class = new \ReflectionClass($module); if($class->hasMethod('_before_'.$action)) { $before = $class->getMethod('_before_'.$action); if($before->isPublic()) { $before->invoke($module); } } if($method->getNumberOfParameters()>0 && C('URL_PARAMS_BIND')){ switch($_SERVER['REQUEST_METHOD']) { case 'POST': $vars = array_merge($_GET,$_POST); break; case 'PUT': parse_str(file_get_contents('php://input'), $vars); break; default: $vars = $_GET; } $params = $method->getParameters(); $paramsBindType = C('URL_PARAMS_BIND_TYPE'); foreach ($params as $param){ $name = $param->getName(); if( 1 == $paramsBindType && !empty($vars) ){ $args[] = array_shift($vars); }elseif( 0 == $paramsBindType && isset($vars[$name])){ $args[] = $vars[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); }else{ E(L('_PARAM_ERROR_').':'.$name); } } if(C('URL_PARAMS_SAFE')){ $filters = C('URL_PARAMS_FILTER')?:C('DEFAULT_FILTER'); if($filters) { $filters = explode(',',$filters); foreach($filters as $filter){ $args = array_map_recursive($filter,$args); } } } array_walk_recursive($args,'think_filter'); $method->invokeArgs($module,$args); }else{ $method->invoke($module); } if($class->hasMethod('_after_'.$action)) { $after = $class->getMethod('_after_'.$action); if($after->isPublic()) { $after->invoke($module); } } }else{ throw new \ReflectionException(); } } static public function run() { Hook::listen('app_init'); App::init(); Hook::listen('app_begin'); if(!IS_CLI){ session(C('SESSION_OPTIONS')); } G('initTime'); App::exec(); Hook::listen('app_end'); return ; } static public function logo(){ return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/9+69+8xuNtkHJAFCSIAkhMgjCCJQUi0GtEIVbP8Qq9LH2No6TmfaztjO2OnUdvqHFMfOVFTqIK0vUEEeqUBARCsEeYQkEPJoEvIiELLvvc9z+p27u2F3s5tsBB1OZiebu5dzf7/v/L7f952zMM8cWIwY+Mk2ulCp92Fnq3XvnzArr2NZnYNldDp0Gw+/OEQ4+obQn5D+4Ubb22+YOGsWi/Todh8AHglKEGkEsnHBQ162511GZFgW6ZCBM9/W4H3iNSQqIe09O196dLKX7d1O39OViP/wthtkND62if/wj/DbMpph8BY/m9xy8BoBmQk+mHqZQGNy4JYRwCoRbwa8l4JXw6M+orJxpU0U6ToKy/5bQsAiTeokGKkTx46RRxxEUgrwGgF4MWNNEJCGgYTvpgnY1IJWg5RzfqLgvcIgktX0i8dmMlFA8qCQ5L0Z/WObPLUxT1i4lWSYDISoEfBYGvM+LlMQQdkLHoWRRZ8zYQI62Thswe5WTORGwNXDcGjqeOA9AF7B8rhzsxMBEoJ8oJKaqPu4hblHMCMPwl9XeNWyb8xkB/DDGYKfMAE6aFL7xesZ389JlgG3XHEMI6UPDOP6JHHu67T2pwNPI69mCP4rEaBDUAJaKc/AOuXiwH07VCS3w5+UQMAuF/WqGI+yFIwVNBwemBD4r0wgQiKoFZa00sEYTwss32lA1tPwVxtc8jQ5/gWCwmGCyUD8vRT0sHBFW4GJDvZmrJFWRY1EkrGA6ZB8/10fOZSSj0E6F+BSP7xidiIzhBmKB09lEwHPkG+UQIyEN44EBiT5vrv2uJXyPQqSqO930fxvcvwbR/+JAkD9EfASgI9EHlp6YiHO4W+cAB20SnrFqxBbNljiXf1Pl1K2S0HCWfiog3YlAD5RGwwxK6oUjTweuVigLjyB0mX410mAFnMoVK1lvvUvgt8fUJH0JVyjuvcmg4dE5mUiFtD24AZ4qBVELxXKS+pMxN43kSdzNwudJ+bQbLlmnxvPOQoCugSap1GnSRoG8KOiKbH+rIA0lEeSAg3y6eeQ6XI2nrYnrPM89bUTgI0Pdqvl50vlNbtZxDUBcLBK0kPd5jPziyLdojJIN0pq5/mdzwL4UVvVInV5ncQEPNOUxa9d0TU+CW5l+FoI0GSDKHVVSOs+0KOsZoxwOzSZNFGv0mQ9avyLCh2Hpm+70Y0YJoJVgmQv822wnDC8Miq6VjJ5IFed0QD1YiAbT+nQE8v/RMZfmgmcCRHIIu7Bmcp39oM9fqEychcA747KxQ/AEyqQonl7hATtJmnhO2XYtgcia01aSbVMenAXrIomPcLgEBA4liGBzFZAT8zBYqW6brI67wg8sFVhxBhwLwBP2+tqBQqqK7VJKGh/BRrfTr6nWL7nYBaZdBJHqrX3kPEPap56xwE/GvjJTRMADeMCdcGpGXL1Xh4ZL8BDOlWkUpegfi0CeDzeA5YITzEnddv+IXL+UYCmqIvqC9UlUC/ki9FipwVjunL3yX7dOTLeXmVMAhbsGporPfyOBTm/BJ23gTVehsvXRnSewagUfpBXF3p5pygKS7OceqTjb7h2vjr/XKm0ZofKSI2Q/J102wHzatZkJPYQ5JoKsuK+EoHJakVzubzuLQDepCKllTZi9AG0DYg9ZLxhFaZsOu7bvlmVI5oPXJMQJcHxHClSln1apFTvAimeg48u0RWFeZW4lVcjbQWZuIQK1KozZfIDO6CSQmQQXdpBaiKZyEWThVK1uEc6v7V7uK0ysduExPZx4vysDR+4SelhBYm0R6LBuR4PXts8MYMcJPsINo4YZCDLj0sgB0/vLpPXvA2Tn42Cv5rsLulGubzW0sEd3d4W/mJt2Kck+DzDMijfPLOjyrDhXSh852B+OvflqAkoyXO1cYfujtc/i3jJSAwhgfFlp20laMLOku/bC7prgqW7lCn4auE5NhcXPd3M7x70+IceSgZvNljCd9k3fLjYsPElqLR14PXQZqD2ZNkkrAB79UeJUebFQmXpf8ZcAQt2XrMQdyNUVBqZoUzAFyp3V3xi/MubUA/mCT4Fhf038PC8XplhWnCmnK/ZzyC2BSTRSqKVOuY2kB8Jia0lvvRIVoP+vVWJbYarf6p655E2/nANBMCWkgD49DA0VAMyI1OLFMYCXiU9bmzi9/y5i/vsaTpHPHidTofzLbM65vMPva9HlovgXp0AvjtaqYMfDD0/4mAsYE92pxa+9k1QgCnRVObCpojpzsKTPvayPetTEgBdwnssjuc0kOBFX+q3HwRQxdrOLAqeYRjkMk/trTSu2Z9Lik7CfF0AvjtqAhS4NHobGXUnB5DQs8hG8p/wMX1r4+8xkmyvQ50JVq72TVeXbz3HvpWaQJi57hJYTw4kGbtS+C2TigQUtZUX+X27QQq2ePBZBru/0lxTm8fOOQ5yaZOZMAV+he4FqIMB+LQB0UgMSajANX29j+vbmly8ipRvHeSQoQOkM5iFXcPQCVwDMs5RBCQmaPOyvbNd6uwvQJ183BZQG3Zc+Eiv7vQOKu8YeDmMcJlt2ckyftVeMIGLBCmdMHl/tFILYwGPjXWO3zOfSq/+om+oa7Mlh2fpSsRGLp7RAW3FUVjNHgiMhyE6zBFjM2BdkdJGO7nP1kJXWAtBuBpPIAu7f+hhu7bFXIuC5xWrf0X2xreykOsUyKkF2gwadbrXDcXrfKxR43zGcSj4t/cCgr+a1iy6EjE5GYktUCl9fwfMeylyooGF48bN2IGLTw8x7StS7sj8TF9FmPGWQhm3rRR+o9lhvjJvSYAdfDUevI1M6bnX/OwWaDMOQ8RPgKRo0eulBTdT8AW2kl8e9L7UHghHwMfLiZPNoSpx0yugpQZaFqKWqxVSM3a2pN1SAhC2jf94I7ybBI7EL5A2Wvu5ht3xsoEt4+Ay/abXgCQAxyOeDsDlTCQzy75ohcGgv9Tra9uiymRUYTLrswOLlCdfAQf7HPDQQ4ErAH5EDXB9cMxWYpjtXApRncojS0sbV/cCgHTHwGNBJy+1PQE2x56FpaVR7wfQGZ37V+V+19EiHNvR6q1fRUjqvbjbMq1/qfHxbTrE10ePY2gPFk48D2CVMTf1AF4PXvyYR9dV6Wf7H413m3xTWQvYGhQ7mfYwA5mAX+18Vue05v/8jG/fZX/IW5MKPKtjSYlt0ellxh+/BOCPAwYaeVr0QofZFxJWVWC8znG70au6llVmktsF0bfHF6k8fvZ5esZJbwHwwnjg59tXz6sL/P0NUZDuSNu1mnJ8Vab17+cy005A9wtOpp3i0bZdpJLUil00semAwN45LgEViZYe3amNye0B6A9chviSlzXVsFtyN5/1H3gaNmMpn8Fz0GpYFp6Zw615H/LpUuRQQDMCL82n5DpBSawkvzIdN2ypiT8nSLth8Pk9jnjwdFzH3W4XW6KMBfwB569NdcGX93mC16tTflcArcYUc/mFuYbV+8zY0SAjAVoNErNgWjtwumJ3wbn/HlBFYdxHvSkJJEc+Ngal9opSwyo9YlITX2C/P/+gf8sxURSLR+mcZUmeqaS9wrh6vxW5zxFCOqFi90RbDWq/YwZmnu1+a6OvdpvRqkNxxe44lyl4OobEnpKA6Uox5EfH9xzPs/HRKrTPWdIQrK1VZDU7ETiD3Obpl+8wPPCRBbkbwNtpW9AbBe5L1SMlj3tdTxk/9W47JUmqS5HU+JzYymUKXjtWVmT9RenIhgXc+nroWLyxXJhmL112OdB8GCsk4f8oZJucnvmmtR85mBn10GZ0EKSCMUSAR3ukcXd5s7LvLD3me61WkuTCpJzYAyRurMB44EdEJzTfU271lUJC03YjXJXzYOGZwN4D8eB5jlfLrdWfzGRW7icMPfiSO6Oe7s20bmhdgLX4Z23B+s3JgQESzUDiMboSzDMHFpNMwccGePauhfwjzwnI2wu9zKGgEFg80jcZ7MHllk07s1H+5yojtUQTlH4nFdLKTGwDmPbIklOb1L1zO4T6N8NCuDLFLS/C63c0eNRimZ++s5BMBHxU11jHchI9oFVUxRh/eMDzHEzGYu0Lg8gJ7oS/tFCwoic44fyUtix0n/46vP4bf+//BRgAYwDDar4ncHIAAAAASUVORK5CYII='; } }}namespace Think{ class Dispatcher { static public function dispatch() { $varPath = C('VAR_PATHINFO'); $varAddon = C('VAR_ADDON'); $varModule = C('VAR_MODULE'); $varController = C('VAR_CONTROLLER'); $varAction = C('VAR_ACTION'); $urlCase = C('URL_CASE_INSENSITIVE'); if(isset($_GET[$varPath])) { $_SERVER['PATH_INFO'] = $_GET[$varPath]; unset($_GET[$varPath]); }elseif(IS_CLI){ $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; } if(C('APP_SUB_DOMAIN_DEPLOY')) { $rules = C('APP_SUB_DOMAIN_RULES'); if(isset($rules[$_SERVER['HTTP_HOST']])) { define('APP_DOMAIN',$_SERVER['HTTP_HOST']); $rule = $rules[APP_DOMAIN]; }else{ if(strpos(C('APP_DOMAIN_SUFFIX'),'.')){ $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -3); }else{ $domain = array_slice(explode('.', $_SERVER['HTTP_HOST']), 0, -2); } if(!empty($domain)) { $subDomain = implode('.', $domain); define('SUB_DOMAIN',$subDomain); $domain2 = array_pop($domain); if($domain) { $domain3 = array_pop($domain); } if(isset($rules[$subDomain])) { $rule = $rules[$subDomain]; }elseif(isset($rules['*.' . $domain2]) && !empty($domain3)){ $rule = $rules['*.' . $domain2]; $panDomain = $domain3; }elseif(isset($rules['*']) && !empty($domain2) && 'www' != $domain2 ){ $rule = $rules['*']; $panDomain = $domain2; } } } if(!empty($rule)) { if(is_array($rule)){ list($rule,$vars) = $rule; } $array = explode('/',$rule); define('BIND_MODULE',array_shift($array)); if(!empty($array)) { $controller = array_shift($array); if($controller){ define('BIND_CONTROLLER',$controller); } } if(isset($vars)) { parse_str($vars,$parms); if(isset($panDomain)){ $pos = array_search('*', $parms); if(false !== $pos) { $parms[$pos] = $panDomain; } } $_GET = array_merge($_GET,$parms); } } } if(!isset($_SERVER['PATH_INFO'])) { $types = explode(',',C('URL_PATHINFO_FETCH')); foreach ($types as $type){ if(0===strpos($type,':')) { $_SERVER['PATH_INFO'] = call_user_func(substr($type,1)); break; }elseif(!empty($_SERVER[$type])) { $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type],$_SERVER['SCRIPT_NAME']))? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; break; } } } $depr = C('URL_PATHINFO_DEPR'); define('MODULE_PATHINFO_DEPR', $depr); if(empty($_SERVER['PATH_INFO'])) { $_SERVER['PATH_INFO'] = ''; define('__INFO__',''); define('__EXT__',''); }else{ define('__INFO__',trim($_SERVER['PATH_INFO'],'/')); define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'],PATHINFO_EXTENSION))); $_SERVER['PATH_INFO'] = __INFO__; if(!defined('BIND_MODULE') && (!C('URL_ROUTER_ON') || !Route::check())){ if (__INFO__ && C('MULTI_MODULE')){ $paths = explode($depr,__INFO__,2); $allowList = C('MODULE_ALLOW_LIST'); $module = preg_replace('/\.' . __EXT__ . '$/i', '',$paths[0]); if( empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))){ $_GET[$varModule] = $module; $_SERVER['PATH_INFO'] = isset($paths[1])?$paths[1]:''; } } } } define('__SELF__',strip_tags($_SERVER[C('URL_REQUEST_URI')])); define('MODULE_NAME', defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule)); if( MODULE_NAME && (defined('BIND_MODULE') || !in_array_case(MODULE_NAME,C('MODULE_DENY_LIST')) ) && is_dir(APP_PATH.MODULE_NAME)){ define('MODULE_PATH', APP_PATH.MODULE_NAME.'/'); C('CACHE_PATH',CACHE_PATH.MODULE_NAME.'/'); C('LOG_PATH', realpath(LOG_PATH).'/'.MODULE_NAME.'/'); Hook::listen('module_check'); if(is_file(MODULE_PATH.'Conf/config'.CONF_EXT)) C(load_config(MODULE_PATH.'Conf/config'.CONF_EXT)); if('common' != APP_MODE && is_file(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT)) C(load_config(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT)); if(APP_STATUS && is_file(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)) C(load_config(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)); if(is_file(MODULE_PATH.'Conf/alias.php')) Think::addMap(include MODULE_PATH.'Conf/alias.php'); if(is_file(MODULE_PATH.'Conf/tags.php')) Hook::import(include MODULE_PATH.'Conf/tags.php'); if(is_file(MODULE_PATH.'Common/function.php')) include MODULE_PATH.'Common/function.php'; $urlCase = C('URL_CASE_INSENSITIVE'); load_ext_file(MODULE_PATH); }else{ E(L('_MODULE_NOT_EXIST_').':'.MODULE_NAME); } if(!defined('__APP__')){ $urlMode = C('URL_MODEL'); if($urlMode == URL_COMPAT ){ define('PHP_FILE',_PHP_FILE_.'?'.$varPath.'='); }elseif($urlMode == URL_REWRITE ) { $url = dirname(_PHP_FILE_); if($url == '/' || $url == '\\') $url = ''; define('PHP_FILE',$url); }else { define('PHP_FILE',_PHP_FILE_); } define('__APP__',strip_tags(PHP_FILE)); } $moduleName = defined('MODULE_ALIAS')? MODULE_ALIAS : MODULE_NAME; define('__MODULE__',(defined('BIND_MODULE') || !C('MULTI_MODULE'))? __APP__ : __APP__.'/'.($urlCase ? strtolower($moduleName) : $moduleName)); if('' != $_SERVER['PATH_INFO'] && (!C('URL_ROUTER_ON') || !Route::check()) ){ Hook::listen('path_info'); if(C('URL_DENY_SUFFIX') && preg_match('/\.('.trim(C('URL_DENY_SUFFIX'),'.').')$/i', $_SERVER['PATH_INFO'])){ send_http_status(404); exit; } $_SERVER['PATH_INFO'] = preg_replace(C('URL_HTML_SUFFIX')? '/\.('.trim(C('URL_HTML_SUFFIX'),'.').')$/i' : '/\.'.__EXT__.'$/i', '', $_SERVER['PATH_INFO']); $depr = C('URL_PATHINFO_DEPR'); $paths = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); if(!defined('BIND_CONTROLLER')) { if(C('CONTROLLER_LEVEL')>1){ $_GET[$varController] = implode('/',array_slice($paths,0,C('CONTROLLER_LEVEL'))); $paths = array_slice($paths, C('CONTROLLER_LEVEL')); }else{ $_GET[$varController] = array_shift($paths); } } if(!defined('BIND_ACTION')){ $_GET[$varAction] = array_shift($paths); } $var = array(); if(C('URL_PARAMS_BIND') && 1 == C('URL_PARAMS_BIND_TYPE')){ $var = $paths; }else{ preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){$var[$match[1]]=strip_tags($match[2]);}, implode('/',$paths)); } $_GET = array_merge($var,$_GET); } define('CONTROLLER_PATH', self::getSpace($varAddon,$urlCase)); define('CONTROLLER_NAME', defined('BIND_CONTROLLER')? BIND_CONTROLLER : self::getController($varController,$urlCase)); define('ACTION_NAME', defined('BIND_ACTION')? BIND_ACTION : self::getAction($varAction,$urlCase)); $controllerName = defined('CONTROLLER_ALIAS')? CONTROLLER_ALIAS : CONTROLLER_NAME; define('__CONTROLLER__',__MODULE__.$depr.(defined('BIND_CONTROLLER')? '': ( $urlCase ? parse_name($controllerName) : $controllerName )) ); define('__ACTION__',__CONTROLLER__.$depr.(defined('ACTION_ALIAS')?ACTION_ALIAS:ACTION_NAME)); $_REQUEST = array_merge($_POST,$_GET,$_COOKIE); } static private function getSpace($var,$urlCase) { $space = !empty($_GET[$var])?strip_tags($_GET[$var]):''; unset($_GET[$var]); return $space; } static private function getController($var,$urlCase) { $controller = (!empty($_GET[$var])? $_GET[$var]:C('DEFAULT_CONTROLLER')); unset($_GET[$var]); if($maps = C('URL_CONTROLLER_MAP')) { if(isset($maps[strtolower($controller)])) { define('CONTROLLER_ALIAS',strtolower($controller)); return ucfirst($maps[CONTROLLER_ALIAS]); }elseif(array_search(strtolower($controller),$maps)){ return ''; } } if($urlCase) { $controller = parse_name($controller,1); } return strip_tags(ucfirst($controller)); } static private function getAction($var,$urlCase) { $action = !empty($_POST[$var]) ? $_POST[$var] : (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_ACTION')); unset($_POST[$var],$_GET[$var]); if($maps = C('URL_ACTION_MAP')) { if(isset($maps[strtolower(CONTROLLER_NAME)])) { $maps = $maps[strtolower(CONTROLLER_NAME)]; if(isset($maps[strtolower($action)])) { define('ACTION_ALIAS',strtolower($action)); if(is_array($maps[ACTION_ALIAS])){ parse_str($maps[ACTION_ALIAS][1],$vars); $_GET = array_merge($_GET,$vars); return $maps[ACTION_ALIAS][0]; }else{ return $maps[ACTION_ALIAS]; } }elseif(array_search(strtolower($action),$maps)){ return ''; } } } return strip_tags( $urlCase? strtolower($action) : $action ); } static private function getModule($var) { $module = (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_MODULE')); unset($_GET[$var]); if($maps = C('URL_MODULE_MAP')) { if(isset($maps[strtolower($module)])) { define('MODULE_ALIAS',strtolower($module)); return ucfirst($maps[MODULE_ALIAS]); }elseif(array_search(strtolower($module),$maps)){ return ''; } } return strip_tags(ucfirst($module)); } }}namespace Think{ class Route { public static function check(){ $depr = C('URL_PATHINFO_DEPR'); $regx = preg_replace('/\.'.__EXT__.'$/i','',trim($_SERVER['PATH_INFO'],$depr)); if('/' != $depr){ $regx = str_replace($depr,'/',$regx); } $maps = C('URL_MAP_RULES'); if(isset($maps[$regx])) { $var = self::parseUrl($maps[$regx]); $_GET = array_merge($var, $_GET); return true; } $routes = C('URL_ROUTE_RULES'); if(!empty($routes)) { foreach ($routes as $rule=>$route){ if(is_numeric($rule)){ $rule = array_shift($route); } if(is_array($route) && isset($route[2])){ $options = $route[2]; if(isset($options['ext']) && __EXT__ != $options['ext']){ continue; } if(isset($options['method']) && REQUEST_METHOD != strtoupper($options['method'])){ continue; } if(!empty($options['callback']) && is_callable($options['callback'])) { if(false === call_user_func($options['callback'])) { continue; } } } if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { if($route instanceof \Closure) { $result = self::invokeRegx($route, $matches); return is_bool($result) ? $result : exit; }else{ return self::parseRegex($matches,$route,$regx); } }else{ $len1 = substr_count($regx,'/'); $len2 = substr_count($rule,'/'); if($len1>=$len2 || strpos($rule,'[')) { if('$' == substr($rule,-1,1)) { if($len1 != $len2) { continue; }else{ $rule = substr($rule,0,-1); } } $match = self::checkUrlMatch($regx,$rule); if(false !== $match) { if($route instanceof \Closure) { $result = self::invokeRule($route, $match); return is_bool($result) ? $result : exit; }else{ return self::parseRule($rule,$route,$regx); } } } } } } return false; } private static function checkUrlMatch($regx,$rule) { $m1 = explode('/',$regx); $m2 = explode('/',$rule); $var = array(); foreach ($m2 as $key=>$val){ if(0 === strpos($val,'[:')){ $val = substr($val,1,-1); } if(':' == substr($val,0,1)) { if($pos = strpos($val,'|')){ $val = substr($val,1,$pos-1); } if(strpos($val,'\\')) { $type = substr($val,-1); if('d'==$type) { if(isset($m1[$key]) && !is_numeric($m1[$key])) return false; } $name = substr($val, 1, -2); }elseif($pos = strpos($val,'^')){ $array = explode('-',substr(strstr($val,'^'),1)); if(in_array($m1[$key],$array)) { return false; } $name = substr($val, 1, $pos - 1); }else{ $name = substr($val, 1); } $var[$name] = isset($m1[$key])?$m1[$key]:''; }elseif(0 !== strcasecmp($val,$m1[$key])){ return false; } } return $var; } private static 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_CONTROLLER')] = array_pop($path); } if(!empty($path)) { $var[C('VAR_MODULE')] = array_pop($path); } } return $var; } private static function parseRule($rule,$route,$regx) { $url = is_array($route)?$route[0]:$route; $paths = explode('/',$regx); $matches = array(); $rule = explode('/',$rule); foreach ($rule as $item){ $fun = ''; if(0 === strpos($item,'[:')){ $item = substr($item,1,-1); } if(0===strpos($item,':')) { if($pos = strpos($item,'|')){ $fun = substr($item,$pos+1); $item = substr($item,0,$pos); } 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] = !empty($fun)? $fun(array_shift($paths)) : 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_callback('/:(\d+)/', function($match) use($values){ return $values[$match[1] - 1]; }, $url); } header("Location: $url", true,(is_array($route) && isset($route[1]))?$route[1]:301); exit; }else{ $var = self::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(!empty($paths)) { preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){ $var[strtolower($match[1])]=strip_tags($match[2]);}, implode('/',$paths)); } if(is_array($route) && isset($route[1])) { if(is_array($route[1])){ $params = $route[1]; }else{ parse_str($route[1],$params); } $var = array_merge($var,$params); } $_GET = array_merge($var,$_GET); } return true; } private static function parseRegex($matches,$route,$regx) { $url = is_array($route)?$route[0]:$route; $url = preg_replace_callback('/:(\d+)/', function($match) use($matches){return $matches[$match[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 = self::parseUrl($url); foreach($var as $key=>$val){ if(strpos($val,'|')){ list($val,$fun) = explode('|',$val); $var[$key] = $fun($val); } } $regx = substr_replace($regx,'',0,strlen($matches[0])); if($regx) { preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){ $var[strtolower($match[1])] = strip_tags($match[2]); }, $regx); } if(is_array($route) && isset($route[1])) { if(is_array($route[1])){ $params = $route[1]; }else{ parse_str($route[1],$params); } $var = array_merge($var,$params); } $_GET = array_merge($var,$_GET); } return true; } static private function invokeRegx($closure, $var = array()) { $reflect = new \ReflectionFunction($closure); $params = $reflect->getParameters(); $args = array(); array_shift($var); foreach ($params as $param){ if(!empty($var)) { $args[] = array_shift($var); }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); } } return $reflect->invokeArgs($args); } static private function invokeRule($closure, $var = array()) { $reflect = new \ReflectionFunction($closure); $params = $reflect->getParameters(); $args = array(); foreach ($params as $param){ $name = $param->getName(); if(isset($var[$name])) { $args[] = $var[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); } } return $reflect->invokeArgs($args); } }}namespace Think{ abstract class Controller { protected $view = null; protected $config = array(); public function __construct() { Hook::listen('action_begin',$this->config); $this->view = Think::instance('Think\View'); if(method_exists($this,'_initialize')) $this->_initialize(); } protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { $this->view->display($templateFile,$charset,$contentType,$content,$prefix); } protected function show($content,$charset='',$contentType='',$prefix='') { $this->view->display('',$charset,$contentType,$content,$prefix); } protected function fetch($templateFile='',$content='',$prefix='') { return $this->view->fetch($templateFile,$content,$prefix); } protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') { $content = $this->fetch($templateFile); $htmlpath = !empty($htmlpath)?$htmlpath:HTML_PATH; $htmlfile = $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX'); Storage::put($htmlfile,$content,'html'); return $content; } protected function theme($theme){ $this->view->theme($theme); return $this; } protected function assign($name,$value='') { $this->view->assign($name,$value); return $this; } public function __set($name,$value) { $this->assign($name,$value); } public function get($name='') { return $this->view->get($name); } public function __get($name) { return $this->get($name); } public function __isset($name) { return $this->get($name); } public function __call($method,$args) { if( 0 === strcasecmp($method,ACTION_NAME.C('ACTION_SUFFIX'))) { if(method_exists($this,'_empty')) { $this->_empty($method,$args); }elseif(file_exists_case($this->view->parseTemplate())){ $this->display(); }else{ E(L('_ERROR_ACTION_').':'.ACTION_NAME); } }else{ E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); return; } } protected function error($message='',$jumpUrl='',$ajax=false) { $this->dispatchJump($message,0,$jumpUrl,$ajax); } protected function success($message='',$jumpUrl='',$ajax=false) { $this->dispatchJump($message,1,$jumpUrl,$ajax); } protected function ajaxReturn($data,$type='',$json_option=0) { if(empty($type)) $type = C('DEFAULT_AJAX_RETURN'); switch (strtoupper($type)){ case 'JSON' : header('Content-Type:application/json; charset=utf-8'); exit(json_encode($data,$json_option)); case 'XML' : header('Content-Type:text/xml; charset=utf-8'); exit(xml_encode($data)); case 'JSONP': header('Content-Type:application/json; charset=utf-8'); $handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER'); exit($handler.'('.json_encode($data,$json_option).');'); case 'EVAL' : header('Content-Type:text/html; charset=utf-8'); exit($data); default : Hook::listen('ajax_return',$data); } } protected function redirect($url,$params=array(),$delay=0,$msg='') { $url = U($url,$params); redirect($url,$delay,$msg); } private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false) { if(true === $ajax || IS_AJAX) { $data = is_array($ajax)?$ajax:array(); $data['info'] = $message; $data['status'] = $status; $data['url'] = $jumpUrl; $this->ajaxReturn($data); } if(is_int($ajax)) $this->assign('waitSecond',$ajax); if(!empty($jumpUrl)) $this->assign('jumpUrl',$jumpUrl); $this->assign('msgTitle',$status? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_')); if($this->get('closeWin')) $this->assign('jumpUrl','javascript:window.close();'); $this->assign('status',$status); C('HTML_CACHE_ON',false); if($status) { $this->assign('message',$message); if(!isset($this->waitSecond)) $this->assign('waitSecond','1'); if(!isset($this->jumpUrl)) $this->assign("jumpUrl",$_SERVER["HTTP_REFERER"]); $this->display(C('TMPL_ACTION_SUCCESS')); }else{ $this->assign('error',$message); if(!isset($this->waitSecond)) $this->assign('waitSecond','3'); if(!isset($this->jumpUrl)) $this->assign('jumpUrl',"javascript:history.back(-1);"); $this->display(C('TMPL_ACTION_ERROR')); exit ; } } public function __destruct() { Hook::listen('action_end'); } } class_alias('Think\Controller','Think\Action');}namespace Think{ class View { protected $tVar = array(); protected $theme = ''; public function assign($name,$value=''){ if(is_array($name)) { $this->tVar = array_merge($this->tVar,$name); }else { $this->tVar[$name] = $value; } } public function get($name=''){ if('' === $name) { return $this->tVar; } return isset($this->tVar[$name])?$this->tVar[$name]:false; } public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { G('viewStartTime'); Hook::listen('view_begin',$templateFile); $content = $this->fetch($templateFile,$content,$prefix); $this->render($content,$charset,$contentType); Hook::listen('view_end'); } private function render($content,$charset='',$contentType=''){ if(empty($charset)) $charset = C('DEFAULT_CHARSET'); if(empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE'); header('Content-Type:'.$contentType.'; charset='.$charset); header('Cache-control: '.C('HTTP_CACHE_CONTROL')); header('X-Powered-By:ThinkPHP'); echo $content; } public function fetch($templateFile='',$content='',$prefix='') { if(empty($content)) { $templateFile = $this->parseTemplate($templateFile); if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile); }else{ defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath()); } ob_start(); ob_implicit_flush(0); if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { $_content = $content; extract($this->tVar, EXTR_OVERWRITE); empty($_content)?include $templateFile:eval('?>'.$_content); }else{ $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix); Hook::listen('view_parse',$params); } $content = ob_get_clean(); Hook::listen('view_filter',$content); return $content; } public function parseTemplate($template='') { if(is_file($template)) { return $template; } $depr = C('TMPL_FILE_DEPR'); $template = str_replace(':', $depr, $template); $module = MODULE_NAME; if(strpos($template,'@')){ list($module,$template) = explode('@',$template); } defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath($module)); if('' == $template) { $template = CONTROLLER_NAME . $depr . ACTION_NAME; }elseif(false === strpos($template, $depr)){ $template = CONTROLLER_NAME . $depr . $template; } $file = THEME_PATH.$template.C('TMPL_TEMPLATE_SUFFIX'); if(C('TMPL_LOAD_DEFAULTTHEME') && THEME_NAME != C('DEFAULT_THEME') && !is_file($file)){ $file = dirname(THEME_PATH).'/'.C('DEFAULT_THEME').'/'.$template.C('TMPL_TEMPLATE_SUFFIX'); } return $file; } protected function getThemePath($module=MODULE_NAME){ $theme = $this->getTemplateTheme(); $tmplPath = C('VIEW_PATH'); if(!$tmplPath){ $tmplPath = defined('TMPL_PATH')? TMPL_PATH.$module.'/' : APP_PATH.$module.'/'.C('DEFAULT_V_LAYER').'/'; } return $tmplPath.$theme; } public function theme($theme){ $this->theme = $theme; return $this; } private function getTemplateTheme() { if($this->theme) { $theme = $this->theme; }else{ $theme = C('DEFAULT_THEME'); if(C('TMPL_DETECT_THEME')) { $t = C('VAR_TEMPLATE'); if (isset($_GET[$t])){ $theme = $_GET[$t]; }elseif(cookie('think_template')){ $theme = cookie('think_template'); } if(!in_array($theme,explode(',',C('THEME_LIST')))){ $theme = C('DEFAULT_THEME'); } cookie('think_template',$theme,864000); } } defined('THEME_NAME') || define('THEME_NAME', $theme); return $theme?$theme . '/':''; } }}namespace Behavior{ class BuildLiteBehavior { public function run(&$params) { if(!defined('BUILD_LITE_FILE')) return ; $litefile = C('RUNTIME_LITE_FILE',null,RUNTIME_PATH.'lite.php'); if(is_file($litefile)) return; $defs = get_defined_constants(TRUE); $content = 'namespace {$GLOBALS[\'_beginTime\'] = microtime(TRUE);'; if(MEMORY_LIMIT_ON) { $content .= '$GLOBALS[\'_startUseMems\'] = memory_get_usage();'; } unset($defs['user']['BUILD_LITE_FILE']); $content .= $this->buildArrayDefine($defs['user']).'}'; $filelist = is_file(CONF_PATH.'lite.php')? include CONF_PATH.'lite.php': array( THINK_PATH.'Common/functions.php', COMMON_PATH.'Common/function.php', CORE_PATH . 'Think'.EXT, CORE_PATH . 'Hook'.EXT, CORE_PATH . 'App'.EXT, CORE_PATH . 'Dispatcher'.EXT, CORE_PATH . 'Log'.EXT, CORE_PATH . 'Log/Driver/File'.EXT, CORE_PATH . 'Route'.EXT, CORE_PATH . 'Controller'.EXT, CORE_PATH . 'View'.EXT, CORE_PATH . 'Storage'.EXT, CORE_PATH . 'Storage/Driver/File'.EXT, CORE_PATH . 'Exception'.EXT, BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT, BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT, ); foreach ($filelist as $file){ if(is_file($file)) { $content .= compile($file); } } $content = preg_replace('/\$runtimefile = RUNTIME_PATH(.+?)(if\(APP_STATUS)/','\2',$content,1); $content .= "\nnamespace { Think\Think::addMap(".var_export(\Think\Think::getMap(),true).");"; $content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(\Think\Hook::get(),true).');Think\Think::start();}'; file_put_contents($litefile,strip_whitespace(' $val) { $key = strtoupper($key); $content .= 'defined(\'' . $key . '\') or '; if (is_int($val) || is_float($val)) { $content .= "define('" . $key . "'," . $val . ');'; } elseif (is_bool($val)) { $val = ($val) ? 'true' : 'false'; $content .= "define('" . $key . "'," . $val . ');'; } elseif (is_string($val)) { $content .= "define('" . $key . "','" . addslashes($val) . "');"; } $content .= "\n"; } return $content; } }}namespace Behavior{ use Think\Storage; use Think\Think; class ParseTemplateBehavior { public function run(&$_data){ $engine = strtolower(C('TMPL_ENGINE_TYPE')); $_content = empty($_data['content'])?$_data['file']:$_data['content']; $_data['prefix'] = !empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX'); if('think'==$engine){ if((!empty($_data['content']) && $this->checkContentCache($_data['content'],$_data['prefix'])) || $this->checkCache($_data['file'],$_data['prefix'])) { Storage::load(C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX'),$_data['var']); }else{ $tpl = Think::instance('Think\\Template'); $tpl->fetch($_content,$_data['var'],$_data['prefix']); } }else{ if(strpos($engine,'\\')){ $class = $engine; }else{ $class = 'Think\\Template\\Driver\\'.ucwords($engine); } if(class_exists($class)) { $tpl = new $class; $tpl->fetch($_content,$_data['var']); }else { E(L('_NOT_SUPPORT_').': ' . $class); } } } protected function checkCache($tmplTemplateFile,$prefix='') { if (!C('TMPL_CACHE_ON')) return false; $tmplCacheFile = C('CACHE_PATH').$prefix.md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX'); if(!Storage::has($tmplCacheFile)){ return false; }elseif (filemtime($tmplTemplateFile) > Storage::get($tmplCacheFile,'mtime')) { return false; }elseif (C('TMPL_CACHE_TIME') != 0 && time() > Storage::get($tmplCacheFile,'mtime')+C('TMPL_CACHE_TIME')) { return false; } if(C('LAYOUT_ON')) { $layoutFile = THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX'); if(filemtime($layoutFile) > Storage::get($tmplCacheFile,'mtime')) { return false; } } return true; } protected function checkContentCache($tmplContent,$prefix='') { if(Storage::has(C('CACHE_PATH').$prefix.md5($tmplContent).C('TMPL_CACHFILE_SUFFIX'))){ return true; }else{ return false; } } }}namespace Behavior{ class ContentReplaceBehavior { public function run(&$content){ $content = $this->templateContentReplace($content); } protected function templateContentReplace($content) { $replace = array( '__ROOT__' => __ROOT__, '__APP__' => __APP__, '__MODULE__' => __MODULE__, '__ACTION__' => __ACTION__, '__SELF__' => htmlentities(__SELF__), '__CONTROLLER__'=> __CONTROLLER__, '__URL__' => __CONTROLLER__, '__PUBLIC__' => __ROOT__.'/Public', ); if(is_array(C('TMPL_PARSE_STRING')) ) $replace = array_merge($replace,C('TMPL_PARSE_STRING')); $content = str_replace(array_keys($replace),array_values($replace),$content); return $content; } }} namespace { Think\Think::addMap(array ( 'Think\\Log' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Log.class.php', 'Think\\Log\\Driver\\File' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Log/Driver/File.class.php', 'Think\\Exception' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Exception.class.php', 'Think\\Model' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Model.class.php', 'Think\\Db' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Db.class.php', 'Think\\Template' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Template.class.php', 'Think\\Cache' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Cache.class.php', 'Think\\Cache\\Driver\\File' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Cache/Driver/File.class.php', 'Think\\Storage' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP\\Library/Think/Storage.class.php', )); L(array ( '_MODULE_NOT_EXIST_' => '无法加载模块', '_CONTROLLER_NOT_EXIST_' => '无法加载控制器', '_ERROR_ACTION_' => '非法操作', '_LANGUAGE_NOT_LOAD_' => '无法加载语言包', '_TEMPLATE_NOT_EXIST_' => '模板不存在', '_MODULE_' => '模块', '_ACTION_' => '操作', '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义', '_VALID_ACCESS_' => '没有权限', '_XML_TAG_ERROR_' => 'XML标签语法错误', '_DATA_TYPE_INVALID_' => '非法数据对象!', '_OPERATION_WRONG_' => '操作出现错误', '_NOT_LOAD_DB_' => '无法加载数据库', '_NO_DB_DRIVER_' => '无法加载数据库驱动', '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库', '_NO_DB_CONFIG_' => '没有定义数据库配置', '_NOT_SUPPORT_' => '系统不支持', '_CACHE_TYPE_INVALID_' => '无法加载缓存类型', '_FILE_NOT_WRITABLE_' => '目录(文件)不可写', '_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代码', '_PARAM_ERROR_' => '参数错误或者未定义', '_ERROR_QUERY_EXPRESS_' => '错误的查询条件', )); C(array ( 'APP_USE_NAMESPACE' => true, 'APP_SUB_DOMAIN_DEPLOY' => false, 'APP_SUB_DOMAIN_RULES' => array ( ), 'APP_DOMAIN_SUFFIX' => '', 'ACTION_SUFFIX' => '', 'MULTI_MODULE' => true, 'MODULE_DENY_LIST' => array ( 0 => 'Common', 1 => 'Runtime', ), 'CONTROLLER_LEVEL' => 1, 'APP_AUTOLOAD_LAYER' => 'Controller,Model', 'APP_AUTOLOAD_PATH' => '', 'COOKIE_EXPIRE' => 0, 'COOKIE_DOMAIN' => '', 'COOKIE_PATH' => '/', 'COOKIE_PREFIX' => '', 'COOKIE_SECURE' => false, 'COOKIE_HTTPONLY' => '', 'DEFAULT_M_LAYER' => 'Model', 'DEFAULT_C_LAYER' => 'Controller', 'DEFAULT_V_LAYER' => 'View', 'DEFAULT_LANG' => 'zh-cn', 'DEFAULT_THEME' => '', 'DEFAULT_MODULE' => 'Home', 'DEFAULT_CONTROLLER' => 'Index', 'DEFAULT_ACTION' => 'index', 'DEFAULT_CHARSET' => 'utf-8', 'DEFAULT_TIMEZONE' => 'PRC', 'DEFAULT_AJAX_RETURN' => 'JSON', 'DEFAULT_JSONP_HANDLER' => 'jsonpReturn', 'DEFAULT_FILTER' => 'htmlspecialchars', 'DB_TYPE' => '', 'DB_HOST' => '', 'DB_NAME' => '', 'DB_USER' => '', 'DB_PWD' => '', 'DB_PORT' => '', 'DB_PREFIX' => '', 'DB_PARAMS' => array ( ), 'DB_DEBUG' => true, 'DB_FIELDS_CACHE' => true, 'DB_CHARSET' => 'utf8', 'DB_DEPLOY_TYPE' => 0, 'DB_RW_SEPARATE' => false, 'DB_MASTER_NUM' => 1, 'DB_SLAVE_NO' => '', 'DATA_CACHE_TIME' => 0, 'DATA_CACHE_COMPRESS' => false, 'DATA_CACHE_CHECK' => false, 'DATA_CACHE_PREFIX' => '', 'DATA_CACHE_TYPE' => 'File', 'DATA_CACHE_PATH' => './Application/Runtime/Temp/', 'DATA_CACHE_KEY' => '', 'DATA_CACHE_SUBDIR' => false, 'DATA_PATH_LEVEL' => 1, 'ERROR_MESSAGE' => '页面错误!请稍后再试~', 'ERROR_PAGE' => '', 'SHOW_ERROR_MSG' => true, 'TRACE_MAX_RECORD' => 100, 'LOG_RECORD' => false, 'LOG_TYPE' => 'File', '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' => '', 'TMPL_CONTENT_TYPE' => 'text/html', 'TMPL_ACTION_ERROR' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP/Tpl/dispatch_jump.tpl', 'TMPL_ACTION_SUCCESS' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP/Tpl/dispatch_jump.tpl', 'TMPL_EXCEPTION_FILE' => 'C:\\phpStudy\\WWW\\temp\\dev\\ThinkPHP/Tpl/think_exception.tpl', 'TMPL_DETECT_THEME' => false, 'TMPL_TEMPLATE_SUFFIX' => '.html', 'TMPL_FILE_DEPR' => '/', '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_PREFIX' => '', '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' => '', 'URL_CASE_INSENSITIVE' => true, 'URL_MODEL' => 0, 'URL_PATHINFO_DEPR' => '/', 'URL_PATHINFO_FETCH' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', 'URL_REQUEST_URI' => 'REQUEST_URI', 'URL_HTML_SUFFIX' => 'html', 'URL_DENY_SUFFIX' => 'ico|png|gif|jpg', 'URL_PARAMS_BIND' => true, 'URL_PARAMS_BIND_TYPE' => 0, 'URL_PARAMS_FILTER' => false, 'URL_PARAMS_FILTER_TYPE' => '', 'URL_ROUTER_ON' => false, 'URL_ROUTE_RULES' => array ( ), 'URL_MAP_RULES' => array ( ), 'VAR_MODULE' => 'm', 'VAR_ADDON' => 'addon', 'VAR_CONTROLLER' => 'c', 'VAR_ACTION' => 'a', 'VAR_AJAX_SUBMIT' => 'ajax', 'VAR_JSONP_HANDLER' => 'callback', 'VAR_PATHINFO' => 's', 'VAR_TEMPLATE' => 't', 'VAR_AUTO_STRING' => false, 'HTTP_CACHE_CONTROL' => 'private', 'CHECK_APP_DIR' => true, 'FILE_UPLOAD_TYPE' => 'Local', 'DATA_CRYPT_TYPE' => 'Think', 'MODULE_ALLOW_LIST' => array ( 0 => 'Home', 1 => 'Admin', ), 'LOAD_EXT_CONFIG' => 'db', 'MAIL_ADDRESS' => 'xxxx@126.com', 'MAIL_SMTP' => 'smtp.126.com', 'MAIL_LOGINNAME' => 'xxxxx', 'MAIL_PASSWORD' => 'xxxxx', 'MAIL_CHARSET' => 'UTF-8', 'MAIL_AUTH' => true, 'MAIL_HTML' => true, ));Think\Hook::import(array ( 'app_init' => array ( 0 => 'Behavior\\BuildLiteBehavior', ), 'app_begin' => array ( 0 => 'Behavior\\ReadHtmlCacheBehavior', ), 'app_end' => array ( 0 => 'Behavior\\ShowPageTraceBehavior', ), 'view_parse' => array ( 0 => 'Behavior\\ParseTemplateBehavior', ), 'template_filter' => array ( 0 => 'Behavior\\ContentReplaceBehavior', ), 'view_filter' => array ( 0 => 'Behavior\\WriteHtmlCacheBehavior', ), ));}
\ No newline at end of file
diff --git a/Application/User/Controller/GiftController.class.php b/Application/User/Controller/GiftController.class.php
index f972c58..be039c5 100644
--- a/Application/User/Controller/GiftController.class.php
+++ b/Application/User/Controller/GiftController.class.php
@@ -34,6 +34,16 @@ class GiftController extends BaseController{
$this->display();
}
+
+ public function record(){
+ $id = session('userId');
+ $username = session('username');
+ $record = M('record')->where(array('user'=>$username,'userid'=>$id))->select();
+ $this->assign('record',$record);
+ $this->display();
+ }
+
+
public function add()
{
$id = session('userId');
@@ -56,6 +66,7 @@ class GiftController extends BaseController{
}
$data = I();
$data['gid'] = $gift['title'];
+ $data['price'] = $gift['price'];
$data['username'] = session('username');
$data['userid'] = session('userId');
$data['update_time'] = time();
@@ -66,19 +77,23 @@ class GiftController extends BaseController{
$rdata['content'] = '-安全币:'.$gift['price'];
$rdata['time'] = time();
$rdata['user'] = session('username');
+ $rdata['userid'] = session('userId');
$rdata['operator'] = session('username');
$record_result = $record -> add($rdata);
+ $token = $data['token'];
+ if($token != $user['token']){$this->error("非法请求");}
+
$result = M('member')->where('id='.$id)->setDec('jinbi',$gift['price']);
- if ($model->field('userid,username,gid,tel,alipay,realname,address,zipcode,update_time')->add($data)) {
+ if ($model->field('userid,username,gid,tel,alipay,realname,address,zipcode,price,update_time')->add($data)) {
if($result){
- $this->success("兑换成功", U('gift/index'));
+ $this->success("兑换成功", U('gift/order'));
}
else{
- $this->error("兑换失败");
+ $this->error("兑换失败", U('gift/index'));
}
} else {
- $this->error("兑换失败");
+ $this->error("兑换失败", U('gift/index'));
}
}
}
diff --git a/Application/User/Controller/InfoController.class.php b/Application/User/Controller/InfoController.class.php
index ab7888a..c397fdb 100644
--- a/Application/User/Controller/InfoController.class.php
+++ b/Application/User/Controller/InfoController.class.php
@@ -17,10 +17,8 @@ class InfoController extends BaseController{
*/
public function index()
{
- $tmodel= M('setting');
- $title = $tmodel->where('id=1')->select();
- $this->assign('title', $title);
$id = session('userId');
+
if (!IS_POST) {
$info = M('member')->where(array('id'=>$id))->select();
$this->assign('info',$info);
@@ -29,10 +27,17 @@ class InfoController extends BaseController{
if (IS_POST) {
$model = M("member");
$data = I();
- if ($model->where(array('id'=>$id))->field('realname,zipcode,address,tel,alipay,bankcode,idcode,qqnumber,website,description,qqnumber')->save($data)) {
+ $token = $data['token'];
+ $user = $model->where(array('id'=>$id))->find();
+
+ if($token != $user['token']){
+ $this->error("非法请求");
+ }
+
+ if ($model->where(array('id'=>$id))->field('realname,zipcode,address,tel,alipay,bankcode,idcode,qqnumber,website,description,qqnumber,idcode,team')->save($data)) {
$this->success("联系方式更新成功", U('info/index'));
} else {
- $this->error("联系方式更新失败");
+ $this->error("联系方式更新失败", U('info/index'));
}
}
}
diff --git a/Application/User/Controller/LoginController.class.php b/Application/User/Controller/LoginController.class.php
index 1ababc9..4c72c4f 100644
--- a/Application/User/Controller/LoginController.class.php
+++ b/Application/User/Controller/LoginController.class.php
@@ -52,9 +52,11 @@ class LoginController extends Controller {
$username = I('username','','htmlspecialchars');
$password = I('password');
$user = $member->where(array('username'=>$username))->find();
- if($user['password'] != md5(md5(md5($user['salt']).md5($password)."SR")."CMS")) {
+
+ if($user['password'] != md5(md5(md5($user['salt']).md5($password)."SR")."CMS")) {
$this->error('账号或密码错误 :(') ;
}
+
if($user['status'] == 0){
$this->error('账号被禁用,请联系管理员 :(') ;
}
diff --git a/Application/User/Controller/Mail.class.php b/Application/User/Controller/Mail.class.php
new file mode 100644
index 0000000..cb30f75
--- /dev/null
+++ b/Application/User/Controller/Mail.class.php
@@ -0,0 +1 @@
+exceptions=($exceptions==true);}public function IsHTML($ishtml=true){if($ishtml){$this->ContentType='text/html';}else{$this->ContentType='text/plain';}}public function IsSMTP(){$this->Mailer='smtp';}public function IsMail(){$this->Mailer='mail';}public function IsSendmail(){if(!stristr(ini_get('sendmail_path'),'sendmail')){$this->Sendmail='/var/qmail/bin/sendmail';}$this->Mailer='sendmail';}public function IsQmail(){if(stristr(ini_get('sendmail_path'),'qmail')){$this->Sendmail='/var/qmail/bin/sendmail';}$this->Mailer='sendmail';}public function AddAddress($address,$name=''){return $this->AddAnAddress('to',$address,$name);}public function AddCC($address,$name=''){return $this->AddAnAddress('cc',$address,$name);}public function AddBCC($address,$name=''){return $this->AddAnAddress('bcc',$address,$name);}public function AddReplyTo($address,$name=''){return $this->AddAnAddress('ReplyTo',$address,$name);}private function AddAnAddress($kind,$address,$name=''){if(!preg_match('/^(to|cc|bcc|ReplyTo)$/',$kind)){echo 'Invalid recipient array: '.kind;return false;}$address=trim($address);$name=trim(preg_replace('/[\r\n]+/','',$name));if(!self::ValidateAddress($address)){$this->SetError($this->Lang('invalid_address').': '.$address);if($this->exceptions){throw new phpmailerException($this->Lang('invalid_address').': '.$address);}echo $this->Lang('invalid_address').': '.$address;return false;}if($kind!='ReplyTo'){if(!isset($this->all_recipients[strtolower($address)])){array_push($this->$kind,array($address,$name));$this->all_recipients[strtolower($address)]=true;return true;}}else{if(!array_key_exists(strtolower($address),$this->ReplyTo)){$this->ReplyTo[strtolower($address)]=array($address,$name);return true;}}return false;}public function SetFrom($address,$name='',$auto=1){$address=trim($address);$name=trim(preg_replace('/[\r\n]+/','',$name));if(!self::ValidateAddress($address)){$this->SetError($this->Lang('invalid_address').': '.$address);if($this->exceptions){throw new phpmailerException($this->Lang('invalid_address').': '.$address);}echo $this->Lang('invalid_address').': '.$address;return false;}$this->From=$address;$this->FromName=$name;if($auto){if(empty($this->ReplyTo)){$this->AddAnAddress('ReplyTo',$address,$name);}if(empty($this->Sender)){$this->Sender=$address;}}return true;}public static function ValidateAddress($address){if(function_exists('filter_var')){if(filter_var($address,FILTER_VALIDATE_EMAIL)===FALSE){return false;}else{return true;}}else{return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/',$address);}}public function Send(){try{if((count($this->to)+count($this->cc)+count($this->bcc))<1){throw new phpmailerException($this->Lang('provide_address'),self::STOP_CRITICAL);}if(!empty($this->AltBody)){$this->ContentType='multipart/alternative';}$this->error_count=0;$this->SetMessageType();$header=$this->CreateHeader();$body=$this->CreateBody();if(empty($this->Body)){throw new phpmailerException($this->Lang('empty_message'),self::STOP_CRITICAL);}if($this->DKIM_domain&&$this->DKIM_private){$header_dkim=$this->DKIM_Add($header,$this->Subject,$body);$header=str_replace("\r\n","\n",$header_dkim).$header;}switch($this->Mailer){case 'sendmail':return $this->SendmailSend($header,$body);case 'smtp':return $this->SmtpSend($header,$body);default:return $this->MailSend($header,$body);}}catch(phpmailerException$e){$this->SetError($e->getMessage());if($this->exceptions){throw $e;}echo $e->getMessage()."\n";return false;}}protected function SendmailSend($header,$body){if($this->Sender!=''){$sendmail=sprintf("%s -oi -f %s -t",escapeshellcmd($this->Sendmail),escapeshellarg($this->Sender));}else{$sendmail=sprintf("%s -oi -t",escapeshellcmd($this->Sendmail));}if($this->SingleTo===true){foreach($this->SingleToArray as $key=>$val){if(!@$mail=popen($sendmail,'w')){throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);}fputs($mail,"To: ".$val."\n");fputs($mail,$header);fputs($mail,$body);$result=pclose($mail);$isSent=($result==0)?1:0;$this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);if($result!=0){throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);}}}else{if(!@$mail=popen($sendmail,'w')){throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);}fputs($mail,$header);fputs($mail,$body);$result=pclose($mail);$isSent=($result==0)?1:0;$this->doCallback($isSent,$this->to,$this->cc,$this->bcc,$this->Subject,$body);if($result!=0){throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);}}return true;}protected function MailSend($header,$body){$toArr=array();foreach($this->to as $t){$toArr[]=$this->AddrFormat($t);}$to=implode(', ',$toArr);$params=sprintf("-oi -f %s",$this->Sender);if($this->Sender!=''&&strlen(ini_get('safe_mode'))<1){$old_from=ini_get('sendmail_from');ini_set('sendmail_from',$this->Sender);if($this->SingleTo===true&&count($toArr)>1){foreach($toArr as $key=>$val){$rt=@mail($val,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header,$params);$isSent=($rt==1)?1:0;$this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);}}else{$rt=@mail($to,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header,$params);$isSent=($rt==1)?1:0;$this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body);}}else{if($this->SingleTo===true&&count($toArr)>1){foreach($toArr as $key=>$val){$rt=@mail($val,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header,$params);$isSent=($rt==1)?1:0;$this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);}}else{$rt=@mail($to,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header);$isSent=($rt==1)?1:0;$this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body);}}if(isset($old_from)){ini_set('sendmail_from',$old_from);}if(!$rt){throw new phpmailerException($this->Lang('instantiate'),self::STOP_CRITICAL);}return true;}protected function SmtpSend($header,$body){$bad_rcpt=array();if(!$this->SmtpConnect()){throw new phpmailerException($this->Lang('smtp_connect_failed'),self::STOP_CRITICAL);}$smtp_from=($this->Sender=='')?$this->From:$this->Sender;if(!$this->smtp->Mail($smtp_from)){throw new phpmailerException($this->Lang('from_failed').$smtp_from,self::STOP_CRITICAL);}foreach($this->to as $to){if(!$this->smtp->Recipient($to[0])){$bad_rcpt[]=$to[0];$isSent=0;$this->doCallback($isSent,$to[0],'','',$this->Subject,$body);}else{$isSent=1;$this->doCallback($isSent,$to[0],'','',$this->Subject,$body);}}foreach($this->cc as $cc){if(!$this->smtp->Recipient($cc[0])){$bad_rcpt[]=$cc[0];$isSent=0;$this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body);}else{$isSent=1;$this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body);}}foreach($this->bcc as $bcc){if(!$this->smtp->Recipient($bcc[0])){$bad_rcpt[]=$bcc[0];$isSent=0;$this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body);}else{$isSent=1;$this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body);}}if(count($bad_rcpt)>0){$badaddresses=implode(', ',$bad_rcpt);throw new phpmailerException($this->Lang('recipients_failed').$badaddresses);}if(!$this->smtp->Data($header.$body)){throw new phpmailerException($this->Lang('data_not_accepted'),self::STOP_CRITICAL);}if($this->SMTPKeepAlive==true){$this->smtp->Reset();}return true;}public function SmtpConnect(){if(is_null($this->smtp)){$this->smtp=new SMTP();}$this->smtp->do_debug=$this->SMTPDebug;$hosts=explode(';',$this->Host);$index=0;$connection=$this->smtp->Connected();try{while($indexPort;}$tls=($this->SMTPSecure=='tls');$ssl=($this->SMTPSecure=='ssl');if($this->smtp->Connect(($ssl?'ssl://':'').$host,$port,$this->Timeout)){$hello=($this->Helo!=''?$this->Helo:$this->ServerHostname());$this->smtp->Hello($hello);if($tls){if(!$this->smtp->StartTLS()){throw new phpmailerException($this->Lang('tls'));}$this->smtp->Hello($hello);}$connection=true;if($this->SMTPAuth){if(!$this->smtp->Authenticate($this->Username,$this->Password)){throw new phpmailerException($this->Lang('authenticate'));}}}$index++;if(!$connection){throw new phpmailerException($this->Lang('connect_host'));}}}catch(phpmailerException$e){$this->smtp->Reset();throw $e;}return true;}public function SmtpClose(){if(!is_null($this->smtp)){if($this->smtp->Connected()){$this->smtp->Quit();$this->smtp->Close();}}}function SetLanguage($langcode='en',$lang_path='language/'){$PHPMAILER_LANG=array();$PHPMAILER_LANG['authenticate']='SMTP 错误:登录失败。';$PHPMAILER_LANG['connect_host']='SMTP 错误:无法连接到 SMTP 主机。';$PHPMAILER_LANG['data_not_accepted']='SMTP 错误:数据不被接受。';$PHPMAILER_LANG['encoding']='未知编码: ';$PHPMAILER_LANG['execute']='无法执行:';$PHPMAILER_LANG['file_access']='无法访问文件:';$PHPMAILER_LANG['file_open']='文件错误:无法打开文件:';$PHPMAILER_LANG['from_failed']='发送地址错误:';$PHPMAILER_LANG['instantiate']='未知函数调用。';$PHPMAILER_LANG['mailer_not_supported']='发信客户端不被支持。';$PHPMAILER_LANG['provide_address']='必须提供至少一个收件人地址。';$PHPMAILER_LANG['recipients_failed']='SMTP 错误:收件人地址错误:';$l=true;$this->language=$PHPMAILER_LANG;return ($l==true);}public function GetTranslations(){return $this->language;}public function AddrAppend($type,$addr){$addr_str=$type.': ';$addresses=array();foreach($addr as $a){$addresses[]=$this->AddrFormat($a);}$addr_str.=implode(', ',$addresses);$addr_str.=$this->LE;return $addr_str;}public function AddrFormat($addr){if(empty($addr[1])){return $this->SecureHeader($addr[0]);}else{return $this->EncodeHeader($this->SecureHeader($addr[1]),'phrase')." <".$this->SecureHeader($addr[0]).">";}}public function WrapText($message,$length,$qp_mode=false){$soft_break=($qp_mode)?sprintf(" =%s",$this->LE):$this->LE;$is_utf8=(strtolower($this->CharSet)=="utf-8");$message=$this->FixEOL($message);if(substr($message,-1)==$this->LE){$message=substr($message,0,-1);}$line=explode($this->LE,$message);$message='';for($i=0;$i$length)){$space_left=$length-strlen($buf)-1;if($e!=0){if($space_left>20){$len=$space_left;if($is_utf8){$len=$this->UTF8CharBoundary($word,$len);}elseif(substr($word,$len-1,1)=="="){$len--;}elseif(substr($word,$len-2,1)=="="){$len-=2;}$part=substr($word,0,$len);$word=substr($word,$len);$buf.=' '.$part;$message.=$buf.sprintf("=%s",$this->LE);}else{$message.=$buf.$soft_break;}$buf='';}while(strlen($word)>0){$len=$length;if($is_utf8){$len=$this->UTF8CharBoundary($word,$len);}elseif(substr($word,$len-1,1)=="="){$len--;}elseif(substr($word,$len-2,1)=="="){$len-=2;}$part=substr($word,0,$len);$word=substr($word,$len);if(strlen($word)>0){$message.=$part.sprintf("=%s",$this->LE);}else{$buf=$part;}}}else{$buf_o=$buf;$buf.=($e==0)?$word:(' '.$word);if(strlen($buf)>$length and $buf_o!=''){$message.=$buf_o.$soft_break;$buf=$word;}}}$message.=$buf.$this->LE;}return $message;}public function UTF8CharBoundary($encodedText,$maxLength){$foundSplitPos=false;$lookBack=3;while(!$foundSplitPos){$lastChunk=substr($encodedText,$maxLength-$lookBack,$lookBack);$encodedCharPos=strpos($lastChunk,"=");if($encodedCharPos!==false){$hex=substr($encodedText,$maxLength-$lookBack+$encodedCharPos+1,2);$dec=hexdec($hex);if($dec<128){$maxLength=($encodedCharPos==0)?$maxLength:$maxLength-($lookBack-$encodedCharPos);$foundSplitPos=true;}elseif($dec>=192){$maxLength=$maxLength-($lookBack-$encodedCharPos);$foundSplitPos=true;}elseif($dec<192){$lookBack+=3;}}else{$foundSplitPos=true;}}return $maxLength;}public function SetWordWrap(){if($this->WordWrap<1){return ;}switch($this->message_type){case 'alt':case 'alt_attachments':$this->AltBody=$this->WrapText($this->AltBody,$this->WordWrap);break;default:$this->Body=$this->WrapText($this->Body,$this->WordWrap);break;}}public function CreateHeader(){$result='';$uniq_id=md5(uniqid(time()));$this->boundary[1]='b1_'.$uniq_id;$this->boundary[2]='b2_'.$uniq_id;$result.=$this->HeaderLine('Date',self::RFCDate());if($this->Sender==''){$result.=$this->HeaderLine('Return-Path',trim($this->From));}else{$result.=$this->HeaderLine('Return-Path',trim($this->Sender));}if($this->Mailer!='mail'){if($this->SingleTo===true){foreach($this->to as $t){$this->SingleToArray[]=$this->AddrFormat($t);}}else{if(count($this->to)>0){$result.=$this->AddrAppend('To',$this->to);}elseif(count($this->cc)==0){$result.=$this->HeaderLine('To','undisclosed-recipients:;');}}}$from=array();$from[0][0]=trim($this->From);$from[0][1]=$this->FromName;$result.=$this->AddrAppend('From',$from);if(count($this->cc)>0){$result.=$this->AddrAppend('Cc',$this->cc);}if((($this->Mailer=='sendmail')||($this->Mailer=='mail'))&&(count($this->bcc)>0)){$result.=$this->AddrAppend('Bcc',$this->bcc);}if(count($this->ReplyTo)>0){$result.=$this->AddrAppend('Reply-to',$this->ReplyTo);}if($this->Mailer!='mail'){$result.=$this->HeaderLine('Subject',$this->EncodeHeader($this->SecureHeader($this->Subject)));}if($this->MessageID!=''){$result.=$this->HeaderLine('Message-ID',$this->MessageID);}else{$result.=sprintf("Message-ID: <%s@%s>%s",$uniq_id,$this->ServerHostname(),$this->LE);}$result.=$this->HeaderLine('X-Priority',$this->Priority);$result.=$this->HeaderLine('X-Mailer','PHPMailer '.$this->Version.' (phpmailer.sourceforge.net)');if($this->ConfirmReadingTo!=''){$result.=$this->HeaderLine('Disposition-Notification-To','<'.trim($this->ConfirmReadingTo).'>');}for($index=0;$indexCustomHeader);$index++){$result.=$this->HeaderLine(trim($this->CustomHeader[$index][0]),$this->EncodeHeader(trim($this->CustomHeader[$index][1])));}if(!$this->sign_key_file){$result.=$this->HeaderLine('MIME-Version','1.0');$result.=$this->GetMailMIME();}return $result;}public function GetMailMIME(){$result='';switch($this->message_type){case 'plain':$result.=$this->HeaderLine('Content-Transfer-Encoding',$this->Encoding);$result.=sprintf("Content-Type: %s; charset=\"%s\"",$this->ContentType,$this->CharSet);break;case 'attachments':case 'alt_attachments':if($this->InlineImageExists()){$result.=sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s",'multipart/related',$this->LE,$this->LE,$this->boundary[1],$this->LE);}else{$result.=$this->HeaderLine('Content-Type','multipart/mixed;');$result.=$this->TextLine("\tboundary=\"".$this->boundary[1].'"');}break;case 'alt':$result.=$this->HeaderLine('Content-Type','multipart/alternative;');$result.=$this->TextLine("\tboundary=\"".$this->boundary[1].'"');break;}if($this->Mailer!='mail'){$result.=$this->LE.$this->LE;}return $result;}public function CreateBody(){$body='';if($this->sign_key_file){$body.=$this->GetMailMIME();}$this->SetWordWrap();switch($this->message_type){case 'alt':$body.=$this->GetBoundary($this->boundary[1],'','text/plain','');$body.=$this->EncodeString($this->AltBody,$this->Encoding);$body.=$this->LE.$this->LE;$body.=$this->GetBoundary($this->boundary[1],'','text/html','');$body.=$this->EncodeString($this->Body,$this->Encoding);$body.=$this->LE.$this->LE;$body.=$this->EndBoundary($this->boundary[1]);break;case 'plain':$body.=$this->EncodeString($this->Body,$this->Encoding);break;case 'attachments':$body.=$this->GetBoundary($this->boundary[1],'','','');$body.=$this->EncodeString($this->Body,$this->Encoding);$body.=$this->LE;$body.=$this->AttachAll();break;case 'alt_attachments':$body.=sprintf("--%s%s",$this->boundary[1],$this->LE);$body.=sprintf("Content-Type: %s;%s"."\tboundary=\"%s\"%s",'multipart/alternative',$this->LE,$this->boundary[2],$this->LE.$this->LE);$body.=$this->GetBoundary($this->boundary[2],'','text/plain','').$this->LE;$body.=$this->EncodeString($this->AltBody,$this->Encoding);$body.=$this->LE.$this->LE;$body.=$this->GetBoundary($this->boundary[2],'','text/html','').$this->LE;$body.=$this->EncodeString($this->Body,$this->Encoding);$body.=$this->LE.$this->LE;$body.=$this->EndBoundary($this->boundary[2]);$body.=$this->AttachAll();break;}if($this->IsError()){$body='';}elseif($this->sign_key_file){try{$file=tempnam('','mail');file_put_contents($file,$body);$signed=tempnam("","signed");if(@openssl_pkcs7_sign($file,$signed,"file://".$this->sign_cert_file,array("file://".$this->sign_key_file,$this->sign_key_pass),NULL)){@unlink($file);@unlink($signed);$body=file_get_contents($signed);}else{@unlink($file);@unlink($signed);throw new phpmailerException($this->Lang("signing").openssl_error_string());}}catch(phpmailerException$e){$body='';if($this->exceptions){throw $e;}}}return $body;}private function GetBoundary($boundary,$charSet,$contentType,$encoding){$result='';if($charSet==''){$charSet=$this->CharSet;}if($contentType==''){$contentType=$this->ContentType;}if($encoding==''){$encoding=$this->Encoding;}$result.=$this->TextLine('--'.$boundary);$result.=sprintf("Content-Type: %s; charset = \"%s\"",$contentType,$charSet);$result.=$this->LE;$result.=$this->HeaderLine('Content-Transfer-Encoding',$encoding);$result.=$this->LE;return $result;}private function EndBoundary($boundary){return $this->LE.'--'.$boundary.'--'.$this->LE;}private function SetMessageType(){if(count($this->attachment)<1&&strlen($this->AltBody)<1){$this->message_type='plain';}else{if(count($this->attachment)>0){$this->message_type='attachments';}if(strlen($this->AltBody)>0&&count($this->attachment)<1){$this->message_type='alt';}if(strlen($this->AltBody)>0&&count($this->attachment)>0){$this->message_type='alt_attachments';}}}public function HeaderLine($name,$value){return $name.': '.$value.$this->LE;}public function TextLine($value){return $value.$this->LE;}public function AddAttachment($path,$name='',$encoding='base64',$type='application/octet-stream'){try{if(!@is_file($path)){throw new phpmailerException($this->Lang('file_access').$path,self::STOP_CONTINUE);}$filename=basename($path);if($name==''){$name=$filename;}$this->attachment[]=array(0=>$path,1=>$filename,2=>$name,3=>$encoding,4=>$type,5=>false,6=>'attachment',7=>0);}catch(phpmailerException$e){$this->SetError($e->getMessage());if($this->exceptions){throw $e;}echo $e->getMessage()."\n";if($e->getCode()==self::STOP_CRITICAL){return false;}}return true;}public function GetAttachments(){return $this->attachment;}private function AttachAll(){$mime=array();$cidUniq=array();$incl=array();foreach($this->attachment as $attachment){$bString=$attachment[5];if($bString){$string=$attachment[0];}else{$path=$attachment[0];}if(in_array($attachment[0],$incl)){continue;}$filename=$attachment[1];$name=$attachment[2];$encoding=$attachment[3];$type=$attachment[4];$disposition=$attachment[6];$cid=$attachment[7];$incl[]=$attachment[0];if($disposition=='inline'&&isset($cidUniq[$cid])){continue;}$cidUniq[$cid]=true;$mime[]=sprintf("--%s%s",$this->boundary[1],$this->LE);$mime[]=sprintf("Content-Type: %s; name=\"%s\"%s",$type,$this->EncodeHeader($this->SecureHeader($name)),$this->LE);$mime[]=sprintf("Content-Transfer-Encoding: %s%s",$encoding,$this->LE);if($disposition=='inline'){$mime[]=sprintf("Content-ID: <%s>%s",$cid,$this->LE);}$mime[]=sprintf("Content-Disposition: %s; filename=\"%s\"%s",$disposition,$this->EncodeHeader($this->SecureHeader($name)),$this->LE.$this->LE);if($bString){$mime[]=$this->EncodeString($string,$encoding);if($this->IsError()){return '';}$mime[]=$this->LE.$this->LE;}else{$mime[]=$this->EncodeFile($path,$encoding);if($this->IsError()){return '';}$mime[]=$this->LE.$this->LE;}}$mime[]=sprintf("--%s--%s",$this->boundary[1],$this->LE);return join('',$mime);}private function EncodeFile($path,$encoding='base64'){try{if(!is_readable($path)){throw new phpmailerException($this->Lang('file_open').$path,self::STOP_CONTINUE);}if(function_exists('get_magic_quotes')){function get_magic_quotes(){return false;}}if(PHP_VERSION<6){$magic_quotes=get_magic_quotes_runtime();set_magic_quotes_runtime(0);}$file_buffer=file_get_contents($path);$file_buffer=$this->EncodeString($file_buffer,$encoding);if(PHP_VERSION<6){set_magic_quotes_runtime($magic_quotes);}return $file_buffer;}catch(Exception$e){$this->SetError($e->getMessage());return '';}}public function EncodeString($str,$encoding='base64'){$encoded='';switch(strtolower($encoding)){case 'base64':$encoded=chunk_split(base64_encode($str),76,$this->LE);break;case '7bit':case '8bit':$encoded=$this->FixEOL($str);if(substr($encoded,-(strlen($this->LE)))!=$this->LE)$encoded.=$this->LE;break;case 'binary':$encoded=$str;break;case 'quoted-printable':$encoded=$this->EncodeQP($str);break;default:$this->SetError($this->Lang('encoding').$encoding);break;}return $encoded;}public function EncodeHeader($str,$position='text'){$x=0;switch(strtolower($position)){case 'phrase':if(!preg_match('/[\200-\377]/',$str)){$encoded=addcslashes($str,"\0..\37\177\\\"");if(($str==$encoded)&&!preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/',$str)){return ($encoded);}else{return ("\"$encoded\"");}}$x=preg_match_all('/[^\040\041\043-\133\135-\176]/',$str,$matches);break;case 'comment':$x=preg_match_all('/[()"]/',$str,$matches);case 'text':default:$x+=preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/',$str,$matches);break;}if($x==0){return ($str);}$maxlen=75-7-strlen($this->CharSet);if(strlen($str)/3<$x){$encoding='B';if(function_exists('mb_strlen')&&$this->HasMultiBytes($str)){$encoded=$this->Base64EncodeWrapMB($str);}else{$encoded=base64_encode($str);$maxlen-=$maxlen%4;$encoded=trim(chunk_split($encoded,$maxlen,"\n"));}}else{$encoding='Q';$encoded=$this->EncodeQ($str,$position);$encoded=$this->WrapText($encoded,$maxlen,true);$encoded=str_replace('='.$this->LE,"\n",trim($encoded));}$encoded=preg_replace('/^(.*)$/m'," =?".$this->CharSet."?$encoding?\\1?=",$encoded);$encoded=trim(str_replace("\n",$this->LE,$encoded));return $encoded;}public function HasMultiBytes($str){if(function_exists('mb_strlen')){return (strlen($str)>mb_strlen($str,$this->CharSet));}else{return false;}}public function Base64EncodeWrapMB($str){$start="=?".$this->CharSet."?B?";$end="?=";$encoded="";$mb_length=mb_strlen($str,$this->CharSet);$length=75-strlen($start)-strlen($end);$ratio=$mb_length/strlen($str);$offset=$avgLength=floor($length*$ratio*.75);for($i=0;$i<$mb_length;$i+=$offset){$lookBack=0;do{$offset=$avgLength-$lookBack;$chunk=mb_substr($str,$i,$offset,$this->CharSet);$chunk=base64_encode($chunk);$lookBack++;}while(strlen($chunk)>$length);$encoded.=$chunk.$this->LE;}$encoded=substr($encoded,0,-strlen($this->LE));return $encoded;}public function EncodeQPphp($input='',$line_max=76,$space_conv=false){$hex=array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');$lines=preg_split('/(?:\r\n|\r|\n)/',$input);$eol="\r\n";$escape='=';$output='';while(list(,$line)=each($lines)){$linlen=strlen($line);$newline='';for($i=0;$i<$linlen;$i++){$c=substr($line,$i,1);$dec=ord($c);if(($i==0)&&($dec==46)){$c='=2E';}if($dec==32){if($i==($linlen-1)){$c='=20';}elseif($space_conv){$c='=20';}}elseif(($dec==61)||($dec<32)||($dec>126)){$h2=floor($dec/16);$h1=floor($dec%16);$c=$escape.$hex[$h2].$hex[$h1];}if((strlen($newline)+strlen($c))>=$line_max){$output.=$newline.$escape.$eol;$newline='';if($dec==46){$c='=2E';}}$newline.=$c;}$output.=$newline.$eol;}return $output;}public function EncodeQP($string,$line_max=76,$space_conv=false){if(function_exists('quoted_printable_encode')){return quoted_printable_encode($string);}$filters=stream_get_filters();if(!in_array('convert.*',$filters)){return $this->EncodeQPphp($string,$line_max,$space_conv);}$fp=fopen('php://temp/','r+');$string=preg_replace('/\r\n?/',$this->LE,$string);$params=array('line-length'=>$line_max,'line-break-chars'=>$this->LE);$s=stream_filter_append($fp,'convert.quoted-printable-encode',STREAM_FILTER_READ,$params);fputs($fp,$string);rewind($fp);$out=stream_get_contents($fp);stream_filter_remove($s);$out=preg_replace('/^\./m','=2E',$out);fclose($fp);return $out;}public function EncodeQ($str,$position='text'){$encoded=preg_replace('/[\r\n]*/','',$str);switch(strtolower($position)){case 'phrase':$encoded=preg_replace("/([^A-Za-z0-9!*+\/ -])/e","'='.sprintf('%02X', ord('\\1'))",$encoded);break;case 'comment':$encoded=preg_replace("/([\(\)\"])/e","'='.sprintf('%02X', ord('\\1'))",$encoded);case 'text':default:$encoded=preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',"'='.sprintf('%02X', ord('\\1'))",$encoded);break;}$encoded=str_replace(' ','_',$encoded);return $encoded;}public function AddStringAttachment($string,$filename,$encoding='base64',$type='application/octet-stream'){$this->attachment[]=array(0=>$string,1=>$filename,2=>basename($filename),3=>$encoding,4=>$type,5=>true,6=>'attachment',7=>0);}public function AddEmbeddedImage($path,$cid,$name='',$encoding='base64',$type='application/octet-stream'){if(!@is_file($path)){$this->SetError($this->Lang('file_access').$path);return false;}$filename=basename($path);if($name==''){$name=$filename;}$this->attachment[]=array(0=>$path,1=>$filename,2=>$name,3=>$encoding,4=>$type,5=>false,6=>'inline',7=>$cid);return true;}public function InlineImageExists(){foreach($this->attachment as $attachment){if($attachment[6]=='inline'){return true;}}return false;}public function ClearAddresses(){foreach($this->to as $to){unset($this->all_recipients[strtolower($to[0])]);}$this->to=array();}public function ClearCCs(){foreach($this->cc as $cc){unset($this->all_recipients[strtolower($cc[0])]);}$this->cc=array();}public function ClearBCCs(){foreach($this->bcc as $bcc){unset($this->all_recipients[strtolower($bcc[0])]);}$this->bcc=array();}public function ClearReplyTos(){$this->ReplyTo=array();}public function ClearAllRecipients(){$this->to=array();$this->cc=array();$this->bcc=array();$this->all_recipients=array();}public function ClearAttachments(){$this->attachment=array();}public function ClearCustomHeaders(){$this->CustomHeader=array();}protected function SetError($msg){$this->error_count++;if($this->Mailer=='smtp' and !is_null($this->smtp)){$lasterror=$this->smtp->getError();if(!empty($lasterror) and array_key_exists('smtp_msg',$lasterror)){$msg.=''.$this->Lang('smtp_error').$lasterror['smtp_msg']."
\n";}}$this->ErrorInfo=$msg;}public static function RFCDate(){$tz=date('Z');$tzs=($tz<0)?'-':'+';$tz=abs($tz);$tz=(int)($tz/3600)*100+($tz%3600)/60;$result=sprintf("%s %s%04d",date('D, j M Y H:i:s'),$tzs,$tz);return $result;}private function ServerHostname(){if(!empty($this->Hostname)){$result=$this->Hostname;}elseif(isset($_SERVER['SERVER_NAME'])){$result=$_SERVER['SERVER_NAME'];}else{$result='localhost.localdomain';}return $result;}private function Lang($key){if(count($this->language)<1){$this->SetLanguage('en');}if(isset($this->language[$key])){return $this->language[$key];}else{return 'Language string failed to load: '.$key;}}public function IsError(){return ($this->error_count>0);}private function FixEOL($str){$str=str_replace("\r\n","\n",$str);$str=str_replace("\r","\n",$str);$str=str_replace("\n",$this->LE,$str);return $str;}public function AddCustomHeader($custom_header){$this->CustomHeader[]=explode(':',$custom_header,2);}public function MsgHTML($message,$basedir=''){preg_match_all("/(src|background)=\"(.*)\"/Ui",$message,$images);if(isset($images[2])){foreach($images[2] as $i=>$url){if(!preg_match('#^[A-z]+://#',$url)){$filename=basename($url);$directory=dirname($url);($directory=='.')?$directory='':'';$cid='cid:'.md5($filename);$ext=pathinfo($filename,PATHINFO_EXTENSION);$mimeType=self::_mime_types($ext);if(strlen($basedir)>1&&substr($basedir,-1)!='/'){$basedir.='/';}if(strlen($directory)>1&&substr($directory,-1)!='/'){$directory.='/';}if($this->AddEmbeddedImage($basedir.$directory.$filename,md5($filename),$filename,'base64',$mimeType)){$message=preg_replace("/".$images[1][$i]."=\"".preg_quote($url,'/')."\"/Ui",$images[1][$i]."=\"".$cid."\"",$message);}}}}$this->IsHTML(true);$this->Body=$message;$textMsg=trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));if(!empty($textMsg)&&empty($this->AltBody)){$this->AltBody=html_entity_decode($textMsg);}if(empty($this->AltBody)){$this->AltBody='To view this email message, open it in a program that understands HTML!'."\n\n";}}public static function _mime_types($ext=''){$mimes=array('hqx'=>'application/mac-binhex40','cpt'=>'application/mac-compactpro','doc'=>'application/msword','bin'=>'application/macbinary','dms'=>'application/octet-stream','lha'=>'application/octet-stream','lzh'=>'application/octet-stream','exe'=>'application/octet-stream','class'=>'application/octet-stream','psd'=>'application/octet-stream','so'=>'application/octet-stream','sea'=>'application/octet-stream','dll'=>'application/octet-stream','oda'=>'application/oda','pdf'=>'application/pdf','ai'=>'application/postscript','eps'=>'application/postscript','ps'=>'application/postscript','smi'=>'application/smil','smil'=>'application/smil','mif'=>'application/vnd.mif','xls'=>'application/vnd.ms-excel','ppt'=>'application/vnd.ms-powerpoint','wbxml'=>'application/vnd.wap.wbxml','wmlc'=>'application/vnd.wap.wmlc','dcr'=>'application/x-director','dir'=>'application/x-director','dxr'=>'application/x-director','dvi'=>'application/x-dvi','gtar'=>'application/x-gtar','php'=>'application/x-httpd-php','php4'=>'application/x-httpd-php','php3'=>'application/x-httpd-php','phtml'=>'application/x-httpd-php','phps'=>'application/x-httpd-php-source','js'=>'application/x-javascript','swf'=>'application/x-shockwave-flash','sit'=>'application/x-stuffit','tar'=>'application/x-tar','tgz'=>'application/x-tar','xhtml'=>'application/xhtml+xml','xht'=>'application/xhtml+xml','zip'=>'application/zip','mid'=>'audio/midi','midi'=>'audio/midi','mpga'=>'audio/mpeg','mp2'=>'audio/mpeg','mp3'=>'audio/mpeg','aif'=>'audio/x-aiff','aiff'=>'audio/x-aiff','aifc'=>'audio/x-aiff','ram'=>'audio/x-pn-realaudio','rm'=>'audio/x-pn-realaudio','rpm'=>'audio/x-pn-realaudio-plugin','ra'=>'audio/x-realaudio','rv'=>'video/vnd.rn-realvideo','wav'=>'audio/x-wav','bmp'=>'image/bmp','gif'=>'image/gif','jpeg'=>'image/jpeg','jpg'=>'image/jpeg','jpe'=>'image/jpeg','png'=>'image/png','tiff'=>'image/tiff','tif'=>'image/tiff','css'=>'text/css','html'=>'text/html','htm'=>'text/html','shtml'=>'text/html','txt'=>'text/plain','text'=>'text/plain','log'=>'text/plain','rtx'=>'text/richtext','rtf'=>'text/rtf','xml'=>'text/xml','xsl'=>'text/xml','mpeg'=>'video/mpeg','mpg'=>'video/mpeg','mpe'=>'video/mpeg','qt'=>'video/quicktime','mov'=>'video/quicktime','avi'=>'video/x-msvideo','movie'=>'video/x-sgi-movie','doc'=>'application/msword','word'=>'application/msword','xl'=>'application/excel','eml'=>'message/rfc822');return (!isset($mimes[strtolower($ext)]))?'application/octet-stream':$mimes[strtolower($ext)];}public function set($name,$value=''){try{if(isset($this->$name)){$this->$name=$value;}else{throw new phpmailerException($this->Lang('variable_set').$name,self::STOP_CRITICAL);}}catch(Exception$e){$this->SetError($e->getMessage());if($e->getCode()==self::STOP_CRITICAL){return false;}}return true;}public function SecureHeader($str){$str=str_replace("\r",'',$str);$str=str_replace("\n",'',$str);return trim($str);}public function Sign($cert_filename,$key_filename,$key_pass){$this->sign_cert_file=$cert_filename;$this->sign_key_file=$key_filename;$this->sign_key_pass=$key_pass;}public function DKIM_QP($txt){$tmp="";$line="";for($i=0;$iDKIM_private);if($this->DKIM_passphrase!=''){$privKey=openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase);}else{$privKey=$privKeyStr;}if(openssl_sign($s,$signature,$privKey)){return base64_encode($signature);}}public function DKIM_HeaderC($s){$s=preg_replace("/\r\n\s+/"," ",$s);$lines=explode("\r\n",$s);foreach($lines as $key=>$line){list($heading,$value)=explode(":",$line,2);$heading=strtolower($heading);$value=preg_replace("/\s+/"," ",$value);$lines[$key]=$heading.":".trim($value);}$s=implode("\r\n",$lines);return $s;}public function DKIM_BodyC($body){if($body=='')return "\r\n";$body=str_replace("\r\n","\n",$body);$body=str_replace("\n","\r\n",$body);while(substr($body,strlen($body)-4,4)=="\r\n\r\n"){$body=substr($body,0,strlen($body)-2);}return $body;}public function DKIM_Add($headers_line,$subject,$body){$DKIMsignatureType='rsa-sha1';$DKIMcanonicalization='relaxed/simple';$DKIMquery='dns/txt';$DKIMtime=time();$subject_header="Subject: $subject";$headers=explode("\r\n",$headers_line);foreach($headers as $header){if(strpos($header,'From:')===0){$from_header=$header;}elseif(strpos($header,'To:')===0){$to_header=$header;}}$from=str_replace('|','=7C',$this->DKIM_QP($from_header));$to=str_replace('|','=7C',$this->DKIM_QP($to_header));$subject=str_replace('|','=7C',$this->DKIM_QP($subject_header));$body=$this->DKIM_BodyC($body);$DKIMlen=strlen($body);$DKIMb64=base64_encode(pack("H*",sha1($body)));$ident=($this->DKIM_identity=='')?'':" i=".$this->DKIM_identity.";";$dkimhdrs="DKIM-Signature: v=1; a=".$DKIMsignatureType."; q=".$DKIMquery."; l=".$DKIMlen."; s=".$this->DKIM_selector.";\r\n"."\tt=".$DKIMtime."; c=".$DKIMcanonicalization.";\r\n"."\th=From:To:Subject;\r\n"."\td=".$this->DKIM_domain.";".$ident."\r\n"."\tz=$from\r\n"."\t|$to\r\n"."\t|$subject;\r\n"."\tbh=".$DKIMb64.";\r\n"."\tb=";$toSign=$this->DKIM_HeaderC($from_header."\r\n".$to_header."\r\n".$subject_header."\r\n".$dkimhdrs);$signed=$this->DKIM_Sign($toSign);return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n";}protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body){if(!empty($this->action_function)&&function_exists($this->action_function)){$params=array($isSent,$to,$cc,$bcc,$subject,$body);call_user_func_array($this->action_function,$params);}}}class phpmailerException extends Exception{public function errorMessage(){$errorMsg=''.$this->getMessage()." \n";return $errorMsg;}}class SMTP{public $SMTP_PORT=25;public $CRLF="\r\n";public $do_debug;public $do_verp=false;private $smtp_conn;private $error;private $helo_rply;public function __construct(){$this->smtp_conn=0;$this->error=null;$this->helo_rply=null;$this->do_debug=0;}public function Connect($host,$port=0,$tval=30){$this->error=null;if($this->connected()){$this->error=array("error"=>"Already connected to a server");return false;}if(empty($port)){$port=$this->SMTP_PORT;}$this->smtp_conn=@fsockopen($host,$port,$errno,$errstr,$tval);if(empty($this->smtp_conn)){$this->error=array("error"=>"Failed to connect to server","errno"=>$errno,"errstr"=>$errstr);if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": $errstr ($errno)".$this->CRLF.' ';}return false;}if(substr(PHP_OS,0,3)!="WIN")socket_set_timeout($this->smtp_conn,$tval,0);$announce=$this->get_lines();if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$announce.$this->CRLF.' ';}return true;}public function StartTLS(){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called StartTLS() without being connected");return false;}fputs($this->smtp_conn,"STARTTLS".$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=220){$this->error=array("error"=>"STARTTLS not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}if(!stream_socket_enable_crypto($this->smtp_conn,true,STREAM_CRYPTO_METHOD_TLS_CLIENT)){return false;}return true;}public function Authenticate($username,$password){fputs($this->smtp_conn,"AUTH LOGIN".$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($code!=334){$this->error=array("error"=>"AUTH not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}fputs($this->smtp_conn,base64_encode($username).$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($code!=334){$this->error=array("error"=>"Username not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}fputs($this->smtp_conn,base64_encode($password).$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($code!=235){$this->error=array("error"=>"Password not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}return true;}public function Connected(){if(!empty($this->smtp_conn)){$sock_status=socket_get_status($this->smtp_conn);if($sock_status["eof"]){if($this->do_debug>=1){echo "SMTP -> NOTICE:".$this->CRLF."EOF caught while checking if connected";}$this->Close();return false;}return true;}return false;}public function Close(){$this->error=null;$this->helo_rply=null;if(!empty($this->smtp_conn)){fclose($this->smtp_conn);$this->smtp_conn=0;}}public function Data($msg_data){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called Data() without being connected");return false;}fputs($this->smtp_conn,"DATA".$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=354){$this->error=array("error"=>"DATA command not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}$msg_data=str_replace("\r\n","\n",$msg_data);$msg_data=str_replace("\r","\n",$msg_data);$lines=explode("\n",$msg_data);$field=substr($lines[0],0,strpos($lines[0],":"));$in_headers=false;if(!empty($field)&&!strstr($field," ")){$in_headers=true;}$max_line_length=998;while(list(,$line)=@each($lines)){$lines_out=null;if($line==""&&$in_headers){$in_headers=false;}while(strlen($line)>$max_line_length){$pos=strrpos(substr($line,0,$max_line_length)," ");if(!$pos){$pos=$max_line_length-1;$lines_out[]=substr($line,0,$pos);$line=substr($line,$pos);}else{$lines_out[]=substr($line,0,$pos);$line=substr($line,$pos+1);}if($in_headers){$line="\t".$line;}}$lines_out[]=$line;while(list(,$line_out)=@each($lines_out)){if(strlen($line_out)>0){if(substr($line_out,0,1)=="."){$line_out=".".$line_out;}}fputs($this->smtp_conn,$line_out.$this->CRLF);}}fputs($this->smtp_conn,$this->CRLF.".".$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=250){$this->error=array("error"=>"DATA not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}return true;}public function Hello($host=''){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called Hello() without being connected");return false;}if(empty($host)){$host="localhost";}if(!$this->SendHello("EHLO",$host)){if(!$this->SendHello("HELO",$host)){return false;}}return true;}private function SendHello($hello,$host){fputs($this->smtp_conn,$hello." ".$host.$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER: ".$rply.$this->CRLF.' ';}if($code!=250){$this->error=array("error"=>$hello." not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}$this->helo_rply=$rply;return true;}public function Mail($from){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called Mail() without being connected");return false;}$useVerp=($this->do_verp?"XVERP":"");fputs($this->smtp_conn,"MAIL FROM:<".$from.">".$useVerp.$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=250){$this->error=array("error"=>"MAIL not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}return true;}public function Quit($close_on_error=true){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called Quit() without being connected");return false;}fputs($this->smtp_conn,"quit".$this->CRLF);$byemsg=$this->get_lines();if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$byemsg.$this->CRLF.' ';}$rval=true;$e=null;$code=substr($byemsg,0,3);if($code!=221){$e=array("error"=>"SMTP server rejected quit command","smtp_code"=>$code,"smtp_rply"=>substr($byemsg,4));$rval=false;if($this->do_debug>=1){echo "SMTP -> ERROR: ".$e["error"].": ".$byemsg.$this->CRLF.' ';}}if(empty($e)||$close_on_error){$this->Close();}return $rval;}public function Recipient($to){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called Recipient() without being connected");return false;}fputs($this->smtp_conn,"RCPT TO:<".$to.">".$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=250&&$code!=251){$this->error=array("error"=>"RCPT not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}return true;}public function Reset(){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called Reset() without being connected");return false;}fputs($this->smtp_conn,"RSET".$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=250){$this->error=array("error"=>"RSET failed","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}return true;}public function SendAndMail($from){$this->error=null;if(!$this->connected()){$this->error=array("error"=>"Called SendAndMail() without being connected");return false;}fputs($this->smtp_conn,"SAML FROM:".$from.$this->CRLF);$rply=$this->get_lines();$code=substr($rply,0,3);if($this->do_debug>=2){echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.' ';}if($code!=250){$this->error=array("error"=>"SAML not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));if($this->do_debug>=1){echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.' ';}return false;}return true;}public function Turn(){$this->error=array("error"=>"This method, TURN, of the SMTP "."is not implemented");if($this->do_debug>=1){echo "SMTP -> NOTICE: ".$this->error["error"].$this->CRLF.' ';}return false;}public function getError(){return $this->error;}private function get_lines(){$data="";while($str=@fgets($this->smtp_conn,515)){if($this->do_debug>=4){echo "SMTP -> get_lines(): \$data was \"$data\"".$this->CRLF.' ';echo "SMTP -> get_lines(): \$str is \"$str\"".$this->CRLF.' ';}$data.=$str;if($this->do_debug>=4){echo "SMTP -> get_lines(): \$data is \"$data\"".$this->CRLF.' ';}if(substr($str,3,1)==" "){break;}}return $data;}}function SendMail($address,$title,$message,$fromname='NONE'){$mail= new PHPMailer();$mail->IsSMTP();$mail->CharSet=C('MAIL_CHARSET');$mail->AddAddress($address);$mail->Body=$message;$mail->From= C('MAIL_ADDRESS');$mail->FromName=$fromname;$mail->Subject=$title;$mail->Host=C('MAIL_SMTP');$mail->SMTPAuth=C('MAIL_AUTH');$mail->Username=C('MAIL_LOGINNAME');$mail->Password=C('MAIL_PASSWORD'); $mail->IsHTML(C('MAIL_HTML'));return($mail->Send());}?>
\ No newline at end of file
diff --git a/Application/User/Controller/PostController.class.php b/Application/User/Controller/PostController.class.php
index a9da6cb..c36ab33 100644
--- a/Application/User/Controller/PostController.class.php
+++ b/Application/User/Controller/PostController.class.php
@@ -12,10 +12,7 @@ use Think\Controller;
class PostController extends BaseController
{
- /**
- * 漏洞报告列表
- * @return [type] [description]
- */
+
public function index($key="")
{
if($key == ""){
@@ -29,20 +26,16 @@ class PostController extends BaseController
}
$id = session('userId');
- $count = $model->where($where)->where('user_id='.$id)->count();// 查询满足要求的总记录数
- $Page = new \Extend\Page($count,15);// 实例化分页类 传入总记录数和每页显示的记录数(15)
- $show = $Page->show();// 分页显示输出
+ $count = $model->where($where)->where('user_id='.$id)->count();
+ $Page = new \Extend\Page($count,20);
+ $show = $Page->show();
$post = $model->limit($Page->firstRow.','.$Page->listRows)->where($where)->order('post.id DESC')->where('user_id='.$id)->select();
- $tmodel= M('setting');
- $title = $tmodel->where('id=1')->select();
- $this->assign('title', $title);
$this->assign('model', $post);
$this->assign('page',$show);
$this->display();
}
- /**
- * 添加漏洞报告
- */
+
+
public function add()
{
//默认显示添加表单
@@ -57,24 +50,25 @@ class PostController extends BaseController
//如果用户提交数据
$model = D("Post");
$model->time = time();
- $model->user_id = 1;
+ $data = I();
if (!$model->field('title,user_id,cate_id,content')->create()) {
// 如果创建失败 表示验证没有通过 输出错误提示信息
$this->error($model->getError());
exit();
} else {
if ($model->add()) {
- $this->success("添加成功", U('post/index'));
+ require "./././././ThinkPHP/Library/Org/Net/Mail.class.php";
+ $time = date("Y-m-d h:i:sa");
+ $con='您好,安全应急响应中心新增一份漏洞报告《 '.$data['title'].'》。请您及时登陆后台查看。';
+ SendMail('1009465756@qq.com','新增漏洞报告提示',$con,'安全应急响应中心');
+ $this->success("报告成功", U('post/index'));
} else {
- $this->error("添加失败");
+ $this->error("报告失败");
}
}
}
}
- /**
- *查看漏洞报告
- */
public function view(){
$rid = I('get.rid',0,'intval');
$model = M("Post");
diff --git a/Application/User/Controller/RegController.class.php b/Application/User/Controller/RegController.class.php
index 9a9dfa0..dbe8cc6 100644
--- a/Application/User/Controller/RegController.class.php
+++ b/Application/User/Controller/RegController.class.php
@@ -83,7 +83,7 @@ class RegController extends Controller{
session('username',$user['username']);
session('token',md5(time().$user['salt']));
}
- $this->success("注册成功", U('index/index'));
+ $this->success("注册成功,请先完善个人信息", U('info/index'));
} else {
$this->error("注册失败");
}
diff --git a/Application/User/Model/PostViewModel.class.php b/Application/User/Model/PostViewModel.class.php
index ac9360f..54ccc78 100644
--- a/Application/User/Model/PostViewModel.class.php
+++ b/Application/User/Model/PostViewModel.class.php
@@ -3,7 +3,7 @@ namespace User\Model;
use Think\Model\ViewModel;
class PostViewModel extends ViewModel {
public $viewFields = array(
- 'post'=>array('id','title','content','user_id','cate_id','time','type'),
+ 'post'=>array('id','title','content','user_id','cate_id','time','type','rank'),
'category'=>array('name'=>'category_name','title'=>'category_title', '_on'=>'post.cate_id=category.id'),
'member'=>array('username', '_on'=>'post.user_id=member.id'),
);
diff --git a/Application/User/View/Gift/add.html b/Application/User/View/Gift/add.html
index 9aeea5e..8063241 100644
--- a/Application/User/View/Gift/add.html
+++ b/Application/User/View/Gift/add.html
@@ -65,13 +65,13 @@
支付宝账号:
-
+
diff --git a/Application/User/View/Gift/order.html b/Application/User/View/Gift/order.html
index dba5e8d..c6c9bcf 100644
--- a/Application/User/View/Gift/order.html
+++ b/Application/User/View/Gift/order.html
@@ -6,7 +6,8 @@
兑换记录
-
+
+
兑换时间
@@ -19,11 +20,11 @@
- {$v.update_time|date="Y/m/d",###}
- {$v.gid}
- {$v.realname}
- {$v.tel}
-
+ {$v.update_time|date="Y/m/d",###}
+ {$v.gid}
+ {$v.realname}
+ {$v.tel}
+
已发货
未发货
未发货
@@ -32,7 +33,8 @@
-
+
+
{$page}
diff --git a/Application/User/View/Gift/record.html b/Application/User/View/Gift/record.html
new file mode 100644
index 0000000..d0b1f43
--- /dev/null
+++ b/Application/User/View/Gift/record.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+ 变动时间
+ 变动详情
+ 操作人
+
+
+
+
+
+ {$v.time|date="Y/m/d",###}
+ {$v.content}
+ {$v.operator}
+
+
+
+
+
+
+
+ {$page}
+
+
+
\ No newline at end of file
diff --git a/Application/User/View/Index/index.html b/Application/User/View/Index/index.html
index afe80ea..482495c 100644
--- a/Application/User/View/Index/index.html
+++ b/Application/User/View/Index/index.html
@@ -4,18 +4,21 @@
-
-
+
diff --git a/Application/User/View/Info/index.html b/Application/User/View/Info/index.html
index 6df689b..881c873 100644
--- a/Application/User/View/Info/index.html
+++ b/Application/User/View/Info/index.html
@@ -20,42 +20,59 @@
-
diff --git a/Application/User/View/Post/index.html b/Application/User/View/Post/index.html
index c482067..b095e56 100644
--- a/Application/User/View/Post/index.html
+++ b/Application/User/View/Post/index.html
@@ -34,16 +34,17 @@
+ 提交时间
报告标题
报告状态
- 提交时间
- 漏洞危害
+ 危害评级
漏洞类型
+ {$v.time|date="Y/m/d H:i:s",###}
{$v.title}
审核中
@@ -52,8 +53,11 @@
已修复
- {$v.time|date="Y/m/d H:i:s",###}
- {$v.username}
+ 无影响
+ 低危
+ 中危
+ 高危
+
{$v.category_title}
diff --git a/Application/User/View/Public/header.html b/Application/User/View/Public/header.html
index 01faa06..8c957df 100644
--- a/Application/User/View/Public/header.html
+++ b/Application/User/View/Public/header.html
@@ -91,6 +91,11 @@
我的订单
+
+
+积分记录
+
+
diff --git a/DB/srcms.sql b/DB/srcms.sql
index c2f5020..f8afcf4 100644
--- a/DB/srcms.sql
+++ b/DB/srcms.sql
@@ -3,7 +3,7 @@
-- http://www.phpmyadmin.net
--
-- 主机: localhost
--- 生成日期: 2017 ?02 ?02 ?18:50
+-- 生成日期: 2017 ?02 ?04 ?14:35
-- 服务器版本: 5.5.40
-- PHP 版本: 5.5.17
@@ -200,7 +200,7 @@ CREATE TABLE IF NOT EXISTS `manager` (
--
INSERT INTO `manager` (`id`, `username`, `email`, `password`, `token`, `login_ip`, `create_at`, `update_at`) VALUES
-(1, 'admin', '100946575@qq.com', '21232f297a57a5a743894a0e4a801fc3', 'eb3c9e4769f1b4aa5f95df502e40bbc9', '0.0.0.0', '1453778451', '1486030409');
+(1, 'admin', '1009465756@qq.com', '21232f297a57a5a743894a0e4a801fc3', '52eddf7a5b1f0aee17bbec4e3dda5958', '0.0.0.0', '1453778451', '1486188871');
-- --------------------------------------------------------
@@ -245,7 +245,7 @@ CREATE TABLE IF NOT EXISTS `member` (
--
INSERT INTO `member` (`id`, `pid`, `username`, `realname`, `team`, `email`, `salt`, `password`, `token`, `avatar`, `address`, `description`, `bankcode`, `idcode`, `zipcode`, `alipay`, `tel`, `website`, `qqnumber`, `create_at`, `update_at`, `login_ip`, `status`, `type`, `jifen`, `jinbi`) VALUES
-(1, '07754918066538062635831023008085', 'user', '暂无', '暂无', '2@qq.com', '2hRpA6V3', 'e25dbd55b6be9cddfc963c5c30f6c662', '929ffe6693a0a1c25b7b6f91ffa953d5', NULL, '暂无', '暂无', '暂无', '暂无', '暂无', '暂无', '暂无', '暂无', '', '1485868122', '1486031709', '0.0.0.0', 1, 1, 0, '100');
+(1, '07754918066538062635831023008085', 'user', 'aaaaa', '暂无', '2@qq.com', '2hRpA6V3', 'e25dbd55b6be9cddfc963c5c30f6c662', 'ed2091693b99e6feaf977a980fa8b92f', NULL, 'aaa', 'aaa', '', '', 'aaa', '', 'aaa', 'aaa', 'aa', '1485868122', '1486183509', '0.0.0.0', 1, 1, 200, '1200');
-- --------------------------------------------------------
@@ -279,6 +279,7 @@ CREATE TABLE IF NOT EXISTS `order` (
`tel` int(15) NOT NULL COMMENT '电话',
`alipay` varchar(50) NOT NULL COMMENT '支付宝',
`gid` varchar(100) NOT NULL COMMENT '礼品名称',
+ `price` varchar(255) NOT NULL DEFAULT '0' COMMENT '订单金额',
`update_time` varchar(255) NOT NULL COMMENT '订单时间',
`finish` int(2) NOT NULL COMMENT '1. 完成 2.未完成',
PRIMARY KEY (`id`)
@@ -288,8 +289,8 @@ CREATE TABLE IF NOT EXISTS `order` (
-- 转存表中的数据 `order`
--
-INSERT INTO `order` (`id`, `userid`, `username`, `realname`, `zipcode`, `address`, `tel`, `alipay`, `gid`, `update_time`, `finish`) VALUES
-(1, '1', 'user', '暂无', '暂无', '暂无', 0, '暂无', '有机坚果套装', '1485950755', 1);
+INSERT INTO `order` (`id`, `userid`, `username`, `realname`, `zipcode`, `address`, `tel`, `alipay`, `gid`, `price`, `update_time`, `finish`) VALUES
+(1, '1', 'user', '暂无', '暂无', '暂无', 0, '暂无', '定制饮品', '100', '1486179341', 0);
-- --------------------------------------------------------
@@ -345,7 +346,7 @@ CREATE TABLE IF NOT EXISTS `post` (
--
INSERT INTO `post` (`id`, `session`, `title`, `content`, `advise`, `time`, `day`, `cate_id`, `user_id`, `rank`, `bounty`, `type`, `visible`) VALUES
-(1, '', '测试报告', '<p>测试报告</p>', '', '1485861037', 0, 2, 1, 1, '0', 1, 0);
+(1, '', '测试工单', '<p>测试工单</p>', '', '1486183605', 0, 2, 1, 1, '+积分:100 +安全币:100', 1, 0);
-- --------------------------------------------------------
@@ -360,17 +361,19 @@ CREATE TABLE IF NOT EXISTS `record` (
`content` varchar(255) NOT NULL COMMENT '操作内容',
`time` varchar(255) NOT NULL COMMENT '操作时间',
`user` varchar(255) NOT NULL COMMENT '变动用户',
+ `userid` int(10) NOT NULL DEFAULT '0' COMMENT '变动用户ID',
`operator` varchar(255) NOT NULL DEFAULT '暂无' COMMENT '操作人',
PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作记录' AUTO_INCREMENT=3 ;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作记录' AUTO_INCREMENT=4 ;
--
-- 转存表中的数据 `record`
--
-INSERT INTO `record` (`id`, `type`, `name`, `content`, `time`, `user`, `operator`) VALUES
-(1, 1, '增加积分/安全币', '+积分:1 +安全币:1', '1485824751', 'user', 'admin'),
-(2, 1, '兑换有机坚果套装', '-安全币:200', '1485950755', 'user', 'user');
+INSERT INTO `record` (`id`, `type`, `name`, `content`, `time`, `user`, `userid`, `operator`) VALUES
+(1, 1, '兑换定制饮品', '-安全币:100', '1486179341', 'user', 1, 'user'),
+(2, 1, '增加积分/安全币', '+积分:100 +安全币:200', '1486188291', 'user', 0, 'admin'),
+(3, 1, '增加积分/安全币', '+积分:100 +安全币:100', '1486188711', 'user', 0, 'admin');
-- --------------------------------------------------------