💾 数据更新助手

SaveHelper 是 ThinkAdmin 提供的数据更新助手,专注于简化数据状态的更新操作,如数据禁用、启用以及状态更改等。通过简洁的接口和直观的操作,快速实现数据状态的更新。

🚀 主要功能

  • 状态更新: 快速更新数据状态(启用/禁用等)
  • 批量处理: 支持批量更新多条数据记录
  • 安全验证: 完善的数据验证和权限控制
  • 错误处理: 详细的错误处理和日志记录
  • 事务支持: 支持数据库事务操作

📋 使用场景

  • 用户状态管理(启用/禁用用户)
  • 商品状态管理(上架/下架商品)
  • 订单状态管理(处理/完成订单)
  • 内容状态管理(发布/隐藏内容)
  • 批量数据操作

⚙️ 工作原理

数据定位

  • 根据传入的数据 ID 和条件自动定位数据记录
  • 支持主键字段和自定义查询条件
  • 确保数据操作的安全性和准确性
  • 支持批量数据定位

状态更新

  • 提供清晰的状态选项供用户选择
  • 自动执行状态更新操作
  • 支持单条和批量数据更新
  • 支持自定义状态值

安全保护

  • 数据验证和权限控制
  • 防止恶意数据修改
  • 详细的操作日志记录
  • 支持操作权限验证

事务处理

  • 支持数据库事务操作
  • 确保数据一致性
  • 支持回滚机制
  • 异常处理机制

具体实现原理

为了充分利用 SaveHelper 数据更新助手在模型(Model)和控制器(Controller)中的功能,系统进行了以下优化:

  • 模型继承:若需在模型中使用 SaveHelper 快捷查询器,该模型应继承 \think\admin\Model 类。这样做可以确保模型拥有 SaveHelper 提供的所有功能,方便进行数据的快速保存和查询操作。
  • 控制器继承:对于需要使用 SaveHelper 快捷查询器的控制器,应继承 \think\admin\Controller 类。通过继承这个基类,控制器可以方便地调用 SaveHelper 的相关方法,实现对数据的快速处理和响应。
  • 前端数据传递:前端需要传递需要修改的数据 ID 以及数据状态值给后端。为了确保数据的安全性和准确性,强烈建议前端传递第二个参数(如操作类型、验证信息等)。这样可以为后端提供更多的上下文信息,有助于后端进行更精确的数据处理和验证。
  • 数据安全考虑:为了防止数据被恶意修改,使用 SaveHelper 时指定第二个参数是非常必要的。此外,还可以结合验证器 _vali() 和限定条件 $where 变量来进一步确保数据的安全性。验证器可以对数据进行严格的校验,确保只有符合规则的数据才能被保存;而 $where 变量则可以限制操作的范围,防止对不应修改的数据进行操作。

通过以上优化,SaveHelper 快捷查询器在模型和控制器中的使用变得更加灵活和安全,同时前端传递的数据也得到了更好的处理和验证,提升了整个系统的稳定性和安全性。

// 1.0 模型用法
// 参数 $data 为待修改数据
// 参数 $field 为主键字段
// 参数 $where 为修改查询条件
MyModel::mSave($data, $field, $where);

// 1.1 模型通用更新
MyModel::mSave();

// 1.2 配合验证器使用
MyModel::mSave($this->_vali([
    'status.require' => '修改状态不能为空!',
    'status.in:0,1'  => '修改状态范围无效!',
]));

// 1.3 配置验证器和限制条件
MyModel::mSave($this->_vali([
    'status.require' => '修改状态不能为空!',
    'status.in:0,1'  => '修改状态范围无效!',
]), 'id', [
    'uuid'    => $this->uuid,
    'deleted' => 0,
]);


// 2.0 控制器用法
// 参数 $dbQuery 为模型名称
// 参数 $data 为待修改数据
// 参数 $field 为主键字段
// 参数 $where 为修改查询条件
$this->_save($dbQuery, $data, $field, $where);

// 2.1 通用修改器
$this->_save('MyModel');

// 2.2 配合验证器使用
$this->_save('MyModel', $this->_vali([
    'status.require' => '修改状态不能为空!',
    'status.in:0,1'  => '修改状态范围无效!',
]));

另外控制器也提供了结果回调操作

/**
 * 修改数据状态
 * @auth true 
 */
public function save(){
    MyModel::mSave($this->_vali([
        'status.require' => '修改状态不能为空!',
        'status.in:0,1'  => '修改状态范围无效!',
    ]));
}

### 控制器通常结果回调处理
protected function _save_result(bool $result){
  // 可以根据 $result 状态返回结果 
  // 失败 $this->error(MESSAGE);
  // 成功 $this->success(MESSAGE);
}

### 当一个控制器存在多个 save 操作时,可以指定回调前缀
protected function _state_save_result(bool $result){
  // 可以根据 $result 状态返回结果 
  // 失败 $this->error(MESSAGE);
  // 成功 $this->success(MESSAGE);
}

如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可使用 data-action 来与 SaveHelper 配合使用。

🔧 前端配合使用

自动状态更新

<!-- 使用 data-action 属性自动更新状态 -->
<button data-action="{:url('save')}" 
        data-value="id#{{d.id}};status#1" 
        data-confirm="确认要启用这条记录吗?"
        class="layui-btn layui-btn-sm">启用</button>

批量状态更新

<!-- 批量更新多条记录 -->
<button data-action="{:url('save')}" 
        data-value="id#1,2,3;status#1" 
        data-confirm="确认要批量启用这些记录吗?"
        class="layui-btn layui-btn-sm">批量启用</button>

前端提交格式说明

前端提交上来的内容 data-value 支持多组数据,以英文分号 ; 分隔,键与值以英文 # 分隔,如:data-value="id#1;status#0;"

格式说明:

  • 单条记录:data-value="id#1;status#0"
  • 多条记录:data-value="id#1,2,3;status#1"
  • 多字段更新:data-value="id#1;status#1;name#test"
最近更新:
Contributors: 邹景立