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 表                             自动插菜单

必改一:权限范围

生成的控制器默认是全表查询:

php
// 生成的原样
$list = $this->model->order($sort, $order)->paginate($limit);

如果表里有 admin_id(比如订单、文章),二级管理员能看到所有人的数据。

要改成:

php
$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 里加筛选条件:

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>

控制器里对应接收:

php
$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:

php
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
echo "\xEF\xBB\xBF";  // UTF-8 BOM

这一行不加,用户打开就是乱码。

必改四:上传限制

默认允许上传所有后缀,这是个安全漏洞。

改 application/extra/upload.php:

php
return [
    'mimetype' => 'jpg,png,gif,pdf,doc,docx,xls,xlsx,zip',
    'maxsize'  => '20M',
];

光限后缀不够,还要校验真实 MIME。 把 jpg 改名成 php 上传,只看后缀是防不住的。

必改五:软删除

表里有 deletetime 字段,软删除才生效。

没有这个字段的话,「删除」是真的物理删除,删错了数据找不回来。

建表时一定要加:

sql
`deletetime` int(10) unsigned DEFAULT NULL COMMENT '删除时间',

模型里也要启用:

php
use think\model\SoftDelete;
use SoftDelete;
protected $deleteTime = 'deletetime';

完整清单

生成完,按这个顺序改:

  1. 加数据权限过滤(最重要)
  2. 加列表筛选条件
  3. 导出加 BOM 头
  4. 收紧上传后缀 + 校验 MIME
  5. 确认软删除字段和模型配置

五项都做完,才算能上线。

俗人源码网免责声明:

1、本站所有资源均收集于互联网,分享目的仅限学习与参考。如有侵权,请联系 1685698671@qq.com 及时删除!

2、本站资源不保证完整性和安全性,下载后请自行检测。使用过程中出现的任何问题均与本站无关,敬请自行处理。

3、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。