123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- <?php
- namespace app\common\model\base\models;
- /**
- * @title : 验证器代码生成服务
- * @desc :
- * @Author : Rock
- * @Date : 2023-04-19 15:42:16
- */
- class ValidateServer
- {
- static public function deleteFile(int $model_id)
- {
- $info = ModelManage::where('id',$model_id)->find();
- $name = $info->name;
- $appname = app('http')->getName();// 获取应用名
- $classname = self::getCamel($info->name);//获取类名
- $dirname = $info->dirname;// 文件保存位置
- if(!empty($dirname)){
- $path = root_path()."app".DS.$appname.DS."validate".DS.$dirname.DS;
- }else{
- $path = root_path()."app".DS.$appname.DS."validate".DS;
- }
- $filename = $path.$classname.'.php';
- if(file_exists($filename)){
- @unlink($filename);
- }
- }
- /**
- * @title: 生成验证器代码
- * @desc: 描述
- * @param {int} $model_id
- * @return {*}
- * @author: Rock
- * @method: POST
- * @Date: 2023-04-23 17:26:09
- */
- static public function createValidateFile(int $model_id)
- {
- $info = ModelManage::where('id',$model_id)->find();
- $name = $info->name;
- $dirname = self::parseDirname($info->dirname);// 文件保存位置
- $fileTitle = self::createTitle($info->title);//生成文件注释
- $fieldList = ModelFields::where('model_name',$name)->where('status',1)->select()->toArray();//获取字段列表
- $classname = self::getCamel($info->name);//获取类名
- $appname = app('http')->getName();// 获取应用名
- $rule = self::createRule($fieldList);
- $message = self::createMessage($fieldList);
- if(!empty($dirname)){
- $path = root_path()."app".DS.$appname.DS."validate".DS.$dirname.DS;
- $namespace = "app\\$appname\\validate\\".str_replace('/','\\',$dirname);
- }else{
- $path = root_path()."app".DS.$appname.DS."validate".DS;
- $namespace = "app\\$appname\\validate";
- }
- if(!is_dir($path)){
- mkdir($path,0777,true);
- }
- $filename = $path.$classname.'.php';
- $content = <<<CONTROLLER
- <?php
- namespace $namespace;
- $fileTitle
- use think\Validate;
- class $classname extends Validate
- {
- $rule
- $message
- }
- CONTROLLER;
- FileServer::writeLine($filename,$content);
- }
- /**
- * @title: 生成控制器注释
- * @desc: 描述
- * @return {*}
- * @author: Rock
- * @method: POST
- * @Date: 2023-04-18 15:13:19
- */
- static public function createTitle(string $title)
- {
- $title = <<<EOF
- /**
- * @title : $title 验证器
- * @desc :
- * @icon fa fa-leaf
- */
- EOF;
- return $title;
- }
- /**
- * @title: 格式化dir路径
- * @desc: 描述
- * @param {string} $dirname
- * @return {*}
- * @author: Rock
- * @method: POST
- * @Date: 2023-04-24 14:46:37
- */
- static public function parseDirname(string $dirname)
- {
- return !empty($dirname)?explode(DS,str_replace(['/','\\'],DS,$dirname))[0]:'';
- }
- /**
- * @title: 根据数据表名生成类名
- * @desc: 描述
- * @param {string} {name} {} {数据表名}
- * @return {*}
- * @author: Rock
- * @method: POST
- * @Date: 2023-04-18 17:09:13
- */
- static public function getCamel(string $name)
- {
- $arr = explode('_',$name);
- $arr = array_filter($arr);
- $classname = "";
- foreach($arr as $item){
- $classname .= ucfirst($item);
- }
- return $classname;
- }
- /**
- * @title: 创建字段验证规则
- * @desc: 描述
- * @param {array} {fieldList} {} {字段列表}
- * @return {*}
- * @author: Rock
- * @method: POST
- * @Date: 2023-04-19 16:06:03
- */
- static public function createRule(array $fieldList)
- {
- $str = "protected \$rule = [\n";
- foreach($fieldList as $item){
- $field = $item['field'];
- $rule = $item['rule'];
- if(!empty($item['rule']) && !in_array($item['field_type'],['user_auto','org_auto'])){
- $str.="\t\t\"$field\"=>\"$rule\",\n";
- }
- }
- $str = rtrim($str,",\n")."\n\t];";
- return $str;
- }
- /**
- * @title: 创建验证提示信息
- * @desc: 描述
- * @param {array} $fieldList
- * @return {*}
- * @author: Rock
- * @method: POST
- * @Date: 2023-04-19 16:14:46
- */
- static public function createMessage(array $fieldList)
- {
- $str = "protected \$message =[\n";
- foreach($fieldList as $item){
- $field = $item['field'];
- $rule = $item['rule'];
- $title = $item['title'];
- if(!empty($rule) && !in_array($item['field_type'],['user_auto','org_auto'])){
- $ruleList = explode('|',$rule);
- foreach($ruleList as $ruleItem){
- $msg = "";
- if(false!==strpos($ruleItem,':')){
- $ruleItemArr = explode(':',$ruleItem);
- $key = $ruleItemArr[0];
- $val = $ruleItemArr[1];
- switch($key){
- case 'min':
- $msg = $title."不能少于{$val}个字符";break;
- case 'max':
- $msg = $title."最多不能超过{$val}个字符";break;
- case 'between':
- $range = explode(',',$val);
- $min = $range[0];
- $max = $range[1];
- $msg = $title."只能在{$min}-{$max}之间";
- break;
- case 'dateFormat':
- $msg = $title."不是指定格式的时间";break;
- case 'in':
- $arr = explode(',',$val);
- $msg = $title."不是";
- foreach($arr as $in){
- $msg .= $in.',';
- }
- $msg = rtrim($msg,',')."中的一个";
- break;
- case 'notIn':
- $arr = explode(',',$val);
- $msg = $title."不能是";
- foreach($arr as $in){
- $msg .= $in.',';
- }
- $msg = rtrim($msg,',')."中的一个";
- break;
- case 'notBetween':
- $range = explode(',',$val);
- $min = $range[0];
- $max = $range[1];
- $msg = $title."不能在{$min}-{$max}之间";
- break;
- case 'length':
- $range = explode(',',$val);
- if(count($range)==2){
- $min = $range[0];
- $max = $range[1];
- $msg = $title."长度只能在{$min}-{$max}之间";
- }elseif(count($range)==1){
- $len = $range[0];
- $msg = $title."长度至能是{$len}个字符";
- }
- break;
- case 'after':
- $msg = $title."必须在{$val}之后";break;
- case 'before':
- $msg = $title."必须在{$val}之前";break;
- case 'expire':
- $range = explode(',',$val);
- $min = $range[0];
- $max = $range[1];
- $msg = $title."必须在{$min}和{$max}之间";
- break;
- case 'allowIp':
- $msg = $title."必须在这些范围内{$val}";break;
- case 'denyIp':
- $msg = "您的IP禁止访问";break;
- case 'confirm':
- $msg = $title."的值与{$val}不一致";break;
- case 'different':
- $msg = $title."的值不能与{$val}一致";break;
- case 'eq':
- case 'same':
- case '=':
- $msg = $title."必须等于$val";break;
- case 'egt':
- case '>=':
- $msg = $title."必须大于或等于$val";break;
- case 'gt':
- case '>':
- $msg = $title."必须大于$val";break;
- case 'elt':
- case '<=':
- $msg = $title."必须小于或等于$val";break;
- case 'lt':
- case '<':
- $msg = $title."必须小于$val";break;
- case 'filter':
- case 'regex':
- $msg = $title."验证未通过";break;
- }
- $str.="\t\t'$field.$key'=>'$msg',\n";
- }else{
- switch($ruleItem){
- case 'require':
- $msg = $title."不能为空";break;
- case 'number':
- $msg = $title."必须是纯数字";break;
- case 'email':
- $msg = $title."邮箱格式错误";break;
- case 'integer':
- $msg = $title."必须为整数";break;
- case 'float':
- $msg = $title."必须为浮点数";break;
- case 'boolean':
- case 'bool':
- $msg = $title."必须为布尔值";break;
- case 'array':
- $msg = $title."必须为数组";break;
- case 'accepted':
- $msg = $title."的值必须为yes或on或1";break;
- case 'date':
- $msg = $title."必须为有效的日期";break;
- case 'alpha':
- $msg = $title."必须为纯字母";break;
- case 'alphaNum':
- $msg = $title."必须为字母或数字";break;
- case 'chs':
- $msg = $title."必须为汉字";break;
- case 'chsAlpha':
- $msg = $title."只能是汉字、字母";break;
- case 'chsAlphaNum':
- $msg = $title."只能是汉字、字母和数字";break;
- case 'chsDash':
- $msg = $title."只能是汉字、字母、数字和下划线_及破折号-";break;
- case 'cntrl':
- $msg = $title."只能是控制字符(换行、缩进、空格)";break;
- case 'graph':
- $msg = $title."只能是可打印字符(空格除外)";break;
- case 'print':
- $msg = $title."只能是可打印字符";break;
- case 'lower':
- $msg = $title."只能是小写字母";break;
- case 'upper':
- $msg = $title."只能是大写字母";break;
- case 'space':
- $msg = $title."只能是空白字符(包括缩进、垂直制表符、换行符、回车和换页字符)";break;
- case 'xdigit':
- $msg = $title."只能是十六进制字符";break;
- case 'activeUrl':
- $msg = "不是有效的$title";break;
- case 'url':
- $msg = "不是有效的$title";break;
- case 'ip':
- $msg = "不是有效的$title";break;
- case 'mobile':
- $msg = "不是有效的".$title;break;
- case 'idCard':
- $msg = "不是有效的".$title;break;
- case 'macAddr':
- $msg = "不是有效的".$title;break;
- case 'zip':
- $msg = "不是有效的".$title;break;
- }
- $str.="\t\t'$field.$ruleItem'=>'$msg',\n";
- }
- }
- }
- }
- $str = rtrim($str,",\n")."\n\t];";
- return $str;
- }
- }
|