[TOC]
> admin模块有三个trait,分别为`AdminAuthTrait`,`AdminTreeTrait`,`AdminPhpOffice`,分别对应后台权限相关验证、树结构生成,Excel导出(目前)相关功能。
## AdminAuthTrait
### `checkLogin`(检查登录)方法
当前url如果不在`$loginExcept`变量内,则需要登录,`$loginExcept`变量的格式为 `应用名/控制器名/方法名`,示例代码如下:
```php
protected array $loginExcept = [
// 登录地址无需判断登录
'admin/auth/login',
];
```
### `checkAuth`(检查权限)方法
当前url如果不在`$authExcept`变量内,则需要登录,`$authExcept`变量的格式为 `应用名/控制器名/方法名`,示例代码如下:
```
protected array $authExcept = [
// 退出方法不需要权限
'admin/auth/logout',
];
```
### `checkOneDeviceLogin`(检查单设备登录)方法
如果想实现每个账号只能一个设备登录,只需要在后台`设置中心`-`后台设置`-`安全设置`中开启`单设备登录`即可,该设置调用此方法来实现单设备登录相关功能。
### `checkToken`(检查csrf token)方法
当开启CSRFToken检测的时候,会调用此方法来验证token。对应的前端刷新token的代码在/public/static/admin/js/admin.js中,对应的函数名为`refreshCsrfToken`,可自行查看该函数实现。
### `createLog`(创建日志)方法
创建用户操作日志调用该方法。
## AdminTreeTrait
> 该trait为5年前从网络上复制改造而成,未做优化处理,可自行查看内部实现,基本都有注释。
### `getLeftMenu`(获取左侧菜单)方法
页面左侧菜单为该方法获取,目前未做优化处理。
### `getBreadCrumb`(获取当前面包屑)方法
页面右上角面包屑为该方法获取,目前未做优化处理。
### `getTreeList`(获取树形数据列表)方法
例如多级分类,我们可以直接在控制器中写如下方法,即可实现树形数据展示。
~~~php
/**
* 列表
*/
public function index(Category $model)
{
$this->assign([
'data' => $this->getTreeList($model),
]);
return $this->fetch();
}
~~~
在视图中写如下代码即可:
```html
<div class="card-body table-responsive p-0">
<table class="table table-hover table-bordered dataTable text-nowrap">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox"
placeholder="全选/取消">
</th>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{$data|raw}
</tbody>
</table>
</div>
```
### `getSelectList`(获取树形选择数据列表)方法
例如添加文章的时候选择分类,但是分类是多级的,这个时候我们可以直接在控制器中方法中写如下方法,即可实现树形select。
~~~php
/**
* 添加
*/
public function add(Category $category)
{
// 上面代码省略
$this->assign([
// 生成树形选择option
'category_list' => $this->getTreeList($category),
]);
return $this->fetch();
}
~~~
前端表单相关代码:
```html
<div class="form-group row">
<label for="category_id" class="col-sm-2 control-label">用户等级</label>
<div class="col-sm-10 col-md-4 formInputDiv">
<select name="category_id" id="category_id" class="form-control select2bs4 fieldSelect" data-placeholder="请选择分类">
<option value=""></option>
{$categort_list|raw}
</select>
</div>
</div>
<script>
$('#categroy_id').select2({
theme: 'bootstrap4'
});
</script>
```
### `authorizeHtml`(获取角色授权页html)方法
角色授权页调用的方法,目前已知缺陷,当授权项和层级过多时,页面会比较长,不方便操作,计划后期改成折叠的tree形式。