Curd.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | EasyAdmin
  4. // +----------------------------------------------------------------------
  5. // | PHP交流群: 763822524
  6. // +----------------------------------------------------------------------
  7. // | 开源协议 https://mit-license.org
  8. // +----------------------------------------------------------------------
  9. // | github开源项目:https://github.com/zhongshaofa/EasyAdmin
  10. // +----------------------------------------------------------------------
  11. namespace app\common\command;
  12. use app\common\model\SystemNode;
  13. use EasyAdmin\console\CliEcho;
  14. use EasyAdmin\curd\BuildCurd;
  15. use think\console\Command;
  16. use think\console\Input;
  17. use think\console\input\Option;
  18. use think\console\Output;
  19. use EasyAdmin\auth\Node as NodeService;
  20. use think\Exception;
  21. class Curd extends Command
  22. {
  23. protected function configure()
  24. {
  25. $this->setName('curd')
  26. ->addOption('table', 't', Option::VALUE_REQUIRED, '主表名', null)
  27. ->addOption('controllerFilename', 'c', Option::VALUE_REQUIRED, '控制器文件名', null)
  28. ->addOption('modelFilename', 'm', Option::VALUE_REQUIRED, '主表模型文件名', null)
  29. #
  30. ->addOption('checkboxFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '复选框字段后缀', null)
  31. ->addOption('radioFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '单选框字段后缀', null)
  32. ->addOption('imageFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '单图片字段后缀', null)
  33. ->addOption('imagesFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '多图片字段后缀', null)
  34. ->addOption('fileFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '单文件字段后缀', null)
  35. ->addOption('filesFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '多文件字段后缀', null)
  36. ->addOption('dateFieldSuffix', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '时间字段后缀', null)
  37. ->addOption('switchFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '开关的字段', null)
  38. ->addOption('selectFileds', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '下拉的字段', null)
  39. ->addOption('editorFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '富文本的字段', null)
  40. ->addOption('sortFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '排序的字段', null)
  41. ->addOption('ignoreFields', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '忽略的字段', null)
  42. #
  43. ->addOption('relationTable', 'r', Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联表名', null)
  44. ->addOption('foreignKey', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联外键', null)
  45. ->addOption('primaryKey', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联主键', null)
  46. ->addOption('relationModelFilename', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联模型文件名', null)
  47. ->addOption('relationOnlyFileds', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联模型中只显示的字段', null)
  48. ->addOption('relationBindSelect', null, Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, '关联模型中的字段用于主表外键的表单下拉选择', null)
  49. #
  50. ->addOption('force', 'f', Option::VALUE_REQUIRED, '强制覆盖模式', 0)
  51. ->addOption('delete', 'd', Option::VALUE_REQUIRED, '删除模式', 0)
  52. ->setDescription('一键curd命令服务');
  53. }
  54. protected function execute(Input $input, Output $output)
  55. {
  56. $table = $input->getOption('table');
  57. $controllerFilename = $input->getOption('controllerFilename');
  58. $modelFilename = $input->getOption('modelFilename');
  59. $checkboxFieldSuffix = $input->getOption('checkboxFieldSuffix');
  60. $radioFieldSuffix = $input->getOption('radioFieldSuffix');
  61. $imageFieldSuffix = $input->getOption('imageFieldSuffix');
  62. $imagesFieldSuffix = $input->getOption('imagesFieldSuffix');
  63. $fileFieldSuffix = $input->getOption('fileFieldSuffix');
  64. $filesFieldSuffix = $input->getOption('filesFieldSuffix');
  65. $dateFieldSuffix = $input->getOption('dateFieldSuffix');
  66. $switchFields = $input->getOption('switchFields');
  67. $selectFileds = $input->getOption('selectFileds');
  68. $sortFields = $input->getOption('sortFields');
  69. $ignoreFields = $input->getOption('ignoreFields');
  70. $relationTable = $input->getOption('relationTable');
  71. $foreignKey = $input->getOption('foreignKey');
  72. $primaryKey = $input->getOption('primaryKey');
  73. $relationModelFilename = $input->getOption('relationModelFilename');
  74. $relationOnlyFileds = $input->getOption('relationOnlyFileds');
  75. $relationBindSelect = $input->getOption('relationBindSelect');
  76. $force = $input->getOption('force');
  77. $delete = $input->getOption('delete');
  78. $relations = [];
  79. foreach ($relationTable as $key => $val) {
  80. $relations[] = [
  81. 'table' => $relationTable[$key],
  82. 'foreignKey' => isset($foreignKey[$key]) ? $foreignKey[$key] : null,
  83. 'primaryKey' => isset($primaryKey[$key]) ? $primaryKey[$key] : null,
  84. 'modelFilename' => isset($relationModelFilename[$key]) ? $relationModelFilename[$key] : null,
  85. 'onlyFileds' => isset($relationOnlyFileds[$key]) ? explode(",", $relationOnlyFileds[$key]) : [],
  86. 'relationBindSelect' => isset($relationBindSelect[$key]) ? $relationBindSelect[$key] : null,
  87. ];
  88. }
  89. if (empty($table)) {
  90. CliEcho::error('请设置主表');
  91. return false;
  92. }
  93. try {
  94. $build = (new BuildCurd())
  95. ->setTable($table)
  96. ->setForce($force);
  97. !empty($controllerFilename) && $build = $build->setControllerFilename($controllerFilename);
  98. !empty($modelFilename) && $build = $build->setModelFilename($modelFilename);
  99. !empty($checkboxFieldSuffix) && $build = $build->setCheckboxFieldSuffix($checkboxFieldSuffix);
  100. !empty($radioFieldSuffix) && $build = $build->setRadioFieldSuffix($radioFieldSuffix);
  101. !empty($imageFieldSuffix) && $build = $build->setImageFieldSuffix($imageFieldSuffix);
  102. !empty($imagesFieldSuffix) && $build = $build->setImagesFieldSuffix($imagesFieldSuffix);
  103. !empty($fileFieldSuffix) && $build = $build->setFileFieldSuffix($fileFieldSuffix);
  104. !empty($filesFieldSuffix) && $build = $build->setFilesFieldSuffix($filesFieldSuffix);
  105. !empty($dateFieldSuffix) && $build = $build->setDateFieldSuffix($dateFieldSuffix);
  106. !empty($switchFields) && $build = $build->setSwitchFields($switchFields);
  107. !empty($selectFileds) && $build = $build->setSelectFileds($selectFileds);
  108. !empty($sortFields) && $build = $build->setSortFields($sortFields);
  109. !empty($ignoreFields) && $build = $build->setIgnoreFields($ignoreFields);
  110. foreach ($relations as $relation) {
  111. $build = $build->setRelation($relation['table'], $relation['foreignKey'], $relation['primaryKey'], $relation['modelFilename'], $relation['onlyFileds'],$relation['relationBindSelect']);
  112. }
  113. $build = $build->render();
  114. $fileList = $build->getFileList();
  115. if (!$delete) {
  116. $result = $build->create();
  117. if($force){
  118. $output->info(">>>>>>>>>>>>>>>");
  119. foreach ($fileList as $key => $val) {
  120. $output->info($key);
  121. }
  122. $output->info(">>>>>>>>>>>>>>>");
  123. $output->info("确定强制生成上方所有文件? 如果文件存在会直接覆盖。 请输入 'yes' 按回车键继续操作: ");
  124. $line = fgets(defined('STDIN') ? STDIN : fopen('php://stdin', 'r'));
  125. if (trim($line) != 'yes') {
  126. throw new Exception("取消文件CURD生成操作");
  127. }
  128. }
  129. CliEcho::success('自动生成CURD成功');
  130. } else {
  131. $output->info(">>>>>>>>>>>>>>>");
  132. foreach ($fileList as $key => $val) {
  133. $output->info($key);
  134. }
  135. $output->info(">>>>>>>>>>>>>>>");
  136. $output->info("确定删除上方所有文件? 请输入 'yes' 按回车键继续操作: ");
  137. $line = fgets(defined('STDIN') ? STDIN : fopen('php://stdin', 'r'));
  138. if (trim($line) != 'yes') {
  139. throw new Exception("取消删除文件操作");
  140. }
  141. $result = $build->delete();
  142. CliEcho::success('>>>>>>>>>>>>>>>');
  143. CliEcho::success('删除自动生成CURD文件成功');
  144. }
  145. CliEcho::success('>>>>>>>>>>>>>>>');
  146. foreach ($result as $vo) {
  147. CliEcho::success($vo);
  148. }
  149. } catch (\Exception $e) {
  150. CliEcho::error($e->getMessage());
  151. return false;
  152. }
  153. }
  154. }