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
打完收工!

浙公网安备 33010602011771号