大道至简 · 原生框架ThinkAdmin v5 是一个基于 ThinkPHP 5.1 和 ThinkLibrary 开发的后台管理系统。 我们致力于二次开发底层框架,提供完整的组件及API,基于此框架可以快速开发应用,另外项目安装及二次开发可以参考 ThinkPHP 官方文档,数据库文件摆放在项目根目录下。 ThinkAdmin 非常适用快速二次开发,默认集成 微信开发组件,支持微信服务号,微信支付,支付宝支付,阿里云OSS存储,七牛云存储,本地服务器存储。 注意事项 : - 项目测试需要自行搭建环境导入数据库( admin_v5.sql )并修改配置( config/database.php );
- 若操作提示“测试系统禁止操作”等字样,需要删除演示路由配置( route/demo.php )或清空路由文件;
- 当前版本使用 ThinkPHP 5.1.x,对 PHP 版本标注不低于 PHP 5.6,具体请阅读 ThinkPHP 官方文档;
- 环境需开启 PATHINFO,不再支持 ThinkPHP 的 URL 兼容模式运行(源于如何优雅的展示);
登录页面 
后台首页 ![]()
技术支持开发文档:http://doc.thinkadmin.top/thinkadmin-v5 开发前请认真阅读 ThinkPHP 官方文档会对您有帮助哦! 本地开发命令php think run ,使用http://127.0.0.1:8000 访问项目。 PHP 开发技术交流( QQ 群 513350915)
![PHP微信开发群 (SDK)]() 代码仓库ThinkAdmin 为 MIT 协议开源项目,安装使用或二次开发不受约束,欢迎 fork 项目。 部分代码及功能组件来自互联网,若有异议可以联系作者进行删除。 框架指令- 执行
build.cmd 可更新 Composer 插件,会删除并替换 vendor 目录 - 执行
php think run 启用本地开发环境,访问 http://127.0.0.1:8000
1. 线上代码更新- 执行
php think xsync:admin 从线上服务更新 admin 模块的所有文件(注意文件安全) - 执行
php think xsync:wechat 从线上服务更新 wechat 模块的所有文件(注意文件安全) - 执行
php think xsync:plugs 从线上服务更新 plugs 静态插件的部分文件(注意文件安全) - 执行
php think xsync:service 从线上服务更新 service 模块的所有文件(注意文件安全) - 执行
php think xsync:config 从线上服务更新 config 项目配置的部分文件(注意文件安全)
2. 微信资料管理- 执行
php think xfans:all 更新已经对接的公众号全部列表 - 执行
php think xfans:list 更新已经对接的公众号粉丝列表 - 执行
php think xfans:tags 更新已经对接的公众号标签列表 - 执行
php think xfans:black 更新已经对接的公众号黑名单列表
3. 守护进程管理- 执行
php think xtask:reset 重启消息任务守护进程 - 执行
php think xtask:start 启动消息任务守护进程 - 执行
php think xtask:state 查询消息任务守护进程 - 执行
php think xtask:stop 暂停消息任务守护进程
4. 其它自定工具- 执行
php think xclean:session 清理无效的会话SESSION文件 - 执行
php think xclean:store 清理无效的订单信息及定时任务
ThinkAdmin 后台权限管理ThinkAdmin 的权限管理基于标准RBAC 简化而来,去除了繁杂的节点管理,使得权限管理起来更简单,具体包含节点管理、权限管理、菜单管理、用户管理。 一、节点管理(系统自动维护)自 ThinkAdmin v5 版本开始,系统节点使用代码注释实现; 需要加入权限控制的访问方法,需要写上标准的块注释。如: public function index(){ }
- 此版本的权限使用注解实现
- 注释必需使用标准的块注释,如下案例
- 其中
@auth true 表示访问需要权限验证 - 其中
@menu true 显示在菜单编辑的节点可选项
二、权限管理(相当于角色管理)创建好权限后,需要给权限配置好需要控制的节点的列表。 如:权限A只能访问哪些节点,就需要勾选对应功能的节点。 三、菜单管理(最多支持三级)菜单创建与编辑里,要特别注意菜单对应的节点规范。 如:admin/menu/index 如果在节点注释中含menu true 则该节点会出现在自动提示中。 四、用户管理(设置密码及权限)添加用户后,需要给用户配置对应权限。 注意admin 为超级用户,不需要配置权限,因为他拥有后台所有权限。 五、数据列表输出ThinkLibrary 与 ThinkPHP 组合起来就是现在的 ThinkAdmin v5,都是基于 Composer 来管理; 如果需要使用到 ThinkLibrary 里面的功能,控制器需要继承 \library\Controller 类。 数据列表操作在控制器访问中只需加入$this->page(表名) 可以显示默认数据表的分页列表; 如果需要对列表进行条件处理,可以使用查询器来实现。如: $query = $this->_query('表名')->where(['status'=>'1']);$query->page();
注意:在 ThinkPHP 5.1 之后,控制器不需要直接返回内容了,函数_page 里面使用HttpResponseException 直接输出机制。 另外对于url 输入的变量也可以快速输入到查询器条件中,如: $query = $this->_query('表名');$query->like('username,sex')->equal('status');$query->page();
有时候,url 输入的名称与数据字段不一定是匹配的,所以需要用到别名,这里就需要按规则写条件,如: $query = $this->_query('表名')->like('username#username_alias,sex')->equal('status#user_status');$query->page();
输出额外数据到模板,与 ThinkPHP 操作无异,如: $this->userList = Db::name('User')->where(['status'=>'1'])->select();$query = $this->_query('表名')->like('username,sex')->equal('status');$query->page();
数据回调处理对于通过page 方法实现的即将显示到模板的列表,还可以进行引用二次处理,如: protected function _page_filter(&$data){ }protected function _index_page_filter(&$data){ }
下面提供一个完整的DEMO public function index(){ $this->title = '系统操作日志'; $query = $this->_query($this->table)->like('action,node,content,username,geoip'); $query->dateBetween('create_at')->order('id desc')->page();}protected function _index_page_filter(&$data){ $ip = new \Ip2Region(); foreach ($data as &$vo) { $result = $ip->btreeSearch($vo['geoip']); $vo['isp'] = isset($result['region']) ? $result['region'] : ''; $vo['isp'] = str_replace(['内网IP', '0', '|'], '', $vo['isp']); }}
六、表单自动操作ThinkLibrary 表单处理可能简化数据保存与更新操作, 控制器只需要一行代码,就可以实现数据添加与更新,如: $this->_form('表名','模板名称');
当然,这里使用了HttpResponseException 直接输出,不需要返回内容的。 需要给模板额外赋值,可以直接在控制器$this->username='你的值'; 这样在模板中可以直接使用$username 变量; 如果提交的表单数据包含指定主键时则为更新操作,否则为添加记录; 另外对表单还有callback 操作(参数使用引用),统一名称为protected function _form_filter(&$data) 另外关于模板的使用,可以参考下demo哦。
数据回调处理对于表单操作,Controller 内置了两个回调方法,如: [_ACTION]_form_filter($vo)[_ACTION]_form_result($result, $vo)
当回调函数返回false 时,Controller 默认的行为将不会执行。
数据回调处理DEMOpublic function add(){ $this->title = '添加拼团'; $this->_form($this->table, 'form');}public function edit(){ $this->title = '编辑拼团'; $this->_form($this->table, 'form');}protected function _form_filter(&$data){ if (empty($data['code'])) $data['code'] = Data::uniqidNumberCode(10); if ($this->request->isGet()) { $map = ['package_code' => $data['code']]; $data['list'] = Db::name('StoreGoodsGroupList')->where($map)->select(); } else { if (empty($data['logo'])) $this->error('请上传商品图标图片'); if (empty($data['image'])) $this->error('请上传商品展示图片'); if (empty($data['item_number'])) $this->error('请添加套卡包含内容'); $all = []; foreach (array_keys($data['item_number']) as $key) $all[] = [ 'package_code' => $data['code'], 'goods_code' => $data['item_code'][$key], 'goods_type' => $data['item_type'][$key], 'goods_title' => $data['item_title'][$key], 'goods_number' => $data['item_number'][$key], ]; try { Db::transaction(function () use ($data, $all) { $map = ['package_code' => $data['code']]; Db::name('StoreGoodsGroupList')->where($map)->delete(); Db::name('StoreGoodsGroupList')->insertAll($all); }); } catch (Exception $e) { $this->error("商品详情处理失败,{$e->getMessage()}"); } }}protected function _form_result($result){ if ($result && $this->request->isPost()) { $this->success('商品编辑成功!', 'javascript:history.back()'); }}
如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可使用 form[data-auto] 来与 $this->_form 配合使用。 七、数据删除自动处理数据删除同样也只需要一行代码$this->_delete('表名'); 前端只需要传入数据表的主键就可以了,不需要做额外处理。 1. 硬删除如果数据表中不存在is_deleted 字段,则为硬删除。 2. 软删除当前数据表中存在is_deleted 字段时,$this->_delete 则自动为软删除操作, 在列表操作时加上条件过滤下就可以正常操作。 数据回调处理对于数据删除的结果,可以进行自定义处理,回调函数规则如:[_ACTION]_delete_result 下面提供一个完整的demo: public function remove(){ $this->applyCsrfToken(); $this->_delete($this->table);}protected function _remove_delete_result($result){ if ($result) { $where = ['auth' => $this->request->post('id')]; Db::name('SystemAuthNode')->where($where)->delete(); $this->success("权限删除成功!", ''); } else { $this->error("权限删除失败,请稍候再试!"); }}
如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可台使用 data-action 来与 $this->_delete 配合使用。 前端提交上来的主键值支持多个,以英文逗号分隔。 八、数据更新操作数据更新主要用于 数据状态更新,比如:数据禁用,数据启用,状态更改 在服务端只需要一行代码$this->_save($this->table) 就可以实现更新操作。 前端需要提供需要修改的数据ID以及数据状态值,当然也可以后第二个参数指定(强烈建议配置第二个字段) 这个地方可能存在数据恶意修改的情况,所有指定第二个参数非常有必要。 下面提供一个完整的demo,数据禁用与启用操作: public function resume(){ $this->applyCsrfToken(); $this->_save($this->table, ['status' => '1']);}public function forbid(){ $this->applyCsrfToken(); $this->_save($this->table, ['status' => '0']);}
如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可台使用 data-action 来与 $this->_save 配合使用。 前端提交上来的主键值支持多个,以英文逗号分隔。 九、项目历史版本体验账号及密码都是admin ThinkAdmin v1 基于 ThinkPHP 5.0 开发ThinkAdmin v2 基于 ThinkPHP 5.0 开发ThinkAdmin v3 基于 ThinkPHP 5.1 开发ThinkAdmin v4 基于 ThinkPHP 5.1 开发ThinkAdmin v5 基于 ThinkPHP 5.1 开发(后台权限基于注解实现) |