Expedite.php 85 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571
  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\ArticleCommentLike;
  8. use app\common\model\ArticleIntro;
  9. use app\common\model\ArticleItem;
  10. use app\common\model\ArticleLike;
  11. use app\common\model\DatumComment;
  12. use app\common\model\DatumCommentLike;
  13. use app\common\model\DatumLike;
  14. use app\common\model\DatumUrl;
  15. use app\common\model\DemandComment;
  16. use app\common\model\ForumReply;
  17. use app\common\model\ForumReplyComment;
  18. use app\common\model\PlatformDemand;
  19. use app\common\model\PlatformLike;
  20. use app\common\model\PressComment;
  21. use app\common\model\StoreBanner;
  22. use app\common\model\StoreGoods;
  23. use app\common\model\SupplierComment;
  24. use app\common\model\SupplierGoods;
  25. use app\common\model\TopSearch;
  26. use app\common\model\User;
  27. use app\common\model\UserCollect;
  28. use app\common\model\UserForum;
  29. use app\common\model\UserLevel;
  30. use app\common\model\UserLevelRank;
  31. use app\common\model\UserMessage;
  32. use app\common\model\UserSearch;
  33. use app\common\model\VideoCommentLike;
  34. use app\common\model\VideoUrl;
  35. use app\common\service\CheckPower;
  36. use app\common\service\Elastic;
  37. use app\common\service\UserSynth;
  38. use Dm\Request\V20151123 as Dm;
  39. use library\tools\Data;
  40. use think\cache\driver\Redis;
  41. use think\Db;
  42. use app\common\model\VideoComment;
  43. /**
  44. * @title 其他接口(不需要登录状态)【多模块共用】
  45. * @controller Expedite
  46. * @package app\api\controller
  47. */
  48. class Expedite extends Base
  49. {
  50. public function initialize(){
  51. parent::initialize();
  52. parent::setUid();
  53. }
  54. /**
  55. * @title 获取首页轮播图
  56. * @desc 获取首页轮播图
  57. * @author qc
  58. * @url /api/Expedite/getBanner
  59. * @method GET
  60. * @header name:Authorization require:1 desc:Token
  61. * @param name:num type:int default:5 desc:查询数量
  62. * @return name:cover type:string default:-- desc:图片路径
  63. * @return name:place type:string default:-- desc:跳转模块【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商商品,recruit=>招聘,mall=>商城,service=>客服】
  64. * @return name:first_id type:int default:-- desc:详情id(视频、图文、资料为系列id)
  65. * @return name:second_id type:second_id default:-- desc:系列某详情id(视频、图文、资料)
  66. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  67. */
  68. public function getBanner()
  69. {
  70. $num = input('get.num',100);
  71. $list = StoreBanner::field('id,cover,place,first_id,second_id')
  72. ->where(['is_deleted'=>0])->limit(0,$num)
  73. ->order('sort desc ,id desc')->select()->toArray();
  74. foreach ($list as &$v){
  75. $v['is_normal'] = CheckPower::checkModulesPower($v['first_id'],$v['second_id'],$v['place']);
  76. }
  77. $this->success('ok',['list'=>$list]);
  78. }
  79. /**
  80. * @title 获取会员等级设置
  81. * @desc 获取会员等级设置
  82. * @author qc
  83. * @url /api/Expedite/getUserLevelSet
  84. * @method GET
  85. * @header name:Authorization require:1 desc:Token
  86. * @return name:id type:int default:-- desc:等级id
  87. * @return name:name type:string default:-- desc:等级名称
  88. * @return name:logo type:string default:-- desc:图片
  89. * @return name:price type:array default:-- desc:价格设置【为空,,不能购买】
  90. * @return name:price.title type:string default:-- desc:标题
  91. * @return name:price.time type:string default:-- desc:时间(单位月)
  92. * @return name:price.price type:float default:-- desc:价格
  93. * @return name:price.renew type:int default:-- desc:续费价格
  94. * @return name:is_renew type:int default:-- desc:是否是续费会员【1是0否】
  95. */
  96. public function getUserLevelSet()
  97. {
  98. $list = UserLevel::field('id,logo,name,price')->where("price is not null and price != ''")->where('id',1)->select()->toArray();
  99. foreach ($list as &$v) {
  100. $v['price_arr'] = json_decode($v['price'],true);
  101. }
  102. $is_renew = \app\common\model\LevelOrder::where('user_id',$this->user_id)->where('status',1)->where('pay_state',1)->count();
  103. $this->success('ok',['list'=>$list,'is_renew'=>$is_renew ? 1:0]);
  104. }
  105. /**
  106. * @title 会员等级开关【IOS用】
  107. * @desc 会员等级开关
  108. * @author qc
  109. * @url /api/Expedite/levelSwitch
  110. * @method GET
  111. * @header name:Authorization require:1 desc:Token
  112. * @return name:value type:int default:-- desc:0关闭1开启
  113. */
  114. public function levelSwitch(){
  115. $this->success('ok',['value'=>sysconf('level_switch')]);
  116. }
  117. /**
  118. * @title 注销开关
  119. * @desc 注销开关
  120. * @author qc
  121. * @url /api/Expedite/logoutSwitch
  122. * @method GET
  123. * @header name:Authorization require:1 desc:Token
  124. * @return name:value type:int default:-- desc:0关闭1开启
  125. */
  126. public function logoutSwitch(){
  127. $this->success('ok',['value'=>sysconf('logout_switch')]);
  128. }
  129. /**
  130. * @title 获取热搜列表
  131. * @desc 获取热搜列表
  132. * @author qc
  133. * @url /api/Expedite/getTopSearch
  134. * @method GET
  135. * @param name:page type:int default:-- desc:页数
  136. * @param name:page_num type:int default:-- desc:每页数量
  137. * @param name:module type:string default:-- desc:模块,不传查全部的[video=>视频,article=>图文,datum=>资料,goods=>商城商品,press=>新闻,supplier_goods=>供应商商品,demand=>需求,recruit=>招聘,forum=>问答,activity=>活动]
  138. * @return name:title type:string default:-- desc:标题
  139. * @return name:hot_num type:int default:-- desc:热搜量
  140. * @return name:rel_id type:int default:-- desc:相关详情id【不是系列id】
  141. * @return name:series_id type:int default:-- desc:系列id【图文、视频、资料用】
  142. * @return name:module type:string default:-- desc:[video=>视频,article=>图文,datum=>资料,goods=>商城商品,press=>新闻,supplier_goods=>供应商商品,demand=>需求,recruit=>招聘,forum=>问答,activity=>活动]
  143. */
  144. public function getTopSearch()
  145. {
  146. $module = input('module');
  147. $sel = [];
  148. $sel['is_deleted'] = 0;
  149. $sel['status'] = 1;
  150. if($module) $sel['module'] =$module;
  151. $list = TopSearch::field('id,title,rel_id,module,hot_num,series_id')
  152. ->where($sel)
  153. ->order('hot_num desc')
  154. ->limit($this->off_set,$this->page_num)
  155. ->select()->toArray();
  156. $total_num =TopSearch::where($sel)->count();
  157. $this->success('ok',['list'=>$list,'total_count'=>$total_num,'page_num'=>$this->page_num]);
  158. }
  159. /**
  160. * @title 全局搜索【登录状态需要header需要传Authorization】
  161. * @desc 全局搜索
  162. * @author qc
  163. * @url /api/Expedite/globalSearch
  164. * @method GET
  165. * @param name:page type:int default:-- desc:页数
  166. * @param name:page_num type:int default:-- desc:每页数量
  167. * @param name:type type:string default:-- desc:搜索类型(不传查全部)[video=>视频,article=>图文,datum=>资料,goods=>商城商品,press=>新闻,supplier_goods=>供应商商品,demand=>需求,recruit=>招聘,forum=>问答,activity=>活动]
  168. * @param name:search_name type:string default:-- desc:搜索名称
  169. * @param name:search_time type:int default:-- desc:0不限,182半年,365一年
  170. * @param name:sort_type type:int default:1 desc:1默认2时间升序3时间降序 *
  171. * @return name:video_list type:array default:-- desc:视频列表【单个】
  172. * @return name:video_list.url_id type:int default:-- desc:url_id
  173. * @return name:video_list.video_id type:int default:-- desc:video_id
  174. * @return name:video_list.cover type:string default:-- desc:封面
  175. * @return name:video_list.title type:string default:-- desc:标题
  176. * @return name:video_list.is_vip type:int default:-- desc:是否是vip【0否1是】
  177. * @return name:video_list.ali_vid type:string default:-- desc:云点播视频id
  178. * @return name:video_list.read_num type:int default:-- desc:播放量
  179. * @return name:video_list.duration type:int default:-- desc:时长(单位:秒)
  180. * @return name:video_list.app_name type:string default:-- desc:平台名称
  181. * @return name:video_list.app_logo type:string default:-- desc:平台头像
  182. * @return name:video_list.create_at type:string default:-- desc:时间
  183. * @return name:article_list type:array default:-- desc:图文列表【单个】
  184. * @return name:article_list.title type:string default:-- desc:图文标题
  185. * @return name:article_list.is_vip type:int default:-- desc:是否是vip
  186. * @return name:article_list.desc type:int default:-- desc:简介【文本】
  187. * @return name:article_list.cover type:string default:-- desc:封面
  188. * @return name:article_list.images type:int default:-- desc:图片【多张|隔开】
  189. * @return name:article_list.images_arr type:array default:-- desc:图片
  190. * @return name:article_list.read_num type:int default:-- desc:阅读量
  191. * @return name:article_list.app_name type:string default:-- desc:平台名称
  192. * @return name:article_list.app_logo type:string default:-- desc:平台头像
  193. * @return name:article_list.create_at type:string default:-- desc:时间
  194. *
  195. * @return name:datum_list type:array default:-- desc:资料列表【单个】
  196. * @return name:datum_list.id type:int default:-- desc:资料的url_id
  197. * @return name:datum_list.title type:string default:-- desc:标题
  198. * @return name:datum_list.is_vip type:int default:-- desc:是否是vip
  199. *
  200. * @return name:press_list type:array default:-- desc:新闻列表
  201. * @return name:press_list.id type:int default:-- desc:新闻id
  202. * @return name:press_list.title type:string default:-- desc:标题
  203. * @return name:press_list.cover type:string default:-- desc:封面
  204. * @return name:press_list.images_arr type:array default:-- desc:图片
  205. * @return name:press_list.read_num type:int default:-- desc:阅读量
  206. * @return name:press_list.is_collect type:int default:-- desc:是否收藏(0否1是)
  207. * @return name:press_list.transmit_num type:int default:-- desc:转发量
  208. * @return name:press_list.collect_num type:int default:-- desc:收藏量
  209. * @return name:press_list.praise_num type:int default:-- desc:点赞量
  210. * @return name:press_list.is_praise type:int default:-- desc:是否点赞(0否1是)
  211. * @return name:press_list.comment_num type:int default:-- desc:评论量
  212. *
  213. *
  214. *
  215. *
  216. * @return name:recruit_list type:array default:-- desc:招聘列表
  217. * @return name:recruit_list.title type:string default:-- desc:标题
  218. * @return name:recruit_list.company type:string default:-- desc:公司名
  219. * @return name:recruit_list.cover type:string default:-- desc:公司logo
  220. * @return name:recruit_list.label_name type:array default:-- desc:标签
  221. * @return name:recruit_list.welfare_arr type:array default:-- desc:岗位福利
  222. * @return name:recruit_list.education type:string default:-- desc:学历
  223. * @return name:recruit_list.experience_min type:int default:0 desc:最低工作年限
  224. * @return name:recruit_list.experience_max type:int default:0 desc:最高工作年限
  225. * @return name:recruit_list.price_min type:int default:-- desc:最低薪资
  226. * @return name:recruit_list.price_max type:int default:-- desc:最高薪资
  227. * @return name:recruit_list.province type:string default:-- desc:省名
  228. * @return name:recruit_list.city type:string default:-- desc:市名
  229. * @return name:recruit_list.address type:string default:-- desc:地址
  230. * @return name:recruit_list.app_name type:string default:-- desc:发布人名称
  231. * @return name:recruit_list.app_logo type:string default:-- desc:发布人头像
  232. *
  233. * @return name:goods_list type:array default:-- desc:商城商品
  234. * @return name:goods_list.id type:int default:-- desc:d
  235. * @return name:goods_list.name type:string default:-- desc:商品名称
  236. * @return name:goods_list.cover type:string default:-- desc:封面
  237. * @return name:goods_list.low_price type:float default:-- desc:价格
  238. *
  239. * @return name:supplier_goods_list type:array default:-- desc:供应商商品
  240. * @return name:supplier_goods_list.id type:int default:-- desc:供应商商品d
  241. * @return name:supplier_goods_list.name type:string default:-- desc:商品名称
  242. * @return name:supplier_goods_list.cover_arr type:array default:-- desc:封面
  243. * @return name:supplier_goods_list.label_name type:array default:-- desc:标签
  244. * @return name:supplier_goods_list.label type:string default:-- desc:标签
  245. * @return name:supplier_goods_list.read_num type:int default:-- desc:浏览量
  246. * @return name:supplier_goods_list.supplier_name type:float default:-- desc:供应商名称
  247. *
  248. * @return name:demand_list type:array default:-- desc:需求
  249. * @return name:demand_list.title type:string default:-- desc:标题
  250. * @return name:demand_list.content type:string default:-- desc:内容
  251. * @return name:demand_list.cover type:array default:-- desc:封面
  252. * @return name:demand_list.money type:float default:-- desc:价格
  253. * @return name:demand_list.app_name type:string default:-- desc:发布方名称
  254. * @return name:demand_list.app_logo type:string default:-- desc:发布方头像
  255. * @return name:demand_list.is_over type:int default:-- desc:是否解决或开源【0否,1是,2开源】
  256. * @return name:demand_list.company type:string default:-- desc:公司名
  257. * @return name:demand_list.company_logo type:string default:-- desc:公司logo
  258. *
  259. *
  260. * @return name:forum_list type:array default:-- desc:问答
  261. * @return name:forum_list.id type:int default:-- desc:id
  262. * @return name:forum_list.title type:string default:-- desc:标题
  263. * @return name:forum_list.content type:string default:0 desc:内容
  264. * @return name:forum_list.level type:int default:-- desc:vip等级id
  265. * @return name:forum_list.label type:string default:-- desc:标签
  266. * @return name:forum_list.name type:string default:-- desc:发布用户
  267. * @return name:forum_list.headimg type:string default:-- desc:发布用户头像
  268. * @return name:forum_list.browse_num type:int default:-- desc:浏览量
  269. * @return name:forum_list.reply_num type:int default:-- desc:回答量
  270. *
  271. * @return name:activity_list type:array default:-- desc:活动
  272. * @return name:activity_list.id type:int default:-- desc:id
  273. * @return name:activity_list.address type:string default:-- desc:地址
  274. * @return name:activity_list.cover type:string default:-- desc:封面
  275. * @return name:activity_list.label_name type:array default:-- desc:标签
  276. * @return name:activity_list.start_time type:string default:-- desc:开始时间
  277. * @return name:activity_list.end_time type:string default:-- desc:结束时候
  278. * @return name:activity_list.end_time type:string default:-- desc:结束时间
  279. * @return name:activity_list.price type:string default:-- desc:价格
  280. */
  281. public function globalSearch()
  282. {
  283. $type = input('get.type');
  284. $search_name = input('get.search_name');
  285. $search_time = input('get.search_time');
  286. $sort_type = input('get.sort_type');
  287. $app_name = sysconf('app_name');
  288. $app_logo = sysconf('app_logo');
  289. $user_id = $this->user_id;
  290. switch ($sort_type) {
  291. case 1:
  292. $order = ['a.sort'=>'desc','a.id'=>'asc'];
  293. break;
  294. case 2:
  295. $order = ['a.id'=>'asc','a.sort'=>'desc'];
  296. break;
  297. case 3:
  298. $order = ['a.id'=>'desc','a.sort'=>'desc'];
  299. break;
  300. }
  301. if($this->user_id && $search_name) UserSearch::saveSearchTitle($this->user_id,$search_name,0);
  302. // 视频
  303. $video_list = VideoUrl::field('a.id url_id,a.create_at,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')
  304. ->when($search_name,function ($query)use ($search_name,$search_time){
  305. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  306. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  307. })->leftJoin('video_intro b','b.id = a.video_id')
  308. ->where('a.status',1)->where('release_time','< time',date('Y-m-d H:i:s'))->where('a.is_deleted',0)
  309. ->where('b.status',1)->where('b.is_deleted',0)->limit($this->off_set,$this->page_num)->order($order)
  310. ->select()->toArray();
  311. array_walk($video_list,function (&$v,$k)use ($app_name,$app_logo){
  312. $v['label_name'] = $v['label'] ? explode(',',trim($v['label'],',')) : null;
  313. $video_auth = VideoUrl::getVideoAuth($v['user_id'],APPNAME,APPLOGO);
  314. $v['app_name'] = $video_auth['app_name'];
  315. $v['app_logo'] = $video_auth['app_logo'];
  316. });
  317. $video_num = VideoUrl::when($search_name,function ($query)use ($search_name,$search_time){
  318. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  319. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  320. })->alias('a')->leftJoin('video_intro b','b.id = a.video_id')->where('release_time','< time',date('Y-m-d H:i:s'))
  321. ->where('a.status',1)->where('a.is_deleted',0)->where('b.status',1)->where('b.is_deleted',0)->count();
  322. // 图文
  323. $article_list = ArticleItem::field('a.id item_id,a.user_id,a.create_at,a.article_id,a.cover,a.title,a.is_vip,a.images,a.read_num,a.desc')->alias('a')
  324. ->when($search_name,function ($query)use ($search_name,$search_time){
  325. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  326. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  327. })->leftJoin('article_intro b','a.article_id = b.id')
  328. ->where('a.status',1)->where('a.is_deleted',0)->where('b.status',1)->where('b.is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->order($order)
  329. ->limit($this->off_set,$this->page_num)->select()->toArray();
  330. array_walk($article_list,function (&$v,$k)use ($app_name,$app_logo){
  331. $article_auth = VideoUrl::getVideoAuth($v['user_id'],APPNAME,APPLOGO);
  332. $v['app_name'] = $article_auth['app_name'];
  333. $v['app_logo'] = $article_auth['app_logo'];
  334. });
  335. $article_num = ArticleItem::when($search_name,function ($query)use ($search_name,$search_time){
  336. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  337. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  338. })->leftJoin('article_intro b','a.article_id = b.id')->alias('a') ->where('release_time','< time',date('Y-m-d H:i:s'))
  339. ->where('a.status',1)->where('a.is_deleted',0)->where('b.status',1)->where('b.is_deleted',0)->count();
  340. // 资料
  341. $datum_list = DatumUrl::field('a.id,a.url,a.datum_id,a.title,a.is_vip,a.create_at')->alias('a')
  342. ->when($search_name,function ($query)use ($search_name,$search_time){
  343. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  344. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  345. })->leftJoin('datum_intro b','b.id = a.datum_id') ->where('release_time','< time',date('Y-m-d H:i:s'))
  346. ->where('a.status',1)->where('a.is_deleted',0)->where('b.status',1)->where('b.is_deleted',0) ->order($order)
  347. ->limit($this->off_set,$this->page_num)->select()->toArray();
  348. $datum_num = DatumUrl::alias('a')->when($search_name,function ($query)use ($search_name,$search_time){
  349. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  350. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  351. })->leftJoin('datum_intro b','b.id = a.datum_id')->where('a.status',1)->where('a.is_deleted',0)->where('b.status',1)
  352. ->where('release_time','< time',date('Y-m-d H:i:s'))->where('b.is_deleted',0)->count();
  353. //新闻
  354. $press_list = \app\common\model\Press::field('id,title,cover,images,read_num')->alias('a')
  355. ->when($search_name,function ($query)use ($search_name,$search_time){
  356. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  357. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  358. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->order($order)
  359. ->limit($this->off_set,$this->page_num)->select()->toArray();
  360. array_walk($press_list,function (&$v,$k){
  361. $v['comment_num'] = PressComment::where(['first_id'=>$v['id'],'type'=>1,'is_deleted'=>0])->count();
  362. $v['is_collect'] = UserCollect::checkCollectByType($this->user_id,4,$v['id']);
  363. $v['collect_num'] = UserCollect::getCollectNum(4,$v['id']);
  364. $v['is_praise'] = PlatformLike::checkTags($this->user_id,$v['id'],1);
  365. $v['praise_num'] = PlatformLike::getPraiseNum($v['id'],1);
  366. $v['images_arr'] = $v['images'] ? explode('|',$v['images']) : null;
  367. });
  368. $press_num = \app\common\model\Press::when($search_name,function ($query)use ($search_name,$search_time){
  369. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  370. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  371. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->count();
  372. //招聘
  373. $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')
  374. ->alias('a')->when($search_name,function ($query)use ($search_name,$search_time){
  375. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  376. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  377. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->order($order)
  378. ->limit($this->off_set,$this->page_num)->select()->toArray();
  379. array_walk($recruit_list,function (&$v,$k)use ($app_logo,$app_name){
  380. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  381. $v['welfare_arr'] = explode(',',trim($v['welfare'],','));
  382. if(!$v['user_id']){
  383. $v['app_name'] = $app_name;
  384. $v['app_logo'] = $app_logo;
  385. }else{
  386. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  387. $v['app_name'] = $user_info ? $user_info->name : '';
  388. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  389. }
  390. });
  391. $recruit_num = \app\common\model\Recruit::when($search_name,function ($query)use ($search_name,$search_time){
  392. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  393. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  394. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->count();
  395. // 商品
  396. $goods_list = StoreGoods::field('id,name,cover,low_price')->alias('a')->when($search_name,function ($query)use ($search_name,$search_time){
  397. if($search_name) $query->where('name','like','%'.$search_name.'%');
  398. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  399. })->where('is_deleted',0)->where('status',1)->order($order)->limit($this->off_set,$this->page_num)->select()->toArray();
  400. $goods_num =StoreGoods::when($search_name,function ($query)use ($search_name,$search_time){
  401. if($search_name) $query->where('name','like','%'.$search_name.'%');
  402. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  403. })->where('is_deleted',0)->where('status',1) ->where('release_time','< time',date('Y-m-d H:i:s'))->count();
  404. // 供应商
  405. $supplier_goods_list =SupplierGoods::field('a.id,a.supplier_id,a.name,a.read_num,a.label,a.cover,s.title supplier_name,a.create_at')
  406. ->alias('a')->when($search_name,function ($query)use($search_name,$search_time){
  407. if($search_name) $query->where('a.name','like','%'.$search_name.'%');
  408. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  409. })->leftJoin('Supplier s','a.supplier_id = s.id')->where('a.status','=',1)->where('a.is_deleted','=',0)->where('s.status','=',1)->where('s.is_deleted','=',0)
  410. ->where('release_time','< time',date('Y-m-d H:i:s'))->limit($this->off_set,$this->page_num) ->order($order)->select()->toArray();
  411. array_walk($supplier_goods_list,function (&$v,$k){
  412. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  413. $v['cover_arr'] = explode('|',trim($v['cover'],'|'));
  414. });
  415. $supplier_goods_num = SupplierGoods::when($search_name,function ($query)use($search_name,$search_time){
  416. if($search_name) $query->where('g.name','like','%'.$search_name.'%');
  417. if($search_time) $query->where('g.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  418. })->alias('g')->leftJoin('Supplier s','g.supplier_id = s.id')->where('g.status','=',1) ->where('g.release_time','< time',date('Y-m-d H:i:s'))
  419. ->where('g.is_deleted','=',0)->where('s.status','=',1)->where('s.is_deleted','=',0)->count();
  420. // 需求
  421. $demand_list = PlatformDemand::field('id,cover,money,user_id,label,title,cover,is_over,content,company,company_logo,a.create_at')->alias('a')
  422. ->when($search_name,function ($query)use ($search_name,$search_time){
  423. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  424. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  425. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))
  426. ->limit($this->off_set,$this->page_num)->order($order)->select()->toArray();
  427. array_walk($demand_list,function (&$v,$k)use ($app_logo,$app_name){
  428. if(!$v['user_id']){
  429. $v['app_name'] = $app_name;
  430. $v['app_logo'] = $app_logo;
  431. }else{
  432. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  433. $v['app_name'] = $user_info ? $user_info->name : '';
  434. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  435. }
  436. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  437. $v['cover_arr'] = explode('|',trim($v['cover'],'|'));
  438. });
  439. $demand_num = PlatformDemand::when($search_name,function ($query)use ($search_name,$search_time){
  440. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  441. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  442. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->count();
  443. // 问答
  444. $forum_list = UserForum::field('a.id,a.title,a.content,a.label,a.level,a.browse_num,a.sort,a.create_at,u.name,u.headimg, IFNULL( (SELECT count(DISTINCT r.user_id) FROM dd_forum_reply as r WHERE a.id=r.forum_id),0 ) as reply_num')->alias('a')
  445. ->when($search_name,function ($query)use ($search_name,$search_time){
  446. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  447. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  448. })->leftJoin('store_member u','u.id = a.user_id') ->where('release_time','< time',date('Y-m-d H:i:s'))
  449. ->where('a.status',1)->where('a.is_deleted',0)->order($order)->limit($this->off_set,$this->page_num)->select()->toArray();
  450. $forum_num = UserForum::field('a.id')->alias('a')->when($search_name,function ($query)use ($search_name,$search_time){
  451. if($search_name) $query->where('a.title|a.label','like','%'.$search_name.'%');
  452. if($search_time) $query->where('a.create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  453. })->leftJoin('store_member u','u.id = a.user_id')
  454. ->where('a.status',1) ->where('release_time','< time',date('Y-m-d H:i:s'))
  455. ->where('a.is_deleted',0)->count();
  456. // 活动
  457. $activity_list = \app\common\model\Activity::field('id,cover,title,address,label,start_time,end_time,ladder,price,a.create_at')->alias('a')
  458. ->when($search_name,function ($query)use ($search_name,$search_time){
  459. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  460. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  461. })->where('status',1)->where('is_deleted',0)->order($order)->limit($this->off_set,$this->page_num) ->where('release_time','< time',date('Y-m-d H:i:s'))->select()->toArray();
  462. array_walk($activity_list,function (&$v,$k){
  463. $v['label_name'] = $v['label']? explode(',',trim($v['label'],',')) : null;
  464. $v['ladder'] = $v['ladder'] ? json_decode($v['ladder'],true):null;
  465. });
  466. $activity_num = \app\common\model\Activity::when($search_name,function ($query)use ($search_name,$search_time){
  467. if($search_name) $query->where('title|label','like','%'.$search_name.'%');
  468. if($search_time) $query->where('create_at','> time',date('Y-m-d H:i:s',strtotime('-'.$search_time.' days')));
  469. })->where('status',1)->where('is_deleted',0) ->where('release_time','< time',date('Y-m-d H:i:s'))->count();
  470. if(!$type) {
  471. $total_count = $video_num+$article_num+$datum_num+$demand_num+$press_num+$goods_num+$supplier_goods_num + $activity_num + $forum_num+$recruit_num;
  472. }else{
  473. $total_count = compact($type.'_num')[$type.'_num'];
  474. }
  475. $this->success('ok',$type ? compact([$type.'_list','total_count']): compact(['video_list','article_list','datum_list','goods_list','press_list','supplier_goods_list','demand_list','recruit_list','forum_list','activity_list','total_count']));
  476. }
  477. /**
  478. * @title 发送短信验证码
  479. * @desc 发送短信验证码
  480. * @author qc
  481. * @url /api/Expedite/sendSms
  482. * @method POST
  483. * @tag 短信验证码
  484. * @param name:phone type:int require:1 default:-- desc:要获取验证码的手机号
  485. * @param name:phone_pre type:int require:1 default:86 desc:手机号前缀
  486. * @return name:code type:string default:-- desc:验证码
  487. */
  488. public function sendSms(){
  489. $phone_pre = input('post.phone_pre',86);
  490. $phone = input('post.phone');
  491. $user_info = User::where('phone',$phone)
  492. ->where('phone_pre',$phone_pre)
  493. ->where('is_deleted',0)
  494. ->field('id,status,is_deleted')->find();
  495. if($user_info && (!$user_info->status || $user_info->is_deleted))$this ->error('用户被禁用,请联系官方');
  496. if(empty($phone)) $this ->error('参数错误');
  497. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  498. AlibabaCloud::accessKeyClient('LTAI5tJ5p12drZegeWVG33xZ', '82UWAiY5e5wH8tSkRvMtqVoGO0h8SB')->regionId('cn-hangzhou')->asDefaultClient();
  499. try {
  500. $result = AlibabaCloud::rpc()
  501. ->product('Dysmsapi')
  502. ->version('2017-05-25')
  503. ->action('SendSms')
  504. ->method('POST')
  505. ->host('dysmsapi.aliyuncs.com')
  506. ->options([
  507. 'query' => [
  508. 'RegionId' => "cn-hangzhou",
  509. 'PhoneNumbers' => $phone_pre == '86' ? $phone :$phone_pre.$phone,
  510. 'SignName' => "搞一下汽车电子",
  511. 'TemplateCode' => $phone_pre == '86' ? "SMS_234397351" :'SMS_269485496',
  512. 'TemplateParam' => json_encode(array("code"=>$code)),
  513. ],
  514. ])->request();
  515. $result = $result->toArray();
  516. if($result['Code'] != "OK") $this->exception('发送失败');
  517. $sms_data = [
  518. 'phone'=>$phone,
  519. 'code'=>$code,
  520. 'phone_pre'=>$phone_pre,
  521. 'result'=>$result['Message']
  522. ];
  523. Db::name('store_member_sms')->insert($sms_data);
  524. } catch (ClientException $e) {
  525. $this->error($e->getErrorMessage().PHP_EOL);
  526. } catch (ServerException $e) {
  527. $this->error($e->getErrorMessage().PHP_EOL);
  528. }catch (\Exception $e){
  529. $this->error($e->getMessage());
  530. }
  531. $this->success('发送成功');
  532. }
  533. /**
  534. * @title 发送邮箱验证码
  535. * @desc 发送邮箱验证码
  536. * @author qc
  537. * @url /api/Expedite/emailSms
  538. * @method POST
  539. * @tag 邮箱验证码
  540. * @param name:email type:int require:1 default:-- desc:邮箱
  541. * @return name:code type:string default:-- desc:验证码
  542. */
  543. function emailSms(){
  544. $email = input('post.email');
  545. $user_info = User::where('email',$email)->where('is_deleted',0)->field('id,status')->find();
  546. if($user_info && $user_info['status'] == 0)$this ->error('用户被禁用,请联系官方');
  547. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  548. require_once env('root_path').'/vendor/aliyunmail/aliyun-php-sdk-core/Config.php';
  549. $iClientProfile = \DefaultProfile::getProfile("cn-hangzhou", "LTAI5tJ5p12drZegeWVG33xZ", "82UWAiY5e5wH8tSkRvMtqVoGO0h8SB");
  550. $client = new \DefaultAcsClient($iClientProfile);
  551. $request = new Dm\SingleSendMailRequest();
  552. $request->setAccountName("gyx@yzm.gyxqcdz.com");
  553. $request->setFromAlias("[验证码]");
  554. $request->setAddressType(1);
  555. $request->setTagName("zonghuzhuche");
  556. $request->setReplyToAddress("true");
  557. $request->setToAddress($email);
  558. $request->setSubject("验证码");
  559. $img= "http://gaoyixia.hdlkeji.com/code/33.png";
  560. $img ="<img src='$img'/>";
  561. $html_body = '您的验证码'.$code.'有效时间5分钟';
  562. $request->setHtmlBody($html_body);
  563. try {
  564. $send_res = $client->getAcsResponse($request);
  565. $sms_data = array(
  566. 'phone'=>$email,
  567. 'code'=>$code,
  568. 'result'=>'OK'
  569. );
  570. Db::name('store_member_sms')->insert($sms_data);
  571. $this->success('发送成功');
  572. } catch (ClientException $e) {
  573. $this->error($e->getErrorMessage());
  574. // print_r($e->getErrorCode());
  575. // print_r($e->getErrorMessage());
  576. } catch (ServerException $e) {
  577. $this->error($e->getErrorMessage());
  578. // print_r($e->getErrorCode());
  579. // print_r($e->getErrorMessage());
  580. }
  581. }
  582. /**
  583. * @title 获取签名
  584. * @desc 获取签名
  585. * @url /api/Expedite/getWeChatSign
  586. * @method POST
  587. * @param name:url type:string default:-- desc:页面地址
  588. * @return name:appid type:string default:-- desc:appid
  589. * @return name:noncestr type:string default:-- desc:随机字符
  590. * @return name:timestamp type:string default:-- desc:时间戳
  591. * @return name:sign type:string default:-- desc:签名
  592. * @return name:ticket type:string default:-- desc:ticket
  593. **/
  594. public function getWeChatSign(){
  595. $urls = input('post.url');
  596. $appid = config('app.official_account')['appid'];
  597. $secret = config('app.official_account')['secret'];
  598. $redis = new Redis();
  599. $access_token = $redis->get('access_token');
  600. if (!$access_token){
  601. $access_token = '';
  602. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  603. $res= http_curl($url);
  604. if (isset($res['access_token'])){
  605. $redis->set('access_token',$res['access_token'],'7000');
  606. $access_token = $res['access_token'];
  607. }
  608. }
  609. $url2 ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
  610. $res2=http_curl($url2);
  611. //var_dump($res2);
  612. if (!isset($res2) || $res2['errcode']!=0) $this->error('获取ticket失败');
  613. $timestamp = time();
  614. $noncestr = get32Str(15);
  615. $string = "jsapi_ticket=".$res2['ticket']."&noncestr=$noncestr&timestamp=$timestamp&url=".$urls;
  616. $sign = sha1($string);
  617. $return = [
  618. 'appid'=>$appid,
  619. 'noncestr'=>$noncestr,
  620. 'timestamp'=>$timestamp,
  621. 'url'=>$urls,
  622. 'sign'=>$sign,
  623. 'ticket'=>$res2['ticket']
  624. ];
  625. $this->success('成功',$return);
  626. }
  627. /**
  628. * @title 获取分享链接
  629. * @desc 获取分享链接
  630. * @url /api/Expedite/getUrlScheme
  631. * @method POST
  632. * @return name:url type:string default:-- desc:url
  633. **/
  634. public function getUrlScheme()
  635. {
  636. $appid = config('app.mini_program')['app_id'];
  637. $secret = config('app.mini_program')['secret'];
  638. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  639. $res= http_curl($url);
  640. $access_token = $res['access_token'];
  641. $api_url = 'https://api.weixin.qq.com/wxa/generatescheme?access_token='.$access_token;
  642. $url_scheme = curl_post($api_url,[]);
  643. $this->success('ok',['url'=>$url_scheme['openlink']]);
  644. }
  645. /**
  646. * @title getUrlLink
  647. * @desc getUrlLink
  648. * @url /api/Expedite/getUrlLink
  649. * @method POST
  650. * @return name:url type:string default:-- desc:url
  651. **/
  652. public function getUrlLink()
  653. {
  654. $appid = config('app.mini_program')['app_id'];
  655. $secret = config('app.mini_program')['secret'];
  656. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  657. $res= http_curl($url);
  658. $access_token = $res['access_token'];
  659. $api_url = 'https://api.weixin.qq.com/wxa/generate_urllink?access_token='.$access_token;
  660. $url_link = curl_post($api_url,[]);
  661. $this->success('ok',['url'=>$url_link['url_link']]);
  662. }
  663. /**
  664. * @title 获取平台文案设置
  665. * @desc 获取平台文案设置
  666. * @author qc
  667. * @url /api/Expedite/getSysConfig
  668. * @method GET
  669. * @param name:search_name type:string default:-- desc:根据下面名称查(不传查全部的)
  670. * @return name:agreement type:string default:-- desc:用户协议
  671. * @return name:about_us type:string default:-- desc:关于我们
  672. * @return name:privacy type:string default:-- desc:隐私政策
  673. * @return name:user_equity type:string default:-- desc:会员权益
  674. * @return name:customer_service type:string default:-- desc:客服设置
  675. * @return name:original_pact type:string default:-- desc:原创公约
  676. * @return name:app_name type:string default:-- desc:平台名称
  677. * @return name:app_logo type:string default:-- desc:平台logo
  678. * @return name:app_version type:string default:-- desc:版本号
  679. */
  680. public function getSysConfig(){
  681. $search_name = input('get.search_name');
  682. $con_name = $search_name? [$search_name] : ['agreement','about_us','privacy','user_equity','customer_service','original_pact','app_version'];
  683. $set = Db::name('system_config')->where('name','in',$con_name)->select();
  684. $ret = [];
  685. foreach ($set as $value) {
  686. $ret[$value['name']]=$value['value'];
  687. }
  688. $this->success('获取成功',$ret);
  689. }
  690. /**
  691. * @title 修改版本信息【安卓】
  692. * @desc 修改版本信息
  693. * @author qc
  694. * @method POST
  695. * @url /api/Expedite/changeVersion
  696. * @header name:Authorization require:1 desc:Token
  697. * @param name:app_version type:string default:1 desc:版本号
  698. * @param name:version_name type:string default:-- desc:版本名
  699. * @param name:version_title type:string default:-- desc:更新标题
  700. * @param name:version_content type:string default:-- desc:更新内容
  701. * @param name:version_url type:string default:-- desc:下载地址
  702. * @param name:version_compel type:string default:-- desc:是否强制更新
  703. */
  704. public function changeVersion()
  705. {
  706. if(input('app_version'))Data::save('system_config',['value'=>input('app_version'),'name'=>'app_version'],'name',['name'=>'app_version']);
  707. if(input('version_name')) Data::save('system_config',['value'=>input('version_name'),'name'=>'version_name'],'name',['name'=>'version_name']);
  708. if(input('version_title')) Data::save('system_config',['value'=>input('version_title'),'name'=>'version_title'],'name',['name'=>'version_title']);
  709. if(input('version_content')) Data::save('system_config',['value'=>input('version_content'),'name'=>'version_content'],'name',['name'=>'version_content']);
  710. if(input('version_url')) Data::save('system_config',['value'=>input('version_url'),'name'=>'version_url'],'name',['name'=>'version_url']);
  711. Data::save('system_config',['value'=>input('version_compel'),'name'=>'version_compel'],'name',['name'=>'version_compel']);
  712. $this->success('修改成功');
  713. }
  714. /**
  715. * @title 获取版本信息【安卓】
  716. * @desc 获取版本信息
  717. * @author qc
  718. * @method GET
  719. * @url /api/Expedite/getVersionInfo
  720. * @header name:Authorization require:1 desc:Token
  721. * @return name:app_version type:string default:1 desc:版本号
  722. * @return name:version_name type:string default:-- desc:版本名
  723. * @return name:version_title type:string default:-- desc:更新标题
  724. * @return name:version_content type:string default:-- desc:更新内容
  725. * @return name:version_url type:string default:-- desc:下载地址
  726. * @return name:version_compel type:string default:-- desc:是否强制更新
  727. */
  728. public function getVersionInfo()
  729. {
  730. $version_sel = ['app_version','version_name','version_title','version_content','version_url','version_compel'];
  731. $set = Db::name('system_config')->where('name','in',$version_sel)->column('value','name');
  732. $ret = [];
  733. foreach ($version_sel as $v) {
  734. $ret[$v] = isset($set[$v]) ? $set[$v] :null;
  735. if($v == 'app_version') $ret[$v] = intval($set[$v]);
  736. }
  737. $this->success('获取成功',$ret);
  738. }
  739. /**
  740. * @title 修改版本信息【IOS】
  741. * @desc 修改版本信息
  742. * @author qc
  743. * @method POST
  744. * @url /api/Expedite/changeIosVersion
  745. * @header name:Authorization require:1 desc:Token
  746. * @param name:app_version_ios type:string default:1 desc:版本号
  747. * @param name:version_name_ios type:string default:-- desc:版本名
  748. * @param name:version_compel_ios type:string default:-- desc:是否强制更新
  749. */
  750. public function changeIosVersion()
  751. {
  752. if(input('app_version_ios'))Data::save('system_config',['value'=>input('app_version_ios'),'name'=>'app_version_ios'],'name',['name'=>'app_version_ios']);
  753. if(input('version_name_ios')) Data::save('system_config',['value'=>input('version_name_ios'),'name'=>'version_name_ios'],'name',['name'=>'version_name_ios']);
  754. Data::save('system_config',['value'=>input('version_compel_ios'),'name'=>'version_compel_ios'],'name',['name'=>'version_compel_ios']);
  755. $this->success('修改成功');
  756. }
  757. /**
  758. * @title 获取版本信息【IOS】
  759. * @desc 获取版本信息
  760. * @author qc
  761. * @method GET
  762. * @url /api/Expedite/getIosVersionInfo
  763. * @header name:Authorization require:1 desc:Token
  764. * @return name:app_version_ios type:string default:1 desc:版本号
  765. * @return name:version_name_ios type:string default:-- desc:版本名
  766. * @return name:version_compel_ios type:string default:-- desc:是否强制更新
  767. */
  768. public function getIosVersionInfo()
  769. {
  770. $version_sel = ['app_version_ios','version_name_ios','version_compel_ios'];
  771. $set = Db::name('system_config')->where('name','in',$version_sel)->column('value','name');
  772. $ret = [];
  773. foreach ($version_sel as $v) {
  774. $ret[$v] = isset($set[$v]) ? $set[$v] :null;
  775. // if($v == 'app_version_ios') $ret[$v] = intval($set[$v]);
  776. }
  777. $this->success('获取成功',$ret);
  778. }
  779. /**
  780. * @title 获取APP启动页信息
  781. * @desc 获取APP启动页信息
  782. * @author qc
  783. * @method GET
  784. * @url /api/Expedite/getAppBootConfig
  785. * @header name:Authorization require:1 desc:Token
  786. * @return name:app_image type:string default:1 desc:启动图
  787. * @return name:app_place type:string default:-- desc:跳转模块【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商商品,recruit=>招聘,mall=>商城】
  788. * @return name:first_id type:int default:-- desc:详情id(视频、图文、资料为系列id)
  789. * @return name:second_id type:second_id default:-- desc:系列某详情id(视频、图文、资料)
  790. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  791. */
  792. public function getAppBootConfig()
  793. {
  794. $version_sel = ['app_image','app_place','first_id','second_id'];
  795. $set = Db::name('system_config')->where('name','in',$version_sel)->column('value','name');
  796. $ret = [];
  797. foreach ($version_sel as $v) {
  798. $ret[$v] = isset($set[$v]) ? $set[$v] :null;
  799. $set[$v] = $ret[$v];
  800. }
  801. $ret['is_normal'] = CheckPower::checkModulesPower($set['first_id'],$set['second_id'],$set['app_place']);
  802. $this->success('获取成功',$ret);
  803. }
  804. /**
  805. * @title IOS获取链接
  806. * @desc GET方式获取POST修改
  807. * @author qc
  808. * @method GET||POST
  809. * @url /api/Expedite/iosUrl
  810. * @header name:Authorization require:1 desc:Token
  811. * @param name:ios_url type:string default:-- desc:链接地址
  812. * @return name:ios_url type:string default:-- desc:链接地址
  813. */
  814. public function iosUrl()
  815. {
  816. if($this->request->isPost()) Data::save('system_config',['value'=>input('ios_url'),'name'=>'ios_url'],'name',['name'=>'ios_url']);
  817. $url = Db::name('system_config')->where('name','ios_url')->value('value');
  818. $this->success('获取成功',['ios_url'=>$url ? $url :'']);
  819. }
  820. /**
  821. * @title 获取客服设置【平台的】
  822. * @desc 获取客服设置【平台的】
  823. * @author qc
  824. * @url /api/Expedite/getServiceSet
  825. * @method GET
  826. * @return name:service_qr_code type:string default:-- desc:客服二维码
  827. * @return name:service_phone type:string default:-- desc:客服电话
  828. * @return name:service_email type:string default:-- desc:客服邮箱
  829. */
  830. public function getServiceSet(){
  831. $con_name = ['service_qr_code','service_phone','service_email'];
  832. $set = Db::name('system_config')->where('name','in',$con_name)->select();
  833. $ret = [];
  834. foreach ($set as $value) {
  835. $ret[$value['name']]=$value['value'];
  836. }
  837. $this->success('获取成功',$ret);
  838. }
  839. /**
  840. * @title 获取联系客服设置【模块的】[所有模块的联系我们都用这个接口]
  841. * @desc 获取联系客服设置
  842. * @author qc
  843. * @url /api/Expedite/getContact
  844. * @method GET
  845. * @param name:tag type:string default:-- desc:标识【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商,recruit=>招聘,mall=>商城】
  846. * @return name:qrcode type:string default:-- desc:客服二维码
  847. * @return name:phone type:string default:-- desc:客服电话
  848. * @return name:email type:string default:-- desc:客服邮箱
  849. * @return name:place type:string default:-- desc:归属模块
  850. * @return name:tag type:string default:-- desc:归属标识【可以按照这个值查询或是区分所属模块】
  851. */
  852. public function getContact()
  853. {
  854. $tag = input('get.tag');
  855. $sel_tag = $tag ? [$tag] : ['video','article','datum','activity','demand','forum','press','supplier','recruit','mall'];
  856. $list = Db::name('contact')->where('tag','in',$sel_tag)->column('tag,qrcode,phone,email,tag,place','tag');
  857. $this->success('ok',$list);
  858. }
  859. /**
  860. * @title 获取模块封面
  861. * @desc 获取模块封面
  862. * @author qc
  863. * @url /api/Expedite/getModulesCover
  864. * @method GET
  865. * @param name:tag type:string default:-- desc:标识【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商,recruit=>招聘,mall=>商城,'search'=>热搜】
  866. * @return name:cover type:string default:-- desc:封面
  867. * @return name:place type:string default:-- desc:归属模块
  868. * @return name:tag type:string default:-- desc:归属标识【可以按照这个值查询或是区分所属模块】
  869. */
  870. public function getModulesCover()
  871. {
  872. $tag = input('get.tag');
  873. $sel_tag = $tag ? [$tag] : ['video','article','datum','activity','demand','forum','press','supplier','recruit','mall','search'];
  874. $list = Db::name('cover')->where('tag','in',$sel_tag)->column('tag,cover,tag,place','tag');
  875. $this->success('ok',$list);
  876. }
  877. /**
  878. * @title 推送测试
  879. * @desc 推送测试
  880. * @author qc
  881. * @url /api/Expedite/messagePush
  882. * @method GET
  883. * @param name:user_id type:int default:-- desc:会员id
  884. * @param name:content type:string default:-- desc:推送内容
  885. * @param name:module type:string default:-- desc:模块
  886. * @param name:type type:类型 default:-- desc:推送类型
  887. * @param name:rel_id type:类型 default:-- desc:关联id
  888. */
  889. public function messagePush()
  890. {
  891. $user_id= input('user_id');
  892. $content= input('content');
  893. $module= input('module');
  894. $type= input('type');
  895. $rel_id= input('rel_id');
  896. $res = UserMessage::Jpush($user_id,$content,$module,$type,$rel_id);
  897. $this->success('',['result'=>$res]);
  898. }
  899. /**
  900. * @title 获取分享地址
  901. * @desc 获取分享地址
  902. * @author qc
  903. * @url /api/Expedite/getShareUrl
  904. * @method GET
  905. * @param name:tag type:string default:-- desc:标识【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商商品,recruit=>招聘,mall=>商城商品】
  906. * @param name:first_id type:int default:-- desc:【视频系列id,图文系列id,资料系列id,活动id,需求id,问答id,新闻id,供应商商品id,招聘记录id,商城商品id】
  907. * @param name:second_id type:string default:-- desc:【视频url_id,图文item_id,资料item_id,其他类型的不传】
  908. * @return name:url type:string default:-- desc:跳转地址
  909. */
  910. public function getShareUrl()
  911. {
  912. $tag = input('get.tag');
  913. if(!in_array($tag, ['video','article','datum','activity','demand','forum','press','supplier','recruit','mall'])) $this->error('类型标识错误');
  914. $first_id = input('get.first_id');
  915. $second_id = input('get.second_id');
  916. $url_arr= [
  917. 'video' =>$this->request->root(true) ."/dist/#/video-details?id=$first_id&videoArrId=$second_id",
  918. 'article' =>$this->request->root(true) ."/dist/#/image-text-details?id=$first_id&item_id=$second_id",
  919. 'datum' =>$this->request->root(true) ."/dist/#/information-details?id=$first_id&url_id=$second_id",
  920. 'activity' =>$this->request->root(true) ."/dist/#/activity-sign-up?activity_id=$first_id",
  921. 'demand' =>$this->request->root(true) ."/dist/#/demand-details?demand_id=$first_id",
  922. 'forum' =>$this->request->root(true) ."/dist/#/forum-question-details?forum_id=$first_id",
  923. 'press' =>$this->request->root(true) ."/dist/#/news-details?press_id=$first_id",
  924. 'supplier' =>$this->request->root(true) ."/dist/#/supplier-details?id=$first_id",
  925. 'recruit' =>$this->request->root(true) ."/dist/#/recruit-details?recruit_id=$first_id",
  926. 'mall' =>$this->request->root(true) ."/dist/#/product-details?product_id=$first_id",
  927. ];
  928. $this->success('ok',['url'=>$url_arr[$tag]]);
  929. }
  930. /**
  931. * @title 获取极光推送类型
  932. * @desc module'=>[type=>['title'=>'视频投稿','is_push'=>0,'msg'=>['视频投稿成功请等待审核']]]
  933. * @author qc
  934. * @url /api/Expedite/getJiGuangPushType
  935. * @method GET
  936. * @return name:is_push type:string default:-- desc:模块类型下的消息是否有极光推送(1推送0不推送)
  937. * @return name:exp type:string default:-- desc:module'=>[type=>['title'=>'视频投稿','is_push'=>0,'msg'=>['视频投稿成功请等待审核']]]
  938. *
  939. */
  940. public function getJiGuangPushType()
  941. {
  942. $type_desc = [
  943. 'video'=>[
  944. 3=>['title'=>'视频评论回复【回复我的】','is_push'=>1,'msg'=>['有会员评论了您的回复']],
  945. 4=>['title'=>'视频评论【评论我的】','is_push'=>1,'msg'=>['有会员评论了您的视频']],
  946. ],// 视频
  947. 'article'=>[
  948. 3=>['title'=>'图文评论回复【回复我的】','is_push'=>1,'msg'=>['有会员评论了您的回复']],
  949. 4=>['title'=>'图文评论【评论我的】','is_push'=>1,'msg'=>['有会员评论了您的图文']],
  950. ],//图文
  951. 'forum'=>[
  952. 3=>['title'=>'回复的评论【评论我的】','is_push'=>1,'msg'=>['有会员评论了您的回复']],
  953. 4=>['title'=>'评论的回复【回复我的】','is_push'=>1,'msg'=>['有会员回复了您的评论']],
  954. 5=>['title'=>'问答回复【回答我的】','is_push'=>1,'msg'=>['有会员回复了您的问题']],
  955. ],// 问答
  956. 'press'=>[
  957. 1=>['title'=>'评论回复【回复我的】','is_push'=>1,'msg'=>['有会员回复了您的评论']],
  958. ],// 新闻
  959. 'feedback'=>[
  960. 1=>['title'=>'反馈内容回复','is_push'=>1,'msg'=>['平台回复了您的反馈']],
  961. ],// 反馈
  962. ];
  963. $this->success('ok',$type_desc);
  964. }
  965. /**
  966. * @title 获取模块总角标数量
  967. * @desc 获取模块总角标数量
  968. * @author qc
  969. * @method GET
  970. * @url /api/Expedite/getTotalMarkNum
  971. * @header name:Authorization require:1 desc:Token
  972. * @return name:video_num type:int default:-- desc:视频
  973. * @return name:article_num type:int default:-- desc:图文
  974. * @return name:press_num type:int default:-- desc:新闻
  975. * @return name:demand_num type:int default:-- desc:需求
  976. * @return name:forum_num type:int default:-- desc:问答
  977. * @return name:sys_num type:int default:-- desc:系统消息
  978. * @return name:datum_num type:int default:-- desc:资料
  979. * @return name:supplier_num type:int default:-- desc:供应商
  980. * @return name:activity_num type:int default:-- desc:活动
  981. * @return name:total_num type:int default:-- desc:总计
  982. */
  983. public function getTotalMarkNum()
  984. {
  985. if(!$this->user_id) $this->success('ok',['video_num'=>0,'article_num'=>0,'press_num'=>0,'demand_num'=>0,'forum_num'=>0,'sys_num'=>0,'datum_num'=>0,'total_num'=>0]);
  986. $video_all_comment = VideoComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  987. // 回复我的
  988. $video_reply_num = VideoComment::where([['t.is_deleted','=',0],['t.to_deleted','=',0],['t.user_id','<>',$this->user_id],['t.lev','>=',2],['is_read','=',0],['t.pid','in',implode(',',$video_all_comment)]])->alias('t')->count();
  989. // 评论我的
  990. $video_comment_num = VideoComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['t.user_id','<>',$this->user_id],['t.is_read','=',0],['t.pid','=',0]])
  991. ->leftJoin('VideoUrl i','t.url_id = i.id')
  992. ->alias('t')->count();
  993. // 追更
  994. $video_follow_num = UserMessage::getUnreadNum($this->user_id,'video',5);
  995. // 点赞我的
  996. $all_video = VideoUrl::where('user_id',$this->user_id)->where('is_deleted',0)->column('id');
  997. $video_praise_num = 0;//VideoCommentLike::where([['type','=',2],['is_read','=',0],['like_id','in',$all_video]])->count();
  998. $comment_praise_num = 0 ;// VideoCommentLike::where([['type','=',1],['is_read','=',0],['like_id','in',$video_all_comment]])->count();
  999. $video_num = $video_reply_num + $video_comment_num + $video_follow_num + $video_praise_num + $comment_praise_num;
  1000. // 回复我的
  1001. $article_all_comment = ArticleComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1002. $article_reply_num = ArticleComment::where([['t.is_deleted','=',0],['t.to_deleted','=',0],['t.user_id','<>',$this->user_id],['t.lev','>=',2],['is_read','=',0],['t.pid','in',implode(',',$article_all_comment)]])->alias('t')->count();
  1003. // 评论我的
  1004. $article_comment_num = ArticleComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['t.user_id','<>',$this->user_id],['t.is_read','=',0],['t.pid','=',0]])
  1005. ->leftJoin('ArticleItem i','t.item_id = i.id')
  1006. ->alias('t')->count();
  1007. // 追更
  1008. $article_follow_num = UserMessage::getUnreadNum($this->user_id,'article',5);
  1009. // 点赞我的
  1010. $all_article = ArticleItem::where('user_id',$this->user_id)->where('is_deleted',0)->column('id');
  1011. $article_praise_num = 0;//ArticleCommentLike::where([['is_read','=',0],['like_id','in',$all_article]])->count();
  1012. $comment_praise_num = 0;//ArticleLike::where([['is_read','=',0],['item_id','in',$article_all_comment]])->count();
  1013. $article_num = $article_reply_num + $article_comment_num + $article_follow_num + $article_praise_num + $comment_praise_num;
  1014. // 评论我的
  1015. $datum_comment_num = DatumComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['t.user_id','<>',$this->user_id],['t.is_read','=',0],['t.pid','=',0]])
  1016. ->leftJoin('DatumUrl i','t.url_id = i.id')
  1017. ->alias('t')->count();
  1018. // 回复我的
  1019. $datum_all_comment = DatumComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1020. $datum_reply_num = DatumComment::where([['t.is_deleted','=',0],['t.to_deleted','=',0],['t.user_id','<>',$this->user_id],['t.lev','>=',2],['t.is_read','=',0],['t.pid','in',implode(',',$datum_all_comment)]])->alias('t')->count();
  1021. // 点赞我的
  1022. $all_datum = DatumUrl::where('user_id',$this->user_id)->where('is_deleted',0)->column('id');
  1023. $datum_praise_num = DatumCommentLike::where([['is_read','=',0],['like_id','in',$all_datum]])->count();
  1024. $comment_praise_num = DatumLike::where([['is_read','=',0],['url_id','in',$datum_all_comment]])->count();
  1025. $follow_num = UserMessage::getUnreadNum($this->user_id,'datum',5);
  1026. $datum_num =$datum_comment_num + $datum_reply_num +$datum_praise_num + $comment_praise_num +$follow_num;
  1027. // 回复我的
  1028. $press_all_comment = PressComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1029. $press_reply_num = PressComment::where([['t.is_deleted','=',0],['t.lev','>=',2],['t.user_id','<>',$this->user_id],['is_read','=',0],['t.pid','in',implode(',',$press_all_comment)]])->alias('t')->count();
  1030. // 评论我的
  1031. $press_comment_num = PressComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['t.is_read','=',0]])
  1032. ->leftJoin('Press i','t.first_id = i.id')
  1033. ->alias('t')->count();
  1034. $press_num = $press_reply_num + $press_comment_num;
  1035. $demand_num = DemandComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['t.is_read','=',0]])
  1036. ->leftJoin('PlatformDemand i','t.first_id = i.id')
  1037. ->alias('t')->count();
  1038. //回答我的
  1039. $answer_num = ForumReply::where([['r.issue_user','=',$this->user_id],['r.is_deleted','=',0],['r.is_read','=',0]])
  1040. ->alias('r')->leftJoin('user_forum a','r.forum_id = a.id')->count();
  1041. // 回复我的
  1042. $forum_all_comment = ForumReplyComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1043. $forum_reply_num = ForumReplyComment::where([['t.is_deleted','=',0],['t.user_id', '<>', $this->user_id],['t.is_read','=',0],['t.pid','in',implode(',',$forum_all_comment)]])->alias('t')->count();
  1044. // 评论我的问题
  1045. $forum_comment = ForumReplyComment::alias('c')
  1046. ->where(['r.user_id' => $this->user_id, 'r.is_deleted' => 0, 'c.is_read' => 0,'c.reply_id'=>0,'c.pid'=>0,'c.to_deleted'=>0])
  1047. ->where('c.user_id','<>',$this->user_id)
  1048. ->leftJoin('UserForum r', 'c.forum_id = r.id')
  1049. ->count();
  1050. // 评论我的回答
  1051. $reply_comment = ForumReplyComment::alias('c')
  1052. ->where(['r.user_id' => $this->user_id, 'r.is_deleted' => 0, 'c.is_read' => 0,'c.pid'=>0,])
  1053. ->leftJoin('forum_reply r', 'c.reply_id = r.id')
  1054. ->count();
  1055. $forum_follow_num = UserMessage::getUnreadNum($this->user_id,'forum',6);
  1056. $forum_num = $answer_num+$forum_reply_num+$forum_comment+$reply_comment+ $forum_follow_num;
  1057. $sys_num = 0;//UserMessage::where(['user_id'=>$this->user_id,'is_deleted'=>0])->where('is_read',0)->count();
  1058. // 供应商
  1059. $supplier_comment_num = SupplierComment::where([['g.user_id', '=', $this->user_id],['c.is_deleted', '=', 0],['c.to_deleted', '=', 0],['c.is_read','=',0],['c.pid','=',0]])
  1060. ->alias('c') ->leftJoin('SupplierGoods g', 'g.id = c.goods_id')->count();
  1061. //回复我的
  1062. $supplier_all_comment = SupplierComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1063. $supplier_reply_num = $supplier_all_comment ? SupplierComment::where([['t.is_deleted','=',0],['t.to_deleted','=',0],['t.user_id','<>',$this->user_id],['t.is_read','=',0],['t.pid','in',implode(',',$supplier_all_comment)]])->alias('t')->count() :0;
  1064. //订阅
  1065. $supplier_follow_num = UserMessage::getUnreadNum($this->user_id,'supplier',5);
  1066. $supplier_num = $supplier_comment_num + $supplier_reply_num + $supplier_follow_num;
  1067. // 活动
  1068. $activity_num = UserMessage::where(['m.user_id'=>$this->user_id,'m.is_deleted'=>0,'m.module'=>'activity','is_read'=>0])->alias('m')->count();;
  1069. $total_num = $video_num + $article_num + $datum_num + $press_num + $demand_num + $forum_num + $supplier_num + $activity_num ;
  1070. $this->success('ok',compact(['video_num','article_num','press_num','demand_num','forum_num','sys_num','datum_num','activity_num','supplier_num','total_num']));
  1071. }
  1072. /**
  1073. * @title 以下接口为二期需求
  1074. * @desc 以下接口为二期需求
  1075. * @author qc
  1076. * @url /api/Expedite/secondPhase
  1077. * @method
  1078. * @return name:1 type:string default:-- desc:以下接口为二期需求
  1079. */
  1080. public function secondPhase(){}
  1081. /**
  1082. * @title 获取平台页面链接
  1083. * @desc 参数自定义!参数自定义!!参数自定义!!!
  1084. * @author qc
  1085. * @url /api/Expedite/getPlatformUrl
  1086. * @method GET
  1087. * @param name:module type:string default:-- desc:模块【video=>视频,article=>图文,datum=>资料,activity=>活动,demand=>需求,forum=>问答,press=>新闻,supplier=>供应商商品,recruit=>招聘,mall=>商城商品】
  1088. * @param name:tag type:string default:-- desc:页面标识【detail=>详情,list=>列表】
  1089. * @param name:from type:string default:-- desc:请求接口来源1:h5,2:ios,3:android
  1090. * @return name:url type:array default:-- desc:链接
  1091. * @return name:desc type:string default:-- desc:页面描述
  1092. * @return name:param type:string default:-- desc:页面参数拼接
  1093. */
  1094. public function getPlatformUrl()
  1095. {
  1096. $request_param = input('get.');
  1097. $module = input('module','activity');
  1098. $tag = input('tag','detail');
  1099. unset($request_param[$module]);
  1100. unset($request_param[$tag]);
  1101. $url = config('platform_url.'.$module)[$tag];
  1102. $this->success('ok',['url'=>$url,'params'=>http_build_query($request_param)]);
  1103. }
  1104. /**
  1105. * @title 获取手机号前缀
  1106. * @desc 获取手机号前缀
  1107. * @author qc
  1108. * @method GET
  1109. * @url /api/Expedite/getPhonePrefix
  1110. * @header name:Authorization require:1 desc:Token
  1111. * @return name:name type:string default:-- desc:名称
  1112. * @return name:code type:string default:-- desc:前缀
  1113. */
  1114. public function getPhonePrefix()
  1115. {
  1116. /*$prefix = [
  1117. ['name' => '中国大陆','code'=>'86'],
  1118. ['name' => '中国香港','code'=>'852'],
  1119. ['name' => '中国澳门','code'=>'853'],
  1120. ['name' => '中国台湾','code'=>'886'],
  1121. ['name' => '韩国','code'=>'82'],
  1122. ['name' => '日本','code'=>'81'],
  1123. ['name' => '美国','code'=>'1'],
  1124. ['name' => '加拿大','code'=>'1'],
  1125. ['name' => '新加坡','code'=>'65'],
  1126. ['name' => '马来西亚','code'=>'62'],
  1127. ['name' => '俄罗斯','code'=>'7'],
  1128. ['name' => '新西兰','code'=>'64'],
  1129. ['name' => '法国','code'=>'33'],
  1130. ['name' => '德国','code'=>'49'],
  1131. ];*/
  1132. $prefix = Db::name('phone_pre')->field('name,code')->where('is_deleted',0)->select();
  1133. $this->success('ok',$prefix);
  1134. }
  1135. /**
  1136. * @title ElasticSearch【登录状态需要header需要传Authorization】
  1137. * @desc ElasticSearch返回参数文档:https://www.elastic.co/guide/en/elasticsearch/reference/master/search-search.html
  1138. * @author qc
  1139. * @url /api/Expedite/ElasticSearch
  1140. * @method GET
  1141. * @param name:page type:int default:-- desc:页数
  1142. * @param name:page_num type:int default:-- desc:每页数量
  1143. * @param name:search type:string default:-- desc:搜索关键词
  1144. * @param name:sort_type type:int default:1 desc:1默认2发布时间正序3发布时间倒序
  1145. * @param name:is_over type:int default:-1 desc:-1全部0未解决1已解决2开源【需求模块用】
  1146. * @param name:city type:string default:-- desc:城市搜索【招聘模块用】
  1147. * @param name:module type:string default:-- desc:搜索类型(不传查全部)[video=>视频,article=>图文,datum=>资料,goods=>商城商品,press=>新闻,supplier_goods=>供应商商品,demand=>需求,recruit=>招聘,forum=>问答,activity=>活动]
  1148. * @return name:highlight type:array default:-- desc:高亮【目前设置三个字段:title、label、desc】
  1149. *
  1150. * @return name:module type:string default:-- desc:模块名
  1151. * @return name:release_time type:string default:-- desc:上架时间
  1152. * @return name:series_id type:int default:-- desc:系列id【视频、图文、资料用】
  1153. * @return name:id type:int default:-- desc:某个模块的详情id【不是系列id】
  1154. * @return name:title type:string default:-- desc:标题或名称
  1155. * @return name:label type:string default:-- desc:标签
  1156. * @return name:label_arr type:array default:-- desc:标签【数组】
  1157. * @return name:desc type:string default:-- desc:描述
  1158. * @return name:desc_text type:string default:-- desc:描述文本【搜索用的,页面展示忽略】
  1159. * @return name:content type:string default:-- desc:内容【富文本】
  1160. * @return name:detail type:string default:-- desc:详情【富文本】
  1161. * @return name:create_at type:string default:-- desc:时间
  1162. * @return name:app_name type:string default:-- desc:发布者
  1163. * @return name:app_logo type:string default:-- desc:发布者头像
  1164. * @return name:read_num type:int default:-- desc:阅读量||播放量【若模块用不到忽略】
  1165. * @return name:comment_num type:int default:-- desc:评论量【若模块用不到忽略】
  1166. * @return name:like_num type:int default:-- desc:点赞量【若模块用不到忽略】
  1167. * @return name:transmit_num type:int default:-- desc:转发量【若模块用不到忽略】
  1168. * @return name:collect_num type:int default:-- desc:收藏量【若模块用不到忽略】
  1169. * @return name:down_num type:int default:-- desc:下载量【若模块用不到忽略】
  1170. * @return name:cover type:string default:-- desc:封面【单张】
  1171. * @return name:is_vip type:int default:-- desc:是否是vip
  1172. *
  1173. * @return name:duration type:string default:-- desc:时长【视频模块】
  1174. * @return name:ali_vid type:int default:-- desc:云点播ID【视频模块】
  1175. *
  1176. * @return name:images_arr type:array default:-- desc:图片【图文】
  1177. * @return name:content_type type:int default:1 desc:1富文本2pdf【图文】
  1178. * @return name:content type:string default:-- desc:内容富文本【图文】
  1179. *
  1180. * @return name:url type:string default:-- desc:资料路径【资料】
  1181. * @return name:is_down type:int default:-- desc:是否允许下载【资料】
  1182. *
  1183. * @return name:browse_num type:string default:-- desc:浏览量【问答】
  1184. * @return name:reply_num type:string default:-- desc:回答量【问答】
  1185. * @return name:level type:string default:-- desc:vip等级id【问答】
  1186. *
  1187. * @return name:start_time type:string default:-- desc:开始时间【活动】
  1188. * @return name:end_time type:string default:-- desc:结束时间【活动】
  1189. *
  1190. * @return name:is_over type:int default:-- desc:0未解决1已解决2开源【需求模块用】
  1191. * @return name:money type:string default:-- desc:金额【需求模块用】
  1192. *
  1193. * @return name:company type:string default:-- desc:公司名称【招聘】
  1194. * @return name:company_intro type:string default:-- desc:公司简介【招聘】
  1195. * @return name:is_ss type:string default:-- desc:是否上市,1上市【招聘】
  1196. * @return name:scale type:string default:-- desc:公司规模(人数)【招聘】
  1197. * @return name:principal type:string default:-- desc:联系人【招聘】
  1198. * @return name:province type:string default:-- desc:省【招聘】
  1199. * @return name:city type:string default:-- desc:市【招聘】
  1200. * @return name:salary type:string default:-- desc:薪资【招聘】
  1201. * @return name:hr_headimg type:string default:-- desc:联系人头像【招聘】
  1202. *
  1203. */
  1204. public function elasticSearch()
  1205. {
  1206. $index = input('index',config('text.es_index'));
  1207. $search = input('search','');
  1208. $module = input('module','');
  1209. $is_over = intval(input('is_over',-1));
  1210. $sort_type = input('sort_type',1);
  1211. $city = input('city');
  1212. //"全部",1=>'视频',2=>'资料',3=>'图文',4=>'新闻',5=>'问答',6=>'商品',7=>'活动',8=>'招聘',9=>'供应商',10=>'供应商商品',11=>'需求'
  1213. // video=>视频,article=>图文,datum=>资料,goods=>商城商品,press=>新闻,supplier_goods=>供应商商品,demand=>需求,recruit=>招聘,forum=>问答,activity=>活动]
  1214. $search_type = [
  1215. 'video'=>"1",
  1216. 'datum'=>"2",
  1217. 'article'=>"3",
  1218. 'press'=>"4",
  1219. 'forum'=>"5",
  1220. 'goods'=>"6",
  1221. 'activity'=>"7",
  1222. 'recruit'=>"8",
  1223. 'supplier'=>"9",
  1224. 'supplier_goods'=>"10",
  1225. 'demand'=>"11",
  1226. ];
  1227. if($search && $this->user_id) UserSearch::saveSearchTitle($this->user_id,$search,isset($search_type[$module]) ?$search_type[$module] :0 );
  1228. switch ($sort_type) {
  1229. case 1:
  1230. $order = $module ? [['_score'=>['order'=>'desc']],['id'=>['order'=>'desc']]] : ['create_at'=>['order'=>'desc']];
  1231. break;
  1232. case 2:
  1233. // $order = $module ? [['id'=>['order'=>'asc']]] : ['create_at'=>['order'=>'asc']];
  1234. $order = $module ? ['create_at'=>['order'=>'asc']] : ['create_at'=>['order'=>'asc']];
  1235. break;
  1236. case 3:
  1237. // $order = $module ? [['id'=>['order'=>'desc']]] : ['create_at'=>['order'=>'desc']];
  1238. $order = $module ? ['create_at'=>['order'=>'desc']] : ['create_at'=>['order'=>'desc']];
  1239. break;
  1240. }
  1241. $user_level = UserLevelRank::getUserVip($this->user_id);
  1242. $sel_level = $user_level ? $user_level : 1;
  1243. $where = [
  1244. 'index'=>$index,
  1245. 'from' => $this->off_set,
  1246. 'size' => $this->page_num,
  1247. 'body'=>[
  1248. 'sort' => $order,
  1249. 'query'=>[
  1250. 'bool'=>[
  1251. 'must'=> [
  1252. // ['match' => ['module'=> $module]],// module = module
  1253. ['match' => ['status'=>1]], // status !=0
  1254. ['match' => ['is_deleted'=> 0]],// is_deleted !=1
  1255. ['range' => ['release_time'=> ['lte'=>time()]]],//
  1256. // ['range' => ['level'=> ['lte'=>$sel_level]]],//
  1257. /* ['bool'=>[
  1258. 'should'=> [
  1259. 'multi_match' => [
  1260. 'fields'=> ['title','label','desc','content','detail'],
  1261. 'query'=> $search,
  1262. "fuzziness"=>"AUTO",
  1263. 'type'=> 'best_fields',
  1264. ]],
  1265. ]]*/
  1266. ],
  1267. ],
  1268. ],
  1269. 'highlight'=>[
  1270. "fields"=>[
  1271. 'title'=>[
  1272. 'pre_tags'=>["<span style='color:#FF6700'>"],
  1273. 'post_tags'=>["</span>"]
  1274. ],
  1275. 'label'=>[
  1276. 'pre_tags'=>["<span style='color:#FF6700'>"],
  1277. 'post_tags'=>["</span>"]
  1278. ],
  1279. 'desc'=>[
  1280. 'pre_tags'=>["<span style='color:#FF6700'>"],
  1281. 'post_tags'=>["</span>"]
  1282. ],
  1283. 'content'=>[
  1284. 'pre_tags'=>["<span style='color:#FF6700'>"],
  1285. 'post_tags'=>["</span>"]
  1286. ],
  1287. 'detail'=>[
  1288. 'pre_tags'=>["<span style='color:#FF6700'>"],
  1289. 'post_tags'=>["</span>"]
  1290. ],
  1291. 'desc_text'=>[
  1292. 'pre_tags'=>["<span style='color:#FF6700'>"],
  1293. 'post_tags'=>["</span>"]
  1294. ],
  1295. ]
  1296. ]
  1297. ]
  1298. ];
  1299. if($module) $where['body']['query']['bool']['must'][] = ['match' =>['module'=> $module]];
  1300. if($module == 'demand' && $is_over != -1 ) $where['body']['query']['bool']['must'][] = ['match' =>['is_over'=> $is_over]];
  1301. if($module == 'recruit' && $city ) $where['body']['query']['bool']['must'][] = ['match' =>['city'=> $city]];
  1302. if($search) $where['body']['query']['bool']['must'][] = ['bool' =>[
  1303. 'should'=> [
  1304. 'multi_match' => [
  1305. 'fields'=> ['title','label','desc','content','detail'],
  1306. 'query'=> $search,
  1307. "fuzziness"=>"AUTO",
  1308. 'type'=> 'best_fields',
  1309. ]]]];
  1310. $list = Elastic::select($index,$where);
  1311. $speak_list= $list['hits']['hits'];
  1312. foreach ($list['hits']['hits'] as &$v)
  1313. {
  1314. $v['_source']['label_arr'] = $v['_source']['label'] ? explode(',',$v['_source']['label']):null;
  1315. $v['_source']['create_at'] = date("Y-m-d",$v['_source']['create_at']);
  1316. $v['_source']['release_time'] = date("Y-m-d",$v['_source']['release_time']);
  1317. $v['_source']['is_over'] = isset($v['_source']['is_over']) ? intval($v['_source']['is_over']) : 0;
  1318. switch ($v['_source']['module']) {
  1319. case "video":
  1320. $info = VideoUrl::field('is_vip,cover,duration,ali_vid,read_num,video_id')->where('id',$v['_source']['id'])->find()->toArray();
  1321. $v['_source']['series_id'] = $info['video_id'];
  1322. $v['_source']['cover'] = $info['cover'];
  1323. $v['_source']['is_vip'] = $info['is_vip'];
  1324. $v['_source']['duration'] = $info['duration'];
  1325. $v['_source']['ali_vid'] = $info['ali_vid'];
  1326. $v['_source']['read_num'] = numTransform($info['read_num']);
  1327. $info_auth = VideoUrl::getVideoAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1328. $v['_source']['app_name'] = $info_auth['app_name'];
  1329. $v['_source']['app_logo'] = $info_auth['app_logo'];
  1330. break;
  1331. case "article":
  1332. // var_dump($v['_source']['id']);
  1333. // var_dump($v);
  1334. $info = ArticleItem::field('images,is_vip,cover,read_num,article_id,pdf,content_type')
  1335. ->where('id',$v['_source']['id'])->find();
  1336. $info = $info->toArray();
  1337. $v['_source']['series_id'] = $info['article_id'];
  1338. $v['_source']['cover'] = $info['cover'];
  1339. $v['_source']['is_vip'] = $info['is_vip'];
  1340. $v['_source']['pdf'] = $info['pdf'];
  1341. $v['_source']['content_type'] = $info['content_type'];
  1342. $v['_source']['read_num'] = numTransform($info['read_num']);
  1343. $v['_source']['images_arr'] = $info['images']?explode('|',$info['images']):null;
  1344. $info_auth = ArticleItem::getArticleAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1345. $v['_source']['app_name'] = $info_auth['app_name'];
  1346. $v['_source']['app_logo'] = $info_auth['app_logo'];
  1347. break;
  1348. case "datum":
  1349. $info = DatumUrl::field('is_vip,read_num,down_num,url,is_down,datum_id')->where('id',$v['_source']['id'])->find()->toArray();
  1350. $v['_source']['series_id'] = $info['datum_id'];
  1351. $v['_source']['is_vip'] = $info['is_vip'];
  1352. $v['_source']['read_num'] = numTransform($info['read_num']);
  1353. $v['_source']['down_num'] = numTransform($info['down_num']);
  1354. $v['_source']['url'] = $info['url'];
  1355. $v['_source']['is_down'] = $info['is_down'];
  1356. $info_auth = DatumUrl::getDatumAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1357. $v['_source']['app_name'] = $info_auth['app_name'];
  1358. $v['_source']['app_logo'] = $info_auth['app_logo'];
  1359. break;
  1360. case 'forum':
  1361. $info_auth = UserForum::getAuthInfo($v['_source']['user_id'],APPNAME,APPLOGO);
  1362. $v['_source']['app_name'] = $info_auth['app_name'];
  1363. $v['_source']['app_logo'] = $info_auth['app_logo'];
  1364. $reply_num = ForumReply::where('forum_id', $v['_source']['id'])->where('is_deleted', 0)->count();
  1365. $v['_source']['reply_num'] = numTransform( $reply_num);
  1366. $forum_info = UserForum::where('id',$v['_source']['id'])->find()->toArray();
  1367. $v['_source']['browse_num'] = numTransform( $forum_info['browse_num']);
  1368. break;
  1369. case 'activity':
  1370. $auth_info = \app\common\model\Activity::getAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1371. $v['_source']['app_name'] = $auth_info['app_name'];
  1372. $v['_source']['app_logo'] = $auth_info['app_logo'];
  1373. $info = \app\common\model\Activity::where('id',$v['_source']['id'])->find()->toArray();
  1374. $v['_source']['start_time'] = $info['start_time'];
  1375. $v['_source']['end_time'] = $info['end_time'];
  1376. $v['_source']['cover'] = $info['cover'];
  1377. $v['_source']['read_num'] = numTransform($info['read_num']);
  1378. break;
  1379. case 'supplier_goods':
  1380. $info = SupplierGoods::where('id',$v['_source']['id'])->find()->toArray();
  1381. $auth_info = SupplierGoods::getAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1382. $v['_source']['app_name'] = $auth_info['app_name'];
  1383. $v['_source']['app_logo'] = $auth_info['app_logo'];
  1384. $v['_source']['read_num'] = numTransform($info['read_num']);
  1385. $v['_source']['cover'] = $info['cover'];
  1386. break;
  1387. case 'press':
  1388. $info = \app\common\model\Press::where('id',$v['_source']['id'])->find()->toArray();
  1389. $auth_info = SupplierGoods::getAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1390. $v['_source']['app_name'] = $auth_info['app_name'];
  1391. $v['_source']['app_logo'] = $auth_info['app_logo'];
  1392. $v['_source']['read_num'] = numTransform($info['read_num']);
  1393. $images_arr = $info['images'] ? explode('|',$info['images']) : null;
  1394. $v['_source']['cover'] = $images_arr ? $images_arr[0] : null;
  1395. break;
  1396. case 'demand':
  1397. $info = PlatformDemand::where('id',$v['_source']['id'])->find()->toArray();
  1398. $auth_info = PlatformDemand::getAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1399. $v['_source']['app_name'] = $auth_info['app_name'];
  1400. $v['_source']['app_logo'] = $auth_info['app_logo'];
  1401. $v['_source']['read_num'] = numTransform($info['read_num']);
  1402. $images_arr = $info['images'] ? explode('|',$info['images']) : null;
  1403. $v['_source']['cover'] = $info['cover'];
  1404. $v['_source']['money'] = $info['money'];
  1405. break;
  1406. case 'recruit':
  1407. $info = \app\common\model\Recruit::where('id',$v['_source']['id'])->find()->toArray();
  1408. $auth_info = \app\common\model\Recruit::getAuth($v['_source']['user_id'],APPNAME,APPLOGO);
  1409. $v['_source']['app_name'] = $auth_info['app_name'];
  1410. $v['_source']['app_logo'] = $auth_info['app_logo'];
  1411. $v['_source']['scale'] = $info['scale'];
  1412. $v['_source']['is_ss'] = $info['is_ss'];
  1413. $v['_source']['company'] = $info['company'];
  1414. $v['_source']['company_intro'] = $info['company_intro'];
  1415. $v['_source']['province'] = $info['province'];
  1416. $v['_source']['salary'] = $info['salary'];
  1417. $v['_source']['city'] = $info['city'];
  1418. $v['_source']['principal'] = $info['principal'];
  1419. $v['_source']['hr_headimg'] = $info['hr_headimg'];
  1420. break;
  1421. }
  1422. }
  1423. $this->success('ok',['list'=>$list,'total_count'=>$list['hits']['total']['value'],'page_num'=>$this->page_num]);
  1424. }
  1425. /**
  1426. * @title 获取DRM无法播放机型
  1427. * @desc 获取DRM无法播放机型
  1428. * @author qc
  1429. * @url /api/Expedite/getBanPhoneModel
  1430. * @method GET
  1431. */
  1432. public function getBanPhoneModel()
  1433. {
  1434. $list = Db::name('ban_phone_model')->where('is_deleted',0)->column('name');
  1435. $this->success('ok',$list);
  1436. }
  1437. /**
  1438. * @title 获取各个模块背景图
  1439. * @desc 获取各个模块背景图
  1440. * @author qc
  1441. * @url /api/Expedite/getModuleBgImages
  1442. * @method GET
  1443. * @return name:activity type:string default:-- desc:活动
  1444. * @return name:video type:string default:-- desc:视频
  1445. * @return name:datum type:string default:-- desc:资料
  1446. * @return name:forum type:string default:-- desc:问答
  1447. * @return name:article type:string default:-- desc:图文
  1448. * @return name:supplier type:string default:-- desc:供应商
  1449. */
  1450. public function getModuleBgImages()
  1451. {
  1452. $list = [
  1453. 'activity' => 'https://gaoyixia.oss-cn-hangzhou.aliyuncs.com/images/activity.png',// 活动
  1454. 'video' => 'https://gaoyixia.oss-cn-hangzhou.aliyuncs.com/images/video.png',// 视频
  1455. 'datum' => 'https://gaoyixia.oss-cn-hangzhou.aliyuncs.com/images/datum.png',//资料
  1456. 'forum' => 'https://gaoyixia.oss-cn-hangzhou.aliyuncs.com/images/forum.png',// 问答
  1457. 'article' => 'https://gaoyixia.oss-cn-hangzhou.aliyuncs.com/images/article.png',// 图文
  1458. 'supplier' => 'https://gaoyixia.oss-cn-hangzhou.aliyuncs.com/images/supplier.png',// 供应商
  1459. ];
  1460. $this->success('ok',$list);
  1461. }
  1462. }