Backend 基类控制器
介绍
Backend 类是一个通用的后台控制器基类,统一了数据表 CRUD 操作行为,降低重复代码,内置了数据权限控制,用“配置 + 约定”驱动查询、权限、联表、搜索等功能。通过继承此类,可以快速构建后台管理功能。
属性说明
基础属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| $noNeedLogin | array | [] | 无需登录即可访问的方法名数组 |
| $noNeedRight | array | [] | 需要登录但无需权限验证的方法名数组 |
| $model | Model | null | 指定的主模型类实例 |
| $auth | object | null | 当前登录用户信息 |
| $dataLimit | bool/string | false | 数据权限控制,支持 false、'auth'、'personal' |
| $dataLimitField | string | 'admin_id' | 数据权限关联字段 |
| $createdByField | string | '' | 创建者自动填充字段 |
| $updatedByField | string | '' | 更新者自动填充字段 |
| $multiFields | string/array | 'status' | 允许批量操作的字段,数组或以逗号分隔的字符串 |
| $alias | string | '' | 表别名 |
| $excludeSearchFields | array | [] | 排除搜索字段 |
| $excludeSearchValues | array | [] | 排除搜索值 |
| $modelValidate | bool | true | 是否启用模型验证 |
| $with | array | [] | 关联预加载模型 |
| $selectpageFields | string | '*' | Selectpage 查询字段 |
| $selectpageKey | string | 'id' | Selectpage 主键字段 |
| $selectFields | string | '*' | 列表查询字段 |
| $searchable | array | [] | 搜索白名单配置 |
| $excludeFields | array/string | [] | 添加/编辑时排除的字段 |
新增 / 编辑时自动写入当前管理员 ID
示例:
protected $createdByField = 'created_by';
protected $updatedByField = 'updated_by';搜索 $searchable 配置
示例:
protected array $searchable = [
'type_id' => [
'type' => 'string', // 字段类型:string/int/timestamp
'join' => [
'table' => 'system_attachment_type',
'alias' => 't',
'fields' => ['t.name as type_name'],
'on' => [
['a.type_id', '=', 't.id']
],
]
],
'status' => [
'type' => 'int',
'operator' => '=' // 支持 =, !=, >, <, >=, <=, LIKE, IN, NOT IN, BETWEEN, NULL, NOT NULL
],
'createtime' => [
'type' => 'timestamp' // 时间戳类型,支持范围查询
]
];分页参数统一约定
{
"page": 1,
"limit": 10,
"order": "desc",
"orderBy": "id"
}完整示例
<?php
namespace plugin\condoradmin\app\controller;
use plugin\condoradmin\app\library\Backend;
use plugin\condoradmin\app\model\SystemTest;
class SystemTestController extends Backend
{
protected array $searchable = [
'name' => ['type' => 'string'],
'title' => ['type' => 'string'],
'price' => ['type' => 'int'],
'views' => ['type' => 'int'],
'activitytime' => ['type' => 'int'],
'refreshtime' => ['type' => 'int'],
'createtime' => ['type' => 'int'],
];
public function __construct()
{
parent::__construct();
$this->model = new SystemTest();
}
}方法说明
响应方法
json($code, $msg = 'ok', $data = [])
返回 JSON 格式响应。
参数:
$code: 状态码(字符串或整数)$msg: 消息文本$data: 响应数据
示例:
return $this->json('0000', '操作成功', ['id' => 1]);成功响应
success($msg = 'Success', $data = [])
返回成功响应。
示例:
return $this->success('保存成功', ['id' => 1]);失败响应
fail($msg = 'Fail', $data = [])
返回失败响应。
示例:
return $this->fail('参数错误');列表响应
index(Request $request)
获取数据列表,支持分页、排序、搜索。
请求参数:
page: 页码(默认 1)
limit: 每页数量(默认 10,最大 500)
orderBy: 排序字段(默认主键)
order: 排序方式(asc/desc,默认 desc)
其他:搜索条件参数
Selectpage 方法
selectpage(Request $request)
Selectpage 专用方法,支持下拉选择数据。
特性:
支持已选数据置顶显示 支持 UNION ALL 查询 可配置查询字段和主键
请求参数:
id: 已选的 ID 值(多个用逗号分隔) 其他参数同 index 方法
添加方法
add(Request $request)
添加数据。
请求参数:
POST 数据:要添加的字段键值对
验证:
如果 $modelValidate 为 true 且模型有 rules() 方法,使用 Respect\Validation 验证
自动填充创建者字段(如果配置)
自动填充数据权限字段(如果启用)
编辑方法
edit(Request $request) 编辑数据。
请求参数:
id: 要编辑的数据 ID
POST 数据:要更新的字段键值对
权限验证:
检查数据权限(如果启用)
自动填充更新者字段(如果配置)
删除方法
del(Request $request) 删除数据,支持单个或批量删除,如果启用软删除则软删除。
请求参数:
ids 或 id: 要删除的 ID(单个或多个用逗号分隔)
权限验证:
检查数据权限(如果启用)
真实删除
destroy(Request $request) 真实删除数据。
请求参数:
ids 或 id: 要删除的 ID
注意:
需要模型支持软删除(SoftDeletes)
恢复软删除
restore(Request $request) 恢复软删除的数据。
请求参数:
ids 或 id: 要恢复的 ID
批量更新
multi(Request $request) 批量更新数据。
请求参数:
ids 或 id: 要更新的 ID
field 和 value: 单个字段更新
values: 多个字段更新(JSON 对象)
字段限制:
只能更新 $multiFields 中定义的字段
超级管理员可更新所有字段
示例:
// 单个字段更新
POST /user/multi
{
"ids": [1,2,3],
"field": "status",
"value": 2
}
// 多个字段更新
POST /user/multi
{
"ids": [1,2,3],
"values": {
"status": 1,
"type": 2
}
}辅助方法
getDataLimitAdminIds() 获取数据权限限制的管理员 ID 列表。
返回:
空数组:不限制或超级管理员
数组:限制的管理员 ID 列表
preExcludeFields(array $data)
排除不需要的字段。
buildparams(Request $request)
构建查询参数,返回 [$params, $sort, $order, $offset, $limit]。
applyWhere($query, $params)
应用查询条件到查询构造器。
注意事项
数据权限:
$dataLimit = false:禁用数据权限
$dataLimit = 'personal':仅限自己的数据
$dataLimit = 'auth':自己和下属的数据
搜索操作符:
支持 =, !=, >, <, >=, <=, LIKE, IN, NOT IN, BETWEEN, NULL, NOT NULL
时间戳字段支持范围查询
如 ['2023-01-01', '2023-12-31'] 或时间戳范围数组 [1672531200, 1704064000]
安全特性:
字段名白名单验证
SQL 操作符验证
自动参数过滤
性能优化:
分页限制最大 500 条
JOIN 查询避免重复
字段选择优化
事务处理:
添加、编辑、删除操作自动使用事务
异常时自动回滚