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
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;
|
|
|
|
}
|
|
|
|
}
|
|
|