正在加载文档...
AdmincpBase 后台基础类说明文档
AdmincpBase 后台基础类说明文档
AdmincpBase 是后台管理系统的核心基础类,继承自 AdmincpView,提供通用功能如模型管理、权限控制、数据操作等,为其他管理类提供统一的基础能力。
核心功能概览
| 功能模块 | 关键方法/属性 | 说明 |
|---|---|---|
| 模型管理 | modelInit, getModel |
动态初始化模型类,支持自动推断模型类名或手动指定 |
| 错误处理 | error, alert |
统一错误提示机制,支持直接中断流程或返回错误信息 |
| 数据映射 | getFieldMap, getMapOption |
获取模型字段的映射关系,生成<option> 等表单元素 |
| 排序控制 | getTableOrderBy |
根据请求参数生成 SQL 排序语句 |
| 分页查询 | tableData |
通用表格数据获取方法,支持复杂查询条件与回调处理 |
| 权限控制 | setEditor |
设置编辑者信息并进行权限校验 |
| 动态按钮 | actionBtns |
根据配置生成操作按钮,支持图标、数据属性等动态配置 |
| 静态资源 | do_assets |
统一加载前端静态资源 |
核心属性说明
// 排序字段配置 (示例)
public static $orderBy = [
'id' => 'ID',
'sortnum' => '排序值'
];
// 基础权限标识
public $ACCESC_BASE = [
'ADD' => '新增权限',
'INDEX' => '管理权限',
'EDIT' => '编辑权限',
'DELETE' => '删除权限'
];
// 状态映射 (SDOMAP 示例)
public static $SDOMAP = [
'inbox' => '0', // 草稿
'normal' => '1', // 正常
'trash' => '2', // 回收站
// ...其他状态
];
核心方法详解
1. 模型初始化 (modelInit)
public static function modelInit($name = null) {
// 自动推断模型类名 (如 ArticleAdmincp → ArticleModel)
if(empty(self::$MODEL)){
$modelClass = sprintf('%sModel', substr(get_called_class(),0,-7));
class_exists($modelClass) && self::$MODEL = $modelClass;
}
}
- 用途: 动态绑定数据模型类
- 触发时机: 类实例化时自动调用
2. 表格数据获取 (tableData)
public static function tableData($model, $query=[], $func=null) {
// 构建查询条件
$obj = $model->where($query['where'])
->field($query['field'])
->orderBy(self::getTableOrderBy());
// 执行分页查询
$rows = $obj->paging($pageSize);
// 回调处理数据
$func && $rows = call_user_func($func, $rows);
return [
'total' => Paging::$count,
'rows' => $rows,
'sql' => $obj->getQueryLog()
];
}
参数说明:
$model: 模型类名或查询对象$query: 查询条件数组 (where/field/orderby等)$func: 数据处理回调函数
典型调用:
// 在子类中获取文章列表
public function do_index() {
$query = ['where' => ['status' => 1]];
return self::tableData(ArticleModel::class, $query, function($rows){
return array_map(function($row){
$row['pubdate'] = date('Y-m-d', $row['pubdate']);
return $row;
}, $rows);
});
}
3. 操作按钮生成 (actionBtns)
配置示例 (/etc/admincp/article.index.action.json):
{
"edit": {
"title": "编辑",
"icon": "edit",
"url": "article/edit?id={$v.id}",
"class": "btn-primary"
},
"delete": {
"title": "删除",
"icon": "trash",
"action": "delete",
"data-toggle": "confirm"
}
}
生成逻辑:
- 读取匹配
admincp/*.index.action*的配置文件 - 解析占位符如
{$v.id}替换为实际数据 - 生成带图标和事件的 HTML 按钮代码
4. 权限控制 (setEditor)
public static function setEditor(&$post, $row, $field1='userid', $field2='editor') {
// 非管理员只能修改自己的数据
if(!Admin::isSuperRole() && $row[$field1] != $post[$field1]){
self::alert('无权操作他人数据');
}
}
典型使用场景:
在保存数据前校验编辑权限,防止越权修改。
继承与扩展
扩展模型类
class ArticleAdmincp extends AdmincpBase {
protected static $MODEL = ArticleModel::class; // 指定模型
protected static $orderBy = ['pubdate' => '发布时间']; // 扩展排序字段
}
自定义状态映射
class ProductAdmincp extends AdmincpBase {
public static $SDOMAP = [
'draft' => 0,
'onsale' => 1,
'offline' => 2
];
}
安全机制
- 输入过滤: 关键方法使用
Request::sparam()进行安全参数获取 - SQL 防护: 通过模型类方法构建查询,避免 SQL 注入
- 权限校验:
setEditor验证数据归属ACCESC_BASE定义基础权限点
- 错误隔离: 错误提示统一通过
alert/error方法处理
最佳实践
- 模型规范: 保持
XXXAdmincp与XXXModel命名对应 - 配置驱动: 将按钮、状态等配置外置到
/etc/目录 - 分页优化: 大数据量表查询时,在
tableData中指定必要字段 - 权限细化: 在子类中扩展
ACCESC_BASE添加业务权限点
class OrderAdmincp extends AdmincpBase {
public $ACCESC_BASE = [
// 继承基础权限
...parent::$ACCESC_BASE,
// 扩展新权限
'EXPORT' => '导出权限',
'AUDIT' => '审核权限'
];
}