同福

【TFAPI】TFAPI框架开发实战C版本(Router+Ajax版本)

目录结构

结构

sample
---- css -- 样式表
---- fonts -- 字体
---- images -- 图片
---- js -- 脚本

---- WEB-APP -- 系统目录(非用户访问目录)
--------- classes -- 用户自定义模块

------------- sample_system.inc.php -- 系统对象
------------- keywords.inc.php -- 字典库
------------- user_action.inc.php
------------- route -- 路由目录
----------------- admin.inc.php
----------------- api.inc.php
----------------- C.inc.php
----------------- default.inc.php
------------- view -- 视图目录
----------------- C
--------------------- user.inc.php
--------------------- userDetail.inc.php

--------- smarty -- 模板目录
------------- tpls -- 模板源目录
----------------- C
--------------------- header.htm
--------------------- footer.htm
--------------------- user.html
--------------------- userDetail.html

------------- coms -- 模板编译目录

--------- config.inc.php -- 环境文件
--------- web.inc.php -- 配置文件
---- index.php -- 索引文件

旧版本的框架使用的是 inc 作为文件扩展名,新版本的框架已经换成了 inc.php 作为文件扩展名了!

实例

路由

入口

require(WEB_DOC_ROOT. ".root.php");
require(WEBAPP_ROOT);
linking('html.form_action3');

class C_route extends html_frame{

    public function __construct($prefixUri, $mapUri){
        // init page
        $this->init_page($prefixUri, $mapUri, array(
			'mysql'
        ));
        
        $this->page->jsEngine = "pkg-bs";
    }

    public function load(){
        // load page
        $this->load_page();
    }
}

用户模型

数据表结构

CREATE TABLE `user` (
`uId`  int NOT NULL AUTO_INCREMENT ,
`uName`  varchar(45) NULL ,
`uPwd`  char(32) NULL ,
`crtDT`  datetime NULL ,
`logDT`  datetime NULL ,
`logTimes`  int NULL ,
PRIMARY KEY (`uId`),
UNIQUE INDEX `u_name` (`uName`) 
);

模型

WEB-APP/classes/user_action.inc.php

  • 方法 make_sql 返回的 $sql 变量指定的SQL语句的查询字段就是最终会显示到表格上的一列列的数据

linking('common.common_action');

class tf_user_action extends tf_common_action {
	public function __construct($dbObj){
		parent::__construct($dbObj, "user", "uId");
	}
	
	// 返回表格列数据的查询SQL
	public function make_sql($pageObj){
		$sql = "select uId, uName, crtDT, logDT, logTimes from user";
		return $sql;
	}
	
	// 设置登录cookie
	public function setLoginCookie($pageObj, $userData){
		$pageObj->cookie->TFAPIDemoUID = $userData['uId'];
 		$pageObj->cookie->TFAPIDemoUSN = md5("PreKey". $userData['uId']. "LastKey");
	}
	
	// 清除登录cookie
	public function clearLoginCookie($pageObj){
		$pageObj->cookie->TFAPIDemoUID = 0;
 		$pageObj->cookie->TFAPIDemoUSN = "";
	}
	
	// 测试登录cookie
	public function testLoginCookie($pageObj){
		$uid = $pageObj->cookie->TFAPIDemoUID;
		if($uid > 0
			&& $pageObj->cookie->TFAPIDemoUSN == md5("PreKey". $uid. "LastKey")){
			return $uid;
		}
		return null;
	}
}

公共模板

页头

WEB-APP/smarty/tpls/C/header.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<% $__header %>
</head>

<body>

<div id="wrapper">

	<div id="page-wrapper">
		<div class="wrapper wrapper-content animated fadeInRight">

页尾

WEB-APP/smarty/tpls/C/footer.htm

		</div>
	</div>
	
</div>

</body>

</html>

用户注册 & 用户登录 & 用户注销

注册路径

GET /C/user/register

登录路径

GET /C/user/login

注销路径

GET /C/user/logout

视图

WEB-APP/classes/userDetail.inc.php

  • 程序包含了两个独立表单对象 register_act 和 login_act,分别用来处理用户注册和用户登录

  • 实例化的环节通过系统变量 $this->pageObj->server->tfargv['user'] 的值判断路径请求的资源内容

  • 用户注销没有提供可见的表单,清除cookie后直接返回了列表页面

using('user_action');

// 注册表单对象
class register_act extends form_action_item3{
    protected function create_validator(){
        $this->validator = new form_validator_action3();
        $this->validator->add_rule("user", "r1(min[4]max[20])", array("最少4个字符", "最长20个字符"), "请填写用户名");
        $this->validator->add_rule("pwd", "r1(min[4]max[20])", array("最少4个字符", "最长20个字符"), "请填写密码");
        $this->validator->add_rule("vpwd", "r1(sas[pwd])", array("两次输入的密码不一致"), "请填写确认密码");
    }
    protected function create_form(){
        $this->form = new form_maker_action3($this->tableConfig, $this->pageObj, "form_act");
        $this->form->set_target();
        $this->form->add_textfield("user");
        $this->form->add_password("pwd");
        $this->form->add_password("vpwd");
        $this->form->add_button("btnSubmit",1,"提交");
    }
    protected function get_arg(&$arg){
        $arg['class'] = "ctongfuTableForm";
        $arg['labels'] = array('用户名', '密码', '确认密码');
    }
    protected function form_error($err){
        $this->pageObj->parentAlertBack(implode("\n", $err));
    }
    protected function process($arr, &$err){
 		$myUserActObj = new tf_user_action($this->dbObj);
 		
 		// 用户名检查
 		$dup = $myUserActObj->get_row_by_where($this->dbObj->sb("uName = @str", $arr['user']));
 		if($dup){
 			$err['user'] = "用户名已经存在";
 			return;
 		}
 		
 		// 用户注册
 		$newUserId = $myUserActObj->create_row(array('uName'=>$arr['user'], 'uPwd'=>md5($arr['pwd'])));
 		if(!($newUserId > 0)){
 			$err['user'] = "注册失败";
 			return;
 		}
 		
 		// 写入COOKIE
 		$exist = $myUserActObj->get_row_by_where($this->dbObj->sb("uName = @str", $arr['user']));
 		$myUserActObj->setLoginCookie($this->pageObj, $exist);
 		
		// 返回列表	
		$this->pageObj->parentGotoUrl($this->pageObj->U("C/user"));
    }
}

// 登录表单对象
class login_act extends form_action_item3{
    protected function create_validator(){
        $this->validator = new form_validator_action3();
        $this->validator->add_rule("user", "r1(min[4]max[20])", array("最少4个字符", "最长20个字符"), "请填写用户名");
        $this->validator->add_rule("pwd", "r1(min[4]max[20])", array("最少4个字符", "最长20个字符"), "请填写密码");
    }
    protected function create_form(){
        $this->form = new form_maker_action3($this->tableConfig, $this->pageObj, "form_act");
        $this->form->set_target();
        $this->form->add_textfield("user");
        $this->form->add_password("pwd");
        $this->form->add_button("btnSubmit",1,"提交");
    }
    protected function get_arg(&$arg){
        $arg['class'] = "ctongfuTableForm";
        $arg['labels'] = array('用户名', '密码');
    }
    protected function form_error($err){
        $this->pageObj->parentAlertBack(implode("\n", $err));
    }
    protected function process($arr, &$err){
 		$myUserActObj = new tf_user_action($this->dbObj);
 		
 		// 用户名检查
 		$exist = $myUserActObj->get_row_by_where($this->dbObj->sb("uName = @str", $arr['user']));
 		if($exist == null){
 			$err['user'] = "用户名不存在";
 			return;
 		}
 		else if($exist['uPwd'] != md5($arr['pwd'])){
 			$err['user'] = "密码错误";
 			return;
 		}

 		// 写入COOKIE
 		$myUserActObj->setLoginCookie($this->pageObj, $exist);
 		
 		// 返回列表
 		$this->pageObj->parentGotoUrl($this->pageObj->U("C/user"));
    }
}

class userDetail_action extends table_action_ctl {
    public function __construct($name){
        parent::__construct($name);
    }
}
class userDetail_page extends form_action3{
    public $loginUser;
    public $actionObj;
    protected function process(){
    	if($this->pageObj->server->tfargv['user'] == "register"){
    		
    		// 初始化注册表单
			$toolPage = new register_act("register", $this->smartyObj, $this->dbObj,
			    array(), "事件", $this->pageObj);
			$toolPage->tableConfig = $this->tableConfig;
			$toolPage->action_process();	
    	}
    	else if($this->pageObj->server->tfargv['user'] == "login"){
    		
    		// 初始化登录表单
    		$toolPage = new login_act("login", $this->smartyObj, $this->dbObj,
    			array(), "事件", $this->pageObj);
    		$toolPage->tableConfig = $this->tableConfig;
    		$toolPage->action_process();
    	}
    	else if($this->pageObj->server->tfargv['user'] == "logout"){
    		
    		// 注销登录
    		$myUserActObj = new tf_user_action($this->dbObj);
			$myUserActObj->clearLoginCookie($this->pageObj);
			
			// 返回列表
			$this->pageObj->gotoUrl($this->pageObj->U("C/user"));
    	}
    }
}

模板

WEB-APP/smarty/tpls/userDetail.html

  • 模板同样对应着两个独立表单的实例,同样通过系统变量 $this->pageObj->server->tfargv['user'] 的值判断路径请求的资源内容

<% include file="header.htm" %>

<% if $__page->server->tfargv.user == "register" %>

	<h1 style="text-align:center;">用户注册</h1>
	
	<% $actFormS_register %>
	<% $actFormJS_register %>
	
<% elseif $__page->server->tfargv.user == "login" %>

	<h1 style="text-align:center;">用户登录</h1>
	
	<% $actFormS_login %>
	<% $actFormJS_login %>
	
<% /if %>

<% include file="footer.htm" %>

效果

用户注册

3.jpg

用户登录

2.jpg

用户列表

路径

GET /C/user

视图

WEB-APP/classes/view/user.inc.php

using('user_action');

// 用户列表对象
class user_std_action extends table_action_ctl {
	public function __construct($name){
		parent::__construct($name);
		$this->add_usr_action("mod","修改");
		$this->add_usr_action("del","删除");
	}
}
class user_table extends table_action3 {
	public $loginUser;
	public $actionObj;
	protected function filter_row(&$row){
		$this->actionObj->set_action_link($row,"mod",$row['pmId']); // pmId - primary key id
	}
	protected function get_sql(&$sql){
		$myActObj = new tf_user_action($this->dbObj);
		$sql = $myActObj->make_sql($this->pageObj); 
	}
	protected function get_table_show_argv(table_action3_argv &$argv){
		$argv->actions = $this->actionObj->get_actions();
	}
}

class user_action extends table_action_ctl {
    public function __construct($name){
        parent::__construct($name);
    }
}
class user_page extends form_action3{
    public $loginUser;
    public $actionObj;
    protected function process(){
		// 初始化用户列表
		$tablePage = new user_table("user", $this->tableConfig, $this->pageObj, $this->smartyObj, $this->dbObj,
			array('ID', '用户名', '注册时间', '登录时间', '登录次数'));
		$tablePage->loginUser = $this->loginUser;
		$tablePage->actionObj = new user_action("user");
		$tablePage->make_table();
		
		// 登录用户信息
		$myUserActObj = new tf_user_action($this->dbObj);
		$uid = $myUserActObj->testLoginCookie($this->pageObj);
		$this->smartyObj->cfg("loginUserInfo", ($uid > 0) ? $myUserActObj->get_row($uid) : array());
    }
}

模板

WEB-APP/smarty/tpls/C/user.html

<% include file="header.htm" %>

<div >
	<% if $loginUserInfo.uId > 0 %>
		<b><% $loginUserInfo.uName %></b> <a href="<% $__page->docRoot %>C/user/logout">注销登录</a>
	<% else %>
		<a href="<% $__page->docRoot %>C/user/login">登录</a>
		<a href="<% $__page->docRoot %>C/user/register">注册</a>
	<% /if %>
</div>

<h1 style="text-align:center;">用户列表</h1>

<% $stdTable_user %>

<% include file="footer.htm" %>

效果

1.jpg

以上就通过TFAPI框架实现了一个用户模块的基本功能的实例,希望对大家有帮助~~

版本要求

这个版本的开发需要 1.9.5 以上的版本的TFAPI框架支持

总结

  • 最新版本增加了 Router 支持,可以自由的定制对外资源路径

  • 同时已经支持了 Ajax 模式,可以比较完美地实现了无刷新的表单处理