Anyon e634118a22 refactor(plugin): 迁移 v8 插件化组件体系
将 v6 中直接放在本地 app 的后台与微信能力迁移为 v8 插件组件,并把运行时基础能力沉淀到独立插件包。

主要内容:

- 新增 think-library、system、worker、static、install 等基础插件包。

- 新增 account、payment、wechat-client、wechat-service、wemall、wuma 等业务插件包。

- 移除 v6 的 app/admin 与 app/wechat 本地应用实现,改由插件分发接管。

- 将 Helper 能力彻底并入 System,统一为 plugin\system\helper\* 命名空间。

- 同步插件迁移发布清单与根 route 占位,保证安装发布流程可复现。
2026-05-08 15:30:46 +08:00

106 lines
3.4 KiB
PHP

<?php
declare(strict_types=1);
/**
* +----------------------------------------------------------------------
* | ThinkAdmin Plugin for ThinkAdminDeveloper
* +----------------------------------------------------------------------
* | Copyright (c) 2014~2026 ThinkAdmin [ thinkadmin.top ]
* +----------------------------------------------------------------------
* | Official Website: https://thinkadmin.top
* +----------------------------------------------------------------------
* | Licensed: https://mit-license.org
* | Disclaimer: https://thinkadmin.top/disclaimer
* | Vip Rights: https://thinkadmin.top/vip-introduce
* +----------------------------------------------------------------------
* | Gitee Repository: https://gitee.com/zoujingli/ThinkAdmin
* | Github Repository: https://github.com/zoujingli/ThinkAdmin
* +----------------------------------------------------------------------
*/
namespace think\admin\helper;
use think\admin\Helper;
use think\admin\model\QueryFactory;
use think\db\BaseQuery;
use think\db\Query;
use think\Model;
use think\model\concern\SoftDelete;
/**
* 通用删除管理器.
* @class DeleteHelper
*/
class DeleteHelper extends Helper
{
/**
* @param array|mixed $where
*/
public function init(BaseQuery|Model|string $dbQuery, string $field = '', mixed $where = [])
{
$query = QueryFactory::build($dbQuery);
if (!$query instanceof Query) {
throw new \InvalidArgumentException('DeleteHelper only supports relational Query instances.');
}
$field = $field ?: ($query->getPk() ?: 'id');
$value = $this->app->request->post($field);
if (!empty($where)) {
$query->where($where);
}
if (!isset($where[$field]) && $value !== null && $value !== '') {
$query->whereIn($field, is_array($value) ? $value : str2arr(strval($value)));
}
if ($this->class->callback('_delete_filter', $query, $where) === false) {
return false;
}
if (empty($query->getOptions()['where'] ?? [])) {
$this->class->error('数据删除失败!');
}
$model = $query->getModel();
$result = $this->deleteRecords($query, $model);
if ($result) {
if ($model instanceof \think\admin\Model) {
$model->onAdminDelete(strval($value));
}
}
if ($this->class->callback('_delete_result', $result) === false) {
return $result;
}
if ($result !== false) {
$this->class->success('数据删除成功!', '');
} else {
$this->class->error('数据删除失败!');
}
}
private function deleteRecords(Query $query, ?Model $model = null): bool
{
if ($model instanceof Model && $this->usesSoftDelete($model)) {
$result = false;
foreach ((clone $query)->select() as $item) {
$result = $item->delete() || $result;
}
return $result;
}
return $query->delete() !== false;
}
private function usesSoftDelete(Model $model): bool
{
$traits = [];
foreach ([get_class($model), ...class_parents($model)] as $class) {
$traits = array_merge($traits, class_uses($class) ?: []);
}
return in_array(SoftDelete::class, array_values(array_unique($traits)), true)
&& $model->getOption('deleteTime', 'delete_time') !== false;
}
}