在ecmall.php文件中实例化控制器类,每一个控制器类,必须继承(extends)upload\admin\app\backend.base.php文件。在继承中调用方法是谁先被继承谁的方法被先调用。

以default为例,首先在公共入口文件index.php文件中包含eccore/ecmall.php文件,调用startup方法并把includes/global.lib.php,includes/libraries/time.lib.php,includes/ecapp.base.php,includes/plugin.base.php,app/backend.base.php,以数据方式传递。在ECMAall类中的startup()方法中包含了eccore/controller/app.base.php和eccore/model/model.base.php文件。

获得控制器默认为[upload\admin\app\default.app.php文件,并继承BackendApp(app/backend.base.php)类,并继承ECBaseApp(includes/ecapp.base.ph)类,并继承BaseApp(eccore/controller/app.base.php),并继承Object(eccore/ecmall.php)]。然后调用ECBaseApp中的do_action()方法在调用其实父类BaseApp中的do_action()并判断$act(index)方法在默认控制器中是否存在,如果存在并符合条件,调用本对像是最早继承文件(app/backend.base.php)他中的_run_action()方法。

/***    后台的需要权限验证机制**    @author    Garbin*    @return    void*/
function _run_action()
{/* 先判断是否登录 */if (!$this->visitor->has_login){$this->login();return;}/* 登录后判断是否有权限 */if (!$this->visitor->i_can('do_action', $this->visitor->get('privs'))){$this->show_warning('no_permission');return;}/* 运行 */parent::_run_action();
}

在此要判断当前用户是否登录。

如果没有登录,调用(app/backend.base.php)他中的login()方法。

function login()
{if ($this->visitor->has_login){$this->show_warning('has_login');return;}if (!IS_POST){if (Conf::get('captcha_status.backend')){$this->assign('captcha', 1);}$this->display('login.html');}else{if (Conf::get('captcha_status.backend') && base64_decode($_SESSION['captcha']) != strtolower($_POST['captcha'])){$this->show_warning('captcha_faild');return;}$user_name = trim($_POST['user_name']);$password  = $_POST['password'];$ms =& ms();$user_id = $ms->user->auth($user_name, $password);if (!$user_id){/* 未通过验证,提示错误信息 */$this->show_warning($ms->user->get_error());return;}/* 通过验证,执行登陆操作 */if (!$this->_do_login($user_id)){return;}$this->show_message('login_successed','go_to_admin', 'index.php');}
}

然后调用includes/ecapp.base.php文件中的display()方法加载页面模板,在加载过程中需要给视图传递变量,调用eccore/controller/app.base.php中的assign()方法,在这个方法中还需要调用eccore/controller/app.base.php中的_init_view()方法,在这个过程中很重要因为他要引用返回eccore/ecmall.php文件中的& v()方法所引用的变量(引用eccore/view/template.php)文件,类似于加载,然后在eccore/controller/app.base.php中的assign()方法调用(eccore/view/template.php)文件assign()方法,以,键·值,形式赋值给_var数组中。

display()函数:

function display($f)
{if ($this->_hook('on_display', array('display_file' => & $f))){return;}$this->assign('site_url', SITE_URL);$this->assign('ecmall_version', VERSION);$this->assign('random_number', rand());/* 语言项 */$this->assign('lang', Lang::get());/* 用户信息 */$this->assign('visitor', isset($this->visitor) ? $this->visitor->info : array());/* 新消息 */$this->assign('new_message', isset($this->visitor) ? $this->_get_new_message() : '');$this->assign('charset', CHARSET);$this->assign('price_format', Conf::get('price_format'));$this->assign('async_sendmail', $this->_async_sendmail());$this->_assign_query_info();parent::display($f);if ($this->_hook('end_display', array('display_file' => & $f))){return;}
}

assign()函数:

/***    给视图传递变量**    @author    Garbin*    @param     string $k*    @param     mixed  $v*    @return    void*/
function assign($k, $v = null)
{$this->_init_view();if (is_array($k)){$args  = func_get_args();foreach ($args as $arg)     //遍历参数{foreach ($arg as $key => $value)    //遍历数据并传给视图{$this->_view->assign($key, $value);}}}else{$this->_view->assign($k, $v);}
}

_init_view()函数:

/***    初始化视图连接**    @author    Garbin*    @param    none*    @return    void*/
function _init_view()
{if ($this->_view === null){$this->_view =& v();$this->_config_view();  //配置}
}

在includes/ecapp.base.php文件中的display()中调用其父类eccore/controller/app.base.php中的display()方法,在display()方法中引用变量调用(eccore/view/template.php)文件中的display()方法,在display()方法中首先要判断当前的页面文件(upload\admin\templates)是否被修改如果有被修改重新缓存(upload\temp\compiled\admin),在模板缓存的时候首先要用strpos()方法判断编码头部(\xEF\xBB\xBF)是否出现过,如果出现在用我们最常用的str_replace()方法把其替换为空。

在页面提交中用到define('IS_POST', (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'))来判断是否提交,因为在页面提交的时候,$_SERVER['REQUEST_METHOD']默认为GET。

在登录页面中用method="post"方法提交表单所以得到IS_POST定义值为TRUE,进入到执行SQL语句中,判断是否登录成功。

在这个过程中要引用includes/global.lib.php文件中的&ms()方法(此方法中包含/includes/passport.base.php,/includes/passports/' . MEMBER_TYPE . '.passport.php,MEMBER_TYPE在data/config.inc.php中定义默认为default),把变量值地址引用到/includes/passports/default.passport.php文件中DefaultPassport类,DefaultPassport(/includes/passports/default.passport.ph)继承了BasePassport(/includes/passport.base.php)

/***    连接会员系统**    @author    Garbin*    @return    Passport 会员系统连接接口*/
function &ms()
{static $ms = null;if ($ms === null){include(ROOT_PATH . '/includes/passport.base.php');include(ROOT_PATH . '/includes/passports/' . MEMBER_TYPE . '.passport.php');$class_name  = ucfirst(MEMBER_TYPE) . 'Passport';$ms = new $class_name();}return $ms;
}

在这个过程中,把若干类实例化,所以调用auth(&username,&password)判断用户是不是存在正确,如果正确获得用户ID执行登陆操作调用_do_login方法,在这里我们的回到刚加载文件时候的初始化中因为在includes/ecapp.base.php文件初始化的时候执行了$this->_init_visitor();方法引用了AdminVisitor他类并继承了BaseVisitor类,所以可以在_do_login()方法中应用$this->visitor->assign()方法,其实就是BaseVisitor类中的

function assign($user_info)
{$_SESSION[$this->_info_key]   =   $user_info;
}

这样就把用户信息用SESSION保存,在执行操作的时候就可以对$this->has_login进行改变了。

好了这就是登录了。

其实他应用到"引用"和"继承"比较多所以会让初学者都感觉到很乱,没有头绪。引用就是不同的名字访问同一个变量内容,引用作为函数参数可以避免参数对象的额外拷贝。

如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除.另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。

function qev(&$array)
{Var_export($array);
}
$array_qev = array(
'1'=>'a','2'=>'b'
)
Qev($array_qev);

继承其实结果就是为增加代码的可重用性,也就是你定义一个方法如果他有一定的共性可以被多个新增加的效果所调用。

如果登录,在(app/backend.base.php)他文件_run_action()他方法中调其父类includes/ecapp.base.php文件中的_run_action()方法,在调用其父类eccore/controller/app.base.php他文件中的_run_action()方法,在此方法中调用自己所在的控制器(默认default)也就是(upload\admin\app\default.app.php)文件中的方法(默认index)index();

这些只是一点程序走向结构,具体内容结构还没有研究。程序结构给人感觉似乎挺乱的,但是如果细心研究执行效果非常的好。

---------------------------------------------------

文章来源:http://www.nowamagic.net/librarys/veda/detail/1078

ECMALL的登录过程机制解析相关推荐

  1. WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发)

    WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发) 目录 WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发) 概述 HTTP解析 HTTP请求头 HTTP响应头 H ...

  2. yii2教程-登录与自动登录机制解析

    简介 yii2的自动登录的原理很简单.主要就是利用cookie来实现的,在第一次登录的时候,如果登录成功并且选中了下次自动登录,那么就会把用户的认证信息保存到cookie中,cookie的有效期为1年 ...

  3. 基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和session机制)

    几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

  4. 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析

    InfluxDB 的存储机制解析 本文介绍了InfluxDB对于时序数据的存储/索引的设计.由于InfluxDB的集群版已在0.12版就不再开源,因此如无特殊说明,本文的介绍对象都是指 InfluxD ...

  5. Nordic系列芯片讲解九 (BLE事件回调机制解析)

    BLE事件回调机制解析 nRF5 SDK从版本14开始,对事件回调机制做了更新,引入了观察者模式,以解耦不同BLE Layer对BLE事件的回调函数. 实现这套机制用到了Flash的段(Section ...

  6. cas sso单点登录 登录过程和登出过程原理说明

    CAS大体原理我就不说了,网上一大把,不过具体交互流程没说清楚,所以有这篇文章,如果有错误,请多多指教 登录过程 用户第一次访问一个CAS 服务的客户web 应用时(访问URL :http://192 ...

  7. android permission权限与安全机制解析(上)

    目录(?)[-] uses-permission 自定义permission permission标签 permission-tree标签 permission-group标签 安全机制 组件权限 权 ...

  8. Tomcat根据JSP生成Servlet机制解析

    Tomcat根据JSP生成Servlet机制解析 JavaServer Pages(JSP) 简介 在传统的网页html文件中加入java程序片段和JSP标签,就构成了JSP网页:java程序片段可以 ...

  9. 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析 1

    2019独角兽企业重金招聘Python工程师标准>>> InfluxDB 的存储机制解析 本文介绍了InfluxDB对于时序数据的存储/索引的设计.由于InfluxDB的集群版已在0 ...

最新文章

  1. lua中正则表达式的坑
  2. kd tree python 搜索
  3. DonkeyID---php扩展-64位自增ID生成器
  4. 《大数据》第2期“应用”——医疗健康大数据:应用实例与系统分析
  5. php中的递归查找文件夹,PHP递归遍历文件夹
  6. webtrends 分析报告
  7. steam游戏图标失效_如何将非Steam游戏添加到Steam并应用自定义图标
  8. 解决python osdir() 函数 文件夹排序问题
  9. React Native基础知识
  10. 【EXCEL】条件格式:设置整列小于当前日期的单元格变为红色
  11. 一款好用的bi报表软件,让你站在Excel的肩膀上
  12. FPS显示和修改——unity3D
  13. 一个新手的评价---人机交互方面(有些不搭题
  14. matlab累加数组的前n行,有一组m行n列的数组,在matlab中如何编程,每三个数求一次平均数(行与列分别求)?...
  15. 【OpenCV】双目相机测距及其深度恢复原理及其算法流程
  16. 计算机网络常见名词及其解释
  17. c语言中用户验证程序,C语言用户登录系统账户密码比对
  18. 笔记本外接显示屏模糊解决办法,调缩放比没用?
  19. TP5.1实现支付宝线下收银(扫码枪扫描用户支付宝付款码支付)
  20. 云服务器1M带宽是什么意思,怎么选择服务器带宽?

热门文章

  1. python listdir 返回绝对路径
  2. Nvidia Jetson TX2 使用手机热点刷机教程
  3. 华硕电脑pycharm安装pytorch全过程(windonws下CUDA10.2+CUDNN8.3+pytorch1.9)亲测可用
  4. linux终端录像工具,Linux_Ubuntu安装屏幕录像工具Simple Screen Recorder的方法,  Simple Screen Recorder是一款简 - phpStudy...
  5. Excel2013 利用phonetic函数将多行数据合并到同一单元格中
  6. github每月优秀项目盘点推荐:2022年7月
  7. 频繁删除作品真的影响流量吗?新人又该如何规划道路丨国仁网络资讯
  8. 不到两千就有 845, 其他地方表现如何? — iQOO Neo 深评测
  9. 米云影视html5播放器,网页制作HTML5自定义视频播放器源码
  10. c++如何获取字符串长度