123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- <?php
- namespace app\common\model\base\models;
- /**
- * @title : 模型字段管理
- * @desc :
- * @Author : Rock
- * @Date : 2023-04-11 20:02:23
- */
- use app\common\model\Common;
- use think\facade\Db;
- use think\model\concern\SoftDelete;
- class ModelFields extends Common
- {
- // use SoftDelete;
- protected $name = "system_auto_model_field";
- protected $pk = "field_id";
- protected $json = ['content'];
- protected $jsonAssoc = true;
- protected $append = ['field_type_txt','show_in_table_txt','search_type_txt','status_txt','content_txt','extra_rule_txt','test_value'];
- protected $schema = [
- 'field_id'=>'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;
- }
- }
|