/myadmin

基于tp5.1/6.0/6.1快速后台开发框架,PHP代码即可完成界面。支持CRUD快速生成。UI使用[bootstrap]和[Light-Year-Admin-Template]

Primary LanguagePHPOtherNOASSERTION

欢迎使用

一、安装

tp框架有两个版本

  • 5.1 基于thinkphp 5.1 (推荐(文档基于此版本))

  • 6.0 基于thinkphp 6.0

基于webman的实现:https://github.com/hi-tpext/mywebman

###2024-07-06更新:

tp6基于vue3的版本可试用,见:https://github.com/hi-tpext/tpext-myadmin/tree/5.0

框架需要使用 composer和git

安装 composer

https://pkg.phpcomposer.com/#how-to-install-composer/

安装 git

https://git-scm.com/

使用 composer 全新安装

安装 thinkphp(5.16.0,根据您的需要,选择其中一个版本),

[5.1]分支对应 tpextmyadmin的[1.0]分支,依次执行以下命令,myadmin 为新项目目录,可自行调整

composer create-project topthink/think=5.1.* myadmin

cd myadmin

composer require ichynul/tpextmyadmin:^1.*

[6.0]分支对应 tpextmyadmin的[3.0]分支,依次执行以下命令,myadmin6 为新项目目录,可自行调整

composer create-project topthink/think=6.0.* myadmin6

cd myadmin6

composer require ichynul/tpextmyadmin:^3.*

安装完毕,此安装版是最小模式,只包含基本的后台功能,建议开发新项目时使用此方式。


使用 git 安装演示站

拉取 5.1 分支代码,依次执行以下命令,myadmin 为新项目目录,可自行调整

git clone -b 5.1 https://github.com/hi-tpext/myadmin.git myadmin

cd myadmin

composer update

或 拉取 6.0 分支代码,依次执行以下命令,myadmin6 为新项目目录,可自行调整

git clone -b 6.0 https://github.com/hi-tpext/myadmin.git myadmin6

cd myadmin6

composer update

相关演示代码在application/admin/app/admin/中,数据库脚本由[myadmindata]扩展提供,请下载安装。 安装完毕,此安装版是最和演示站同步的,如果你想自己搭建演示站可用此方式。 注意:此方式的仓库是不带composer依赖vendor目录和thinkphp目录的,请务必运行composer update安装所有依赖后再访问网站。

一些问题

  • 细节很重要,安装过程中若有问题,请多检查。
  • 比如创建项目后没进入新项目目录就运行命令,再比如跑到public里面运行命令的,网站运行目录没指向到public的。
  • composer报错的版本冲突,php版本不符问题,php依赖缺失(如curl、zip),php方法被禁用等。
  • 因为涉及到的东西不可能所有的都列出来详细的讲。

二、配置

  • apache/nginx 重写规则,略(自行百度) *重要

  • 没配置重写规则的话后续的url中加上index.php

  • 如:http://localhost:8081/index.php/admin

三、扩展安装

  1. 浏览器输入 [http://localhost:8081/admin] 打开,如果没有事先配置数据库,将会跳转到配置数据库的页面。

  2. 自动安装基础扩展

  3. 手动安装 [tpext.myadmin],确保此扩展优先,以支持其他扩展的后台菜单创建

  4. 手动安装其余装扩展

四、进入后台

  • 浏览器再次输入[http://localhost:8081/admin]打开,会跳转后台主页,安装成功后默认创建管理员账号并处于已登录状态。

  • 默认账号:admintpextadmin

  • 成功登录后台即说明安装完成


五、文档

https://gxzrnxb27j.k.topthink.com/@tpext-docs/about.html

六、演示

网址

  1. [tp6.1] http://gaosu.shenzhuo.vip:50469/admin

  2. [webman] http://gaosu.shenzhuo.vip:50468/admin

账号

admintpextadmin

注意事项

  • 请不要乱修改数据
  • 请不要上传非法内容或图片
  • 请不要上传您的重要数据到上面以防泄漏
  • 有问题请联系:ichynul#163.com (#换@),或通过群联系。
  • 演示网站偶尔不稳定,会定期重启

七、功能特性

1.模块化开发,核心功能都是通过 composer 安装的

主要扩展依赖

2.tpextbuilderUI模块基于bootstrapLight-Year-Admin-Template的后台模板, 封装了大部分常用组件 :

ColumnRowTabTableFormToolbarLayerContent

3.HasBuilder 封装了常用操作,可供控制器引入使用

实例

<?php

namespace app\admin\controller;

use app\common\logic\MemberLogic;
use app\common\model;
use think\Controller;
use tpext\builder\traits\HasBuilder;

/**
 * Undocumented class
 * @title 会员管理
 */
class Member extends Controller
{
    use HasBuilder;

    /**
     * Undocumented variable
     *
     * @var model\Member
     */
    protected $dataModel;

    protected function initialize()
    {
        $this->dataModel = new model\Member;
        $this->pageTitle = '会员管理';
        $this->enableField = 'status';
        $this->pagesize = 8;

        /* 作为下拉选择数据源 相关设置 */
        //显示
        $this->selectTextField = '{id}#{nickname}({mobile})';
        //like查询字段,$this->dataModel->where('username|nickname|mobile', 'like', $kwd);
        $this->selectSearch = 'username|nickname|mobile';
    }

    protected function filterWhere()
    {
        $searchData = request()->get();
        $where = [];
        if (!empty($searchData['id'])) {
            $where[] = ['id', 'eq', $searchData['id']];
        }
        if (!empty($searchData['username'])) {
            $where[] = ['username', 'like', '%' . $searchData['username'] . '%'];
        }
        if (!empty($searchData['nickname'])) {
            $where[] = ['nickname', 'like', '%' . $searchData['nickname'] . '%'];
        }
        if (!empty($searchData['mobile'])) {
            $where[] = ['mobile', 'like', '%' . $searchData['mobile'] . '%'];
        }
        if (isset($searchData['status']) && $searchData['status'] != '') {
            $where[] = ['status', 'eq', $searchData['status']];
        }
        if (isset($searchData['level']) && $searchData['level'] != '') {
            $where[] = ['level', 'eq', $searchData['level']];
        }
        if (!empty($searchData['province'])) {
            $where[] = ['province', 'eq', $searchData['province']];
            if (!empty($searchData['city'])) {
                $where[] = ['city', 'eq', $searchData['city']];
                if (!empty($searchData['area'])) {
                    $where[] = ['area', 'eq', $searchData['area']];
                }
            }
        }
        return $where;
    }

    /**
     * 构建搜索
     *
     * @return void
     */
    protected function builSearch()
    {
        $search = $this->search;

        $search->text('id', '会员id')->maxlength(20);
        $search->text('username', '账号')->maxlength(20);
        $search->text('nickname', '昵称')->maxlength(20);
        $search->text('mobile', '手机号')->maxlength(20);
        $search->select('level', '等级')->optionsData(model\MemberLevel::order('level')->select(), 'name', 'level')->afterOptions([0 => '普通会员']);
        $search->select('status', '状态')->options([0 => '禁用', 1 => '正常']);
        $search->select('province', '省份')->dataUrl(url('api/areacity/province'), 'ext_name')->withNext(
            $search->select('city', '城市')->dataUrl(url('api/areacity/city'), 'ext_name')->withNext(
                $search->select('area', '地区')->dataUrl(url('api/areacity/area'), 'ext_name')
            )
        );
    }

    /**
     * 构建表格
     *
     * @return void
     */
    protected function buildTable(&$data = [])
    {
        $table = $this->table;

        $table->show('id', 'ID');
        $table->image('avatar', '头像')->thumbSize(50, 50)->default('/static/images/touxiang.png');
        $table->show('username', '账号');
        $table->text('nickname', '昵称')->autoPost()->getWrapper()->addStyle('width:130px');
        $table->show('mobile', '手机号')->getWrapper()->addStyle('width:100px');
        $table->match('gender', '性别')->options([1 => '', 2 => '', 0 => '未知'])->getWrapper()->addStyle('width:50px');
        $table->show('age', '性别');
        $table->show('level_name', '等级');
        $table->show('money', model\MemberAccount::$types['money']);
        $table->show('points', model\MemberAccount::$types['points']);
        $table->show('pca', '省市区');
        $table->switchBtn('status', '状态')->default(1)->autoPost()->getWrapper()->addStyle('width:60px');
        $table->show('last_login_time', '最近登录')->getWrapper()->addStyle('width:150px');
        $table->show('create_time', '注册时间')->getWrapper()->addStyle('width:150px');

        $table->sortable('id,sort,money,points,commission,re_comm,shares,last_login_time');

        $table->getToolbar()
            ->btnAdd()
            ->btnEnableAndDisable('启用', '禁用')
            ->btnRefresh();

        $table->getActionbar()
            ->btnEdit()
            ->btnView()
            ->btnLink('account', url('/admin/memberaccount/add', ['member_id' => '__data.pk__']), '', 'btn-success', 'mdi-square-inc-cash');
    }

    /**
     * 构建表单
     *
     * @param boolean $isEdit
     * @param array $data
     */
    protected function builForm($isEdit, &$data = [])
    {
        $form = $this->form;

        $form->tab('基本信息');
        $form->image('avatar', '头像')->thumbSize(50, 50);
        $form->text('username', '账号')->required()->maxlength(20);
        $form->text('nickname', '昵称')->required()->maxlength(20);
        $form->text('mobile', '手机号')->maxlength(11);
        $form->text('email', '邮件')->maxlength(60);
        $form->number('age', '年龄')->max(100)->min(1)->default(18);
        $form->radio('gender', '性别')->options([0 => '未知', 1 => '', 2 => ''])->default(0);

        $form->tab('其他信息');
        $form->textarea('remark', '备注')->maxlength(255);
        $form->switchBtn('status', '状态')->default(1);

        if ($isEdit) {
            $form->show('last_login_time', '最近登录时间');
            $form->show('create_time', '注册时间');
            $form->show('update_time', '修改时间');
        }
    }

    /**
     * 保存数据
     *
     * @param integer $id
     * @return void
     */
    private function save($id = 0)
    {
        $data = request()->only([
            'avatar',
            'username',
            'nickname',
            'mobile',
            'email',
            'gender',
            'age',
            'status',
            'remark',
        ], 'post');

        $result = $this->validate($data, [
            'username|账号' => 'require',
            'nickname|昵称' => 'require',
            'mobile|手机号' => 'mobile',
            'age|年龄' => 'number',
        ]);

        if (true !== $result) {
            $this->error($result);
        }

        return $this->doSave($data, $id);
    }
}

八、QQ群

九、效果展示

alt 1 alt 2 alt 3 alt 4 alt 5 alt 6 alt 7 alt 8

十、鸣谢

Tpext 系列扩展和使用了以下框架技术或受到其启发:

  • Thinkphp
  • Botstrap
  • Lightyear-admin
  • Laravel-admin
  • Jquery
  • Layer
  • Bootstrap-number-input
  • Bootstrap-duallistbox
  • Bootstrap-datepicker
  • Bootstrap-daterangepicker
  • Bootstrap-colorpicker
  • Bootstrap-maxlength
  • Bootstrap-touchspin
  • Webuploader
  • FontIconPicker
  • Select2
  • Dropzone
  • ZTree
  • Jstree
  • CKEditor
  • Editormd
  • Tinymce
  • UEditor
  • WangEditor
  • AreaCity-JsSpider-StatsGov

十一、License

Apache2