Curd.php 9.9 KB

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