ValidateServer.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. namespace app\common\model\base\models;
  3. /**
  4. * @title : 验证器代码生成服务
  5. * @desc :
  6. * @Author : Rock
  7. * @Date : 2023-04-19 15:42:16
  8. */
  9. class ValidateServer
  10. {
  11. static public function deleteFile(int $model_id)
  12. {
  13. $info = ModelManage::where('id',$model_id)->find();
  14. $name = $info->name;
  15. $appname = app('http')->getName();// 获取应用名
  16. $classname = self::getCamel($info->name);//获取类名
  17. $dirname = $info->dirname;// 文件保存位置
  18. if(!empty($dirname)){
  19. $path = root_path()."app".DS.$appname.DS."validate".DS.$dirname.DS;
  20. }else{
  21. $path = root_path()."app".DS.$appname.DS."validate".DS;
  22. }
  23. $filename = $path.$classname.'.php';
  24. if(file_exists($filename)){
  25. @unlink($filename);
  26. }
  27. }
  28. /**
  29. * @title: 生成验证器代码
  30. * @desc: 描述
  31. * @param {int} $model_id
  32. * @return {*}
  33. * @author: Rock
  34. * @method: POST
  35. * @Date: 2023-04-23 17:26:09
  36. */
  37. static public function createValidateFile(int $model_id)
  38. {
  39. $info = ModelManage::where('id',$model_id)->find();
  40. $name = $info->name;
  41. $dirname = self::parseDirname($info->dirname);// 文件保存位置
  42. $fileTitle = self::createTitle($info->title);//生成文件注释
  43. $fieldList = ModelFields::where('model_name',$name)->where('status',1)->select()->toArray();//获取字段列表
  44. $classname = self::getCamel($info->name);//获取类名
  45. $appname = app('http')->getName();// 获取应用名
  46. $rule = self::createRule($fieldList);
  47. $message = self::createMessage($fieldList);
  48. if(!empty($dirname)){
  49. $path = root_path()."app".DS.$appname.DS."validate".DS.$dirname.DS;
  50. $namespace = "app\\$appname\\validate\\".str_replace('/','\\',$dirname);
  51. }else{
  52. $path = root_path()."app".DS.$appname.DS."validate".DS;
  53. $namespace = "app\\$appname\\validate";
  54. }
  55. if(!is_dir($path)){
  56. mkdir($path,0777,true);
  57. }
  58. $filename = $path.$classname.'.php';
  59. $content = <<<CONTROLLER
  60. <?php
  61. namespace $namespace;
  62. $fileTitle
  63. use think\Validate;
  64. class $classname extends Validate
  65. {
  66. $rule
  67. $message
  68. }
  69. CONTROLLER;
  70. FileServer::writeLine($filename,$content);
  71. }
  72. /**
  73. * @title: 生成控制器注释
  74. * @desc: 描述
  75. * @return {*}
  76. * @author: Rock
  77. * @method: POST
  78. * @Date: 2023-04-18 15:13:19
  79. */
  80. static public function createTitle(string $title)
  81. {
  82. $title = <<<EOF
  83. /**
  84. * @title : $title 验证器
  85. * @desc :
  86. * @icon fa fa-leaf
  87. */
  88. EOF;
  89. return $title;
  90. }
  91. /**
  92. * @title: 格式化dir路径
  93. * @desc: 描述
  94. * @param {string} $dirname
  95. * @return {*}
  96. * @author: Rock
  97. * @method: POST
  98. * @Date: 2023-04-24 14:46:37
  99. */
  100. static public function parseDirname(string $dirname)
  101. {
  102. return !empty($dirname)?explode(DS,str_replace(['/','\\'],DS,$dirname))[0]:'';
  103. }
  104. /**
  105. * @title: 根据数据表名生成类名
  106. * @desc: 描述
  107. * @param {string} {name} {} {数据表名}
  108. * @return {*}
  109. * @author: Rock
  110. * @method: POST
  111. * @Date: 2023-04-18 17:09:13
  112. */
  113. static public function getCamel(string $name)
  114. {
  115. $arr = explode('_',$name);
  116. $arr = array_filter($arr);
  117. $classname = "";
  118. foreach($arr as $item){
  119. $classname .= ucfirst($item);
  120. }
  121. return $classname;
  122. }
  123. /**
  124. * @title: 创建字段验证规则
  125. * @desc: 描述
  126. * @param {array} {fieldList} {} {字段列表}
  127. * @return {*}
  128. * @author: Rock
  129. * @method: POST
  130. * @Date: 2023-04-19 16:06:03
  131. */
  132. static public function createRule(array $fieldList)
  133. {
  134. $str = "protected \$rule = [\n";
  135. foreach($fieldList as $item){
  136. $field = $item['field'];
  137. $rule = $item['rule'];
  138. if(!empty($item['rule']) && !in_array($item['field_type'],['user_auto','org_auto'])){
  139. $str.="\t\t\"$field\"=>\"$rule\",\n";
  140. }
  141. }
  142. $str = rtrim($str,",\n")."\n\t];";
  143. return $str;
  144. }
  145. /**
  146. * @title: 创建验证提示信息
  147. * @desc: 描述
  148. * @param {array} $fieldList
  149. * @return {*}
  150. * @author: Rock
  151. * @method: POST
  152. * @Date: 2023-04-19 16:14:46
  153. */
  154. static public function createMessage(array $fieldList)
  155. {
  156. $str = "protected \$message =[\n";
  157. foreach($fieldList as $item){
  158. $field = $item['field'];
  159. $rule = $item['rule'];
  160. $title = $item['title'];
  161. if(!empty($rule) && !in_array($item['field_type'],['user_auto','org_auto'])){
  162. $ruleList = explode('|',$rule);
  163. foreach($ruleList as $ruleItem){
  164. $msg = "";
  165. if(false!==strpos($ruleItem,':')){
  166. $ruleItemArr = explode(':',$ruleItem);
  167. $key = $ruleItemArr[0];
  168. $val = $ruleItemArr[1];
  169. switch($key){
  170. case 'min':
  171. $msg = $title."不能少于{$val}个字符";break;
  172. case 'max':
  173. $msg = $title."最多不能超过{$val}个字符";break;
  174. case 'between':
  175. $range = explode(',',$val);
  176. $min = $range[0];
  177. $max = $range[1];
  178. $msg = $title."只能在{$min}-{$max}之间";
  179. break;
  180. case 'dateFormat':
  181. $msg = $title."不是指定格式的时间";break;
  182. case 'in':
  183. $arr = explode(',',$val);
  184. $msg = $title."不是";
  185. foreach($arr as $in){
  186. $msg .= $in.',';
  187. }
  188. $msg = rtrim($msg,',')."中的一个";
  189. break;
  190. case 'notIn':
  191. $arr = explode(',',$val);
  192. $msg = $title."不能是";
  193. foreach($arr as $in){
  194. $msg .= $in.',';
  195. }
  196. $msg = rtrim($msg,',')."中的一个";
  197. break;
  198. case 'notBetween':
  199. $range = explode(',',$val);
  200. $min = $range[0];
  201. $max = $range[1];
  202. $msg = $title."不能在{$min}-{$max}之间";
  203. break;
  204. case 'length':
  205. $range = explode(',',$val);
  206. if(count($range)==2){
  207. $min = $range[0];
  208. $max = $range[1];
  209. $msg = $title."长度只能在{$min}-{$max}之间";
  210. }elseif(count($range)==1){
  211. $len = $range[0];
  212. $msg = $title."长度至能是{$len}个字符";
  213. }
  214. break;
  215. case 'after':
  216. $msg = $title."必须在{$val}之后";break;
  217. case 'before':
  218. $msg = $title."必须在{$val}之前";break;
  219. case 'expire':
  220. $range = explode(',',$val);
  221. $min = $range[0];
  222. $max = $range[1];
  223. $msg = $title."必须在{$min}和{$max}之间";
  224. break;
  225. case 'allowIp':
  226. $msg = $title."必须在这些范围内{$val}";break;
  227. case 'denyIp':
  228. $msg = "您的IP禁止访问";break;
  229. case 'confirm':
  230. $msg = $title."的值与{$val}不一致";break;
  231. case 'different':
  232. $msg = $title."的值不能与{$val}一致";break;
  233. case 'eq':
  234. case 'same':
  235. case '=':
  236. $msg = $title."必须等于$val";break;
  237. case 'egt':
  238. case '>=':
  239. $msg = $title."必须大于或等于$val";break;
  240. case 'gt':
  241. case '>':
  242. $msg = $title."必须大于$val";break;
  243. case 'elt':
  244. case '<=':
  245. $msg = $title."必须小于或等于$val";break;
  246. case 'lt':
  247. case '<':
  248. $msg = $title."必须小于$val";break;
  249. case 'filter':
  250. case 'regex':
  251. $msg = $title."验证未通过";break;
  252. }
  253. $str.="\t\t'$field.$key'=>'$msg',\n";
  254. }else{
  255. switch($ruleItem){
  256. case 'require':
  257. $msg = $title."不能为空";break;
  258. case 'number':
  259. $msg = $title."必须是纯数字";break;
  260. case 'email':
  261. $msg = $title."邮箱格式错误";break;
  262. case 'integer':
  263. $msg = $title."必须为整数";break;
  264. case 'float':
  265. $msg = $title."必须为浮点数";break;
  266. case 'boolean':
  267. case 'bool':
  268. $msg = $title."必须为布尔值";break;
  269. case 'array':
  270. $msg = $title."必须为数组";break;
  271. case 'accepted':
  272. $msg = $title."的值必须为yes或on或1";break;
  273. case 'date':
  274. $msg = $title."必须为有效的日期";break;
  275. case 'alpha':
  276. $msg = $title."必须为纯字母";break;
  277. case 'alphaNum':
  278. $msg = $title."必须为字母或数字";break;
  279. case 'chs':
  280. $msg = $title."必须为汉字";break;
  281. case 'chsAlpha':
  282. $msg = $title."只能是汉字、字母";break;
  283. case 'chsAlphaNum':
  284. $msg = $title."只能是汉字、字母和数字";break;
  285. case 'chsDash':
  286. $msg = $title."只能是汉字、字母、数字和下划线_及破折号-";break;
  287. case 'cntrl':
  288. $msg = $title."只能是控制字符(换行、缩进、空格)";break;
  289. case 'graph':
  290. $msg = $title."只能是可打印字符(空格除外)";break;
  291. case 'print':
  292. $msg = $title."只能是可打印字符";break;
  293. case 'lower':
  294. $msg = $title."只能是小写字母";break;
  295. case 'upper':
  296. $msg = $title."只能是大写字母";break;
  297. case 'space':
  298. $msg = $title."只能是空白字符(包括缩进、垂直制表符、换行符、回车和换页字符)";break;
  299. case 'xdigit':
  300. $msg = $title."只能是十六进制字符";break;
  301. case 'activeUrl':
  302. $msg = "不是有效的$title";break;
  303. case 'url':
  304. $msg = "不是有效的$title";break;
  305. case 'ip':
  306. $msg = "不是有效的$title";break;
  307. case 'mobile':
  308. $msg = "不是有效的".$title;break;
  309. case 'idCard':
  310. $msg = "不是有效的".$title;break;
  311. case 'macAddr':
  312. $msg = "不是有效的".$title;break;
  313. case 'zip':
  314. $msg = "不是有效的".$title;break;
  315. }
  316. $str.="\t\t'$field.$ruleItem'=>'$msg',\n";
  317. }
  318. }
  319. }
  320. }
  321. $str = rtrim($str,",\n")."\n\t];";
  322. return $str;
  323. }
  324. }