buildAdmin的代码生成,很像是 fastadmin 的生成模式,当我们利用数据库生成了一个控制器的时候,我们可以看到, 它的生成代码很简洁
<?php
namespace app\admin\controller\askanswer;
use app\common\controller\Backend;
/**
* 回答管理
*/
class Answer extends Backend //控制器继承了 backend
{
/**
* Answer模型对象
* @var object
* @phpstan-var \app\admin\model\Answer
*/
//定义了一个 模型对象,也就是对应数据表的 模型
protected object $model;
//这里是在添加数据中 排除了一些,自动生成的字段, 在Backend中,有对这些字段的调用
protected array|string $preExcludeFields = ['id', 'create_time', 'update_time'];
//这里是设置了前端的快速搜索
protected string|array $quickSearchField = ['id'];
public function initialize(): void
{
parent::initialize(); //这里用了父类的 初始化方法, 做了一些 用户认证,权限判断,数据库连接检测等
$this->model = new \app\admin\model\Answer;
$this->request->filter('clean_xss'); //这里对 request 做了一次 xss 攻击的过滤
}
/**
* 若需重写查看、编辑、删除等方法,请复制 @see \app\admin\library\traits\Backend 中对应的方法至此进行重写
*/
}
接着我们来到,父类, backend
在追代码的过程中,我没有看到 跨域的操作, 因为fastadmin 在这里面是有跨域操作的一段代码的,后来经过 整块代码搜索, 才想起来, 这是tp8了, 是有中间键的,而fastadmin中是tp5.0,没有中间键的
真正的 增,删,改,查的代码 就在traits中
<?php
namespace app\admin\library\traits;
use Throwable;
use think\facade\Config;
/**
* 后台控制器trait类
* 已导入到 @see \app\common\controller\Backend 中
* 若需修改此类方法:请复制方法至对应控制器后进行重写
*/
trait Backend
{
/**
* 排除入库字段
* @param array $params
* @return array
*/
protected function excludeFields(array $params): array
{
if (!is_array($this->preExcludeFields)) {
$this->preExcludeFields = explode(',', (string)$this->preExcludeFields);
}
foreach ($this->preExcludeFields as $field) {
if (array_key_exists($field, $params)) {
unset($params[$field]);
}
}
return $params;
}
/**
* 查看
* @throws Throwable
*/
public function index(): void
{
if ($this->request->param('select')) {
$this->select();
}
list($where, $alias, $limit, $order) = $this->queryBuilder();
$res = $this->model
->field($this->indexField)
->withJoin($this->withJoinTable, $this->withJoinType)
->alias($alias)
->where($where)
->order($order)
->paginate($limit);
$this->success('', [
'list' => $res->items(),
'total' => $res->total(),
'remark' => get_route_remark(),
]);
}
/**
* 添加
*/
public function add(): void
{
if ($this->request->isPost()) {
$data = $this->request->post();
if (!$data) {
$this->error(__('Parameter %s can not be empty', ['']));
}
$data = $this->excludeFields($data);
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
$data[$this->dataLimitField] = $this->auth->id;
}
$result = false;
$this->model->startTrans();
try {
// 模型验证
if ($this->modelValidate) {
$validate = str_replace("\\model\\", "\\validate\\", get_class($this->model));
if (class_exists($validate)) {
$validate = new $validate;
if ($this->modelSceneValidate) $validate->scene('add');
$validate->check($data);
}
}
$result = $this->model->save($data);
$this->model->commit();
} catch (Throwable $e) {
$this->model->rollback();
$this->error($e->getMessage());
}
if ($result !== false) {
$this->success(__('Added successfully'));
} else {
$this->error(__('No rows were added'));
}
}
$this->error(__('Parameter error'));
}
/**
* 编辑
* @throws Throwable
*/
public function edit(): void
{
$id = $this->request->param($this->model->getPk());
$row = $this->model->find($id);
if (!$row) {
$this->error(__('Record not found'));
}
$dataLimitAdminIds = $this->getDataLimitAdminIds();
if ($dataLimitAdminIds && !in_array($row[$this->dataLimitField], $dataLimitAdminIds)) {
$this->error(__('You have no permission'));
}
if ($this->request->isPost()) {
$data = $this->request->post();
if (!$data) {
$this->error(__('Parameter %s can not be empty', ['']));
}
$data = $this->excludeFields($data);
$result = false;
$this->model->startTrans();
try {
// 模型验证
if ($this->modelValidate) {
$validate = str_replace("\\model\\", "\\validate\\", get_class($this->model));
if (class_exists($validate)) {
$validate = new $validate;
if ($this->modelSceneValidate) $validate->scene('edit');
$validate->check($data);
}
}
$result = $row->save($data);
$this->model->commit();
} catch (Throwable $e) {
$this->model->rollback();
$this->error($e->getMessage());
}
if ($result !== false) {
$this->success(__('Update successful'));
} else {
$this->error(__('No rows updated'));
}
}
$this->success('', [
'row' => $row
]);
}
/**
* 删除
* @param array $ids
* @throws Throwable
*/
public function del(array $ids = []): void
{
if (!$this->request->isDelete() || !$ids) {
$this->error(__('Parameter error'));
}
$where = [];
$dataLimitAdminIds = $this->getDataLimitAdminIds();
if ($dataLimitAdminIds) {
$where[] = [$this->dataLimitField, 'in', $dataLimitAdminIds];
}
$pk = $this->model->getPk();
$where[] = [$pk, 'in', $ids];
$count = 0;
$data = $this->model->where($where)->select();
$this->model->startTrans();
try {
foreach ($data as $v) {
$count += $v->delete();
}
$this->model->commit();
} catch (Throwable $e) {
$this->model->rollback();
$this->error($e->getMessage());
}
if ($count) {
$this->success(__('Deleted successfully'));
} else {
$this->error(__('No rows were deleted'));
}
}
/**
* 排序
* @param int $id 排序主键值
* @param int $targetId 排序位置主键值
* @throws Throwable
*/
public function sortable(int $id, int $targetId): void
{
$dataLimitAdminIds = $this->getDataLimitAdminIds();
if ($dataLimitAdminIds) {
$this->model->where($this->dataLimitField, 'in', $dataLimitAdminIds);
}
$row = $this->model->find($id);
$target = $this->model->find($targetId);
if (!$row || !$target) {
$this->error(__('Record not found'));
}
if ($row[$this->weighField] == $target[$this->weighField]) {
$autoSortEqWeight = is_null($this->autoSortEqWeight) ? Config::get('buildadmin.auto_sort_eq_weight') : $this->autoSortEqWeight;
if (!$autoSortEqWeight) {
$this->error(__('Invalid collation because the weights of the two targets are equal'));
}
// 自动重新整理排序
$all = $this->model->select();
foreach ($all as $item) {
$item[$this->weighField] = $item[$this->model->getPk()];
$item->save();
}
unset($all);
// 重新获取
$row = $this->model->find($id);
$target = $this->model->find($targetId);
}
$backup = $target[$this->weighField];
$target[$this->weighField] = $row[$this->weighField];
$row[$this->weighField] = $backup;
$row->save();
$target->save();
$this->success();
}
/**
* 加载为select(远程下拉选择框)数据,默认还是走$this->index()方法
* 必要时请在对应控制器类中重写
*/
public function select(): void
{
}
}