[原创]蚂蚁cms的ueditor上传图片窗口提示Uncaught SecurityError:Blocked a frame with origin错误解决方法

mikel阅读(7887)

最近的蚂蚁CMS的二次开发项目中,出现个奇怪的问题,有些电脑的发布信息的UEditor的上传图片窗口能够正常显示按钮和上传按钮,但是有些电脑的浏览器发布信息的UEditor的上传图片窗口不显示,并提示

“Uncaught SecurityError:Blocked a frame with origin错误”

分析原因:

从问题看开始以为跨域访问的权限问题,设置了ie浏览器和firefox浏览器的安全跨域访问设置,还是没有解决问题,

然后是怀疑UEditor编辑器的问题,于是去了官网查找资料,发现现在的蚂蚁CMS版本低,用的UEditor版本也是低的,替换了新版本的UEditor编辑器,替换了还是不行,

于是开始设置断点,结果发现UEditor的internal.js的断点window.formElement为null,代码如下:


dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
//这里的windwo.frameElement为null

于是加入了为空的判断:


if(window.frameElement)
{
//alert(window.frameElement.id);
dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
}else{

dialog = parent.$EDITORUI[parent.document.activeElement.id.replace( /_iframe$/, '' )];
}

我的电脑浏览器经过firebug的断点可以获取到window.parent的内容,但是客户的window.parent确获取不到

什么问题?于是开始搜索“window.parent 获取不到”找到csdn上的一个帖子

http://bbs.csdn.net/topics/220072908

“iframe页面的js中需要访问window.parent.document,本地运行正常。上传至服务器后,发现window.parent.document不能访问,没有任何错误提示。求解 ”

得到帖子内容的回复的启发:

“这要看一下parent跟self是不是同一个域名下的 ”

JavaScript的dom对象有权限访问的控制,特别是parent和self,opener和self等跨框架的访问。你看下你的window.parent.document域名跟你的域名相同不?你可以显示的使用
<script>document.domain=”你的域名”;</script>来设置父子窗口的域名 ”

怀疑是不是出在iframe的src的url地址的域名问题,结果发现iframe的src直接引用的是如下地址:

“?mod=zhengwu&amp;file=zhengwu&amp;action=add”

这个链接从哪来的?没有域名?然而编辑器中的image上传图片的窗口也是用的iframe但是src却是带域名的完整url的,如下:

“http://www.yuanmax.com/ueditor/dialogs/image/image.html”

难道是这个图片上传窗口的iframe的域名和parent页面的域名不一致?

然后继续查看整个框架页面结构,整体页面结构如下:

看来iframe-wrap的src出了问题,src的地址是”?mod=zhengwu&amp;file=zhengwu&amp;action=add”

那么iframe-wrap的src地址从哪来的?点击左侧的“发布信息”在右侧的”iframe-wrap”显示,代码如下:

<a href=”?mod=zhengwu&amp;file=zhengwu&amp;action=add” target=”iframe-wrap”>发布信息</a>

好了,来源找到了,那么开始解决问题。

解决问题:

1.先找找后台管理的左侧菜单是怎么生成的?于是找到根目录下的后台管理文件:admin.php


if($mod!='index')
{
$modinfo=$moduleobj-&amp;amp;amp;amp;gt;get($mod,'folder');
$adminrole=explode(',',$modinfo['adminrole']);

if($action!='main' && (!$modinfo || (!in_array($_roleid,$adminrole) && !in_array($_userid,$admin_founders))))
{
exit('&amp;amp;amp;lt;script language="JavaScript"&amp;amp;amp;gt;{self.top.location.href="'.ADMIN_FILE.'";}&amp;amp;amp;lt;/script&amp;amp;amp;gt;');
}

$adminmenurole=string2array($modinfo['adminmenu']);
if($adminmenurole && isset($adminmenurole[$action]) && $action)
{
$adminmenurole=explode(',',$adminmenurole[$action]['role']);
if($action!='main' && (!in_array($_roleid,$adminmenurole) && !in_array($_userid,$admin_founders)))
{
exit('&amp;amp;amp;lt;script language="javascript"&amp;amp;amp;gt;{self.top.location.href="'.ADMIN_FILE.'";}&amp;amp;amp;lt;/script&amp;amp;amp;gt;');
}
}

if(in_array($action,array('type','type_add','role','config','grade')) &&$_SESSION['mysiteid'] &&$_sid)
{
exit('非法请求!IP:'.IP."已记录!");
}

if($modinfo['issystem'] &&!in_array($mod,array('member')))
{
include SYSTEM_ROOT.'admin/'.$file.'.inc.php';
}
else
{
include SYSTEM_ROOT.$modinfo['folder'].'/admin/load.inc.php';
}

调取

$modinfo=$moduleobj->get($mod,'folder');
中获取模型类文件根据模型id的值$mod的获取模型的信息,模型类文件路径:include\module.class.php


function get($id,$byfield='id')
{
return $this->db->fetch_one("SELECT * FROM `$this->table` WHERE `$this->table`.`$byfield`='".stripslashes($id)."'");
}

2.调取include SYSTEM_ROOT.$modinfo[‘folder’].’/admin/load.inc.php’;模型的加载文件,加载模板

3.模板调取include\module.class.php中的adminmenu()函数:


function usermodule()
{
return $this->db->fetch_all("SELECT * FROM `$this->table` WHERE `$this->table`.`issystem`=0 AND `$this->table`.`status`=1 ORDER BY `$this->table`.`orderby` ASC,`$this->table`.`id` DESC");
}

function adminmenu($moduleid)
{
global $_userid,$_roleid,$admin_founders,$_sid;
$menu='';
$modinfo=$this->get(intval($moduleid));
$r=string2array($modinfo['adminmenu']);
foreach($r as $key => $_r)
{
$adminrole=explode(',',$_r['role']);
if(!SITETYPE || ($key!='type' && $key!='type_add' && $key!='role' && $key!='config' && $key!='grade') || !$_sid)
{
if((in_array($_roleid,$adminrole) || in_array($_userid,$admin_founders)) && trim($_r['name']))
{
$menu.='


';
}
}
}

return $menu;
}

4.好了问题找到了,这里的连接加上$LA[‘siteurl’]的网站域名,修改了代码,加入了$LA的引用,解决:


function usermodule()
{
return $this->db->fetch_all("SELECT * FROM `$this->table` WHERE `$this->table`.`issystem`=0 AND `$this->table`.`status`=1 ORDER BY `$this->table`.`orderby` ASC,`$this->table`.`id` DESC");
}

function adminmenu($moduleid)
{
global $_userid,$LA,$_roleid,$admin_founders,$_sid;
$menu='';
$modinfo=$this->get(intval($moduleid));
$r=string2array($modinfo['adminmenu']);
foreach($r as $key => $_r)
{
$adminrole=explode(',',$_r['role']);
if(!SITETYPE || ($key!='type' && $key!='type_add' && $key!='role' && $key!='config' && $key!='grade') || !$_sid)
{
if((in_array($_roleid,$adminrole) || in_array($_userid,$admin_founders)) && trim($_r['name']))
{
$menu.='

';
}
}
}

return $menu;
}

top,parent,opener,iframe - 低头编码_抬头看路 - 博客园

mikel阅读(1295)

来源: top,parent,opener,iframe – 低头编码_抬头看路 – 博客园

1.opener:指用WINDOW.OPEN等方式创建的新窗口对应的原窗口。
2.top:
该变更永远指分割窗口最高层次的浏览器窗口。
3.parent:
该变量指的是包含当前分割窗口的父窗口。如果在一个窗口内有分割窗口,而在其中一个分割窗口中又包含着分割窗口,则第3层的分割窗口可以用parent变量引用第2层窗口,用top引用顶层窗口。
对于窗体中的frame和iframe加载的页面元素来说。parent 返回的时包含该iframe的页面窗口引用,top则返回最上层的窗口引用,self当然返回的仍然是自身的引用。
4. self,window都是获取当前页面窗口自身对象的引用

使用document.getElementById(“IframeA”)取到的是iframe标签对象,通过该对象可以获取iframe的各个属性,例如src、frameborder、style等,但是不能获取到iframe所包含的子页面的各个对象。;

使用document.frames(“IframeA”)取到的是iframe组件对象,通过该对象可以获取到iframe所包含的页面的子页面的各个对象,例如子页面的window对象,但是不能获得iframe标签得各个属性,例如上面说到的src等

1.html
<script>
function check(){
var obj1=document.getElementById(“myframe”);
alert(obj1.src);
//alert(obj1.window.document.myform.username.value);//Error
var obj2=document.frames(“myframe”);
alert(obj2.window.document.myform.username.value);
//alert(obj2.src);//Error
}
</script>
<body onload=”check()”>
<iframe id=”myframe” name=”myframe” src=”2.html” frameborder=”3″ style=”width:300;height:200;border-width:1;border-color:red;border-style:solid”></iframe>
</body>
2.html
<body>
<form name=”myform”>
用户名:<input type=”text” name=”username” value=”test” />
</form>
</body>

附:Window对象、Parent对象、Frame对象、Document对象和Form对象的阶层关系:Windwo对象→Parent对象→Frame对象→Document对象→Form对象,
如下:parent.frame1.document.forms[0].elements[0].value;

问题:在一个页面嵌入框架<iframe>,然后在框架中使用jvascript脚本:parent.xx.value=’xxxxx’; 在IE中可以正常看到赋值,但是在firefox中则不能完成赋值。请问在firefox中调用父框架的对象应该是哪个,是否和IE兼容?

解答:window.parent.document.form名.xx.value=’xxxxx’;   window可省略。
parent.document.form名.xx.value=’xxxxx’;
parent.document.getElementById(“xx”).value=’xxxxx’;

window.parent与window.opener的区别 JavaScript调用主窗口方法

1:   window.parent 是iframe页面调用父页面对象

举例:      a.html

<html>
<head><title>父页面</title></head>
<body>
<form name=”form1″ id=”form1″>
<input type=”text” name=”username” id=”username”/>
</form>
<iframe src=”b.html” width=100%></iframe>
</body>
</html>

如果我们需要在b.htm中要对a.htm中的username文本框赋值(就如很多上传功能,上传功能页在Ifrmae中,上传成功后把上传后的路径放入父页面的文本框中),我们应该在b.html中写:

<script type=”text/JavaScript”>
var _parentWin = window.parent ;
_parentWin.form1.username.value = “xxxx”;
</script>

2:   window.opener 是window.open 打开的子页面调用父页面对象
opener:对打开当前窗口的window对象的引用,如果当前窗口被用户打开,则它的值为null。
self:自引用属性,是对当前window对象的应用,与window属性同义。
self代表自身窗口,opener代表打开自身的那个窗口,比如窗口A打开窗口B。如果靠window.open方法,则对于窗口B,self代表B自己,而opener代表窗口A

主页面子页面窗口函数调用.rar (2.8 KB)

图解GitHub基本操作 - SeeYouBug - 博客园

mikel阅读(1258)

来源: 图解GitHub基本操作 – SeeYouBug – 博客园

一、注册并登陆到github网站

1.1、打开github网站首页(https://github.com/

1.2、注册一个自己的github账号

创建账户后再验证自己的邮箱,然后就可以登陆到github上来。

1.3、登陆自己的github账号

点击右边的按钮,开始创建一个自己的github仓库。

二、创建一个自己的仓库

 

 

三、在Hbuilder环境下上传自己的开源项目到github仓库

 

打开Hbuilder选择你要上传到github的开源项目,点击右键选择team,点击共享项目。

点击右侧create创建一个本地的github仓库名。

四、在Hbuilder环境下把github上的源码引入Hbuilder项目中

首先复制你要从github上下载的源码地址如下图:

然后打开Hbuilder,选择文件导入

上面这里需要等待一段时间,因为这个操作是从github服务器上把数据拉到本地,需要等待一段时间。后面的操作直接点下一步下一步,其他选项默认即可。

最后,你若看到这个页面说明,你从github上引入的源码就成功导入到Hbuilder本地了。下面这个图就从github上导入的源码项目。

五、在github上下载源码到本地

在github上找到你要下载的源码,点击如下按钮即可下载到本地。

六、删除不用的github仓库

 首先进入到你的github仓库首页如下页面:

然后双击进入你要删除的仓库

总结:这里我只是简单的介绍了一下github的基本操作,目的是为了帮助那些刚刚入门的初学者,想把自己的项目托管到github上却不知道怎么操作做了一个引导。

HTML5动画软件工具编辑器 HTML5动画分类 工具推荐 - 拂晓风起-Kenko - 博客园

mikel阅读(1345)

来源: HTML5动画软件工具编辑器 HTML5动画分类 工具推荐 – 拂晓风起-Kenko – 博客园

接下来介绍几款制作HTML5动画的工具,它们可以分为几类:

1、导出canvas动画:

Flash CC(13.1)、Animation、Radi

2、导出DIV+CSS3动画:

HTML5 Maker、Edge Animation、Tumult Hype、Nodefire

3、导出SVG动画:

Hippo

基本上所有工具导出的动画都会依赖一个独立的js库,这个库用于解析数据,展示动画。而其中两个工具(Radi和Hippo)就比较突出,它们并不依赖独立js库,而是把必须的最精简的js直接内嵌到HTML中,这个做法减小了初次加载的文件。这种实现方式对于小规模动画很有好处。

先来个最牛逼的html5制作的html5动画工具镇楼。

由于图片太多,就懒得贴图了,有兴趣的朋友直接下载我整理的doc吧。

直接上doc: http://files.cnblogs.com/kenkofox/html5%E5%8A%A8%E7%94%BB%E5%B7%A5%E5%85%B7.zip

============================================================================

除上述全部编辑器之外,还不得不提及两个比较牛逼的js库,用于辅助动作制:

CreateJS:http://www.createjs.com/#!/CreateJS

GSAP-JS:http://www.greensock.com/gsap-js/

CreateJS被Adobe CC用于导出html5动画,而GSAP的制作者GreenSock一直都是Flash动画界的佼佼者。具体用法不在这里详细叙述,大家有兴趣可以点击链接看看。

============================================================================

PHP empty、isset、isnull的区别 - 流风,飘然的风 - 博客园

mikel阅读(1416)

来源: PHP empty、isset、isnull的区别 – 流风,飘然的风 – 博客园

PHP empty、isset、isnull的区别

empty

如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,””、0、”0″、NULL、FALSE、array()、var $var、未定义;以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

isset

如果 变量 存在(非NULL)则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。

is_null

检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】

实例代码:

function response_data($data){
        $this->output->set_header('Content-Type: application/json; charset=utf-8');
        if(empty($data)){
            $data = array();
        }
        echo json_encode($data);
    }

destoon短信接口修改方法 - 浮云的等待 - 博客园

mikel阅读(1211)

来源: destoon短信接口修改方法 – 浮云的等待 – 博客园

destoon是很优秀的B2B行业站程序。程序模块化开发契合度很高,二次开发起来也很顺畅。数据缓存,权限分配,SEO功能方面都不错。

但是在使用这套程序的时候,常常要用到发送短信的功能,而destoon本身只接入了自己的短信接口。一些初接触destoon的开发者不知道如何修改。

所以铁牛特此写个文档分享如何修改destoon如何接入外部短信接口。

 

第一步:找到/include/global.func.php文件,搜索函数send_sms

修改function send_sms为function send_sms_back,新建函数send_sms

function send_sms($mobile, $message, $word = 0, $time = 0) {
global $db,
$DT,
$DT_TIME,
$DT_IP,
$_username;
if (!$DT['sms'] || !$DT['sms_uid'] || !$DT['sms_key'])
return false;
$sms_url = 'http://app.com/test/sms.php'; //你的短信接口地址
//例如你的短信接口是http://app.com/test/sms.php?username=athena&amp;amp;pwd=123456&amp;amp;mobile=15889726201&amp;amp;msg=我的测试短信内容
$word or $word = word_count($message);
$sms_message = rawurlencode(convert($message, DT_CHARSET, 'UTF-8'));
//data是你的url字符串 例如:username=athena&amp;amp;pwd=123456&amp;amp;mobile=15889726201&amp;amp;msg=我的测试短信内容
$data = 'username='.$DT['sms_uid'].'&amp;amp;pwd='.$DT['sms_key']. '&amp;amp;mobile='.$mobile13.'&amp;amp;msg='.$sms_message;
//采用PHP的cURL库推送网页
$cur = curl_init($sms_url);
curl_setopt($cur, CURLOPT_POST, 1);
curl_setopt($cur, CURLOPT_POSTFIELDS, $data);
curl_setopt($cur, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($cur, CURLOPT_HEADER, 0);
curl_setopt($cur, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($cur, CURLOPT_RETURNTRANSFER, 1);
$rec = curl_exec($cur);
curl_close($cur);
$code='';
if(!$rec==$DT['sms_ok']){
$code = 'Can Not Connect SMS Server';
}else{
$code =$DT['sms_ok'];
}
$db-&amp;gt;query("INSERT INTO {$db-&amp;gt;pre}sms (mobile,message,word,editor,sendtime,code) VALUES ('$mobile','$message','$word','$_username','$DT_TIME','$code')");
return $code;
}

第二步:设置短信返回值

我的短信接口地址是:http://app.com/test/sms.php,如果短信发送成功,信息是success,这个发送成功的信息需要在destoon管理后台去设置

07dce7bc2ed7bb045baa5bd730d95bc4

4d2b98a8a124ab7778fd35f158949721

 

提示:如果你的curl_init()函数不可用

找到找到php.ini,修改extension=php_curl.dll 把前面的分号去掉
如果你的php库没有php_curl.dll,那么将php_curl.dll php5ts.dlllibeay32.dll ssleay32.dll 复制到 windows/system32下 重启IIS或Apache服务即可

织梦 {dede:list}列表按多种排序显示_LongSir_新浪博客

mikel阅读(961)

织梦 {dede:list}列表按多种排序显示_LongSir_新浪博客,LongSir,

来源: 织梦 {dede:list}列表按多种排序显示_LongSir_新浪博客

orderby=’sortrank’ 文档排序方式

orderby=’hot’ 或 orderby=’click’ 表示按点击数排列

orderby=’sortrank’ 或 orderby=’pubdate’ 按出版时间排列

orderby=’near’

orderby==’lastpost’ 按最后评论时间

orderby==’scores’ 按得分排序

orderby=’id’ 按文章ID排序

orderby=’rand’ 随机获得指定条件的文档列表

orderby=’scores’ 按评论来排序 官方没有写的

倒序 orderway=’asc’

orderway是设置排序的方式,值为desc和asc

 

dedecms列表页实现文档按权重weight排序(从小到大的顺序)方法:

1,在list_artcile.htm模板中使用

{dede:list pagesize=’12′ orderby=’weight’ orderway=’asc’}

2,然后修改include目录下的arc.listview.class.php

查找else if($orderby==”lastpost。。。

在下面补充

else if($orderby==”weight”) { $orderSQL = ” order by arc.weight $orderWay”; }

3,同样是这个文件,查找“if(ereg(‘hot|click|lastpost’,$orderby))”改为:

if(ereg(‘hot|click|weight|lastpost’,$orderby))

上面三个步骤,即可实现列表页内容按权重排序,越小越靠前。dedecms v5.7SP1 测试成功!

PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数

mikel阅读(986)

一、中文截取:mb_substr()

mb_substr( $str, $start, $length, $encoding )

$str,需要截断的字符串
$start,截断开始处,起始处为0
$length,要截取的字数
$encoding,网页编码,如utf-8,GB2312,GBK

实例:

复制代码 代码如下:
<?php
$str=’脚本之家:http://www.jb51.net’;
echo mb_substr($str,0,4,’utf-8′);//截取头5个字,假定此代码所在php文件的编码为utf-8
?>
结果显示:脚本之家

二、获取中文长度:mb_strlen()

mb_strlen( $str, $encoding )

$str,要计算长度的字符串
$encoding,网页编码,如utf-8,GB2312,GBK

实例:

复制代码 代码如下:
<?php
$str=’脚本之家:http://www.jb51.net’;
echo mb_strlen($str,’utf-8′);//假定此代码所在php文件的编码为utf-8
?>
结果显示:24

Destoon模板存放规则及语法参考_二次开发_教程知识_百行工作室

mikel阅读(1022)

一、模板存放及调用规则模板存放于系统 template 目录,template 目录下的一个目录例如 template/default/ 即为一套模板模板文件

来源: Destoon模板存放规则及语法参考_二次开发_教程知识_百行工作室

一、模板存放及调用规则

模板存放于系统 template 目录,template 目录下的一个目录
例如 template/default/ 即为一套模板

模板文件以 .htm 为扩展名,可直接存放于模板目录
例如 template/default/index.htm
也可以存放于模板目录的子目录里
例如 template/default/member/index.htm

在PHP文件里,使用模板语法为
<?php include template(‘index’);?>
或者
<?php include template(‘index’, ‘member’);?>

如果当前默认模板套系为default,则:
<?php include template(‘header’);?>
表示使用 template/default/header.htm 模板文件
<?php include template(‘header’, ‘member’);?>
表示使用 template/default/member/header.htm 模板文件

模板目录下在 these.name.php 是模板别名的配置文件,模板别名可以在后台模板管理修改。

模板解析后的缓存文件保存于cache/tpl/目录,扩展名为 .tpl.php

二、模板语法

1、包含模板 {template ‘header’} 或 {template ‘header’, ‘member’}

{template ‘header’} 被解析为
<?php include template(‘header’);?>
表示使用 template/default/header.htm 模板文件
{template ‘header’, ‘member’}
被解析为 <?php include template(‘header’, ‘member’);?>
表示使用 template/default/member/header.htm 模板文件

2、变量或常量表示

变量 {$destoon} 被解析为 <?php echo $destoon;?>
常量 {DESTOON} 被解析为 <?php echo DESTOON;?>
对于数组,标准写法应为 例如 {$destoon[‘index’]},可简写为 {$destoon[index]},模板在解析时会自动追加引号。

3、函数 {func_name($par1, $par2)}

{func_name($par1, $par2)} 被解析为
<?php func_name($par1, $par2);?>

4、PHP表达式 {php expression}

{php expression} 被解析为 <?php expression ?>

5、条件语句 {if $a==’b’} do A {/if} 或 {if $a==’b’} do A {else} do B {/if} 或 {if $a==’b’} do A {elseif $b==’c’} do C {else} do B {/if}

{if $a==’b’} do A {/if} 被解析为
<?php if($a==’b’) { do A }?>
{if $a==’b’} do A {else} do B {/if} 被解析为
<?php if($a==’b’) { do A } else { do B } ?>
{if $a==’b’} do A {elseif $b==’c’} do C {else} do B {/if} 被解析为
<?php if($a==’b’) { do A } else if($b==’c’) { do C } else { do B } ?>

6、LOOP循环 {loop $var $v}…{loop} 或
{loop $var $k $v}…{loop}

{loop $var $v}…{loop} 被解析为
<?php if(is_array($var)) { foreach($var as $v) { … } }?>
{loop $var $k $v}…{loop} 被解析为
<?php if(is_array($var)) { foreach($var as $k=>$v) { … } }?>

三、特殊用法

1、变量或表达式可以用HTML注释,例如 <!–{$destoon}–> 仍被解析为 <?php echo $destoon; ?> (可自动过滤此类注释)
2、模板可以用<!–[注释内容]–>,进行注释,模板编译时会自动去除,不会显示在页面中。(V>=5.0) 3、可直接在模板里书写PHP代码,直接书写PHP代码与 DESTOON 模板语法是兼容的。

destoon代码从头到尾捋一遍 - 岩_生 - 博客园

mikel阅读(991)

来源: destoon代码从头到尾捋一遍 – 岩_生 – 博客园

destoon® B2B网站管理系统(以下简称destoon)由西安嘉客信息科技有限责任公司独立研发并推出,对其拥有完全知识产权,中国国家版权局计算机软件著作权登记号:2009SR037570。
系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板、缓存、AJAX、SEO等前沿技术。与同类产品相比,系统功能更加强大、使用更加简单、运行更加稳定、安全性更强,效率更高,用户体验更好。系统开源发布,便于二次开发、功能整合、个性修改。
代码首先包含common.inc.php文件
在common.inc.php文件中,首先定义常量。
define('IN_DESTOON', true);
define('IN_ADMIN', defined('DT_ADMIN') ? true : false);
define('DT_ROOT', str_replace("\\", '/', dirname(__FILE__)));
if(defined('DT_REWRITE')) include DT_ROOT.'/include/rewrite.inc.php';//是否定义了url伪静态?
$CFG = array();//网站整体配置信息
require DT_ROOT.'/config.inc.php';//-----------------网站配置文件
define('DT_PATH', $CFG['url']);
define('DT_DOMAIN', $CFG['cookie_domain'] ? substr($CFG['cookie_domain'], 1) : '');
define('DT_WIN', strpos(strtoupper(PHP_OS), 'WIN') !== false ? true: false);
define('DT_CHMOD', ($CFG['file_mod'] && !DT_WIN) ? $CFG['file_mod'] : 0);
define('DT_URL', $CFG['url']);//Fox 3.x
define('DT_LANG', $CFG['language']);
define('DT_KEY', $CFG['authkey']);
define('DT_CHARSET', $CFG['charset']);
define('DT_CACHE', $CFG['cache_dir'] ? $CFG['cache_dir'] : DT_ROOT.'/file/cache');
define('DT_SKIN', DT_PATH.'skin/'.$CFG['skin'].'/');
define('SKIN_PATH', DT_PATH.'skin/'.$CFG['skin'].'/');//For 2.x
define('VIP', $CFG['com_vip']);
define('errmsg', 'Invalid Request');
随后加载网站基本功能
$L = array();
include DT_ROOT.'/lang/'.DT_LANG.'/lang.inc.php';//语言信息
require DT_ROOT.'/version.inc.php';
require DT_ROOT.'/include/global.func.php';//--------全局函数
require DT_ROOT.'/include/tag.func.php';//-----------标签函数
require DT_ROOT.'/api/im.func.php';//----------------聊天工具
require DT_ROOT.'/api/extend.func.php';//------------自己写的扩展函数
if(!$MQG && $_POST) $_POST = daddslashes($_POST);
if(!$MQG && $_GET) $_GET = daddslashes($_GET);
if(function_exists('date_default_timezone_set')) date_default_timezone_set($CFG['timezone']);
$DT_PRE = $CFG['tb_pre'];
$DT_QST = $_SERVER['QUERY_STRING'];//----------------querystring
$DT_TIME = time() + $CFG['timediff'];//--------------当前时间
$DT_IP = get_env('ip');
$DT_URL = get_env('url');
$DT_REF = get_env('referer');
$DT_BOT = is_robot();
链接数据库,建立缓存。
header("Content-Type:text/html;charset=".DT_CHARSET);
require DT_ROOT.'/include/db_'.$CFG['database'].'.class.php';//加载数据库类
require DT_ROOT.'/include/cache_'.$CFG['cache'].'.class.php';//加载缓存类
if($_POST) extract($_POST, EXTR_SKIP);//解析post请求的数据
if($_GET) extract($_GET, EXTR_SKIP);//解析get请求的数据
$db_class = 'db_'.$CFG['database'];
$db = new $db_class;
$db->halt = (DT_DEBUG || IN_ADMIN) ? 1 : 0;
$db->pre = $CFG['tb_pre'];
$db->connect($CFG['db_host'], $CFG['db_user'], $CFG['db_pass'], $CFG['db_name'], $CFG['db_expires'], $CFG['db_charset'], $CFG['pconnect']);
$dc = new dcache();
$dc->pre = $CFG['cache_pre'];
加载模块的基本配置
$DT = $MOD = $EXT = $CSS = $DTMP = $CAT = $ARE = $AREA = array();
$CACHE = cache_read('module.php');
if(!$CACHE) {
//没有缓存模块,就读取缓存模块。
require_once DT_ROOT.'/admin/global.func.php';
require_once DT_ROOT.'/include/post.func.php';
require_once DT_ROOT.'/include/cache.func.php';
    cache_all();
$CACHE = cache_read('module.php');
}
$DT = $CACHE['dt'];
$MODULE = $CACHE['module'];
$EXT = cache_read('module-3.php');
加载模块,读取模块信息,引入模块文件
if(!isset($moduleid)) {
$moduleid = 1;
$module = 'destoon';
} else if($moduleid == 1) {
$module = 'destoon';
} else {
$moduleid = intval($moduleid);
isset($MODULE[$moduleid]) or dheader(DT_PATH);
$module = $MODULE[$moduleid]['module'];
$MOD = $moduleid == 3 ? $EXT : cache_read('module-'.$moduleid.'.php');
include DT_ROOT.'/lang/'.DT_LANG.'/'.$module.'.inc.php';
}
$forward = isset($forward) ? urldecode($forward) : $DT_REF;//------------来源页面
$action = isset($action) ? trim($action) : '';//-------------动作指令
//判断用户登录
$destoon_auth = get_cookie('auth');
if($destoon_auth) {
$_dauth = explode("\t", decrypt($destoon_auth, md5(DT_KEY.$_SERVER['HTTP_USER_AGENT'])));
//print_r($_dauth);SELECT userid,username,groupid,admin FROM destoon_member
$_userid = isset($_dauth[0]) ? intval($_dauth[0]) : 0;
$_username = isset($_dauth[1]) ? trim($_dauth[1]) : '';
$_groupid = isset($_dauth[2]) ? intval($_dauth[2]) : 3;
$_admin = isset($_dauth[4]) ? intval($_dauth[4]) : 0;
if($_userid && !defined('DT_NONUSER')) {
$_password = isset($_dauth[3]) ? trim($_dauth[3]) : '';
$user = $db->get_one("SELECT username,passport,company,truename,password,groupid,email,message,chat,sound,online,sms,credit,money,loginip,admin,aid,edittime,trade FROM {$DT_PRE}member WHERE userid=$_userid");
if($user && $user['password'] == $_password) {
if($user['groupid'] == 2) dalert(lang('message->common_forbidden'));//禁止用户访问的组别
extract($user, EXTR_PREFIX_ALL, '');
if($user['loginip'] != $DT_IP && ($DT['ip_login'] == 2 || ($DT['ip_login'] == 1 && IN_ADMIN))) {
//单点登录,判断ip
$_userid = 0; set_cookie('auth', '');
dalert(lang('message->common_login', array($user['loginip'])), DT_PATH);
}
} else {
//登录失败
$_userid = 0;
if($db->linked && !isset($swfupload) && strpos($_SERVER['HTTP_USER_AGENT'], 'Flash') === false) set_cookie('auth', '');
}
unset($destoon_auth, $user, $_dauth, $_password);
}
}

if($_userid == 0) { $_groupid = 3; $_username = ''; }
if(!IN_ADMIN) {
if($_groupid == 1) include DT_ROOT.'/module/member/admin.inc.php';
if($_userid && !defined('DT_NONUSER')) {
$db->query("REPLACE INTO {$DT_PRE}online (userid,username,ip,moduleid,online,lasttime) VALUES ('$_userid','$_username','$DT_IP','$moduleid','$_online','$DT_TIME')");
} 
else {
if(timetodate($DT_TIME, 'i') == 10) {
$lastime = $DT_TIME - $DT['online'];
$db->query("DELETE FROM {$DT_PRE}online WHERE lasttime<$lastime");
}
}
}
$MG = cache_read('group-'.$_groupid.'.php');//读取用户组别配置
$_areaids = '';
$_areaid = array();
if($DT&#91;'city'&#93;) {
$AREA or $AREA = cache_read('area.php');
if($_aid) {
$_areaids = $AREA&#91;$_aid&#93;&#91;'child'&#93; ? $AREA&#91;$_aid&#93;&#91;'arrchildid'&#93; : $_aid;
$_areaid = explode(',', $_areaids);
}
} else {
$_aid < 1 or dalert('系统未开启分站功能,您的分站管理帐号暂不可用', $MODULE&#91;2&#93;&#91;'linkurl'&#93;.'logout.php');
}
$session = new dsession();
require DT_ROOT.'/admin/global.func.php';
require DT_ROOT.'/include/post.func.php';
require_once DT_ROOT.'/include/cache.func.php';
isset($file) or $file = 'index';
$secretkey = 'admin_'.strtolower(substr($CFG&#91;'authkey'&#93;, -6));
//echo $secretkey;exit;
if($DT&#91;'authadmin'&#93; == 'session') {
$_destoon_admin = isset($_SESSION&#91;$secretkey&#93;) ? intval($_SESSION&#91;$secretkey&#93;) : 0;
} else {
$_destoon_admin = get_cookie($secretkey);
$_destoon_admin = $_destoon_admin ? intval($_destoon_admin) : 0;
}
$_founder = $CFG&#91;'founderid'&#93; == $_userid ? $_userid : 0;
$_catids = $_childs = '';
$_catid = $_child = array();
if($file != 'login') {
if($_groupid != 1 || $_admin < 1 || !$_destoon_admin) msg('', '?file=login&forward='.urlencode($DT_URL));
//判断用户是否已经登录?如果未登录,直接跳转到登录页面。防止用户构造url。
if(!admin_check()) {
admin_log(1);
$db->query("DELETE FROM {$db->pre}admin WHERE userid=$_userid AND url='?".$DT_QST."'");
msg('警告!您无权进行此操作 Error(00)');
}
}
//是否记录日志
if($DT['admin_log'] && $action != 'import') admin_log();
if($DT['admin_online']) admin_online();
$psize = isset($psize) ? intval($psize) : 0;
if($psize > 0 && $psize != $pagesize) {
$pagesize = $psize;
$offset = ($page-1)*$pagesize;
}

if($module == 'destoon') {

(include DT_ROOT.'/admin/'.$file.'.inc.php') or msg();
} else {
echo $file.'|'.$module;
include DT_ROOT.'/module/'.$module.'/common.inc.php';//加载模块下的common文件
(include MD_ROOT.'/admin/'.$file.'.inc.php') or msg();//加载模块文件
}