'int', 'model_name'=>'varchar', 'model_title'=>'varchar', 'title'=>'varchar', 'field'=>'varchar', 'field_type'=>'enum', 'db_type'=>'varchar', 'len'=>'int', 'show_in_table'=>'tinyint', 'search_type'=>'enum', 'status'=>'tinyint', 'weigh'=>'int', 'rule'=>'varchar', 'content'=>'varchar', 'create_at'=>'datetime', 'update_at'=>'datetime', 'delete_at'=>'datetime', 'default_value'=>'varchar', 'extra_rule'=>'text', 'is_relation'=>'tinyint', 'relation_model'=>'varchar', 'relation_field'=>'varchar', 'relation_show'=>'varchar', 'relation_dic_group'=>'varchar', 'auto_methods'=>'text', ]; static public function fieldTypeList() { return [ 'string' => '单行文本', 'text' => '多行文本', 'editor' => '编辑器', 'number' => '数字', 'year' => '年度', 'month' => '月份', 'date' => '日期', 'time' => '时间', 'datetime' => '日期时间', 'datetimerange' => '日期时间区间', 'select' => '列表', 'selects' => '列表(多选)', 'image' => '单图', 'images' => '多图', 'file' => '单文件', 'files' => '多文件', 'switch' => '开关', 'checkbox' => '复选', 'radio' => '单选', 'color' => '颜色', 'json' => 'JSON数组', 'slider' => '滑块', 'relate_self'=>'关联自身', 'relate_dic'=>'关联字典', 'relate_single'=>'关联单选', 'relate_multiple'=>'关联多选', 'user_auto'=>'用户(自动)', 'org_auto'=>'组织(自动)', 'user_select'=>'用户(选择)', 'org_select'=>'组织(选择)', ]; } public function getTestValueAttr($value,$row) { $extra_rule = !empty($row['extra_rule'])?json_decode($row['extra_rule'],true):[]; $extra_rule = array_column($extra_rule,'value','key'); if(in_array($row['field_type'],['selects','checkbox','images','files','relate_multiple'])){ return []; }elseif(in_array($row['field_type'],['user_select','org_select','relate_dic']) && isset($extra_rule['multiple']) && ($extra_rule['multiple']==='true' || $extra_rule['multiple']===true)){ return []; }elseif(in_array($row['db_type'],['tinyint','smallint','mediumint','int','bigint','double','float','decimal','timestamp'])){ return 0; }else{ return ''; } } public function getFieldTypeTxtAttr($value,$row) { $fieldTypeList = self::fieldTypeList(); return $fieldTypeList[$value ?? $row['field_type']] ?? ''; } static public function dbTypeList() { return [ 'tinyint','smallint','mediumint','int','bigint','double','float','decimal','char','varchar','date','time','year','timestamp','datetime','text','longtext','enum','set','json' ]; } static public function showInTableList() { return [1=>'显示',2=>'不显示']; } public function getShowInTableTxtAttr($value,$row) { $showInTableList = self::showInTableList(); return $showInTableList[$value ?? $row['show_in_table']] ?? ''; } static public function searchTypeList() { return ['none'=>'无搜索','list'=>'下拉列表','keyword'=>'关键字','year'=>'年度','month'=>'月份','date'=>'日期','daterange'=>'日期范围','datetime'=>'日期时间','datetimerange'=>'日期时间范围','relation'=>'关联筛选']; } public function getSearchTypeTxtAttr($value,$row) { $searchTypeList = self::searchTypeList(); return $searchTypeList[$value ?? $row['search_type']] ?? ''; } static public function statusList() { return [1=>'启用',2=>'停用']; } public function getStatusTxtAttr($value,$row) { $statusList = self::statusList(); return $statusList[$value ?? $row['status']] ?? ''; } public function setModelTitleAttr($value,$row) { $title = ModelManage::where('name',$row['model_name'])->value('title'); return $title; } // 配置选项content文本获取器 public function getContentTxtAttr($value,$data) { if(!empty($data['content'])){ $contentAry = []; foreach($data['content'] as $content){ $contentAry[] = $content['key'].'|'.$content['value']; } return implode("\n",$contentAry); } return $value; } // 配置选项content修改器 public function setContentAttr($value,$data) { if(!empty($data['content_txt'])){ $contentAry = explode("\n",$data['content_txt']); $contentAry = array_filter($contentAry); $newContent = []; foreach($contentAry as $item){ $itemAry = explode('|',$item); $key = $itemAry[0]; $value = $itemAry[1]; $newContent[] = ['key'=>$key,'value'=>$value]; } return json_encode($newContent); } return $value; } // 组件属性修改器 public function setExtraRuleAttr($value,$data) { if(!empty($data['extra_rule_txt'])){ $contentAry = explode("\n",$data['extra_rule_txt']); $contentAry = array_filter($contentAry); $newContent = []; foreach($contentAry as $item){ $itemAry = explode('|',$item); $key = $itemAry[0]; $value = $itemAry[1]??''; $newContent[] = ['key'=>$key,'value'=>$value]; } $value = json_encode($newContent); }else{ $value = null; } return $value; } // 组件属性获取器 public function getExtraRuleAttr($value,$data) { $value = $value??$data['extra_rule']??[]; $value = is_string($value)?json_decode($value,true):$value; $res = []; foreach($value as $item){ if($item['value']=='true'){ $val = true; }elseif($item['value']=='false'){ $val = false; }elseif(in_array($item['key'],['min','max','step'])){ $val = floatval($item['value']); }else{ $val = $item['value']; } $res[$item['key']] = $val; } return $res; } // 组件属性文本获取器 public function getExtraRuleTxtAttr($value,$data) { if(!empty($data['extra_rule'])){ $contentAry = []; $extra_rule = is_string($data['extra_rule'])?json_decode($data['extra_rule'],true):$data['extra_rule']; foreach($extra_rule as $content){ $contentAry[] = $content['key'].'|'.$content['value']; } return implode("\n",$contentAry); } return $value; } // 规则修改器 public function setRuleAttr($value,$data) { $value = $value??$data['rule']??''; return empty($value)||$value=='null'?'':$value; } //触发自动关联的方法修改器 public function setAutoMethodsAttr($value,$data) { $value = $value??$data['auto_methods']??[]; $value = array_filter($value); return implode(',',$value); } //触发自动关联的方法获取器 public function getAutoMethodsAttr($value,$data) { $value = $value??$data['auto_methods']??''; $res = explode(',',$value); return array_filter($res); } /** * @title: 添加字段 * @desc: 描述 * @param {string} $tblName * @param {int} $id * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-17 14:14:06 */ static public function addField(int $id) { $info = self::find($id); $tblName = $info->getAttr('model_name'); $field = $info->getAttr('field'); $title = $info->getAttr('title'); $dbType = $info->getAttr('db_type'); $len = $info->getAttr('len'); $defaultVal = $info->getAttr('default_value')??NULL; if($dbType=='enum'){ $len = "'".implode('\',\'',array_column($info->content,'key'))."'"; if(!empty($defaultVal)){ $sql = "ALTER TABLE $tblName ADD $field $dbType($len) DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $sql = "ALTER TABLE $tblName ADD $field $dbType($len) COMMENT '$title'"; } }elseif(in_array($dbType,['date','datetime','year'])){ if(!empty($defaultVal)){ $sql = "ALTER TABLE $tblName ADD $field $dbType DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $sql = "ALTER TABLE $tblName ADD $field $dbType DEFAULT NULL COMMENT '$title'"; } }elseif(!in_array($dbType,['text','blob','json','geometry'])){ $sql = "ALTER TABLE $tblName ADD $field $dbType($len) DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $sql = "ALTER TABLE $tblName ADD $field $dbType($len) COMMENT '$title'"; } $res = Db::execute($sql); return $res; } /** * @title: 添加为数据表多个字段 * @desc: 描述 * @param {string} {tblName} {} {数据表名} * @param {array} {fields} {} {字段数组} * @return {*} * @author: Rock * @method: POST * @Date: 2023-08-29 16:53:23 */ static public function addFields(string $tblName,array $fields) { $list = self::where('model_name',$tblName)->where('field','IN',$fields)->select(); $sql = "ALTER TABLE $tblName "; $fieldList = []; foreach($list as $item){ $field = $item->getAttr('field'); $title = $item->getAttr('title'); $dbType = $item->getAttr('db_type'); $len = $item->getAttr('len'); $defaultVal = $item->getAttr('default_value')??NULL; if($dbType=='enum'){ $len = "'".implode('\',\'',array_column($item->content,'key'))."'"; if(!empty($defaultVal)){ $fieldList[] = "ADD $field $dbType($len) DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $fieldList[] = "ADD $field $dbType($len) COMMENT '$title'"; } }elseif(in_array($dbType,['date','datetime','year'])){ if(!empty($defaultVal)){ $fieldList[] = "ADD $field $dbType DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $fieldList[] = "ADD $field $dbType DEFAULT NULL COMMENT '$title'"; } }elseif(!in_array($dbType,['text','blob','json','geometry'])){ $fieldList[] = "ADD $field $dbType($len) DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $fieldList[] = "ADD $field $dbType($len) COMMENT '$title'"; } } $sql .= implode(',',$fieldList); $res = Db::execute($sql); return $res; } /** * @title: 修改信息 * @desc: 描述 * @param {int} {id} {} {模型字段ID(field_id)} * @param {string} {oldFeild} {} {原字段名} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-17 19:52:48 */ static public function updateField(int $id,string $oldField) { $info = self::find($id); $tblName = $info->getAttr('model_name'); $field = $info->getAttr('field'); $dbType = $info->getAttr('db_type'); $len = $info->getAttr('len'); $title = $info->getAttr('title'); $defaultVal = $info->getAttr('default_value'); // 检查旧字段是否存在 $sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='$tblName' AND column_name='$oldField'"; $res = Db::query($sql); if(!$res || count($res)==0){ return self::addField($id); } if($dbType=='enum'){ $len = "'".implode('\',\'',array_column($info->content,'key'))."'"; if(!empty($defaultVal)){ $sql = "ALTER TABLE $tblName CHANGE $oldField $field $dbType($len) DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $sql = "ALTER TABLE $tblName CHANGE $oldField $field $dbType($len) COMMENT '$title'"; } }elseif(in_array($dbType,['date','datetime','year'])){ if(!empty($defaultVal)){ $sql = "ALTER TABLE $tblName CHANGE $oldField $field $dbType DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $sql = "ALTER TABLE $tblName CHANGE $oldField $field $dbType DEFAULT NULL COMMENT '$title'"; } }elseif(!in_array($dbType,['text','blob','json','geometry'])){ $sql = "ALTER TABLE $tblName CHANGE $oldField $field $dbType($len) DEFAULT '$defaultVal' COMMENT '$title'"; }else{ $sql = "ALTER TABLE $tblName CHANGE $oldField $field $dbType($len) COMMENT '$title'"; } $res = Db::execute($sql); return $res; } /** * @title: 删除字段 * @desc: 描述 * @param {int} {id} {} {模型字段ID(field_id)} * @return {*} * @author: Rock * @method: POST * @Date: 2023-04-17 20:37:53 */ static public function deleteField(int $id) { $info = self::find($id); $tblName = $info->getAttr('model_name'); $field = $info->getAttr('field'); // 检查旧字段是否存在 $sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='$tblName' AND column_name='$field'"; $res = Db::query($sql); if($res && count($res)>0){ $sql = "ALTER TABLE $tblName DROP COLUMN $field"; $res = Db::execute($sql); } return $res; } /** * @title: 删除多个字段 * @desc: 描述 * @param {string} {model_name} {} {模型字段ID数组} * @param {array} {fields} {} {模型字段数组} * @return {*} * @author: Rock * @method: POST * @Date: 2023-08-29 15:46:49 */ static public function deleteFields(string $model_name,array $fields) { // 查询已存在的字段 $oldSql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='$model_name' AND column_name IN ('".implode('\',\'',$fields)."');"; $res = Db::query($oldSql); $oldList = array_column($res,'COLUMN_NAME'); $sql = "ALTER TABLE $model_name "; $dropList = []; foreach($fields as $field){ if(in_array($field,$oldList)){ $dropList[] = "DROP COLUMN $field"; } } if(!empty($dropList)){ $sql .= implode(',',$dropList); $sql .= ";"; $res = Db::execute($sql); return $res; } return true; } }