后台模块是 FastAdmin 开源后台框架的核心模块,提供了大量高效和实用的功能,方便开发者快速搭建项目的后台。
框架后台模块通过安全入口访问,比如:
https://demo.fastadmin.net/奇怪的文件名.php
在此仅做后台的流程介绍、核心类解析及相关功能模块功能使用介绍,如果需要查看前端开发文档,请前往相应章节查看文档。
后台模块默认包含了控制台、常规管理、权限管理、插件管理、会员管理、分类管理(默认隐藏)、测试管理(用户自行生成)。
在后台管理中一些基础配置,例如系统配置、附件管理、个人配置等功能都归属到该级栏目下面。
用于管理系统的配置信息,包括站点标题、站点底部信息、邮件配置、字典配置等。
在开发中经常会遇到一些配置信息可以在后台进行修改的功能,此时我们在系统配置中进行增改操作。系统配置中的配置项不支持删除功能,如果需要删除配置项,需要删除数据库中fa_config
表中相对应的行。
在系统配置中的添加
一栏,我们可以自定义添加系统配置。以下是添加项的详细解释。
类型 | 介绍 |
---|---|
类型 | 主要是字符、文本、数字、日期时间、列表、图片、文件、复选、单选、数组等类型 |
分组 | 配置所属的分组 |
变量名 | 变量名,只能使用数字、字母、下划线定义。在视图中可以使用{$site.变量名调用} ,在PHP中可以使用config('site.变量名') 调用 |
变量标题 | 配置对应显示的中文名称 |
变量值 | 配置项的基础值 |
提示信息 | 当配置项获得焦点时提示的文字信息 |
校验规则 | 校验规则使用的是nice-validator 的规则,可以查看:https://validator.niceue.com/docs/core-rules.html,多个规则使用; 进行分隔 |
扩展属性 | 用于给生成的DOM元素添加额外的扩展属性 |
系统配置支持多种数据类型,下面依次做简单介绍。
类型 | 介绍 |
---|---|
字符 | 生成单行文本框 |
文本 | 生成多行文本框 |
数字 | 生成单行数字文本框 |
日期 | 生成只可日期的日期选择框 |
时间 | 生成输入时间的时间选择框 |
日期时间 | 生成文本框且自动生成日期时间选择器 |
列表 | 生成下拉列表框 |
列表(多) | 生成多选下拉列表框 |
图片 | 生成单图文本框且上传或选择单图,带图片预览 |
图片(多) | 生成多图文本框且可上传或选择多张图,带图片预览 |
文件 | 生成文本框且可上传或选择文件 |
文件(多) | 生成文本框且可上传或选择多个文件 |
复选 | 生成复选框 |
单选 | 生成单选框 |
数组 | 生成一维数组输入列表且可动态添加和排序 |
自定义 | 可以直接自定义元素的HTML代码 |
附件管理可以管理前后台上传的文件资源,也可以在此上传资源到服务器或云存储。
附件管理中的删除只会删除数据库的记录,并不会删除对应的文件(云存储文件根据插件管理中配置的附件删除时是否同步删除文件
判断是否删除对应的文件)。
当我们配置了第三方云储存
插件时,附件管理中的添加将出现上传到第三方
的按钮,此时我们的上传就是上传到第三方云存储
。
用户修改和展示当前登录的管理员相关信息。
用于管理后台管理员,包括添加、编辑、删除、禁用、启用等操作。
用于记录管理员的操作日志。
用于管理角色组,包括添加、编辑、删除、启用、禁用等操作。
用于配置菜单的权限控制。
插件管理是FastAdmin
的插件的控制面板,在插件管理中可以在线免费或付费购买安装 FastAdmin插件市场中的应用插件,也可以在插件管理中配置、禁用、启用、卸载、升级插件。
如果我们安装完插件是需要启用、刷新插件缓存、清除后台缓存才会生效。部分插件是没有后台管理菜单或前台访问页面。
默认隐藏,无实际功能,仅供开发者参考,可在菜单规则中显示。
默认未生成,可通过快速开始章节由用户自行一键 CRUD 生成,主要用于开发者用户参考,开发者可以复制一份 fa_test
根据 FastAdmin 数据库规范自由修改数据表,然后通过一键生成 CRUD 重新生成。
首先需要知道FastAdmin
的后台模块是禁用了路由功能,因此后台的操作都是根据URL进行分段解析,例如我们请求的是以下链接,其中example.php
为你后台入口文件
https://www.example.com/example.php
则调用的是默认控制器application/admin/controller/Index.php
中的默认方法index
。
如果我们请求的是。
https://www.example.com/example.php/dashboard/index
则调用的是application/admin/controller/Dashboard.php
中的index
方法
框架在调用到Dashboard.php
这个控制器的index
方法后会自动渲染application/admin/view/dashboard/index.html
这个视图文件。
如果需要修改显示的内容,则修改这个这个视图文件即可。
但我们会发现有些控制器并没有index
,add
,edit
,del
等方法,但其实这些方法都在控制器的父类中采用了traits
进行引入,我们转到父类application/common/controller/Backend.php
就可以看到有一行
/**
* 引入后台控制器的traits
*/
use \app\admin\library\traits\Backend;
这一行就相当于把文件application/admin/library/traits/Backend.php
中的所有方法引入到当前控制器。如果我们需要覆盖基类定义的方法,则直接在当前控制器中定义即可。
后台的所有功能模块的控制器都是继承于application/common/controller/Backend.php
这个基类控制器。
在基类控制器中我们有定义一些基础属性和通用方法,首先我们看看基础属性。
/**
* 无需登录的方法,同时也就不需要鉴权了
* @var array
*/
protected $noNeedLogin = [];
/**
* 无需鉴权的方法,但需要登录
* @var array
*/
protected $noNeedRight = [];
/**
* 布局模板
* @var string
*/
protected $layout = 'default';
/**
* 权限控制类
* @var Auth
*/
protected $auth = null;
/**
* 快速搜索时执行查找的字段
*/
protected $searchFields = 'id';
/**
* 是否是关联查询
*/
protected $relationSearch = false;
/**
* 是否开启数据限制
* 支持auth/personal
* 表示按权限判断/仅限个人
* 默认为禁用,若启用请务必保证表中存在admin_id字段
*/
protected $dataLimit = false;
/**
* 数据限制字段
*/
protected $dataLimitField = 'admin_id';
/**
* 数据限制开启时自动填充限制字段值
*/
protected $dataLimitFieldAutoFill = true;
/**
* 是否开启Validate验证
*/
protected $modelValidate = false;
/**
* 是否开启模型场景验证
*/
protected $modelSceneValidate = false;
/**
* Multi方法可批量修改的字段
*/
protected $multiFields = 'status';
/**
* 导入文件首行类型
* 支持comment/name
* 表示注释或字段名
*/
protected $importHeadType = 'comment';
其次我们来看下通用的方法
/**
* 加载语言文件
* @param string $name
*/
protected function loadlang($name)
{
}
/**
* 渲染配置信息
* @param mixed $name 键名或数组
* @param mixed $value 值
*/
protected function assignconfig($name, $value = '')
{
}
/**
* 生成查询所需要的条件,排序方式
* @param mixed $searchfields 快速查询的字段
* @param boolean $relationSearch 是否关联查询
* @return array
*/
protected function buildparams($searchfields = null, $relationSearch = null)
{
}
/**
* 获取数据限制的管理员ID
* 禁用数据限制时返回的是null
* @return mixed
*/
protected function getDataLimitAdminIds()
{
}
/**
* Selectpage的实现方法
*
* 当前方法只是一个比较通用的搜索匹配,请按需重载此方法来编写自己的搜索逻辑,$where按自己的需求写即可
* 这里示例了所有的参数,所以比较复杂,实现上自己实现只需简单的几行即可
*
*/
protected function selectpage()
{
}
以上的属性和方法我们都可以通过在当前控制器定义来达到覆盖的目的。