Expedite.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. <?php
  2. namespace app\api\controller;
  3. use AlibabaCloud\Client\AlibabaCloud;
  4. use AlibabaCloud\Client\Exception\ClientException;
  5. use AlibabaCloud\Client\Exception\ServerException;
  6. use app\common\model\ArticleComment;
  7. use app\common\model\ArticleIntro;
  8. use app\common\model\ArticleItem;
  9. use app\common\model\DatumUrl;
  10. use app\common\model\DemandComment;
  11. use app\common\model\ForumReply;
  12. use app\common\model\ForumReplyComment;
  13. use app\common\model\PlatformDemand;
  14. use app\common\model\PlatformLike;
  15. use app\common\model\PressComment;
  16. use app\common\model\StoreBanner;
  17. use app\common\model\StoreGoods;
  18. use app\common\model\SupplierGoods;
  19. use app\common\model\TopSearch;
  20. use app\common\model\User;
  21. use app\common\model\UserCollect;
  22. use app\common\model\UserForum;
  23. use app\common\model\UserLevel;
  24. use app\common\model\UserMessage;
  25. use app\common\model\UserSearch;
  26. use app\common\model\VideoUrl;
  27. use Dm\Request\V20151123 as Dm;
  28. use think\cache\driver\Redis;
  29. use think\Db;
  30. use app\common\model\VideoComment;
  31. /**
  32. * @title 不需要验证token接口
  33. * @controller Expedite
  34. * @package app\api\controller
  35. */
  36. class Expedite extends Base
  37. {
  38. public function initialize(){
  39. parent::initialize();
  40. parent::setUid();
  41. }
  42. /**
  43. * @title 获取首页轮播图
  44. * @desc 获取首页轮播图
  45. * @author qc
  46. * @url /api/Expedite/getBanner
  47. * @method GET
  48. * @header name:Authorization require:1 desc:Token
  49. * @param name:place type:int default:1 desc:展示位置1视频首页
  50. * @param name:num type:int default:5 desc:查询数量
  51. * @return name:cover type:srting default:-- desc:图片路径
  52. * @return name:link type:srting default:-- desc:链接
  53. */
  54. public function getBanner()
  55. {
  56. $num = input('get.num',5);
  57. $place = input('get.place',1);
  58. $list = StoreBanner::field('id,cover,link')
  59. ->where(['is_deleted'=>0,'place'=>$place])->limit(0,$num)
  60. ->order('sort desc ,id desc')->select()->toArray();
  61. $this->success('ok',['list'=>$list]);
  62. }
  63. /**
  64. * @title 获取会员等级设置
  65. * @desc 获取会员等级设置
  66. * @author qc
  67. * @url /api/Expedite/getUserLevelSet
  68. * @method GET
  69. * @header name:Authorization require:1 desc:Token
  70. * @return name:id type:int default:-- desc:等级id
  71. * @return name:name type:string default:-- desc:等级名称
  72. * @return name:logo type:string default:-- desc:图片
  73. * @return name:price type:array default:-- desc:价格设置【为空,,不能购买】
  74. * @return name:price.title type:string default:-- desc:标题
  75. * @return name:price.time type:string default:-- desc:时间(单位月)
  76. * @return name:price.price type:float default:-- desc:价格
  77. */
  78. public function getUserLevelSet()
  79. {
  80. $list = UserLevel::field('id,logo,name,price')->where("price is not null and price != ''")->where('id',1)->select()->toArray();
  81. $this->success('ok',['list'=>$list]);
  82. }
  83. /**
  84. * @title 获取热搜设置标题
  85. * @desc 获取热搜设置
  86. * @author qc
  87. * @url /api/Expedite/getTopSearch
  88. * @method GET
  89. * @param name:sort_type type:int default:1 desc:排序规则1默认2搜索量
  90. * @param name:page type:int default:-- desc:页数
  91. * @param name:page_num type:int default:-- desc:每页数量
  92. * @param name:type type:int default:-- desc:类型0=>"全部",1=>'视频',2=>'图文',3=>'资料',4=>'新闻',5=>'需求',6=>'问答',7=>'商品',8=>'招聘',9=>'供应商',10=>'供应商产品',11=>'活动',
  93. * @return name:title type:string default:-- desc:标题
  94. * @return name:num type:int default:-- desc:搜索量
  95. * @return name:type type:int default:-- desc:类型0=>"全部",1=>'视频',2=>'图文',3=>'资料',4=>'新闻',5=>'需求',6=>'问答',7=>'商品',8=>'招聘',9=>'供应商',10=>'供应商产品',11=>'活动',
  96. */
  97. public function getTopSearch()
  98. {
  99. $type = input('type');
  100. $sort_type= input('sort_type',1);
  101. switch ($sort_type) {
  102. case 1:
  103. $order = ['sort'=>'desc','id'=>'asc'];
  104. break;
  105. case 2:
  106. $order = ['num'=>'desc','id'=>'desc'];
  107. break;
  108. default:
  109. $order = ['num'=>'desc','id'=>'desc'];
  110. break;
  111. }
  112. $sel = [];
  113. $sel['is_deleted'] = 0;
  114. $sel['status'] = 1;
  115. if($type) $sel['type'] =$type;
  116. $list = TopSearch::field('id,title,type,num')
  117. ->where($sel)
  118. ->order($order)
  119. ->limit($this->off_set,$this->page_num)
  120. ->select()->toArray();
  121. $this->success('ok',['list'=>$list]);
  122. }
  123. /**
  124. * @title 全局搜索【登录状态需要header需要传Authorization】
  125. * @desc 全局搜索
  126. * @author qc
  127. * @url /api/Expedite/globalSearch
  128. * @method GET
  129. * @param name:page type:int default:-- desc:页数
  130. * @param name:page_num type:int default:-- desc:每页数量
  131. * @param name:type type:string default:-- desc:搜索类型(不传查全部)[video=>视频,article=>图文,datum=>资料,goods=>商城商品,press=>新闻,supplier_goods=>供应商商品,demand=>需求,recruit=>招聘,forum=>问答,activity=>活动]
  132. * @param name:search_name type:string default:-- desc:搜索名称
  133. * @param name:search_time type:int default:-- desc:0不限,182半年,365一年
  134. * @return name:video_list type:array default:-- desc:视频列表【单个】
  135. * @return name:video_list.url_id type:int default:-- desc:url_id
  136. * @return name:video_list.video_id type:int default:-- desc:video_id
  137. * @return name:video_list.cover type:string default:-- desc:封面
  138. * @return name:video_list.title type:string default:-- desc:标题
  139. * @return name:video_list.is_vip type:int default:-- desc:是否是vip【0否1是】
  140. * @return name:video_list.ali_vid type:string default:-- desc:云点播视频id
  141. * @return name:video_list.read_num type:int default:-- desc:播放量
  142. * @return name:video_list.duration type:int default:-- desc:时长(单位:秒)
  143. * @return name:video_list.app_name type:string default:-- desc:平台名称
  144. * @return name:video_list.app_logo type:string default:-- desc:平台头像
  145. * @return name:article_list type:array default:-- desc:图文列表【单个】
  146. * @return name:article_list.title type:string default:-- desc:图文标题
  147. * @return name:article_list.is_vip type:int default:-- desc:是否是vip
  148. * @return name:article_list.cover type:string default:-- desc:封面
  149. * @return name:article_list.images type:int default:-- desc:图片【多张|隔开】
  150. * @return name:article_list.images_arr type:array default:-- desc:图片
  151. * @return name:article_list.read_num type:int default:-- desc:阅读量
  152. * @return name:article_list.app_name type:string default:-- desc:平台名称
  153. * @return name:article_list.app_logo type:string default:-- desc:平台头像
  154. *
  155. * @return name:datum_list type:array default:-- desc:资料列表【单个】
  156. * @return name:datum_list.id type:int default:-- desc:资料的url_id
  157. * @return name:datum_list.title type:string default:-- desc:标题
  158. * @return name:datum_list.is_vip type:int default:-- desc:是否是vip
  159. *
  160. * @return name:press_list type:array default:-- desc:新闻列表
  161. * @return name:press_list.id type:int default:-- desc:新闻id
  162. * @return name:press_list.title type:string default:-- desc:标题
  163. * @return name:press_list.cover type:string default:-- desc:封面
  164. * @return name:press_list.images_arr type:array default:-- desc:图片
  165. * @return name:press_list.read_num type:int default:-- desc:阅读量
  166. * @return name:press_list.is_collect type:int default:-- desc:是否收藏(0否1是)
  167. * @return name:press_list.transmit_num type:int default:-- desc:转发量
  168. * @return name:press_list.collect_num type:int default:-- desc:收藏量
  169. * @return name:press_list.praise_num type:int default:-- desc:点赞量
  170. * @return name:press_list.is_praise type:int default:-- desc:是否点赞(0否1是)
  171. * @return name:press_list.comment_num type:int default:-- desc:评论量
  172. *
  173. *
  174. *
  175. *
  176. * @return name:recruit_list type:array default:-- desc:招聘列表
  177. * @return name:recruit_list.title type:string default:-- desc:标题
  178. * @return name:recruit_list.company type:string default:-- desc:公司名
  179. * @return name:recruit_list.cover type:string default:-- desc:公司logo
  180. * @return name:recruit_list.label_name type:array default:-- desc:标签
  181. * @return name:recruit_list.welfare_arr type:array default:-- desc:岗位福利
  182. * @return name:recruit_list.education type:string default:-- desc:学历
  183. * @return name:recruit_list.experience_min type:int default:0 desc:最低工作年限
  184. * @return name:recruit_list.experience_max type:int default:0 desc:最高工作年限
  185. * @return name:recruit_list.price_min type:int default:-- desc:最低薪资
  186. * @return name:recruit_list.price_max type:int default:-- desc:最高薪资
  187. * @return name:recruit_list.province type:string default:-- desc:省名
  188. * @return name:recruit_list.city type:string default:-- desc:市名
  189. * @return name:recruit_list.address type:string default:-- desc:地址
  190. * @return name:recruit_list.app_name type:string default:-- desc:发布人名称
  191. * @return name:recruit_list.app_logo type:string default:-- desc:发布人头像
  192. *
  193. * @return name:goods_list type:array default:-- desc:商城商品
  194. * @return name:goods_list.id type:int default:-- desc:d
  195. * @return name:goods_list.name type:string default:-- desc:商品名称
  196. * @return name:goods_list.cover type:string default:-- desc:封面
  197. * @return name:goods_list.low_price type:float default:-- desc:价格
  198. *
  199. * @return name:supplier_goods_list type:array default:-- desc:供应商商品
  200. * @return name:supplier_goods_list.id type:int default:-- desc:供应商商品d
  201. * @return name:supplier_goods_list.name type:string default:-- desc:商品名称
  202. * @return name:supplier_goods_list.cover_arr type:array default:-- desc:封面
  203. * @return name:supplier_goods_list.label_name type:array default:-- desc:标签
  204. * @return name:supplier_goods_list.label type:string default:-- desc:标签
  205. * @return name:supplier_goods_list.read_num type:int default:-- desc:浏览量
  206. * @return name:supplier_goods_list.supplier_name type:float default:-- desc:供应商名称
  207. *
  208. * @return name:demand_list type:array default:-- desc:需求
  209. * @return name:demand_list.title type:string default:-- desc:标题
  210. * @return name:demand_list.content type:string default:-- desc:内容
  211. * @return name:demand_list.cover type:array default:-- desc:封面
  212. * @return name:demand_list.money type:float default:-- desc:价格
  213. * @return name:demand_list.app_name type:string default:-- desc:发布方名称
  214. * @return name:demand_list.app_logo type:string default:-- desc:发布方头像
  215. * @return name:demand_list.is_over type:int default:-- desc:是否解决或开源【0否,1是,2开源】
  216. * @return name:demand_list.company type:string default:-- desc:公司名
  217. * @return name:demand_list.company_logo type:string default:-- desc:公司logo
  218. *
  219. *
  220. * @return name:forum_list type:array default:-- desc:问答
  221. * @return name:forum_list.id type:int default:-- desc:id
  222. * @return name:forum_list.title type:string default:-- desc:标题
  223. * @return name:forum_list.content type:string default:0 desc:内容
  224. * @return name:forum_list.level type:int default:-- desc:vip等级id
  225. * @return name:forum_list.label type:string default:-- desc:标签
  226. * @return name:forum_list.name type:string default:-- desc:发布用户
  227. * @return name:forum_list.headimg type:string default:-- desc:发布用户头像
  228. * @return name:forum_list.browse_num type:int default:-- desc:浏览量
  229. * @return name:forum_list.reply_num type:int default:-- desc:回答量
  230. *
  231. * @return name:activity_list type:array default:-- desc:活动
  232. * @return name:activity_list.id type:int default:-- desc:id
  233. * @return name:activity_list.address type:string default:-- desc:地址
  234. * @return name:activity_list.cover type:string default:-- desc:封面
  235. * @return name:activity_list.label_name type:array default:-- desc:标签
  236. * @return name:activity_list.start_time type:string default:-- desc:开始时间
  237. * @return name:activity_list.end_time type:string default:-- desc:结束时候
  238. * @return name:activity_list.end_time type:string default:-- desc:结束时间
  239. * @return name:activity_list.price type:string default:-- desc:价格
  240. */
  241. public function globalSearch()
  242. {
  243. $type = input('get.type');
  244. $search_name = input('get.search_name');
  245. $search_time = input('get.search_time');
  246. $app_name = sysconf('app_name');
  247. $app_logo = sysconf('app_logo');
  248. $user_id = $this->user_id;
  249. if($this->user_id && $search_name) UserSearch::saveSearchTitle($this->user_id,$search_name,0);
  250. // 视频
  251. $video_list = VideoUrl::field('a.id url_id,a.video_id,a.cover,a.title,a.is_vip,a.ali_vid,a.label,a.read_num,a.transmit_num,a.user_id,a.duration')->alias('a')
  252. ->when($search_name,function ($query)use ($search_name,$search_time){
  253. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  254. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  255. })->leftJoin('video_intro b','b.id = a.video_id')
  256. ->where('a.status',1)
  257. ->where('a.is_deleted',0)
  258. ->where('b.status',1)
  259. ->where('b.is_deleted',0)->limit($this->off_set,$this->page_num)->select()->toArray();
  260. array_walk($video_list,function (&$v,$k)use ($app_name,$app_logo){
  261. if(!$v['user_id']){
  262. $v['app_name'] = $app_name;
  263. $v['app_logo'] = $app_logo;
  264. }else{
  265. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  266. $v['app_name'] = $user_info ? $user_info->name : '';
  267. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  268. }
  269. });
  270. // 图文
  271. $article_list = ArticleItem::field('a.id item_id,a.user_id,a.article_id,a.cover,a.title,a.is_vip,a.images,a.read_num')->alias('a')
  272. ->when($search_name,function ($query)use ($search_name,$search_time){
  273. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  274. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  275. })->leftJoin('article_intro b','a.article_id = b.id')
  276. ->where('a.status',1)
  277. ->where('a.is_deleted',0)
  278. ->where('b.status',1)
  279. ->where('b.is_deleted',0)
  280. ->limit($this->off_set,$this->page_num)->select()->toArray();
  281. array_walk($article_list,function (&$v,$k)use ($app_name,$app_logo){
  282. $v['images_arr'] = $v['images'] ? explode('|',$v['images']) : null;
  283. if(!$v['user_id']){
  284. $v['app_name'] = $app_name;
  285. $v['app_logo'] = $app_logo;
  286. }else{
  287. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  288. $v['app_name'] = $user_info ? $user_info->name : '';
  289. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  290. }
  291. });
  292. // 资料
  293. $datum_list = DatumUrl::field('a.id,a.url,a.datum_id,a.title,a.is_vip')->alias('a')
  294. ->when($search_name,function ($query)use ($search_name,$search_time){
  295. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  296. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  297. })->leftJoin('datum_intro b','b.id = a.datum_id')
  298. ->where('a.status',1)
  299. ->where('a.is_deleted',0)
  300. ->where('b.status',1)
  301. ->where('b.is_deleted',0)
  302. ->limit($this->off_set,$this->page_num)->select()->toArray();
  303. //新闻
  304. $press_list = \app\common\model\Press::field('id,title,cover,images,read_num')
  305. ->when($search_name,function ($query)use ($search_name,$search_time){
  306. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  307. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  308. })
  309. ->where('status',1)
  310. ->where('is_deleted',0)
  311. ->limit($this->off_set,$this->page_num)->select()->toArray();
  312. array_walk($press_list,function (&$v,$k){
  313. $v['comment_num'] = PressComment::where(['first_id'=>$v['id'],'type'=>1,'is_deleted'=>0])->count();
  314. $v['is_collect'] = UserCollect::checkCollectByType($this->user_id,4,$v['id']);
  315. $v['collect_num'] = UserCollect::getCollectNum(4,$v['id']);
  316. $v['is_praise'] = PlatformLike::checkTags($this->user_id,$v['id'],1);
  317. $v['praise_num'] = PlatformLike::getPraiseNum($v['id'],1);
  318. $v['images_arr'] = $v['images'] ? explode('|',$v['images']) : null;
  319. });
  320. //招聘
  321. $recruit_list = \app\common\model\Recruit::field('id,title,label,address,price_min,price_max,company,education,experience_min,experience_max,welfare,province,city,salary,user_id')
  322. ->when($search_name,function ($query)use ($search_name,$search_time){
  323. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  324. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  325. })
  326. ->where('status',1)
  327. ->where('is_deleted',0)
  328. ->limit($this->off_set,$this->page_num)->select()->toArray();
  329. array_walk($recruit_list,function (&$v,$k)use ($app_logo,$app_name){
  330. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  331. $v['welfare_arr'] = explode(',',trim($v['welfare'],','));
  332. if(!$v['user_id']){
  333. $v['app_name'] = $app_name;
  334. $v['app_logo'] = $app_logo;
  335. }else{
  336. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  337. $v['app_name'] = $user_info ? $user_info->name : '';
  338. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  339. }
  340. });
  341. // 商品
  342. $goods_list = StoreGoods::field('id,name,cover,low_price')->when($search_name,function ($query)use ($search_name,$search_time){
  343. if($search_name) $query->where('name','like','%'.$search_name.'%');
  344. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  345. })->where('is_deleted',0)->where('status',1)->limit($this->off_set,$this->page_num)->select()->toArray();
  346. // 供应商
  347. $supplier_goods_list =SupplierGoods::field('g.id,g.supplier_id,g.name,g.read_num,g.label,g.cover,s.title supplier_name')
  348. ->alias('g')
  349. ->when($search_name,function ($query)use($search_name,$search_time){
  350. if($search_name) $query->where('g.name','like','%'.$search_name.'%');
  351. if($search_time) $query->where('g.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  352. })->leftJoin('Supplier s','g.supplier_id = s.id')
  353. ->where('g.status','=',1)
  354. ->where('g.is_deleted','=',0)
  355. ->where('s.status','=',1)
  356. ->where('s.is_deleted','=',0)
  357. ->limit($this->off_set,$this->page_num)->select()->toArray();
  358. array_walk($supplier_goods_list,function (&$v,$k){
  359. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  360. $v['cover_arr'] = explode('|',trim($v['cover'],'|'));
  361. });
  362. // 需求
  363. $demand_list = PlatformDemand::field('id,cover,money,user_id,label,title,cover,is_over,content,company,company_logo')
  364. ->when($search_name,function ($query)use ($search_name,$search_time){
  365. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  366. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  367. })
  368. ->where('status',1)
  369. ->where('is_deleted',0)
  370. ->limit($this->off_set,$this->page_num)->select()->toArray();
  371. array_walk($demand_list,function (&$v,$k)use ($app_logo,$app_name){
  372. if(!$v['user_id']){
  373. $v['app_name'] = $app_name;
  374. $v['app_logo'] = $app_logo;
  375. }else{
  376. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  377. $v['app_name'] = $user_info ? $user_info->name : '';
  378. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  379. }
  380. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  381. $v['cover_arr'] = explode('|',trim($v['cover'],'|'));
  382. });
  383. // 问答
  384. $forum_list = UserForum::alias('f')
  385. ->field('f.id,f.title,f.content,f.label,f.level,f.browse_num,f.sort,f.create_at,u.name,u.headimg, IFNULL( (SELECT count(DISTINCT r.user_id) FROM dd_forum_reply as r WHERE f.id=r.forum_id),0 ) as reply_num')
  386. ->when($search_name,function ($query)use ($search_name,$search_time){
  387. if($search_name) $query->where('f.title|f.label','like','%'.$search_name.'%');
  388. if($search_time) $query->where('f.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  389. })->leftJoin('store_member u','u.id = f.user_id')
  390. ->where('f.status',1)
  391. ->where('f.is_deleted',0)
  392. ->limit($this->off_set,$this->page_num)
  393. ->select()->toArray();
  394. // 活动
  395. $activity_list = \app\common\model\Activity::field('id,cover,title,address,label,start_time,end_time,ladder,price')
  396. ->when($search_name,function ($query)use ($search_name,$search_time){
  397. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  398. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  399. })
  400. ->where('status',1)
  401. ->where('is_deleted',0)
  402. ->limit($this->off_set,$this->page_num)
  403. ->select()->toArray();
  404. array_walk($activity_list,function (&$v,$k){
  405. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  406. $v['ladder'] = $v['ladder'] ? json_decode($v['ladder'],true):null;
  407. });
  408. $this->success('ok',$type ? compact($type.'_list'): compact(['video_list','article_list','datum_list','goods_list','press_list','supplier_goods_list','demand_list','recruit_list','forum_list','activity_list']));
  409. }
  410. /**
  411. * @title 发送短信验证码
  412. * @desc 发送短信验证码
  413. * @author qc
  414. * @url /api/Expedite/sendSms
  415. * @method POST
  416. * @tag 短信验证码
  417. * @param name:phone type:int require:1 default:-- desc:要获取验证码的手机号
  418. * @return name:code type:string default:-- desc:验证码
  419. */
  420. public function sendSms(){
  421. $phone = input('post.phone');
  422. $user_info = User::where('phone',$phone)->where('is_deleted',0)->field('id,status')->find();
  423. if($user_info && $user_info['status'] == 0)$this ->error('用户被禁用,请联系官方');
  424. if(empty($phone)) $this ->error('参数错误');
  425. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  426. AlibabaCloud::accessKeyClient('LTAI5tJ5p12drZegeWVG33xZ', '82UWAiY5e5wH8tSkRvMtqVoGO0h8SB')
  427. ->regionId('cn-hangzhou')->asDefaultClient();
  428. try {
  429. $result = AlibabaCloud::rpc()
  430. ->product('Dysmsapi')
  431. ->version('2017-05-25')
  432. ->action('SendSms')
  433. ->method('POST')
  434. ->host('dysmsapi.aliyuncs.com')
  435. ->options([
  436. 'query' => [
  437. 'RegionId' => "cn-hangzhou",
  438. 'PhoneNumbers' => $phone,
  439. 'SignName' => "搞一下汽车电子",
  440. 'TemplateCode' => "SMS_234397351",
  441. 'TemplateParam' => json_encode(array("code"=>$code)),
  442. ],
  443. ])->request();
  444. $result = $result->toArray();
  445. if($result['Code'] == "OK") {
  446. $sms_data = array(
  447. 'phone'=>$phone,
  448. 'code'=>$code,
  449. 'result'=>$result['Message']
  450. );
  451. Db::name('store_member_sms')->insert($sms_data);
  452. $this->success('发送成功',['code'=>$code]);
  453. }else{
  454. $this->error('发送失败');
  455. }
  456. } catch (ClientException $e) {
  457. echo $e->getErrorMessage() . PHP_EOL;
  458. } catch (ServerException $e) {
  459. echo $e->getErrorMessage() . PHP_EOL;
  460. }
  461. }
  462. /**
  463. * @title 发送邮箱验证码
  464. * @desc 发送邮箱验证码
  465. * @author qc
  466. * @url /api/Expedite/emailSms
  467. * @method POST
  468. * @tag 邮箱验证码
  469. * @param name:email type:int require:1 default:-- desc:邮箱
  470. * @return name:code type:string default:-- desc:验证码
  471. */
  472. function emailSms(){
  473. $email = input('post.email');
  474. $user_info = User::where('email',$email)->where('is_deleted',0)->field('id,status')->find();
  475. if($user_info && $user_info['status'] == 0)$this ->error('用户被禁用,请联系官方');
  476. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  477. require_once env('root_path').'/vendor/aliyunmail/aliyun-php-sdk-core/Config.php';
  478. $iClientProfile = \DefaultProfile::getProfile("cn-hangzhou", "LTAI5tJ5p12drZegeWVG33xZ", "82UWAiY5e5wH8tSkRvMtqVoGO0h8SB");
  479. $client = new \DefaultAcsClient($iClientProfile);
  480. $request = new Dm\SingleSendMailRequest();
  481. $request->setAccountName("gyx@yzm.gyxqcdz.com");
  482. $request->setFromAlias("[验证码]");
  483. $request->setAddressType(1);
  484. $request->setTagName("zonghuzhuche");
  485. $request->setReplyToAddress("true");
  486. $request->setToAddress($email);
  487. $request->setSubject("验证码");
  488. $html_body = '验证码:'.$code;
  489. $request->setHtmlBody($html_body);
  490. try {
  491. $send_res = $client->getAcsResponse($request);
  492. $sms_data = array(
  493. 'phone'=>$email,
  494. 'code'=>$code,
  495. 'result'=>'OK'
  496. );
  497. Db::name('store_member_sms')->insert($sms_data);
  498. $this->success('发送成功',['code'=>$code]);
  499. } catch (ClientException $e) {
  500. $this->error($e->getErrorMessage());
  501. // print_r($e->getErrorCode());
  502. // print_r($e->getErrorMessage());
  503. } catch (ServerException $e) {
  504. $this->error($e->getErrorMessage());
  505. // print_r($e->getErrorCode());
  506. // print_r($e->getErrorMessage());
  507. }
  508. }
  509. /**
  510. * @title 获取签名
  511. * @desc 获取签名
  512. * @url /api/Expedite/getWeChatSign
  513. * @method POST
  514. * @param name:url type:string default:-- desc:页面地址
  515. * @return name:appid type:string default:-- desc:appid
  516. * @return name:noncestr type:string default:-- desc:随机字符
  517. * @return name:timestamp type:string default:-- desc:时间戳
  518. * @return name:sign type:string default:-- desc:签名
  519. * @return name:ticket type:string default:-- desc:ticket
  520. **/
  521. public function getWeChatSign(){
  522. $urls = input('post.url');
  523. $appid = config('app.official_account')['appid'];
  524. $secret = config('app.official_account')['secret'];
  525. $redis = new Redis();
  526. $access_token = $redis->get('access_token');
  527. if (!$access_token){
  528. $access_token = '';
  529. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  530. $res= http_curl($url);
  531. if (isset($res['access_token'])){
  532. $redis->set('access_token',$res['access_token'],'7000');
  533. $access_token = $res['access_token'];
  534. }
  535. }
  536. $url2 ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
  537. $res2=http_curl($url2);
  538. if (!isset($res2) || $res2['errcode']!=0) $this->error('获取ticket失败');
  539. $timestamp = time();
  540. $noncestr = get32Str(15);
  541. $string = "jsapi_ticket=".$res2['ticket']."&noncestr=$noncestr&timestamp=$timestamp&url=".$urls;
  542. $sign = sha1($string);
  543. $return = [
  544. 'appid'=>$appid,
  545. 'noncestr'=>$noncestr,
  546. 'timestamp'=>$timestamp,
  547. 'url'=>$urls,
  548. 'sign'=>$sign,
  549. 'ticket'=>$res2['ticket']
  550. ];
  551. $this->success('成功',$return);
  552. }
  553. /**
  554. * @title 获取分享链接
  555. * @desc 获取分享链接
  556. * @url /api/Expedite/getUrlScheme
  557. * @method POST
  558. * @param name:url type:string default:-- desc:页面地址
  559. * @return name:url type:string default:-- desc:url
  560. **/
  561. public function getUrlScheme()
  562. {
  563. $appid = config('app.mini_program')['app_id'];
  564. $secret = config('app.mini_program')['secret'];
  565. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  566. $res= http_curl($url);
  567. $access_token = $res['access_token'];
  568. $api_url = 'https://api.weixin.qq.com/wxa/generatescheme?access_token='.$access_token;
  569. $url_scheme = curl_post($api_url,[]);
  570. $this->success('ok',['url'=>$url_scheme['openlink']]);
  571. }
  572. /**
  573. * @title getUrlLink
  574. * @desc getUrlLink
  575. * @url /api/Expedite/getUrlLink
  576. * @method POST
  577. * @param name:url type:string default:-- desc:页面地址
  578. * @return name:url type:string default:-- desc:url
  579. **/
  580. public function getUrlLink()
  581. {
  582. $appid = config('app.mini_program')['app_id'];
  583. $secret = config('app.mini_program')['secret'];
  584. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  585. $res= http_curl($url);
  586. $access_token = $res['access_token'];
  587. $api_url = 'https://api.weixin.qq.com/wxa/generate_urllink?access_token='.$access_token;
  588. $url_link = curl_post($api_url,[]);
  589. $this->success('ok',['url'=>$url_link['url_link']]);
  590. }
  591. /**
  592. * @title 获取平台文案设置
  593. * @desc 获取平台文案设置
  594. * @author qc
  595. * @url /api/Expedite/getSysConfig
  596. * @method GET
  597. * @param name:search_name type:string default:-- desc:根据下面名称查(不传查全部的)
  598. * @return name:agreement type:string default:-- desc:用户协议
  599. * @return name:about_us type:string default:-- desc:关于我们
  600. * @return name:privacy type:string default:-- desc:隐私政策
  601. * @return name:user_equity type:string default:-- desc:会员权益
  602. * @return name:customer_service type:string default:-- desc:客服设置
  603. * @return name:original_pact type:string default:-- desc:原创公约
  604. * @return name:app_name type:string default:-- desc:平台名称
  605. * @return name:app_logo type:string default:-- desc:平台logo
  606. * @return name:app_version type:string default:-- desc:版本号
  607. */
  608. public function getSysConfig(){
  609. $search_name = input('get.search_name');
  610. $con_name = $search_name? [$search_name] : ['agreement','about_us','privacy','user_equity','customer_service','original_pact','app_version'];
  611. $set = Db::name('system_config')->where('name','in',$con_name)->select();
  612. $ret = [];
  613. foreach ($set as $value) {
  614. $ret[$value['name']]=$value['value'];
  615. }
  616. $this->success('获取成功',$ret);
  617. }
  618. /**
  619. * @title 修改版本号
  620. * @desc 修改版本号
  621. * @author qc
  622. * @method POST
  623. * @url /api/Expedite/changeVersion
  624. * @header name:Authorization require:1 desc:Token
  625. * @param name:app_version type:string default:1 desc:版本号
  626. */
  627. public function changeVersion()
  628. {
  629. Db::name('system_config')->where('name','app_version')->update(['value'=>input('app_version')]);
  630. $this->success('修改成功');
  631. }
  632. /**
  633. * @title 获取客服设置【平台的】
  634. * @desc 获取客服设置【平台的】
  635. * @author qc
  636. * @url /api/Expedite/getServiceSet
  637. * @method GET
  638. * @return name:service_qr_code type:string default:-- desc:客服二维码
  639. * @return name:service_phone type:string default:-- desc:客服电话
  640. * @return name:service_email type:string default:-- desc:客服邮箱
  641. */
  642. public function getServiceSet(){
  643. $con_name = ['service_qr_code','service_phone','service_email'];
  644. $set = Db::name('system_config')->where('name','in',$con_name)->select();
  645. $ret = [];
  646. foreach ($set as $value) {
  647. $ret[$value['name']]=$value['value'];
  648. }
  649. $this->success('获取成功',$ret);
  650. }
  651. /**
  652. * @title 获取联系客服设置【模块的】[所有模块的联系我们都用这个接口]
  653. * @desc 获取联系客服设置
  654. * @author qc
  655. * @url /api/Expedite/getContact
  656. * @method GET
  657. * @param name:tag type:string default:-- desc:标识【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商,recruit=>招聘,mall=>商城】
  658. * @return name:qrcode type:string default:-- desc:客服二维码
  659. * @return name:phone type:string default:-- desc:客服电话
  660. * @return name:email type:string default:-- desc:客服邮箱
  661. * @return name:place type:string default:-- desc:归属模块
  662. * @return name:tag type:string default:-- desc:归属标识【可以按照这个值查询或是区分所属模块】
  663. */
  664. public function getContact()
  665. {
  666. $tag = input('get.tag');
  667. $sel_tag = $tag ? [$tag] : ['video','article','datum','activity','demand','forum','press','supplier','recruit','mall'];
  668. $list = Db::name('contact')->where('tag','in',$sel_tag)->column('tag,qrcode,phone,email,tag,place','tag');
  669. $this->success('ok',$list);
  670. }
  671. /**
  672. * @title 获取模块封面
  673. * @desc 获取模块封面
  674. * @author qc
  675. * @url /api/Expedite/getModulesCover
  676. * @method GET
  677. * @param name:tag type:string default:-- desc:标识【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商,recruit=>招聘,mall=>商城】
  678. * @return name:cover type:string default:-- desc:封面
  679. * @return name:place type:string default:-- desc:归属模块
  680. * @return name:tag type:string default:-- desc:归属标识【可以按照这个值查询或是区分所属模块】
  681. */
  682. public function getModulesCover()
  683. {
  684. $tag = input('get.tag');
  685. $sel_tag = $tag ? [$tag] : ['video','article','datum','activity','demand','forum','press','supplier','recruit','mall'];
  686. $list = Db::name('cover')->where('tag','in',$sel_tag)->column('tag,cover,tag,place','tag');
  687. $this->success('ok',$list);
  688. }
  689. /**
  690. * @title 推送测试
  691. * @desc 推送测试
  692. * @author qc
  693. * @url /api/Expedite/messagePush
  694. * @method GET
  695. * @param name:user_id type:int default:-- desc:会员id
  696. * @param name:content type:string default:-- desc:推送内容
  697. * @param name:module type:string default:-- desc:模块
  698. * @param name:type type:类型 default:-- desc:推送类型
  699. * @param name:rel_id type:类型 default:-- desc:关联id
  700. */
  701. public function messagePush()
  702. {
  703. $user_id= input('user_id');
  704. $content= input('content');
  705. $module= input('module');
  706. $type= input('type');
  707. $rel_id= input('rel_id');
  708. $res = Jpush($user_id,$content,$module,$type,$rel_id);
  709. $this->success('',['result'=>$res]);
  710. }
  711. /**
  712. * @title 获取分享地址
  713. * @desc 获取分享地址
  714. * @author qc
  715. * @url /api/Expedite/getShareUrl
  716. * @method GET
  717. * @param name:tag type:string default:-- desc:标识【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商商品,recruit=>招聘,mall=>商城商品】
  718. * @param name:first_id type:int default:-- desc:【视频系列id,图文系列id,资料系列id,活动id,需求id,问答id,新闻id,供应商商品id,招聘记录id,商城商品id】
  719. * @param name:second_id type:string default:-- desc:【视频url_id,图文item_id,资料item_id,其他类型的不传】
  720. * @return name:url type:string default:-- desc:跳转地址
  721. */
  722. public function getShareUrl()
  723. {
  724. $tag = input('get.tag');
  725. if(!in_array($tag, ['video','article','datum','activity','demand','forum','press','supplier','recruit','mall'])) $this->error('类型标识错误');
  726. $first_id = input('get.first_id');
  727. $second_id = input('get.second_id');
  728. $url_arr= [
  729. 'video' =>$this->request->root(true) ."/dist/#/video-details?id=$first_id&videoArrId=$second_id",
  730. 'article' =>$this->request->root(true) ."/dist/#/image-text-details?id=$first_id&item_id=$second_id",
  731. 'datum' =>$this->request->root(true) ."/dist/#/information-details?id=$first_id&url_id=$second_id",
  732. 'activity' =>$this->request->root(true) ."/dist/#/activity-sign-up?activity_id=$first_id",
  733. 'demand' =>$this->request->root(true) ."/dist/#/demand-details?demand_id=$first_id",
  734. 'forum' =>$this->request->root(true) ."/dist/#/forum-question-details?forum_id=$first_id",
  735. 'press' =>$this->request->root(true) ."/dist/#/news-details?press_id=$first_id",
  736. 'supplier' =>$this->request->root(true) ."/dist/#/supplier-details?goods_id=$first_id",
  737. 'recruit' =>$this->request->root(true) ."/dist/#/recruit-details?recruit_id=$first_id",
  738. 'mall' =>$this->request->root(true) ."/dist/#/product-details?product_id=$first_id",
  739. ];
  740. $this->success('ok',['url'=>$url_arr[$tag]]);
  741. }
  742. /**
  743. * @title 获取极光推送类型
  744. * @desc module'=>[type=>['title'=>'视频投稿','is_push'=>0,'msg'=>['视频投稿成功请等待审核']]]
  745. * @author qc
  746. * @url /api/Expedite/getJiGuangPushType
  747. * @method GET
  748. * @return name:is_push type:string default:-- desc:模块类型下的消息是否有极光推送(1推送0不推送)
  749. * @return name:exp type:string default:-- desc:module'=>[type=>['title'=>'视频投稿','is_push'=>0,'msg'=>['视频投稿成功请等待审核']]]
  750. *
  751. */
  752. public function getJiGuangPushType()
  753. {
  754. $type_desc = [
  755. 'video'=>[
  756. 3=>['title'=>'视频评论回复【回复我的】','is_push'=>1,'msg'=>['有会员评论了您的回复']],
  757. 4=>['title'=>'视频评论【评论我的】','is_push'=>1,'msg'=>['有会员评论了您的视频']],
  758. ],// 视频
  759. 'article'=>[
  760. 3=>['title'=>'图文评论回复【回复我的】','is_push'=>1,'msg'=>['有会员评论了您的回复']],
  761. 4=>['title'=>'图文评论【评论我的】','is_push'=>1,'msg'=>['有会员评论了您的图文']],
  762. ],//图文
  763. 'forum'=>[
  764. 3=>['title'=>'回复的评论【评论我的】','is_push'=>1,'msg'=>['有会员评论了您的回复']],
  765. 4=>['title'=>'评论的回复【回复我的】','is_push'=>1,'msg'=>['有会员回复了您的评论']],
  766. 5=>['title'=>'问答回复【回答我的】','is_push'=>1,'msg'=>['有会员回复了您的问题']],
  767. ],// 问答
  768. 'press'=>[
  769. 1=>['title'=>'评论回复【回复我的】','is_push'=>1,'msg'=>['有会员回复了您的评论']],
  770. ],// 新闻
  771. 'feedback'=>[
  772. 1=>['title'=>'反馈内容回复','is_push'=>1,'msg'=>['平台回复了您的反馈']],
  773. ],// 反馈
  774. ];
  775. $this->success('ok',$type_desc);
  776. }
  777. /**
  778. * @title 获取模块总角标数量
  779. * @desc 获取模块总角标数量
  780. * @author qc
  781. * @method GET
  782. * @url /api/Expedite/getTotalMarkNum
  783. * @header name:Authorization require:1 desc:Token
  784. * @return name:video_num type:int default:-- desc:视频
  785. * @return name:article_num type:int default:-- desc:图文
  786. * @return name:press_num type:int default:-- desc:新闻
  787. * @return name:demand_num type:int default:-- desc:需求
  788. * @return name:forum_num type:int default:-- desc:问答
  789. * @return name:sys_num type:int default:-- desc:系统消息
  790. * @return name:total_num type:int default:-- desc:总计
  791. */
  792. public function getTotalMarkNum()
  793. {
  794. $video_all_comment = VideoComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  795. $video_reply_num = VideoComment::where([['t.is_deleted','=',0],['t.lev','>=',2],['is_read','=',0],['t.pid','in',implode(',',$video_all_comment)]])->alias('t')->count();
  796. // 评论我的
  797. $video_comment_num = VideoComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['is_read','=',0]])
  798. ->leftJoin('VideoUrl i','t.url_id = i.id')
  799. ->alias('t')->count();
  800. $video_num = $video_reply_num + $video_comment_num;
  801. // 回复我的
  802. $article_all_comment = ArticleComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  803. $article_reply_num = ArticleComment::where([['t.is_deleted','=',0],['t.lev','>=',2],['is_read','=',0],['t.pid','in',implode(',',$article_all_comment)]])->alias('t')->count();
  804. // 评论我的
  805. $article_comment_num = ArticleComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['is_read','=',0]])
  806. ->leftJoin('ArticleItem i','t.item_id = i.id')
  807. ->alias('t')->count();
  808. $article_num = $article_reply_num + $article_comment_num;
  809. // 回复我的
  810. $press_all_comment = PressComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  811. $press_reply_num = PressComment::where([['t.is_deleted','=',0],['t.lev','>=',2],['is_read','=',0],['t.pid','in',implode(',',$press_all_comment)]])->alias('t')->count();
  812. // 评论我的
  813. $press_comment_num = PressComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['is_read','=',0]])
  814. ->leftJoin('Press i','t.first_id = i.id')
  815. ->alias('t')->count();
  816. $press_num = $press_reply_num + $press_comment_num;
  817. $demand_num = DemandComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['is_read','=',0]])
  818. ->leftJoin('PlatformDemand i','t.first_id = i.id')
  819. ->alias('t')->count();
  820. //回答我的
  821. $answer_num = ForumReply::where([['r.issue_user','=',$this->user_id],['r.is_deleted','=',0],['r.is_read','=',0]])
  822. ->alias('r')->leftJoin('user_forum f','r.forum_id = f.id')->count();
  823. // 回复我的
  824. $forum_all_comment = ForumReplyComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  825. $forum_reply_num = ForumReplyComment::where([['t.is_deleted','=',0],['t.lev','>=',2],['t.is_read','=',0],['t.pid','in',implode(',',$forum_all_comment)]])->alias('t')->count();
  826. // 评论我的
  827. $forum_comment_num = ForumReplyComment::alias('c')
  828. ->where(['r.user_id'=>$this->user_id,'r.is_deleted'=>0,'c.is_read'=>0])
  829. ->leftJoin('forum_reply r','c.reply_id = r.id')
  830. ->count();
  831. $forum_num = $answer_num+$forum_reply_num+$forum_comment_num;
  832. $sys_num = UserMessage::where(['user_id'=>$this->user_id])->where('is_read',0)->count();
  833. $total_num = $video_num + $article_num + $press_num + $demand_num + $forum_num + $sys_num;
  834. $this->success('ok',compact(['video_num','article_num','press_num','demand_num','forum_num','sys_num','total_num']));
  835. }
  836. }