From 10046031e6a41282eb01f3e803962c804f21a3b3 Mon Sep 17 00:00:00 2001 From: augushong Date: Mon, 29 Nov 2021 18:26:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9D=E5=A7=8B=E5=8C=96ad?= =?UTF-8?q?min=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E8=A1=8C;=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E5=A3=B0?= =?UTF-8?q?=E6=98=8E;=E5=A2=9E=E5=8A=A0=E8=A1=A8=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=85=B3=E8=81=94=E7=9A=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .example.env | 4 +- .gitignore | 2 +- app/admin/controller/system/Admin.php | 2 +- app/common/command/Curd.php | 102 +++++++-------------- app/common/command/admin/ResetPassword.php | 41 +++++++++ app/common/tools/BuildCurd.php | 72 +++++++++++++++ config/console.php | 4 + config/database.php | 4 +- 8 files changed, 157 insertions(+), 74 deletions(-) create mode 100644 app/common/command/admin/ResetPassword.php create mode 100644 app/common/tools/BuildCurd.php diff --git a/.example.env b/.example.env index f9f486d..1427a9b 100644 --- a/.example.env +++ b/.example.env @@ -6,13 +6,13 @@ DEFAULT_TIMEZONE=Asia/Shanghai [DATABASE] TYPE=mysql HOSTNAME=host.docker.internal -DATABASE=easyadmin +DATABASE=ulthon USERNAME=root PASSWORD=root HOSTPORT=3306 CHARSET=utf8 DEBUG=true -PREFIX=ea_ +PREFIX=ul_ [LANG] default_lang=zh-cn diff --git a/.gitignore b/.gitignore index 09716ec..17ce0d5 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ composer.phar app/test/ /vendor /runtime -ul.db +ul.db \ No newline at end of file diff --git a/app/admin/controller/system/Admin.php b/app/admin/controller/system/Admin.php index 17331d1..a761519 100644 --- a/app/admin/controller/system/Admin.php +++ b/app/admin/controller/system/Admin.php @@ -128,10 +128,10 @@ class Admin extends AdminController */ public function password($id) { - $this->checkPostRequest(); $row = $this->model->find($id); empty($row) && $this->error('数据不存在'); if ($this->request->isAjax()) { + $this->checkPostRequest(); $post = $this->request->post(); $rule = [ 'password|登录密码' => 'require', diff --git a/app/common/command/Curd.php b/app/common/command/Curd.php index e8552c5..7d6f6e6 100644 --- a/app/common/command/Curd.php +++ b/app/common/command/Curd.php @@ -15,7 +15,7 @@ namespace app\common\command; use app\admin\model\SystemNode; use EasyAdmin\console\CliEcho; -use EasyAdmin\curd\BuildCurd; +use app\common\tools\BuildCurd; use think\console\Command; use think\console\Input; use think\console\input\Option; @@ -32,26 +32,6 @@ class Curd extends Command ->addOption('controllerFilename', 'c', Option::VALUE_REQUIRED, '控制器文件名', null) ->addOption('modelFilename', 'm', Option::VALUE_REQUIRED, '主表模型文件名', null) # - ->addOption('checkboxFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '复选框字段后缀', null) - ->addOption('radioFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '单选框字段后缀', null) - ->addOption('imageFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '单图片字段后缀', null) - ->addOption('imagesFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '多图片字段后缀', null) - ->addOption('fileFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '单文件字段后缀', null) - ->addOption('filesFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '多文件字段后缀', null) - ->addOption('dateFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '时间字段后缀', null) - ->addOption('switchFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '开关的字段', null) - ->addOption('selectFileds', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '下拉的字段', null) - ->addOption('editorFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '富文本的字段', null) - ->addOption('sortFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '排序的字段', null) - ->addOption('ignoreFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '忽略的字段', null) - # - ->addOption('relationTable', 'r', Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联表名', null) - ->addOption('foreignKey', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联外键', null) - ->addOption('primaryKey', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联主键', null) - ->addOption('relationModelFilename', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联模型文件名', null) - ->addOption('relationOnlyFileds', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联模型中只显示的字段', null) - ->addOption('relationBindSelect', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联模型中的字段用于主表外键的表单下拉选择', null) - # ->addOption('force', 'f', Option::VALUE_REQUIRED, '强制覆盖模式', 0) ->addOption('delete', 'd', Option::VALUE_REQUIRED, '删除模式', 0) ->setDescription('一键curd命令服务'); @@ -64,39 +44,10 @@ class Curd extends Command $controllerFilename = $input->getOption('controllerFilename'); $modelFilename = $input->getOption('modelFilename'); - $checkboxFieldSuffix = $input->getOption('checkboxFieldSuffix'); - $radioFieldSuffix = $input->getOption('radioFieldSuffix'); - $imageFieldSuffix = $input->getOption('imageFieldSuffix'); - $imagesFieldSuffix = $input->getOption('imagesFieldSuffix'); - $fileFieldSuffix = $input->getOption('fileFieldSuffix'); - $filesFieldSuffix = $input->getOption('filesFieldSuffix'); - $dateFieldSuffix = $input->getOption('dateFieldSuffix'); - $switchFields = $input->getOption('switchFields'); - $selectFileds = $input->getOption('selectFileds'); - $sortFields = $input->getOption('sortFields'); - $ignoreFields = $input->getOption('ignoreFields'); - - $relationTable = $input->getOption('relationTable'); - $foreignKey = $input->getOption('foreignKey'); - $primaryKey = $input->getOption('primaryKey'); - $relationModelFilename = $input->getOption('relationModelFilename'); - $relationOnlyFileds = $input->getOption('relationOnlyFileds'); - $relationBindSelect = $input->getOption('relationBindSelect'); - $force = $input->getOption('force'); $delete = $input->getOption('delete'); - $relations = []; - foreach ($relationTable as $key => $val) { - $relations[] = [ - 'table' => $relationTable[$key], - 'foreignKey' => isset($foreignKey[$key]) ? $foreignKey[$key] : null, - 'primaryKey' => isset($primaryKey[$key]) ? $primaryKey[$key] : null, - 'modelFilename' => isset($relationModelFilename[$key]) ? $relationModelFilename[$key] : null, - 'onlyFileds' => isset($relationOnlyFileds[$key]) ? explode(",", $relationOnlyFileds[$key]) : [], - 'relationBindSelect' => isset($relationBindSelect[$key]) ? $relationBindSelect[$key] : null, - ]; - } + if (empty($table)) { CliEcho::error('请设置主表'); @@ -108,23 +59,40 @@ class Curd extends Command ->setTable($table) ->setForce($force); + $columns = $build->getTableColumns(); + + + $relations = []; + + + foreach ($columns as $field => $column) { + + if (isset($column['formType']) && $column['formType'] == 'relation') { + $define = $column['define']; + + if (!isset($define['table'])) { + CliEcho::error("关联字段{$field}没有设置关联表名称"); + return false; + } + + $relations[] = [ + 'table' => $define['table'], + 'foreignKey' => $field, + 'primaryKey' => $define['primaryKey'] ?? null, + 'modelFilename' => $define['modelFilename'] ?? null, + 'onlyFileds' => isset($define['onlyFileds']) ? explode("|", $define['onlyFileds']) : [], + 'relationBindSelect' => $define['relationBindSelect'] ?? null, + ]; + } + } + + !empty($controllerFilename) && $build = $build->setControllerFilename($controllerFilename); !empty($modelFilename) && $build = $build->setModelFilename($modelFilename); - !empty($checkboxFieldSuffix) && $build = $build->setCheckboxFieldSuffix($checkboxFieldSuffix); - !empty($radioFieldSuffix) && $build = $build->setRadioFieldSuffix($radioFieldSuffix); - !empty($imageFieldSuffix) && $build = $build->setImageFieldSuffix($imageFieldSuffix); - !empty($imagesFieldSuffix) && $build = $build->setImagesFieldSuffix($imagesFieldSuffix); - !empty($fileFieldSuffix) && $build = $build->setFileFieldSuffix($fileFieldSuffix); - !empty($filesFieldSuffix) && $build = $build->setFilesFieldSuffix($filesFieldSuffix); - !empty($dateFieldSuffix) && $build = $build->setDateFieldSuffix($dateFieldSuffix); - !empty($switchFields) && $build = $build->setSwitchFields($switchFields); - !empty($selectFileds) && $build = $build->setSelectFileds($selectFileds); - !empty($sortFields) && $build = $build->setSortFields($sortFields); - !empty($ignoreFields) && $build = $build->setIgnoreFields($ignoreFields); - + foreach ($relations as $relation) { - $build = $build->setRelation($relation['table'], $relation['foreignKey'], $relation['primaryKey'], $relation['modelFilename'], $relation['onlyFileds'],$relation['relationBindSelect']); + $build = $build->setRelation($relation['table'], $relation['foreignKey'], $relation['primaryKey'], $relation['modelFilename'], $relation['onlyFileds'], $relation['relationBindSelect']); } $build = $build->render(); @@ -132,7 +100,7 @@ class Curd extends Command if (!$delete) { $result = $build->create(); - if($force){ + if ($force) { $output->info(">>>>>>>>>>>>>>>"); foreach ($fileList as $key => $val) { $output->info($key); @@ -169,6 +137,4 @@ class Curd extends Command return false; } } - - -} \ No newline at end of file +} diff --git a/app/common/command/admin/ResetPassword.php b/app/common/command/admin/ResetPassword.php new file mode 100644 index 0000000..de41793 --- /dev/null +++ b/app/common/command/admin/ResetPassword.php @@ -0,0 +1,41 @@ +setName('admin:resetPassword') + ->setDescription('the admin:resetPassword command'); + } + + protected function execute(Input $input, Output $output) + { + // 指令输出 + $output->writeln('admin:resetPassword'); + + + $model_admin = SystemAdmin::where('username', 'admin')->find(); + if (empty($model_admin)) { + $output->writeln('管理员不存在'); + return false; + } + + $model_admin->save([ + 'password' => password(123456) + ]); + + $output->writeln('修改成功'); + } +} diff --git a/app/common/tools/BuildCurd.php b/app/common/tools/BuildCurd.php new file mode 100644 index 0000000..59a61a6 --- /dev/null +++ b/app/common/tools/BuildCurd.php @@ -0,0 +1,72 @@ +tableColumns; + } + + + /** + * 构建初始化字段信息 + * @param $colum + * @return mixed + */ + protected function buildColum(&$colum) + { + + $string = $colum['comment']; + + // 处理定义类型 + preg_match('/{[\s\S]*?}/i', $string, $formTypeMatch); + if (!empty($formTypeMatch) && isset($formTypeMatch[0])) { + $colum['comment'] = str_replace($formTypeMatch[0], '', $colum['comment']); + $formType = trim(str_replace('}', '', str_replace('{', '', $formTypeMatch[0]))); + if (in_array($formType, $this->formTypeArray)) { + $colum['formType'] = $formType; + } + } + + // 处理默认定义 + preg_match('/\([\s\S]*?\)/i', $string, $defineMatch); + if (!empty($formTypeMatch) && isset($defineMatch[0])) { + $colum['comment'] = str_replace($defineMatch[0], '', $colum['comment']); + + if (isset($colum['formType']) && in_array($colum['formType'], ['images', 'files', 'select', 'switch', 'radio', 'checkbox', 'date', 'relation'])) { + $define = str_replace(')', '', str_replace('(', '', $defineMatch[0])); + + if (in_array($colum['formType'], ['select', 'switch', 'radio', 'checkbox', 'relation'])) { + $formatDefine = []; + $explodeArray = explode(',', $define); + foreach ($explodeArray as $vo) { + $voExplodeArray = explode(':', $vo); + if (count($voExplodeArray) == 2) { + $formatDefine[trim($voExplodeArray[0])] = trim($voExplodeArray[1]); + } + } + !empty($formatDefine) && $colum['define'] = $formatDefine; + } else { + $colum['define'] = $define; + } + } + } + + $colum['comment'] = trim($colum['comment']); + + return $colum; + } +} diff --git a/config/console.php b/config/console.php index f5ab314..4c7c02a 100644 --- a/config/console.php +++ b/config/console.php @@ -2,11 +2,15 @@ // +---------------------------------------------------------------------- // | 控制台配置 // +---------------------------------------------------------------------- + +use app\common\command\admin\ResetPassword; + return [ // 指令定义 'commands' => [ 'curd' => 'app\common\command\Curd', 'node' => 'app\common\command\Node', 'OssStatic' => 'app\common\command\OssStatic', + ResetPassword::class ], ]; diff --git a/config/database.php b/config/database.php index 0a536f5..3970f20 100644 --- a/config/database.php +++ b/config/database.php @@ -24,7 +24,7 @@ return [ // 服务器地址 'hostname' => Env::get('database.hostname', 'host.docker.internal'), // 数据库名 - 'database' => Env::get('database.database', 'easyadmin'), + 'database' => Env::get('database.database', 'ulthon'), // 用户名 'username' => Env::get('database.username', 'root'), // 密码 @@ -36,7 +36,7 @@ return [ // 数据库编码默认采用utf8 'charset' => Env::get('database.charset', 'utf8'), // 数据库表前缀 - 'prefix' => Env::get('database.prefix', 'ea_'), + 'prefix' => Env::get('database.prefix', 'ul_'), // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0,