From 8b760a3e92484c52bad7c4760ba036848ac34f15 Mon Sep 17 00:00:00 2001 From: liaofei <136327134@qq.com> Date: Wed, 12 Apr 2023 19:22:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=9F=E6=88=90crud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crmeb/app/Request.php | 1 + .../controller/v1/setting/SystemCrud.php | 16 ++++- .../services/system/SystemCrudServices.php | 65 ++++++++++++++----- crmeb/crmeb/services/crud/Controller.php | 3 +- crmeb/crmeb/services/crud/Make.php | 9 ++- crmeb/crmeb/services/crud/Model.php | 23 +++++++ crmeb/crmeb/services/crud/Service.php | 6 +- .../crud/stubs/controller/CrudController.stub | 2 +- .../services/crud/stubs/dao/CrudDao.stub | 4 +- 9 files changed, 104 insertions(+), 25 deletions(-) diff --git a/crmeb/app/Request.php b/crmeb/app/Request.php index 95ed5edfb..1c1aed939 100644 --- a/crmeb/app/Request.php +++ b/crmeb/app/Request.php @@ -78,6 +78,7 @@ class Request extends \think\Request $farr = [ "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU", "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", + '/phar/is', "/select|join|where|drop|like|modify|rename|insert|update|table|database|alter|truncate|\'|\/\*|\.\.\/|\.\/|union|into|load_file|outfile/is" ]; if (is_array($str)) { diff --git a/crmeb/app/adminapi/controller/v1/setting/SystemCrud.php b/crmeb/app/adminapi/controller/v1/setting/SystemCrud.php index e62f10b6c..a0d0c3560 100644 --- a/crmeb/app/adminapi/controller/v1/setting/SystemCrud.php +++ b/crmeb/app/adminapi/controller/v1/setting/SystemCrud.php @@ -129,7 +129,7 @@ class SystemCrud extends AuthController return app('json')->fail('表不存在'); } foreach ($field as $item) { - $tableField[] = ['value' => $item['name'], 'comment' => $item['comment'], 'label' => $item['name']]; + $tableField[] = ['value' => $item['name'], 'all' => $item, 'comment' => $item['comment'], 'label' => $item['name']]; } } @@ -156,15 +156,25 @@ class SystemCrud extends AuthController $routeName = 'crud/' . Str::snake($info->table_name); + $column = $this->services->getColumnNamesList($info->table_name); + $key = 'id'; + foreach ($column as $value) { + if ($value['primaryKey']) { + $key = $value['name']; + break; + } + } + $make = $this->services->makeFile($info->table_name, $routeName, false, [ 'menuName' => $info->name, + 'key' => $key, 'fromField' => $info->field['fromField'] ?? [], 'columnField' => $info->field['columnField'] ?? [], ]); - + $data = []; foreach ($make as $item) { - $item['name'] = pathinfo($item['path'])['basename'] ?? ''; + $item['name'] = $item['path']; $data[] = $item; } diff --git a/crmeb/app/services/system/SystemCrudServices.php b/crmeb/app/services/system/SystemCrudServices.php index a0cfba82a..76c00e553 100644 --- a/crmeb/app/services/system/SystemCrudServices.php +++ b/crmeb/app/services/system/SystemCrudServices.php @@ -147,6 +147,28 @@ class SystemCrudServices extends BaseServices return $columns; } + /** + * @param array $data + * @return array + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/12 + */ + public function valueReplace(array $data) + { + $replace = ['phar://']; + $newData = []; + foreach ($data as $key => $item) { + if (is_array($item)) { + $item = $this->valueReplace($item); + } else { + $item = str_replace($replace, '', $item); + } + $newData[str_replace($replace, '', $key)] = $item; + } + return $newData; + } + /** * 创建 * @param array $data @@ -159,8 +181,9 @@ class SystemCrudServices extends BaseServices { $tableName = $data['tableName']; $tableComment = $data['tableComment']; - $tableField = $data['tableField']; - $filePath = $data['filePath']; + $tableField = $this->valueReplace($data['tableField']); + $filePath = $this->valueReplace($data['filePath']); + //创建数据库 if ($tableField && !$data['isTable']) { @@ -177,6 +200,13 @@ class SystemCrudServices extends BaseServices throw new ValidateException('请先创建' . $tableName . '表'); } + foreach ($column as $value) { + if ($value['primaryKey']) { + $data['key'] = $value['name']; + break; + } + } + $routeName = 'crud/' . Str::snake($tableName); $uniqueAuth = $routeName . '-index-list'; @@ -353,29 +383,34 @@ class SystemCrudServices extends BaseServices { $options['fromField'] = is_array($options['fromField']) ? $options['fromField'] : []; $options['columnField'] = is_array($options['columnField']) ? $options['columnField'] : []; - //生成控制器 - $controller = app()->make(Controller::class); - [$controllerContent, $controllerPath] = $controller->setFilePathName($filePath['controller'] ?? '')->isMake($isMake)->handle($tableName); //生成模型 $model = app()->make(Model::class); - [$modelContent, $modelPath] = $model->setFilePathName($filePath['model'] ?? '')->isMake($isMake)->handle($tableName); + [$modelContent, $modelPath, $usePath, $nameCamel] = $model->setFilePathName($filePath['model'] ?? '')->isMake($isMake)->handle($tableName); //生成dao $dao = app()->make(Dao::class); - [$daoContent, $daoPath] = $dao->setFilePathName($filePath['dao'] ?? '')->isMake($isMake)->handle($tableName); + [$daoContent, $daoPath, $usePath, $nameCamel] = $dao->setFilePathName($filePath['dao'] ?? '')->isMake($isMake)->handle($tableName, [ + 'usePath' => $usePath . $nameCamel, + ]); + //生成service + $service = app()->make(Service::class); + [$serviceContent, $servicePath, $usePath] = $service->setFilePathName($filePath['service'] ?? '')->isMake($isMake)->handle($tableName, [ + 'field' => $options['fromField'], + 'usePath' => $usePath, + ]); + //生成验证器 + $validate = app()->make(Validate::class); + [$validateContent, $validatePath] = $validate->setFilePathName($filePath['validate'] ?? '')->isMake($isMake)->handle($tableName); + //生成控制器 + $controller = app()->make(Controller::class); + [$controllerContent, $controllerPath] = $controller->setFilePathName($filePath['controller'] ?? '')->isMake($isMake)->handle($tableName, [ + 'usePath' => $usePath + ]); //生成路由 $route = app()->make(Route::class); [$routeContent, $routePath] = $route->setFilePathName($filePath['route'] ?? '')->isMake($isMake)->handle($tableName, [ 'menus' => $options['menuName'], 'route' => $routeName ]); - //生成service - $service = app()->make(Service::class); - [$serviceContent, $servicePath] = $service->setFilePathName($filePath['service'] ?? '')->isMake($isMake)->handle($tableName, [ - 'field' => $options['fromField'], - ]); - //生成验证器 - $validate = app()->make(Validate::class); - [$validateContent, $validatePath] = $validate->setFilePathName($filePath['validate'] ?? '')->isMake($isMake)->handle($tableName); //生成前台路由 $viewRouter = app()->make(ViewRouter::class); [$routerContent, $routerPath] = $viewRouter->setFilePathName($filePath['router'] ?? '')->isMake($isMake)->handle($tableName, [ diff --git a/crmeb/crmeb/services/crud/Controller.php b/crmeb/crmeb/services/crud/Controller.php index 68926aab1..e96a30045 100644 --- a/crmeb/crmeb/services/crud/Controller.php +++ b/crmeb/crmeb/services/crud/Controller.php @@ -94,12 +94,13 @@ class Controller extends Make $this->value['name'] = $className; $this->value['path'] = $this->getfolderPath($path); $this->value['content-php'] = $contentPhp; + $this->value['use-php'] = "use " . $options['usePath'] . ";\n"; $contentStr = str_replace($this->var, $this->value, $contentController); $filePath = $this->getFilePathName($path, $this->value['nameCamel']); - return [$this->makeFile($filePath, $contentStr), $this->filePathName ?: $filePath]; + return [$this->makeFile($filePath, $contentStr), $this->filePathName ?: $filePath, $this->value['path']]; } /** diff --git a/crmeb/crmeb/services/crud/Make.php b/crmeb/crmeb/services/crud/Make.php index 765154a2e..5c743c3c1 100644 --- a/crmeb/crmeb/services/crud/Make.php +++ b/crmeb/crmeb/services/crud/Make.php @@ -236,7 +236,12 @@ abstract class Make $filePath = $this->getFilePathName($path, $this->value['nameCamel']); - return [$this->makeFile($filePath, $contentStr), $this->filePathName ?: $filePath]; + return [ + $this->makeFile($filePath, $contentStr), + $this->filePathName ?: $filePath, + $this->value['path'] ?? '', + $this->value['nameCamel'] + ]; } /** @@ -430,7 +435,7 @@ abstract class Make if (is_file($pathname)) { throw new CrudException($this->name . ':' . $pathname . ' already exists!'); } - + try { if (!is_dir(dirname($pathname))) { mkdir(dirname($pathname), 0755, true); diff --git a/crmeb/crmeb/services/crud/Model.php b/crmeb/crmeb/services/crud/Model.php index 8ad46680d..3a4a5a813 100644 --- a/crmeb/crmeb/services/crud/Model.php +++ b/crmeb/crmeb/services/crud/Model.php @@ -40,6 +40,29 @@ class Model extends Make return 'app' . DS . 'model' . DS . 'crud'; } + + /** + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/12 + * @param string $name + * @param array $options + * @return array|mixed|void + */ + public function handle(string $name, array $options = []) + { + $this->value['key'] = $options['key'] ?? 'id'; + return parent::handle($name, $options); + } + + /** + * @param string $path + * @param string $name + * @return string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/4/12 + */ protected function getFilePathName(string $path, string $name): string { $path = ltrim(str_replace('\\', '/', $path), '/'); diff --git a/crmeb/crmeb/services/crud/Service.php b/crmeb/crmeb/services/crud/Service.php index b18d95c9a..f940dc313 100644 --- a/crmeb/crmeb/services/crud/Service.php +++ b/crmeb/crmeb/services/crud/Service.php @@ -92,7 +92,11 @@ class Service extends Make $filePath = $this->getFilePathName($path, $this->value['nameCamel']); - return [$this->makeFile($filePath, $contentStr), $this->filePathName ?: $filePath]; + return [ + $this->makeFile($filePath, $contentStr), + $this->filePathName ?: $filePath, + $this->baseDir . '\\' . $this->value['nameCamel'] + ]; } /** diff --git a/crmeb/crmeb/services/crud/stubs/controller/CrudController.stub b/crmeb/crmeb/services/crud/stubs/controller/CrudController.stub index 8bebff6ba..31c44dacc 100644 --- a/crmeb/crmeb/services/crud/stubs/controller/CrudController.stub +++ b/crmeb/crmeb/services/crud/stubs/controller/CrudController.stub @@ -20,7 +20,7 @@ namespace app\adminapi\controller\crud{%path%}; use app\adminapi\controller\AuthController; use think\facade\App; - +{%use-php%} /** * Class {%nameCamel%} * @date {%date%} diff --git a/crmeb/crmeb/services/crud/stubs/dao/CrudDao.stub b/crmeb/crmeb/services/crud/stubs/dao/CrudDao.stub index eed5b1b2e..325d58261 100644 --- a/crmeb/crmeb/services/crud/stubs/dao/CrudDao.stub +++ b/crmeb/crmeb/services/crud/stubs/dao/CrudDao.stub @@ -20,7 +20,7 @@ namespace app\dao\crub{%path%}; use app\dao\BaseDao; - +{%use-php%} /** * Class {%nameCamel%}Dao * @date {%date%} @@ -36,6 +36,6 @@ class {%nameCamel%}Dao extends BaseDao */ protected function setModel(): string { - return {%nameCamel%}Model::class; + return {%nameCamel%}::class; } }