由于最近玩了PHP,我向来有个原则,学一门服务端语言至少得玩两个框架,前段时间用PHP写了些demo+小项目,看见身边有人在使用TP,于是乎鼓捣学习学习。如何学,无非也就是做个小demo;就目前看来现在都PHP框架都是以一个index.php文件作为入口,其他基本上就是路由加映射。
前期准备创建数据库与表:
# ************************************************************ # Sequel Pro SQL dump # Version 4096 # # http://www.sequelpro.com/ # http://code.google.com/p/sequel-pro/ # # Host: 192.168.1.109 (MySQL 5.1.73) # Database: thinkphp_init # Generation Time: 2015-12-25 13:28:53 +0000 # ************************************************************ /*!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` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', `adminname` char(60) NOT NULL COMMENT '管理员用户名', `password` char(32) NOT NULL COMMENT '密码', `email` char(60) NOT NULL COMMENT '邮箱', `gender` tinyint(1) NOT NULL COMMENT '性别:1男、2女', `tel` varchar(11) NOT NULL COMMENT '手机号', `pic` varchar(255) NOT NULL COMMENT '头像的id,在resource表中', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:正常 2:删除', `login_time` int(11) NOT NULL COMMENT '最后登录时间', `login_ip` char(30) NOT NULL COMMENT '最后登录ip', `add_time` int(11) 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 (1,'zzz','f3abb86bd34cf4d52698f14c0da1dc60','',0,'','',1,1451048593,'',0), (2,'tom','f3abb86bd34cf4d52698f14c0da1dc60','',0,'','',1,1451048593,'',0); /*!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(6) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(125) NOT NULL COMMENT '标题', `icon` varchar(125) NOT NULL COMMENT '图标', `module_name` varchar(125) NOT NULL COMMENT '模块名', `controller_name` varchar(125) NOT NULL COMMENT '控制器名', `action_name` varchar(125) NOT NULL COMMENT '方法名', `param` varchar(125) NOT NULL COMMENT '参数', `replace` varchar(125) NOT NULL COMMENT '替换', `remark` varchar(255) NOT NULL COMMENT '介绍', `pid` int(11) NOT NULL COMMENT '上级id', `path` varchar(255) NOT NULL DEFAULT '0' COMMENT 'pid层级', `level` tinyint(1) unsigned NOT NULL COMMENT '层级', `view_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越大越在前', `is_show` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否显示 1:显示', `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态 1:正常 2:删除', `add_time` int(11) 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 (34,'index','','Admin','Index','index','','','',0,'--',3,0,0,1,1450801578), (35,'index','','Admin','Admin','','','','',34,'---34',2,0,0,1,1450879911), (36,'index','','Admin','Admin','index','','','',35,'---34-35',3,0,0,1,1450879911), (37,'index','','Admin','Menu','','','','',34,'---34',2,0,0,1,1450887588), (38,'index','','Admin','Menu','index','','','',37,'---34-37',3,0,0,1,1450887588), (39,'menu_add','','Admin','Menu','menu_add','','','',37,'---34-37',3,0,0,1,1450887672), (40,'menu_save','','Admin','Menu','menu_save','','','',37,'---34-37',3,0,0,1,1450971949), (41,'index','','Admin','Admin','index','','','index',0,'0',1,0,0,1,1450972031); /*!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` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id', `name` char(255) NOT NULL COMMENT '上传文件的原名', `type` char(64) NOT NULL COMMENT '上传文件的MIME类型', `size` char(64) NOT NULL COMMENT '大小,单位字节', `ext` char(64) NOT NULL COMMENT '后缀名', `savename` char(64) NOT NULL COMMENT '保存后的名字', `savepath` char(64) NOT NULL COMMENT '保存的路径', `add_time` int(11) 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(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pid` smallint(6) NOT NULL, `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:正常 2:删除', `remark` varchar(255) 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 (1,'添加',0,1,''); /*!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` int(11) NOT NULL, `admin_id` int(11) 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` int(10) unsigned NOT NULL, `menu_id` int(10) unsigned NOT NULL, `level` tinyint(1) NOT NULL, `module` varchar(125) 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 (1,39,0,''), (1,40,0,''); /*!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 <[email protected]> // +---------------------------------------------------------------------- // 应用入口文件 // 检测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 <[email protected]> // +---------------------------------------------------------------------- /** * 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'), 'CONTROLLER_LEVEL' => 1, 'APP_AUTOLOAD_LAYER' => 'Controller,Model', // 自动加载的应用类库层 关闭APP_USE_NAMESPACE后有效 'APP_AUTOLOAD_PATH' => '', // 自动加载的路径 关闭APP_USE_NAMESPACE后有效 /* Cookie设置 */ 'COOKIE_EXPIRE' => 0, // 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_PORT' => '3306', // 端口 'DB_PREFIX' => 'think_', // 数据库表前缀 'DB_FIELDTYPE_CHECK' => false, // 是否进行字段类型检查 'DB_FIELDS_CACHE' => true, // 启用字段缓存 'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8 'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效 'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量 'DB_SLAVE_NO' => '', // 指定从服务器序号 'DB_SQL_BUILD_CACHE' => false, // 数据库查询的SQL创建缓存 'DB_SQL_BUILD_QUEUE' => 'file', // SQL缓存队列的缓存方式 支持 file xcache和apc 'DB_SQL_BUILD_LENGTH' => 20, // SQL缓存的队列长度 'DB_SQL_LOG' => false, // SQL执行日志记录 'DB_BIND_PARAM' => false, // 数据库写入数据自动参数绑定 /* 数据缓存设置 */ 'DATA_CACHE_TIME' => 0, // 数据缓存有效期 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, // 使用子目录缓存 (自动根据缓存标识的哈希创建子目录) 'DATA_PATH_LEVEL' => 1, // 子目录缓存级别 /* 错误设置 */ 'ERROR_MESSAGE' => '页面错误!请稍后再试~',//错误显示信息,非调试模式有效 'ERROR_PAGE' => '', // 错误定向页面 'SHOW_ERROR_MSG' => false, // 显示错误信息 'TRACE_MAX_RECORD' => 100, // 每个级别的错误信息 最大记录数 /* 日志设置 */ 'LOG_RECORD' => false, // 默认不记录日志 'LOG_TYPE' => 'File', // 日志记录类型 默认为文件方式 'LOG_LEVEL' => 'EMERG,ALERT,CRIT,ERR',// 允许记录的日志级别 'LOG_FILE_SIZE' => 2097152, // 日志文件大小限制 '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' => '', // 模板缓存前缀标识,可以动态改变 'TMPL_CACHE_TIME' => 0, // 模板缓存有效期 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_MODEL' => 1, // 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_PARAMS_BIND_TYPE' => 0, // 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 { protected $page_num = 10; public function index(){ $status = I('status', 0); $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('id', 0); $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('Role')->where(array('status' => 1))->select(); if ($role_list) { foreach ($role_list as &$val) { if (in_array($val['id'], $role_user)) { $val['is_selected'] = 1; } else { $val['is_selected'] = 0; } } } $this->assign('role_list', $role_list); $this->assign('info', $info); $this->display(); } public function save(){ $id = I('id', 0); $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('id', 0); if (empty($id)) { $this->out('error', '请选择要删除的记录!'); } $model = D('Admin'); $arr = explode(',', $id); $data['id'] = array('in', $arr); $data['status'] = 2; $result = $model->save($data); if ($result) { $this->out('ok', '删除成功'); } else { $this->out('error', '删除失败'); } } // 用户还原 public function reduction(){ $id = I('id', 0); if (empty($id)) { $this->out('error', '请选择要还原的记录!'); } $model = D('Admin'); $arr = explode(',', $id); $data['id'] = array('in', $arr); $data['status'] = 1; $result = $model->save($data); if ($result) { $this->out('ok', '还原成功'); } else { $this->out('error', '还原失败'); } } // 用户彻底删除 public function delete_really(){ $id = I('id', 0); 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="2"> <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