Fast框架使用汇总-框架
2023-08-29


模板布局

控制器默认全部采用模板布局,因此我们的页面都会自动加上头部和尾部,如果我们有特殊的页面不需要采用模板布局,我们可以使用$this->view->engine->layout(false); 来关闭当前方法的模板布局。

如果我们需要使用自己的模板布局,在当前控制器定义protected $layout = '布局模板';即可。

请注意如果采用了自己的模板布局或禁用了模板布局,将无法使用FastAdmin的JS按需加载Config变量访问。

温馨提示

FastAdmin\app\common\controller\Api\app\common\controller\Frontend基类控制器有启用全局过滤,过滤方法为trim,strip_tags,htmlspecialchars,当使用ThinkPHP5的方法获取请求的参数值时,会被过滤HTML和特殊字符,如有特殊情况下需要不过滤(如获取小程序请求的encryptedData),可以使用$this->request->post("参数名", "默认值", null);将第三个参数设置为null即可获取原生请求的数据,特别注意当使用原生请求的数据时务必注意服务端的安全处理和安全输出。



视图渲染

基类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的配置
$auth是一个对象,所对应的类是application/admin/library/Auth.php
$admin是一个当前管理员登录的session数据,存储有管理员的用户名、昵称、ID、头像等信息

如果我们需要在JS中使用以上数据,则使用

Config.site.name
Config.modulename

来获取相关的配置信息

如果我们需要自己在控制器中透传数据到JS中去,则可以使用控制器的assignconfig方法来透传,使用如下

$this->assignconfig('demo', ['name'=>'名称']);

然后我们就可以在JS中使用

Config.demo.name

来获取对应的数据


权限控制

在基类中我们有定义以下两个属性

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

比如我们有定义一个方法mywork,而这个方法是不需要登录即可访问的,则我们需要在当前的控制器定义

protected $noNeedLogin = ['mywork'];

比如我们有定义一个方法mytest,而这个方法是需要登录后任何管理员都可以访问,则我们需要在当前的控制器定义

protected $noNeedRight = ['mytest'];

如果我们需要动态定义,请务必放在调用父类的_initialize方法之前,否则是不会生效的。



关联查询

目前FastAdmin后台index方法支持一对一关联查询,比如我们一篇文章有归属分类,我们在列出数据时需要同时列表文章分类名称。

首先我们需要在当前控制器中添加以下属性

protected $relationSearch = true;

然后在控制器对应的model(非关联model)中添加以下代码:

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

更多的关联用户可以参考TP5关联模型的章节:关联模型

一对一关联

return $this->hasOne('Profile'); //hasOne('关联模型名','主键名','外键名',['模型别名定义'],'join类型'); 默认的join类型为INNER。  

一对多关联

return $this->hasMany('Comment');  //hasMany('关联模型名','主键名','外键名',['模型别名定义']);

多对多关联

return $this->belongsToMany('Role');  //belongsToMany('关联模型名','中间表名','当前模型关联键名','外键名',['模型别名定义']);


我们在控制器对应的JS中可以直接使用category.idcategory.name等关联表的字段

202308311902585bdbe5644.png




控制器

基类控制器

FastAdmin中定义了三个基类控制器,分别位于

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



数据限制

在后台开发的过程中经常会有这样的一个需求,每个管理员单独管理自己添加的数据或单独管理自己下级管理员添加的数据,管理员之间的数据是不相通的,每个管理员看到的数据是不同的。在FastAdmin中可以很方便的实现此功能。

首先我们需要在当前控制器添加以下两个属性

protected $dataLimit = 'auth'; //默认基类中为false,表示不启用,可额外使用auth和personal两个值
protected $dataLimitField = 'admin_id'; //数据关联字段,当前控制器对应的模型表中必须存在该字段
$dataLimit = false; //表示不启用,显示所有数据
$dataLimit = 'auth'; //表示显示当前自己和所有子级管理员的所有数据
$dataLimit = 'personal'; //表示仅显示当前自己的数据

$dataLimitField字段默认为admin_id,请注意添加该字段类型为int(10)

通过以上配置后,在列表加载数据的时候将默认添加条件过滤不属于自己权限的数据,同时在添加时会自动维护admin_id的数据,在编辑、删除的时候会自动控制权限避免越权操作。

如果需要将原有的数据加入到FastAdmin后台管理权限控制当中,比如已有的数据已经有标识归属,但这个归属体系并非是FastAdmin的后台管理员体系。在这个时候我们就需要重写基类的getDataLimitAdminIds方法,将此方法返回数据标识的归属ID数组集合,这样即可使用FastAdmin的后台管理权限进行管理。





数据库

这里提供的是数据库表字段规则在你创建表时使用,当按如下的规则进行字段命名、类型设置和备注时
使用php think crud -t 表名生成CRUD时会自动生成对应的控制器、模型、视图、JS等。

根据字段类型

类型备注类型说明
int整型自动生成type为number的文本框,步长为1
enum枚举型自动生成单选下拉列表框
setset型自动生成多选下拉列表框
float浮点型自动生成type为number的文本框,步长根据小数点位数生成
text文本型自动生成textarea文本框
datetime日期时间自动生成日期时间的组件
date日期型自动生成日期型的组件
timestamp时间戳自动生成日期时间的组件
varchar字符串当字符串长度定义大于等于255时,将自动在列表启用autocontent,仅支持FastAdmin1.4.0+

特殊字段

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

以特殊字符结尾的规则

结尾字符示例类型要求字段说明
timerefreshtimebigint/datetime识别为日期时间型数据,自动创建选择时间的组件
imagesmallimagevarchar识别为图片文件,自动生成可上传图片的组件,单图
imagessmallimagesvarchar识别为图片文件,自动生成可上传图片的组件,多图
fileattachfilevarchar识别为普通文件,自动生成可上传文件的组件,单文件
filesattachfilesvarchar识别为普通文件,自动生成可上传文件的组件,多文件
avatarminiavatarvarchar识别为头像,自动生成可上传图片的组件,单图
avatarsminiavatarsvarchar识别为头像,自动生成可上传图片的组件,多图
contentmaincontenttext/mediumtext/longtext识别为内容,自动生成富文本编辑器(需安装富文本插件)
_iduser_idint/varchar识别为关联字段,自动生成可自动完成的文本框,单选
_idsuser_idsvarchar识别为关联字段,自动生成可自动完成的文本框,多选
listtimelistenum识别为列表字段,自动生成单选下拉列表
listtimelistset识别为列表字段,自动生成多选下拉列表
datahobbydataenum识别为选项字段,自动生成单选框
datahobbydataset识别为选项字段,自动生成复选框
jsonconfigjsonvarchar识别为键值组件,自动生成键值录入组件,仅支持1.2.0+
switchsiteswitchtinyint识别为开关字段,自动生成开关组件,默认值10,仅支持FastAdmin 1.2.0+
rangedaterangevarchar识别为时间区间组件,自动生成时间区间组件,仅支持FastAdmin 1.3.0+
tagarticletagvarchar识别为Tagsinput,自动生成标签输入组件,仅支持FastAdmin 1.3.0+
tagsarticletagsvarchar识别为Tagsinput,自动生成标签输入组件,仅支持FastAdmin 1.3.0+
温馨提示:以list或data结尾的字段必须搭配enum或set类型才起作用
如果为多图或多列表字段,请务必确保字段长度足够

注释说明

字段注释内容字段类型字段说明
status状态int将生成普通语言包和普通文本框
status状态enum(‘0’,’1’,’2’)将生成普通语言包和单选下拉列表,同时生成TAB选项卡
status状态:0=隐藏,1=正常,2=推荐enum(‘0’,’1’,’2’)将生成多个语言包和单选下拉列表,同时生成TAB选项卡,且列表中的值显示为对应的文字##

常见问题

  1. 如果使用php think crud生成过表的CRUD,当修改了表结构类型或新增了字段,此时只有重新生成CRUD或自己手动修改视图文件和JS文件。
  2. 如果你的表需要生成关联模型,建议你在设计表时遵循以下规范,category_id字段关联对应fa_category表主键,company_info_id关联对应fa_company_info表主键。
  3. 如果字段名为user_id,生成的动态下拉列表会自动匹配user/index这个控制器方法,如果你发现CRUD后无法显示关联数据列表,请检查视图中元素data-source的值是否正确。




一键压缩打包

在FastAdmin中如果修改了核心的JS或CSS文件,是需要重新压缩打包后在生产环境下才会生效。FastAdmin采用的是基于RequireJSr.js进行JS和CSS文件的压缩打包。

准备工作

请先确保你的环境已经安装好Node环境。

首先确认你application/config.phpapp_debug的值,当为true的时候是采用的无压缩的JS和CSS,当为false时采用的是压缩版的JS和CSS。

请确保php所在的目录已经加入到系统环境变量,否则会提示找不到该命令。

打开命令行控制台进入到你的站点根目录,也就是think文件所在的目录。

常用命令

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

常见问题

Windows系统需要手动配置node的路径,请参考在Windows下如何压缩打包JS和CSS。

如果无法进行打包,可以使用php think min -m all -r all -vvv尝试下,看下错误信息。

如果压缩打包后访问不生效,请检查是否是你的浏览器缓存的原因,请尝试清除浏览器缓存。

请不要直接修改以.min.js.min.css结尾的文件,因为一键压缩打包后会进行覆盖。

安装或卸载插件后无需进行压缩打包JS和CSS

影响文件

在调试模式和生产环境下所加载的JS和CSS是不一样的,压缩打包会重新生成生产环境下的JS和CSS文件,特别注意下。
调试模式:

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




一键生成菜单

FastAdmin可通过命令控制台快速的一键生成后台的权限节点菜单规则,同时后台的管理菜单也会同步改变,操作非常简单。

准备工作

首先确保已经将FastAdmin配置好,数据库连接正确,同时确保已经通过上一步的一键生成CRUD已经生成了testCRUD

请确保php所在的目录已经加入到系统环境变量,否则会提示找不到该命令。

打开命令行控制台进入到你的站点根目录,也就是think文件所在的目录。

常用命令

//一键生成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

常见问题

  1. 在使用php think menu前确保你的控制器已经添加或通过php think crud生成好。
  2. 如果之前已经生成了菜单,需要再次生成,请登录后台手动删除之前生成的菜单或使用php think menu -c 控制器名 -d 1来删除。
  3. 如果生成层级目录的菜单,在后台展示时父级菜单会以目录名称显示,如果需要修改可以在application/admin/lang/zh-cn.php中追加相应的语言包即可。


一键生成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]                    排序字段

常见问题

  1. 如果你的表带有下划级会自动生成带层级的控制器和视图,如果你不希望生成带层级的控制器和视图,请使用-c 参数,例如:php think crud -t test_log -c testlog将会生成testlog这个控制器,同理如果你的普通表想生成带层级的控制器则可以使用php think crud -t test -c mydir/test
  2. FastAdmin自带一个fa_test表用于测试CRUD能支持的字段名称和类型,请直接使用php think crud -t test生成查看。
  3. 生成CRUD后,关联表外键在列表未显示对应的关联表数据信息,此时建议你使用在线命令行插件进行可视化生成。
  4. 生成CRUD后,在添加或编辑时外键字段未能正确显示关联表数据列表,请查看数据库章节常见问题中的说明。
  5. 如果需要生成回收站,请务必保证你的表中存在deletetime字段,且默认值必须为null,这样在一键CRUD时将自动生成回收站的功能,如果deletetime默认值为0,数据将默认进入回收站。
  6. 不可以对fa_user/fa_auth_rule/fa_auth_group/fa_auth_group_access/fa_admin/fa_admin_log/fa_admin/fa_user_group/fa_user_rule等框架核心表进行CRUD,否则原有的框架后台功能将无法正常使用。
  7. 默认的category_id字段,会将表名做为筛选条件,如对fa_test表做CRUD,则类型为test,如对fa_test_copyCRUD,则类型为test_copy,务必前往常规管理->系统配置->字典配置->分类类型中添加上对应的类型,然后再到分类管理录入数据后才会生效,否则在Selectpage下拉时会为空。
  8. 如果编辑时始终显示相同的数据,请检查你的数据表是否有使用复合主键,目前CRUD不支持复合主键。

更多CRUD一键生成可使用的参数请使用php think crud --help查看。


邮件发送

功能介绍

FastAdmin中的邮件发送采用phpmailer进行邮件发送,在使用邮件发送功能前请先在后台常规管理->系统配置中配置好邮件的相关信息。

使用示例

首先我们需要采用单例或实例化一个Email对象

$email = new \app\common\library\Email;

其次我们可以设置邮件主题正文、接收者、标题等信息,比如

$email->subject('这里是邮件标题')->to('youremail@163.com')->message('这里是邮件正文')->send();

如果我们邮件发送失败,想获取错误的详情,可使用。

$email->getError();

来获取到错误详情