Giter Club home page Giter Club logo

myadmin's Introduction

欢迎使用

一、安装

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

myadmin's People

Contributors

ichynul avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.