FastAdmin 最有用的功能是「一键生成 CRUD」——选个表,点几下,后台的增删改查就全有了。
但生成的只是骨架,直接上线会出问题。
我做过几个 FastAdmin 项目,每次生成完都改同样几处,记下来。
生成出来什么
点一次生成,产出 9 个文件:
application/admin/controller/Goods.php 控制器
application/admin/model/Goods.php 模型
application/admin/validate/Goods.php 验证器
application/admin/view/goods/index.html 列表页
application/admin/view/goods/add.html 新增页
application/admin/view/goods/edit.html 编辑页
public/assets/js/backend/goods.js 前端 JS
public/assets/js/require-backend.js 需要手动加一行
数据库 auth_rule 表 自动插菜单
必改一:权限范围
生成的控制器默认是全表查询:
// 生成的原样
$list = $this->model->order($sort, $order)->paginate($limit);
如果表里有 admin_id(比如订单、文章),二级管理员能看到所有人的数据。
要改成:
$where = [];
if (!$this->auth->isSuperAdmin()) {
$where['admin_id'] = $this->auth->id;
}
$list = $this->model->where($where)->order($sort, $order)->paginate($limit);
这段不加,等于把数据权限直接放开。
FastAdmin 的权限是三层,很多人只配了第一层:
| 层 | 表 | 管什么 |
|---|---|---|
| 角色组 | auth_group | 能不能点这个按钮 |
| 规则节点 | auth_rule | 具体到哪个操作 |
| 数据范围 | 要自己写 | 能看谁的数据 |
第三层 FastAdmin 没给,必须自己实现。
必改二:列表筛选
默认列表只能按 ID 排序,数据一多就没法用。
在 index.html 里加筛选条件:
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">创建时间:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" class="form-control datetimerange" name="createtime"
value="{$createtime}" placeholder="开始 - 结束">
</div>
</div>
控制器里对应接收:
$createtime = $this->request->get("createtime");
if ($createtime) {
list($start, $end) = explode(" - ", $createtime);
$where['createtime'] = ['between', [strtotime($start), strtotime($end)]];
}
必改三:导出乱码
FastAdmin 用 PhpSpreadsheet 导出 Excel。默认输出 UTF-8 无 BOM,Office 打开中文全乱。
找到导出方法,在输出前加 BOM:
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
这一行不加,用户打开就是乱码。
必改四:上传限制
默认允许上传所有后缀,这是个安全漏洞。
改 application/extra/upload.php:
return [
'mimetype' => 'jpg,png,gif,pdf,doc,docx,xls,xlsx,zip',
'maxsize' => '20M',
];
光限后缀不够,还要校验真实 MIME。 把 jpg 改名成 php 上传,只看后缀是防不住的。
必改五:软删除
表里有 deletetime 字段,软删除才生效。
没有这个字段的话,「删除」是真的物理删除,删错了数据找不回来。
建表时一定要加:
`deletetime` int(10) unsigned DEFAULT NULL COMMENT '删除时间',
模型里也要启用:
use think\model\SoftDelete;
use SoftDelete;
protected $deleteTime = 'deletetime';
完整清单
生成完,按这个顺序改:
- 加数据权限过滤(最重要)
- 加列表筛选条件
- 导出加 BOM 头
- 收紧上传后缀 + 校验 MIME
- 确认软删除字段和模型配置
五项都做完,才算能上线。
1、本站所有资源均收集于互联网,分享目的仅限学习与参考。如有侵权,请联系 1685698671@qq.com 及时删除!
2、本站资源不保证完整性和安全性,下载后请自行检测。使用过程中出现的任何问题均与本站无关,敬请自行处理。
3、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。





评论(0)