同福

TFPHP框架开发CRUD程序手册V1.0

介绍

介绍


目录

Model

Model/domain.inc.php

Model/auth/api/authorization.inc.php

Model/auth/page/authorization.inc.php

View

View/Template/domain.html

js/pages/domain.js

Controller

Controller/domain.inc.php

Controller/api/resource/domain.inc.php

Controller/api/resource/domain/.mapping.inc.php

开发

Model

Model/domain.inc.php

namespace blank\Model;

use TFPHP\Model\TFModelData;
use TFPHP\System\TFPHP;

class domain extends TFModelData{
    public function __construct(TFPHP $tfphp){
        parent::__construct($tfphp);
        $this->setDataTable("domain", "domains", array(
            array('name'=>"dId", 'type'=>"int")
        ));
        $this->setDataTable("domainByName", "domains", array(
            array('name'=>"domainName", 'type'=>"str")
        ));
    }
}

Model/auth/api/authorization.inc.php

namespace blank\Model\auth\api;

use TFPHP\Controller\Authorization\TFAuthorization;

class authorization extends TFAuthorization{
    protected function makeAuthorizeRules(){
        $this->addAuthorizeRule("resource", array(
                "api\/resource\/.*"
            ));
    }

    protected function authorizedProcess(string $ruleName){
        switch ($ruleName){
            case "resource":
                break;
        }
    }

    protected function unauthorizedProcess(){
        $this->tfphp->getResponse()->responseJSON_CM(401, 10051, "not authorized");
    }
}

Model/auth/page/authorization.inc.php

namespace blank\Model\auth\page;

use TFPHP\Controller\Authorization\TFAuthorization;

class authorization extends TFAuthorization{
    protected function makeAuthorizeRules(){
        $this->addAuthorizeRule("default", array(
                ".*"
            ));
    }

    protected function authorizedProcess(string $ruleName){
        switch ($ruleName){
            case "default":
                break;
        }
    }

    protected function unauthorizedProcess(){
        $this->tfphp->getResponse()->responseHTML(401, "fff");
    }
}

View

View/Template/domain.html

<!DOCTYPE html>
<html>
<head>
    <title><% $TFRes->head->getTitle() %></title>
    <% $TFRes->head->getMetaHtml() %>
    <link rel="stylesheet" type="text/css" href="<% $TFReq->server->BASE_URI %>css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="<% $TFReq->server->BASE_URI %>css/tfhtml.css">
    <script type="text/javascript" src="<% $TFReq->server->BASE_URI %>js/jquery.min.js"></script>
    <script type="text/javascript" src="<% $TFReq->server->BASE_URI %>js/bootstrap.min.js"></script>
    <script type="text/javascript" src="<% $TFReq->server->BASE_URI %>js/tfhtml.js"></script>
    <script type="text/javascript">
        tfhtml.import('tfplugin', 'table');
        tfhtml.import('tfplugin', 'form');
        tfhtml.import('tfplugin', 'tips');
        tfhtml.import('tfplugin', 'dialog');
    </script>
</head>
<body>

<div class="wrapper">

    <div class="wrapper-header">

    </div>

    <div class="wrapper-content">

        <div class="row">
            <div class="col-12">

                <!-- add form -->
                <div class="dlg-box dlg-add-form">
                    <form class="form add-form">
                        <div class="dlg-header">
                            <div class="dlg-tool-box">
                                <i class="btn-close">X</i>
                            </div>
                            <div class="dlg-title">
                                添加域名
                            </div>
                        </div>
                        <div class="dlg-content">
                            <div class="form-group">
                                <label>域名</label>
                                <input type="text" class="form-control" name="domainName" />
                            </div>
                        </div>
                        <div class="dlg-footer">
                            <button class="btn btn-primary btn-sm">提交</button>
                        </div>
                    </form>
                </div>

                <!-- update form -->
                <div class="dlg-box dlg-update-form">
                    <form class="form update-form">
                        <div class="dlg-header">
                            <div class="dlg-tool-box">
                                <i class="btn-close">X</i>
                            </div>
                            <div class="dlg-title">
                                修改域名
                            </div>
                        </div>
                        <div class="dlg-content">
                            <div class="form-group">
                                <label>域名</label>
                                <span class="form-text" name="domainName"></span>
                            </div>
                        </div>
                        <div class="dlg-content">
                            <div class="form-group">
                                <label>等级</label>
                                <select class="form-control" name="rank">
                                    <option value="0">0</option>
                                    <option value="1">1</option>
                                    <option value="2">2</option>
                                    <option value="3">3</option>
                                    <option value="4">4</option>
                                    <option value="5">5</option>
                                    <option value="6">6</option>
                                    <option value="7">7</option>
                                    <option value="8">8</option>
                                    <option value="9">9</option>
                                </select>
                            </div>
                        </div>
                        <div class="dlg-footer">
                            <button class="btn btn-primary btn-sm">保存</button>
                        </div>
                    </form>
                </div>

                <!-- delete form -->
                <div class="dlg-box dlg-delete-form">
                    <form class="form delete-form">
                        <div class="dlg-header">
                            <div class="dlg-tool-box">
                                <i class="btn-close">X</i>
                            </div>
                            <div class="dlg-title">
                                删除域名
                            </div>
                        </div>
                        <div class="dlg-content">
                            <div class="form-group">
                                <label>域名</label>
                                <span class="form-text" name="domainName"></span>
                            </div>
                        </div>
                        <div class="dlg-footer">
                            <button class="btn btn-primary btn-sm">删除</button>
                        </div>
                    </form>
                </div>

                <!-- search form -->
                <div class="row" style="padding: 6px 0;">
                    <div class="col-6">
                        <button class="btn btn-primary btn-add">添加</button>
                    </div>
                    <div class="col-6">
                        <form class="form search-form" style="float: right; width: auto;">
                        <div class="form-inline">
                            <span><label>关键词</label></span>
                            <span><input class="form-control" type="text" name="keyword" /></span>
                            <span><button class="btn btn-primary btn-sm form-control">搜索</button></span>
                        </div>
                        </form>
                    </div>
                </div>


                <!-- domain list -->
                <div class="domain-list">
                    <table class="table">
                        <thead>
                        <tr>
                            <th>ID</th>
                            <th>域名</th>
                            <th>等级</th>
                            <th>创建时间</th>
                            <th>更新时间</th>
                            <th> </th>
                        </tr>
                        </thead>
                        <tbody>

                        </tbody>
                    </table>
                    <div class="row">
                        <div class="col-12">
                            <div class="pagination">

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

            </div>
        </div>

    </div>

    <div class="wrapper-footer">

    </div>

</div>

</body>
</html>

<script type="text/javascript">
    tfhtml.import('page', 'domain', '1.0.0');
    tfhtml.start({
        baseUri : "<% $TFReq->server->BASE_URI %>"
    });
</script>

js/pages/domain.js

var tfpage = {
    table : null,

    showTable : function(){
        var $table = $('.domain-list');

        table = $table.table({
            dataUrl: "api/resource/domain",
            dataMethod: "get",
            dataRenderType: "classic",
            attachRowEvent: function (rowObj, tableObj) {
                rowObj.find('.btn-update').click(function () {
                    // normal
                    tfpage.showUpdateForm($(this).attr('dataid'));
                });
                rowObj.find('.btn-delete').click(function () {
                    // normal
                    tfpage.showDeleteForm($(this).attr('dataid'));
                });
            },
            onRenderTable: function (tableData, tableObj) {
                var obj = tableObj.find(".table").find("tbody");

                obj.find("tr").remove();
            },
            onRenderRow: function (rowData, tableObj) {
                var obj = tableObj.find(".table").find("tbody"), extraBtns, extraClass;

                extraBtns = '';
                extraClass = '';
                if(extraClass != ""){
                    extraClass = " " + extraClass;
                }
                extraBtns += ' | <a class="btn-update" dataid="' + rowData.dId + '">修改</a>';
                extraBtns += ' | <a class="btn-delete" dataid="' + rowData.dId + '">删除</a>';
                if(extraBtns != ""){
                    extraBtns = extraBtns.substr(2);
                }
                obj.append('<tr dataid="' + rowData.dId + '">' +
                    '       <td>' + rowData.dId + '</td>' +
                    '       <td>' + rowData.domainName + '</td>' +
                    '       <td>' + rowData.rank + '</td>' +
                    '       <td>' + rowData.createDT + '</td>' +
                    '       <td>' + rowData.updateDT + '</td>' +
                    '       <td>' + extraBtns + '</td>' +
                    '</tr>');

                this.attachRowEvent(obj.find("tr[dataid=\"" + rowData.dId + "\"]"), tableObj);
            },
            onRenderPage: function (pageObj, tableObj) {
                var obj = tableObj.find(".pagination"), html = "";

                obj.html("");
                if (pageObj.pageNum > 1) {
                    obj.append('<li><a page-num="1">第一页</a></li>');
                    obj.append('<li><a page-num="' + (pageObj.pageNum - 1) + '">前一页</a></li>');
                }
                if (pageObj.pageTeamlinkRange) {
                    for (var p = pageObj.pageTeamlinkRange.low; p <= pageObj.pageTeamlinkRange.high; p++) {
                        obj.append('<li><a page-num="' + p + '">' + p + '</a></li>');
                    }
                    obj.find('[page-num="' + pageObj.pageNum + '"]').parent().addClass("active");
                }
                if (pageObj.pageNum < pageObj.pageTotal) {
                    obj.append('<li><a page-num="' + (pageObj.pageNum + 1) + '">后一页</a></li>');
                    obj.append('<li><a page-num="' + pageObj.pageTotal + '">最后页</a></li>');
                }
            },
            onError: function (d) {

            }
        });
    },

    showSearchForm : function(){
        var $form = $('form.search-form');

        $form.form({
            method: "post",
            table: table
        });
    },

    showAddForm : function(){
        var $form = $('form.add-form'), $dlg = $('div.dlg-add-form'), dlg = null;

        $form.form({
            url: "api/resource/domain",
            method: "post",
            validations: [
                {type:"empty", name:"domainName", msg:"请填写域名"},
                {type:"re", name:"domainName", value:"^[a-z0-9\\-\\.]+\\.[a-z]+$", msg:"域名格式无效"}
            ],
            onSuccess: function (d) {
                if(d.errcode == 0){
                    dlg.close();
                    table.refresh(null, true);
                }
                else{
                    $form.tips({
                        text:d.errmsg
                    });
                }
            },
            onError: function (d) {
                $form.tips({
                    text:"服务器响应错误"
                });
            },
            onValidationError: function (form, name, msg) {
                $form.tips({
                    text:msg
                });
                $form.find('[name="'+ name +'"]').focus();
            }
        });
        dlg = $dlg.dialog({

        });
    },

    showUpdateForm : function(id){
        var $form = $('form.update-form'), $dlg = $('div.dlg-update-form'), dlg = null;

        $form.form({
            url: "api/resource/domain/" + id,
            method: "post",
            dataUrl: "api/resource/domain/" + id,
            dataMethod: "get",
            dataMapRules: [
                {name:"domainName", dataKey:"domainName"},
                {name:"rank", dataKey:"rank"}
            ],
            onSuccess: function (d) {
                if(d.errcode == 0){
                    dlg.close();
                    table.refresh(null, true);
                }
                else{
                    $form.tips({
                        text:d.errmsg
                    });
                }
            },
            onError: function (d) {
                $form.tips({
                    text:"服务器响应错误"
                });
            },
            onValidationError: function (form, name, msg) {
                $form.tips({
                    text:msg
                });
                $form.find('[name="'+ name +'"]').focus();
            }
        });
        dlg = $dlg.dialog({

        });
    },

    showDeleteForm : function(id){
        var $form = $('form.delete-form'), $dlg = $('div.dlg-delete-form'), dlg = null;

        $form.form({
            url: "api/resource/domain/" + id,
            method: "delete",
            dataUrl: "api/resource/domain/" + id,
            dataMethod: "get",
            dataMapRules: [
                {name:"domainName", dataKey:"domainName"}
            ],
            onSuccess: function (d) {
                if(d.errcode == 0){
                    dlg.close();
                    table.refresh(null, true);
                }
                else{
                    $form.tips({
                        text:d.errmsg
                    });
                }
            },
            onError: function (d) {
                $form.tips({
                    text:"服务器响应错误"
                });
            },
            onValidationError: function (form, name, msg) {
                $form.tips({
                    text:msg
                });
                $form.find('[name="'+ name +'"]').focus();
            }
        });
        dlg = $dlg.dialog({

        });
    },

    start : function() {
        tfpage.showTable();
        tfpage.showSearchForm();
        $('.btn-add').click(function () {
            tfpage.showAddForm();
        });
    }
};

Controller

Controller/domain.inc.php

use blank\Model\auth\page\authorization;
use TFPHP\Controller\Page\TFController;
use blank\Model\domain;

class PageController extends TFController{

    protected function prepare() {
        $this->authorization = new authorization($this->tfphp);
    }

    protected function process(){

    }
}

Controller/api/api/resource/domain.inc.php

use blank\Model\auth\api\authorization;
use blank\Model\domain;
use TFPHP\Controller\API\TFController;

class APIController extends TFController{

    protected function prepare() {
        $this->authorization = new authorization($this->tfphp);
    }

    private function doAdd(){
        $post = $this->tfphp->getRequest()->post;
        $domain = new domain($this->tfphp);
        $domainName = $post->get("domainName");

        // duplicate check
        $domainDetail = $domain->get("domainByName", array($domainName));
        if($domainDetail != null){
            $this->tfphp->getResponse()->responseJSON_CM(200, 10062, "域名已经 ". $domainName. " 存在");
        }

        // save
        $domainDataArr = $post->getItems();
        $domainDataArr['createDT'] = date("Y-m-d H:i:s");
        $ret = $domain->modelInsert("domain", $domainDataArr);

        // result
        if($ret == 0){
            $domainId = $domain->getLastInsertId("domain");
            $this->tfphp->getResponse()->responseJSON_CM(200, 0, "success", array(
                'domainid'=>$domainId
            ));
        }
        else{
            $this->tfphp->getResponse()->responseJSON_CM(200, 10061, "failed");
        }
    }

    private function doList(){
        $get = $this->tfphp->getRequest()->get;
        $domain = new domain($this->tfphp);
        $q = $get->get("keyword");

        // query
        $ws = "";
        if($q != ""){
            $ws = " AND domainName LIKE '%". str_replace("'", "\'", $q). "%'";
        }
        if($ws != ""){
            $ws = substr($ws, 5);
        }
        $result = $domain->modelList("domain", array("dId", "domainName", "rank", "createDT", "updateDT"), $ws);
        $this->tfphp->getResponse()->responseJSON(200, $result);
    }

    protected function process(){
        switch ($this->tfphp->getRequest()->server->get("REQUEST_METHOD")){
            case "POST":
                $this->doAdd();
                break;
            default:
                $this->doList();
                break;
        }

        $this->tfphp->getResponse()->responseJSON_CM(400, 10021, "bad request");
    }
}

Controller/api/api/resource/domain/.mapping.inc.php

use blank\Model\auth\api\authorization;
use blank\Model\domain;
use TFPHP\Controller\API\TFController;

class APIController extends TFController{

    protected function prepare() {
        $this->authorization = new authorization($this->tfphp);
    }

    private function doUpdate(){
        $pathVars = $this->tfphp->getRequest()->server->get("PATH_VARIABLE");
        $post = $this->tfphp->getRequest()->post;
        $domain = new domain($this->tfphp);
        $dId = $pathVars['domain'];

        // get
        $domainDetail = $domain->modelGet("domain", array($dId));
        if($domainDetail == null){
            $this->tfphp->getResponse()->responseJSON_CM(404, 10071, "not found");
        }

        // save
        $domainDataArr = $post->getItems();
        $domainDataArr['updateDT'] = date("Y-m-d H:i:s");
        $ret = $domain->modelUpdate("domain", $domainDataArr, array($dId));

        // result
        if($ret == 0){
            $this->tfphp->getResponse()->responseJSON_CM(200, 0, "success");
        }
        else{
            $this->tfphp->getResponse()->responseJSON_CM(200, 10063, "failed");
        }
    }

    private function doDelete(){
        $pathVars = $this->tfphp->getRequest()->server->get("PATH_VARIABLE");
        $domain = new domain($this->tfphp);
        $dId = $pathVars['domain'];

        // get
        $domainDetail = $domain->modelGet("domain", array($dId));
        if($domainDetail == null){
            $this->tfphp->getResponse()->responseJSON_CM(404, 10071, "not found");
        }

        // save
        $ret = $domain->modelDelete("domain", array($dId));

        // result
        if($ret == 0){
            $this->tfphp->getResponse()->responseJSON_CM(200, 0, "success");
        }
        else{
            $this->tfphp->getResponse()->responseJSON_CM(200, 10063, "failed");
        }
    }

    private function doGet(){
        $pathVars = $this->tfphp->getRequest()->server->get("PATH_VARIABLE");
        $domain = new domain($this->tfphp);
        $dId = $pathVars['domain'];

        // query
        $result = $domain->get("domain", array($dId));
        $this->tfphp->getResponse()->responseJSON(200, $result);
    }

    protected function process(){
        switch ($this->tfphp->getRequest()->server->get("REQUEST_METHOD")){
            case "POST":
                $this->doUpdate();
                break;
            case "DELETE":
                $this->doDelete();
                break;
            default:
                $this->doGet();
                break;
        }

        $this->tfphp->getResponse()->responseJSON_CM(400, 10021, "bad request");
    }
}

测试

效果