diff --git a/application/admin/controller/article/ArticleCategory.php b/application/admin/controller/article/ArticleCategory.php index a446e233..38b80671 100644 --- a/application/admin/controller/article/ArticleCategory.php +++ b/application/admin/controller/article/ArticleCategory.php @@ -1 +1,185 @@ -request); $this->assign('where',$where); $this->assign(ArticleCategoryModel::systemPage($where)); return $this->fetch(); } /** * 添加分类管理 * */ public function create(){ $f = array(); $f[] = Form::select('pid','父级id')->setOptions(function(){ $list = ArticleCategoryModel::getTierList(); $menus[] = ['value'=>0,'label'=>'顶级分类']; foreach ($list as $menu){ $menus[] = ['value'=>$menu['id'],'label'=>$menu['html'].$menu['title']]; } return $menus; })->filterable(1); $f[] = Form::input('title','分类名称'); $f[] = Form::input('intr','分类简介')->type('textarea'); // $f[] = Form::select('new_id','图文列表')->setOptions(function(){ // $list = ArticleModel::getNews(); // $options = []; // foreach ($list as $id=>$roleName){ // $options[] = ['label'=>$roleName,'value'=>$id]; // } // return $options; // })->multiple(1)->filterable(1); $f[] = Form::frameImageOne('image','分类图片',Url::build('admin/widget.images/index',array('fodder'=>'image')))->icon('image'); $f[] = Form::number('sort','排序',0); $f[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']]); $form = Form::make_post_form('添加分类',$f,Url::build('save')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * s上传图片 * */ public function upload(){ $res = Upload::image('file','article'); $thumbPath = Upload::thumb($res->dir); if($res->status == 200) return Json::successful('图片上传成功!',['name'=>$res->fileInfo->getSaveName(),'url'=>Upload::pathToUrl($thumbPath)]); else return Json::fail($res->error); } /** * 保存分类管理 * */ public function save(Request $request){ $data = Util::postMore([ 'title', 'pid', 'intr', ['new_id',[]], ['image',[]], ['sort',0], 'status',],$request); if(!$data['title']) return Json::fail('请输入分类名称'); if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); if($data['sort'] < 0) return Json::fail('排序不能是负数'); $data['add_time'] = time(); $data['image'] = $data['image'][0]; $new_id = $data['new_id']; unset($data['new_id']); $res = ArticleCategoryModel::set($data); if(!ArticleModel::saveBatchCid($res['id'],implode(',',$new_id))) return Json::fail('文章列表添加失败'); return Json::successful('添加分类成功!'); } /** * 修改分类 * */ public function edit($id){ if(!$id) return $this->failed('参数错误'); $article = ArticleCategoryModel::get($id)->getData(); if(!$article) return Json::fail('数据不存在!'); $f = array(); $f[] = Form::select('pid','父级id',(string)$article['pid'])->setOptions(function(){ $list = ArticleCategoryModel::getTierList(); $menus[] = ['value'=>0,'label'=>'顶级分类']; foreach ($list as $menu){ $menus[] = ['value'=>$menu['id'],'label'=>$menu['html'].$menu['title']]; } return $menus; })->filterable(1); $f[] = Form::input('title','分类名称',$article['title']); $f[] = Form::input('intr','分类简介',$article['intr'])->type('textarea'); // $f[] = Form::select('new_id','图文列表',explode(',',$article->getData('new_id')))->setOptions(function(){ // $list = ArticleModel::getNews(); // $options = []; // foreach ($list as $id=>$roleName){ // $options[] = ['label'=>$roleName,'value'=>$id]; // } // return $options; // })->multiple(1)->filterable(1); $f[] = Form::frameImageOne('image','分类图片',Url::build('admin/widget.images/index',array('fodder'=>'image')),$article['image'])->icon('image'); $f[] = Form::number('sort','排序',0); $f[] = Form::radio('status','状态',$article['status'])->options([['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']]); $form = Form::make_post_form('编辑分类',$f,Url::build('update',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update(Request $request, $id) { $data = Util::postMore([ 'pid', 'title', 'intr', // ['new_id',[]], ['image',[]], ['sort',0], 'status',],$request); if(!$data['title']) return Json::fail('请输入分类名称'); if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); if($data['sort'] < 0) return Json::fail('排序不能是负数'); $data['image'] = $data['image'][0]; if(!ArticleCategoryModel::get($id)) return Json::fail('编辑的记录不存在!'); // if(!ArticleModel::saveBatchCid($id,implode(',',$data['new_id']))) return Json::fail('文章列表添加失败'); // unset($data['new_id']); ArticleCategoryModel::edit($data,$id); return Json::successful('修改成功!'); } /** * 删除分类 * */ public function delete($id) { $res = ArticleCategoryModel::delArticleCategory($id); if(!$res) return Json::fail(ArticleCategoryModel::getErrorInfo('删除失败,请稍候再试!')); else return Json::successful('删除成功!'); } } \ No newline at end of file +request); + $this->assign('where',$where); + $this->assign(ArticleCategoryModel::systemPage($where)); + return $this->fetch(); + } + + /** + + * 添加分类管理 + + * */ + + public function create(){ + $f = array(); + $f[] = Form::select('pid','父级id')->setOptions(function(){ + $list = ArticleCategoryModel::getTierList(); + $menus[] = ['value'=>0,'label'=>'顶级分类']; + foreach ($list as $menu){ + $menus[] = ['value'=>$menu['id'],'label'=>$menu['html'].$menu['title']]; + } + return $menus; + })->filterable(1); + $f[] = Form::input('title','分类名称'); + $f[] = Form::input('intr','分类简介')->type('textarea'); +// $f[] = Form::select('new_id','图文列表')->setOptions(function(){ +// $list = ArticleModel::getNews(); +// $options = []; +// foreach ($list as $id=>$roleName){ +// $options[] = ['label'=>$roleName,'value'=>$id]; +// } +// return $options; +// })->multiple(1)->filterable(1); + $f[] = Form::frameImageOne('image','分类图片',Url::build('admin/widget.images/index',array('fodder'=>'image')))->icon('image'); + $f[] = Form::number('sort','排序',0); + $f[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']]); + $form = Form::make_post_form('添加分类',$f,Url::build('save')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + + } + + /** + * s上传图片 + * */ + public function upload(){ + $res = Upload::image('file','article'); + $thumbPath = Upload::thumb($res->dir); + if($res->status == 200) + return Json::successful('图片上传成功!',['name'=>$res->fileInfo->getSaveName(),'url'=>Upload::pathToUrl($thumbPath)]); + else + return Json::fail($res->error); + } + + /** + + * 保存分类管理 + + * */ + + public function save(Request $request){ + $data = Util::postMore([ + 'title', + 'pid', + 'intr', + ['new_id',[]], + ['image',[]], + ['sort',0], + 'status',],$request); + if(!$data['title']) return Json::fail('请输入分类名称'); + if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); + if($data['sort'] < 0) return Json::fail('排序不能是负数'); + $data['add_time'] = time(); + $data['image'] = $data['image'][0]; + $new_id = $data['new_id']; + unset($data['new_id']); + $res = ArticleCategoryModel::set($data); + if(!ArticleModel::saveBatchCid($res['id'],implode(',',$new_id))) return Json::fail('文章列表添加失败'); + return Json::successful('添加分类成功!'); + } + + /** + + * 修改分类 + + * */ + + public function edit($id){ + if(!$id) return $this->failed('参数错误'); + $article = ArticleCategoryModel::get($id)->getData(); + if(!$article) return Json::fail('数据不存在!'); + $f = array(); + $f[] = Form::select('pid','父级id',(string)$article['pid'])->setOptions(function(){ + $list = ArticleCategoryModel::getTierList(); + $menus[] = ['value'=>0,'label'=>'顶级分类']; + foreach ($list as $menu){ + $menus[] = ['value'=>$menu['id'],'label'=>$menu['html'].$menu['title']]; + } + return $menus; + })->filterable(1); + $f[] = Form::input('title','分类名称',$article['title']); + $f[] = Form::input('intr','分类简介',$article['intr'])->type('textarea'); +// $f[] = Form::select('new_id','图文列表',explode(',',$article->getData('new_id')))->setOptions(function(){ +// $list = ArticleModel::getNews(); +// $options = []; +// foreach ($list as $id=>$roleName){ +// $options[] = ['label'=>$roleName,'value'=>$id]; +// } +// return $options; +// })->multiple(1)->filterable(1); + $f[] = Form::frameImageOne('image','分类图片',Url::build('admin/widget.images/index',array('fodder'=>'image')),$article['image'])->icon('image'); + $f[] = Form::number('sort','排序',0); + $f[] = Form::radio('status','状态',$article['status'])->options([['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']]); + $form = Form::make_post_form('编辑分类',$f,Url::build('update',array('id'=>$id))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + + } + + + + public function update(Request $request, $id) + { + $data = Util::postMore([ + 'pid', + 'title', + 'intr', +// ['new_id',[]], + ['image',[]], + ['sort',0], + 'status',],$request); + if(!$data['title']) return Json::fail('请输入分类名称'); + if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); + if($data['sort'] < 0) return Json::fail('排序不能是负数'); + $data['image'] = $data['image'][0]; + if(!ArticleCategoryModel::get($id)) return Json::fail('编辑的记录不存在!'); +// if(!ArticleModel::saveBatchCid($id,implode(',',$data['new_id']))) return Json::fail('文章列表添加失败'); +// unset($data['new_id']); + ArticleCategoryModel::edit($data,$id); + return Json::successful('修改成功!'); + } + + /** + * 删除分类 + * */ + public function delete($id) + { + $res = ArticleCategoryModel::delArticleCategory($id); + if(!$res) + return Json::fail(ArticleCategoryModel::getErrorInfo('删除失败,请稍候再试!')); + else + return Json::successful('删除成功!'); + } + + +} + diff --git a/application/admin/controller/setting/SystemConfig.php b/application/admin/controller/setting/SystemConfig.php index 8ba46bda..4f179d00 100644 --- a/application/admin/controller/setting/SystemConfig.php +++ b/application/admin/controller/setting/SystemConfig.php @@ -1 +1,334 @@ -assign('tab_id',$tab_id); $list = ConfigModel::getAll($tab_id); if($type==3){//其它分类 $config_tab = null; }else{ $config_tab = ConfigModel::getConfigTabAll($type); foreach ($config_tab as $kk=>$vv){ $arr = ConfigModel::getAll($vv['value'])->toArray(); if(empty($arr)){ unset($config_tab[$kk]); } } } foreach ($list as $k=>$v){ if(!is_null(json_decode($v['value']))) $list[$k]['value'] = json_decode($v['value'],true); if($v['type'] == 'upload' && !empty($v['value'])){ if($v['upload_type'] == 1 || $v['upload_type'] == 3) $list[$k]['value'] = explode(',',$v['value']); } } $this->assign('config_tab',$config_tab); $this->assign('list',$list); return $this->fetch(); } /** * 基础配置 单个 * @return mixed|void */ public function index_alone(){ $tab_id = input('tab_id'); if(!$tab_id) return $this->failed('参数错误,请重新打开'); $this->assign('tab_id',$tab_id); $list = ConfigModel::getAll($tab_id); foreach ($list as $k=>$v){ if(!is_null(json_decode($v['value']))) $list[$k]['value'] = json_decode($v['value'],true); if($v['type'] == 'upload' && !empty($v['value'])){ if($v['upload_type'] == 1 || $v['upload_type'] == 3) $list[$k]['value'] = explode(',',$v['value']); } } $this->assign('list',$list); return $this->fetch(); } /** * 添加字段 * */ public function create(Request $request){ $data = Util::getMore(['type',],$request);//接收参数 $tab_id = !empty($request->param('tab_id'))?$request->param('tab_id'):1; $formbuider = array(); switch ($data['type']){ case 0://文本框 $formbuider = ConfigModel::createInputRule($tab_id); break; case 1://多行文本框 $formbuider = ConfigModel::createTextAreaRule($tab_id); break; case 2://单选框 $formbuider = ConfigModel::createRadioRule($tab_id); break; case 3://文件上传 $formbuider = ConfigModel::createUploadRule($tab_id); break; case 4://多选框 $formbuider = ConfigModel::createCheckboxRule($tab_id); break; } $form = Form::make_post_form('添加字段',$formbuider,Url::build('save')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 保存字段 * */ public function save(Request $request){ $data = Util::postMore([ 'menu_name', 'type', 'config_tab_id', 'parameter', 'upload_type', 'required', 'width', 'high', 'value', 'info', 'desc', 'sort', 'status',],$request); if(!$data['info']) return Json::fail('请输入配置名称'); if(!$data['menu_name']) return Json::fail('请输入字段名称'); if($data['menu_name']){ $oneConfig = ConfigModel::getOneConfig('menu_name',$data['menu_name']); if(!empty($oneConfig)) return Json::fail('请重新输入字段名称,之前的已经使用过了'); } if(!$data['desc']) return Json::fail('请输入配置简介'); if($data['sort'] < 0){ $data['sort'] = 0; } if($data['type'] == 'text'){ if(!ConfigModel::valiDateTextRole($data)) return Json::fail(ConfigModel::getErrorInfo()); } if($data['type'] == 'textarea'){ if(!ConfigModel::valiDateTextareaRole($data)) return Json::fail(ConfigModel::getErrorInfo()); } if($data['type'] == 'radio' || $data['type'] == 'checkbox' ){ if(!$data['parameter']) return Json::fail('请输入配置参数'); if(!ConfigModel::valiDateRadioAndCheckbox($data)) return Json::fail(ConfigModel::getErrorInfo()); $data['value'] = json_encode($data['value']); } ConfigModel::set($data); return Json::successful('添加菜单成功!'); } /** * @param Request $request * @param $id * @return \think\response\Json */ public function update_config(Request $request, $id) { $type = $request->post('type'); if($type =='text' || $type =='textarea'|| $type == 'radio' || ($type == 'upload' && ($request->post('upload_type') == 1 || $request->post('upload_type') == 3))){ $value = $request->post('value'); }else{ $value = $request->post('value/a'); } $data = Util::postMore(['status','info','desc','sort','config_tab_id','required','parameter',['value',$value],'upload_type'],$request); $data['value'] = json_encode($data['value']); if(!ConfigModel::get($id)) return Json::fail('编辑的记录不存在!'); ConfigModel::edit($data,$id); return Json::successful('修改成功!'); } /** * 修改是否显示子子段 * @param $id * @return mixed */ public function edit_cinfig($id){ $menu = ConfigModel::get($id)->getData(); if(!$menu) return Json::fail('数据不存在!'); $formbuider = array(); $formbuider[] = Form::input('menu_name','字段变量',$menu['menu_name'])->disabled(1); // $formbuider[] = Form::input('type','字段类型',$menu['type'])->disabled(1); $formbuider[] = Form::hidden('type',$menu['type']); $formbuider[] = Form::select('config_tab_id','分类',(string)$menu['config_tab_id'])->setOptions(ConfigModel::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称',$menu['info'])->autofocus(1); $formbuider[] = Form::input('desc','配置简介',$menu['desc']); switch ($menu['type']){ case 'text': $menu['value'] = json_decode($menu['value'],true); //输入框验证规则 $formbuider[] = Form::input('value','默认值',$menu['value']); if(!empty($menu['required'])){ $formbuider[] = Form::number('width','文本框宽(%)',$menu['width']); $formbuider[] = Form::input('required','验证规则',$menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true'); } break; case 'textarea': $menu['value'] = json_decode($menu['value'],true); //多行文本 if(!empty($menu['high'])){ $formbuider[] = Form::textarea('value','默认值',$menu['value'])->rows(5); $formbuider[] = Form::number('width','文本框宽(%)',$menu['width']); $formbuider[] = Form::number('high','多行文本框高(%)',$menu['high']); }else{ $formbuider[] = Form::input('value','默认值',$menu['value']); } break; case 'radio': $menu['value'] = json_decode($menu['value'],true); $parameter = explode("\n",$menu['parameter']); $options = []; if($parameter){ foreach ($parameter as $v){ $data = explode("=>",$v); $options[] = ['label'=>$data[1],'value'=>$data[0]]; } $formbuider[] = Form::radio('value','默认值',$menu['value'])->options($options); } //单选和多选参数配置 if(!empty($menu['parameter'])){ $formbuider[] = Form::textarea('parameter','配置参数',$menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色"); } break; case 'checkbox': $menu['value'] = json_decode($menu['value'],true)?:[]; $parameter = explode("\n",$menu['parameter']); $options = []; if($parameter) { foreach ($parameter as $v) { $data = explode("=>", $v); $options[] = ['label' => $data[1], 'value' => $data[0]]; } $formbuider[] = Form::checkbox('value', '默认值', $menu['value'])->options($options); } //单选和多选参数配置 if(!empty($menu['parameter'])){ $formbuider[] = Form::textarea('parameter','配置参数',$menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色"); } break; case 'upload': if($menu['upload_type'] == 1 ){ $menu['value'] = json_decode($menu['value'],true); $formbuider[] = Form::frameImageOne('value','图片',Url::build('admin/widget.images/index',array('fodder'=>'value')),(string)$menu['value'])->icon('image')->width('100%')->height('550px'); }elseif ($menu['upload_type'] == 2 ){ $menu['value'] = json_decode($menu['value'],true)?:[]; $formbuider[] = Form::frameImages('value','多图片',Url::build('admin/widget.images/index',array('fodder'=>'value')),$menu['value'])->maxLength(5)->icon('images')->width('100%')->height('550px')->spin(0); }else{ $menu['value'] = json_decode($menu['value'],true); $formbuider[] = Form::uploadFileOne('value','文件',Url::build('file_upload'))->name('file'); } //上传类型选择 if(!empty($menu['upload_type'])){ $formbuider[] = Form::radio('upload_type','上传类型',$menu['upload_type'])->options([['value'=>1,'label'=>'单图'],['value'=>2,'label'=>'多图'],['value'=>3,'label'=>'文件']]); } break; } $formbuider[] = Form::number('sort','排序',$menu['sort']); $formbuider[] = Form::radio('status','状态',$menu['status'])->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); $form = Form::make_post_form('编辑字段',$formbuider,Url::build('update_config',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 删除子字段 * @return \think\response\Json */ public function delete_cinfig(){ $id = input('id'); if(!ConfigModel::del($id)) return Json::fail(ConfigModel::getErrorInfo('删除失败,请稍候再试!')); else return Json::successful('删除成功!'); } /** * 保存数据 true * */ public function save_basics(){ $request = Request::instance(); if($request->isPost()){ $post = $request->post(); $tab_id = $post['tab_id']; unset($post['tab_id']); foreach ($post as $k=>$v){ if(is_array($v)){ $res = ConfigModel::where('menu_name',$k)->column('type,upload_type'); foreach ($res as $kk=>$vv){ if($kk == 'upload'){ if($vv == 1 || $vv == 3){ $post[$k] = $v[0]; } } } } } foreach ($post as $k=>$v){ ConfigModel::edit(['value' => json_encode($v)],$k,'menu_name'); } return $this->successfulNotice('修改成功'); } } /** * 模板表单提交 * */ public function view_upload(){ if($_POST['type'] == 3){ $res = Upload::file($_POST['file'],'config/file'); }else{ $res = Upload::Image($_POST['file'],'config/image'); } if(!$res->status) return Json::fail($res->error); return Json::successful('上传成功!',['url'=>$res->filePath]); } /** * 文件上传 * */ public function file_upload(){ $res = Upload::file($_POST['file'],'config/file'); if(!$res->status) return Json::fail($res->error); return Json::successful('上传成功!',['url'=>$res->filePath]); } /** * 获取文件名 * */ public function getImageName(){ $request = Request::instance(); $post = $request->post(); $src = $post['src']; $data['name'] = basename($src); exit(json_encode($data)); } } \ No newline at end of file +assign('tab_id',$tab_id); + $list = ConfigModel::getAll($tab_id); + if($type==3){//其它分类 + $config_tab = null; + }else{ + $config_tab = ConfigModel::getConfigTabAll($type); + foreach ($config_tab as $kk=>$vv){ + $arr = ConfigModel::getAll($vv['value'])->toArray(); + if(empty($arr)){ + unset($config_tab[$kk]); + } + } + } + foreach ($list as $k=>$v){ + if(!is_null(json_decode($v['value']))) + $list[$k]['value'] = json_decode($v['value'],true); + if($v['type'] == 'upload' && !empty($v['value'])){ + if($v['upload_type'] == 1 || $v['upload_type'] == 3) $list[$k]['value'] = explode(',',$v['value']); + } + } + $this->assign('config_tab',$config_tab); + $this->assign('list',$list); + return $this->fetch(); + } + /** + * 基础配置 单个 + * @return mixed|void + */ + public function index_alone(){ + $tab_id = input('tab_id'); + if(!$tab_id) return $this->failed('参数错误,请重新打开'); + $this->assign('tab_id',$tab_id); + $list = ConfigModel::getAll($tab_id); + foreach ($list as $k=>$v){ + if(!is_null(json_decode($v['value']))) + $list[$k]['value'] = json_decode($v['value'],true); + if($v['type'] == 'upload' && !empty($v['value'])){ + if($v['upload_type'] == 1 || $v['upload_type'] == 3) $list[$k]['value'] = explode(',',$v['value']); + } + } + $this->assign('list',$list); + return $this->fetch(); + } + /** + * 添加字段 + * */ + public function create(Request $request){ + $data = Util::getMore(['type',],$request);//接收参数 + $tab_id = !empty($request->param('tab_id'))?$request->param('tab_id'):1; + $formbuider = array(); + switch ($data['type']){ + case 0://文本框 + $formbuider = ConfigModel::createInputRule($tab_id); + break; + case 1://多行文本框 + $formbuider = ConfigModel::createTextAreaRule($tab_id); + break; + case 2://单选框 + $formbuider = ConfigModel::createRadioRule($tab_id); + break; + case 3://文件上传 + $formbuider = ConfigModel::createUploadRule($tab_id); + break; + case 4://多选框 + $formbuider = ConfigModel::createCheckboxRule($tab_id); + break; + } + $form = Form::make_post_form('添加字段',$formbuider,Url::build('save')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + /** + * 保存字段 + * */ + public function save(Request $request){ + $data = Util::postMore([ + 'menu_name', + 'type', + 'config_tab_id', + 'parameter', + 'upload_type', + 'required', + 'width', + 'high', + 'value', + 'info', + 'desc', + 'sort', + 'status',],$request); + if(!$data['info']) return Json::fail('请输入配置名称'); + if(!$data['menu_name']) return Json::fail('请输入字段名称'); + if($data['menu_name']){ + $oneConfig = ConfigModel::getOneConfig('menu_name',$data['menu_name']); + if(!empty($oneConfig)) return Json::fail('请重新输入字段名称,之前的已经使用过了'); + } + if(!$data['desc']) return Json::fail('请输入配置简介'); + if($data['sort'] < 0){ + $data['sort'] = 0; + } + if($data['type'] == 'text'){ + if(!ConfigModel::valiDateTextRole($data)) return Json::fail(ConfigModel::getErrorInfo()); + } + if($data['type'] == 'textarea'){ + if(!ConfigModel::valiDateTextareaRole($data)) return Json::fail(ConfigModel::getErrorInfo()); + } + if($data['type'] == 'radio' || $data['type'] == 'checkbox' ){ + if(!$data['parameter']) return Json::fail('请输入配置参数'); + if(!ConfigModel::valiDateRadioAndCheckbox($data)) return Json::fail(ConfigModel::getErrorInfo()); + $data['value'] = json_encode($data['value']); + } + ConfigModel::set($data); + return Json::successful('添加菜单成功!'); + } + /** + * @param Request $request + * @param $id + * @return \think\response\Json + */ + public function update_config(Request $request, $id) + { + $type = $request->post('type'); + if($type =='text' || $type =='textarea'|| $type == 'radio' || ($type == 'upload' && ($request->post('upload_type') == 1 || $request->post('upload_type') == 3))){ + $value = $request->post('value'); + }else{ + $value = $request->post('value/a'); + } + $data = Util::postMore(['status','info','desc','sort','config_tab_id','required','parameter',['value',$value],'upload_type'],$request); + $data['value'] = json_encode($data['value']); + if(!ConfigModel::get($id)) return Json::fail('编辑的记录不存在!'); + ConfigModel::edit($data,$id); + return Json::successful('修改成功!'); + } + + /** + * 修改是否显示子子段 + * @param $id + * @return mixed + */ + public function edit_cinfig($id){ + $menu = ConfigModel::get($id)->getData(); + if(!$menu) return Json::fail('数据不存在!'); + $formbuider = array(); + $formbuider[] = Form::input('menu_name','字段变量',$menu['menu_name'])->disabled(1); +// $formbuider[] = Form::input('type','字段类型',$menu['type'])->disabled(1); + $formbuider[] = Form::hidden('type',$menu['type']); + $formbuider[] = Form::select('config_tab_id','分类',(string)$menu['config_tab_id'])->setOptions(ConfigModel::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称',$menu['info'])->autofocus(1); + $formbuider[] = Form::input('desc','配置简介',$menu['desc']); + switch ($menu['type']){ + case 'text': + $menu['value'] = json_decode($menu['value'],true); + //输入框验证规则 + $formbuider[] = Form::input('value','默认值',$menu['value']); + if(!empty($menu['required'])){ + $formbuider[] = Form::number('width','文本框宽(%)',$menu['width']); + $formbuider[] = Form::input('required','验证规则',$menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true'); + } + break; + case 'textarea': + $menu['value'] = json_decode($menu['value'],true); + //多行文本 + if(!empty($menu['high'])){ + $formbuider[] = Form::textarea('value','默认值',$menu['value'])->rows(5); + $formbuider[] = Form::number('width','文本框宽(%)',$menu['width']); + $formbuider[] = Form::number('high','多行文本框高(%)',$menu['high']); + }else{ + $formbuider[] = Form::input('value','默认值',$menu['value']); + } + break; + case 'radio': + $menu['value'] = json_decode($menu['value'],true); + $parameter = explode("\n",$menu['parameter']); + $options = []; + if($parameter){ + foreach ($parameter as $v){ + $data = explode("=>",$v); + $options[] = ['label'=>$data[1],'value'=>$data[0]]; + } + $formbuider[] = Form::radio('value','默认值',$menu['value'])->options($options); + } + //单选和多选参数配置 + if(!empty($menu['parameter'])){ + $formbuider[] = Form::textarea('parameter','配置参数',$menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色"); + } + break; + case 'checkbox': + $menu['value'] = json_decode($menu['value'],true)?:[]; + $parameter = explode("\n",$menu['parameter']); + $options = []; + if($parameter) { + foreach ($parameter as $v) { + $data = explode("=>", $v); + $options[] = ['label' => $data[1], 'value' => $data[0]]; + } + $formbuider[] = Form::checkbox('value', '默认值', $menu['value'])->options($options); + } + //单选和多选参数配置 + if(!empty($menu['parameter'])){ + $formbuider[] = Form::textarea('parameter','配置参数',$menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色"); + } + break; + case 'upload': + if($menu['upload_type'] == 1 ){ + $menu['value'] = json_decode($menu['value'],true); + $formbuider[] = Form::frameImageOne('value','图片',Url::build('admin/widget.images/index',array('fodder'=>'value')),(string)$menu['value'])->icon('image')->width('100%')->height('550px'); + }elseif ($menu['upload_type'] == 2 ){ + $menu['value'] = json_decode($menu['value'],true)?:[]; + $formbuider[] = Form::frameImages('value','多图片',Url::build('admin/widget.images/index',array('fodder'=>'value')),$menu['value'])->maxLength(5)->icon('images')->width('100%')->height('550px')->spin(0); + }else{ + $menu['value'] = json_decode($menu['value'],true); + $formbuider[] = Form::uploadFileOne('value','文件',Url::build('file_upload'))->name('file'); + } + //上传类型选择 + if(!empty($menu['upload_type'])){ + $formbuider[] = Form::radio('upload_type','上传类型',$menu['upload_type'])->options([['value'=>1,'label'=>'单图'],['value'=>2,'label'=>'多图'],['value'=>3,'label'=>'文件']]); + } + break; + + } + $formbuider[] = Form::number('sort','排序',$menu['sort']); + $formbuider[] = Form::radio('status','状态',$menu['status'])->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + + $form = Form::make_post_form('编辑字段',$formbuider,Url::build('update_config',array('id'=>$id))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + /** + * 删除子字段 + * @return \think\response\Json + */ + public function delete_cinfig(){ + $id = input('id'); + if(!ConfigModel::del($id)) + return Json::fail(ConfigModel::getErrorInfo('删除失败,请稍候再试!')); + else + return Json::successful('删除成功!'); + } + + /** + * 保存数据 true + * */ + public function save_basics(){ + $request = Request::instance(); + if($request->isPost()){ + $post = $request->post(); + $tab_id = $post['tab_id']; + unset($post['tab_id']); + foreach ($post as $k=>$v){ + if(is_array($v)){ + $res = ConfigModel::where('menu_name',$k)->column('type,upload_type'); + foreach ($res as $kk=>$vv){ + if($kk == 'upload'){ + if($vv == 1 || $vv == 3){ + $post[$k] = $v[0]; + } + } + } + } + } + foreach ($post as $k=>$v){ + ConfigModel::edit(['value' => json_encode($v)],$k,'menu_name'); + } + return $this->successfulNotice('修改成功'); + } + } + /** + * 模板表单提交 + * */ + public function view_upload(){ + if($_POST['type'] == 3){ + $res = Upload::file($_POST['file'],'config/file'); + }else{ + $res = Upload::Image($_POST['file'],'config/image'); + } + if(!$res->status) return Json::fail($res->error); + return Json::successful('上传成功!',['url'=>$res->dir]); + } + /** + * 文件上传 + * */ + public function file_upload(){ + $res = Upload::file($_POST['file'],'config/file'); + if(!$res->status) return Json::fail($res->error); + return Json::successful('上传成功!',['url'=>$res->dir]); + } + + + /** + * 获取文件名 + * */ + public function getImageName(){ + $request = Request::instance(); + $post = $request->post(); + $src = $post['src']; + $data['name'] = basename($src); + exit(json_encode($data)); + } + /** + * 删除原来图片 + * @param $url + */ + public function rmPublicResource($url) + { + $res = Util::rmPublicResource($url); + if($res->status) + return $this->successful('删除成功!'); + else + return $this->failed($res->msg); + } +} diff --git a/application/admin/controller/setting/SystemNotice.php b/application/admin/controller/setting/SystemNotice.php index 39d02ca2..3e7f7027 100644 --- a/application/admin/controller/setting/SystemNotice.php +++ b/application/admin/controller/setting/SystemNotice.php @@ -1 +1,126 @@ -assign(NoticeModel::page(function($notice){ $notice->push_admin_name = !empty($notice->push_admin) ? implode(',',SystemAdmin::where('id','IN',$notice->push_admin)->column('real_name')) : ''; })); return $this->fetch(); } public function create() { $f = array(); $f[] = Form::input('title','通知标题'); $f[] = Form::input('type','通知类型'); $f[] = Form::frameInputOne('icon','图标',Url::build('admin/widget.widgets/icon',array('fodder'=>'icon')))->icon('ionic'); $f[] = Form::input('template','通知模板'); $f[] = Form::input('table_title','通知数据')->type('textarea')->placeholder('数据1-key1,数据2-key2'); $f[] = Form::select('push_admin','通知管理员')->setOptions(function(){ $list = SystemAdmin::getOrdAdmin('real_name,id')?:[]; $options = []; foreach ($list as $admin){ $options[] = ['label'=>$admin['real_name'],'value'=>$admin['id']]; } return $options; })->multiple(1); $f[] = Form::radio('status','状态',1)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); $form = Form::make_post_form('添加通知模板',$f,Url::build('save')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function save(Request $request) { $data = UtilService::postMore([ 'title', 'type', 'icon', 'template','table_title', ['push_admin', []], ['status', 0] ], $request); $data['push_admin'] = array_unique(array_filter($data['push_admin'])); if (!$data['template']) return $this->failed('请填写通知模板'); if (!$data['title']) return $this->failed('请输入模板标题'); if (!$data['type']) return $this->failed('请输入模板类型'); if (NoticeModel::set($data)) return $this->successful('添加通知成功'); else return $this->failed('添加失败!'); } /**编辑通知模板 * @param $id * @return mixed|void */ public function edit($id) { $data = NoticeModel::get($id); if(!$data) return JsonService::fail('数据不存在!'); $data->tableTitle = implode(',',array_map(function($value){ return $value['title'].'-'.$value['key']; },$data->table_title)); $data->tableTitleStr = implode(',',array_map(function($value){ return $value['title'].'-'.$value['key']; },$data->table_title)); $f = array(); $f[] = Form::input('title','通知标题',$data->title); $f[] = Form::input('type','通知类型',$data->type); $f[] = Form::frameInputOne('icon','图标',Url::build('admin/widget.widgets/icon',array('fodder'=>'icon')),$data->icon)->icon('ionic'); $f[] = Form::input('template','通知模板',$data->template); $f[] = Form::input('table_title','通知数据',$data->tableTitleStr)->type('textarea')->placeholder('数据1-key1,数据2-key2'); $f[] = Form::select('push_admin','通知管理员',$data->push_admin)->setOptions(function(){ $list = SystemAdmin::getOrdAdmin('real_name,id')?:[]; $options = []; foreach ($list as $admin){ $options[] = ['label'=>$admin['real_name'],'value'=>$admin['id']]; } return $options; })->multiple(1); $f[] = Form::radio('status','状态',$data->status)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); $form = Form::make_post_form('编辑通知模板',$f,Url::build('update',array('id'=>$id))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update(Request $request, $id) { $data = UtilService::postMore([ 'title','type','icon','template','table_title', ['push_admin',[]],['status',0] ],$request); $data['push_admin'] = array_unique(array_filter($data['push_admin'])); if(!$data['template']) return $this->failed('请填写通知模板'); if(!$data['title']) return $this->failed('请输入模板标题'); if(!$data['type']) return $this->failed('请输入模板类型'); NoticeModel::edit($data,$id); return $this->successful('修改成功!'); } /** * 删除指定资源 * * @param int $id * @return \think\Response */ public function delete($id) { $res = NoticeModel::del($id); if(!$res) return $this->failed(('删除失败,请稍候再试!')); else return $this->successful('删除成功!'); } public function message($type = 'all') { return $this->fetch(); } } \ No newline at end of file +assign(NoticeModel::page(function($notice){ + $notice->push_admin_name = !empty($notice->push_admin) ? implode(',',SystemAdmin::where('id','IN',$notice->push_admin)->column('real_name')) : ''; + })); + return $this->fetch(); + } + + public function create() + { + $f = array(); + $f[] = Form::input('title','通知标题'); + $f[] = Form::input('type','通知类型'); + $f[] = Form::frameInputOne('icon','图标',Url::build('admin/widget.widgets/icon',array('fodder'=>'icon')))->icon('ionic'); + $f[] = Form::input('template','通知模板'); + $f[] = Form::input('table_title','通知数据')->type('textarea')->placeholder('数据1-key1,数据2-key2'); + $f[] = Form::select('push_admin','通知管理员')->setOptions(function(){ + $list = SystemAdmin::getOrdAdmin('real_name,id')?:[]; + $options = []; + foreach ($list as $admin){ + $options[] = ['label'=>$admin['real_name'],'value'=>$admin['id']]; + } + return $options; + })->multiple(1); + $f[] = Form::radio('status','状态',1)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); + $form = Form::make_post_form('添加通知模板',$f,Url::build('save')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + public function save(Request $request) + { + $data = UtilService::postMore([ + 'title', 'type', 'icon', 'template','table_title', + ['push_admin', []], ['status', 0] + ], $request); + $data['push_admin'] = array_unique(array_filter($data['push_admin'])); + if (!$data['template']) return $this->failed('请填写通知模板'); + if (!$data['title']) return $this->failed('请输入模板标题'); + if (!$data['type']) return $this->failed('请输入模板类型'); + if (NoticeModel::set($data)) + return $this->successful('添加通知成功'); + else + return $this->failed('添加失败!'); + } + + /**编辑通知模板 + * @param $id + * @return mixed|void + */ + public function edit($id) + { + $data = NoticeModel::get($id); + if(!$data) return JsonService::fail('数据不存在!'); + $data->tableTitle = implode(',',array_map(function($value){ + return $value['title'].'-'.$value['key']; + },$data->table_title)); + $data->tableTitleStr = implode(',',array_map(function($value){ + return $value['title'].'-'.$value['key']; + },$data->table_title)); + $f = array(); + $f[] = Form::input('title','通知标题',$data->title); + $f[] = Form::input('type','通知类型',$data->type); + $f[] = Form::frameInputOne('icon','图标',Url::build('admin/widget.widgets/icon',array('fodder'=>'icon')),$data->icon)->icon('ionic'); + $f[] = Form::input('template','通知模板',$data->template); + $f[] = Form::input('table_title','通知数据',$data->tableTitleStr)->type('textarea')->placeholder('数据1-key1,数据2-key2'); + $f[] = Form::select('push_admin','通知管理员',$data->push_admin)->setOptions(function(){ + $list = SystemAdmin::getOrdAdmin('real_name,id')?:[]; + $options = []; + foreach ($list as $admin){ + $options[] = ['label'=>$admin['real_name'],'value'=>$admin['id']]; + } + return $options; + })->multiple(1); + $f[] = Form::radio('status','状态',$data->status)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]); + $form = Form::make_post_form('编辑通知模板',$f,Url::build('update',array('id'=>$id))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + public function update(Request $request, $id) + { + $data = UtilService::postMore([ + 'title','type','icon','template','table_title', + ['push_admin',[]],['status',0] + ],$request); + $data['push_admin'] = array_unique(array_filter($data['push_admin'])); + if(!$data['template']) return $this->failed('请填写通知模板'); + if(!$data['title']) return $this->failed('请输入模板标题'); + if(!$data['type']) return $this->failed('请输入模板类型'); + NoticeModel::edit($data,$id); + return $this->successful('修改成功!'); + } + /** + * 删除指定资源 + * + * @param int $id + * @return \think\Response + */ + public function delete($id) + { + $res = NoticeModel::del($id); + if(!$res) + return $this->failed(('删除失败,请稍候再试!')); + else + return $this->successful('删除成功!'); + } + public function message($type = 'all') + { + return $this->fetch(); + } +} diff --git a/application/admin/controller/store/StoreInfoMana.php b/application/admin/controller/store/StoreInfoMana.php index 16e4346e..7ea95075 100644 --- a/application/admin/controller/store/StoreInfoMana.php +++ b/application/admin/controller/store/StoreInfoMana.php @@ -1 +1,174 @@ -failed('数据不存在'); echo $is_list; exit(); $where = Util::getMore([ ['status',''], ['title',''], ],$this->request); $this->assign('where',$where); $this->assign(ArticleCategoryModel::systemPage($where)); return $this->fetch(); } /** * 添加分类管理 * */ public function create(){ FormBuilder::text('title','分类昵称'); FormBuilder::textarea('intr','分类简介'); FormBuilder::select('new_id','图文列表',function(){ $list = \app\admin\model\wechat\WechatNews::getNews(); $options = []; foreach ($list as $id=>$roleName){ $options[] = ['label'=>$roleName,'value'=>$id]; } return $options; })->multiple()->filterable(); FormBuilder::upload('image','分类图片'); FormBuilder::number('sort','排序',0); FormBuilder::radio('status','状态',[['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']],1); $rules = FormBuilder::builder()->getContent(); $this->assign(['title'=>'编辑菜单','rules'=>$rules,'save'=>Url::build('save')]); return $this->fetch(); } /** * s上传图片 * */ public function upload(){ $res = Upload::image('file','article'); $thumbPath = Upload::thumb($res->dir); if($res->status == 200) return Json::successful('图片上传成功!',['name'=>$res->fileInfo->getSaveName(),'url'=>Upload::pathToUrl($thumbPath)]); else return Json::fail($res->error); } /** * 保存分类管理 * */ public function save(Request $request){ $data = Util::postMore([ 'title', 'intr', ['new_id',[]], ['image',[]], ['sort',0], 'status',],$request); if(!$data['title']) return Json::fail('请输入分类名称'); if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); if($data['sort'] < 0) return Json::fail('排序不能是负数'); $data['add_time'] = time(); $data['image'] = $data['image'][0]; $new_id = $data['new_id']; unset($data['new_id']); $res = ArticleCategoryModel::set($data); if(!WechatNewsModel::saveBatchCid($res['id'],implode(',',$new_id))) return Json::fail('文章列表添加失败'); return Json::successful('添加分类成功!'); } /** * 修改分类 * */ public function edit($id){ $this->assign(['title'=>'编辑菜单','read'=>Url::build('read',array('id'=>$id)),'update'=>Url::build('update',array('id'=>$id))]); return $this->fetch(); } public function read($id) { $article = ArticleCategoryModel::get($id)->getData(); if(!$article) return Json::fail('数据不存在!'); FormBuilder::text('title','分类昵称',$article['title']); FormBuilder::textarea('intr','分类简介',$article['intr']); $arr = ArticleCategoryModel::getArticle($id,'id,title,cid');//子文章 $new_id = array(); foreach ($arr as $k=>$v){ $new_id[$k] = $k; } FormBuilder::select('new_id','文章列表',function(){ $list = \app\admin\model\wechat\WechatNews::getNews(); $options = []; foreach ($list as $id=>$roleName){ $options[] = ['label'=>$roleName,'value'=>$id]; } return $options; },$new_id)->multiple(); FormBuilder::upload('image','分类图片')->defaultFileList($article['image']); FormBuilder::number('sort','排序',$article['sort']); FormBuilder::radio('status','状态',[['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']],$article['status']); return FormBuilder::builder(); } public function update(Request $request, $id) { $data = Util::postMore([ 'title', 'intr', ['new_id',[]], ['image',[]], ['sort',0], 'status',],$request); if(!$data['title']) return Json::fail('请输入分类名称'); if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); if($data['sort'] < 0) return Json::fail('排序不能是负数'); $data['image'] = $data['image'][0]; // dump($data); // exit; if(!ArticleCategoryModel::get($id)) return Json::fail('编辑的记录不存在!'); if(!WechatNewsModel::saveBatchCid($id,implode(',',$data['new_id']))) return Json::fail('文章列表添加失败'); unset($data['new_id']); ArticleCategoryModel::edit($data,$id); return Json::successful('修改成功!'); } /** * 删除分类 * */ public function delete($id) { $res = ArticleCategoryModel::delArticleCategory($id); if(!$res) return Json::fail(ArticleCategoryModel::getErrorInfo('删除失败,请稍候再试!')); else return Json::successful('删除成功!'); } } \ No newline at end of file +failed('数据不存在'); + echo $is_list; + exit(); + $where = Util::getMore([ + ['status',''], + ['title',''], + ],$this->request); + $this->assign('where',$where); + $this->assign(ArticleCategoryModel::systemPage($where)); + return $this->fetch(); + } + + /** + + * 添加分类管理 + + * */ + + public function create(){ + FormBuilder::text('title','分类昵称'); + FormBuilder::textarea('intr','分类简介'); + FormBuilder::select('new_id','图文列表',function(){ + $list = \app\admin\model\wechat\WechatNews::getNews(); + $options = []; + foreach ($list as $id=>$roleName){ + $options[] = ['label'=>$roleName,'value'=>$id]; + } + return $options; + })->multiple()->filterable(); + FormBuilder::upload('image','分类图片'); + FormBuilder::number('sort','排序',0); + FormBuilder::radio('status','状态',[['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']],1); + $rules = FormBuilder::builder()->getContent(); + $this->assign(['title'=>'编辑菜单','rules'=>$rules,'save'=>Url::build('save')]); + return $this->fetch(); + } + + /** + * s上传图片 + * */ + public function upload(){ + $res = Upload::image('file','article'); + $thumbPath = Upload::thumb($res->dir); + if($res->status == 200) + return Json::successful('图片上传成功!',['name'=>$res->fileInfo->getSaveName(),'url'=>Upload::pathToUrl($thumbPath)]); + else + return Json::fail($res->error); + } + + /** + + * 保存分类管理 + + * */ + + public function save(Request $request){ + $data = Util::postMore([ + 'title', + 'intr', + ['new_id',[]], + ['image',[]], + ['sort',0], + 'status',],$request); + if(!$data['title']) return Json::fail('请输入分类名称'); + if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); + if($data['sort'] < 0) return Json::fail('排序不能是负数'); + $data['add_time'] = time(); + $data['image'] = $data['image'][0]; + $new_id = $data['new_id']; + unset($data['new_id']); + $res = ArticleCategoryModel::set($data); + if(!WechatNewsModel::saveBatchCid($res['id'],implode(',',$new_id))) return Json::fail('文章列表添加失败'); + return Json::successful('添加分类成功!'); + } + + /** + + * 修改分类 + + * */ + + public function edit($id){ + $this->assign(['title'=>'编辑菜单','read'=>Url::build('read',array('id'=>$id)),'update'=>Url::build('update',array('id'=>$id))]); + return $this->fetch(); + } + + public function read($id) + { + $article = ArticleCategoryModel::get($id)->getData(); + if(!$article) return Json::fail('数据不存在!'); + FormBuilder::text('title','分类昵称',$article['title']); + FormBuilder::textarea('intr','分类简介',$article['intr']); + $arr = ArticleCategoryModel::getArticle($id,'id,title,cid');//子文章 + $new_id = array(); + foreach ($arr as $k=>$v){ + $new_id[$k] = $k; + } + FormBuilder::select('new_id','文章列表',function(){ + $list = \app\admin\model\wechat\WechatNews::getNews(); + $options = []; + foreach ($list as $id=>$roleName){ + $options[] = ['label'=>$roleName,'value'=>$id]; + } + return $options; + },$new_id)->multiple(); + FormBuilder::upload('image','分类图片')->defaultFileList($article['image']); + FormBuilder::number('sort','排序',$article['sort']); + FormBuilder::radio('status','状态',[['value'=>1,'label'=>'显示'],['value'=>0,'label'=>'隐藏']],$article['status']); + return FormBuilder::builder(); + } + + public function update(Request $request, $id) + { + $data = Util::postMore([ + 'title', + 'intr', + ['new_id',[]], + ['image',[]], + ['sort',0], + 'status',],$request); + if(!$data['title']) return Json::fail('请输入分类名称'); + if(count($data['image']) != 1) return Json::fail('请选择分类图片,并且只能上传一张'); + if($data['sort'] < 0) return Json::fail('排序不能是负数'); + $data['image'] = $data['image'][0]; +// dump($data); +// exit; + if(!ArticleCategoryModel::get($id)) return Json::fail('编辑的记录不存在!'); + if(!WechatNewsModel::saveBatchCid($id,implode(',',$data['new_id']))) return Json::fail('文章列表添加失败'); + unset($data['new_id']); + ArticleCategoryModel::edit($data,$id); + return Json::successful('修改成功!'); + } + + /** + * 删除分类 + * */ + public function delete($id) + { + $res = ArticleCategoryModel::delArticleCategory($id); + if(!$res) + return Json::fail(ArticleCategoryModel::getErrorInfo('删除失败,请稍候再试!')); + else + return Json::successful('删除成功!'); + } +} + diff --git a/application/admin/controller/user/User.php b/application/admin/controller/user/User.php index 1ba3580f..d750733a 100644 --- a/application/admin/controller/user/User.php +++ b/application/admin/controller/user/User.php @@ -1 +1,526 @@ - * @day: 2017/11/11 */ namespace app\admin\controller\user; use app\admin\controller\AuthController; use service\FormBuilder as Form; use traits\CurdControllerTrait; use service\UtilService as Util; use service\JsonService as Json; use think\Request; use think\Url; use app\admin\model\user\User as UserModel; use app\admin\model\user\UserBill AS UserBillAdmin; use basic\ModelBasic; use service\HookService; use behavior\user\UserBehavior; use app\admin\model\store\StoreVisit; use app\admin\model\wechat\WechatMessage; use app\admin\model\order\StoreOrder; use app\admin\model\store\StoreCouponUser; /** * 用户管理控制器 * Class User * @package app\admin\controller\user */ class User extends AuthController { use CurdControllerTrait; /** * 显示资源列表 * * @return \think\Response */ public function index(){ $this->assign('count_user',UserModel::getcount()); return $this->fetch(); } /** * 修改user表状态 * * @return json */ public function set_status($status='',$uid=0,$is_echo=0){ if($is_echo==0) { if ($status == '' || $uid == 0) return Json::fail('参数错误'); UserModel::where(['uid' => $uid])->update(['status' => $status]); }else{ $uids=Util::postMore([ ['uids',[]] ]); UserModel::destrSyatus($uids['uids'],$status); } return Json::successful($status==0 ? '禁用成功':'解禁成功'); } /** * 获取user表 * * @return json */ public function get_user_list(){ $where=Util::getMore([ ['page',1], ['limit',20], ['nickname',''], ['status',''], ['pay_count',''], ['is_promoter',''], ['order',''], ['data',''], ['user_type',''], ['country',''], ['province',''], ['city',''], ['user_time_type',''], ['user_time',''], ['sex',''], ]); return Json::successlayui(UserModel::getUserList($where)); } /** * 编辑模板消息 * @param $id * @return mixed|\think\response\Json|void */ public function edit($uid) { if(!$uid) return $this->failed('数据不存在'); $user = UserModel::get($uid); if(!$user) return Json::fail('数据不存在!'); $f = array(); $f[] = Form::input('uid','用户编号',$user->getData('uid'))->disabled(1); $f[] = Form::input('nickname','用户姓名',$user->getData('nickname')); $f[] = Form::radio('money_status','修改余额',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']])->col(12); $f[] = Form::number('money','余额')->min(0)->col(12); $f[] = Form::radio('integration_status','修改积分',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']])->col(12); $f[] = Form::number('integration','积分')->min(0)->col(12); $f[] = Form::radio('status','状态',$user->getData('status'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'锁定']]); $f[] = Form::radio('is_promoter','推广员',$user->getData('is_promoter'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'关闭']]); $form = Form::make_post_form('添加用户通知',$f,Url::build('update',array('id'=>$uid))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update(Request $request, $uid) { $data = Util::postMore([ ['money_status',0], ['is_promoter',1], ['money',0], ['integration_status',0], ['integration',0], ['status',0], ],$request); if(!$uid) return $this->failed('数据不存在'); $user = UserModel::get($uid); if(!$user) return Json::fail('数据不存在!'); ModelBasic::beginTrans(); $res1 = false; $res2 = false; $edit = array(); if($data['money_status'] && $data['money']){//余额增加或者减少 if($data['money_status'] == 1){//增加 $edit['now_money'] = bcadd($user['now_money'],$data['money'],2); $res1 = UserBillAdmin::income('系统增加余额',$user['uid'],'now_money','system_add',$data['money'],$this->adminId,$user['now_money'],'系统增加了'.floatval($data['money']).'余额'); try{ HookService::listen('admin_add_money',$user,$data['money'],false,UserBehavior::class); }catch (\Exception $e){ ModelBasic::rollbackTrans(); return Json::fail($e->getMessage()); } }else if($data['money_status'] == 2){//减少 $edit['now_money'] = bcsub($user['now_money'],$data['money'],2); $res1 = UserBillAdmin::expend('系统减少余额',$user['uid'],'now_money','system_sub',$data['money'],$this->adminId,$user['now_money'],'系统扣除了'.floatval($data['money']).'余额'); try{ HookService::listen('admin_sub_money',$user,$data['money'],false,UserBehavior::class); }catch (\Exception $e){ ModelBasic::rollbackTrans(); return Json::fail($e->getMessage()); } } }else{ $res1 = true; } if($data['integration_status'] && $data['integration']){//积分增加或者减少 if($data['integration_status'] == 1){//增加 $edit['integral'] = bcadd($user['integral'],$data['integration'],2); $res2 = UserBillAdmin::income('系统增加积分',$user['uid'],'integral','system_add',$data['integration'],$this->adminId,$user['integral'],'系统增加了'.floatval($data['integration']).'积分'); try{ HookService::listen('admin_add_integral',$user,$data['integration'],false,UserBehavior::class); }catch (\Exception $e){ ModelBasic::rollbackTrans(); return Json::fail($e->getMessage()); } }else if($data['integration_status'] == 2){//减少 $edit['integral'] = bcsub($user['integral'],$data['integration'],2); $res2 = UserBillAdmin::expend('系统减少积分',$user['uid'],'integral','system_sub',$data['integration'],$this->adminId,$user['integral'],'系统扣除了'.floatval($data['integration']).'积分'); try{ HookService::listen('admin_sub_integral',$user,$data['integration'],false,UserBehavior::class); }catch (\Exception $e){ ModelBasic::rollbackTrans(); return Json::fail($e->getMessage()); } } }else{ $res2 = true; } $edit['status'] = $data['status']; $edit['is_promoter'] = $data['is_promoter']; if($edit) $res3 = UserModel::edit($edit,$uid); else $res3 = true; if($res1 && $res2 && $res3) $res =true; else $res = false; ModelBasic::checkTrans($res); if($res) return Json::successful('修改成功!'); else return Json::fail('修改失败'); } /** * 用户图表 * @return mixed */ public function user_analysis(){ $where = Util::getMore([ ['nickname',''], ['status',''], ['is_promoter',''], ['date',''], ['user_type',''], ['export',0] ],$this->request); $user_count=UserModel::consume($where,'',true); //头部信息 $header=[ [ 'name'=>'新增用户', 'class'=>'fa-line-chart', 'value'=>$user_count, 'color'=>'red' ], [ 'name'=>'用户留存', 'class'=>'fa-area-chart', 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true),$where).'%', 'color'=>'lazur' ], [ 'name'=>'新增用户总消费', 'class'=>'fa-bar-chart', 'value'=>'¥'.UserModel::consume($where), 'color'=>'navy' ], [ 'name'=>'用户活跃度', 'class'=>'fa-pie-chart', 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true)).'%', 'color'=>'yellow' ], ]; $name=['新增用户','用户消费']; $dates=$this->get_user_index($where,$name); $user_index=['name'=>json_encode($name), 'date'=>json_encode($dates['time']), 'series'=>json_encode($dates['series'])]; //用户浏览分析 $view=StoreVisit::getVisit($where['date'],['','warning','info','danger']); $view_v1=WechatMessage::getViweList($where['date'],['','warning','info','danger']); $view=array_merge($view,$view_v1); $view_v2=[]; foreach ($view as $val){ $view_v2['color'][]='#'.rand(100000,339899); $view_v2['name'][]=$val['name']; $view_v2['value'][]=$val['value']; } $view=$view_v2; //消费会员排行用户分析 $user_null=UserModel::getUserSpend($where['date']); //消费数据 $now_number=UserModel::getUserSpend($where['date'],true); list($paren_number,$title)=UserModel::getPostNumber($where['date']); if($paren_number==0) { $rightTitle=[ 'number'=>$now_number>0?$now_number:0, 'icon'=>'fa-level-up', 'title'=>$title ]; }else{ $number=(float)bcsub($now_number,$paren_number,4); if($now_number==0){ $icon='fa-level-down'; }else{ $icon=$now_number>$paren_number?'fa-level-up':'fa-level-down'; } $rightTitle=['number'=>$number, 'icon'=>$icon, 'title'=>$title]; } unset($title,$paren_number,$now_number); list($paren_user_count,$title)=UserModel::getPostNumber($where['date'],true,'add_time',''); if($paren_user_count==0){ $count=$user_count==0?0:$user_count; $icon=$user_count==0?'fa-level-down':'fa-level-up'; }else{ $count=(float)bcsub($user_count,$paren_user_count,4); $icon=$user_count<$paren_user_count?'fa-level-down':'fa-level-up'; } $leftTitle=[ 'count'=>$count, 'icon'=>$icon, 'title'=>$title ]; unset($count,$icon,$title); $consume=[ 'title'=>'消费金额为¥'.UserModel::consume($where), 'series'=>UserModel::consume($where,'xiaofei'), 'rightTitle'=>$rightTitle, 'leftTitle'=>$leftTitle, ]; $form=UserModel::consume($where,'form'); $grouping=UserModel::consume($where,'grouping'); $this->assign(compact('header','user_index','view','user_null','consume','form','grouping','where')); return $this->fetch(); } public function gethreaderValue($chart,$where=[]){ if($where){ switch($where['date']){ case null:case 'today':case 'week':case 'year': if($where['date']==null){ $where['date']='month'; } $sum_user=UserModel::whereTime('add_time',$where['date'])->count(); if($sum_user==0) return 0; $counts=bcdiv($chart,$sum_user,4)*100; return $counts; break; case 'quarter': $quarter=UserModel::getMonth('n'); $quarter[0]=strtotime($quarter[0]); $quarter[1]=strtotime($quarter[1]); $sum_user=UserModel::where('add_time','between',$quarter)->count(); if($sum_user==0) return 0; $counts=bcdiv($chart,$sum_user,4)*100; return $counts; default: //自定义时间 $quarter=explode('-',$where['date']); $quarter[0]=strtotime($quarter[0]); $quarter[1]=strtotime($quarter[1]); $sum_user=UserModel::where('add_time','between',$quarter)->count(); if($sum_user==0) return 0; $counts=bcdiv($chart,$sum_user,4)*100; return $counts; break; } }else{ $num=UserModel::count(); $chart=$num!=0?bcdiv($chart,$num,5)*100:0; return $chart; } } public function get_user_index($where,$name){ switch ($where['date']){ case null: $days = date("t",strtotime(date('Y-m',time()))); $dates=[]; $series=[]; $times_list=[]; foreach ($name as $key=>$val){ for($i=1;$i<=$days;$i++){ if(!in_array($i.'号',$times_list)){ array_push($times_list,$i.'号'); } $time=$this->gettime(date("Y-m",time()).'-'.$i); if($key==0){ $dates['data'][]=UserModel::where('add_time','between',$time)->count(); }else if($key==1){ $dates['data'][]=UserModel::consume(true,$time); } } $dates['name']=$val; $dates['type']='line'; $series[]=$dates; unset($dates); } return ['time'=>$times_list,'series'=>$series]; case 'today': $dates=[]; $series=[]; $times_list=[]; foreach ($name as $key=>$val){ for($i=0;$i<=24;$i++){ $strtitle=$i.'点'; if(!in_array($strtitle,$times_list)){ array_push($times_list,$strtitle); } $time=$this->gettime(date("Y-m-d ",time()).$i); if($key==0){ $dates['data'][]=UserModel::where('add_time','between',$time)->count(); }else if($key==1){ $dates['data'][]=UserModel::consume(true,$time); } } $dates['name']=$val; $dates['type']='line'; $series[]=$dates; unset($dates); } return ['time'=>$times_list,'series'=>$series]; case "week": $dates=[]; $series=[]; $times_list=[]; foreach ($name as $key=>$val){ for($i=0;$i<=6;$i++){ if(!in_array('星期'.($i+1),$times_list)){ array_push($times_list,'星期'.($i+1)); } $time=UserModel::getMonth('h',$i); if($key==0){ $dates['data'][]=UserModel::where('add_time','between',[strtotime($time[0]),strtotime($time[1])])->count(); }else if($key==1){ $dates['data'][]=UserModel::consume(true,[strtotime($time[0]),strtotime($time[1])]); } } $dates['name']=$val; $dates['type']='line'; $series[]=$dates; unset($dates); } return ['time'=>$times_list,'series'=>$series]; case 'year': $dates=[]; $series=[]; $times_list=[]; $year=date('Y'); foreach ($name as $key=>$val){ for($i=1;$i<=12;$i++){ if(!in_array($i.'月',$times_list)){ array_push($times_list,$i.'月'); } $t = strtotime($year.'-'.$i.'-01'); $arr= explode('/',date('Y-m-01',$t).'/'.date('Y-m-',$t).date('t',$t)); if($key==0){ $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count(); }else if($key==1){ $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]); } } $dates['name']=$val; $dates['type']='line'; $series[]=$dates; unset($dates); } return ['time'=>$times_list,'series'=>$series]; case 'quarter': $dates=[]; $series=[]; $times_list=[]; foreach ($name as $key=>$val){ for($i=1;$i<=4;$i++){ $arr=$this->gettime('quarter',$i); if(!in_array(implode('--',$arr).'季度',$times_list)){ array_push($times_list,implode('--',$arr).'季度'); } if($key==0){ $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count(); }else if($key==1){ $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]); } } $dates['name']=$val; $dates['type']='line'; $series[]=$dates; unset($dates); } return ['time'=>$times_list,'series'=>$series]; default: $list=UserModel::consume($where,'default'); $dates=[]; $series=[]; $times_list=[]; foreach ($name as $k=>$v){ foreach ($list as $val){ $date=$val['add_time']; if(!in_array($date,$times_list)){ array_push($times_list,$date); } if($k==0){ $dates['data'][]=$val['num']; }else if($k==1){ $dates['data'][]=UserBillAdmin::where(['uid'=>$val['uid'],'type'=>'pay_product'])->sum('number'); } } $dates['name']=$v; $dates['type']='line'; $series[]=$dates; unset($dates); } return ['time'=>$times_list,'series'=>$series]; } } public function gettime($time='',$season=''){ if(!empty($time) && empty($season)){ $timestamp0 = strtotime($time); $timestamp24 =strtotime($time)+86400; return [$timestamp0,$timestamp24]; }else if(!empty($time) && !empty($season)){ $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y'))); $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y'))); return [$firstday,$lastday]; } } /** * 会员等级首页 */ public function group(){ return $this->fetch(); } /** * 会员详情 */ public function see($uid=''){ $this->assign([ 'uid'=>$uid, 'userinfo'=>UserModel::getUserDetailed($uid), 'is_layui'=>true, 'headerList'=>UserModel::getHeaderList($uid), 'count'=>UserModel::getCountInfo($uid), ]); return $this->fetch(); } /* * 获取某个用户的推广下线 * */ public function getSpreadList($uid,$page=1,$limit=20){ return Json::successful(UserModel::getSpreadList($uid,(int)$page,(int)$limit)); } /** * 获取某用户的订单列表 */ public function getOneorderList($uid,$page=1,$limit=20){ return Json::successful(StoreOrder::getOneorderList(compact('uid','page','limit'))); } /** * 获取某用户的积分列表 */ public function getOneIntegralList($uid,$page=1,$limit=20){ return Json::successful(UserBillAdmin::getOneIntegralList(compact('uid','page','limit'))); } /** * 获取某用户的积分列表 */ public function getOneSignList($uid,$page=1,$limit=20){ return Json::successful(UserBillAdmin::getOneSignList(compact('uid','page','limit'))); } /** * 获取某用户的持有优惠劵 */ public function getOneCouponsList($uid,$page=1,$limit=20){ return Json::successful(StoreCouponUser::getOneCouponsList(compact('uid','page','limit'))); } /** * 获取某用户的余额变动记录 */ public function getOneBalanceChangList($uid,$page=1,$limit=20){ return Json::successful(UserBillAdmin::getOneBalanceChangList(compact('uid','page','limit'))); } } \ No newline at end of file + + * @day: 2017/11/11 + */ +namespace app\admin\controller\user; +use app\admin\controller\AuthController; +use service\FormBuilder as Form; +use traits\CurdControllerTrait; +use service\UtilService as Util; +use service\JsonService as Json; +use think\Request; +use think\Url; +use app\admin\model\user\User as UserModel; +use app\admin\model\user\UserBill AS UserBillAdmin; +use basic\ModelBasic; +use service\HookService; +use behavior\user\UserBehavior; +use app\admin\model\store\StoreVisit; +use app\admin\model\wechat\WechatMessage; +use app\admin\model\order\StoreOrder; +use app\admin\model\store\StoreCouponUser; +/** + * 用户管理控制器 + * Class User + * @package app\admin\controller\user + */ +class User extends AuthController +{ + use CurdControllerTrait; + /** + * 显示资源列表 + * + * @return \think\Response + */ + public function index(){ + $this->assign('count_user',UserModel::getcount()); + return $this->fetch(); + } + /** + * 修改user表状态 + * + * @return json + */ + public function set_status($status='',$uid=0,$is_echo=0){ + if($is_echo==0) { + if ($status == '' || $uid == 0) return Json::fail('参数错误'); + UserModel::where(['uid' => $uid])->update(['status' => $status]); + }else{ + $uids=Util::postMore([ + ['uids',[]] + ]); + UserModel::destrSyatus($uids['uids'],$status); + } + return Json::successful($status==0 ? '禁用成功':'解禁成功'); + } + /** + * 获取user表 + * + * @return json + */ + public function get_user_list(){ + $where=Util::getMore([ + ['page',1], + ['limit',20], + ['nickname',''], + ['status',''], + ['pay_count',''], + ['is_promoter',''], + ['order',''], + ['data',''], + ['user_type',''], + ['country',''], + ['province',''], + ['city',''], + ['user_time_type',''], + ['user_time',''], + ['sex',''], + ]); + return Json::successlayui(UserModel::getUserList($where)); + } + /** + * 编辑模板消息 + * @param $id + * @return mixed|\think\response\Json|void + */ + public function edit($uid) + { + if(!$uid) return $this->failed('数据不存在'); + $user = UserModel::get($uid); + if(!$user) return Json::fail('数据不存在!'); + $f = array(); + $f[] = Form::input('uid','用户编号',$user->getData('uid'))->disabled(1); + $f[] = Form::input('nickname','用户姓名',$user->getData('nickname')); + $f[] = Form::radio('money_status','修改余额',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']]); + $f[] = Form::number('money','余额')->min(0); + $f[] = Form::radio('integration_status','修改积分',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']]); + $f[] = Form::number('integration','积分')->min(0); + $f[] = Form::radio('status','状态',$user->getData('status'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'锁定']]); + $f[] = Form::radio('is_promoter','推广员',$user->getData('is_promoter'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'关闭']]); + $form = Form::make_post_form('添加用户通知',$f,Url::build('update',array('id'=>$uid)),5); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + public function update(Request $request, $uid) + { + $data = Util::postMore([ + ['money_status',0], + ['is_promoter',1], + ['money',0], + ['integration_status',0], + ['integration',0], + ['status',0], + ],$request); + if(!$uid) return $this->failed('数据不存在'); + $user = UserModel::get($uid); + if(!$user) return Json::fail('数据不存在!'); + ModelBasic::beginTrans(); + $res1 = false; + $res2 = false; + $edit = array(); + if($data['money_status'] && $data['money']){//余额增加或者减少 + if($data['money_status'] == 1){//增加 + $edit['now_money'] = bcadd($user['now_money'],$data['money'],2); + $res1 = UserBillAdmin::income('系统增加余额',$user['uid'],'now_money','system_add',$data['money'],$this->adminId,$edit['now_money'],'系统增加了'.floatval($data['money']).'余额'); + try{ + HookService::listen('admin_add_money',$user,$data['money'],false,UserBehavior::class); + }catch (\Exception $e){ + ModelBasic::rollbackTrans(); + return Json::fail($e->getMessage()); + } + }else if($data['money_status'] == 2){//减少 + $edit['now_money'] = bcsub($user['now_money'],$data['money'],2); + $res1 = UserBillAdmin::expend('系统减少余额',$user['uid'],'now_money','system_sub',$data['money'],$this->adminId,$edit['now_money'],'系统扣除了'.floatval($data['money']).'余额'); + try{ + HookService::listen('admin_sub_money',$user,$data['money'],false,UserBehavior::class); + }catch (\Exception $e){ + ModelBasic::rollbackTrans(); + return Json::fail($e->getMessage()); + } + } + }else{ + $res1 = true; + } + if($data['integration_status'] && $data['integration']){//积分增加或者减少 + if($data['integration_status'] == 1){//增加 + $edit['integral'] = bcadd($user['integral'],$data['integration'],2); + $res2 = UserBillAdmin::income('系统增加积分',$user['uid'],'integral','system_add',$data['integration'],$this->adminId,$edit['integral'],'系统增加了'.floatval($data['integration']).'积分'); + try{ + HookService::listen('admin_add_integral',$user,$data['integration'],false,UserBehavior::class); + }catch (\Exception $e){ + ModelBasic::rollbackTrans(); + return Json::fail($e->getMessage()); + } + }else if($data['integration_status'] == 2){//减少 + $edit['integral'] = bcsub($user['integral'],$data['integration'],2); + $res2 = UserBillAdmin::expend('系统减少积分',$user['uid'],'integral','system_sub',$data['integration'],$this->adminId,$edit['integral'],'系统扣除了'.floatval($data['integration']).'积分'); + try{ + HookService::listen('admin_sub_integral',$user,$data['integration'],false,UserBehavior::class); + }catch (\Exception $e){ + ModelBasic::rollbackTrans(); + return Json::fail($e->getMessage()); + } + } + }else{ + $res2 = true; + } + $edit['status'] = $data['status']; + $edit['is_promoter'] = $data['is_promoter']; + if($edit) $res3 = UserModel::edit($edit,$uid); + else $res3 = true; + if($res1 && $res2 && $res3) $res =true; + else $res = false; + ModelBasic::checkTrans($res); + if($res) return Json::successful('修改成功!'); + else return Json::fail('修改失败'); + } + /** + * 用户图表 + * @return mixed + */ + public function user_analysis(){ + $where = Util::getMore([ + ['nickname',''], + ['status',''], + ['is_promoter',''], + ['date',''], + ['user_type',''], + ['export',0] + ],$this->request); + $user_count=UserModel::consume($where,'',true); + //头部信息 + $header=[ + [ + 'name'=>'新增用户', + 'class'=>'fa-line-chart', + 'value'=>$user_count, + 'color'=>'red' + ], + [ + 'name'=>'用户留存', + 'class'=>'fa-area-chart', + 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true),$where).'%', + 'color'=>'lazur' + ], + [ + 'name'=>'新增用户总消费', + 'class'=>'fa-bar-chart', + 'value'=>'¥'.UserModel::consume($where), + 'color'=>'navy' + ], + [ + 'name'=>'用户活跃度', + 'class'=>'fa-pie-chart', + 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true)).'%', + 'color'=>'yellow' + ], + ]; + $name=['新增用户','用户消费']; + $dates=$this->get_user_index($where,$name); + $user_index=['name'=>json_encode($name), 'date'=>json_encode($dates['time']), 'series'=>json_encode($dates['series'])]; + //用户浏览分析 + $view=StoreVisit::getVisit($where['date'],['','warning','info','danger']); + $view_v1=WechatMessage::getViweList($where['date'],['','warning','info','danger']); + $view=array_merge($view,$view_v1); + $view_v2=[]; + foreach ($view as $val){ + $view_v2['color'][]='#'.rand(100000,339899); + $view_v2['name'][]=$val['name']; + $view_v2['value'][]=$val['value']; + } + $view=$view_v2; + //消费会员排行用户分析 + $user_null=UserModel::getUserSpend($where['date']); + //消费数据 + $now_number=UserModel::getUserSpend($where['date'],true); + list($paren_number,$title)=UserModel::getPostNumber($where['date']); + if($paren_number==0) { + $rightTitle=[ + 'number'=>$now_number>0?$now_number:0, + 'icon'=>'fa-level-up', + 'title'=>$title + ]; + }else{ + $number=(float)bcsub($now_number,$paren_number,4); + if($now_number==0){ + $icon='fa-level-down'; + }else{ + $icon=$now_number>$paren_number?'fa-level-up':'fa-level-down'; + } + $rightTitle=['number'=>$number, 'icon'=>$icon, 'title'=>$title]; + } + unset($title,$paren_number,$now_number); + list($paren_user_count,$title)=UserModel::getPostNumber($where['date'],true,'add_time',''); + if($paren_user_count==0){ + $count=$user_count==0?0:$user_count; + $icon=$user_count==0?'fa-level-down':'fa-level-up'; + }else{ + $count=(float)bcsub($user_count,$paren_user_count,4); + $icon=$user_count<$paren_user_count?'fa-level-down':'fa-level-up'; + } + $leftTitle=[ + 'count'=>$count, + 'icon'=>$icon, + 'title'=>$title + ]; + unset($count,$icon,$title); + $consume=[ + 'title'=>'消费金额为¥'.UserModel::consume($where), + 'series'=>UserModel::consume($where,'xiaofei'), + 'rightTitle'=>$rightTitle, + 'leftTitle'=>$leftTitle, + ]; + $form=UserModel::consume($where,'form'); + $grouping=UserModel::consume($where,'grouping'); + $this->assign(compact('header','user_index','view','user_null','consume','form','grouping','where')); + return $this->fetch(); + } + public function gethreaderValue($chart,$where=[]){ + if($where){ + switch($where['date']){ + case null:case 'today':case 'week':case 'year': + if($where['date']==null){ + $where['date']='month'; + } + $sum_user=UserModel::whereTime('add_time',$where['date'])->count(); + if($sum_user==0) return 0; + $counts=bcdiv($chart,$sum_user,4)*100; + return $counts; + break; + case 'quarter': + $quarter=UserModel::getMonth('n'); + $quarter[0]=strtotime($quarter[0]); + $quarter[1]=strtotime($quarter[1]); + $sum_user=UserModel::where('add_time','between',$quarter)->count(); + if($sum_user==0) return 0; + $counts=bcdiv($chart,$sum_user,4)*100; + return $counts; + default: + //自定义时间 + $quarter=explode('-',$where['date']); + $quarter[0]=strtotime($quarter[0]); + $quarter[1]=strtotime($quarter[1]); + $sum_user=UserModel::where('add_time','between',$quarter)->count(); + if($sum_user==0) return 0; + $counts=bcdiv($chart,$sum_user,4)*100; + return $counts; + break; + } + }else{ + $num=UserModel::count(); + $chart=$num!=0?bcdiv($chart,$num,5)*100:0; + return $chart; + } + } + public function get_user_index($where,$name){ + switch ($where['date']){ + case null: + $days = date("t",strtotime(date('Y-m',time()))); + $dates=[]; + $series=[]; + $times_list=[]; + foreach ($name as $key=>$val){ + for($i=1;$i<=$days;$i++){ + if(!in_array($i.'号',$times_list)){ + array_push($times_list,$i.'号'); + } + $time=$this->gettime(date("Y-m",time()).'-'.$i); + if($key==0){ + $dates['data'][]=UserModel::where('add_time','between',$time)->count(); + }else if($key==1){ + $dates['data'][]=UserModel::consume(true,$time); + } + } + $dates['name']=$val; + $dates['type']='line'; + $series[]=$dates; + unset($dates); + } + return ['time'=>$times_list,'series'=>$series]; + case 'today': + $dates=[]; + $series=[]; + $times_list=[]; + foreach ($name as $key=>$val){ + for($i=0;$i<=24;$i++){ + $strtitle=$i.'点'; + if(!in_array($strtitle,$times_list)){ + array_push($times_list,$strtitle); + } + $time=$this->gettime(date("Y-m-d ",time()).$i); + if($key==0){ + $dates['data'][]=UserModel::where('add_time','between',$time)->count(); + }else if($key==1){ + $dates['data'][]=UserModel::consume(true,$time); + } + } + $dates['name']=$val; + $dates['type']='line'; + $series[]=$dates; + unset($dates); + } + return ['time'=>$times_list,'series'=>$series]; + case "week": + $dates=[]; + $series=[]; + $times_list=[]; + foreach ($name as $key=>$val){ + for($i=0;$i<=6;$i++){ + if(!in_array('星期'.($i+1),$times_list)){ + array_push($times_list,'星期'.($i+1)); + } + $time=UserModel::getMonth('h',$i); + if($key==0){ + $dates['data'][]=UserModel::where('add_time','between',[strtotime($time[0]),strtotime($time[1])])->count(); + }else if($key==1){ + $dates['data'][]=UserModel::consume(true,[strtotime($time[0]),strtotime($time[1])]); + } + } + $dates['name']=$val; + $dates['type']='line'; + $series[]=$dates; + unset($dates); + } + return ['time'=>$times_list,'series'=>$series]; + case 'year': + $dates=[]; + $series=[]; + $times_list=[]; + $year=date('Y'); + foreach ($name as $key=>$val){ + for($i=1;$i<=12;$i++){ + if(!in_array($i.'月',$times_list)){ + array_push($times_list,$i.'月'); + } + $t = strtotime($year.'-'.$i.'-01'); + $arr= explode('/',date('Y-m-01',$t).'/'.date('Y-m-',$t).date('t',$t)); + if($key==0){ + $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count(); + }else if($key==1){ + $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]); + } + } + $dates['name']=$val; + $dates['type']='line'; + $series[]=$dates; + unset($dates); + } + return ['time'=>$times_list,'series'=>$series]; + case 'quarter': + $dates=[]; + $series=[]; + $times_list=[]; + foreach ($name as $key=>$val){ + for($i=1;$i<=4;$i++){ + $arr=$this->gettime('quarter',$i); + if(!in_array(implode('--',$arr).'季度',$times_list)){ + array_push($times_list,implode('--',$arr).'季度'); + } + if($key==0){ + $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count(); + }else if($key==1){ + $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]); + } + } + $dates['name']=$val; + $dates['type']='line'; + $series[]=$dates; + unset($dates); + } + return ['time'=>$times_list,'series'=>$series]; + default: + $list=UserModel::consume($where,'default'); + $dates=[]; + $series=[]; + $times_list=[]; + foreach ($name as $k=>$v){ + foreach ($list as $val){ + $date=$val['add_time']; + if(!in_array($date,$times_list)){ + array_push($times_list,$date); + } + if($k==0){ + $dates['data'][]=$val['num']; + }else if($k==1){ + $dates['data'][]=UserBillAdmin::where(['uid'=>$val['uid'],'type'=>'pay_product'])->sum('number'); + } + } + $dates['name']=$v; + $dates['type']='line'; + $series[]=$dates; + unset($dates); + } + return ['time'=>$times_list,'series'=>$series]; + } + } + public function gettime($time='',$season=''){ + if(!empty($time) && empty($season)){ + $timestamp0 = strtotime($time); + $timestamp24 =strtotime($time)+86400; + return [$timestamp0,$timestamp24]; + }else if(!empty($time) && !empty($season)){ + $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y'))); + $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y'))); + return [$firstday,$lastday]; + } + } + + /** + * 会员等级首页 + */ + public function group(){ + return $this->fetch(); + } + /** + * 会员详情 + */ + public function see($uid=''){ + $this->assign([ + 'uid'=>$uid, + 'userinfo'=>UserModel::getUserDetailed($uid), + 'is_layui'=>true, + 'headerList'=>UserModel::getHeaderList($uid), + 'count'=>UserModel::getCountInfo($uid), + ]); + return $this->fetch(); + } + /* + * 获取某个用户的推广下线 + * */ + public function getSpreadList($uid,$page=1,$limit=20){ + return Json::successful(UserModel::getSpreadList($uid,(int)$page,(int)$limit)); + } + /** + * 获取某用户的订单列表 + */ + public function getOneorderList($uid,$page=1,$limit=20){ + return Json::successful(StoreOrder::getOneorderList(compact('uid','page','limit'))); + } + /** + * 获取某用户的积分列表 + */ + public function getOneIntegralList($uid,$page=1,$limit=20){ + return Json::successful(UserBillAdmin::getOneIntegralList(compact('uid','page','limit'))); + } + /** + * 获取某用户的积分列表 + */ + public function getOneSignList($uid,$page=1,$limit=20){ + return Json::successful(UserBillAdmin::getOneSignList(compact('uid','page','limit'))); + } + /** + * 获取某用户的持有优惠劵 + */ + public function getOneCouponsList($uid,$page=1,$limit=20){ + return Json::successful(StoreCouponUser::getOneCouponsList(compact('uid','page','limit'))); + } + /** + * 获取某用户的余额变动记录 + */ + public function getOneBalanceChangList($uid,$page=1,$limit=20){ + return Json::successful(UserBillAdmin::getOneBalanceChangList(compact('uid','page','limit'))); + } +} diff --git a/application/admin/controller/wechat/WechatMessage.php b/application/admin/controller/wechat/WechatMessage.php index c3a19727..618ce1a2 100644 --- a/application/admin/controller/wechat/WechatMessage.php +++ b/application/admin/controller/wechat/WechatMessage.php @@ -1 +1,35 @@ -request); $this->assign('where',$where); $this->assign('mold',MessageModel::$mold); $this->assign(MessageModel::systemPage($where)); return $this->fetch(); } } \ No newline at end of file +request); + $this->assign('where',$where); + $this->assign('mold',MessageModel::$mold); + $this->assign(MessageModel::systemPage($where)); + return $this->fetch(); + } + + +} + diff --git a/application/admin/controller/wechat/WechatUser.php b/application/admin/controller/wechat/WechatUser.php index 6fce2dc3..ad173946 100644 --- a/application/admin/controller/wechat/WechatUser.php +++ b/application/admin/controller/wechat/WechatUser.php @@ -1 +1,385 @@ -request); $tagidList = explode(',',$where['tagid_list']); foreach ($tagidList as $k=>$v){ if(!$v){ unset($tagidList[$k]); } } $tagidList = array_unique($tagidList); $where['tagid_list'] = implode(',',$tagidList); $this->assign([ 'where'=>$where, 'groupList'=>UserModel::getUserGroup(), 'tagList'=>UserModel::getUserTag() ]); $limitTimeList = [ 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), 'week'=>implode(' - ',[ date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) ]), 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), 'quarter'=>implode(' - ',[ date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) ]), 'year'=>implode(' - ',[ date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) ]) ]; $uidAll = UserModel::getAll($where); $this->assign(compact('limitTimeList','uidAll')); $this->assign(UserModel::systemPage($where)); return $this->fetch(); } public function edit_user_tag($openid) { if(!$openid) return JsonService::fail('参数错误!'); $list = Collection::make(UserModel::getUserTag())->each(function($item){ return ['value'=>$item['id'],'label'=>$item['name']]; }); $tagList = UserModel::where('openid',$openid)->value('tagid_list'); $tagList = explode(',',$tagList)?:[]; $f = [Form::select('tag_id','用户标签',$tagList)->setOptions($list->toArray())->multiple(1)]; $form = Form::make_post_form('标签名称',$f,Url::build('update_user_tag',compact('openid'))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update_user_tag(Request $request,$openid) { if(!$openid) return JsonService::fail('参数错误!'); $tagId = $request->post('tag_id/a',[]); if(!$tagId) return JsonService::fail('请选择用户标签!'); $tagList = explode(',',UserModel::where('openid',$openid)->value('tagid_list'))?:[]; UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); if(!$tagId[0])unset($tagId[0]); UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); try{ foreach ($tagList as $tag){ if($tag) WechatService::userTagService()->batchUntagUsers([$openid],$tag); } foreach ($tagId as $tag){ WechatService::userTagService()->batchTagUsers([$openid],$tag); } }catch (\Exception $e){ UserModel::rollbackTrans(); return JsonService::fail($e->getMessage()); } UserModel::commitTrans(); return JsonService::successful('修改成功!'); } public function edit_user_group($openid) { if(!$openid) return JsonService::fail('参数错误!'); $list = Collection::make(UserModel::getUserGroup())->each(function($item){ return ['value'=>$item['id'],'label'=>$item['name']]; }); $groupId = UserModel::where('openid',$openid)->value('groupid'); $f = [Form::select('group_id','用户分组',(string)$groupId)->setOptions($list->toArray())]; $form = Form::make_post_form('用户分组',$f,Url::build('update_user_group',compact('openid'))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } public function update_user_group(Request $request,$openid) { if(!$openid) return JsonService::fail('参数错误!'); $groupId = $request->post('group_id'); // if(!$groupId) return JsonService::fail('请选择用户分组!'); UserModel::beginTrans(); UserModel::edit(['groupid'=>$groupId],$openid,'openid'); try{ WechatService::userGroupService()->moveUser($openid,$groupId); }catch (\Exception $e){ UserModel::rollbackTrans(); return JsonService::fail($e->getMessage()); } UserModel::commitTrans(); return JsonService::successful('修改成功!'); } /** * 用户标签列表 */ public function tag($refresh = 0) { if($refresh == 1) { UserModel::clearUserTag(); $this->redirect(Url::build('tag')); } $list = UserModel::getUserTag(); $this->assign(compact('list')); return $this->fetch(); } /** * 添加标签 * @return mixed */ public function create_tag() { $f = [Form::input('name','标签名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('save_tag')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 添加 * @param Request $request * @return \think\response\Json */ public function save_tag(Request $request) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入标签名称!'); try{ WechatService::userTagService()->create($tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserTag(); return JsonService::successful('添加标签成功!'); } /** * 修改标签 * @param $id * @return mixed */ public function edit_tag($id) { $f = [Form::input('name','标签名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('update_tag',['id'=>$id])); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 修改标签 * @param Request $request * @param $id * @return \think\response\Json */ public function update_tag(Request $request, $id) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入标签名称!'); try{ WechatService::userTagService()->update($id,$tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserTag(); return JsonService::successful('修改标签成功!'); } /** * 删除标签 * @param $id * @return \think\response\Json */ public function delete_tag($id) { try{ WechatService::userTagService()->delete($id); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserTag(); return JsonService::successful('删除标签成功!'); } /** * 用户分组列表 */ public function group($refresh = 0) { if($refresh == 1) { UserModel::clearUserGroup(); $this->redirect(Url::build('group')); } $list = UserModel::getUserGroup(); $this->assign(compact('list')); return $this->fetch(); } /** * 添加分组 * @return mixed */ public function create_group() { $f = [Form::input('name','分组名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('save_group')); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 添加 * @param Request $request * @return \think\response\Json */ public function save_group(Request $request) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入分组名称!'); try{ WechatService::userGroupService()->create($tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserGroup(); return JsonService::successful('添加分组成功!'); } /** * 修改分组 * @param $id * @return mixed */ public function edit_group($id) { $f = [Form::input('name','分组名称')]; $form = Form::make_post_form('标签名称',$f,Url::build('update_group',compact('id'))); $this->assign(compact('form')); return $this->fetch('public/form-builder'); } /** * 修改分组 * @param Request $request * @param $id * @return \think\response\Json */ public function update_group(Request $request, $id) { $tagName = $request->post('name'); if(!$tagName) return JsonService::fail('请输入分组名称!'); try{ WechatService::userGroupService()->update($id,$tagName); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserGroup(); return JsonService::successful('修改分组成功!'); } /** * 删除分组 * @param $id * @return \think\response\Json */ public function delete_group($id) { try{ WechatService::userTagService()->delete($id); }catch (\Exception $e){ return JsonService::fail($e->getMessage()); } UserModel::clearUserGroup(); return JsonService::successful('删除分组成功!'); } public function synchro_tag($openid){ if(!$openid) return JsonService::fail('参数错误!'); $data = array(); if(UserModel::be($openid,'openid')){ try{ $tag = WechatService::userTagService()->userTags($openid)->toArray(); }catch (\Exception $e) { return JsonService::fail($e->getMessage()); } if($tag['tagid_list']) $data['tagid_list'] = implode(',',$tag['tagid_list']); else $data['tagid_list'] = ''; $res = UserModel::edit($data,$openid,'openid'); if($res) return JsonService::successful('同步成功'); else return JsonService::fail('同步失败!'); }else return JsonService::fail('参数错误!'); } /** * 一级推荐人页面 * @return mixed */ public function stair($uid = ''){ if($uid == '') return $this->failed('参数错误'); $list = User::alias('u') ->where('u.spread_uid',$uid) ->field('u.avatar,u.nickname,u.now_money,u.add_time,u.uid') ->where('u.status',1) ->order('u.add_time DESC') ->select() ->toArray(); foreach ($list as $key=>$value) $list[$key]['orderCount'] = StoreOrder::getOrderCount($value['uid']); $this->assign('list',$list); return $this->fetch(); } /** * 个人资金详情页面 * @return mixed */ public function now_money($uid = ''){ if($uid == '') return $this->failed('参数错误'); $list = UserBill::where('uid',$uid)->where('category','now_money') ->field('mark,pm,number,add_time') ->where('status',1)->order('add_time DESC')->select()->toArray(); foreach ($list as &$v){ $v['add_time'] = date('Y-m-d H:i:s',$v['add_time']); } $this->assign('list',$list); return $this->fetch(); } } \ No newline at end of file +request); + $tagidList = explode(',',$where['tagid_list']); + foreach ($tagidList as $k=>$v){ + if(!$v){ + unset($tagidList[$k]); + } + } + $tagidList = array_unique($tagidList); + $where['tagid_list'] = implode(',',$tagidList); + $this->assign([ + 'where'=>$where, + 'groupList'=>UserModel::getUserGroup(), + 'tagList'=>UserModel::getUserTag() + ]); + $limitTimeList = [ + 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]), + 'week'=>implode(' - ',[ + date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)), + date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)) + ]), + 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]), + 'quarter'=>implode(' - ',[ + date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01', + date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y'))) + ]), + 'year'=>implode(' - ',[ + date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day')) + ]) + ]; + $uidAll = UserModel::getAll($where); + $this->assign(compact('limitTimeList','uidAll')); + $this->assign(UserModel::systemPage($where)); + return $this->fetch(); + } + + public function edit_user_tag($openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $list = Collection::make(UserModel::getUserTag())->each(function($item){ + return ['value'=>$item['id'],'label'=>$item['name']]; + }); + $tagList = UserModel::where('openid',$openid)->value('tagid_list'); + + $tagList = explode(',',$tagList)?:[]; + $f = [Form::select('tag_id','用户标签',$tagList)->setOptions($list->toArray())->multiple(1)]; + $form = Form::make_post_form('标签名称',$f,Url::build('update_user_tag',compact('openid'))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + public function update_user_tag(Request $request,$openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $tagId = $request->post('tag_id/a',[]); + if(!$tagId) return JsonService::fail('请选择用户标签!'); + $tagList = explode(',',UserModel::where('openid',$openid)->value('tagid_list'))?:[]; + UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); + if(!$tagId[0])unset($tagId[0]); + UserModel::edit(['tagid_list'=>$tagId],$openid,'openid'); + try{ + foreach ($tagList as $tag){ + if($tag) WechatService::userTagService()->batchUntagUsers([$openid],$tag); + } + foreach ($tagId as $tag){ + WechatService::userTagService()->batchTagUsers([$openid],$tag); + } + }catch (\Exception $e){ + UserModel::rollbackTrans(); + return JsonService::fail($e->getMessage()); + } + UserModel::commitTrans(); + return JsonService::successful('修改成功!'); + } + + public function edit_user_group($openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $list = Collection::make(UserModel::getUserGroup())->each(function($item){ + return ['value'=>$item['id'],'label'=>$item['name']]; + }); + $groupId = UserModel::where('openid',$openid)->value('groupid'); + $f = [Form::select('group_id','用户分组',(string)$groupId)->setOptions($list->toArray())]; + $form = Form::make_post_form('用户分组',$f,Url::build('update_user_group',compact('openid'))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + public function update_user_group(Request $request,$openid) + { + if(!$openid) return JsonService::fail('参数错误!'); + $groupId = $request->post('group_id'); +// if(!$groupId) return JsonService::fail('请选择用户分组!'); + UserModel::beginTrans(); + UserModel::edit(['groupid'=>$groupId],$openid,'openid'); + try{ + WechatService::userGroupService()->moveUser($openid,$groupId); + }catch (\Exception $e){ + UserModel::rollbackTrans(); + return JsonService::fail($e->getMessage()); + } + UserModel::commitTrans(); + return JsonService::successful('修改成功!'); + } + + /** + * 用户标签列表 + */ + public function tag($refresh = 0) + { + if($refresh == 1) { + UserModel::clearUserTag(); + $this->redirect(Url::build('tag')); + } + $list = UserModel::getUserTag(); + $this->assign(compact('list')); + return $this->fetch(); + } + + /** + * 添加标签 + * @return mixed + */ + public function create_tag() + { + $f = [Form::input('name','标签名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('save_tag')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 添加 + * @param Request $request + * @return \think\response\Json + */ + public function save_tag(Request $request) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入标签名称!'); + try{ + WechatService::userTagService()->create($tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserTag(); + return JsonService::successful('添加标签成功!'); + } + + /** + * 修改标签 + * @param $id + * @return mixed + */ + public function edit_tag($id) + { + $f = [Form::input('name','标签名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('update_tag',['id'=>$id])); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 修改标签 + * @param Request $request + * @param $id + * @return \think\response\Json + */ + public function update_tag(Request $request, $id) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入标签名称!'); + try{ + WechatService::userTagService()->update($id,$tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserTag(); + return JsonService::successful('修改标签成功!'); + } + + /** + * 删除标签 + * @param $id + * @return \think\response\Json + */ + public function delete_tag($id) + { + try{ + WechatService::userTagService()->delete($id); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserTag(); + return JsonService::successful('删除标签成功!'); + } + + /** + * 用户分组列表 + */ + + public function group($refresh = 0) + { + if($refresh == 1) { + UserModel::clearUserGroup(); + $this->redirect(Url::build('group')); + } + $list = UserModel::getUserGroup(); + $this->assign(compact('list')); + return $this->fetch(); + } + + /** + * 添加分组 + * @return mixed + */ + public function create_group() + { + $f = [Form::input('name','分组名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('save_group')); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 添加 + * @param Request $request + * @return \think\response\Json + */ + public function save_group(Request $request) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入分组名称!'); + try{ + WechatService::userGroupService()->create($tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserGroup(); + return JsonService::successful('添加分组成功!'); + } + + /** + * 修改分组 + * @param $id + * @return mixed + */ + public function edit_group($id) + { + $f = [Form::input('name','分组名称')]; + $form = Form::make_post_form('标签名称',$f,Url::build('update_group',compact('id'))); + $this->assign(compact('form')); + return $this->fetch('public/form-builder'); + } + + /** + * 修改分组 + * @param Request $request + * @param $id + * @return \think\response\Json + */ + public function update_group(Request $request, $id) + { + $tagName = $request->post('name'); + if(!$tagName) return JsonService::fail('请输入分组名称!'); + try{ + WechatService::userGroupService()->update($id,$tagName); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserGroup(); + return JsonService::successful('修改分组成功!'); + } + + /** + * 删除分组 + * @param $id + * @return \think\response\Json + */ + public function delete_group($id) + { + try{ + WechatService::userTagService()->delete($id); + }catch (\Exception $e){ + return JsonService::fail($e->getMessage()); + } + UserModel::clearUserGroup(); + return JsonService::successful('删除分组成功!'); + } + + public function synchro_tag($openid){ + if(!$openid) return JsonService::fail('参数错误!'); + $data = array(); + if(UserModel::be($openid,'openid')){ + try{ + $tag = WechatService::userTagService()->userTags($openid)->toArray(); + }catch (\Exception $e) { + return JsonService::fail($e->getMessage()); + } + if($tag['tagid_list']) $data['tagid_list'] = implode(',',$tag['tagid_list']); + else $data['tagid_list'] = ''; + $res = UserModel::edit($data,$openid,'openid'); + if($res) return JsonService::successful('同步成功'); + else return JsonService::fail('同步失败!'); + }else return JsonService::fail('参数错误!'); + } + + /** + * 一级推荐人页面 + * @return mixed + */ + public function stair($uid = ''){ + if($uid == '') return $this->failed('参数错误'); + $list = User::alias('u') + ->where('u.spread_uid',$uid) + ->field('u.avatar,u.nickname,u.now_money,u.add_time,u.uid') + ->where('u.status',1) + ->order('u.add_time DESC') + ->select() + ->toArray(); + foreach ($list as $key=>$value) $list[$key]['orderCount'] = StoreOrder::getOrderCount($value['uid']); + $this->assign('list',$list); + return $this->fetch(); + } + + /** + * 个人资金详情页面 + * @return mixed + */ + public function now_money($uid = ''){ + if($uid == '') return $this->failed('参数错误'); + $list = UserBill::where('uid',$uid)->where('category','now_money') + ->field('mark,pm,number,add_time') + ->where('status',1)->order('add_time DESC')->select()->toArray(); + foreach ($list as &$v){ + $v['add_time'] = date('Y-m-d H:i:s',$v['add_time']); + } + $this->assign('list',$list); + return $this->fetch(); + } + +} + diff --git a/application/admin/model/article/Article.php b/application/admin/model/article/Article.php index 161f0a13..859ad03d 100644 --- a/application/admin/model/article/Article.php +++ b/application/admin/model/article/Article.php @@ -1 +1,154 @@ - * @day: 2017/11/02 */ namespace app\admin\model\article; use app\admin\model\system\SystemAdmin; use traits\ModelTrait; use basic\ModelBasic; use think\Db; /** * 图文管理 Model * Class WechatNews * @package app\admin\model\wechat */ class Article extends ModelBasic { use ModelTrait; /** * 获取配置分类 * @param array $where * @return array */ public static function getAll($where = array()){ $model = new self; // if($where['status'] !== '') $model = $model->where('status',$where['status']); // if($where['access'] !== '') $model = $model->where('access',$where['access']); if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['cid'] !== '') $model = $model->where("CONCAT(',',cid,',') LIKE '%,$where[cid],%'"); if($where['cid'] == ''){ if(!$where['merchant']) $model = $model->where('mer_id',0); if($where['merchant']) $model = $model->where('mer_id','GT',0); } $model = $model->where('status',1)->where('hide',0); return self::page($model,function($item){ if(!$item['mer_id']) $item['admin_name'] = '总后台管理员---》'.SystemAdmin::where('id',$item['admin_id'])->value('real_name'); else $item['admin_name'] = Merchant::where('id',$item['mer_id'])->value('mer_name').'---》'.MerchantAdmin::where('id',$item['admin_id'])->value('real_name'); $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); $item['catename'] = Db::name('ArticleCategory')->where('id',$item['cid'])->value('title'); },$where); } /** * 删除图文 * @param $id * @return bool */ public static function del($id){ return self::edit(['status'=>0],$id,'id'); } /** * 获取指定字段的值 * @return array */ public static function getNews() { return self::where('status',1)->where('hide',0)->order('id desc')->column('id,title'); } /** * 给表中的字符串类型追加值 * 删除所有有当前分类的id之后重新添加 * @param $cid * @param $id * @return bool */ public static function saveBatchCid($cid,$id){ $res_all = self::where('cid','LIKE',"%$cid%")->select();//获取所有有当前分类的图文 foreach ($res_all as $k=>$v){ $cid_arr = explode(',',$v['cid']); if(in_array($cid,$cid_arr)){ $key = array_search($cid, $cid_arr); array_splice($cid_arr, $key, 1); } if(empty($cid_arr)) { $data['cid'] = 0; self::edit($data,$v['id']); }else{ $data['cid'] = implode(',',$cid_arr); self::edit($data,$v['id']); } } $res = self::where('id','IN',$id)->select(); foreach ($res as $k=>$v){ if(!in_array($cid,explode(',',$v['cid']))){ if(!$v['cid']){ $data['cid'] = $cid; }else{ $data['cid'] = $v['cid'].','.$cid; } self::edit($data,$v['id']); } } return true; } public static function setContent($id,$content){ $count = Db::name('ArticleContent')->where('nid',$id)->count(); $data['nid'] = $id; $data['content'] = $content; // dump($data); if($count){ $res = Db::name('ArticleContent')->where('nid',$id)->setField('content',$content); if($res !== false) $res = true; } else $res = Db::name('ArticleContent')->insert($data); // echo Db::getLastSql(); // exit(); return $res; } public static function merchantPage($where = array()){ $model = new self; if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['cid'] !== '') $model = $model->where('cid','LIKE',"%$where[cid]%"); $model = $model ->where('status',1) ->where('hide',0) ->where('admin_id',$where['admin_id']) ->where('mer_id',$where['mer_id']); return self::page($model,function($item){ $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); },$where); } /** * 获取指定文章列表 图文管理使用 * @param string $id * @param string $field * @return false|\PDOStatement|string|\think\Collection */ public static function getArticleList($id = '',$field = 'title,author,image_input,synopsis,id'){ $list = self::where('id','IN',$id)->field($field)->select(); foreach ($list as $k=>$v){ $list[$k]['content'] = Db::name('ArticleContent')->where('nid',$v['id'])->value('content'); } return $list; } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\article; + +use app\admin\model\system\SystemAdmin; +use traits\ModelTrait; +use basic\ModelBasic; +use think\Db; + +/** + * 图文管理 Model + * Class WechatNews + * @package app\admin\model\wechat + */ +class Article extends ModelBasic { + + use ModelTrait; + + /** + * 获取配置分类 + * @param array $where + * @return array + */ + public static function getAll($where = array()){ + $model = new self; +// if($where['status'] !== '') $model = $model->where('status',$where['status']); +// if($where['access'] !== '') $model = $model->where('access',$where['access']); + if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['cid'] !== '') { +// $model = $model->where("CONCAT(',',cid,',') LIKE '%,$where[cid],%'"); + $model = $model->where('cid','in',$where['cid']); + } + if($where['cid'] == ''){ + if(!$where['merchant']) $model = $model->where('mer_id',0); + if($where['merchant']) $model = $model->where('mer_id','GT',0); + } + $model = $model->where('status',1)->where('hide',0); + return self::page($model,function($item){ + if(!$item['mer_id']) $item['admin_name'] = '总后台管理员---》'.SystemAdmin::where('id',$item['admin_id'])->value('real_name'); + else $item['admin_name'] = Merchant::where('id',$item['mer_id'])->value('mer_name').'---》'.MerchantAdmin::where('id',$item['admin_id'])->value('real_name'); + $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); + $item['catename'] = Db::name('ArticleCategory')->where('id',$item['cid'])->value('title'); + },$where); + } + + /** + * 删除图文 + * @param $id + * @return bool + */ + public static function del($id){ + return self::edit(['status'=>0],$id,'id'); + } + + /** + * 获取指定字段的值 + * @return array + */ + public static function getNews() + { + return self::where('status',1)->where('hide',0)->order('id desc')->column('id,title'); + } + + /** + * 给表中的字符串类型追加值 + * 删除所有有当前分类的id之后重新添加 + * @param $cid + * @param $id + * @return bool + */ + public static function saveBatchCid($cid,$id){ + $res_all = self::where('cid','LIKE',"%$cid%")->select();//获取所有有当前分类的图文 + foreach ($res_all as $k=>$v){ + $cid_arr = explode(',',$v['cid']); + if(in_array($cid,$cid_arr)){ + $key = array_search($cid, $cid_arr); + array_splice($cid_arr, $key, 1); + } + if(empty($cid_arr)) { + $data['cid'] = 0; + self::edit($data,$v['id']); + }else{ + $data['cid'] = implode(',',$cid_arr); + self::edit($data,$v['id']); + } + } + $res = self::where('id','IN',$id)->select(); + foreach ($res as $k=>$v){ + if(!in_array($cid,explode(',',$v['cid']))){ + if(!$v['cid']){ + $data['cid'] = $cid; + }else{ + $data['cid'] = $v['cid'].','.$cid; + } + self::edit($data,$v['id']); + } + } + return true; + } + + public static function setContent($id,$content){ + $count = Db::name('ArticleContent')->where('nid',$id)->count(); + $data['nid'] = $id; + $data['content'] = $content; +// dump($data); + if($count){ + $res = Db::name('ArticleContent')->where('nid',$id)->setField('content',$content); + if($res !== false) $res = true; + } + else + $res = Db::name('ArticleContent')->insert($data); +// echo Db::getLastSql(); +// exit(); + return $res; + } + + public static function merchantPage($where = array()){ + $model = new self; + if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['cid'] !== '') $model = $model->where('cid','LIKE',"%$where[cid]%"); + $model = $model + ->where('status',1) + ->where('hide',0) + ->where('admin_id',$where['admin_id']) + ->where('mer_id',$where['mer_id']); + return self::page($model,function($item){ + $item['content'] = Db::name('ArticleContent')->where('nid',$item['id'])->value('content'); + },$where); + } + + /** + * 获取指定文章列表 图文管理使用 + * @param string $id + * @param string $field + * @return false|\PDOStatement|string|\think\Collection + */ + public static function getArticleList($id = '',$field = 'title,author,image_input,synopsis,id'){ + $list = self::where('id','IN',$id)->field($field)->select(); + foreach ($list as $k=>$v){ + $list[$k]['content'] = Db::name('ArticleContent')->where('nid',$v['id'])->value('content'); + } + return $list; + } +} \ No newline at end of file diff --git a/application/admin/model/system/SystemConfig.php b/application/admin/model/system/SystemConfig.php index b1219d55..09cc2cb3 100644 --- a/application/admin/model/system/SystemConfig.php +++ b/application/admin/model/system/SystemConfig.php @@ -1 +1,282 @@ - * @day: 2017/11/02 */ namespace app\admin\model\system; use basic\ModelBasic; use service\FormBuilder as Form; use traits\ModelTrait; use \app\admin\model\system\SystemConfigTab; class SystemConfig extends ModelBasic { use ModelTrait; /** * 修改单个配置 * */ public static function setValue($menu,$value){ if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return self::setErrorInfo('字段名称错误'); if($config_one['type'] == 'radio' || $config_one['type'] == 'checkbox'){ $parameter = array(); $option = array(); $parameter = explode(',',$config_one['parameter']); foreach ($parameter as $k=>$v){ if(isset($v) && !empty($v)){ $option[$k] = explode('-',$v); } } $value_arr = array();//选项的值 foreach ($option as $k=>$v){ foreach ($v as $kk=>$vv) if(!$kk){ $value_arr[$k] = $vv; } } $i = 0;// if(is_array($value)){ foreach ($value as $value_v){ if(in_array($value_v,$value_arr)){ $i++; } } if(count($value) != $i) return self::setErrorInfo('输入的值不属于选项中的参数'); }else{ if(in_array($value,$value_arr)){ $i++; } if(!$i) return self::setErrorInfo('输入的值不属于选项中的参数'); } if($config_one['type'] == 'radio' && is_array($value)) return self::setErrorInfo('单选按钮的值是字符串不是数组'); } $bool = self::edit(['value' => json_encode($value)],$menu,'menu_name'); return $bool; } /** * 获取单个参数配置 * */ public static function getValue($menu){ if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return false; return json_decode($config_one['value'],true); } /** * 获得多个参数 * @param $menus * @return array */ public static function getMore($menus) { $menus = is_array($menus) ? implode(',',$menus) : $menus; $list = self::where('menu_name','IN',$menus)->column('value','menu_name')?:[]; foreach ($list as $menu => $value){ $list[$menu] = json_decode($value,true); } return $list; } public static function getAllConfig() { $list = self::column('value','menu_name')?:[]; foreach ($list as $menu => $value){ $list[$menu] = json_decode($value,true); } return $list; } /** * text 判断 * */ public static function valiDateTextRole($data){ if (!$data['width']) return self::setErrorInfo('请输入文本框的宽度'); if ($data['width'] <= 0) return self::setErrorInfo('请输入正确的文本框的宽度'); return true; } /** * radio 和 checkbox规则的判断 * */ public static function valiDateRadioAndCheckbox($data){ $parameter = array(); $option = array(); $option_new = array(); $data['parameter'] = str_replace("\r\n","\n",$data['parameter']);//防止不兼容 $parameter = explode("\n",$data['parameter']); if(count($parameter) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); foreach ($parameter as $k=>$v){ if(isset($v) && !empty($v)){ $option[$k] = explode('=>',$v); } } if(count($option) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); $bool = 1; foreach ($option as $k=>$v){ $option_new[$k] = $option[$k][0]; foreach ($v as $kk=>$vv){ $vv_num = strlen($vv); if(!$vv_num){ $bool = 0; } } } // dump($option); if(!$bool)return self::setErrorInfo('请输入正确格式的配置参数'); $num1 = count($option_new);//提取该数组的数目 $arr2 = array_unique($option_new);//合并相同的元素 $num2 = count($arr2);//提取合并后数组个数 if($num1>$num2)return self::setErrorInfo('请输入正确格式的配置参数'); return true; } /** * textarea 判断 * */ public static function valiDateTextareaRole($data){ if (!$data['width']) return self::setErrorInfo('请输入多行文本框的宽度'); if (!$data['high']) return self::setErrorInfo('请输入多行文本框的高度'); if ($data['width'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); if ($data['high'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); return true; } /** * 获取一数据 * */ public static function getOneConfig($filed,$value){ $where[$filed] = $value; return self::where($where)->find(); } /** * 获取配置分类 * */ public static function getAll($id){ $where['config_tab_id'] = $id; $where['status'] = 1; return self::where($where)->order('sort desc,id asc')->select(); } /** * 获取所有配置分类 * */ public static function getConfigTabAll($type=0){ $configAll = SystemConfigTab::getAll($type); $config_tab = array(); foreach ($configAll as $k=>$v){ if(!$v['info']){ $config_tab[$k]['value'] = $v['id']; $config_tab[$k]['label'] = $v['title']; $config_tab[$k]['icon'] = $v['icon']; $config_tab[$k]['type'] = $v['type']; } } return $config_tab; } /** * 选择类型 * */ public static function radiotype($type='text'){ return [ ['value'=>'text','label'=>'文本框','disabled'=>1] ,['value'=>'textarea','label'=>'多行文本框','disabled'=>1] ,['value'=>'radio','label'=>'单选按钮','disabled'=>1] ,['value'=>'upload','label'=>'文件上传','disabled'=>1] ,['value'=>'checkbox','label'=>'多选按钮','disabled'=>1] ]; } /** * 文本框 * */ public static function createInputRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','text')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::input('value','默认值'); $formbuider[] = Form::number('width','文本框宽(%)',100); $formbuider[] = Form::input('required','验证规则')->placeholder('多个请用,隔开例如:required:true,url:true'); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 多行文本框 * */ public static function createTextAreaRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','textarea')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::textarea('value','默认值'); $formbuider[] = Form::number('width','文本框宽(%)',100); $formbuider[] = Form::number('high','多行文本框高(%)',5); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 单选按钮 * */ public static function createRadioRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','radio')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密"); $formbuider[] = Form::input('value','默认值'); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 文件上传 * */ public static function createUploadRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','upload')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::radio('upload_type','上传类型',1)->options([['value'=>1,'label'=>'单图'],['value'=>2,'label'=>'多图'],['value'=>3,'label'=>'文件']]); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 多选框 * */ public static function createCheckboxRule($tab_id){ $formbuider = array(); $formbuider[] = Form::radio('type','类型','checkbox')->options(self::radiotype()); $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); $formbuider[] = Form::input('info','配置名称')->autofocus(1); $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); $formbuider[] = Form::input('desc','配置简介'); $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色"); // $formbuider[] = Form::input('value','默认值'); $formbuider[] = Form::number('sort','排序'); $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); return $formbuider; } /** * 插入数据到数据库 * */ public static function set($data) { return self::create($data); } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\system; + +use basic\ModelBasic; +use service\FormBuilder as Form; +use traits\ModelTrait; +use \app\admin\model\system\SystemConfigTab; + +class SystemConfig extends ModelBasic { + + use ModelTrait; + /** + * 修改单个配置 + * */ + public static function setValue($menu,$value){ + if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return self::setErrorInfo('字段名称错误'); + if($config_one['type'] == 'radio' || $config_one['type'] == 'checkbox'){ + $parameter = array(); + $option = array(); + $parameter = explode(',',$config_one['parameter']); + foreach ($parameter as $k=>$v){ + if(isset($v) && !empty($v)){ + $option[$k] = explode('-',$v); + } + } + $value_arr = array();//选项的值 + foreach ($option as $k=>$v){ + foreach ($v as $kk=>$vv) + if(!$kk){ + $value_arr[$k] = $vv; + } + } + $i = 0;// + if(is_array($value)){ + foreach ($value as $value_v){ + if(in_array($value_v,$value_arr)){ + $i++; + } + } + if(count($value) != $i) return self::setErrorInfo('输入的值不属于选项中的参数'); + }else{ + if(in_array($value,$value_arr)){ + $i++; + } + if(!$i) return self::setErrorInfo('输入的值不属于选项中的参数'); + } + if($config_one['type'] == 'radio' && is_array($value)) return self::setErrorInfo('单选按钮的值是字符串不是数组'); + } + $bool = self::edit(['value' => json_encode($value)],$menu,'menu_name'); + return $bool; + } + /** + * 获取单个参数配置 + * */ + public static function getValue($menu){ + if(empty($menu) || !($config_one = self::get(['menu_name'=>$menu]))) return false; + return json_decode($config_one['value'],true); + } + + /** + * 获得多个参数 + * @param $menus + * @return array + */ + public static function getMore($menus) + { + $menus = is_array($menus) ? implode(',',$menus) : $menus; + $list = self::where('menu_name','IN',$menus)->column('value','menu_name')?:[]; + foreach ($list as $menu => $value){ + $list[$menu] = json_decode($value,true); + } + return $list; + } + + public static function getAllConfig() + { + $list = self::column('value','menu_name')?:[]; + foreach ($list as $menu => $value){ + $list[$menu] = json_decode($value,true); + } + return $list; + } + + /** + * text 判断 + * */ + public static function valiDateTextRole($data){ + if (!$data['width']) return self::setErrorInfo('请输入文本框的宽度'); + if ($data['width'] <= 0) return self::setErrorInfo('请输入正确的文本框的宽度'); + return true; + } + /** + * radio 和 checkbox规则的判断 + * */ + public static function valiDateRadioAndCheckbox($data){ + $parameter = array(); + $option = array(); + $option_new = array(); + $data['parameter'] = str_replace("\r\n","\n",$data['parameter']);//防止不兼容 + $parameter = explode("\n",$data['parameter']); + if(count($parameter) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); + foreach ($parameter as $k=>$v){ + if(isset($v) && !empty($v)){ + $option[$k] = explode('=>',$v); + } + } + if(count($option) < 2)return self::setErrorInfo('请输入正确格式的配置参数'); + $bool = 1; + foreach ($option as $k=>$v){ + $option_new[$k] = $option[$k][0]; + foreach ($v as $kk=>$vv){ + $vv_num = strlen($vv); + if(!$vv_num){ + $bool = 0; + } + } + } +// dump($option); + if(!$bool)return self::setErrorInfo('请输入正确格式的配置参数'); + $num1 = count($option_new);//提取该数组的数目 + $arr2 = array_unique($option_new);//合并相同的元素 + $num2 = count($arr2);//提取合并后数组个数 + if($num1>$num2)return self::setErrorInfo('请输入正确格式的配置参数'); + return true; + } + /** + * textarea 判断 + * */ + public static function valiDateTextareaRole($data){ + if (!$data['width']) return self::setErrorInfo('请输入多行文本框的宽度'); + if (!$data['high']) return self::setErrorInfo('请输入多行文本框的高度'); + if ($data['width'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); + if ($data['high'] < 0) return self::setErrorInfo('请输入正确的多行文本框的宽度'); + return true; + } + + /** + * 获取一数据 + * */ + public static function getOneConfig($filed,$value){ + $where[$filed] = $value; + return self::where($where)->find(); + } + /** + * 获取配置分类 + * */ + public static function getAll($id){ + $where['config_tab_id'] = $id; + $where['status'] = 1; + return self::where($where)->order('sort desc,id asc')->select(); + } + + /** + * 获取所有配置分类 + * */ + public static function getConfigTabAll($type=0){ + $configAll = SystemConfigTab::getAll($type); + $config_tab = array(); + foreach ($configAll as $k=>$v){ + if(!$v['info']){ + $config_tab[$k]['value'] = $v['id']; + $config_tab[$k]['label'] = $v['title']; + $config_tab[$k]['icon'] = $v['icon']; + $config_tab[$k]['type'] = $v['type']; + } + } + return $config_tab; + } + /** + * 选择类型 + * */ + public static function radiotype($type='text'){ + return [ + ['value'=>'text','label'=>'文本框','disabled'=>1] + ,['value'=>'textarea','label'=>'多行文本框','disabled'=>1] + ,['value'=>'radio','label'=>'单选按钮','disabled'=>1] + ,['value'=>'upload','label'=>'文件上传','disabled'=>1] + ,['value'=>'checkbox','label'=>'多选按钮','disabled'=>1] + ]; + } + /** + * 文本框 + * */ + public static function createInputRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','text')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::input('value','默认值'); + $formbuider[] = Form::number('width','文本框宽(%)',100); + $formbuider[] = Form::input('required','验证规则')->placeholder('多个请用,隔开例如:required:true,url:true'); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + /** + * 多行文本框 + * */ + public static function createTextAreaRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','textarea')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::textarea('value','默认值'); + $formbuider[] = Form::number('width','文本框宽(%)',100); + $formbuider[] = Form::number('high','多行文本框高(%)',5); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + /** + * 单选按钮 + * */ + public static function createRadioRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','radio')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密"); + $formbuider[] = Form::input('value','默认值'); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + /** + * 文件上传 + * */ + public static function createUploadRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','upload')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::radio('upload_type','上传类型',1)->options([['value'=>1,'label'=>'单图'],['value'=>2,'label'=>'多图'],['value'=>3,'label'=>'文件']]); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + + } + /** + * 多选框 + * */ + public static function createCheckboxRule($tab_id){ + $formbuider = array(); + $formbuider[] = Form::radio('type','类型','checkbox')->options(self::radiotype()); + $formbuider[] = Form::select('config_tab_id','分类',$tab_id)->setOptions(SystemConfig::getConfigTabAll(-1)); + $formbuider[] = Form::input('info','配置名称')->autofocus(1); + $formbuider[] = Form::input('menu_name','字段变量')->placeholder('例如:site_url'); + $formbuider[] = Form::input('desc','配置简介'); + $formbuider[] = Form::textarea('parameter','配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色"); +// $formbuider[] = Form::input('value','默认值'); + $formbuider[] = Form::number('sort','排序'); + $formbuider[] = Form::radio('status','状态',1)->options([['value'=>1,'label'=>'显示'],['value'=>2,'label'=>'隐藏']]); + return $formbuider; + } + + /** + * 插入数据到数据库 + * */ + public static function set($data) + { + return self::create($data); + } +} \ No newline at end of file diff --git a/application/admin/model/system/SystemConfigTab.php b/application/admin/model/system/SystemConfigTab.php index 5c47e760..856005d8 100644 --- a/application/admin/model/system/SystemConfigTab.php +++ b/application/admin/model/system/SystemConfigTab.php @@ -1 +1,106 @@ - * @day: 2017/11/02 */ namespace app\admin\model\system; use traits\ModelTrait; use basic\ModelBasic; use think\Db; /** * 配置分类model * * Class SystemConfigTab * @package app\admin\model\system */ class SystemConfigTab extends ModelBasic { use ModelTrait; /** * 获取单选按钮或者多选按钮的显示值 * */ public static function getRadioOrCheckboxValueInfo($menu_name,$value){ $parameter = array(); $option = array(); $config_one = SystemConfig::getOneConfig('menu_name',$menu_name); $parameter = explode("\n",$config_one['parameter']); foreach ($parameter as $k=>$v){ if(isset($v) && strlen($v)>0){ $data = explode('=>',$v); $option[$data[0]] = $data[1]; } } $str = ''; if(is_array($value)){ foreach ($value as $v){ $str .= $option[$v].','; } }else{ $str .= !empty($value)?$option[$value]:$option[0]; } return $str; } /** * 插入数据到数据库 * */ public static function set($data) { return self::create($data); } /** * 获取全部 * */ public static function getAll($type = 0){ $where['status'] = 1; if($type>-1)$where['type'] = $type; return Db::name('SystemConfigTab')->where($where)->select(); } /** * 获取配置分类 * */ public static function getSystemConfigTabPage($where = array()) { $model = new self; if($where['title'] != '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['status'] != '') $model = $model->where('status',$where['status']); return self::page($model,$where); } public static function edit($data,$id,$field='id') { return self::update($data,[$field=>$id]); } /** * 更新数据 * @access public * @param array $data 数据数组 * @param array $where 更新条件 * @param array|true $field 允许字段 * @return $this */ public static function update($data = [], $where = [], $field = null) { $model = new static(); if (!empty($field)) { $model->allowField($field); } $result = $model->isUpdate(true)->save($data, $where); return $model; } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\system; + +use traits\ModelTrait; +use basic\ModelBasic; +use think\Db; + +/** + * 配置分类model + * + * Class SystemConfigTab + * @package app\admin\model\system + */ +class SystemConfigTab extends ModelBasic { + + use ModelTrait; + /** + * 获取单选按钮或者多选按钮的显示值 + * */ + public static function getRadioOrCheckboxValueInfo($menu_name,$value){ + $parameter = array(); + $option = array(); + $config_one = SystemConfig::getOneConfig('menu_name',$menu_name); + $parameter = explode("\n",$config_one['parameter']); + foreach ($parameter as $k=>$v){ + if(isset($v) && strlen($v)>0){ + $data = explode('=>',$v); + $option[$data[0]] = $data[1]; + } + } + $str = ''; + if(is_array($value)){ + foreach ($value as $v){ + $str .= $option[$v].','; + } + }else{ + $str .= !empty($value)?$option[$value]:$option[0]; + } + return $str; + } + /** + * 插入数据到数据库 + * */ + public static function set($data) + { + return self::create($data); + } + /** + * 获取全部 + * */ + public static function getAll($type = 0){ + $where['status'] = 1; + if($type>-1)$where['type'] = $type; + return Db::name('SystemConfigTab')->where($where)->select(); + } + + /** + * 获取配置分类 + * */ + public static function getSystemConfigTabPage($where = array()) + + { + $model = new self; + if($where['title'] != '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['status'] != '') $model = $model->where('status',$where['status']); + return self::page($model,$where); + + } + + public static function edit($data,$id,$field='id') + + { + + return self::update($data,[$field=>$id]); + + } + + /** + * 更新数据 + * @access public + * @param array $data 数据数组 + * @param array $where 更新条件 + * @param array|true $field 允许字段 + * @return $this + */ + public static function update($data = [], $where = [], $field = null) + { + $model = new static(); + if (!empty($field)) { + $model->allowField($field); + } + $result = $model->isUpdate(true)->save($data, $where); + return $model; + } +} \ No newline at end of file diff --git a/application/admin/model/user/User.php b/application/admin/model/user/User.php index 0e26497a..d7ec24a4 100644 --- a/application/admin/model/user/User.php +++ b/application/admin/model/user/User.php @@ -1 +1,1070 @@ - * @day: 2017/11/11 */ namespace app\admin\model\user; use app\admin\model\order\StoreOrder; use traits\ModelTrait; use app\admin\model\user\UserBill; use basic\ModelBasic; use app\admin\model\wechat\WechatUser; use app\admin\model\store\StoreCouponUser; use app\admin\model\user\UserExtract; use think\Db; /** * 用户管理 model * Class User * @package app\admin\model\user */ class User extends ModelBasic { use ModelTrait; /** * @param $where * @return array */ public static function systemPage($where){ $model = new self; if($where['status'] != '') $model = $model->where('status',$where['status']); if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']); if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']); if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%"); $model = $model->order('uid desc'); return self::page($model,function ($item){ if($item['spread_uid']){ $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname'); }else{ $item['spread_uid_nickname'] = '无'; } },$where); } /* * 设置搜索条件 * */ public static function setWhere($where) { if($where['order']!=''){ $model=self::order(self::setOrder($where['order'])); }else{ $model=self::order('u.uid desc'); } if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){ list($startTime, $endTime) = explode(' - ', $where['user_time']); $model = $model->where('u.last_time', ['>', strtotime($endTime)+24*3600], ['<', strtotime($startTime)],'or'); } if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){ list($startTime, $endTime) = explode(' - ', $where['user_time']); $model = $model->where('u.last_time', '>', strtotime($startTime)); $model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600); } if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){ list($startTime, $endTime) = explode(' - ', $where['user_time']); $model = $model->where('u.add_time', '>', strtotime($startTime)); $model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600); } if($where['pay_count'] !== '') { if($where['pay_count'] == '-1') $model = $model->where('pay_count',0); else $model = $model->where('pay_count','>',$where['pay_count']); } if($where['user_type'] != ''){ if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null'); else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null'); } if($where['country'] != ''){ if($where['country'] == 'domestic') $model = $model->where('w.country','EQ','中国'); else if($where['country'] == 'abroad') $model = $model->where('w.country','NEQ','中国'); } return $model; } /** * 异步获取当前用户 信息 * @param $where * @return array */ public static function getUserList($where){ $model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid']); $list = $model->alias('u') ->join('WechatUser w','u.uid=w.uid') ->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time') ->page((int)$where['page'],(int)$where['limit']) ->select() ->each(function ($item){ $item['add_time']=date('Y-m-d H:i:s',$item['add_time']); if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期 else $item['last_time'] = '无访问';//最近一次访问日期 self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']); $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现 if($item['spread_uid']){ $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid']; }else{ $item['spread_uid_nickname'] = '无'; } if($item['openid'] != '' && $item['routine_openid'] != ''){ $item['user_type']='通用'; }else if($item['openid'] == '' && $item['routine_openid'] != ''){ $item['user_type']='小程序'; }else if($item['openid'] != '' && $item['routine_openid'] == ''){ $item['user_type']='公众号'; }else $item['user_type']='其他'; if($item['sex'] == 1){ $item['sex']='男'; }else if($item['sex'] == 2){ $item['sex']='女'; }else $item['sex']='保密'; });//->toArray(); $count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count(); return ['count'=>$count,'data'=>$list]; } /** * 修改用户状态 * @param $uids 用户uid * @param $status 修改状态 * @return array */ public static function destrSyatus($uids,$status){ if(empty($uids) && !is_array($uids)) return false; if($status=='') return false; self::beginTrans(); try{ $res=self::where('uid','in',$uids)->update(['status'=>$status]); self::checkTrans($res); return true; }catch (\Exception $e){ self::rollbackTrans(); return Json::fail($e->getMessage()); } } /* * 获取某季度,某年某年后的时间戳 * * self::getMonth('n',1) 获取当前季度的上个季度的时间戳 * self::getMonth('n') 获取当前季度的时间戳 */ public static function getMonth($time='',$ceil=0){ if(empty($time)){ $firstday = date("Y-m-01",time()); $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day")); }else if($time=='n'){ if($ceil!=0) $season = ceil(date('n') /3)-$ceil; else $season = ceil(date('n') /3); $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y'))); $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y'))); }else if($time=='y'){ $firstday=date('Y-01-01'); $lastday=date('Y-12-31'); }else if($time=='h'){ $firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00'; $lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59'; } return array($firstday,$lastday); } public static function getcount(){ return self::count(); } /* *获取用户某个时间段的消费信息 * * reutrn Array || number */ public static function consume($where,$status='',$keep=''){ $model = new self; $user_id=[]; if(is_array($where)){ if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']); if($where['status']!='') $model=$model->where('status',$where['status']); switch ($where['date']){ case null:case 'today':case 'week':case 'year': if($where['date']==null){ $where['date']='month'; } if($keep){ $model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']); }else{ $model=$model->whereTime('add_time',$where['date']); } break; case 'quarter': $quarter=self::getMonth('n'); $startTime=strtotime($quarter[0]); $endTime=strtotime($quarter[1]); if($keep){ $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime); }else{ $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime); } break; default: //自定义时间 if(strstr($where['date'],'-')!==FALSE){ list($startTime,$endTime)=explode('-',$where['date']); $model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime)); }else{ $model=$model->whereTime('add_time','month'); } break; } }else{ if(is_array($status)){ $model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]); } } if($keep===true){ return $model->count(); } if($status==='default'){ return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray(); } if($status==='grouping'){ return $model->group('user_type')->field('user_type')->select()->toArray(); } $uid=$model->field('uid')->select()->toArray(); foreach ($uid as $val){ $user_id[]=$val['uid']; } if(empty($user_id)){ $user_id=[0]; } if($status==='xiaofei'){ $list=UserBill::where('uid','in',$user_id) ->group('type') ->field('sum(number) as top_number,title') ->select() ->toArray(); $series=[ 'name'=>isset($list[0]['title'])?$list[0]['title']:'', 'type'=>'pie', 'radius'=> ['40%', '50%'], 'data'=>[] ]; foreach($list as $key=>$val){ $series['data'][$key]['value']=$val['top_number']; $series['data'][$key]['name']=$val['title']; } return $series; }else if($status==='form'){ $list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray(); $count=self::getcount(); $option=[ 'legend_date'=>[], 'series_date'=>[] ]; foreach($list as $key=>$val){ $num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0; $t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle']; $option['legend_date'][$key]=$t; $option['series_date'][$key]=['value'=>$num,'name'=>$t['name']]; } return $option; }else{ $number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number'); return $number; } } /* * 获取 用户某个时间段的钱数或者TOP20排行 * * return Array || number */ public static function getUserSpend($date,$status=''){ $model=new self(); $model=$model->alias('A'); switch ($date){ case null:case 'today':case 'week':case 'year': if($date==null) $date='month'; $model=$model->whereTime('A.add_time',$date); break; case 'quarter': list($startTime,$endTime)=User::getMonth('n'); $model = $model->where('A.add_time','>',strtotime($startTime)); $model = $model->where('A.add_time','<',strtotime($endTime)); break; default: list($startTime,$endTime)=explode('-',$date); $model = $model->where('A.add_time','>',strtotime($startTime)); $model = $model->where('A.add_time','<',strtotime($endTime)); break; } if($status===true){ return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); } $list=$model->join('user_bill B','B.uid=A.uid') ->where('B.type','pay_product') ->where('B.pm',0) ->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time') ->order('totel_number desc') ->limit(0,20) ->select() ->toArray(); if(!isset($list[0]['totel_number'])){ $list=[]; } return $list; } /* * 获取 相对于上月或者其他的数据 * * return Array */ public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){ $model=new self(); if(!$status) $model=$model->alias('A'); switch ($date){ case null:case 'today':case 'week':case 'year': if($date==null) { $date='last month'; $title='相比上月用户'.$t.'增长'; } if($date=='today') { $date='yesterday'; $title='相比昨天用户'.$t.'增长'; } if($date=='week') { $date='last week'; $title='相比上周用户'.$t.'增长'; } if($date=='year') { $date='last year'; $title='相比去年用户'.$t.'增长'; } $model=$model->whereTime($field,$date); break; case 'quarter': $title='相比上季度用户'.$t.'增长'; list($startTime,$endTime)=User::getMonth('n',1); $model = $model->where($field,'>',$startTime); $model = $model->where($field,'<',$endTime); break; default: list($startTime,$endTime)=explode('-',$date); $title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长'; $Time=strtotime($endTime)-strtotime($startTime); $model = $model->where($field,'>',strtotime($startTime)+$Time); $model = $model->where($field,'<',strtotime($endTime)+$Time); break; } if($status){ return [$model->count(),$title]; } $number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); return [$number,$title]; } //获取用户新增,头部信息 public static function getBadgeList($where){ $user_count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count(); $user_count_old=self::getOldDate($where)->count(); $fenxiao=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count(); $fenxiao_count=self::getOldDate($where)->where('spread_uid','neq',0)->count(); $newFemxiao_count=bcsub($fenxiao,$fenxiao_count,0); $order_count=bcsub($user_count,$user_count_old,0); return [ [ 'name'=>'会员人数', 'field'=>'个', 'count'=>$user_count, 'content'=>'会员总人数', 'background_color'=>'layui-bg-blue', 'sum'=>self::count(), 'class'=>'fa fa-bar-chart', ], [ 'name'=>'会员增长', 'field'=>'个', 'count'=>$order_count, 'content'=>'会员增长率', 'background_color'=>'layui-bg-cyan', 'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0, 'class'=>'fa fa-line-chart', ], [ 'name'=>'分销人数', 'field'=>'个', 'count'=>$fenxiao, 'content'=>'分销总人数', 'background_color'=>'layui-bg-green', 'sum'=>self::where('spread_uid','neq',0)->count(), 'class'=>'fa fa-bar-chart', ], [ 'name'=>'分销增长', 'field'=>'个', 'count'=>$newFemxiao_count, 'content'=>'分销总人数', 'background_color'=>'layui-bg-orange', 'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0, 'class'=>'fa fa-cube', ], ]; } /* * 获取会员增长曲线图和分布图 * $where 查询条件 * $limit 显示条数,是否有滚动条 */ public static function getUserChartList($where,$limit=20){ $list=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status']) ->where('add_time','neq',0) ->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','count(uid) as num']) ->order('_add_time asc') ->group('_add_time') ->select(); count($list) && $list=$list->toArray(); $seriesdata=[]; $xdata=[]; $Zoom=''; foreach ($list as $item){ $seriesdata[]=$item['num']; $xdata[]=$item['_add_time']; } (count($xdata) > $limit) && $Zoom=$xdata[$limit-5]; //多次购物会员数量饼状图 $count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count(); $user_count=self::setWherePage(self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter']) ->where('r.paid',1)->count('a.uid'); $shop_xdata=['多次购买数量占比','无购买数量占比']; $shop_data=[]; $count >0 && $shop_data=[ [ 'value'=>bcdiv($user_count,$count,2)*100, 'name'=>$shop_xdata[0], 'itemStyle'=>[ 'color'=>'#D789FF', ] ], [ 'value'=>bcdiv($count-$user_count,$count,2)*100, 'name'=>$shop_xdata[1], 'itemStyle'=>[ 'color'=>'#7EF0FB', ] ] ]; return compact('shop_data','shop_xdata','fenbu_data','fenbu_xdata','seriesdata','xdata','Zoom'); } //获取$date的前一天或者其他的时间段 public static function getOldDate($where,$moedls=null){ $model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls; switch ($where['data']){ case 'today': $model=$model->whereTime('add_time','yesterday'); break; case 'week': $model=$model->whereTime('add_time','last week'); break; case 'month': $model=$model->whereTime('add_time','last month'); break; case 'year': $model=$model->whereTime('add_time','last year'); break; case 'quarter': $time=self::getMonth('n',1); $model=$model->where('add_time','between',$time); break; } return $model; } //获取用户属性和性别分布图 public static function getEchartsData($where){ $model=self::alias('a'); $data=self::getModelTime($where,$model,'a.add_time') ->join('wechat_user r','r.uid=a.uid') ->group('r.province') ->field('count(r.province) as count,province') ->order('count desc') ->limit(15) ->select(); if(count($data)) $data=$data->toArray(); $legdata=[]; $dataList=[]; foreach ($data as $value){ $value['province']=='' && $value['province']='未知省份'; $legdata[]=$value['province']; $dataList[]=$value['count']; } $model=self::alias('a'); $sex=self::getModelTime($where,$model,'a.add_time') ->join('wechat_user r','r.uid=a.uid') ->group('r.sex') ->field('count(r.uid) as count,sex') ->order('count desc') ->select(); if(count($sex)) $sex=$sex->toArray(); $sexlegdata=['男','女','未知']; $sexcount=self::getModelTime($where,new self())->count(); $sexList=[]; $color=['#FB7773','#81BCFE','#91F3FE']; foreach ($sex as $key=>$item){ if($item['sex']==1){ $item_date['name']='男'; }else if($item['sex']==2){ $item_date['name']='女'; }else{ $item_date['name']='未知性别'; } $item_date['value']=bcdiv($item['count'],$sexcount,2)*100; $item_date['itemStyle']['color']=$color[$key]; $sexList[]=$item_date; } return compact('sexList','sexlegdata','legdata','dataList'); } //获取佣金记录列表 public static function getCommissionList($where){ $list=self::setCommissionWhere($where) ->page((int)$where['page'],(int)$where['limit']) ->select(); count($list) && $list=$list->toArray(); foreach ($list as &$value){ $value['ex_price']= Db::name('user_extract')->where(['uid'=>$value['uid']])->sum('extract_price'); $value['extract_price']= Db::name('user_extract')->where(['uid'=>$value['uid'],'status'=>1])->sum('extract_price'); } $count=self::setCommissionWhere($where)->count(); return ['data'=>$list,'count'=>$count]; } //获取佣金记录列表的查询条件 public static function setCommissionWhere($where){ $models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid']) ->join('user_bill B','B.uid=A.uid') ->group('A.uid') ->where(['B.category'=>'now_money','B.type'=>'brokerage']) ->field(['sum(B.number) as sum_number','A.nickname','A.uid','A.now_money']); if($where['order']==''){ $models=$models->order('sum_number desc'); }else{ $models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc'); } if($where['price_max']!='' && $where['price_min']!=''){ $models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]); } return $models; } /**获取用户详细信息 * @param $uid * @return array */ public static function getUserInfos($uid) { $userInfo = self::where('uid',$uid)->find(); if(!$userInfo) exception('读取用户信息失败!'); return $userInfo->toArray(); } //获取某人用户推广信息 public static function getUserinfo($uid){ $userinfo=self::where(['uid'=>$uid])->field(['nickname','spread_uid','now_money','add_time'])->find()->toArray(); $userinfo['number']=UserBill::where(['category'=>'now_money','type'=>'brokerage'])->sum('number'); $userinfo['spread_name']=$userinfo['spread_uid'] ? self::where(['uid'=>$userinfo['spread_uid']])->value('nickname') :''; return $userinfo; } //获取某用户的详细信息 public static function getUserDetailed($uid){ $key_field=['real_name','phone','province','city','district','detail','post_code']; $Address=($thisAddress= Db::name('user_address')->where(['uid'=>$uid,'is_default'=>1])->field($key_field)->find()) ? $thisAddress : Db::name('user_address')->where(['uid'=>$uid])->field($key_field)->find(); $UserInfo=self::get($uid); return [ ['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''], // ['name'=>'微信OpenID','value'=>WechatUser::where(['uid'=>$uid])->value('openid'),'col'=>8], ['name'=>'手机号码','value'=>$UserInfo['phone']], // ['name'=>'ID','value'=>$uid], ['name'=>'姓名','value'=>''], ['name'=>'微信昵称','value'=>$UserInfo['nickname']], ['name'=>'邮箱','value'=>''], ['name'=>'生日','value'=>''], ['name'=>'积分','value'=>UserBill::where(['category'=>'integral','uid'=>$uid])->where('type','in',['sign','system_add'])->sum('number')], ['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where(['uid'=>$UserInfo['spread_uid']])->value('nickname'):''], ['name'=>'账户余额','value'=>$UserInfo['now_money']], ['name'=>'佣金总收入','value'=>UserBill::where(['category'=>'now_money','type'=>'brokerage','uid'=>$uid])->sum('number')], ['name'=>'提现总金额','value'=> Db::name('user_extract')->where(['uid'=>$uid,'status'=>1])->sum('extract_price')], ]; } //获取某用户的订单个数,消费明细 public static function getHeaderList($uid){ return [ [ 'title'=>'总计订单', 'value'=>StoreOrder::where(['uid'=>$uid])->count(), 'key'=>'笔', 'class'=>'', ], [ 'title'=>'总消费金额', 'value'=>StoreOrder::where(['uid'=>$uid,'paid'=>1])->sum('total_price'), 'key'=>'元', 'class'=>'', ], [ 'title'=>'本月订单', 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->count(), 'key'=>'笔', 'class'=>'', ], [ 'title'=>'本月消费金额', 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->sum('total_price'), 'key'=>'元', 'class'=>'', ] ]; } /* * 获取 会员 订单个数,积分明细,优惠劵明细 * * $uid 用户id; * * return array */ public static function getCountInfo($uid){ $order_count=StoreOrder::where(['uid'=>$uid])->count(); $integral_count=UserBill::where(['uid'=>$uid,'category'=>'integral'])->where('type','in',['deduction','system_add'])->count(); $sign_count=UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign'])->count(); $balanceChang_count=UserBill::where(['uid'=>$uid,'category'=>'now_money']) ->where('type','in',['system_add','pay_product','extract','pay_product_refund','system_sub']) ->count(); $coupon_count=StoreCouponUser::where(['uid'=>$uid])->count(); $spread_count=self::where(['spread_uid'=>$uid])->count(); return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count'); } /* * 获取 会员业务的 * 购物会员统计 * 会员访问量 * * 曲线图 * * $where 查询条件 * * return array */ public static function getUserBusinessChart($where,$limit=20){ //获取购物会员人数趋势图 $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where(['r.paid'=>1,'a.is_promoter'=>0]) ->where('a.add_time','neq',0) ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($list) && $list=$list->toArray(); $seriesdata=[]; $xdata=[]; $zoom=''; foreach ($list as $item){ $seriesdata[]=$item['count_user']; $xdata[]=$item['_add_time']; } count($xdata) > $limit && $zoom=$xdata[$limit-5]; //会员访问量 $visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time') ->where('a.is_promoter',0) ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($visit) && $visit=$visit->toArray(); $visit_data=[]; $visit_xdata=[]; $visit_zoom=''; foreach ($visit as $item){ $visit_data[]=$item['count_user']; $visit_xdata[]=$item['_add_time']; } count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; //多次购物会员数量饼状图 $count=self::getModelTime($where,self::where('is_promoter',0))->count(); $user_count=self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where('a.is_promoter',0) ->where('r.paid',1) ->group('a.uid') ->count(); $shop_xdata=['多次购买数量占比','无购买数量占比']; $shop_data=[]; $count >0 && $shop_data=[ [ 'value'=>bcdiv($user_count,$count,2)*100, 'name'=>$shop_xdata[0], 'itemStyle'=>[ 'color'=>'#D789FF', ] ], [ 'value'=>bcdiv($count-$user_count,$count,2)*100, 'name'=>$shop_xdata[1], 'itemStyle'=>[ 'color'=>'#7EF0FB', ] ] ]; return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata'); } /* * 获取用户 * 积分排行 * 会员余额排行榜 * 分销商佣金总额排行榜 * 购物笔数排行榜 * 购物金额排行榜 * 分销商佣金提现排行榜 * 上月消费排行榜 * $limit 查询多少条 * return array */ public static function getUserTop10List($limit=10,$is_promoter=0){ //积分排行 $integral=self::where('status',1) ->where('is_promoter',$is_promoter) ->order('integral desc') ->field(['nickname','phone','integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) ->limit($limit) ->select(); count($integral) && $integral=$integral->toArray(); //会员余额排行榜 $now_money=self::where('status',1) ->where('is_promoter',$is_promoter) ->order('now_money desc') ->field(['nickname','phone','now_money','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) ->limit($limit) ->select(); count($now_money) && $now_money=$now_money->toArray(); //购物笔数排行榜 $orderPayCount = StoreOrder::getOrderPayCount($is_promoter); if($orderPayCount){ $shopcount=self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid') ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) ->group('r.uid') ->field(['a.nickname','a.phone','count(r.uid) as sum_count','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) ->order('sum_count desc') ->limit($limit) ->select(); }else $shopcount = []; count($shopcount) && $shopcount=$shopcount->toArray(); //购物金额排行榜 if($orderPayCount){ $order=self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid') ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) ->group('r.uid') ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) ->order('sum_price desc') ->limit($limit) ->select(); }else $order = []; count($order) && $order=$order->toArray(); //上月消费排行 $orderPayCount = StoreOrder::getOrderPayMonthCount($is_promoter); if($orderPayCount){ $lastorder=self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid') ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) // ->whereTime('r.pay_time','last month') ->where('r.pay_time','between',[strtotime(date('Y-m',strtotime('-1 month'))),strtotime(date('Y-m'))]) ->group('r.uid') ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) ->order('sum_price desc') ->limit($limit) ->select(); }else $lastorder = []; count($lastorder) && $lastorder=$lastorder->toArray(); return compact('integral','now_money','shopcount','order','lastorder'); } /* * 获取 会员业务 * 会员总余额 会员总积分 * $where 查询条件 * * return array */ public static function getUserBusinesHeade($where){ return [ [ 'name'=>'会员总余额', 'field'=>'元', 'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'), 'background_color'=>'layui-bg-cyan', 'col'=>6, ], [ 'name'=>'会员总积分', 'field'=>'分', 'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'), 'background_color'=>'layui-bg-cyan', 'col'=>6 ] ]; } /* * 分销会员头部信息查询获取 * * 分销商总佣金余额 * 分销商总提现佣金 * 本月分销商业务佣金 * 本月分销商佣金提现金额 * 上月分销商业务佣金 * 上月分销商佣金提现金额 * $where array 时间条件 * * return array */ public static function getDistributionBadgeList($where){ return [ [ 'name'=>'分销商总佣金', 'field'=>'元', 'count'=>self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',function($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'分销商总佣金余额', 'field'=>'元', 'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'分销商总提现佣金', 'field'=>'元', 'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'本月分销商业务佣金', 'field'=>'元', 'count'=>self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage')) ->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>3, ], [ 'name'=>'本月分销商佣金提现金额', 'field'=>'元', 'count'=>self::getModelTime(['data'=>'month'],UserExtract::where('status',1)) ->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->field('uid'); })->sum('extract_price'), 'background_color'=>'layui-bg-cyan', 'col'=>4, ], [ 'name'=>'上月分销商业务佣金', 'field'=>'元', 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->where('type','brokerage'))->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>4, ], [ 'name'=>'上月分销商佣金提现金额', 'field'=>'元', 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); })->where('type','brokerage'))->sum('number'), 'background_color'=>'layui-bg-cyan', 'col'=>4, ], ]; } /* * 分销会员 * 分销数量 饼状图 * 分销商会员访问量 曲线 * 获取购物会员人数趋势图 曲线 * 多次购物分销会员数量 饼状图 * $where array 条件 * $limit int n条数据后出拖动条 * return array */ public static function getUserDistributionChart($where,$limit=20){ //分销数量 $fenbu_user=self::getModelTime($where,new self)->field(['count(uid) as num'])->group('is_promoter')->select(); count($fenbu_user) && $fenbu_user=$fenbu_user->toArray(); $sum_user=0; $fenbu_data=[]; $fenbu_xdata=['分销商','非分销商']; $color=['#81BCFE','#91F3FE']; foreach($fenbu_user as $item){ $sum_user+=$item['num']; } foreach ($fenbu_user as $key=>$item){ $value['value']=bcdiv($item['num'],$sum_user,2)*100; $value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :''; $value['itemStyle']['color']=$color[$key]; $fenbu_data[]=$value; } //分销商会员访问量 $visit=self::getModelTime($where,self::alias('a')->join('store_visit t','t.uid=a.uid'),'t.add_time') ->where('a.is_promoter',1) ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); // echo self::getLastSql();die; count($visit) && $visit=$visit->toArray(); $visit_data=[]; $visit_xdata=[]; $visit_zoom=''; foreach ($visit as $item){ $visit_data[]=$item['count_user']; $visit_xdata[]=$item['_add_time']; } count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; //获取购物会员人数趋势图 $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where(['r.paid'=>1,'a.is_promoter'=>1]) ->where('a.add_time','neq',0) ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) ->group('_add_time') ->order('_add_time asc') ->select(); count($list) && $list=$list->toArray(); $seriesdata=[]; $xdata=[]; $zoom=''; foreach ($list as $item){ $seriesdata[]=$item['count_user']; $xdata[]=$item['_add_time']; } count($xdata) > $limit && $zoom=$xdata[$limit-5]; //多次购物分销会员数量饼状图 $count=self::getModelTime($where,self::where('is_promoter',1))->count(); $user_count=self::getModelTime($where,self::alias('a') ->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') ->where('a.is_promoter',1) ->where('r.paid',1) ->group('a.uid') ->count(); $shop_xdata=['多次购买数量占比','无购买数量占比']; $shop_data=[]; $count >0 && $shop_data=[ [ 'value'=>bcdiv($user_count,$count,2)*100, 'name'=>$shop_xdata[0].$user_count.'人', 'itemStyle'=>[ 'color'=>'#D789FF', ] ], [ 'value'=>bcdiv($count-$user_count,$count,2)*100, 'name'=>$shop_xdata[1].($count-$user_count).'人', 'itemStyle'=>[ 'color'=>'#7EF0FB', ] ] ]; return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data'); } /* * 分销商佣金提现排行榜 * 分销商佣金总额排行榜 * $limit 截取条数 * return array */ public static function getUserDistributionTop10List($limit){ //分销商佣金提现排行榜 $extract=self::alias('a') ->join('user_extract t','a.uid=t.uid') ->where(['t.status'=>1,'a.is_promoter'=>1]) ->group('t.uid') ->field(['a.nickname','a.phone','sum(t.extract_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','t.uid']) ->order('sum_price desc') ->limit($limit) ->select(); count($extract) && $extract=$extract->toArray(); //分销商佣金总额排行榜 $commission=UserBill::alias('l') ->join('user a','l.uid=a.uid') ->where(['l.status'=>'1','l.category'=>'now_money','l.type'=>'brokerage','a.is_promoter'=>1]) ->group('l.uid') ->field(['a.nickname','a.phone','sum(number) as sum_number','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) ->order('sum_number desc') ->limit($limit) ->select(); count($commission) && $commission=$commission->toArray(); return compact('extract','commission'); } public static function getSpreadList($uid,$page,$limit){ $list=self::where(['spread_uid'=>$uid])->field(['uid','nickname','now_money','integral','add_time']) ->order('uid desc')->page((int)$page,(int)$limit)->select(); count($list) && $list=$list->toArray(); foreach ($list as &$item){ $item['add_time']=date('Y-m-d H',$item['add_time']); } return $list; } } \ No newline at end of file + + * @day: 2017/11/11 + */ +namespace app\admin\model\user; +use app\admin\model\order\StoreOrder; +use traits\ModelTrait; +use app\admin\model\user\UserBill; +use basic\ModelBasic; +use app\admin\model\wechat\WechatUser; +use app\admin\model\store\StoreCouponUser; +use app\admin\model\user\UserExtract; +use service\SystemConfigService; +use think\Db; +/** + * 用户管理 model + * Class User + * @package app\admin\model\user + */ +class User extends ModelBasic +{ + use ModelTrait; + /** + * @param $where + * @return array + */ + public static function systemPage($where){ + $model = new self; + if($where['status'] != '') $model = $model->where('status',$where['status']); + if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']); + if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']); + if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%"); + $model = $model->order('uid desc'); + return self::page($model,function ($item){ + if($item['spread_uid']){ + $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname'); + }else{ + $item['spread_uid_nickname'] = '无'; + } + },$where); + } + /* + * 设置搜索条件 + * + */ + public static function setWhere($where) + { + if($where['order']!=''){ + $model=self::order(self::setOrder($where['order'])); + }else{ + $model=self::order('u.uid desc'); + } + if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){ + list($startTime, $endTime) = explode(' - ', $where['user_time']); + $model = $model->where('u.last_time', ['>', strtotime($endTime)+24*3600], ['<', strtotime($startTime)],'or'); + } + if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){ + list($startTime, $endTime) = explode(' - ', $where['user_time']); + $model = $model->where('u.last_time', '>', strtotime($startTime)); + $model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600); + } + if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){ + list($startTime, $endTime) = explode(' - ', $where['user_time']); + $model = $model->where('u.add_time', '>', strtotime($startTime)); + $model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600); + } + if($where['pay_count'] !== '') { + if($where['pay_count'] == '-1') $model = $model->where('pay_count',0); + else $model = $model->where('pay_count','>',$where['pay_count']); + } + if($where['user_type'] != ''){ + if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null'); + else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null'); + } + if($where['country'] != ''){ + if($where['country'] == 'domestic') $model = $model->where('w.country','EQ','中国'); + else if($where['country'] == 'abroad') $model = $model->where('w.country','NEQ','中国'); + } + return $model; + } + /** + * 异步获取当前用户 信息 + * @param $where + * @return array + */ + public static function getUserList($where){ + $model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid']); + $list = $model->alias('u') + ->join('WechatUser w','u.uid=w.uid') + ->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time') + ->page((int)$where['page'],(int)$where['limit']) + ->select() + ->each(function ($item){ + $item['add_time']=date('Y-m-d H:i:s',$item['add_time']); + if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期 + else $item['last_time'] = '无访问';//最近一次访问日期 + self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']); + $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现 + if($item['spread_uid']){ + $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid']; + }else{ + $item['spread_uid_nickname'] = '无'; + } + if($item['openid'] != '' && $item['routine_openid'] != ''){ + $item['user_type']='通用'; + }else if($item['openid'] == '' && $item['routine_openid'] != ''){ + $item['user_type']='小程序'; + }else if($item['openid'] != '' && $item['routine_openid'] == ''){ + $item['user_type']='公众号'; + }else $item['user_type']='其他'; + if($item['sex'] == 1){ + $item['sex']='男'; + }else if($item['sex'] == 2){ + $item['sex']='女'; + }else $item['sex']='保密'; + });//->toArray(); + $count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count(); + return ['count'=>$count,'data'=>$list]; + } + /** + * 修改用户状态 + * @param $uids 用户uid + * @param $status 修改状态 + * @return array + */ + public static function destrSyatus($uids,$status){ + if(empty($uids) && !is_array($uids)) return false; + if($status=='') return false; + self::beginTrans(); + try{ + $res=self::where('uid','in',$uids)->update(['status'=>$status]); + self::checkTrans($res); + return true; + }catch (\Exception $e){ + self::rollbackTrans(); + return Json::fail($e->getMessage()); + } + } + /* + * 获取某季度,某年某年后的时间戳 + * + * self::getMonth('n',1) 获取当前季度的上个季度的时间戳 + * self::getMonth('n') 获取当前季度的时间戳 + */ + public static function getMonth($time='',$ceil=0){ + if(empty($time)){ + $firstday = date("Y-m-01",time()); + $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day")); + }else if($time=='n'){ + if($ceil!=0) + $season = ceil(date('n') /3)-$ceil; + else + $season = ceil(date('n') /3); + $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y'))); + $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y'))); + }else if($time=='y'){ + $firstday=date('Y-01-01'); + $lastday=date('Y-12-31'); + }else if($time=='h'){ + $firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00'; + $lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59'; + } + return array($firstday,$lastday); + } + public static function getcount(){ + return self::count(); + } + /* + *获取用户某个时间段的消费信息 + * + * reutrn Array || number + */ + public static function consume($where,$status='',$keep=''){ + $model = new self; + $user_id=[]; + if(is_array($where)){ + if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']); + if($where['status']!='') $model=$model->where('status',$where['status']); + switch ($where['date']){ + case null:case 'today':case 'week':case 'year': + if($where['date']==null){ + $where['date']='month'; + } + if($keep){ + $model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']); + }else{ + $model=$model->whereTime('add_time',$where['date']); + } + break; + case 'quarter': + $quarter=self::getMonth('n'); + $startTime=strtotime($quarter[0]); + $endTime=strtotime($quarter[1]); + if($keep){ + $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime); + }else{ + $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime); + } + break; + default: + //自定义时间 + if(strstr($where['date'],'-')!==FALSE){ + list($startTime,$endTime)=explode('-',$where['date']); + $model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime)); + }else{ + $model=$model->whereTime('add_time','month'); + } + break; + } + }else{ + if(is_array($status)){ + $model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]); + } + } + if($keep===true){ + return $model->count(); + } + if($status==='default'){ + return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray(); + } + if($status==='grouping'){ + return $model->group('user_type')->field('user_type')->select()->toArray(); + } + $uid=$model->field('uid')->select()->toArray(); + foreach ($uid as $val){ + $user_id[]=$val['uid']; + } + if(empty($user_id)){ + $user_id=[0]; + } + if($status==='xiaofei'){ + $list=UserBill::where('uid','in',$user_id) + ->group('type') + ->field('sum(number) as top_number,title') + ->select() + ->toArray(); + $series=[ + 'name'=>isset($list[0]['title'])?$list[0]['title']:'', + 'type'=>'pie', + 'radius'=> ['40%', '50%'], + 'data'=>[] + ]; + foreach($list as $key=>$val){ + $series['data'][$key]['value']=$val['top_number']; + $series['data'][$key]['name']=$val['title']; + } + return $series; + }else if($status==='form'){ + $list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray(); + $count=self::getcount(); + $option=[ + 'legend_date'=>[], + 'series_date'=>[] + ]; + foreach($list as $key=>$val){ + $num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0; + $t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle']; + $option['legend_date'][$key]=$t; + $option['series_date'][$key]=['value'=>$num,'name'=>$t['name']]; + } + return $option; + }else{ + $number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number'); + return $number; + } + } + /* + * 获取 用户某个时间段的钱数或者TOP20排行 + * + * return Array || number + */ + public static function getUserSpend($date,$status=''){ + $model=new self(); + $model=$model->alias('A'); + switch ($date){ + case null:case 'today':case 'week':case 'year': + if($date==null) $date='month'; + $model=$model->whereTime('A.add_time',$date); + break; + case 'quarter': + list($startTime,$endTime)=User::getMonth('n'); + $model = $model->where('A.add_time','>',strtotime($startTime)); + $model = $model->where('A.add_time','<',strtotime($endTime)); + break; + default: + list($startTime,$endTime)=explode('-',$date); + $model = $model->where('A.add_time','>',strtotime($startTime)); + $model = $model->where('A.add_time','<',strtotime($endTime)); + break; + } + if($status===true){ + return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); + } + $list=$model->join('user_bill B','B.uid=A.uid') + ->where('B.type','pay_product') + ->where('B.pm',0) + ->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time') + ->order('totel_number desc') + ->limit(0,20) + ->select() + ->toArray(); + if(!isset($list[0]['totel_number'])){ + $list=[]; + } + return $list; + } + /* + * 获取 相对于上月或者其他的数据 + * + * return Array + */ + public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){ + $model=new self(); + if(!$status) $model=$model->alias('A'); + switch ($date){ + case null:case 'today':case 'week':case 'year': + if($date==null) { + $date='last month'; + $title='相比上月用户'.$t.'增长'; + } + if($date=='today') { + $date='yesterday'; + $title='相比昨天用户'.$t.'增长'; + } + if($date=='week') { + $date='last week'; + $title='相比上周用户'.$t.'增长'; + } + if($date=='year') { + $date='last year'; + $title='相比去年用户'.$t.'增长'; + } + $model=$model->whereTime($field,$date); + break; + case 'quarter': + $title='相比上季度用户'.$t.'增长'; + list($startTime,$endTime)=User::getMonth('n',1); + $model = $model->where($field,'>',$startTime); + $model = $model->where($field,'<',$endTime); + break; + default: + list($startTime,$endTime)=explode('-',$date); + $title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长'; + $Time=strtotime($endTime)-strtotime($startTime); + $model = $model->where($field,'>',strtotime($startTime)+$Time); + $model = $model->where($field,'<',strtotime($endTime)+$Time); + break; + } + if($status){ + return [$model->count(),$title]; + } + $number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number'); + return [$number,$title]; + } + //获取用户新增,头部信息 + public static function getBadgeList($where){ + $user_count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count(); + $user_count_old=self::getOldDate($where)->count(); + $fenxiao=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count(); + $fenxiao_count=self::getOldDate($where)->where('spread_uid','neq',0)->count(); + $newFemxiao_count=bcsub($fenxiao,$fenxiao_count,0); + $order_count=bcsub($user_count,$user_count_old,0); + return [ + [ + 'name'=>'会员人数', + 'field'=>'个', + 'count'=>$user_count, + 'content'=>'会员总人数', + 'background_color'=>'layui-bg-blue', + 'sum'=>self::count(), + 'class'=>'fa fa-bar-chart', + ], + [ + 'name'=>'会员增长', + 'field'=>'个', + 'count'=>$order_count, + 'content'=>'会员增长率', + 'background_color'=>'layui-bg-cyan', + 'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0, + 'class'=>'fa fa-line-chart', + ], + [ + 'name'=>'分销人数', + 'field'=>'个', + 'count'=>$fenxiao, + 'content'=>'分销总人数', + 'background_color'=>'layui-bg-green', + 'sum'=>self::where('spread_uid','neq',0)->count(), + 'class'=>'fa fa-bar-chart', + ], + [ + 'name'=>'分销增长', + 'field'=>'个', + 'count'=>$newFemxiao_count, + 'content'=>'分销总人数', + 'background_color'=>'layui-bg-orange', + 'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0, + 'class'=>'fa fa-cube', + ], + ]; + } + /* + * 获取会员增长曲线图和分布图 + * $where 查询条件 + * $limit 显示条数,是否有滚动条 + */ + public static function getUserChartList($where,$limit=20){ + $list=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status']) + ->where('add_time','neq',0) + ->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','count(uid) as num']) + ->order('_add_time asc') + ->group('_add_time') + ->select(); + count($list) && $list=$list->toArray(); + $seriesdata=[]; + $xdata=[]; + $Zoom=''; + foreach ($list as $item){ + $seriesdata[]=$item['num']; + $xdata[]=$item['_add_time']; + } + (count($xdata) > $limit) && $Zoom=$xdata[$limit-5]; + //多次购物会员数量饼状图 + $count=self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count(); + $user_count=self::setWherePage(self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter']) + ->where('r.paid',1)->count('a.uid'); + $shop_xdata=['多次购买数量占比','无购买数量占比']; + $shop_data=[]; + $count >0 && $shop_data=[ + [ + 'value'=>bcdiv($user_count,$count,2)*100, + 'name'=>$shop_xdata[0], + 'itemStyle'=>[ + 'color'=>'#D789FF', + ] + ], + [ + 'value'=>bcdiv($count-$user_count,$count,2)*100, + 'name'=>$shop_xdata[1], + 'itemStyle'=>[ + 'color'=>'#7EF0FB', + ] + ] + ]; + return compact('shop_data','shop_xdata','fenbu_data','fenbu_xdata','seriesdata','xdata','Zoom'); + } + //获取$date的前一天或者其他的时间段 + public static function getOldDate($where,$moedls=null){ + $model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls; + switch ($where['data']){ + case 'today': + $model=$model->whereTime('add_time','yesterday'); + break; + case 'week': + $model=$model->whereTime('add_time','last week'); + break; + case 'month': + $model=$model->whereTime('add_time','last month'); + break; + case 'year': + $model=$model->whereTime('add_time','last year'); + break; + case 'quarter': + $time=self::getMonth('n',1); + $model=$model->where('add_time','between',$time); + break; + } + return $model; + } + //获取用户属性和性别分布图 + public static function getEchartsData($where){ + $model=self::alias('a'); + $data=self::getModelTime($where,$model,'a.add_time') + ->join('wechat_user r','r.uid=a.uid') + ->group('r.province') + ->field('count(r.province) as count,province') + ->order('count desc') + ->limit(15) + ->select(); + if(count($data)) $data=$data->toArray(); + $legdata=[]; + $dataList=[]; + foreach ($data as $value){ + $value['province']=='' && $value['province']='未知省份'; + $legdata[]=$value['province']; + $dataList[]=$value['count']; + } + $model=self::alias('a'); + $sex=self::getModelTime($where,$model,'a.add_time') + ->join('wechat_user r','r.uid=a.uid') + ->group('r.sex') + ->field('count(r.uid) as count,sex') + ->order('count desc') + ->select(); + if(count($sex)) $sex=$sex->toArray(); + $sexlegdata=['男','女','未知']; + $sexcount=self::getModelTime($where,new self())->count(); + $sexList=[]; + $color=['#FB7773','#81BCFE','#91F3FE']; + foreach ($sex as $key=>$item){ + if($item['sex']==1){ + $item_date['name']='男'; + }else if($item['sex']==2){ + $item_date['name']='女'; + }else{ + $item_date['name']='未知性别'; + } + $item_date['value']=bcdiv($item['count'],$sexcount,2)*100; + $item_date['itemStyle']['color']=$color[$key]; + $sexList[]=$item_date; + } + return compact('sexList','sexlegdata','legdata','dataList'); + } + //获取佣金记录列表 + public static function getCommissionList($where){ + $list=self::setCommissionWhere($where) + ->page((int)$where['page'],(int)$where['limit']) + ->select(); + count($list) && $list=$list->toArray(); + foreach ($list as &$value){ + $value['ex_price']= Db::name('user_extract')->where(['uid'=>$value['uid']])->sum('extract_price'); + $value['extract_price']= Db::name('user_extract')->where(['uid'=>$value['uid'],'status'=>1])->sum('extract_price'); + } + $count=self::setCommissionWhere($where)->count(); + return ['data'=>$list,'count'=>$count]; + } + //获取佣金记录列表的查询条件 + public static function setCommissionWhere($where){ + $models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid']) + ->join('user_bill B','B.uid=A.uid') + ->group('A.uid') + ->where(['B.category'=>'now_money','B.type'=>'brokerage']) + ->field(['sum(B.number) as sum_number','A.nickname','A.uid','A.now_money']); + if($where['order']==''){ + $models=$models->order('sum_number desc'); + }else{ + $models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc'); + } + if($where['price_max']!='' && $where['price_min']!=''){ + $models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]); + } + return $models; + } + + /**获取用户详细信息 + * @param $uid + * @return array + */ + public static function getUserInfos($uid) + { + $userInfo = self::where('uid',$uid)->find(); + if(!$userInfo) exception('读取用户信息失败!'); + return $userInfo->toArray(); + } + + //获取某人用户推广信息 + public static function getUserinfo($uid){ + $userinfo=self::where(['uid'=>$uid])->field(['nickname','spread_uid','now_money','add_time'])->find()->toArray(); + $userinfo['number']=UserBill::where(['category'=>'now_money','type'=>'brokerage'])->sum('number'); + $userinfo['spread_name']=$userinfo['spread_uid'] ? self::where(['uid'=>$userinfo['spread_uid']])->value('nickname') :''; + return $userinfo; + } + //获取某用户的详细信息 + public static function getUserDetailed($uid){ + $key_field=['real_name','phone','province','city','district','detail','post_code']; + $Address=($thisAddress= Db::name('user_address')->where(['uid'=>$uid,'is_default'=>1])->field($key_field)->find()) ? + $thisAddress : + Db::name('user_address')->where(['uid'=>$uid])->field($key_field)->find(); + $UserInfo=self::get($uid); + return [ + ['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''], +// ['name'=>'微信OpenID','value'=>WechatUser::where(['uid'=>$uid])->value('openid'),'col'=>8], + ['name'=>'手机号码','value'=>$UserInfo['phone']], +// ['name'=>'ID','value'=>$uid], + ['name'=>'姓名','value'=>''], + ['name'=>'微信昵称','value'=>$UserInfo['nickname']], + ['name'=>'邮箱','value'=>''], + ['name'=>'生日','value'=>''], + ['name'=>'积分','value'=>$UserInfo['integral']], + ['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where(['uid'=>$UserInfo['spread_uid']])->value('nickname'):''], + ['name'=>'账户余额','value'=>$UserInfo['now_money']], + ['name'=>'佣金总收入','value'=>UserBill::where(['category'=>'now_money','type'=>'brokerage','uid'=>$uid])->sum('number')], + ['name'=>'提现总金额','value'=> Db::name('user_extract')->where(['uid'=>$uid,'status'=>1])->sum('extract_price')], + ]; + } + //获取某用户的订单个数,消费明细 + public static function getHeaderList($uid){ + return [ + [ + 'title'=>'总计订单', + 'value'=>StoreOrder::where(['uid'=>$uid])->count(), + 'key'=>'笔', + 'class'=>'', + ], + [ + 'title'=>'总消费金额', + 'value'=>StoreOrder::where(['uid'=>$uid,'paid'=>1])->sum('total_price'), + 'key'=>'元', + 'class'=>'', + ], + [ + 'title'=>'本月订单', + 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->count(), + 'key'=>'笔', + 'class'=>'', + ], + [ + 'title'=>'本月消费金额', + 'value'=>StoreOrder::where(['uid'=>$uid])->whereTime('add_time','month')->sum('total_price'), + 'key'=>'元', + 'class'=>'', + ] + ]; + } + /* + * 获取 会员 订单个数,积分明细,优惠劵明细 + * + * $uid 用户id; + * + * return array + */ + public static function getCountInfo($uid){ + $order_count=StoreOrder::where(['uid'=>$uid])->count(); + $integral_count=UserBill::where(['uid'=>$uid,'category'=>'integral'])->where('type','in',['deduction','system_add'])->count(); + $sign_count=UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign'])->count(); + $balanceChang_count=UserBill::where(['uid'=>$uid,'category'=>'now_money']) + ->where('type','in',['system_add','pay_product','extract','pay_product_refund','system_sub']) + ->count(); + $coupon_count=StoreCouponUser::where(['uid'=>$uid])->count(); + $spread_count=self::where(['spread_uid'=>$uid])->count(); + return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count'); + } + /* + * 获取 会员业务的 + * 购物会员统计 + * 会员访问量 + * + * 曲线图 + * + * $where 查询条件 + * + * return array + */ + public static function getUserBusinessChart($where,$limit=20){ + //获取购物会员人数趋势图 + $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where(['r.paid'=>1,'a.is_promoter'=>0]) + ->where('a.add_time','neq',0) + ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); + count($list) && $list=$list->toArray(); + $seriesdata=[]; + $xdata=[]; + $zoom=''; + foreach ($list as $item){ + $seriesdata[]=$item['count_user']; + $xdata[]=$item['_add_time']; + } + count($xdata) > $limit && $zoom=$xdata[$limit-5]; + //会员访问量 + $visit=self::getModelTime($where,self::alias('a')->join('__STORE_VISIT__ t','t.uid=a.uid'),'t.add_time') + ->where('a.is_promoter',0) + ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); + count($visit) && $visit=$visit->toArray(); + $visit_data=[]; + $visit_xdata=[]; + $visit_zoom=''; + foreach ($visit as $item){ + $visit_data[]=$item['count_user']; + $visit_xdata[]=$item['_add_time']; + } + count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; + //多次购物会员数量饼状图 + $count=self::getModelTime($where,self::where('is_promoter',0))->count(); + $user_count=self::getModelTime($where,self::alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where('a.is_promoter',0) + ->where('r.paid',1) + ->group('a.uid') + ->count(); + $shop_xdata=['多次购买数量占比','无购买数量占比']; + $shop_data=[]; + $count >0 && $shop_data=[ + [ + 'value'=>bcdiv($user_count,$count,2)*100, + 'name'=>$shop_xdata[0], + 'itemStyle'=>[ + 'color'=>'#D789FF', + ] + ], + [ + 'value'=>bcdiv($count-$user_count,$count,2)*100, + 'name'=>$shop_xdata[1], + 'itemStyle'=>[ + 'color'=>'#7EF0FB', + ] + ] + ]; + return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata'); + } + /* + * 获取用户 + * 积分排行 + * 会员余额排行榜 + * 分销商佣金总额排行榜 + * 购物笔数排行榜 + * 购物金额排行榜 + * 分销商佣金提现排行榜 + * 上月消费排行榜 + * $limit 查询多少条 + * return array + */ + public static function getUserTop10List($limit=10,$is_promoter=0){ + //积分排行 + $integral=self::where('status',1) + ->where('is_promoter',$is_promoter) + ->order('integral desc') + ->field(['nickname','phone','integral','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) + ->limit($limit) + ->select(); + count($integral) && $integral=$integral->toArray(); + //会员余额排行榜 + $now_money=self::where('status',1) + ->where('is_promoter',$is_promoter) + ->order('now_money desc') + ->field(['nickname','phone','now_money','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']) + ->limit($limit) + ->select(); + count($now_money) && $now_money=$now_money->toArray(); + //购物笔数排行榜 + $orderPayCount = StoreOrder::getOrderPayCount($is_promoter); + if($orderPayCount){ + $shopcount=self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid') + ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) + ->group('r.uid') + ->field(['a.nickname','a.phone','count(r.uid) as sum_count','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) + ->order('sum_count desc') + ->limit($limit) + ->select(); + }else $shopcount = []; + count($shopcount) && $shopcount=$shopcount->toArray(); + //购物金额排行榜 + if($orderPayCount){ + $order=self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid') + ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) + ->group('r.uid') + ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) + ->order('sum_price desc') + ->limit($limit) + ->select(); + }else $order = []; + count($order) && $order=$order->toArray(); + //上月消费排行 + $orderPayCount = StoreOrder::getOrderPayMonthCount($is_promoter); + if($orderPayCount){ + $lastorder=self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid') + ->where(['r.paid'=>1,'a.is_promoter'=>$is_promoter]) +// ->whereTime('r.pay_time','last month') + ->where('r.pay_time','between',[strtotime(date('Y-m',strtotime('-1 month'))),strtotime(date('Y-m'))]) + ->group('r.uid') + ->field(['a.nickname','a.phone','sum(r.pay_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','r.uid']) + ->order('sum_price desc') + ->limit($limit) + ->select(); + }else $lastorder = []; + count($lastorder) && $lastorder=$lastorder->toArray(); + return compact('integral','now_money','shopcount','order','lastorder'); + } + /* + * 获取 会员业务 + * 会员总余额 会员总积分 + * $where 查询条件 + * + * return array + */ + public static function getUserBusinesHeade($where){ + return [ + [ + 'name'=>'会员总余额', + 'field'=>'元', + 'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'), + 'background_color'=>'layui-bg-cyan', + 'col'=>6, + ], + [ + 'name'=>'会员总积分', + 'field'=>'分', + 'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'), + 'background_color'=>'layui-bg-cyan', + 'col'=>6 + ] + ]; + } + /* + * 分销会员头部信息查询获取 + * + * 分销商总佣金余额 + * 分销商总提现佣金 + * 本月分销商业务佣金 + * 本月分销商佣金提现金额 + * 上月分销商业务佣金 + * 上月分销商佣金提现金额 + * $where array 时间条件 + * + * return array + */ + public static function getDistributionBadgeList($where){ + return [ + [ + 'name'=>'分销商总佣金', + 'field'=>'元', + 'count'=>self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',function($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'分销商总佣金余额', + 'field'=>'元', + 'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'分销商总提现佣金', + 'field'=>'元', + 'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'本月分销商业务佣金', + 'field'=>'元', + 'count'=>self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage')) + ->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>3, + ], + [ + 'name'=>'本月分销商佣金提现金额', + 'field'=>'元', + 'count'=>self::getModelTime(['data'=>'month'],UserExtract::where('status',1)) + ->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->field('uid'); + })->sum('extract_price'), + 'background_color'=>'layui-bg-cyan', + 'col'=>4, + ], + [ + 'name'=>'上月分销商业务佣金', + 'field'=>'元', + 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->where('type','brokerage'))->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>4, + ], + [ + 'name'=>'上月分销商佣金提现金额', + 'field'=>'元', + 'count'=>self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',function ($query){ + $query->name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','neq',0)->field('uid'); + })->where('type','brokerage'))->sum('number'), + 'background_color'=>'layui-bg-cyan', + 'col'=>4, + ], + ]; + } + /* + * 分销会员 + * 分销数量 饼状图 + * 分销商会员访问量 曲线 + * 获取购物会员人数趋势图 曲线 + * 多次购物分销会员数量 饼状图 + * $where array 条件 + * $limit int n条数据后出拖动条 + * return array + */ + public static function getUserDistributionChart($where,$limit=20){ + //分销数量 + $fenbu_user=self::getModelTime($where,new self)->field(['count(uid) as num'])->group('is_promoter')->select(); + count($fenbu_user) && $fenbu_user=$fenbu_user->toArray(); + $sum_user=0; + $fenbu_data=[]; + $fenbu_xdata=['分销商','非分销商']; + $color=['#81BCFE','#91F3FE']; + foreach($fenbu_user as $item){ + $sum_user+=$item['num']; + } + foreach ($fenbu_user as $key=>$item){ + $value['value']=bcdiv($item['num'],$sum_user,2)*100; + $value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :''; + $value['itemStyle']['color']=$color[$key]; + $fenbu_data[]=$value; + } + //分销商会员访问量 + $visit=self::getModelTime($where,self::alias('a')->join('store_visit t','t.uid=a.uid'),'t.add_time') + ->where('a.is_promoter',1) + ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); +// echo self::getLastSql();die; + count($visit) && $visit=$visit->toArray(); + $visit_data=[]; + $visit_xdata=[]; + $visit_zoom=''; + foreach ($visit as $item){ + $visit_data[]=$item['count_user']; + $visit_xdata[]=$item['_add_time']; + } + count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5]; + //获取购物会员人数趋势图 + $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where(['r.paid'=>1,'a.is_promoter'=>1]) + ->where('a.add_time','neq',0) + ->field(['FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time','count(r.uid) as count_user']) + ->group('_add_time') + ->order('_add_time asc') + ->select(); + count($list) && $list=$list->toArray(); + $seriesdata=[]; + $xdata=[]; + $zoom=''; + foreach ($list as $item){ + $seriesdata[]=$item['count_user']; + $xdata[]=$item['_add_time']; + } + count($xdata) > $limit && $zoom=$xdata[$limit-5]; + //多次购物分销会员数量饼状图 + $count=self::getModelTime($where,self::where('is_promoter',1))->count(); + $user_count=self::getModelTime($where,self::alias('a') + ->join('__STORE_ORDER__ r','r.uid=a.uid'),'a.add_time') + ->where('a.is_promoter',1) + ->where('r.paid',1) + ->group('a.uid') + ->count(); + $shop_xdata=['多次购买数量占比','无购买数量占比']; + $shop_data=[]; + $count >0 && $shop_data=[ + [ + 'value'=>bcdiv($user_count,$count,2)*100, + 'name'=>$shop_xdata[0].$user_count.'人', + 'itemStyle'=>[ + 'color'=>'#D789FF', + ] + ], + [ + 'value'=>bcdiv($count-$user_count,$count,2)*100, + 'name'=>$shop_xdata[1].($count-$user_count).'人', + 'itemStyle'=>[ + 'color'=>'#7EF0FB', + ] + ] + ]; + return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data'); + } + /* + * 分销商佣金提现排行榜 + * 分销商佣金总额排行榜 + * $limit 截取条数 + * return array + */ + public static function getUserDistributionTop10List($limit){ + //分销商佣金提现排行榜 + $extract=self::alias('a') + ->join('user_extract t','a.uid=t.uid') + ->where(['t.status'=>1,'a.is_promoter'=>1]) + ->group('t.uid') + ->field(['a.nickname','a.phone','sum(t.extract_price) as sum_price','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time','t.uid']) + ->order('sum_price desc') + ->limit($limit) + ->select(); + count($extract) && $extract=$extract->toArray(); + //分销商佣金总额排行榜 + $commission=UserBill::alias('l') + ->join('user a','l.uid=a.uid') + ->where(['l.status'=>'1','l.category'=>'now_money','l.type'=>'brokerage','a.is_promoter'=>1]) + ->group('l.uid') + ->field(['a.nickname','a.phone','sum(number) as sum_number','FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time']) + ->order('sum_number desc') + ->limit($limit) + ->select(); + count($commission) && $commission=$commission->toArray(); + return compact('extract','commission'); + } + public static function getSpreadList($uid,$page,$limit){ + $list=self::where(['spread_uid'=>$uid])->field(['uid','nickname','now_money','integral','add_time']) + ->order('uid desc')->page((int)$page,(int)$limit)->select(); + count($list) && $list=$list->toArray(); + foreach ($list as &$item){ + $item['add_time']=date('Y-m-d H',$item['add_time']); + } + return $list; + } + /** + * 一级分销 + * @param $orderInfo + * @return bool + */ + public static function backOrderBrokerage($orderInfo) + { + $userInfo = User::getUserInfo($orderInfo['uid']); + if(!$userInfo || !$userInfo['spread_uid']) return true; + $storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型 + if($storeBrokerageStatu == 1){ + if(!User::be(['uid'=>$userInfo['spread_uid'],'is_promoter'=>1])) return true; + } + $brokerageRatio = (SystemConfigService::get('store_brokerage_ratio') ?: 0)/100; + if($brokerageRatio <= 0) return true; + $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价 + if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回 + $brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2); + //返佣之后余额 + $spNow_money = User::where(['uid'=>$userInfo['spread_uid']])->value('now_money'); + $balance = bcadd($spNow_money,$brokeragePrice,2); + if($brokeragePrice <= 0) return true; + $mark = $userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice); + self::beginTrans(); + $res1 = UserBill::income('获得推广佣金',$userInfo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark); + $res2 = self::bcInc($userInfo['spread_uid'],'now_money',$brokeragePrice,'uid'); + $res = $res1 && $res2; + self::checkTrans($res); + if($res) self::backOrderBrokerageTwo($orderInfo); + return $res; + } + + /** + * 二级推广 + * @param $orderInfo + * @return bool + */ + public static function backOrderBrokerageTwo($orderInfo){ + $userInfo = User::getUserInfo($orderInfo['uid']); + $userInfoTwo = User::getUserInfo($userInfo['spread_uid']); + if(!$userInfoTwo || !$userInfoTwo['spread_uid']) return true; + $storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型 + if($storeBrokerageStatu == 1){ + if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true; + } + $brokerageRatio = (SystemConfigService::get('store_brokerage_two') ?: 0)/100; + if($brokerageRatio <= 0) return true; + $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价 + if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回 + $brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2); + //返佣之后余额 + $spNow_money = User::where(['uid'=>$userInfo['spread_uid']])->value('now_money'); + $balance = bcadd($spNow_money,$brokeragePrice,2); + if($brokeragePrice <= 0) return true; + $mark = '二级推广人'.$userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice); + self::beginTrans(); + $res1 = UserBill::income('获得推广佣金',$userInfoTwo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark); + $res2 = self::bcInc($userInfoTwo['spread_uid'],'now_money',$brokeragePrice,'uid'); + $res = $res1 && $res2; + self::checkTrans($res); + return $res; + } +} \ No newline at end of file diff --git a/application/admin/model/wechat/WechatNews.php b/application/admin/model/wechat/WechatNews.php index 82f95dcf..ea0e6519 100644 --- a/application/admin/model/wechat/WechatNews.php +++ b/application/admin/model/wechat/WechatNews.php @@ -1 +1,138 @@ - * @day: 2017/11/02 */ namespace app\admin\model\wechat; use app\admin\model\system\Merchant; use app\admin\model\system\SystemAdmin; use app\merchant\model\merchant\MerchantAdmin; use traits\ModelTrait; use basic\ModelBasic; use think\Db; /** * 图文管理 Model * Class WechatNews * @package app\admin\model\wechat */ class WechatNews extends ModelBasic { use ModelTrait; /** * 获取配置分类 * @param array $where * @return array */ public static function getAll($where = array()){ $model = new self; // if($where['status'] !== '') $model = $model->where('status',$where['status']); // if($where['access'] !== '') $model = $model->where('access',$where['access']); if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['cid'] !== '') $model = $model->where("CONCAT(',',cid,',') LIKE '%,$where[cid],%'"); if($where['cid'] == ''){ if(!$where['merchant']) $model = $model->where('mer_id',0); if($where['merchant']) $model = $model->where('mer_id','GT',0); } $model = $model->where('status',1)->where('hide',0); return self::page($model,function($item){ if(!$item['mer_id']) $item['admin_name'] = '总后台管理员---》'.SystemAdmin::where('id',$item['admin_id'])->value('real_name'); else $item['admin_name'] = Merchant::where('id',$item['mer_id'])->value('mer_name').'---》'.MerchantAdmin::where('id',$item['admin_id'])->value('real_name'); $item['content'] = Db::name('wechatNewsContent')->where('nid',$item['id'])->value('content'); },$where); } /** * 删除图文 * @param $id * @return bool */ public static function del($id){ return self::edit(['status'=>0],$id,'id'); } /** * 获取指定字段的值 * @return array */ public static function getNews() { return self::where('status',1)->where('hide',0)->order('id desc')->column('id,title'); } /** * 给表中的字符串类型追加值 * 删除所有有当前分类的id之后重新添加 * @param $cid * @param $id * @return bool */ public static function saveBatchCid($cid,$id){ $res_all = self::where('cid','LIKE',"%$cid%")->select();//获取所有有当前分类的图文 foreach ($res_all as $k=>$v){ $cid_arr = explode(',',$v['cid']); if(in_array($cid,$cid_arr)){ $key = array_search($cid, $cid_arr); array_splice($cid_arr, $key, 1); } if(empty($cid_arr)) { $data['cid'] = 0; self::edit($data,$v['id']); }else{ $data['cid'] = implode(',',$cid_arr); self::edit($data,$v['id']); } } $res = self::where('id','IN',$id)->select(); foreach ($res as $k=>$v){ if(!in_array($cid,explode(',',$v['cid']))){ if(!$v['cid']){ $data['cid'] = $cid; }else{ $data['cid'] = $v['cid'].','.$cid; } self::edit($data,$v['id']); } } return true; } public static function setContent($id,$content){ $count = Db::name('wechatNewsContent')->where('nid',$id)->count(); $data['nid'] = $id; $data['content'] = $content; // dump($data); if($count){ $res = Db::name('wechatNewsContent')->where('nid',$id)->setField('content',$content); if($res !== false) $res = true; } else $res = Db::name('wechatNewsContent')->insert($data); // echo Db::getLastSql(); // exit(); return $res; } public static function merchantPage($where = array()){ $model = new self; if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); if($where['cid'] !== '') $model = $model->where('cid','LIKE',"%$where[cid]%"); $model = $model ->where('status',1) ->where('hide',0) ->where('admin_id',$where['admin_id']) ->where('mer_id',$where['mer_id']); return self::page($model,function($item){ $item['content'] = Db::name('wechatNewsContent')->where('nid',$item['id'])->value('content'); },$where); } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\wechat; + +use app\admin\model\setting\Merchant; +use app\admin\model\setting\SystemAdmin; +use app\merchant\model\merchant\MerchantAdmin; +use traits\ModelTrait; +use basic\ModelBasic; +use think\Db; + +/** + * 图文管理 Model + * Class WechatNews + * @package app\admin\model\wechat + */ +class WechatNews extends ModelBasic { + + use ModelTrait; + + /** + * 获取配置分类 + * @param array $where + * @return array + */ + public static function getAll($where = array()){ + $model = new self; +// if($where['status'] !== '') $model = $model->where('status',$where['status']); +// if($where['access'] !== '') $model = $model->where('access',$where['access']); + if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['cid'] !== '') $model = $model->where("CONCAT(',',cid,',') LIKE '%,$where[cid],%'"); + if($where['cid'] == ''){ + if(!$where['merchant']) $model = $model->where('mer_id',0); + if($where['merchant']) $model = $model->where('mer_id','GT',0); + } + $model = $model->where('status',1)->where('hide',0); + return self::page($model,function($item){ + if(!$item['mer_id']) $item['admin_name'] = '总后台管理员---》'.SystemAdmin::where('id',$item['admin_id'])->value('real_name'); + else $item['admin_name'] = Merchant::where('id',$item['mer_id'])->value('mer_name').'---》'.MerchantAdmin::where('id',$item['admin_id'])->value('real_name'); + $item['content'] = Db::name('wechatNewsContent')->where('nid',$item['id'])->value('content'); + },$where); + } + + /** + * 删除图文 + * @param $id + * @return bool + */ + public static function del($id){ + return self::edit(['status'=>0],$id,'id'); + } + + /** + * 获取指定字段的值 + * @return array + */ + public static function getNews() + { + return self::where('status',1)->where('hide',0)->order('id desc')->column('id,title'); + } + + /** + * 给表中的字符串类型追加值 + * 删除所有有当前分类的id之后重新添加 + * @param $cid + * @param $id + * @return bool + */ + public static function saveBatchCid($cid,$id){ + $res_all = self::where('cid','LIKE',"%$cid%")->select();//获取所有有当前分类的图文 + foreach ($res_all as $k=>$v){ + $cid_arr = explode(',',$v['cid']); + if(in_array($cid,$cid_arr)){ + $key = array_search($cid, $cid_arr); + array_splice($cid_arr, $key, 1); + } + if(empty($cid_arr)) { + $data['cid'] = 0; + self::edit($data,$v['id']); + }else{ + $data['cid'] = implode(',',$cid_arr); + self::edit($data,$v['id']); + } + } + $res = self::where('id','IN',$id)->select(); + foreach ($res as $k=>$v){ + if(!in_array($cid,explode(',',$v['cid']))){ + if(!$v['cid']){ + $data['cid'] = $cid; + }else{ + $data['cid'] = $v['cid'].','.$cid; + } + self::edit($data,$v['id']); + } + } + return true; + } + + public static function setContent($id,$content){ + $count = Db::name('wechatNewsContent')->where('nid',$id)->count(); + $data['nid'] = $id; + $data['content'] = $content; +// dump($data); + if($count){ + $res = Db::name('wechatNewsContent')->where('nid',$id)->setField('content',$content); + if($res !== false) $res = true; + } + else + $res = Db::name('wechatNewsContent')->insert($data); +// echo Db::getLastSql(); +// exit(); + return $res; + } + + public static function merchantPage($where = array()){ + $model = new self; + if($where['title'] !== '') $model = $model->where('title','LIKE',"%$where[title]%"); + if($where['cid'] !== '') $model = $model->where('cid','LIKE',"%$where[cid]%"); + $model = $model + ->where('status',1) + ->where('hide',0) + ->where('admin_id',$where['admin_id']) + ->where('mer_id',$where['mer_id']); + return self::page($model,function($item){ + $item['content'] = Db::name('wechatNewsContent')->where('nid',$item['id'])->value('content'); + },$where); + } +} \ No newline at end of file diff --git a/application/admin/model/wechat/WechatNewsCategory.php b/application/admin/model/wechat/WechatNewsCategory.php index c9d5992c..bcd3f510 100644 --- a/application/admin/model/wechat/WechatNewsCategory.php +++ b/application/admin/model/wechat/WechatNewsCategory.php @@ -1 +1,61 @@ - * @day: 2017/11/02 */ namespace app\admin\model\wechat; use traits\ModelTrait; use basic\ModelBasic; use app\admin\model\article\Article as ArticleModel; /** * 图文消息 model * Class WechatNewsCategory * @package app\admin\model\wechat */ class WechatNewsCategory extends ModelBasic { use ModelTrait; /** * 获取配置分类 * @param array $where * @return array */ public static function getAll($where = array()){ $model = new self; // if($where['status'] !== '') $model = $model->where('status',$where['status']); // if($where['access'] !== '') $model = $model->where('access',$where['access']); if($where['cate_name'] !== '') $model = $model->where('cate_name','LIKE',"%$where[cate_name]%"); $model = $model->where('status',1); return self::page($model,function ($item){ $new = ArticleModel::where('id','in',$item['new_id'])->where('hide',0)->select(); $item['new'] = $new; }); } /** * 获取一条图文 * @param int $id * @return array|false|\PDOStatement|string|\think\Model */ public static function getWechatNewsItem($id = 0){ if(!$id) return []; $list = self::where('id',$id)->where('status',1)->field('cate_name as title,new_id')->find(); if($list){ $list = $list->toArray(); $new = ArticleModel::where('id','in',$list['new_id'])->where('hide',0)->select(); if($new) $new = $new->toArray(); $list['new'] = $new; } return $list; } } \ No newline at end of file + + + * @day: 2017/11/02 + + */ + +namespace app\admin\model\wechat; + +use traits\ModelTrait; +use basic\ModelBasic; +use app\admin\model\article\Article as ArticleModel; +/** + * 图文消息 model + * Class WechatNewsCategory + * @package app\admin\model\wechat + */ +class WechatNewsCategory extends ModelBasic { + + use ModelTrait; + + /** + * 获取配置分类 + * @param array $where + * @return array + */ + public static function getAll($where = array()){ + $model = new self; +// if($where['status'] !== '') $model = $model->where('status',$where['status']); +// if($where['access'] !== '') $model = $model->where('access',$where['access']); + if($where['cate_name'] !== '') $model = $model->where('cate_name','LIKE',"%$where[cate_name]%"); + $model = $model->where('status',1); + return self::page($model,function ($item){ + $new = ArticleModel::where('id','in',$item['new_id'])->where('hide',0)->select(); + $item['new'] = $new; + }); + } + + /** + * 获取一条图文 + * @param int $id + * @return array|false|\PDOStatement|string|\think\Model + */ + public static function getWechatNewsItem($id = 0){ + if(!$id) return []; + $list = self::where('id',$id)->where('status',1)->field('cate_name as title,new_id')->find(); + if($list){ + $list = $list->toArray(); + $new = ArticleModel::where('id','in',$list['new_id'])->where('hide',0)->select(); + if($new) $new = $new->toArray(); + $list['new'] = $new; + } + return $list; + + } +} \ No newline at end of file