You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

498 lines
18 KiB

<?php
declare (strict_types=1);
namespace app\api\model;
use think\facade\Db;
use think\Model;
/**
* @mixin think\Model
*/
class Content extends CmsCommon
{
public $table = 'bmz_cms_common';
protected $cms_table = 'bmz_cms';
protected $cms_table_prefix = 'bmz_';
/**
* 列表数据模型
* @return array|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function index()
{
$_data = [
'data' => [
'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;
}
}