介绍
介绍
目录
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");
}
}测试
效果