php开发(TP框架使用)
由于最近玩了PHP,我向来有个原则,学一门服务端语言至少得玩两个框架,前段时间用PHP写了些demo+小项目,看见身边有人在使用TP,于是乎鼓捣学习学习。如何学,无非也就是做个小demo;就目前看来现在都PHP框架都是以一个index.php文件作为入口,其他基本上就是路由加映射。
前期准备创建数据库与表:
# ************************************************************
# Sequel Pro SQL dump
# Version
#
# http://www.sequelpro.com/
# http://code.google.com/p/sequel-pro/
#
# Host: )
# Database: thinkphp_init
# Generation Time: -- :: +
# ************************************************************
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
# Dump of table think_admin
# ------------------------------------------------------------
DROP TABLE IF EXISTS `think_admin`;
CREATE TABLE `think_admin` (
`id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`adminname` ) NOT NULL COMMENT '管理员用户名',
`password` ) NOT NULL COMMENT '密码',
`email` ) NOT NULL COMMENT '邮箱',
`gender` tinyint() NOT NULL COMMENT '性别:1男、2女',
`tel` varchar() NOT NULL COMMENT '手机号',
`pic` varchar() NOT NULL COMMENT '头像的id,在resource表中',
`status` tinyint() NOT NULL DEFAULT ' COMMENT '状态 1:正常 2:删除',
`login_time` ) NOT NULL COMMENT '最后登录时间',
`login_ip` ) NOT NULL COMMENT '最后登录ip',
`add_time` ) NOT NULL COMMENT '添加时间',
PRIMARY KEY (`id`),
UNIQUE KEY `admin_name` (`adminname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='管理员表';
LOCK TABLES `think_admin` WRITE;
/*!40000 ALTER TABLE `think_admin` DISABLE KEYS */;
INSERT INTO `think_admin` (`id`, `adminname`, `password`, `email`, `gender`, `tel`, `pic`, `status`, `login_time`, `login_ip`, `add_time`)
VALUES
(,,,,),
(,,,,);
/*!40000 ALTER TABLE `think_admin` ENABLE KEYS */;
UNLOCK TABLES;
# Dump of table think_menu
# ------------------------------------------------------------
DROP TABLE IF EXISTS `think_menu`;
CREATE TABLE `think_menu` (
`id` smallint() unsigned NOT NULL AUTO_INCREMENT,
`title` varchar() NOT NULL COMMENT '标题',
`icon` varchar() NOT NULL COMMENT '图标',
`module_name` varchar() NOT NULL COMMENT '模块名',
`controller_name` varchar() NOT NULL COMMENT '控制器名',
`action_name` varchar() NOT NULL COMMENT '方法名',
`param` varchar() NOT NULL COMMENT '参数',
`replace` varchar() NOT NULL COMMENT '替换',
`remark` varchar() NOT NULL COMMENT '介绍',
`pid` ) NOT NULL COMMENT '上级id',
`path` varchar() NOT NULL DEFAULT ' COMMENT 'pid层级',
`level` tinyint() unsigned NOT NULL COMMENT '层级',
`view_order` ) NOT NULL DEFAULT ' COMMENT '排序,越大越在前',
`is_show` tinyint() NOT NULL DEFAULT ' COMMENT '是否显示 1:显示',
`status` tinyint() NOT NULL DEFAULT ' COMMENT '状态 1:正常 2:删除',
`add_time` ) NOT NULL COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `level` (`level`),
KEY `pid` (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='rbac 菜单、节点表';
LOCK TABLES `think_menu` WRITE;
/*!40000 ALTER TABLE `think_menu` DISABLE KEYS */;
INSERT INTO `think_menu` (`id`, `title`, `icon`, `module_name`, `controller_name`, `action_name`, `param`, `replace`, `remark`, `pid`, `path`, `level`, `view_order`, `is_show`, `status`, `add_time`)
VALUES
(,,,,,,),
(,,,,,,),
(,,,,,,),
(,,,,,,),
(,,,,,,),
(,,,,,,),
(,,,,,,),
(,,,,,,);
/*!40000 ALTER TABLE `think_menu` ENABLE KEYS */;
UNLOCK TABLES;
# Dump of table think_resource
# ------------------------------------------------------------
DROP TABLE IF EXISTS `think_resource`;
CREATE TABLE `think_resource` (
`id` ) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`name` ) NOT NULL COMMENT '上传文件的原名',
`type` ) NOT NULL COMMENT '上传文件的MIME类型',
`size` ) NOT NULL COMMENT '大小,单位字节',
`ext` ) NOT NULL COMMENT '后缀名',
`savename` ) NOT NULL COMMENT '保存后的名字',
`savepath` ) NOT NULL COMMENT '保存的路径',
`add_time` ) NOT NULL COMMENT '上传时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='上传资源表,如photo,file';
# Dump of table think_role
# ------------------------------------------------------------
DROP TABLE IF EXISTS `think_role`;
CREATE TABLE `think_role` (
`id` smallint() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL,
`pid` smallint() NOT NULL,
`status` tinyint() NOT NULL DEFAULT ' COMMENT '状态 1:正常 2:删除',
`remark` varchar() NOT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='角色表';
LOCK TABLES `think_role` WRITE;
/*!40000 ALTER TABLE `think_role` DISABLE KEYS */;
INSERT INTO `think_role` (`id`, `name`, `pid`, `status`, `remark`)
VALUES
(,,,'');
/*!40000 ALTER TABLE `think_role` ENABLE KEYS */;
UNLOCK TABLES;
# Dump of table think_role_admin
# ------------------------------------------------------------
DROP TABLE IF EXISTS `think_role_admin`;
CREATE TABLE `think_role_admin` (
`role_id` ) NOT NULL,
`admin_id` ) NOT NULL,
KEY `group_id` (`role_id`),
KEY `user_id` (`admin_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='角色和用户的关系表';
# Dump of table think_role_menu
# ------------------------------------------------------------
DROP TABLE IF EXISTS `think_role_menu`;
CREATE TABLE `think_role_menu` (
`role_id` ) unsigned NOT NULL,
`menu_id` ) unsigned NOT NULL,
`level` tinyint() NOT NULL,
`module` varchar() NOT NULL,
KEY `groupId` (`role_id`),
KEY `nodeId` (`menu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='角色和节点菜单的关系表';
LOCK TABLES `think_role_menu` WRITE;
/*!40000 ALTER TABLE `think_role_menu` DISABLE KEYS */;
INSERT INTO `think_role_menu` (`role_id`, `menu_id`, `level`, `module`)
VALUES
(,,,''),
(,,,'');
/*!40000 ALTER TABLE `think_role_menu` ENABLE KEYS */;
UNLOCK TABLES;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
第一步:把TP整个包都放在应用工程的根目录下面,再建立一个index.php文件
index.php:
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用入口文件
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',true);
// 是否开启生成安全文件
define('BUILD_DIR_SECURE', false);
// 定义应用目录
define('APP_PATH','./App/');
// 定义框架目录
define('THINK_PATH', './ThinkPHP/');
// 引入ThinkPHP入口文件
require THINK_PATH.'ThinkPHP.php';
// 亲^_^ 后面不需要任何代码了 就是如此简单
第二步:配置convention.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
/**
* ThinkPHP惯例配置文件
* 该文件请不要修改,如果要覆盖惯例配置的值,可在应用配置文件中设定和惯例不符的配置项
* 配置名称大小写任意,系统会统一转换成小写
* 所有配置参数都可以在生效前动态改变
*/
defined('THINK_PATH') or exit();
return array(
/* 应用设定 */
'APP_USE_NAMESPACE' => true, // 应用类库是否使用命名空间
'APP_SUB_DOMAIN_DEPLOY' => false, // 是否开启子域名部署
'APP_SUB_DOMAIN_RULES' => array(), // 子域名部署规则
'APP_DOMAIN_SUFFIX' => '', // 域名后缀 如果是com.cn net.cn 之类的后缀必须设置
'ACTION_SUFFIX' => '', // 操作方法后缀
'MULTI_MODULE' => true, // 是否允许多模块 如果为false 则必须设置 DEFAULT_MODULE
'MODULE_DENY_LIST' => array('Common','Runtime'),
,
'APP_AUTOLOAD_LAYER' => 'Controller,Model', // 自动加载的应用类库层 关闭APP_USE_NAMESPACE后有效
'APP_AUTOLOAD_PATH' => '', // 自动加载的路径 关闭APP_USE_NAMESPACE后有效
/* Cookie设置 */
, // Cookie有效期
'COOKIE_DOMAIN' => '', // Cookie有效域名
'COOKIE_PATH' => '/', // Cookie路径
'COOKIE_PREFIX' => '', // Cookie前缀 避免冲突
'COOKIE_HTTPONLY' => '', // Cookie httponly设置
/* 默认设定 */
'DEFAULT_M_LAYER' => 'Model', // 默认的模型层名称
'DEFAULT_C_LAYER' => 'Controller', // 默认的控制器层名称
'DEFAULT_V_LAYER' => 'View', // 默认的视图层名称
'DEFAULT_LANG' => 'zh-cn', // 默认语言
'DEFAULT_THEME' => '', // 默认模板主题名称
'DEFAULT_MODULE' => 'Admin', // 默认模块
'DEFAULT_CONTROLLER' => 'Index', // 默认控制器名称
'DEFAULT_ACTION' => 'index', // 默认操作名称
'DEFAULT_CHARSET' => 'utf-8', // 默认输出编码
'DEFAULT_TIMEZONE' => 'PRC', // 默认时区
'DEFAULT_AJAX_RETURN' => 'JSON', // 默认AJAX 数据返回格式,可选JSON XML ...
'DEFAULT_JSONP_HANDLER' => 'jsonpReturn', // 默认JSONP格式返回的处理方法
'DEFAULT_FILTER' => 'htmlspecialchars', // 默认参数过滤方法 用于I函数...
/* 数据库设置 */
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => '192.168.1.109', // 服务器地址
'DB_NAME' => 'thinkphp_init', // 数据库名
'DB_USER' => 'zhenchaowen', // 用户名Admin
'DB_PWD' => 'zhenchaowen', // 密码
', // 端口
'DB_PREFIX' => 'think_', // 数据库表前缀
'DB_FIELDTYPE_CHECK' => false, // 是否进行字段类型检查
'DB_FIELDS_CACHE' => true, // 启用字段缓存
'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效
, // 读写分离后 主服务器数量
'DB_SLAVE_NO' => '', // 指定从服务器序号
'DB_SQL_BUILD_CACHE' => false, // 数据库查询的SQL创建缓存
'DB_SQL_BUILD_QUEUE' => 'file', // SQL缓存队列的缓存方式 支持 file xcache和apc
, // SQL缓存的队列长度
'DB_SQL_LOG' => false, // SQL执行日志记录
'DB_BIND_PARAM' => false, // 数据库写入数据自动参数绑定
/* 数据缓存设置 */
, // 数据缓存有效期 0表示永久缓存
'DATA_CACHE_COMPRESS' => false, // 数据缓存是否压缩缓存
'DATA_CACHE_CHECK' => false, // 数据缓存是否校验缓存
'DATA_CACHE_PREFIX' => '', // 缓存前缀
'DATA_CACHE_TYPE' => 'File', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator
'DATA_CACHE_PATH' => TEMP_PATH,// 缓存路径设置 (仅对File方式缓存有效)
'DATA_CACHE_SUBDIR' => false, // 使用子目录缓存 (自动根据缓存标识的哈希创建子目录)
, // 子目录缓存级别
/* 错误设置 */
'ERROR_MESSAGE' => '页面错误!请稍后再试~',//错误显示信息,非调试模式有效
'ERROR_PAGE' => '', // 错误定向页面
'SHOW_ERROR_MSG' => false, // 显示错误信息
, // 每个级别的错误信息 最大记录数
/* 日志设置 */
'LOG_RECORD' => false, // 默认不记录日志
'LOG_TYPE' => 'File', // 日志记录类型 默认为文件方式
'LOG_LEVEL' => 'EMERG,ALERT,CRIT,ERR',// 允许记录的日志级别
, // 日志文件大小限制
'LOG_EXCEPTION_RECORD' => false, // 是否记录异常信息日志
/* SESSION设置 */
'SESSION_AUTO_START' => true, // 是否自动开启Session
'SESSION_OPTIONS' => array(), // session 配置数组 支持type name id path expire domain 等参数
'SESSION_TYPE' => '', // session hander类型 默认无需设置 除非扩展了session hander驱动
'SESSION_PREFIX' => '', // session 前缀
//'VAR_SESSION_ID' => 'session_id', //sessionID的提交变量
/* 模板引擎设置 */
'TMPL_CONTENT_TYPE' => 'text/html', // 默认模板输出类型
'TMPL_ACTION_ERROR' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件
'TMPL_ACTION_SUCCESS' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件
'TMPL_EXCEPTION_FILE' => THINK_PATH.'Tpl/think_exception.tpl',// 异常页面的模板文件
'TMPL_DETECT_THEME' => false, // 自动侦测模板主题
'TMPL_TEMPLATE_SUFFIX' => '.html', // 默认模板文件后缀
'TMPL_FILE_DEPR' => '/', //模板文件CONTROLLER_NAME与ACTION_NAME之间的分割符
// 布局设置
'TMPL_ENGINE_TYPE' => 'Think', // 默认模板引擎 以下设置仅对使用Think模板引擎有效
'TMPL_CACHFILE_SUFFIX' => '.php', // 默认模板缓存后缀
'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数
'TMPL_DENY_PHP' => false, // 默认模板引擎是否禁用PHP原生代码
'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记
'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记
'TMPL_VAR_IDENTIFY' => 'array', // 模板变量识别。留空自动判断,参数为'obj'则表示对象
'TMPL_STRIP_SPACE' => true, // 是否去除模板文件里面的html空格与换行
'TMPL_CACHE_ON' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译
'TMPL_CACHE_PREFIX' => '', // 模板缓存前缀标识,可以动态改变
, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒)
'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', // 布局模板的内容替换标识
'LAYOUT_ON' => false, // 是否启用布局
'LAYOUT_NAME' => 'layout', // 当前布局名称 默认为layout
// Think模板引擎标签库相关设定
'TAGLIB_BEGIN' => '<', // 标签库标签开始标记
'TAGLIB_END' => '>', // 标签库标签结束标记
'TAGLIB_LOAD' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测
'TAGLIB_BUILD_IN' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序
'TAGLIB_PRE_LOAD' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔
/* URL设置 */
'URL_CASE_INSENSITIVE' => true, // 默认false 表示URL区分大小写 true则表示不区分大小写
, // URL访问模式,可选参数0、1、2、3,代表以下四种模式:
// 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默认为PATHINFO 模式
'URL_PATHINFO_DEPR' => '/', // PATHINFO模式下,各参数之间的分割符号
'URL_PATHINFO_FETCH' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', // 用于兼容判断PATH_INFO 参数的SERVER替代变量列表
'URL_REQUEST_URI' => 'REQUEST_URI', // 获取当前页面地址的系统变量 默认为REQUEST_URI
'URL_HTML_SUFFIX' => 'html', // URL伪静态后缀设置
'URL_DENY_SUFFIX' => 'ico|png|gif|jpg', // URL禁止访问的后缀设置
'URL_PARAMS_BIND' => true, // URL变量绑定到Action方法参数
, // URL变量绑定的类型 0 按变量名绑定 1 按变量顺序绑定
'URL_PARAMS_FILTER' => false, // URL变量绑定过滤
'URL_PARAMS_FILTER_TYPE'=> '', // URL变量绑定过滤方法 如果为空 调用DEFAULT_FILTER
'URL_ROUTER_ON' => false, // 是否开启URL路由
'URL_ROUTE_RULES' => array(), // 默认路由规则 针对模块
'URL_MAP_RULES' => array(), // URL映射定义规则
/* 系统变量名称设置 */
'VAR_MODULE' => 'm', // 默认模块获取变量
'VAR_ADDON' => 'addon', // 默认的插件控制器命名空间变量
'VAR_CONTROLLER' => 'c', // 默认控制器获取变量
'VAR_ACTION' => 'a', // 默认操作获取变量
'VAR_AJAX_SUBMIT' => 'ajax', // 默认的AJAX提交变量
'VAR_JSONP_HANDLER' => 'callback',
'VAR_PATHINFO' => 's', // 兼容模式PATHINFO获取变量例如 ?s=/module/action/id/1 后面的参数取决于URL_PATHINFO_DEPR
'VAR_TEMPLATE' => 't', // 默认模板切换变量
'HTTP_CACHE_CONTROL' => 'private', // 网页缓存控制
'CHECK_APP_DIR' => true, // 是否检查应用目录是否创建
'FILE_UPLOAD_TYPE' => 'Local', // 文件上传方式
'DATA_CRYPT_TYPE' => 'Think', // 数据加密方式
);
第三步:编写相应的control和view:
例子:
AdminController.class.php:
<?php
/**
* ThinkPHP的命名空间使用规范。注意:命名空间定义必须写在所有的PHP代码之前声明,否则会出错
* 命名空间和实际的控制器文件所在的路径是一致的,
*/
namespace Admin\Controller;
use Admin\Controller\CommonController;
use Org\Util\Rbac;
class AdminController extends CommonController {
;
public function index(){
$status = I();
$keyword = I('keyword', '');
$list = array();
$where = array ();
if ($status) {
$where['status'] = $status;
}
$this->assign('status', $status);
if ($keyword) {
$where['adminname'] = array('like', "%{$keyword}%");
}
$this->assign('keyword', $keyword);
$model = D('Admin');
$count = $model->where ($where)->count (); // 查询满足要求的总记录数
$page = new \Admin\Org\Page ($count, $this->page_num); // 实例化分页类 传入总记录数和每页显示的记录数
// 进行分页数据查询 注意limit方法的参数要使用Page类的属性
$order = 'id asc';
$list = $model->where($where)->order($order)->limit($page->firstRow.','.$page->listRows)->select();
$show = $page->pageShow (); // 分页显示输出
$this->assign ( 'list', $list ); // 赋值数据集
$this->assign ( 'page', $show ); // 赋值分页输出
$this->display(); // 输出模板
}
public function admin_add(){
$id = I();
$model = D('Admin');
$info = false;
$role_user = array();
if ($id) {
$info = $model->find($id);
// 角色与用户关系
$role_user = D('Role_admin')->where(array('admin_id' => $id))->getField('role_id', true);
}
$role_list = D())->select();
if ($role_list) {
foreach ($role_list as &$val) {
if (in_array($val['id'], $role_user)) {
$val[;
} else {
$val[;
}
}
}
$this->assign('role_list', $role_list);
$this->assign('info', $info);
$this->display();
}
public function save(){
$id = I();
$adminname = I('adminname', '');
$password = I('password', '');
$re_password = I('re_password', '');
$role_id = I('role_id', array());
if (empty($adminname)) {
$this->out('error', '请填写用户名');
}
$model = D('Admin');
// 验证通过 可以进行其他数据操作
unset($_POST['role_id']);
if (empty($id)) {
$_POST['password'] = md5($password);
$_POST['re_password'] = md5($re_password);
$_POST['add_time'] = time();
$tmp = $model->create();
if (!$tmp){
// 如果创建失败 表示验证没有通过 输出错误提示信息
$this->out('error', $model->getError());
}
$result = $model->add();
$id = $result;
} else {
$where['adminname'] = $adminname;
$where['id'] = array('neq', $id);
$info = $model->where($where)->find();
if ($info) {
$this->out('error', '该名称已经存在了!');
}
if (!empty($password) && !empty($re_password)) {
if ($password != $re_password) {
$this->out('error', '密码与确认密码不一致!');
}
$_POST['password'] = md5($password);
unset($_POST['re_password']);
} else {
unset($_POST['password']);
unset($_POST['re_password']);
}
$result = $model->save($_POST);
}
$model_role_admin = D('Role_admin');
// 先删除,再插入 ,角色与用户对应关系
$resu = $model_role_admin->where(array('admin_id' => $id))->delete();
if ($role_id) {
if ($role_id) {
foreach ($role_id as $val) {
$data['role_id'] = $val;
$data['admin_id'] = $id;
$re = $model_role_admin->data($data)->add();
}
}
}
if ($result || $resu || $re) {
$this->out('ok', '保存成功');
} else {
$this->out('error', '保存失败');
}
}
// 用户删除 加入回收站
public function delete(){
$id = I();
if (empty($id)) {
$this->out('error', '请选择要删除的记录!');
}
$model = D('Admin');
$arr = explode(',', $id);
$data['id'] = array('in', $arr);
$data[;
$result = $model->save($data);
if ($result) {
$this->out('ok', '删除成功');
} else {
$this->out('error', '删除失败');
}
}
// 用户还原
public function reduction(){
$id = I();
if (empty($id)) {
$this->out('error', '请选择要还原的记录!');
}
$model = D('Admin');
$arr = explode(',', $id);
$data['id'] = array('in', $arr);
$data[;
$result = $model->save($data);
if ($result) {
$this->out('ok', '还原成功');
} else {
$this->out('error', '还原失败');
}
}
// 用户彻底删除
public function delete_really(){
$id = I();
if (empty($id)) {
$this->out('error', '请选择要还原的记录!');
}
$model = D('Admin');
$arr = explode(',', $id);
$data['id'] = array('in', $arr);
$result = $model->where($data)->delete($data);
if ($result) {
$this->out('ok', '还原成功');
} else {
$this->out('error', '还原失败');
}
}
}
view:
<include file="Public/side" />
<div class="col-xs-9" role="main">
<form action='__URL__/index' id="js_search" method="get">
<ol class="breadcrumb">
<li class="active">
<table>
<tr>
<td>
<a href="__URL__/index/status/0"><span class="label <if condition='$status eq 0'>label-default<else/>label-info</if>">全部</span></a>
<a href="__URL__/index/status/1"><span class="label <if condition='$status eq 1'>label-default<else/>label-success</if>">正常</span></a>
<a href="__URL__/index/status/2"><span class="label <if condition='$status eq 2'>label-default<else/>label-warning</if>">回收站</span></a>
</td>
<td>
<input type="text" class="form-control" name="keyword" value="{$keyword}" placeholder="用户名" style="float: left;">
</td>
<td><button type="submit" class="btn btn-sm btn-primary">搜索</button></td>
<td colspan=">
<span class="nav-addbtn">
<a href="/article/edit/id/0">
<a href="__URL__/admin_add" class="btn btn-sm btn-success" style="float:right;">添加管理员</a>
</a>
</span>
</td>
</tr>
</table>
</li>
</ol>
</form>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>性别</th>
<th>邮箱</th>
<th>电话</th>
<th>最后登录时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<volist name="list" id="val">
<tr>
<td>{$val.id}</td>
<td>{$val.adminname}</td>
<td>{$val.gender}</td>
<td>{$val.email}</td>
<td>{$val.tel}</td>
<td>{$val.login_time|date='Y-m-d H:i:s', ###}</td>
<td>
<a href="__URL__/admin_add/id/{$val.id}" class="btn btn-primary btn-xs">编辑</a>
<if condition="$val.status eq 1">
<a href="__URL__/delete/id/{$val.id}" class="btn btn btn-warning btn-xs delete_one">删除</a>
<else />
<a href="__URL__/reduction/id/{$val.id}" class="btn btn-success btn-xs reduction">还原</a>
<a href="__URL__/delete_really/id/{$val.id}" class="btn btn-danger btn-xs delete_really">彻底删除</a>
</if>
</td>
</tr>
</volist>
</tbody>
</table>
<div class="my_page">
{$page}
</div>
</div>
</div>
<script type="text/javascript">
//var $status = '{$status}';
</script>
<include file="Public/footer" />
访问应用:
http://mysites:8405/Thinkphp_init-master/index.php/Admin/Menu/index
如图:

参考:
https://github.com/super-d2/codeigniter_demo
http://www.thinkphp.cn/info/122.html
http://www.thinkphp.cn/document/308.html
php开发(TP框架使用)的更多相关文章
- 使用PHP做移动端 api接口开发方法(适用于TP框架)
1. [代码]使用TP框架时 放在common文件夹下文件名就叫function.php ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
- tp框架验证信息
今天在这里我们学习一下tp框架里面怎么做验证. 验证又分为两种:静态验证.动态验证 首先,我们还是先做一个html界面,名为add.html.代码如下: <!DOCTYPE html PUBLI ...
- tp框架总体学习总结(一)
一.TP框架的下载和安装 Tp框架下载网址:http://www.thinkphp.cn/ 在wamp的www目录下创建一个目录tpshop目录 1. 将下载好的包压缩后将文件包里的所有文件复制到创 ...
- TP框架基础
什么是TP框架: 一堆代码的集合,里边有变量.函数.类.常量,设计模式MVC.AR数据库.单例等等.全称是Tinkphp框架; 为什么使用框架: 使用框架将全部精力集中在业务层次,节省50-60%的工 ...
- TP框架 基础1
php框架 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格 ...
- 待续未完- 自己写后台内容管理程序 - 用tp框架 和 前台 jquery ui等写的
在日常开发中,我们主要使用的还是 php 的 内部的 语言本身提供的函数/常量,系统内部数组等. 为了和后面的tp框架提供的 "系统函数.系统常量"相区别,把php提供的东西叫语言 ...
- TP框架---Model模型层---做模型对象
TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是 ...
- TP框架---thinkphp基础知识
php框架 发瑞 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困 ...
- tp框架引入第三方sdk的经验总结
tp框架开发常用到第三方的接口,这时候需要引入第三方的sdk.例如:微信扫码支付sdk,阿里大于的淘宝sdk等等 首先到官网上下载对应php的sdk文件,通常会有至少一个实例代码. 1 新建一个控制器 ...
- TP框架基础(一)
[使用框架] 官网:thinkphp.cn. 目前建议使用thinkPHP3.2版本 一.结构目录>Thinkphp文件夹,是thinkPHP的核心文件,里面的内容是不允许我们修改的 > ...
随机推荐
- Java解析采集模块
package step3; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; im ...
- Ubuntu16.04/centos7 下为chrome/firefox安装flash player插件
为chrome安装flash: 打开终端,输入:sudo apt-get install pepperflashplugin-nonfree 或官网下载安装google-chrome-stable 为 ...
- 保存字符串到手机SDcard为txt文件
try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File sdCardDir ...
- php 使用redis锁限制并发访问类
1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...
- C#之串口
1.字符发送 string strSend = "00 01 02 03"; serialPort1.Write(strSend); 2.字符接收 ReadDataFromSeri ...
- struts2 学习路线
1.请求:开发struts2流程,(常见配置.action的方法的访问.ServletApi的访问.结果页面类型) 2.强求:封装参数.类型转换.数据校验.国际化.拦截器. 3.响应页面的生成:文件上 ...
- 第十天 多进程、协程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)
1.多进程实现方式(类似于多线程) import multiprocessing import time,threading def thread_run():#定义一个线程函数 print(&quo ...
- ios 关于使用异步网络请求时block回调的内存注意
在一个controller中,使用 NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest ...
- vc++创建文件目录
#include "stdafx.h" #include <iostream> #include <fstream> #include <string ...
- poj 2389.Bull Math 解题报告
题目链接:http://poj.org/problem?id=2389 题目意思:就是大整数乘法. 题目中说每个整数不超过 40 位,是错的!!!要开大点,这里我开到100. 其实大整数乘法还是第一次 ...