member_ugc.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2017/7/5
  6. * Time: 下午4:02
  7. */
  8. require_once(BASE_ROOT_PATH . '/mobile/control/special.php');
  9. require_once(BASE_ROOT_PATH . '/helper/ugc_helper.php');
  10. require_once(BASE_ROOT_PATH . '/helper/search/tcp_client.php');
  11. require_once(BASE_ROOT_PATH . '/helper/text_filter.php');
  12. require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
  13. require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
  14. class member_ugcControl extends specialControl
  15. {
  16. const greater = 0;
  17. const lesser = 1;
  18. private $mUgcBanner;
  19. public function __construct()
  20. {
  21. parent::__construct();
  22. global $config;
  23. $this->mUgcBanner = $config['ugc_banner'];
  24. }
  25. public function pub_listOp()
  26. {
  27. return $this->fetch('pub_list');
  28. }
  29. public function pri_listOp()
  30. {
  31. $this->need_login();
  32. return $this->fetch('pri_list');
  33. }
  34. public function mine_listOp()
  35. {
  36. $this->need_login();
  37. return $this->fetch('mine_list');
  38. }
  39. private function fetch($type)
  40. {
  41. $special_id = intval($_GET['special_id']);
  42. $count = $this->page_size();
  43. if($special_id == -1) {
  44. $special_id = -1;
  45. $direct = self::lesser;
  46. }
  47. elseif ($special_id == 0) {
  48. return self::outsuccess(array('special_list' => null,'mobile_page' => mobile_page(0)));
  49. }
  50. else {
  51. $direct = $this->direct();
  52. }
  53. if($type == "pub_list") {
  54. $result = search\relation_client::instance()->fetch_pub_special(['special_id' => $special_id,'count'=> $count,'type' => $direct]);
  55. }
  56. elseif($type == 'pri_list') {
  57. $result = search\relation_client::instance()->fetch_pri_special(['user_id' => intval($_SESSION['member_id']),
  58. 'special_id' => $special_id,'count'=> $count,'type' => $direct]);
  59. }
  60. elseif($type == "mine_list") {
  61. $result = $this->mine_specials($special_id,$count);
  62. }
  63. else {
  64. return self::outerr(errcode::ErrParamter);
  65. }
  66. if($special_id == -1)
  67. {
  68. $extid = $this->tip_block($type);
  69. if($extid != false) {
  70. $helper = new special_formater($extid);
  71. $blocks = $helper->format($goods_ids);
  72. } else {
  73. $blocks = [];
  74. }
  75. }
  76. $specials = $this->specials($result);
  77. if($specials == false)
  78. {
  79. $page_no = $this->page_no();
  80. if($page_no == 1) $page_no = 0;
  81. return self::outsuccess(array('special_list' => $blocks,'mobile_page' => mobile_page($page_no)));
  82. }
  83. else
  84. {
  85. $special_list = $this->special_list($specials,$ugcs);
  86. $page_no = $this->page_no();
  87. if($this->page_size() <= count($specials)) {
  88. $page_no += 1;
  89. }
  90. foreach ($special_list as $val) {
  91. $blocks[] = $val;
  92. }
  93. return self::outsuccess(['special_list' => $blocks,
  94. 'ugcs' => $ugcs,
  95. 'summary' => null,
  96. 'groupbuy' => null,
  97. 'limitime' => null,
  98. 'bundling' => null,
  99. 'mobile_page' => mobile_page($page_no)]);
  100. }
  101. }
  102. private function mine_specials($special_id,$count)
  103. {
  104. $mod_special = Model();
  105. if($special_id == -1) {
  106. $items = $mod_special->table('mb_special')->field('special_id')->order('special_id desc')->limit($count)->select();
  107. } else {
  108. $items = $mod_special->table('mb_special')->field('special_id')->where(array('special_id' => ['lt',$special_id]))->limit($count)->select();
  109. }
  110. $result = [];
  111. $result['code'] = 200;
  112. $result['data'] = [];
  113. $result['data']['specials'] = [];
  114. foreach ($items as $item) {
  115. $spid = intval($item['special_id']);
  116. $result['data']['specials'][] = $spid;
  117. }
  118. return $result;
  119. }
  120. private function tip_block($type)
  121. {
  122. if($type == "pub_list") {
  123. $spid = $this->mUgcBanner['pub'];
  124. }
  125. elseif($type == 'pri_list') {
  126. $spid = $this->mUgcBanner['friend'];
  127. }
  128. elseif($type == "mine_list") {
  129. $spid = $this->mUgcBanner['mine'];
  130. }
  131. else {
  132. return false;
  133. }
  134. if(empty($spid) || $spid == 0) {
  135. return false;
  136. }
  137. else {
  138. return $spid;
  139. }
  140. }
  141. private function direct()
  142. {
  143. $cur_page = $this->page_no();
  144. if($cur_page == 1) {
  145. return self::greater;
  146. } else {
  147. return self::lesser;
  148. }
  149. }
  150. private function specials($result)
  151. {
  152. if(empty($result)) return false;
  153. $code = intval($result['code']);
  154. if($code != 200) {
  155. return false;
  156. }
  157. else {
  158. $specials = $result['data']['specials'];
  159. return empty($specials) ? false : $specials;
  160. }
  161. }
  162. private function special_list($spids, &$ugcs)
  163. {
  164. $result = [];
  165. $mod_special = Model('mb_special');
  166. $items = $mod_special->getMbSpecialList(['special_id' => ['in',$spids]]);
  167. $users = [];
  168. $specials = [];
  169. foreach ($items as $item)
  170. {
  171. $special = new ugc\special($item);
  172. $specials[] = $special;
  173. $sender = $special->memberid();
  174. $users[] = $sender;
  175. }
  176. sort($users);
  177. array_unique($users);
  178. $minfos = [];
  179. if(!empty($users))
  180. {
  181. $mod_member = Model('member');
  182. $members = $mod_member->getMemberList(['member_id' => ['in',$users]]);
  183. foreach ($members as $member) {
  184. $info = new member_info($member);
  185. $mid = $info->member_id();
  186. $minfos[$mid] = $info;
  187. }
  188. }
  189. $ugcs = [];
  190. foreach ($specials as $special)
  191. {
  192. $block = special_formater::format_ugc($special);
  193. $result[] = $block;
  194. $divider = special_formater::def_divider();
  195. $result[] = $divider;
  196. $mid = $special->memberid();
  197. $minfo = $minfos[$mid];
  198. $ugc = $this->formate_ugc($minfo,$special);
  199. $ugcs[] = $ugc;
  200. }
  201. return $result;
  202. }
  203. private function formate_ugc(member_info $minfo,ugc\special $special)
  204. {
  205. $ret['special_id'] = $special->special_id();
  206. $ret['member_avatar'] = $minfo->avatar();
  207. $ret['member_nickname'] = $minfo->nickname();
  208. $ret['has_vote'] = $special->has_vote();
  209. $ret['appreciate_num'] = $special->appreciates();
  210. $ret['comment_num'] = $special->comments();
  211. $ret['clicks'] = $special->clicks();
  212. $ret['pubtime'] = $special->editime();
  213. $ret['desc'] = $special->description();
  214. $supporter = new ugc\special_support($special->special_id(),0);
  215. $ret['supported'] = $supporter->supported();
  216. $ret['support_num'] = $special->likes();
  217. $cid = $special->category_id();
  218. $ret['category'] = ugc_helper::category_title($cid);
  219. $ret['can_del'] = false;
  220. if(session_helper::logined())
  221. {
  222. if($special->memberid() == $_SESSION['member_id']) {
  223. $ret['can_del'] = true;
  224. }
  225. }
  226. return $ret;
  227. }
  228. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  229. public function addOp()
  230. {
  231. $this->need_login();
  232. $contet = $_POST['content'];
  233. if(empty($contet)) {
  234. return self::outerr(errcode::ErrParamter,"上传的内容不能为空");
  235. }
  236. return $this->add($contet);
  237. }
  238. public function addexOp()
  239. {
  240. $this->need_login();
  241. $contet = $_POST['content'];
  242. if(empty($contet)) {
  243. return self::outerr(errcode::ErrParamter,"上传的内容不能为空");
  244. }
  245. else {
  246. $contet = urldecode($contet);
  247. }
  248. return $this->add($contet);
  249. }
  250. private function add($contet)
  251. {
  252. $sp_data = json_decode($contet,true);
  253. if(empty($sp_data)) {
  254. return self::outerr(errcode::ErrParamter,"上传的内容不能为空");
  255. }
  256. $spobj = ugc_helper::crate_special($sp_data,$err);
  257. if($spobj == false) {
  258. return self::outerr($err['code'],$err['msg']);
  259. }
  260. if($spobj->count() > 0)
  261. {
  262. $special_id = $spobj->save($_SESSION['member_id'],$sp_data);
  263. } else {
  264. $special_id = false;
  265. }
  266. if($special_id == false) {
  267. return self::outerr(errcode::ErrUGC,"抱歉,内容云同步失败 :(");
  268. }
  269. else {
  270. return self::outsuccess(['special_id' => $special_id]);
  271. }
  272. }
  273. public function previewOp()
  274. {
  275. $this->need_login();
  276. return parent::indexOp();
  277. }
  278. public function publishOp()
  279. {
  280. $this->need_login();
  281. $special_id = intval($_GET['special_id']);
  282. $setting = $_GET['setting'];
  283. if($special_id < 0 || empty($setting)) {
  284. return self::outerr(errcode::ErrParamter);
  285. }
  286. return $this->publish($special_id,$setting);
  287. }
  288. public function publishexOp()
  289. {
  290. $this->need_login();
  291. $special_id = intval($_GET['special_id']);
  292. $setting = $_GET['setting'];
  293. if($special_id < 0 || empty($setting)) {
  294. return self::outerr(errcode::ErrParamter);
  295. }
  296. else {
  297. $setting = urldecode($setting);
  298. }
  299. return $this->publish($special_id,$setting);
  300. }
  301. private function publish($special_id,$setting)
  302. {
  303. $setting = json_decode($setting,true);
  304. if(ugc_helper::pub_special($special_id,$setting,$err) == false) {
  305. return self::outerr($err['code'],$err['msg']);
  306. }
  307. else {
  308. return self::outsuccess(['special_id' => $special_id]);
  309. }
  310. }
  311. public function delOp()
  312. {
  313. $this->need_login();
  314. $special_id = intval($_GET['special_id']);
  315. if(ugc_helper::del_special($special_id,$err) == false) {
  316. return self::outerr($err['code'],$err['msg']);
  317. }
  318. else {
  319. return self::outsuccess(['special_id' => $special_id]);
  320. }
  321. }
  322. public function supportOp()
  323. {
  324. $special_id = intval($_GET['special_id']);
  325. if($special_id < 0) {
  326. return self::outerr(errcode::ErrParamter,"该专题不存在");
  327. }
  328. $comment_id = intval($_GET['comment_id']);
  329. $supported = ugc_helper::support_special($special_id,$comment_id);
  330. return self::outsuccess(['special_id' => $special_id,'comment_id' => $comment_id,'supported' => $supported]);
  331. }
  332. public function commentsOp()
  333. {
  334. $special_id = intval($_GET['special_id']);
  335. if($special_id < 0) {
  336. return self::outerr(errcode::ErrParamter,"该专题不存在");
  337. }
  338. $comment_id = intval($_GET['comment_id']);
  339. if($comment_id <= 0)
  340. {
  341. $mod_comment = Model('ugc_comment');
  342. $count = $mod_comment->top_counts($special_id);
  343. $items = $mod_comment->getTopCommentList($special_id,'comment_id',$this->page_size(),$count);
  344. $pages = $mod_comment->gettotalpage();
  345. $mobile_page = mobile_page($pages);
  346. $commentids = $this->commentids($items);
  347. if(!empty($commentids))
  348. {
  349. $mod = Model('ugc_comment');
  350. $comment_subcounts = [];
  351. $items = $mod->comments_counts($special_id,$commentids);
  352. foreach ($items as $item) {
  353. $comment_id = intval($item['comment_id']);
  354. $count = intval($item['nc_count']);
  355. $comment_subcounts[$comment_id] = $count;
  356. }
  357. $comments = $mod->getCommentList(array('top_id' => ['in',$commentids]),'*',0);
  358. $comments_obj =new ugc\comments($comments,$special_id,$comment_subcounts);
  359. $comments = $comments_obj->comments();
  360. $uids = $comments_obj->users();
  361. $members = $this->users($uids);
  362. } else {
  363. $comments = [];
  364. $members = [];
  365. }
  366. }
  367. else
  368. {
  369. $mod_comment = Model('ugc_comment');
  370. $count = $mod_comment->comment_counts($special_id,$comment_id);
  371. $items = $mod_comment->getSubCommentList($special_id,$comment_id,'comment_id',$this->page_size(),$count);
  372. $pages = $mod_comment->gettotalpage();
  373. $mobile_page = mobile_page($pages);
  374. $commentids = $this->commentids($items);
  375. if($commentids) {
  376. $mod = Model('ugc_comment');
  377. $comments = $mod->getCommentList(array('comment_id' => ['in',$commentids]),'*',0);
  378. $comments_obj =new ugc\comments($comments,$special_id,[]);
  379. $comments = $comments_obj->comments();
  380. $uids = $comments_obj->users();
  381. $members = $this->users($uids);
  382. } else {
  383. $comments = [];
  384. $members = [];
  385. }
  386. }
  387. return self::outsuccess(['comments' => $comments,'members' => $members,'mobile_page' => $mobile_page]);
  388. }
  389. private function users($user_ids)
  390. {
  391. if(empty($user_ids)) return [];
  392. $mod_member = Model('member');
  393. $members = $mod_member->getMemberList(array('member_id' => ['in',$user_ids]));
  394. if(empty($members)) return [];
  395. $result = [];
  396. foreach ($members as $item)
  397. {
  398. $member = new member_info($item);
  399. $val['member_id'] = $member->member_id();
  400. $val['avatar'] = $member->avatar();
  401. $val['nickname'] = $member->nickname();
  402. $result[] = $val;
  403. }
  404. return $result;
  405. }
  406. private function commentids($items)
  407. {
  408. $result = [];
  409. foreach ($items as $val) {
  410. $commentid = intval($val['comment_id']);
  411. $result[] = $commentid;
  412. }
  413. return $result;
  414. }
  415. public function commentOp()
  416. {
  417. $this->need_login();
  418. $special_id = intval($_GET['special_id']);
  419. if($special_id < 0) {
  420. return self::outerr(errcode::ErrParamter,"该专题不存在");
  421. }
  422. $comment = urldecode($_GET['content']);
  423. if(empty($comment)) {
  424. return self::outerr(errcode::ErrParamter,"评论内容不能为空.");
  425. }
  426. $comment = text_filter::filter_html($comment);
  427. if(empty($comment)) {
  428. return self::outerr(errcode::ErrParamter,"评论内容不能含非法字符.");
  429. }
  430. $comment_id = intval($_GET['comment_id']);
  431. $mod_comment = Model('ugc_comment');
  432. if($comment_id > 0) {
  433. $ret = $mod_comment->respond_comment($special_id,$comment_id,session_helper::memberid(),$comment);
  434. } else {
  435. $ret = $mod_comment->comment($special_id,session_helper::memberid(),$comment);
  436. }
  437. if($ret == false) {
  438. return self::outerr(errcode::ErrDB,"抱歉,评论出错了.");
  439. }
  440. else
  441. {
  442. $mod = Model('ugc_comment');
  443. $comments = $mod->getCommentList(['comment_id' => $ret],'*',0);
  444. $comments_obj = new ugc\comments($comments,$special_id,[]);
  445. $comments = $comments_obj->comments();
  446. $uids = $comments_obj->users();
  447. $members = $this->users($uids);
  448. QueueClient::push('onUgcComment',['special_id' => $special_id, 'comment_id' => $comment_id,'member_id' => session_helper::memberid()]);
  449. return self::outsuccess(['comments' => $comments,'members' => $members,'mobile_page' => mobile_page(0)]);
  450. }
  451. }
  452. public function mine_bonusOp()
  453. {
  454. $this->need_login();
  455. $pred = new predeposit_helper($_SESSION['member_id']);
  456. $bonus_rate = $pred->bonus_rate();
  457. if($bonus_rate != null)
  458. {
  459. $rates = $bonus_rate->format();
  460. $rates_money = [];
  461. foreach ($rates as $rate => $money) {
  462. $item['rate'] = $rate;
  463. $item['total'] = $money;
  464. $rates_money[] = $item;
  465. }
  466. }
  467. else {
  468. $rates_money = [];
  469. }
  470. return self::outsuccess(['bonus_rate' => $rates_money]);
  471. }
  472. public function appreciateOp()
  473. {
  474. $this->need_login();
  475. $special_id = intval($_GET['special_id']);
  476. $rate = intval($_GET['rate']);
  477. $money = intval($_GET['money']);
  478. $bless = urldecode($_GET['bless']);
  479. $bless = text_filter::filter_html($bless);
  480. if($special_id < 0 || $rate <= 0 || $rate > 100 || $money <= 0) {
  481. return self::outerr(errcode::ErrParamter,"参数错误");
  482. }
  483. $ret = ugc_helper::appreciate($special_id,$rate,$money,$bless);
  484. if($ret == false) {
  485. return self::outsuccess(errcode::ErrBonus,"抱歉,赞赏失败,请晚点再试。");
  486. }
  487. else
  488. {
  489. $mod_appreciate = Model('appreciate');
  490. $insertid = $mod_appreciate->insert(['special_id' => $special_id,'member_id' => session_helper::memberid(),'rate' => $rate,'money' => $money,'addtime' => time()]);
  491. if($insertid != false) {
  492. $mod_special = Model('mb_special');
  493. $mod_special->table('mb_special')->where(['special_id' => $special_id])->update(array('appreciates' => ['exp', 'appreciates + 1'],
  494. 'appreciate_amonut' => ['exp', "appreciate_amonut + {$money}"]));
  495. }
  496. return self::outsuccess(null);
  497. }
  498. }
  499. public function appreciate_listOp()
  500. {
  501. $special_id = intval($_GET['special_id']);
  502. if($special_id < 0) {
  503. return self::outerr(errcode::ErrParamter,"该专题不存在");
  504. }
  505. $mod_appreciate = Model('appreciate');
  506. $count = $mod_appreciate->counts($special_id);
  507. $items = $mod_appreciate->getListBySpecialid($special_id,'*',$this->page_size(),$count);
  508. $pages = $mod_appreciate->gettotalpage();
  509. $uids = [];
  510. foreach ($items as $val) {
  511. $user_id = intval($val['member_id']);
  512. $uids[] = $user_id;
  513. }
  514. $members = $this->users($uids);
  515. $result = [];
  516. foreach ($items as $item) {
  517. $val = [];
  518. $val['member_id'] = intval($item['member_id']);
  519. $val['rate'] = intval($item['rate']);
  520. $val['money'] = doubleval($item['money']);
  521. $val['addtime'] = intval($item['addtime']);
  522. $result[] = $val;
  523. }
  524. return self::outsuccess(['appreciate' => $result,'members' => $members,'mobile_page' => mobile_page($pages)]);
  525. }
  526. public function answer_pageOp()
  527. {
  528. $special_id = intval($_GET['special_id']);
  529. if($special_id < 0) {
  530. return self::outerr(errcode::ErrParamter,"该专题不存在");
  531. }
  532. $memberid = session_helper::memberid();
  533. if($memberid > 0) {
  534. $mod_answer = Model('ugc_answer');
  535. $answer = $mod_answer->getAnswer($special_id,$memberid);
  536. }
  537. if(empty($answer))
  538. {
  539. return self::outsuccess(['answer' => [],'special_id' => $special_id,'scale' => 0],'ugc/answer.list');
  540. }
  541. else
  542. {
  543. $result = $this->format_answer($answer,'','');
  544. $correct_num = $answer['correct_num'];
  545. if($correct_num > 0)
  546. {
  547. $lt_count = $mod_answer->lt_count($special_id,$correct_num);
  548. $counts = $mod_answer->counts($special_id);
  549. if($lt_count > 0 && $counts > 0) {
  550. $scale = intval($lt_count * 100 / $counts + 0.5);
  551. } else {
  552. $scale = false;
  553. }
  554. } else {
  555. $scale = false;
  556. }
  557. return self::outsuccess(['answer' => $result,'special_id' => $special_id,'scale' => $scale],'ugc/answer.list');
  558. }
  559. }
  560. private function format_answer($answer,$nickname,$avatar)
  561. {
  562. $result['correct_num'] = intval($answer['correct_num']);
  563. $result['total_num'] = intval($answer['total_num']);
  564. if($result['total_num'] == 0) {
  565. $result['score'] = 0;
  566. }
  567. else {
  568. $result['score'] = intval($result['correct_num'] * 100 / $result['total_num'] + 0.5);
  569. }
  570. $result['bonus_rate'] = intval($answer['bonus_rate']);
  571. $result['amount'] = doubleval($answer['amount']);
  572. $result['answer_time']= intval($answer['answer_time']);
  573. $result['nickname'] = $nickname;
  574. $result['avatar'] = $avatar;
  575. return $result;
  576. }
  577. public function answersOp()
  578. {
  579. $special_id = intval($_GET['special_id']);
  580. if($special_id < 0) {
  581. return self::outerr(errcode::ErrParamter,"该专题不存在");
  582. }
  583. $mod_answer = Model('ugc_answer');
  584. $count = $mod_answer->counts($special_id);
  585. $items = $mod_answer->answer_list($special_id,'*',$this->page_size(),$count);
  586. $pages = $mod_answer->gettotalpage();
  587. if(empty($items)) {
  588. return self::outsuccess(['answers' => [],'mobile_page' => mobile_page(0)]);
  589. }
  590. $uids = [];
  591. foreach ($items as $val) {
  592. $user_id = intval($val['member_id']);
  593. $uids[] = $user_id;
  594. }
  595. $minfos = $this->users($uids);
  596. $members = [];
  597. foreach ($minfos as $val) {
  598. $mid = intval($val['member_id']);
  599. $members[$mid] = $val;
  600. }
  601. $answers = [];
  602. foreach ($items as $item) {
  603. $mid = intval($item['member_id']);
  604. $member = $members[$mid];
  605. $value = $this->format_answer($item,$member['nickname'],$member['avatar']);
  606. $answers[] = $value;
  607. }
  608. return self::outsuccess(['answers' => $answers,'mobile_page' => mobile_page($pages)]);
  609. }
  610. public function subscribe_authorOp()
  611. {
  612. $special_id = intval($_GET['special_id']);
  613. if($special_id < 0) {
  614. return self::outerr(errcode::ErrParamter,"该专题不存在");
  615. }
  616. $memberid = $_SESSION['member_id'];
  617. $success = ugc_helper::subscribe($memberid,$special_id);
  618. return self::outsuccess(['success' => $success]);
  619. }
  620. }