第一次接触FastAdmin时,我按照官方文档配置环境,结果踩了不少坑。这里分享几个新手容易忽略的关键点。PHP版本选择很重要,官方推荐7.1版本,但我实测发现7.2.5版本最稳定。记得检查PDO、MBstring、CURL这些扩展是否安装,否则后台会报各种莫名其妙的错误。
虚拟域名配置时有个细节要注意:不要在路径中包含中文或空格,否则安装程序可能无法正确识别目录。我建议直接用简单的英文单词,比如fastadmin.test。安装完成后,记得删除install.php文件,这是很多开发者会忘记的安全隐患。
提示:安装时如果遇到"目录不可写"错误,检查storage和runtime目录权限,建议设置为755。
数据库配置环节最容易出问题。遇到过MySQL版本不兼容的情况,5.7以下版本运行CRUD命令时会出现表创建失败。建议使用MySQL5.7+,并且确保innodb引擎可用。安装完成后后台地址默认是随机字符串,可以在application/config.php里修改admin_path配置项。
很多开发者拿到FastAdmin第一件事就是删减默认菜单。但直接删除代码可能会引发连锁问题。正确做法是分三步走:先在后台的"系统管理-菜单规则"中禁用不需要的菜单,然后清理对应控制器,最后处理关联数据表。
插件管理模块的删除要特别小心。除了删除application/admin/controller/Addon.php,还要检查这些地方:
我推荐保留插件系统,因为后期扩展功能会很方便。可以通过修改菜单权限来控制显示,而不是直接删除代码。自定义主题时,注意不要直接修改核心CSS文件,应该在public/assets/css/下新建文件覆盖。
FastAdmin的CRUD命令很强大,但有些细节文档没说明白。创建一级模块用:
bash复制php think crud -t product -u 1
这个命令会自动生成控制器、模型、视图和JS文件。但要注意表名必须是单数形式,否则关联查询会出问题。
二级模块的创建命令有个坑:
bash复制php think crud -t product/item -c product/item -u 1
路径参数必须写两遍,否则生成的控制器命名空间会出错。驼峰命名的模块要特别注意:
bash复制php think crud -t productItem -c product/item -u 1
模型名和控制器路径要保持一致,否则自动加载会失败。
删除模块时记得加-d参数:
bash复制php think crud -t product -d product/product -u 1
这个命令不会删除数据表,需要手动执行DROP TABLE。
FastAdmin对某些字段名有特殊处理。比如createtime和updatetime字段会自动维护,不需要在代码里赋值。weigh字段用于拖拽排序,如果表里有这个字段,列表页会自动出现排序按钮。
图片上传字段的命名有讲究:
image 单图上传images 多图上传avatar 头像上传这些字段类型建议用varchar(255),FastAdmin会自动生成对应的上传组件。enum类型字段的显示方式取决于字段名后缀:
status 显示为下拉框status_data 显示为单选框有个坑要注意:state字段的查询条件要用字符串格式。因为FastAdmin内部处理时会强制转换类型,写where('state',1)会失效,必须写where('state','1')。
列表页显示分类ID而不是名称的问题,我摸索出三种解决方案:
第一种是用模型获取器,简单但不推荐:
php复制public function getCategoryIdAttr($value)
{
return Category::where('id',$value)->value('name');
}
这会导致编辑页面无法正常显示原始值。
第二种是用关联查询,这是官方推荐做法。先在模型定义关联:
php复制public function category()
{
return $this->belongsTo('Category');
}
然后在控制器重写index方法:
php复制public function index()
{
if ($this->request->isAjax()) {
$list = $this->model->with('category')->select();
return json(['rows'=>$list]);
}
return $this->view->fetch();
}
最后在JS里配置字段:
javascript复制columns: [
{field: 'category.name', title: '分类名称'}
]
第三种方案适合复杂场景,用JOIN直接查询:
php复制$list = $this->model->alias('a')
->join('category b','a.category_id=b.id')
->field('a.*,b.name as category_name')
->select();
给表格添加自定义按钮需要修改三处地方。首先在index.html添加按钮:
html复制<a href="javascript:;" class="btn btn-danger btn-ajax" data-url="{:url('recycle')}">
<i class="fa fa-trash"></i> 回收站
</a>
然后在控制器添加对应方法:
php复制public function recycle()
{
if ($this->request->isAjax()) {
$list = $this->model->onlyTrashed()->select();
return json(['rows'=>$list]);
}
return $this->view->fetch();
}
最后在JS文件初始化表格:
javascript复制var table = $("#table");
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
columns: [...]
});
function recycle() {
$.post("recycle", function(data){
table.bootstrapTable('refresh');
});
}
AJAX交互有个实用技巧:给按钮添加btn-ajax类会自动处理loading状态和结果提示。如果想刷新当前表格,设置data-refresh="true"属性即可。
列表显示英文的问题,其实是因为语言包缺失。正确做法不是直接改JS,而是在application/admin/lang/zh-cn/下添加对应的语言定义。比如:
php复制return [
'Product' => '产品',
'product' => [
'name' => '产品名称',
'price' => '价格'
]
];
表单控件的生成规则很有意思。FastAdmin会根据字段名和类型自动选择控件:
time结尾的字段生成日期选择器content字段生成富文本编辑器email字段会添加邮箱验证想自定义控件的话,可以在模型里定义:
php复制protected $formControls = [
'price' => ['type'=>'number','step'=>'0.01']
];
FastAdmin的权限系统基于Auth类,但有些功能没在文档体现。比如给角色添加额外权限可以这样:
php复制$auth = new Auth();
$auth->addNode('product/import', '导入产品', 1);
然后把这个节点ID赋给角色。
按钮级权限控制有个妙用:在模板里用
php复制{if $auth->check('product/delete')}
<button>删除</button>
{/if}
这样不同角色看到的按钮会不一样。
我发现在application/extra/下的admin.php可以修改超级管理员ID,默认是1。建议改成其他数字增强安全性。还有个隐藏配置可以开启操作日志:
php复制'operation_log' => true
这样所有后台操作都会被记录到fa_admin_log表。