ThinkAdmin v5.0 发布,基于ThinkPHP5.1后台开发框架

浏览:541 发布日期:2019/08/07 分类:功能实现 关键字: ThinkAdmin ThinkPHP5.1
ThinkAdmin v5 是一个基于 ThinkPHP 5.1 和 ThinkLibrary 开发的后台管理系统。
大道至简 · 原生框架
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)

代码仓库
ThinkAdmin 为 MIT 协议开源项目,安装使用或二次开发不受约束,欢迎 fork 项目。
部分代码及功能组件来自互联网,若有异议可以联系作者进行删除。

在线体验地址:https://demo.thinkadmin.top (账号和密码都是 admin )
Gitee仓库地址:https://gitee.com/zoujingli/ThinkAdmin
Github仓库地址:https://github.com/zoujingli/ThinkAdmin

框架指令
执行 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 版本开始,系统节点使用代码注释实现;
需要加入权限控制的访问方法,需要写上标准的块注释。如:/**
* 操作的名称
* @auth true  # 表示需要验证权限
* @menu true  # 在菜单编辑的节点可选项
*/
public function index(){
   // @todo
}
此版本的权限使用注解实现
注释必需使用标准的块注释,如上案例
其中@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('表名');

// 切入url参数,接收 username 和 sex 并使用 like 查询,接收 status 使用 eq 查询
$query->like('username,sex')->equal('status');

// 查询器分页输出
$query->page();
有时候,url输入的名称与数据字段不一定是匹配的,所以需要用到别名,这里就需要按规则写条件,如:// 切入url参数,接收 username_alias 和 sex 并使用 like 查询,接收 user_status 使用 eq 查询

// 这里用到了别名,username_alias 对应数据库中的 username 字段,user_status 对应数据库的 status 字段

$query = $this->_query('表名')->like('username#username_alias,sex')->equal('status#user_status');

// 查询器分页输出
$query->page();
输出额外数据到模板,与 ThinkPHP 操作无异,如:// 额外列表数据赋值到模板,模板里直接使用变量 $userList
$this->userList = Db::name('User')->where(['status'=>'1'])->select();

// 切入url参数,接收 username 和 sex 并使用 like 查询,接收 status 使用 eq 查询
$query = $this->_query('表名')->like('username,sex')->equal('status');

// 查询器分页输出
$query->page();
数据回调处理
对于通过page方法实现的即将显示到模板的列表,还可以进行引用二次处理,如:protected function _page_filter(&$data){
    // 这里可以对 $data 进行二次处理,注意是引用
}

### 当一个控制器存在多个page操作时,可以指定回调前缀
protected function _index_page_filter(&$data){
  //  精准回调对 $data 进行二次处理,注意是引用
}
下面提供一个完整的DEMO/**
 * 系统操作日志
 * @auth true
 * @menu true
 * @throws \think\Exception
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\ModelNotFoundException
 * @throws \think\exception\DbException
 */
public function index()
{
    $this->title = '系统操作日志';
    $query = $this->_query($this->table)->like('action,node,content,username,geoip');
    $query->dateBetween('create_at')->order('id desc')->page();
}

/**
 * 列表数据处理
 * @param array $data
 * @throws \Exception
 */
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默认的行为将不会执行。

数据回调处理DEMO/**
 * 添加拼团
 * @auth true
 */
public function add()
{
    $this->title = '添加拼团';
    $this->_form($this->table, 'form');
}

/**
 * 编辑拼团
 * @auth true
 */
public function edit()
{
    $this->title = '编辑拼团';
    $this->_form($this->table, 'form');
}

/**
 * 添加拼团商品表单处理
 * @param array $data
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\ModelNotFoundException
 * @throws \think\exception\DbException
 */
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()}");
        }
    }
}

/**
 * 表单结果处理
 * @param boolean $result
 */
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:/**
 * 删除系统权限
 * @auth true
 */
public function remove()
{
    $this->applyCsrfToken();
    $this->_delete($this->table);
}

/**
 * 删除结果处理
 * @param boolean $result
 * @throws \think\Exception
 * @throws \think\exception\PDOException
 */
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,数据禁用与启用操作:/**
 * 启用系统菜单
 * @auth true
 * @throws \think\Exception
 * @throws \think\exception\PDOException
 */
public function resume()
{
    $this->applyCsrfToken();
    $this->_save($this->table, ['status' => '1']);
}

/**
 * 禁用系统菜单
 * @auth true
 * @throws \think\Exception
 * @throws \think\exception\PDOException
 */
public function forbid()
{
    $this->applyCsrfToken();
    $this->_save($this->table, ['status' => '0']);
}
如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可台使用 data-action 来与 $this->_save 配合使用。
前端提交上来的主键值支持多个,以英文逗号分隔。


九、项目历史版本
体验账号及密码都是admin

ThinkAdmin v1 基于 ThinkPHP 5.0 开发
在线体验地址:https://v1.thinkadmin.top
Gitee 代码地址:https://gitee.com/zoujingli/ThinkAdmin/tree/v1
Github 代码地址:https://github.com/zoujingli/ThinkAdmin/tree/v1

ThinkAdmin v2 基于 ThinkPHP 5.0 开发
在线体验地址:https://v2.thinkadmin.top
Gitee 代码地址:https://gitee.com/zoujingli/ThinkAdmin/tree/v2
Github 代码地址:https://github.com/zoujingli/ThinkAdmin/tree/v2

ThinkAdmin v3 基于 ThinkPHP 5.1 开发
在线体验地址:https://v3.thinkadmin.top
Gitee 代码地址:https://gitee.com/zoujingli/ThinkAdmin/tree/v3
Github 代码地址:https://github.com/zoujingli/ThinkAdmin/tree/v3

ThinkAdmin v4 基于 ThinkPHP 5.1 开发
在线体验地址:https://v4.thinkadmin.top
Gitee 代码地址:https://gitee.com/zoujingli/ThinkAdmin/tree/v4
Github 代码地址:https://github.com/zoujingli/ThinkAdmin/tree/v4

ThinkAdmin v5 基于 ThinkPHP 5.1 开发(后台权限基于注解实现)
在线体验地址:https://v5.thinkadmin.top
Gitee 代码地址:https://gitee.com/zoujingli/ThinkAdmin/tree/v5
Github 代码地址:https://github.com/zoujingli/ThinkAdmin/tree/v5
评论( 相关
后面还有条评论,点击查看>>