Article.php 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\model\ArticleCate;
  4. use app\common\model\ArticleComment;
  5. use app\common\model\ArticleCommentLike;
  6. use app\common\model\ArticleIntro;
  7. use app\common\model\ArticleItem;
  8. use app\common\model\ArticleLike;
  9. use app\common\model\PlatformSwitch;
  10. use app\common\model\SeriesArticleCate;
  11. use app\common\model\User;
  12. use app\common\model\UserCollect;
  13. use app\common\model\UserArticle;
  14. use app\common\model\UserLearn;
  15. use app\common\model\UserMessage;
  16. use app\common\model\UserSearch;
  17. use app\common\model\UserTag;
  18. use app\common\model\UserTrack;
  19. use app\common\service\CheckPower;
  20. use library\tools\Data;
  21. use think\Db;
  22. /**
  23. * @title 图文
  24. * @controller Article
  25. * @group base
  26. */
  27. class Article extends Base
  28. {
  29. // 需要登录的
  30. protected $need_login = [
  31. 'articleTransmit',
  32. 'articleRead',
  33. 'articleTags',
  34. 'articleComment',
  35. 'delComment',
  36. 'secondCommend',
  37. 'commentTags',
  38. 'articleCollect',
  39. 'userReferArticle',
  40. 'getMyArticleList',
  41. 'getUserArticleDetail',
  42. 'delUserArticle',
  43. 'delComment',
  44. 'getLearnHistory',
  45. 'getArticleCollect',
  46. 'getCommentArticle',
  47. 'commentMyArticle',
  48. 'getPurchaseArticle',
  49. 'getReplyArticle',
  50. 'getReplyComment',
  51. 'getTagsArticle',
  52. 'getBoundList',
  53. 'getFollowUpList',
  54. ];
  55. public function initialize()
  56. {
  57. parent::initialize();
  58. parent::setUid();
  59. }
  60. /**
  61. * @title 图文接口说明
  62. * @desc 图文接口说明
  63. * @author qc
  64. * @url /api/Article/classIntro
  65. * @method GET
  66. * @return name:1 type:string default:-- desc:图片(images字段)多图片都用竖线(|)隔开,会员上传多张也用(|)隔开
  67. * @return name:2 type:string default:-- desc:cover字段值是images的第一个路径【非多张】
  68. * @return name:3 type:string default:-- desc:单一图文与系列图文区别,type值(1是单一,2是系列),数据:item_list二维数组数据数量不一样(单一的只有一个,系列的可以是多个)【可以将单一图文看做只有一条记录的系列图文!!!!】
  69. * @return name:4 type:string default:-- desc:单一图文详情的字段(cover,images,is_vip,title)与item_list数组的第一个同字段名的值相同
  70. * @return name:5 type:string default:-- desc:系列图文详情的字段(cover,images)与item_list的其中一个相同
  71. * @return name:6 type:string default:-- desc:关于是否的字段(0否,1是)
  72. * @return name:7 type:string default:-- desc:item_id是数组item_list下的id
  73. */
  74. public function classIntro(){}
  75. /**
  76. * @title 获取图文分类
  77. * @desc 获取图文分类
  78. * @author qc
  79. * @url /api/Article/getArticleCate
  80. * @method GET
  81. * @header name:Authorization require:1 desc:Token
  82. * @param name:type type:int default:1 desc:类型1单个2系列
  83. * @return name:id type:int default:-- desc:分类id
  84. * @return name:logo type:string default:-- desc:图标
  85. * @return name:title type:string default:0 desc:分类名称
  86. * @return name:children type:array default:0 desc:下级分类
  87. */
  88. public function getArticleCate()
  89. {
  90. $type = input('type',1);
  91. if($type == 1) {
  92. $list = ArticleCate::where(['is_deleted'=>0,'status'=>1])->field('id,logo,title,pid')->order('sort desc,id asc')->select()->toArray();
  93. }else{
  94. $list = SeriesArticleCate::where(['is_deleted'=>0,'status'=>1])->field('id,logo,title,pid')->order('sort desc,id asc')->select()->toArray();
  95. }
  96. $list = make_tree($list);
  97. $this->success('ok',['list'=>$list]);
  98. }
  99. /**
  100. * @title 图文推荐
  101. * @desc 图文推荐
  102. * @author qc
  103. * @method GET
  104. * @url /api/Article/getRecommendList
  105. * @header name:Authorization require:1 desc:Token
  106. * @param name:page type:int default:0 desc:页数
  107. * @param name:page_num type:int default:20 desc:每页数
  108. * @return name:id type:string default:-- desc:图文item_id
  109. * @return name:title type:string default:-- desc:标题
  110. * @return name:article_id type:string default:-- desc:系列id
  111. * @return name:cover type:string default:-- desc:封面
  112. * @return name:images_arr type:string default:-- desc:图片
  113. * @return name:is_vip type:int default:-- desc:是否是vip(0否,1是)
  114. * @return name:read_num type:int default:-- desc:阅读量
  115. * @return name:app_name type:string default:-- desc:平台名称
  116. * @return name:app_logo type:string default:-- desc:平台头像
  117. * @return name:author type:string default:-- desc:原创作者
  118. */
  119. public function getRecommendList()
  120. {
  121. $app_name = sysconf('app_name');
  122. $app_logo = sysconf('app_logo');
  123. $search_log = UserSearch::getSearchTitle($this->user_id,2);
  124. $search_arr = [];
  125. $where_str = 'b.id > 0';
  126. foreach ($search_log as $t){
  127. $search_arr[] = " b.title like '".'%'.$t."%'" .' ';
  128. $search_arr[] = " b.label like '".'%'.$t."%'" .' ';
  129. }
  130. if(!empty($search_arr)) $where_str = implode(' OR ',$search_arr);
  131. $field = ' a.id,a.title,a.cover,a.images,a.user_id,a.is_vip,a.read_num,a.article_id ,a.author,IFNULL(is_recommend,0) is_recommend ';
  132. $table = 'dd_article_item';
  133. $order_by_two = 'a.read_num';
  134. $sql = "SELECT $field FROM " .$table . " a LEFT JOIN ( SELECT id,IF(id,1,1) is_recommend FROM $table b WHERE ( $where_str )) AS c ON c.id = a.id LEFT JOIN dd_article_intro as k ON k.id = a.article_id WHERE a.is_deleted = 0 AND a.status =1 AND k.status = 1 AND k.is_deleted = 0 ORDER BY is_recommend DESC , $order_by_two desc LIMIT {$this->off_set},{$this->page_num}";
  135. $list = Db::query($sql);
  136. array_walk($list,function (&$v,$k)use ($app_name,$app_logo){
  137. $v['read_num'] = numTransform($v['read_num']);
  138. if(!$v['user_id']){
  139. $v['app_name'] = $app_name;
  140. $v['app_logo'] = $app_logo;
  141. }else{
  142. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  143. $v['app_name'] = $user_info ? $user_info->name : '';
  144. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  145. }
  146. $v['images_arr'] = $v['images'] ? explode('|',$v['images']):null;
  147. });
  148. $this->success('ok',['list'=>$list]);
  149. }
  150. /**
  151. * @title 获取图文列表(平台发布)
  152. * @desc 获取图文列表
  153. * @author qc
  154. * @method GET
  155. * @url /api/Article/getArticleList
  156. * @header name:Authorization require:1 desc:Token
  157. * @param name:type type:int default:0 desc:类型1单个2系列
  158. * @param name:is_tj type:int default:0 desc:是否推荐0否1是
  159. * @param name:title type:string default:-- desc:标题
  160. * @param name:page type:int default:0 desc:页数
  161. * @param name:page_num type:int default:20 desc:每页数
  162. * @param name:sort_type type:int default:1 desc:1默认2时间升序3时间降序
  163. * @param name:first_classify type:int default:0 desc:一级分类
  164. * @param name:second_classify type:int default:0 desc:二级分类
  165. * @return name:id type:string default:-- desc:ID[请求/api/Article/getArticleDetail用]
  166. * @return name:title type:string default:-- desc:标题
  167. * @return name:type type:int default:0 desc:类型1单个2系列
  168. * @return name:cover type:string default:-- desc:封面()
  169. * @return name:is_vip type:int default:-- desc:是否是vip(0否,1是)
  170. * @return name:is_over type:int default:-- desc:是否完结(0否,1是)
  171. * @return name:read_num type:int default:-- desc:阅读量
  172. * @return name:label type:string default:-- desc:标签
  173. * @return name:item_list type:array default:-- desc:图文
  174. * @return name:item_list.title type:string default:-- desc:图文标题
  175. * @return name:item_list.is_vip type:int default:-- desc:是否是vip
  176. * @return name:item_list.cover type:string default:-- desc:图文封面
  177. * @return name:item_list.images type:string default:-- desc:图片(多张用|隔开)
  178. * @return name:item_list.content type:string default:-- desc:内容
  179. * @return name:item_list.app_name type:string default:-- desc:发布方名称
  180. * @return name:item_list.app_logo type:string default:-- desc:发布方头像
  181. * @return name:item_list.content_type type:int default:1 desc:1富文本2pdf
  182. * @return name:item_list.pdf type:string default:-- desc:pdf文件路径
  183. */
  184. public function getArticleList()
  185. {
  186. $sel_where = [];
  187. $title = input('get.title');
  188. $type = input('get.type',0);
  189. $is_tj = input('get.is_tj',0);
  190. $sort_type = input('get.sort_type',1);
  191. $first_classify = input('get.first_classify');
  192. $second_classify = input('get.second_classify');
  193. $sel_where[] = ['is_deleted','=',0];
  194. $sel_where[] = ['status','=',1];
  195. $sel_where[] = ['item_num','>',0];
  196. if($title) $sel_where[] = ['title|label','like','%'.$title.'%'];
  197. if($type) $sel_where[] = ['type','=',$type];
  198. if($first_classify) $sel_where[] = ['first_classify','=',$first_classify];
  199. if($second_classify) $sel_where[] = ['second_classify','=',$second_classify];
  200. switch ($sort_type) {
  201. case 1:
  202. $order = ['sort'=>'desc','read_num'=>'desc'];
  203. break;
  204. case 2:
  205. $order = ['id'=>'asc','sort'=>'desc'];
  206. break;
  207. case 3:
  208. $order = ['id'=>'desc','sort'=>'desc'];
  209. break;
  210. }
  211. if($title && $this->user_id)UserSearch::saveSearchTitle($this->user_id,$title,2);
  212. $where_str = 'id > 0';
  213. if($is_tj) {
  214. $search_log = UserSearch::getSearchTitle($this->user_id,2);
  215. $search_arr = [];
  216. foreach ($search_log as $t){
  217. $search_arr[] = " title like '".'%'.$t."%'" .' ';
  218. }
  219. if(!empty($search_arr)) $where_str = implode(' OR ',$search_arr);
  220. }
  221. $list = ArticleIntro::where($sel_where)->with('itemList')
  222. ->limit($this->off_set,$this->page_num)
  223. ->where($where_str)
  224. ->order($order)
  225. ->select()->toArray();
  226. $app_name = sysconf('app_name');
  227. $app_logo = sysconf('app_logo');
  228. array_walk($list,function (&$v,$k)use ($app_name,$app_logo){
  229. $v['read_num']= array_sum(array_column($v['item_list'],'read_num'));
  230. $v['read_num'] = numTransform($v['read_num']);
  231. unset($v['content']);
  232. foreach ($v['item_list'] as &$iv) {
  233. unset($iv['content']);
  234. $iv['read_num'] = numTransform($iv['read_num']);
  235. if(!$iv['user_id']){
  236. $iv['app_name'] = $app_name;
  237. $iv['app_logo'] = $app_logo;
  238. }else{
  239. $user_info = User::where('id',$iv['user_id'])->field('name,headimg')->find();
  240. $iv['app_name'] = $user_info ? $user_info->name : '';
  241. $iv['app_logo'] = $user_info ? $user_info->headimg : '';
  242. }
  243. }
  244. });
  245. $this->success('ok',['list'=>$list]);
  246. }
  247. /**
  248. * @title 获取图文详情(平台)
  249. * @desc 获取图文详情
  250. * @author qc
  251. * @method GET
  252. * @url /api/Article/getArticleDetail
  253. * @header name:Authorization require:1 desc:Token
  254. * @param name:id type:int default:0 desc:图文id
  255. * @param name:from type:string default:APP desc:请求来源(APP或H5)
  256. * @return name:title type:string default:-- desc:标题
  257. * @return name:cover type:string default:-- desc:封面
  258. * @return name:images type:string default:-- desc:图片
  259. * @return name:is_vip type:string default:-- desc:是否VIP
  260. * @return name:item_list type:array default:-- desc:图文
  261. * @return name:item_list.id type:string default:-- desc:[请求/api/Article/getArticleItemInfo用,请求图文模块其他接口参数:item_id]
  262. * @return name:item_list.title type:string default:-- desc:图文标题
  263. * @return name:item_list.is_vip type:int default:-- desc:是否是vip
  264. * @return name:item_list.cover type:string default:-- desc:封面
  265. * @return name:item_list.images type:int default:-- desc:图片
  266. * @return name:item_list.content type:int default:-- desc:内容
  267. * @return name:item_list.transmit_num type:int default:-- desc:转发量
  268. * @return name:item_list.read_num type:int default:-- desc:阅读量
  269. * @return name:item_list.comment_num type:int default:-- desc:评论量
  270. * @return name:item_list.collect_num type:int default:-- desc:收藏量
  271. * @return name:item_list.is_collect type:int default:-- desc:是否收藏
  272. * @return name:item_list.video_id type:int default:-- desc:关联视频id【单个id||系列id】
  273. * @return name:item_list.video_item type:int default:-- desc:关联视频详情id【video_arr.id】
  274. * @return name:item_list.datum_id type:int default:-- desc:资料id【单个id||系列id】
  275. * @return name:item_list.datum_item type:int default:-- desc:资料详情id【url_arr.id】
  276. * @return name:item_list.author type:string default:-- desc:原创作者
  277. * @return name:item_list.content_type type:int default:1 desc:1富文本2pdf
  278. * @return name:item_list.pdf type:string default:-- desc:pdf文件路径
  279. */
  280. public function getArticleDetail()
  281. {
  282. $form = input('get.from','H5');
  283. $sel_where = [];
  284. $sel_where[] = ['id','=',input('get.id')];
  285. $detail = ArticleIntro::where($sel_where)->with('itemList')->find()->toArray();
  286. if($detail['is_deleted'] == 1 || $detail['status'] == 0)$this->error('该图文已下线');
  287. if($form == 'H5') $detail['content'] = openssl_encrypt($detail['content'],'DES-ECB',123456,0);
  288. $detail['read_num'] = array_sum(array_column($detail['item_list'],'read_num'));
  289. $detail['read_num'] = numTransform($detail['read_num']);
  290. foreach ($detail['item_list'] as &$dv) {
  291. if($form == 'H5') $dv['content'] = openssl_encrypt($dv['content'],'DES-ECB',123456,0);
  292. $dv['comment_num'] = ArticleComment::where(['article_id'=>$detail['id'],'item_id'=>$dv['id']])->count();
  293. $dv['comment_num'] = numTransform($dv['comment_num']);
  294. $dv['collect_num'] = UserCollect::where(['coll_type'=>3,'coll_id'=>$detail['id'],'children_id'=>$dv['id']])->count();
  295. $dv['comment_num'] = numTransform($dv['collect_num']);
  296. $dv['transmit_num'] = numTransform($dv['transmit_num']);
  297. $dv['is_collect'] = UserCollect::checkCollectByType($this->user_id,3,$detail['id'],$dv['id']);
  298. $dv['read_num'] = numTransform($dv['read_num']);
  299. }
  300. $this->success('ok',['detail'=>$detail]);
  301. }
  302. /**
  303. * @title 获取图文ITEM详情(平台)
  304. * @desc 获取图文ITEM详情
  305. * @author qc
  306. * @method GET
  307. * @url /api/Article/getArticleItemInfo
  308. * @header name:Authorization require:1 desc:Token
  309. * @param name:item_id type:int default:0 desc:item_list
  310. * @param name:from type:string default:APP desc:请求来源(APP或H5)
  311. * @return name:title type:string default:-- desc:图文标题
  312. * @return name:is_vip type:int default:-- desc:是否是vip
  313. * @return name:cover type:string default:-- desc:封面
  314. * @return name:images type:int default:-- desc:图片
  315. * @return name:content type:int default:-- desc:内容
  316. * @return name:transmit_num type:int default:-- desc:转发量
  317. * @return name:read_num type:int default:-- desc:阅读量
  318. * @return name:comment_num type:int default:-- desc:评论量
  319. * @return name:collect_num type:int default:-- desc:收藏量
  320. * @return name:is_collect type:int default:-- desc:是否收藏
  321. * @return name:like_num type:int default:-- desc:点赞量
  322. * @return name:is_like type:int default:-- desc:是否点赞
  323. * @return name:video_id type:int default:-- desc:关联视频id【单个id||系列id】
  324. * @return name:video_item type:int default:-- desc:关联视频详情id【video_arr.id】
  325. * @return name:datum_id type:int default:-- desc:资料id【单个id||系列id】
  326. * @return name:datum_item type:int default:-- desc:资料详情id【url_arr.id】
  327. * @return name:author type:string default:-- desc:原创作者
  328. * @return name:content_type type:int default:1 desc:1富文本2pdf
  329. * @return name:pdf type:string default:-- desc:pdf文件路径
  330. */
  331. public function getArticleItemInfo()
  332. {
  333. $item_id = input('get.item_id');
  334. $form = input('get.from','H5');
  335. $detail = ArticleItem::field('a.*,t.is_deleted td,t.status tus')->where('a.id',$item_id)->alias('a')->leftJoin('ArticleIntro t','t.id= a.article_id')->find()->toArray();
  336. if($detail['is_deleted'] == 1 || $detail['status'] == 0 || $detail['td'] == 1 || $detail['tus']==0) $this->error('图文已下架');
  337. $detail['comment_num'] = ArticleComment::where(['article_id'=>$detail['article_id'],'item_id'=>$detail['id']])->count();
  338. $detail['collect_num'] = UserCollect::where(['coll_type'=>3,'coll_id'=>$detail['article_id'],'children_id'=>$detail['id']])->count();
  339. $detail['is_collect'] = UserCollect::checkCollectByType($this->user_id,3,$detail['article_id'],$detail['id']);
  340. $detail['is_like'] = ArticleLike::where(['user_id'=>$this->user_id,'article_id'=>$detail['article_id'],'item_id'=>$detail['id']])->count();
  341. if($form == 'H5') $detail['content'] = openssl_encrypt($detail['content'],'DES-ECB',123456,0);
  342. $detail['like_num'] = ArticleLike::where(['article_id'=>$detail['article_id'],'item_id'=>$detail['id']])->count();
  343. $detail['like_num'] = numTransform($detail['like_num']);
  344. $detail['read_num'] = numTransform($detail['read_num']);
  345. $detail['comment_num'] = numTransform($detail['comment_num']);
  346. $detail['collect_num'] = numTransform($detail['collect_num']);
  347. $detail['transmit_num'] = numTransform($detail['transmit_num']);
  348. UserTrack::crateTrack($this->user_id,3,$detail['article_id'],$item_id);
  349. //var_dump($this->user_id,3,$detail['article_id'],$item_id);
  350. $this->success('ok',['detail'=>$detail]);
  351. }
  352. /**
  353. * @title 获取图文评论列表
  354. * @desc 获取图文评论列表
  355. * @author qc
  356. * @method GET
  357. * @url /api/Article/getArticleCommentList
  358. * @header name:Authorization require:1 desc:Token
  359. * @param name:article_id type:int default:-- desc:图文id
  360. * @param name:item_id type:int default:-- desc:item_id
  361. * @param name:sort_type type:int default:1 desc:排序1默认2时间升序3时间降序
  362. * @param name:page type:int default:-- desc:页数
  363. * @return name:name type:string default:-- desc:会员名称
  364. * @return name:headimg type:string default:-- desc:会员头像
  365. * @return name:content type:string default:-- desc:内容
  366. * @return name:parent type:array default:-- desc:评论上一级(数据同上【一维数组】)
  367. * @return name:children type:array default:-- desc:二级评论(数据同上【二维数组】)
  368. * @return name:like_num type:int default:-- desc:点赞数量
  369. * @return name:is_like type:int default:-- desc:是否点赞(0否1是)
  370. * @return name:can_delete type:int default:-- desc:是否可以删除(0否1是)
  371. * @return name:total_num type:int default:-- desc:总评论数(仅一级)
  372. */
  373. public function getArticleCommentList()
  374. {
  375. $where = [];
  376. $where[] = ['c.article_id','=',input('get.article_id')];
  377. $where[] = ['c.is_deleted','=',0];
  378. $user_id = $this->user_id;
  379. $sort_type= input('sort_type',1);
  380. if(input('get.item_id')) $where[] = ['c.item_id','=',input('get.item_id')];
  381. switch ($sort_type) {
  382. case 1:
  383. $order = ['sort'=>'desc','id'=>'asc'];
  384. break;
  385. case 2:
  386. $order = ['id'=>'asc','sort'=>'desc'];
  387. break;
  388. case 3:
  389. $order = ['id'=>'desc','sort'=>'desc'];
  390. break;
  391. }
  392. $list =ArticleComment::where($where)
  393. ->alias('c')
  394. ->field('c.*,u.name,u.headimg')
  395. ->leftJoin('store_member u','u.id = c.user_id')
  396. ->order($order)
  397. ->limit($this->off_set,$this->page_num)
  398. ->select()->toArray();
  399. array_walk($list,function (&$val,$k)use($user_id){
  400. $children = ArticleComment::where(['c.pid'=>$val['id'],'c.is_deleted'=>0])
  401. ->alias('c')->field('c.*,u.name,u.headimg')
  402. ->leftJoin('store_member u','u.id = c.user_id')
  403. ->order('c.id asc')
  404. ->select()->toArray();
  405. $val['children'] = $children;
  406. $val['like_num'] = ArticleCommentLike::where('like_id',$val['id'])->count();
  407. $val['like_num'] = numTransform($val['like_num']);
  408. $val['is_like'] = ArticleCommentLike::where(['like_id'=>$val['id'],'user_id'=>$user_id])->count();
  409. $parent = ArticleComment::where(['c.id'=>$val['pid'],'c.is_deleted'=>0])
  410. ->alias('c')->field('c.*,u.name,u.headimg')
  411. ->leftJoin('store_member u','u.id = c.user_id')
  412. ->find();
  413. $val['parent'] = $parent ? $parent->toArray() : null;
  414. $val['can_delete'] = $val['user_id'] == $this->user_id ? 1 :0;
  415. });
  416. $total_num = ArticleComment::where($where)->alias('c')->count();
  417. $this->success('ok',['list'=>$list,'total_num'=>numTransform($total_num)]);
  418. }
  419. /**
  420. * @title 以下接口调用验证登录【需要header传Authorization】
  421. * @desc 转发成功后调用
  422. * @author qc
  423. * @method
  424. * @url /api/Article/needLogin()
  425. */
  426. public function needLogin(){}
  427. /**
  428. * @title 图文转发(转发数量统计)
  429. * @desc 转发成功后调用
  430. * @author qc
  431. * @method POST
  432. * @url /api/Article/articleTransmit
  433. * @header name:Authorization require:1 desc:Token
  434. * @param name:item_id type:int default:-- desc:item_list的id
  435. */
  436. public function articleTransmit()
  437. {
  438. $item_id = input('post.item_id',0);
  439. ArticleItem::where('id',$item_id)->setInc('transmit_num');
  440. $this->success('ok');
  441. }
  442. /**
  443. * @title 图文阅读(阅读数量统计)
  444. * @desc 图文阅读
  445. * @author qc
  446. * @method POST
  447. * @url /api/Article/articleRead
  448. * @header name:Authorization require:1 desc:Token
  449. * @param name:item_id type:int default:-- desc:item_list的id
  450. */
  451. public function articleRead()
  452. {
  453. $item_id = input('post.item_id',0);
  454. $article_id = ArticleItem::where('id',$item_id)->value('article_id');
  455. ArticleItem::where('id',$item_id)->setInc('read_num');
  456. ArticleIntro::where('id',$article_id)->setInc('read_num');
  457. $this->success('ok');
  458. }
  459. /**
  460. * @title 图文点赞||取消点赞
  461. * @desc 点赞||取消点赞
  462. * @author qc
  463. * @method POST
  464. * @url /api/Article/articleTags
  465. * @header name:Authorization require:1 desc:Token
  466. * @param name:article_id type:int default:1 desc:图文id
  467. * @param name:item_id type:int default:1 desc:item_id
  468. * @return name:tags type:int default:1 desc:0取消成功,1点赞成功
  469. */
  470. public function articleTags()
  471. {
  472. $article_id = input('post.article_id');
  473. $item_id = input('post.item_id');
  474. $ret_val = 0;
  475. $check_tags = ArticleLike::where(['user_id'=>$this->user_id,'article_id'=>$article_id,'item_id'=>$item_id])->value('id');
  476. if($check_tags) {
  477. ArticleLike::where(['user_id'=>$this->user_id,'article_id'=>$article_id,'item_id'=>$item_id])->delete();
  478. }else{
  479. Data::save('ArticleLike',
  480. ['user_id'=>$this->user_id,'article_id'=>$article_id,'item_id'=>$item_id],'user_id',
  481. ['user_id'=>$this->user_id,'article_id'=>$article_id,'item_id'=>$item_id]);
  482. $ret_val = 1;
  483. }
  484. $this->success($ret_val == 1 ?'点赞成功':'取消成功',['tags'=>$ret_val]);
  485. }
  486. /**
  487. * @title 图文评论
  488. * @desc 图文评论
  489. * @author qc
  490. * @method POST
  491. * @url /api/Article/articleComment
  492. * @header name:Authorization require:1 desc:Token
  493. * @param name:article_id type:int default:1 desc:图文id
  494. * @param name:item_id type:int default:1 desc:item_id
  495. * @param name:content type:string default:-- desc:内容
  496. * @return name:name type:string default:-- desc:会员名称
  497. * @return name:headimg type:string default:-- desc:会员头像
  498. * @return name:content type:string default:-- desc:内容
  499. */
  500. public function articleComment()
  501. {
  502. $article_id = input('post.article_id');
  503. $item_id = input('post.item_id');
  504. $content = input('post.content',0);
  505. if(!$content) $this->error('请输入评论内容');
  506. $res = ArticleComment::create(['user_id'=>$this->user_id,'content'=>$content,'article_id'=>$article_id,'item_id'=>$item_id]);
  507. $detail =ArticleComment::where('c.id',$res->id)
  508. ->alias('c')
  509. ->field('c.id,c.content,c.create_at,u.name,u.headimg')
  510. ->leftJoin('store_member u','u.id = c.user_id')
  511. ->find()->toArray();
  512. $send_user = ArticleItem::where('id',$item_id)->value('user_id');
  513. $user_info = $this->userInfo('name');
  514. if($send_user) UserMessage:: sendUserMessage($send_user,'article',4,0,$this->user_id,$item_id,$user_info['name'].'评论了您的图文');
  515. $this->success('评论成功',['detail'=>$detail]);
  516. }
  517. /**
  518. * @title 删除评论
  519. * @desc 删除评论
  520. * @author qc
  521. * @method POST
  522. * @url /api/Article/delComment
  523. * @header name:Authorization require:1 desc:Token
  524. * @param name:id type:int default:1 desc:评论id
  525. */
  526. public function delComment(){
  527. ArticleComment::where(['id'=>input('post.id'),'user_id'=>$this->user_id])->update(['is_deleted'=>1]);
  528. $this->success('删除成功');
  529. }
  530. /**
  531. * @title 图文二级评论
  532. * @desc 图文二级评论
  533. * @author qc
  534. * @method POST
  535. * @url /api/Article/secondCommend
  536. * @header name:Authorization require:1 desc:Token
  537. * @param name:id type:int default:1 desc:评论id
  538. * @param name:content type:string default:-- desc:内容
  539. * @return name:name type:string default:-- desc:会员名称
  540. * @return name:headimg type:string default:-- desc:会员头像
  541. * @return name:content type:string default:-- desc:内容
  542. */
  543. public function secondCommend()
  544. {
  545. $comment = ArticleComment::where('id',input('post.id'))->find()->toArray();
  546. $user_info = $this->userInfo('name');
  547. UserMessage:: sendUserMessage($comment['user_id'],'article',3,0,$this->user_id,$comment['id'],$user_info['name'].'回复了您的评论');
  548. $send_user = ArticleItem::where('id',$comment['item_id'])->value('user_id');
  549. if($send_user) UserMessage:: sendUserMessage($send_user,'article',4,0,$this->user_id,$comment['item_id'],$user_info['name'].'评论了您的图文');
  550. unset($comment['id']);
  551. unset($comment['create_at']);
  552. $comment['pid'] = input('post.id');
  553. $comment['user_id'] = $this->user_id;
  554. $comment['content'] = input('post.content');
  555. $comment['lev']++;
  556. if(!$comment['source_id']) $comment['source_id'] = input('post.id');
  557. $res = ArticleComment::create($comment);
  558. $detail = ArticleComment::where('c.id',$res->id)
  559. ->alias('c')
  560. ->field('c.id,c.content,c.create_at,u.name,u.headimg')
  561. ->leftJoin('store_member u','u.id = c.user_id')
  562. ->find()->toArray();
  563. $this->success('评论成功',['detail'=>$detail]);
  564. }
  565. /**
  566. * @title 评论点赞||取消点赞
  567. * @desc 评论
  568. * @author qc
  569. * @method POST
  570. * @url /api/Article/commentTags
  571. * @header name:Authorization require:1 desc:Token
  572. * @param name:comment_id type:int default:1 desc:评论记录id
  573. * @return name:tags type:int default:1 desc:0取消成功,1点赞成功
  574. */
  575. public function commentTags()
  576. {
  577. $comment_id = input('post.comment_id');
  578. $ret_val = 0;
  579. $check_tags = ArticleCommentLike::where(['user_id'=>$this->user_id,'like_id'=>$comment_id])->value('id');
  580. if($check_tags) {
  581. ArticleCommentLike::where(['user_id'=>$this->user_id,'like_id'=>$comment_id])->delete();
  582. }else{
  583. Data::save('ArticleCommentLike',
  584. ['user_id'=>$this->user_id,'like_id'=>$comment_id,],'user_id',
  585. ['user_id'=>$this->user_id,'like_id'=>$comment_id]);
  586. $ret_val = 1;
  587. }
  588. $this->success($ret_val == 1 ?'点赞成功':'取消成功',['tags'=>$ret_val]);
  589. }
  590. /**
  591. * @title 图文收藏||取消收藏
  592. * @desc 用户收藏
  593. * @author qc
  594. * @method POST
  595. * @url /api/Article/articleCollect
  596. * @header name:Authorization require:1 desc:Token
  597. * @param name:article_id type:int require:1 default:-- desc:记录id[图文id]
  598. * @param name:item_id type:int default:1 desc:item_id
  599. * @param name:status type:int default:0 desc:收藏状态(0取消收藏【未收藏】,1收藏)
  600. */
  601. public function articleCollect()
  602. {
  603. $coll_type = input('post.coll_type',3);
  604. $coll_id = input('post.article_id',0);
  605. $item_id = input('post.item_id',0);
  606. $collect_check = UserCollect::checkCollectByType($this->user_id,$coll_type,$coll_id,$item_id);
  607. if($collect_check) {
  608. UserCollect::where(['user_id'=>$this->user_id,'coll_type'=>$coll_type,'coll_id'=>$coll_id,'children_id'=>$item_id])->delete();
  609. $this->success('取消收藏成功',['status'=>0]);
  610. }else{
  611. Data::save('UserCollect', [
  612. 'user_id'=>$this->user_id,
  613. 'coll_type'=>$coll_type,
  614. 'coll_id'=>$coll_id,
  615. 'children_id'=>$item_id,
  616. 'create_int'=>time()],'user_id',['user_id'=>$this->user_id,'coll_type'=>$coll_type, 'coll_id'=>$coll_id,'children_id'=>$item_id]);
  617. $this->success('收藏成功',['status'=>1]);
  618. }
  619. }
  620. /**
  621. * @title 用户提交或修改图文【个人】
  622. * @desc 用户提交或修改图文【个人】
  623. * @author qc
  624. * @method POST
  625. * @url /api/Article/userReferArticle
  626. * @header name:Authorization require:1 desc:Token
  627. * @param name:id type:int default:-- desc:id(修改时必传)
  628. * @param name:title type:string default:-- desc:标题
  629. * @param name:images type:string default:-- desc:图片(多张用|隔开)
  630. * @param name:desc type:string default:-- desc:简介
  631. * @param name:label type:string default:-- desc:图文标签
  632. * @param name:document type:string default:-- desc:文件路径【单文件】
  633. */
  634. public function userReferArticle()
  635. {
  636. $id = input('post.id',0);
  637. $title = input('post.title');
  638. $desc = input('post.desc');
  639. $images = input('post.images');
  640. $label = input('post.label');
  641. $document = input('post.document');
  642. //if(!$images) $this->error('请上传图文');
  643. if($id){
  644. $check_status = UserArticle::where('id',$id)->value('status');
  645. if($check_status == 1) $this->error('已审核通过,不允许修改');
  646. }
  647. $data = [
  648. 'title' => $title,
  649. 'user_id' => $this->user_id,
  650. 'desc' => $desc,
  651. 'images' => $images,
  652. 'label' => $label,
  653. 'document' => $document,
  654. 'cover' => $images ? explode('|',$images)[0] : '',
  655. 'status' => 0,
  656. 'remark' => '',
  657. ];
  658. if($id) $data['id'] = $id;
  659. if($id){
  660. UserArticle::where('id',$id)->update($data);
  661. }else{
  662. $res= UserArticle::create($data) ;
  663. }
  664. UserMessage::sendUserMessage($this->user_id,'article',1,0,0,$id ? $id:$res->id);
  665. $this->success('提交成功,请等待审核',['id'=> $id ? :$res->id]);
  666. }
  667. /**
  668. * @title 获取我的图文列表【个人--我的发布列表】
  669. * @desc 获取我的图文列表【个人】
  670. * @author qc
  671. * @method GET
  672. * @url /api/Article/getMyArticleList
  673. * @header name:Authorization require:1 desc:Token
  674. * @param name:title type:string default:-- desc:标题
  675. * @param name:page type:int default:0 desc:页数
  676. * @param name:page_num type:int default:20 desc:每页数
  677. * @return name:title type:string default:-- desc:标题
  678. * @return name:desc type:string default:-- desc:简介
  679. * @return name:images type:string default:-- desc:图文【多张|隔开】
  680. * @return name:status type:int default:-- desc:0待审核1审核通过2审核未通过
  681. * @return name:remark type:string default:-- desc:审核备注
  682. */
  683. public function getMyArticleList()
  684. {
  685. $sel_where = [];
  686. $sel_where[] = ['is_deleted','=',0];
  687. $sel_where[] = ['user_id','=',$this->user_id];
  688. $title = input('get.title');
  689. if($title) $sel_where[] = ['title|label','like','%'.$title.'%'];
  690. $list = UserArticle::where($sel_where)
  691. ->field('id,title,desc,images,status,remark')
  692. ->order('id desc')
  693. ->limit($this->off_set,$this->page_num)
  694. ->select()->toArray();
  695. $this->success('ok',['list'=>$list]);
  696. }
  697. /**
  698. * @title 获取我的图文详情【个人】
  699. * @desc 获取我的图文列表【个人】
  700. * @author qc
  701. * @method GET
  702. * @url /api/Article/getUserArticleDetail
  703. * @header name:Authorization require:1 desc:Token
  704. * @param name:id type:string default:-- desc:记录id
  705. * @return name:title type:string default:-- desc:标题
  706. * @return name:desc type:string default:-- desc:简介
  707. * @return name:images type:string default:-- desc:图文[多张|隔开]
  708. * @return name:status type:int default:-- desc:0待审核1审核通过2审核未通过
  709. * @return name:remark type:string default:-- desc:审核备注
  710. * @return name:label type:string default:-- desc:标签
  711. * @return name:document type:string default:-- desc:文件路径
  712. */
  713. public function getUserArticleDetail()
  714. {
  715. $detail =UserArticle::where('id',input('get.id'))->field('id,title,desc,images,status,remark,label,document')->find();
  716. if(!$detail) $this->error('图文有误');
  717. $this->success('ok',['detail'=>$detail->toArray()]);
  718. }
  719. /**
  720. * @title 用户删除图文记录【个人】
  721. * @desc 用户删除图文记录【个人】
  722. * @author qc
  723. * @method POST
  724. * @url /api/Article/delUserArticle
  725. * @header name:Authorization require:1 desc:Token
  726. * @param name:id type:int default:-- desc:id
  727. */
  728. public function delUserArticle()
  729. {
  730. UserArticle::where(['user_id'=>$this->user_id,'id'=>input('post.id')])->delete();
  731. $this->success('删除成功');
  732. }
  733. /**
  734. * @title 以下接口学习服务模块的
  735. * @desc
  736. * @author qc
  737. * @method
  738. * @url /api/Article/learn()
  739. */
  740. public function learn(){}
  741. /**
  742. * @title 图文学习历史
  743. * @desc 图文学习历史
  744. * @author qc
  745. * @method GET
  746. * @url /api/Article/getLearnHistory
  747. * @header name:Authorization require:1 desc:Token
  748. * @param name:title type:string default:-- desc:标题
  749. * @param name:page type:int default:0 desc:页数
  750. * @param name:page_num type:int default:20 desc:每页数
  751. * @return name:title type:string default:-- desc:标题
  752. * @return name:article_id type:string default:-- desc:文章id
  753. * @return name:item_id type:string default:-- desc:item_id
  754. * @return name:cover type:string default:-- desc:封面
  755. * @return name:time type:string default:-- desc:时间
  756. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  757. */
  758. public function getLearnHistory()
  759. {
  760. $sel_where = [];
  761. $sel_where[] = ['t.user_id','=',$this->user_id];
  762. $sel_where[] = ['t.type','=',3];
  763. $title = input('get.title');
  764. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  765. $list = UserTrack::where($sel_where)
  766. ->alias('t')
  767. ->field('t.id,t.update_int,t.first_id article_id,t.second_id item_id,i.title,i.cover')
  768. ->leftJoin('ArticleItem i','t.second_id = i.id')
  769. ->order('update_int desc')
  770. ->limit($this->off_set,$this->page_num)
  771. ->select()->toArray();
  772. foreach ($list as &$v) {
  773. $v['time'] = date("Y-m-d H:i:s",$v['update_int']);
  774. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  775. }
  776. $this->success('ok',['list'=>$list]);
  777. }
  778. /**
  779. * @title 图文收藏记录
  780. * @desc 图文收藏记录
  781. * @author qc
  782. * @method GET
  783. * @url /api/Article/getArticleCollect
  784. * @header name:Authorization require:1 desc:Token
  785. * @param name:title type:string default:-- desc:标题
  786. * @param name:page type:int default:0 desc:页数
  787. * @param name:page_num type:int default:20 desc:每页数
  788. * @return name:title type:string default:-- desc:标题
  789. * @return name:read_num type:int default:-- desc:阅读量
  790. * @return name:article_id type:string default:-- desc:文章id
  791. * @return name:item_id type:string default:-- desc:item_id
  792. * @return name:cover type:string default:-- desc:封面
  793. * @return name:create_at type:string default:-- desc:时间
  794. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  795. */
  796. public function getArticleCollect()
  797. {
  798. $sel_where = [];
  799. $title = input('get.title');
  800. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  801. $sel_where[] = ['t.user_id','=',$this->user_id];
  802. $sel_where[] = ['t.coll_type','=',3];
  803. $list = UserCollect::where($sel_where)
  804. ->alias('t')
  805. ->field('t.id,t.create_at,t.coll_id article_id,t.children_id item_id,i.title,i.cover,i.read_num')
  806. ->leftJoin('ArticleItem i','t.children_id = i.id')
  807. ->order('id desc')
  808. ->limit($this->off_set,$this->page_num)
  809. ->select()->toArray();
  810. array_walk($list,function (&$v){
  811. $v['read_num'] = numTransform($v['read_num']);
  812. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  813. });
  814. $this->success('ok',['list'=>$list]);
  815. }
  816. /**
  817. * @title 我的评论【学习服务--我评论过的图文】
  818. * @desc 我的评论
  819. * @author qc
  820. * @method GET
  821. * @url /api/Article/getCommentArticle
  822. * @header name:Authorization require:1 desc:Token
  823. * @param name:title type:string default:-- desc:标题
  824. * @param name:page type:int default:0 desc:页数
  825. * @param name:page_num type:int default:20 desc:每页数
  826. * @return name:title type:string default:-- desc:标题
  827. * @return name:article_id type:string default:-- desc:文章id
  828. * @return name:item_id type:string default:-- desc:item_id
  829. * @return name:cover type:string default:-- desc:封面
  830. * @return name:create_at type:string default:-- desc:时间
  831. * @return name:user_name type:string default:-- desc:用户名【用户自己的】
  832. * @return name:headimg type:string default:-- desc:用户头像【用户自己的】
  833. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  834. */
  835. public function getCommentArticle()
  836. {
  837. $user_info = $this->userInfo();
  838. $sel_where = [];
  839. $title = input('get.title');
  840. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  841. $sel_where[] = ['t.user_id','=',$this->user_id];
  842. $sel_where[] = ['t.is_deleted','=',0];
  843. $sel_where[] = ['t.lev','=',1];
  844. $list = ArticleComment::where($sel_where)
  845. ->alias('t')
  846. ->field('t.id,t.create_at,t.article_id,t.item_id,t.lev,t.content,i.title,i.cover')
  847. ->leftJoin('ArticleItem i','t.item_id = i.id')
  848. ->order('id desc')
  849. ->limit($this->off_set,$this->page_num)
  850. ->select()->toArray();
  851. foreach ($list as &$v)
  852. {
  853. $v['user_name'] = $user_info['name'];
  854. $v['headimg'] = $user_info['headimg'];
  855. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  856. }
  857. $this->success('ok',['list'=>$list]);
  858. }
  859. /**
  860. * @title 评论我的【学习服务--评论我的】
  861. * @desc 评论我的
  862. * @author qc
  863. * @method GET
  864. * @url /api/Article/commentMyArticle
  865. * @header name:Authorization require:1 desc:Token
  866. * @param name:title type:string default:-- desc:标题
  867. * @param name:page type:int default:0 desc:页数
  868. * @param name:page_num type:int default:20 desc:每页数
  869. * @return name:title type:string default:-- desc:标题
  870. * @return name:article_id type:string default:-- desc:文章id
  871. * @return name:item_id type:string default:-- desc:item_id
  872. * @return name:cover type:string default:-- desc:封面
  873. * @return name:is_read type:int default:-- desc:是否已读(0未读1已读)
  874. * @return name:create_at type:string default:-- desc:时间
  875. * @return name:user_name type:string default:-- desc:用户名
  876. * @return name:headimg type:string default:-- desc:用户头像
  877. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  878. */
  879. public function commentMyArticle()
  880. {
  881. $sel_where = [];
  882. $title = input('get.title');
  883. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  884. $sel_where[] = ['t.is_deleted','=',0];
  885. $sel_where[] = ['i.user_id','=',$this->user_id];
  886. $list = ArticleComment::where($sel_where)
  887. ->alias('t')
  888. ->field('t.id,t.is_read,t.create_at,t.article_id,t.item_id,t.lev,t.content,i.title,i.cover,u.name user_name,u.headimg')
  889. ->leftJoin('ArticleItem i','t.item_id = i.id')
  890. ->leftJoin('store_member u','t.user_id = u.id')
  891. ->order('t.id desc')
  892. ->limit($this->off_set,$this->page_num)
  893. ->select()->toArray();
  894. array_walk($list,function (&$v){
  895. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  896. });
  897. $this->success('ok',['list'=>$list]);
  898. }
  899. /**
  900. * @title 已购图文列表
  901. * @desc 已购图文列表
  902. * @author qc
  903. * @method GET
  904. * @url /api/Article/getPurchaseArticle
  905. * @header name:Authorization require:1 desc:Token
  906. * @param name:title type:string default:-- desc:标题
  907. * @param name:page type:int default:0 desc:页数
  908. * @param name:page_num type:int default:20 desc:每页数
  909. * @return name:title type:string default:-- desc:标题
  910. * @return name:article_id type:string default:-- desc:文章id
  911. * @return name:item_id type:string default:-- desc:item_id
  912. * @return name:cover type:string default:-- desc:封面
  913. * @return name:create_at type:string default:-- desc:时间
  914. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  915. */
  916. public function getPurchaseArticle()
  917. {
  918. $sel_where = [];
  919. $title = input('get.title');
  920. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  921. $sel_where[] = ['t.user_id','=',$this->user_id];
  922. $sel_where[] = ['t.type','=',3];
  923. $sel_where[] = ['t.end_int','>',time()];
  924. $list = UserLearn::where($sel_where)
  925. ->alias('t')
  926. ->field('t.id,t.create_at,t.first_id article_id,t.second_id item_id,i.title,i.cover')
  927. ->leftJoin('ArticleItem i','t.second_id = i.id')
  928. ->order('id desc')
  929. ->limit($this->off_set,$this->page_num)
  930. ->select()->toArray();
  931. array_walk($list,function (&$v){
  932. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  933. });
  934. $this->success('ok',['list'=>$list]);
  935. }
  936. /**
  937. * @title 我的回复【我的回复--我回复过的评论】
  938. * @desc 我的评论
  939. * @author qc
  940. * @method GET
  941. * @url /api/Article/getReplyArticle
  942. * @header name:Authorization require:1 desc:Token
  943. * @param name:title type:string default:-- desc:标题
  944. * @param name:page type:int default:0 desc:页数
  945. * @param name:page_num type:int default:20 desc:每页数
  946. * @return name:title type:string default:-- desc:标题
  947. * @return name:article_id type:string default:-- desc:文章id
  948. * @return name:item_id type:string default:-- desc:item_id
  949. * @return name:cover type:string default:-- desc:封面
  950. * @return name:create_at type:string default:-- desc:时间
  951. * @return name:user_name type:string default:-- desc:用户名【用户自己的】
  952. * @return name:headimg type:string default:-- desc:用户头像【用户自己的】
  953. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  954. * @return name:parent_comment type:array default:-- desc:上级评论内容【你评论的那个评论】
  955. * @return name:parent_comment.content type:string default:-- desc:内容
  956. * @return name:parent_comment.name type:string default:-- desc:会员名称
  957. * @return name:parent_comment.title type:string default:-- desc:图文标题
  958. * @return name:parent_comment.article_id type:string default:-- desc:文章id
  959. * @return name:parent_comment.item_id type:string default:-- desc:item_id
  960. */
  961. public function getReplyArticle()
  962. {
  963. $user_info = $this->userInfo();
  964. $sel_where = [];
  965. $title = input('get.title');
  966. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  967. $sel_where[] = ['t.user_id','=',$this->user_id];
  968. $sel_where[] = ['t.is_deleted','=',0];
  969. $sel_where[] = ['t.lev','>=',2];
  970. $list = ArticleComment::where($sel_where)
  971. ->alias('t')
  972. ->field('t.id,t.article_id,t.item_id,t.create_at,t.lev,t.content,i.title,t.pid')
  973. ->leftJoin('ArticleItem i','t.item_id = i.id')
  974. ->order('t.id desc')
  975. ->limit($this->off_set,$this->page_num)
  976. ->select()->toArray();
  977. foreach ($list as &$v) {
  978. $v['user_name'] = $user_info['name'];
  979. $v['headimg'] = $user_info['headimg'];
  980. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  981. $parent_comment = ArticleComment::where([['t.id','=',$v['pid']]])
  982. ->field('t.id,t.article_id,t.item_id,t.content,i.title,i.cover,t.pid,u.name')
  983. ->alias('t')
  984. ->leftJoin('ArticleItem i','t.item_id = i.id')
  985. ->leftJoin('store_member u','t.user_id = u.id')
  986. ->find()->toArray();
  987. $v['parent_comment'] = $parent_comment;
  988. }
  989. $this->success('ok',['list'=>$list]);
  990. }
  991. /**
  992. * @title 获取角标数量
  993. * @desc 获取角标数量
  994. * @author qc
  995. * @method GET
  996. * @url /api/Article/getMarkNum
  997. * @header name:Authorization require:1 desc:Token
  998. * @return name:reply_num type:int default:-- desc:未读量--回复我的
  999. * @return name:comment_num type:int default:-- desc:未读量--评论我的
  1000. */
  1001. public function getMarkNum()
  1002. {
  1003. // 回复我的
  1004. $all_comment = ArticleComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1005. $reply_num = ArticleComment::where([['t.is_deleted','=',0],['t.lev','>=',2],['is_read','=',0],['t.pid','in',implode(',',$all_comment)]])->alias('t')->count();
  1006. // 评论我的
  1007. $comment_num = ArticleComment::where([['t.is_deleted','=',0],['i.user_id','=',$this->user_id],['is_read','=',0]])
  1008. ->leftJoin('ArticleItem i','t.item_id = i.id')
  1009. ->alias('t')->count();
  1010. $this->success('ok',compact(['reply_num','comment_num']));
  1011. }
  1012. /**
  1013. * @title 消息已读
  1014. * @desc 消息已读
  1015. * @author qc
  1016. * @method POST
  1017. * @url /api/Article/unreadChange
  1018. * @header name:Authorization require:1 desc:Token
  1019. * @param name:id type:string default:-- desc:记录id【不区分类型】
  1020. */
  1021. public function unreadChange()
  1022. {
  1023. ArticleComment::where('id',input('post.id'))->update(['is_read'=>1]);
  1024. $this->success('ok');
  1025. }
  1026. /**
  1027. * @title 回复我的【回复我的--回复过我的评论】
  1028. * @desc 回复我的
  1029. * @author qc
  1030. * @method GET
  1031. * @url /api/Article/getReplyComment
  1032. * @header name:Authorization require:1 desc:Token
  1033. * @param name:title type:string default:-- desc:标题
  1034. * @param name:page type:int default:0 desc:页数
  1035. * @param name:page_num type:int default:20 desc:每页数
  1036. * @return name:title type:string default:-- desc:标题
  1037. * @return name:article_id type:string default:-- desc:文章id
  1038. * @return name:item_id type:string default:-- desc:item_id
  1039. * @return name:cover type:string default:-- desc:封面
  1040. * @return name:is_read type:int default:-- desc:是否已读(0未读1已读)
  1041. * @return name:create_at type:string default:-- desc:时间
  1042. * @return name:user_name type:string default:-- desc:用户名【其他会员】
  1043. * @return name:headimg type:string default:-- desc:用户头【其他会员】
  1044. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  1045. * @return name:parent_comment type:array default:-- desc:你的评论内容【别人回复的那个评论】
  1046. * @return name:parent_comment.content type:string default:-- desc:内容
  1047. * @return name:parent_comment.name type:string default:-- desc:会员名称
  1048. * @return name:parent_comment.title type:string default:-- desc:图文标题
  1049. * @return name:parent_comment.article_id type:string default:-- desc:文章id
  1050. * @return name:parent_comment.item_id type:string default:-- desc:item_id
  1051. */
  1052. public function getReplyComment()
  1053. {
  1054. $all_comment = ArticleComment::where(['user_id'=>$this->user_id,'is_deleted'=>0])->column('id');
  1055. if(empty($all_comment)) $this->success('ok',['list'=>null]);
  1056. $sel_where = [];
  1057. $title = input('get.title');
  1058. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  1059. $sel_where[] = ['t.is_deleted','=',0];
  1060. $sel_where[] = ['t.lev','>=',2];
  1061. //$sel_where[] = ['t.user_id','<>',$this->user_id];
  1062. $sel_where[] = ['t.pid','in',implode(',',$all_comment)];
  1063. $list = ArticleComment::where($sel_where)
  1064. ->alias('t')
  1065. ->field('t.id,t.is_read,t.article_id,t.item_id,t.create_at,t.lev,t.content,t.pid,u.name user_name,u.headimg')
  1066. ->leftJoin('store_member u','t.user_id = u.id')
  1067. ->leftJoin('ArticleItem i','t.item_id = i.id')
  1068. ->order('t.id desc')
  1069. ->limit($this->off_set,$this->page_num)
  1070. ->select()->toArray();
  1071. foreach ($list as &$v) {
  1072. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  1073. $parent_comment = ArticleComment::where([['t.id','=',$v['pid']]])
  1074. ->field('t.id,t.article_id,t.item_id,t.content,i.title,i.cover,t.pid,u.name')
  1075. ->alias('t')
  1076. ->leftJoin('ArticleItem i','t.item_id = i.id')
  1077. ->leftJoin('store_member u','t.user_id = u.id')
  1078. ->find()->toArray();
  1079. $v['parent_comment'] = $parent_comment;
  1080. }
  1081. $this->success('ok',['list'=>$list]);
  1082. }
  1083. /**
  1084. * @title 图文点赞列表【我的点赞】
  1085. * @desc 图文点赞列表
  1086. * @author qc
  1087. * @method GET
  1088. * @url /api/Article/getTagsArticle
  1089. * @header name:Authorization require:1 desc:Token
  1090. * @param name:title type:string default:-- desc:标题
  1091. * @param name:page type:int default:0 desc:页数
  1092. * @param name:page_num type:int default:20 desc:每页数
  1093. * @return name:title type:string default:-- desc:标题
  1094. * @return name:article_id type:string default:-- desc:文章id
  1095. * @return name:item_id type:string default:-- desc:item_id
  1096. * @return name:like_num type:string default:-- desc:点赞量
  1097. * @return name:is_like type:string default:-- desc:是否点赞[0否1是]
  1098. * @return name:cover type:string default:-- desc:封面
  1099. * @return name:is_vip type:int default:-- desc:是否vip[0否1是]
  1100. * @return name:create_at type:string default:-- desc:时间
  1101. * @return name:read_num type:int default:-- desc:阅读量
  1102. * @return name:images_arr type:array default:-- desc:图片
  1103. * @return name:app_name type:string default:-- desc:发布方名称
  1104. * @return name:app_logo type:string default:-- desc:发布方头像
  1105. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  1106. */
  1107. public function getTagsArticle()
  1108. {
  1109. $app_name = sysconf('app_name');
  1110. $app_logo = sysconf('app_logo');
  1111. $sel_where = [];
  1112. $title = input('get.title');
  1113. if($title) $sel_where[] = ['i.title|i.label','like','%'.$title.'%'];
  1114. $sel_where[] = ['t.user_id','=',$this->user_id];
  1115. $list = ArticleLike::where($sel_where)
  1116. ->alias('t')
  1117. ->field('t.id,t.create_at,t.article_id,t.item_id,i.title,i.cover,i.is_vip,images,i.read_num,i.user_id')
  1118. ->leftJoin('ArticleItem i','t.item_id = i.id')
  1119. ->order('id desc')
  1120. ->limit($this->off_set,$this->page_num)
  1121. ->select()->toArray();
  1122. foreach ($list as &$v) {
  1123. $v['like_num'] = ArticleLike::where(['article_id'=>$v['article_id'],'item_id'=>$v['item_id']])->count();
  1124. $v['like_num'] = numTransform($v['like_num']);
  1125. $v['read_num'] = numTransform($v['read_num']);
  1126. $v['is_like'] = ArticleLike::where(['user_id'=>$this->user_id,'article_id'=>$v['article_id'],'item_id'=>$v['item_id']])->count();
  1127. $v['images_arr'] = $v['images'] ? explode('|',$v['images']):null;
  1128. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['item_id'],$this->request->controller());
  1129. if(!$v['user_id']){
  1130. $v['app_name'] = $app_name;
  1131. $v['app_logo'] = $app_logo;
  1132. }else{
  1133. $user_info = User::where('id',$v['user_id'])->field('name,headimg')->find();
  1134. $v['app_name'] = $user_info ? $user_info->name : '';
  1135. $v['app_logo'] = $user_info ? $user_info->headimg : '';
  1136. }
  1137. }
  1138. $this->success('ok',['list'=>$list]);
  1139. }
  1140. /**
  1141. * @title 以下接口为二期需求
  1142. * @desc 以下接口为二期需求
  1143. * @author qc
  1144. * @url /api/Article/secondPhase
  1145. * @method GET
  1146. * @return name:1 type:string default:-- desc:以下接口为二期需求
  1147. */
  1148. public function secondPhase(){}
  1149. /**
  1150. * @title 我的绑定【后台图文绑定该会员】
  1151. * @desc 后台图文绑定该会员
  1152. * @author qc
  1153. * @method GET
  1154. * @url /api/Article/getBoundList
  1155. * @header name:Authorization require:1 desc:Token
  1156. * @param name:title type:string default:-- desc:标题
  1157. * @param name:page type:int default:0 desc:页数
  1158. * @param name:page_num type:int default:20 desc:每页数
  1159. * @return name:id type:string default:-- desc:记录id【item_id】
  1160. * @return name:title type:string default:-- desc:标题
  1161. * @return name:article_id type:string default:-- desc:图文id
  1162. * @return name:cover type:string default:-- desc:封面
  1163. * @return name:create_at type:string default:-- desc:时间
  1164. * @return name:is_vip type:int default:-- desc:是否是vip[0否1是]
  1165. * @return name:is_normal type:int default:-- desc:是否是正常记录(0已删除或是已禁用1可以正常跳转详情)
  1166. */
  1167. public function getBoundList()
  1168. {
  1169. $sel_where = [];
  1170. $title = input('get.title');
  1171. $sel_where[] = ['user_id','=',$this->user_id];
  1172. $sel_where[] = ['is_deleted','=',0];
  1173. if($title) $sel_where[] = ['title|label','like','%'.$title.'%'];
  1174. $list = ArticleItem::where($sel_where)
  1175. ->alias('t')
  1176. ->field('id,title,cover,read_num,label,is_vip,article_id')
  1177. ->order('id desc')
  1178. ->limit($this->off_set,$this->page_num)
  1179. ->select()->toArray();
  1180. foreach ($list as &$v) {
  1181. $v['is_normal'] = CheckPower::checkModulesPower($v['article_id'],$v['id'],$this->request->controller());;
  1182. }
  1183. $this->success('ok',['list'=>$list]);
  1184. }
  1185. /**
  1186. * @title 我的追更列表
  1187. * @desc 我的追更列表
  1188. * @author qc
  1189. * @method GET
  1190. * @url /api/Article/getFollowUpList
  1191. * @header name:Authorization require:1 desc:Token
  1192. * @param name:title type:string default:-- desc:标题
  1193. * @param name:page type:int default:0 desc:页数
  1194. * @param name:page_num type:int default:20 desc:每页数
  1195. * @return name:create_at type:string default:-- desc:追更设置时间
  1196. * @return name:article_id type:int default:-- desc:图文id
  1197. * @return name:title type:string default:-- desc:标题
  1198. */
  1199. public function getFollowUpList()
  1200. {
  1201. $sel_where = [];
  1202. $sel_where[] = ['p.user_id','=',$this->user_id];
  1203. $sel_where[] = ['p.type','=',2];
  1204. $sel_where[] = ['p.switch_id','=',1];
  1205. $field = 'p.id,p.switch_id as article_id,p.create_at,a.title';
  1206. $list = PlatformSwitch::field($field)
  1207. ->alias('p')
  1208. ->leftJoin('ArticleIntro a','p.switch_id = a.id')
  1209. ->where($sel_where)
  1210. ->limit($this->off_set,$this->page_num)
  1211. ->order('p.id desc')
  1212. ->select()->toArray();
  1213. $this->success('ok',['list'=>$list]);
  1214. }
  1215. }