Article.php 55 KB

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