[ 'content_data'=>[], 'module_info' => [], 'field_info' => [], ], 'page_total' => 0, ]; $_data = [ 'data' => [ ], 'page_total' => 0, ]; $cate_id = $this->request->param('cate_id', 0); if(!$cate_id){ return $_data; } //获取当前栏目下是否有子栏目 $count = Db::name('cate')->where('parent_id','=',$cate_id)->where('delete_time is null')->count(); if($count>0){ return $_data; } //获取当前栏目信息 $cate_info = Db::name('cate')->find($cate_id); if(!$cate_info){ return $_data; } $site_id = SITE_ID; $module_id = $cate_info['module_id']; //获取该栏目的模型和模型字段数据 $module_info = Db::name('module')->find($module_id); $field_info = Db::name('field')->where('module_id','=',$module_id)->order('sort asc')->select(); $table_name = $this->cms_table.'_'.$module_info['table_name'].'_'.$site_id; $table_base = in_array($module_info['table_name'],config('cms.base_module'))?$module_info['table_name']:''; //获取内容列表 $_op = Db::name('cms_common')->alias('cms_common'); if(in_array($table_name,Db::getTables())){ $_op->join("{$table_name} {$table_name}","cms_common.id={$table_name}.common_id",'left'); } if($table_base!=''){ $table_base = 'cms_'.$table_base; $_op->join("{$table_base} {$table_base}","cms_common.id={$table_base}.common_id",'left'); } //公共搜索查询 if (count($this->search_arr) > 0) { $_param = request()->param(); //搜索参数集合 $_op->where(function ($query) use ($_param) { foreach ($this->search_arr as $k => $v) { $search_arr = explode(':', $v); $search_name = $search_arr[0]; $logic = $search_arr[1] ?? 'AND'; if (array_key_exists($search_name, $_param)) { if (!empty($_param[$search_name])) { $query->whereLike($search_name, "%{$_param[$search_name]}%", $logic); } } } }); } $_op->where('delete_time is null'); $_op->where('site_id',SITE_ID); $_op->where('template_id',TEMPLATE_ID); //执行分页查询 $page = $this->request->param('page', config('page')); $limit = $this->request->param('limit', config('limit')); $count = $_op->count(); $this->listsOrder($_op); //统一排序 //无分页判断 $_op->page((int)$page, (int)$limit); $data = $_op->select()->toArray(); $data = $this->haddle_format_output($data,$field_info); $field_infos = []; $field_infos = $this->handdle_fields($field_info); $_data = [ 'data' => [ 'content_data'=>$data, 'module_info' => $module_info, 'field_info' => $field_infos, ], 'page_total' => $count, ]; // $_data = [ // 'data' => $_op->select()->toArray(), // 'page_total' => $count, // ]; return $_data; } public function addPost($postData){ foreach ($postData as &$item){ $item = htmlspecialchars_decode($item); } //获取模型关联的表 和 所有的字段 $cate_id = $this->request->param('cate_id', 0); //获取当前栏目信息 $cate_info = Db::name('cate')->find($cate_id); if(!$cate_info){ return ['code'=>'500','msg'=>'栏目不存在']; } $site_id = SITE_ID; $module_id = $cate_info['module_id']; //获取该栏目的模型和模型字段数据 $module_info = Db::name('module')->find($module_id); $field_info = Db::name('field')->where('module_id','=',$module_id)->where('is_add',1)->order('sort asc')->select(); $table_name = $this->cms_table.'_'.$module_info['table_name'].'_'.$site_id; $table_insert_name = 'cms_'.$module_info['table_name'].'_'.$site_id; $table_base = in_array($module_info['table_name'],config('cms.base_module'))?$module_info['table_name']:''; //格式化postData 与 校验字段 $h_postData = $this->handdle_post_data($postData,$field_info); if($h_postData['code']!=200){ return $h_postData; } //分表插入数据 $postData = $h_postData['postData']; //先插入主表 获取主表id $fields_common = Db::getTableFields($this->cms_table_prefix.'cms_common'); $common_data = ['site_id'=>$site_id,'create_time'=>time(),'update_time'=>time(),'template_id'=>TEMPLATE_ID]; foreach($fields_common as $item){ if(isset($postData[$item])){ $common_data[$item] = $postData[$item]; } } $common_id = Db::name('cms_common')->insert($common_data,true); if(!$common_id){ return ['code'=>500,'msg'=>'插入失败,稍后重试']; } if($table_base!=''){ $table_base ='cms_'.$table_base; $fields_base = Db::getTableFields($this->cms_table_prefix.$table_base); $base_data = ['common_id'=>$common_id]; foreach($fields_base as $item){ if(isset($postData[$item])){ $base_data[$item] = $postData[$item]; } } $base_id = Db::name($table_base)->insert($base_data,true); } if(in_array($table_name,Db::getTables())){ $table_base = $table_name; $fields_table = Db::getTableFields($table_base); $table_data = ['common_id'=>$common_id]; foreach($fields_table as $item){ if(isset($postData[$item])){ $table_data[$item] = $postData[$item]; } } $table_id = Db::name($table_insert_name)->insert($table_data,true); } if($common_id && ($base_id || $table_id)){ return ['data'=>$common_id,'code'=>200,'msg'=>'success']; }else{ //删除主表 Db::name('cms_common')->where('id',$common_id)->delete(); Db::name($table_base)->where('common_id',$common_id)->delete(); Db::name($table_insert_name)->where('common_id',$common_id)->delete(); return ['data'=>0,'code'=>500,'msg'=>'插入错误,稍后重试']; } } public function editPost($postData,$id){ foreach ($postData as &$item){ $item = htmlspecialchars_decode(strval($item)); } //获取模型关联的表 和 所有的字段 $site_id = SITE_ID; $common_id = isset($postData['id'])?$postData['id']:$id; //获取模型关联的表 和 所有的字段 $cate_id = $this->request->param('cate_id', 0); //获取当前栏目信息 $cate_info = Db::name('cate')->find($cate_id); if(!$cate_info ){ return ['code'=>201,'msg'=>'栏目不存在']; ; } if(!$common_id ){ return ['code'=>201,'msg'=>'id不存在']; ; } $site_id = SITE_ID; $module_id = $cate_info['module_id']; //获取该栏目的模型和模型字段数据 $module_info = Db::name('module')->find($module_id); $field_info = Db::name('field')->where('module_id','=',$module_id)->where('is_edit',1)->order('sort asc')->select(); $table_name = $this->cms_table.'_'.$module_info['table_name'].'_'.$site_id; $table_insert_name = 'cms_'.$module_info['table_name'].'_'.$site_id; $table_base = in_array($module_info['table_name'],config('cms.base_module'))?$module_info['table_name']:''; //格式化postData 与 校验字段 $h_postData = $this->handdle_post_data($postData,$field_info); if($h_postData['code']!=200){ return $h_postData; } $postData = $h_postData['postData']; //分表插入数据 unset($postData['id']); //先插入主表 获取主表id $fields_common = Db::getTableFields($this->cms_table_prefix.'cms_common'); $common_data = ['update_time'=>time()]; foreach($fields_common as $item){ if(isset($postData[$item])){ $common_data[$item] = $postData[$item]; } } Db::name('cms_common')->where('id',$common_id)->update($common_data,true); if($table_base!=''){ $table_base ='cms_'.$table_base; $fields_base = Db::getTableFields($this->cms_table_prefix.$table_base); $base_data = []; foreach($fields_base as $item){ if(isset($postData[$item])){ $base_data[$item] = $postData[$item]; } } Db::name($table_base)->where('common_id',$common_id)->update($base_data,true); } if(in_array($table_name,Db::getTables())){ $table_base = $table_name; $fields_table = Db::getTableFields($table_base); $table_data = []; foreach($fields_table as $item){ if(isset($postData[$item])){ $table_data[$item] = $postData[$item]; } } Db::name($table_insert_name)->where('common_id',$common_id)->update($table_data,true); } return ['data'=>$common_id,'code'=>200,'msg'=>'success']; } public function handdle_post_data($postData,$field_info){ $formatData = []; $code = 0; foreach ($field_info as $item){ if($item['required'] && !isset($postData[$item['field']])){ return ['code'=>201,'msg'=>'请填写'.$item['name']]; } if($item['minlength']>0 && isset($postData[$item['field']]) && strlen($postData[$item['field']])<$item['minlength']){ return ['code'=>201,'msg'=>$item['name'].'最小长度为:'.$item['minlength']]; } if($item['maxlength']>0 && isset($postData[$item['field']]) && strlen($postData[$item['field']])>$item['maxlength']){ return ['code'=>201,'msg'=>$item['name'].'最大长度为:'.$item['maxlength']]; } //如果是时间或者是日期时间 将字符串转化为时间 if($item['type'] == 'datetime' && isset($postData[$item['field']])){ $postData[$item['field']] = strtotime($postData[$item['field']] ); } } return ['code'=>200,'postData'=>$postData]; } public function handdle_fields($field_info){ $listFields = $editFields = $addFields = []; foreach ($field_info as $k=>$item){ $dicts = config('dict.sqlfields'); $value_arr = []; //如果字段来源是字典 则查询字典值作为值数组 if($item['data_source']==1){ if(isset($dicts[$item['dict_code']])){ $value_arr = $dicts[$item['dict_code']]; } }if($item['data_source']==2){ $fiels_sources = Db::name(strtolower($item['relation_model'])) ->where('site_id',SITE_ID) ->where('template_id',TEMPLATE_ID) ->where('status',1) ->select(); foreach ($fiels_sources as $item_model){ $value_arr[$item_model['id']] = $item_model[$item['relation_field']]; } } //列表显示字段 if($item['is_list']){ $listFields[$k]['field'] = $item['field']; $listFields[$k]['type'] = $item['type']; $listFields[$k]['data_source'] = $item['data_source']; $listFields[$k]['show_name'] = $item['name']; $listFields[$k]['show_value'] = $item['data_source'] == 0 ? $item['field'] : $item['field'].'_str'; } //添加显示字段 if($item['is_add']){ $addFields[$k]['field'] = $item['field']; $addFields[$k]['type'] = $item['type']; $addFields[$k]['data_source'] = $item['data_source']; $addFields[$k]['show_name'] = $item['name']; $addFields[$k]['tips'] = $item['tips']; $addFields[$k]['required'] = $item['required']; $addFields[$k]['minlength'] = $item['minlength']; $addFields[$k]['maxlength'] = $item['maxlength']; $addFields[$k]['value_arr'] = $value_arr; $addFields[$k]['is_arr'] = $item['data_source'] == 0 ? 0 : 1; $addFields[$k]['placeholder'] = $item['data_source'] == 0 ? '请输入'.$item['name'] : '请选择'.$item['name']; $addFields[$k]['relation_model'] = $item['relation_model']; $addFields[$k]['show_value'] = $item['data_source'] == 0 ? $item['field'] : $item['field'].'_str'; } //添加显示字段 if($item['is_edit']){ $editFields[$k]['field'] = $item['field']; $editFields[$k]['type'] = $item['type']; $editFields[$k]['data_source'] = $item['data_source']; $editFields[$k]['show_name'] = $item['name']; $editFields[$k]['tips'] = $item['tips']; $editFields[$k]['required'] = $item['required']; $editFields[$k]['minlength'] = $item['minlength']; $editFields[$k]['maxlength'] = $item['maxlength']; $editFields[$k]['value_arr'] = $value_arr; $editFields[$k]['is_arr'] = $item['data_source'] == 0 ? 0 : 1; $editFields[$k]['placeholder'] = $item['data_source'] == 0 ? '请输入'.$item['name'] : '请选择'.$item['name']; $editFields[$k]['relation_model'] = $item['relation_model']; $editFields[$k]['show_value'] = $item['data_source'] == 0 ? $item['field'] : $item['field'].'_str'; } } return [ 'list_fields'=>array_values($listFields), 'add_fields'=>array_values($addFields), 'editFields'=>array_values($editFields), ]; } /** * 数据排序 */ private function listsOrder(&$_op) { if ($_op->getOptions('order')) { return; } $sort = $this->request->get('sort'); $sort = in_array($sort, $this->checkAllowFields()) ? $sort : ''; $order = $this->request->get('order', 'DESC', 'strtoupper') == 'ASC' ? 'ASC' : 'DESC'; $sort_order = $sort . ' ' . $order; if (empty($sort)) { $sort_order = in_array('sort', $this->checkAllowFields()) ? 'sort DESC,create_time DESC' : 'create_time DESC'; } $_op->order($sort_order); } /** * 新增或修改前 * @param Model $model * @return mixed|void */ public static function onBeforeWrite(Model $model) { //设定child_list if (empty($model->getAttr('parent_id'))) { //parent_id = 0 一级栏目填充 $child_list = self::where('parent_id', 0)->max('child_list'); $child_list = !empty($child_list) ? (int)$child_list + 1 : 100; //如果不存在设置默认值 100起始 $model->setAttr('child_list', $child_list); } else { //子栏目填充 $child_list = self::where('parent_id', $model->getAttr('parent_id'))->max('child_list'); //同级最大 $parent_child_list = self::where('id', $model->getAttr('parent_id'))->value('child_list'); //父级初始 $child_list = !empty($child_list) ? (int)$child_list + 1 : $parent_child_list . '100'; $model->setAttr('child_list', $child_list); } parent::onBeforeWrite($model); } public static function onAfterDelete(Model $model) { //删除父级栏目下所有子栏目 if ($model->getAttr('child_list')) { self::where('child_list', 'like', $model->getAttr('child_list') . '%')->useSoftDelete('delete_time', time())->delete(); } parent::onAfterDelete($model); } //处理输出的字符格式 public function haddle_format_output($data,$field_info){ $fields = []; foreach ($field_info as $field){ $fields[$field['field']] = $field; } $dicts = config('dict.sqlfields'); foreach ($data as &$item){ foreach ($item as $k=>$field_value){ if(isset($fields[$k]) && $fields[$k]['data_source']==0 ){ //字段来源本身 看是否是时间戳转化即可 if(in_array($fields[$k]['type'],['datetime','time'])){ $item[$k] = date('Y-m-d H:i:s',$field_value); } }elseif(isset($fields[$k]) && $fields[$k]['data_source']==1){ $item[$k.'_str'] = ''; //如果字段来源是字典 则查询字典值进行替换 if(isset($dicts[$fields[$k]['dict_code']]) && isset($dicts[$fields[$k]['dict_code']][$field_value])){ $item[$k.'_str'] = $dicts[$fields[$k]['dict_code']][$field_value]; } }elseif(isset($fields[$k]) && $fields[$k]['data_source']==2){ //如果字段来源是模型 则要查询相关表进行查询 替换 $fiels_sources = Db::name(strtolower($fields[$k]['relation_model'])) ->where('id',$field_value) ->find(); $item[$k.'_str'] = isset($fiels_sources[strtolower($fields[$k]['relation_field'])])?$fiels_sources[strtolower($fields[$k]['relation_field'])]:''; } } } return $data; } }