Fastadmin---开发笔记

最近看到Fastadmin这个不错的开发框架,快速学习下:

官方框架文档:

https://doc.fastadmin.net/doc/index.html

一、快速开始

1、项目目录

├── application
│   └── admin
│       ├── controller
│       │   └── Test.php                //控制器类
│       ├── lang
│       │   └─ zh-cn
│       │       └── test.php            //功能语言包,按需加载
│       ├── model
│       │   └── Test.php                //模型类
│       ├── validate
│       │   └── Test.php                //验证器类
│       └── view
│           └── test
│               ├── index.html          //列表视图
│               ├── add.html            //添加视图
│               ├── edit.html           //编辑视图
│               └── recyclebin.html     //回收站视图
└── public
    └── assets
        └── js
            └── backend
                └── test.js             //功能模块JS文件

2、Debug模式

/application/config.php

3、基础架构

FastAdmin项目目录
├── addons                  //插件存放目录
├── application             //应用目录
│   ├── admin               //后台管理应用模块
│   ├── api                 //API应用模块
│   ├── common              //通用应用模块
│   ├── extra               //扩展配置目录
│   ├── index               //前台应用模块
│   ├── build.php
│   ├── command.php         //命令行配置
│   ├── common.php          //通用辅助函数
│   ├── config.php          //基础配置
│   ├── database.php        //数据库配置
│   ├── route.php           //路由配置
│   ├── tags.php            //行为配置
├── extend
│   └── fast                //FastAdmin扩展辅助类目录
├── public                  //框架入口目录
│   ├── assets
│   │   ├── addons         //插件前端资源目录
│   │   ├── build           //打包JS、CSS的资源目录
│   │   ├── css             //CSS样式目录
│   │   ├── fonts           //字体目录
│   │   ├── img             //图片资源目录
│   │   ├── js
│   │   │   ├── backend     //后台功能模块JS文件存放目录
│   │   │   └── frontend    //前台功能模块JS文件存放目录
│   │   ├── libs            //Bower资源包位置(只读,通过 bower 更新)
│   │   └── less            //Less资源目录
│   └── uploads             //上传文件目录
│   ├── index.php           //应用入口主文件
│   ├── install.php         //FastAdmin安装引导(安装完成后会自动删除)
│   ├── admin.php           //后台入口文件(自动安装后会被修改为随机文件名)
│   ├── robots.txt
│   └── router.php
├── runtime                 //缓存目录
├── thinkphp                //ThinkPHP框架核心目录(只读,通过 composer 更新)
├── vendor                  //Compposer资源包位置(只读,通过 composer 更新)
├── .bowerrc                //Bower目录配置文件
├── .env.sample             //环境配置模板(可复制一份为 .env 生效)
├── LICENSE
├── README.md               //项目介绍
├── bower.json              //Bower前端包配置
├── build.php
├── composer.json           //Composer包配置
└── think                   //命令行控制台入口(使用 php think 命令进入)

4、配置env配置

[app]
;是否开启Debug调试
debug = false
;是否开启Trace调试
trace = false

[database]
hostname = 数据库连接地址
database = 数据库名
username = 数据库连接用户名
password = 数据库连接密码
hostport = 数据库连接端口
charset = 数据库连接编码
prefix = 数据库表前缀
;是否开启数据库调试
debug = false

二、模块

1、后台模块

Fastadmin的后台禁用了路由功能,后台的操作都是根据URL进行分段解析,示例:

/admins.php  // 请求的是application/admin/controller/Index.php中的默认方法index
/admins.php/dashboard/index // 调用的是admin/controller/Dashboard/index方法  调用的视图是:admin/view/dashboard/index.html

后台控制器基类继承 application/common/controller/Backend.php 基类控制器。

2、前台模块

前台自带一个简单的会员模块,可以进行会员的注册、登录、找回密码、会员中心、修改个人资料、修改密码等操作。

前台控制器基类继承 application/common/controller/Frontend.php 基类控制器。

//登录成功后的事件
Hook::add('user_login_successed', function ($user) {});
//注册成功后的事件
Hook::add('user_register_successed', function ($user) {});
//会员删除后的事件
Hook::add('user_delete_successed', function ($user) {});
//会员注销后的事件
Hook::add('user_logout_successed', function ($user) {});

3、API模块

FastAdmin的API模块采用:默认路由方式进行匹配,可自定义路由规则。

API模块继承 application/common/controller/Api.php 基类控制器。

//登录成功后的事件
Hook::add('user_login_successed', function ($user) {});
//注册成功后的事件
Hook::add('user_register_successed', function ($user) {});
//会员删除后的事件
Hook::add('user_delete_successed', function ($user) {});
//会员注销后的事件
Hook::add('user_logout_successed', function ($user) {});

4、公共模块

Token验证:

\app\common\library\Token::get('c2259a37-5fee-4c4b-93b0-1d7313e1d1ac'); // 获取Token的详情、关联的会员ID、过期时间、有效期等信息。
\app\common\library\Token::set('c2259a37-5fee-4c4b-93b0-1d7313e1d1ac', 1, 3600); // 新增会员Token并更新,且有效期为3600秒
\app\common\library\Token::check('c2259a37-5fee-4c4b-93b0-1d7313e1d1ac', 1); // 判断会员Token是否可用
\app\common\library\Token::delete('c2259a37-5fee-4c4b-93b0-1d7313e1d1ac'); // 删除指定的Token。
\app\common\library\Token::clear(1); // 删除会员ID为1的所有Token。

短信发送:

\app\common\library\Sms::send('13888888888', '1234', 'register'); // 发送一个注册验证码
\app\common\library\Sms::check('1388888888', '1234', 'register'); // 检测验证码是否正确
\app\common\library\Sms::notice('1388888888', '消息内容', 'SMS_10001'); // 发送营销短信或通知
\app\common\library\Sms::flush('13888888888', 'register'); // 清空指定手机号的验证码

三、命令行

1、一键生成CRUD

//生成fa_test表的CRUD
php think crud -t test
//生成fa_test表的CRUD且一键生成菜单
php think crud -t test -u 1
//删除fa_test表生成的CRUD
php think crud -t test -d 1
//生成fa_test表的CRUD且控制器生成在二级目录下
php think crud -t test -c mydir/test
//删除fa_test表生成的二级目录的CRUD
php think crud -t test -c mydir/test -d 1
//生成fa_test_log表的CRUD且生成对应的控制器为testlog
php think crud -t test_log -c testlog
//生成fa_test表的CRUD且对应的模型名为testmodel
php think crud -t test -m testmodel
//生成fa_test表的CRUD且生成关联模型category,外链为category_id,关联表主键为id
php think crud -t test -r category -k category_id -p id
//生成fa_test表的CRUD且所有以list或data结尾的字段都生成复选框
php think crud -t test --setcheckboxsuffix=list --setcheckboxsuffix=data
//生成fa_test表的CRUD且所有以image和img结尾的字段都生成图片上传组件
php think crud -t test --imagefield=image --imagefield=img
//关联多个表,参数传递时请按顺序依次传递,支持以下几个参数relation/relationmodel/relationforeignkey/relationprimarykey/relationfields/relationmode
php think crud -t test --relation=category --relation=admin --relationforeignkey=category_id --relationforeignkey=admin_id
//生成v_phealth_db2数据库下的fa_test表的CRUD
php think crud -t test --db=v_phealth_db2

参数介绍:

-t, --table=TABLE                              表名,带不带表前缀均可
-c, --controller[=CONTROLLER]                  生成的控制器名,可选,默认根据表名进行自动解析
-m, --model[=MODEL]                            生成的模型名,可选,默认根据表名进行自动解析
-i, --fields[=FIELDS]                          生成的数据列表中可见的字段,默认是全部
-f, --force[=FORCE]                            是否覆盖模式,如果目标位置已经有对应的控制器或模型会提示
-l, --local[=LOCAL]                            是否本地模型,默认1,置为0时,模型将生成在common模块下
-r, --relation[=RELATION]                      关联模型表名,带不带表前缀均可
-e, --relationmodel[=RELATIONMODEL]            生成的关联模型名,可选,默认根据表名进行自动解析
-k, --relationforeignkey[=RELATIONFOREIGNKEY]  表外键,可选,默认会识别为使用 模型_id 名称
-p, --relationprimarykey[=RELATIONPRIMARYKEY]  关联模型表主键,可选,默认会自动识别
-s, --relationfields[=RELATIONFIELDS]          关联模型表显示的字段,默认是全部
-o, --relationmode[=RELATIONMODE]              关联模型,hasone/belongsto/hasmany [default: "belongsto"](v1.3+ 增加了 hasmany)
-d, --delete[=DELETE]                          删除模式,将删除之前使用CRUD命令生成的相关文件
-u, --menu[=MENU]                              菜单模式,生成CRUD后将继续一键生成菜单
--db[=key]                                     多数据库支持(参数为tp5中配置的数据库key 在application\config.php添加数据库配置信息)
--setcheckboxsuffix[=SETCHECKBOXSUFFIX]    自动生成复选框的字段后缀
--enumradiosuffix[=ENUMRADIOSUFFIX]        自动生成单选框的字段后缀
--imagefield[=IMAGEFIELD]                  自动生成图片上传组件的字段后缀
--filefield[=FILEFIELD]                    自动生成文件上传组件的字段后缀
--intdatesuffix[=INTDATESUFFIX]            自动生成日期组件的字段后缀
--switchsuffix[=SWITCHSUFFIX]              自动生成可选组件的字段后缀
--citysuffix[=CITYSUFFIX]                  自动生成城市选择组件的字段后缀
--selectpagesuffix[=SELECTPAGESUFFIX]      自动生成Selectpage组件的字段后缀
--ignorefields[=IGNOREFIELDS]                 排除的字段
--editorclass[=EDITORCLASS]                自动生成富文本组件的字段后缀
--headingfilterfield[=HEADINGFILTERFIELD]  自动生成筛选过滤选项卡的字段,默认是status字段
--sortfield[=SORTFIELD]                    排序字段

2、一键生成菜单

//一键生成test控制器的权限菜单
php think menu -c test
//一键生成mydir/test控制器的权限菜单
php think menu -c mydir/test
//删除test控制器生成的菜单
php think menu -c test -d 1
//一键生成所有控制器的权限菜单,执行前请备份数据库。
php think menu -c all-controller

3、一键压缩打包

application/config.php中app_debug的值,当为true的时候是采用的无压缩的JS和CSS,当为false时采用的是压缩版的JS和CSS。

php think min -m all -r all // 一键压缩打包前后台的JS和CSS
php think min -m backend -r all // 一键压缩打包后台的JS和CSS
php think min -m all -r js // 一键压缩打包前后台的JS
php think min -m backend -r css // 一键压缩打包后台的CSS
php think min -m backend -r js -o uglify // 使用uglify进行一键压缩打包后台的JS文件 

影响文件:

// 调试模式:
public/assets/js/require-frontend.js
public/assets/js/require-backend.js
public/assets/css/frontend.css
public/assets/css/backend.css
// 生成模式:
public/assets/js/require-frontend.min.js
public/assets/js/require-backend.min.js
public/assets/css/frontend.min.css
public/assets/css/backend.min.css

4、一键生成API文档

//一键生成API文档
php think api --force=true
//指定https://www.example.com为API接口请求域名,默认为空
php think api -u https://www.example.com --force=true
//输出自定义文件为myapi.html,默认为api.html
php think api -o myapi.html --force=true
//修改API模板为mytemplate.html,默认为index.html
php think api -e mytemplate.html --force=true
//生成指定控制器Demo的API文档
php think api -r Demo --force=true
//修改标题为Demo,作者为Lily
php think api -t Demo -a Lily --force=true
//生成插件标识为cms的API文档
php think api -a cms -o cmsapi.html --force=true
//查看API接口命令行帮助
php think api -h

四、多语言

在FastAdmin中可以在任何位置(控制器、视图、JS)使用__('语言标识');调用语言包,如果语言标识不存在,则直接输出该语言标识。

__('My name is %s', "FastAdmin");

五、数据库

特殊字段:

user_id      会员ID       int 将生成选择会员的SelectPage组件,单选
user_ids     会员ID集合   varchar 将生成选择会员的SelectPage组件,多选
admin_id     管理员ID     int 将生成选择管理员的SelectPage组件
admin_ids    管理员ID集合 varchar 将生成选择管理员的SelectPage组件,多选
category_id  分类ID       int 将生成选择分类的下拉框,分类类型根据去掉前缀的表名,单选
category_ids 分类ID集合   varchar 将生成选择分类的下拉框,分类类型根据去掉前缀的表名,多选
weigh        权重         int 后台的排序字段,如果存在该字段将出现排序按钮,可上下拖动进行排序
createtime   创建时间     bigint/datetime 记录添加时间字段,不需要手动维护
updatetime   更新时间     bigint/datetime 记录更新时间的字段,不需要手动维护
deletetime   删除时间     bigint/datetime 记录删除时间的字段,不需要手动维护,如果存在此字段将会生成回收站功能,字段默认值务必为null
status       状态字段     enum    列表筛选字段,如果存在此字段将启用TAB选项卡展示列表

六、控制器

1、基类控制器:

application/common/controller/Api.php //API接口基类控制器
application/common/controller/Backend.php //后台基类控制器
application/common/controller/Frontend.php //前台基类控制器

基类控制器,已经完善了基础方法

* 默认生成的控制器所继承的父类中有index/add/edit/del/multi/destroy/restore/recyclebin八个方法
* 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 

2、基础结构

<?php

namespace app\admin\controller;

/**
 * 文章管理
 *
 * @icon fa fa-list
 * @remark 用于统一管理网站的所有文章
 */
class Article extends Backend
{

    protected $model = null;
    protected $noNeedLogin = [];
    protected $noNeedRight = ['selectpage'];

    public function _initialize()
    {
        parent::_initialize();
    }
    
    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi/destroy/restore/recyclebin八个方法
     * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */

}

3、关联查询

Fastadmin后台index方法支持一对一关联查询:

首先在控制器加上以下属性:

protected $relationSearch = true;

然后修改控制器:

public function index(){
    if ($this->request->isAjax()) {
        list($where, $sort, $order, $offset, $limit) = $this->buildparams();
        $total = $this->model
                ->with(["category"])
                ->where($where)
                ->order($sort, $order)
                ->count();
        $list = $this->model
                ->with(["category"])
                ->where($where)
                ->order($sort, $order)
                ->limit($offset, $limit)
                ->select();
        $result = array("total" => $total, "rows" => $list);
        return json($result);
    }
    return $this->view->fetch();
}

然后在模型中添加:

public function category(){
    return $this->belongsTo('Category', 'category_id')->setEagerlyType(0);
}

可以参考TP5的关联模型章节:

https://www.kancloud.cn/manual/thinkphp5/142357

4、数据校验

application/admin/validate/模型名.php中,模型验证默认是关闭的状态,如果需要启用,我们需要在当前控制器定义以下属性

protected $modelValidate = true; //是否开启Validate验证,默认是false关闭状态
protected $modelSceneValidate = true; //是否开启模型场景验证,默认是false关闭状态

验证规则参考:

TP5官方文档的模型验证规则:https://www.kancloud.cn/manual/thinkphp5/129355
场景验证可以参考TP5场景验证章节:https://www.kancloud.cn/manual/thinkphp5/129322

5、权限控制

基类中定义了以下两个属性:

protected $noNeedLogin = []; //无需登录的方法,同时也就不需要鉴权了
protected $noNeedRight = []; //无需鉴权的方法,但需要登录

即可在控制器中:

protected $noNeedLogin = ['mywork']; // 不需要登录即可访问
protected $noNeedRight = ['mytest']; // 需要登录后任何管理员都可以访问

6、视图渲染

基类 app\common\controller\Backend 会默认渲染以下几个对象到视图中

$this->assign('site', $site); // 渲染站点配置
$this->assign('config', $config); // 渲染配置信息
$this->assign('auth', $this->auth); // 渲染权限对象
$this->assign('admin', Session::get('admin')); // 渲染管理员对象

视图可使用:

{$site.name}、{$config.modulename}、{$auth.id}、{$admin.username
$site所支持的数据对应为:application/extra/site.php
$config所支持的数据为
'site'           => $site中的'name', 'cdnurl', 'version', 'timezone', 'languages'字段,
'upload'         => application/extra/upload.php中数据,
'modulename'     => 'admin',
'controllername' => 控制器名,
'actionname'     => 方法名,
'jsname'         => 控制器JS所加载的路径,
'moduleurl'      => 后台module的链接,
'language'       => 当前语言,
'fastadmin'      => application/config.php中fastadmin的配置

七、前端

FastAdmin的前端部分使用或涉及到的是RequireJS,jQuery,AdminLTE,Bower,Less,CSS。其中:

RequireJS主要是用于JS的模块化加载。
Bower主要用于管理第三方插件。
Less主要是用于我们编写LESS和编译成CSS代码。
public
├── assets
│   ├── addons
│   ├── css
│   ├── fonts
│   ├── img
│   ├── js
│   │   ├── backend
│   │   ├── frontend
│   ├── less
│   └── libs
assets主要存在我们框架所需要使用到的静态资源。
assets/js/backend主要存在后台控制器所对应的JS模块。
assets/libs主要存在第三方的插件。
assets/less主要存在Less文件。
assets/img主要存在图片相关文件。
assets/css主要存在CSS样式相关文件。
assets/addons主要存放插件的相关静态资源。

1、标准模块

每个标准模块,都有对应的JS模块:

比如我们的控制器是application/admin/controller/Article.php,则我们JS中对应的JS模块是public/assets/js/backend/article.js。

示例:

define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {

    var Controller = {
        index: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    index_url: 'category/index',
                    add_url: 'category/add',
                    edit_url: 'category/edit',
                    del_url: 'category/del',
                    multi_url: 'category/multi',
                    dragsort_url: '',
                    table: 'category',
                }
            });

            var table = $("#table");

            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                escape: false,
                pk: 'id',
                sortName: 'weigh',
                pagination: false,
                commonSearch: false,
                columns: [
                    [
                        {checkbox: true},
                        {field: 'id', title: __('Id')},
                        {field: 'type', title: __('Type')},
                        {field: 'name', title: __('Name'), align: 'left'},
                        {field: 'nickname', title: __('Nickname')},
                        {field: 'flag', title: __('Flag'), operate: false, formatter: Table.api.formatter.flag},
                        {field: 'image', title: __('Image'), operate: false, formatter: Table.api.formatter.image},
                        {field: 'weigh', title: __('Weigh')},
                        {field: 'status', title: __('Status'), operate: false, formatter: Table.api.formatter.status},
                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                    ]
                ]
            });

            // 为表格绑定事件
            Table.api.bindevent(table);
        },
        add: function () {
            Controller.api.bindevent();
        },
        edit: function () {
            Controller.api.bindevent();
        },
        api: {
            bindevent: function () {
                Form.api.bindevent($("form[role=form]"));
            }
        }
    };
    return Controller;
});

八、组件

文档:https://doc.fastadmin.net/doc/177.html

1、表单验证:

<input id="c-title" class="form-control" data-rule="required;username" name="row[title]" type="text" value="" />
required    字段必填  required
checked     必选,只适用于checkbox和radio checked
match(name) 当前字段值必须和 name 字段的值匹配  match('row[username]')
remote(URL) 请求服务端验证 remote('validate/check_username_unique')
integer     整数  integer
range(n~)   数值范围, 请填写不小于 n 的数 range(3~)
length(n)   请填写 n 个字符 length(3)
filter      过滤 <>`"' 和字符实体编码的字符 filter
digits      必须为数字 digits
letters     必须为字母 letters
date        必须为日期,yyyy-mm-dd格式  date
time        必须为时间,hh:ii格式 time
email       必须为email格式  email
url         必须为URL链接  url
qq          必须为QQ号  qq
IDcard      必须为身份证号码  IDcard
tel         必须为电话号码 tel
mobile      必须为手机号码 mobile
zipcode     必须为邮编 zipcode
chinese     必须为中文字符 chinese
username    必须为3-12位数字、字母、下划线 username
password    必须为6-16位字符,不能有空格  password

自定义规则:

<input id="c-title" class="form-control" data-rule="required;diyname" name="row[title]" type="text" value="" />

JS定义规则:

$.validator.config({
    rules: {
        diyname: function (element) {
            //如果直接返回文本,则表示失败的提示文字
            //如果返回true表示成功
            //如果返回Ajax对象则表示远程验证
            if (element.value.toString().match(/^\d+$/)) {
                return '不能为纯数字';
            }
            if (!element.value.toString().match(/^[a-zA-Z0-9\-_]+$/)) {
                return '请输入字母或数字组合';
            }
            return $.ajax({
                url: 'ajax/check',
                type: 'POST',
                data: {id: $("#c-title").val(), name: element.name, value: element.value},
                dataType: 'json'
            });
        }
    }
});

后台校验:服务器返回

$result = "验证结果";
if ($result) {
    //失败
    $this->error("用户名已经存在");
} else {
    //成功
    $this->success();
}

九、组件

表格组件:

<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
       data-operate-edit="{:$auth->check('test/edit')}" 
       data-operate-del="{:$auth->check('test/del')}" 
       width="100%">
</table>

初始化:

// 初始化表格参数配置
Table.api.init({
    extend: {
        index_url: 'test/index' + location.search,
        add_url: 'test/add',
        edit_url: 'test/edit',
        del_url: 'test/del',
        multi_url: 'test/multi',
        table: 'test',
    }
});

可配置分页:

Table.api.init({
    pageSize: 20, //调整分页大小为20
    pageList: [10, 25, 50, 100, 'All'], //增加一个100的分页大小
});

十、函数

1、函数位置

站点目录/thinkphp/helper.php // ThinkPHP5中定义的函数所在文件
站点目录/application/common.php // FastAdmin中定义的函数所在文件

2、生成URL地址url

url($url,$vars,$suffix,$domain)
$url    页面相对URL  默认无 
$vars   URL参数 []   默认否
$suffix 是否URL后缀  默认true  
$domain 是否显示域名 默认false 

示例:

// 前台模块(index/api/插件模块)
$url = url('/index/user/login'); // 返回:/index/user/login
$url = url('/index/user/login', ['a'=>1], false, true); // 返回:http://www.example.com/index/user/login?a=1
$url = url('/index/user/login', [], false, true); // 返回:http://www.example.com/index/user/login
$url = url('/index/user/login', [], false, 'www.baidu.com'); // 返回:http://www.baidu.com/index/user/login

后台模块:

// 后台模块(admin)
$url = url('/index/user/login'); // 返回:/x02lsfdsSf02Sap.php/index/user/login
$url = url('/index/user/login',[],false,true); // 返回:http://www.example.com/x02lsfdsSf02Sap.php/index/user/login

视图使用:

// 模板视图中使用
{:url('/index/user/login')}

3、补全CDN地址

$result = cdnurl('/uploads/2022/20220210/my.jpg', true); // 返回:http://www.example.com/uploads/2022/20220210/my.jpg
$result = cdnurl('/uploads/2022/20220210/my.jpg', 'http://www.test.com'); // 返回:http://www.test.com/uploads/2022/20220210/my.jpg

视图中使用:

// 模板视图中使用
{$item.image|cdnurl} // 返回:/uploads/20240211/32323223fds.jpg
{$item.image|cdnurl=###,true} // 返回:https://www.example/uploads/20240211/32323223fds.jpg

打完收工!

posted @ 2026-04-19 00:45  帅到要去报警  阅读(139)  评论(0)    收藏  举报