UserController.php 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  1. <?php
  2. /**
  3. * UserController 用户相关api接口
  4. */
  5. class UserController extends ApiBaseController{
  6. public function beforeAction($action){
  7. $weixin_use = array('info');
  8. if(Yii::app()->getRequest()->getParam("request_from") == 'weixin' && in_array($action->id,$weixin_use)){
  9. return true;
  10. }
  11. return $this->verify();
  12. }
  13. //用户邮箱注册
  14. public function actionRegister(){
  15. $userAr = new RUser();
  16. $data = array();
  17. $data['user_name'] = trim(Yii::app()->request->getParam('user_name',''));
  18. $data['password'] = Yii::app()->request->getParam('password');
  19. $data['email'] = Yii::app()->request->getParam('email','');
  20. $data['avatar'] = Yii::app()->request->getParam('avatar','');
  21. $data['city_info'] = json_decode(Yii::app()->request->getParam('city_info'),true);
  22. $position = json_decode(Yii::app()->request->getParam('position'),true);
  23. $data['position'][0] = isset($position['lng'])?floatval($position['lng']):0;
  24. $data['position'][1] = isset($position['lat'])?floatval($position['lat']):0;
  25. //防止city_info出现非法数据
  26. if(!isset($data['city_info']['province'])){
  27. $data['city_info']['province'] = '';
  28. $data['city_info']['city'] = '';
  29. $data['city_info']['area'] = '';
  30. }elseif(!isset($data['city_info']['city'])){
  31. $data['city_info']['city'] = '';
  32. $data['city_info']['area'] = '';
  33. }elseif(!isset($data['city_info']['area'])){
  34. $data['city_info']['area'] = '';
  35. }
  36. $data['app_client_id'] = intval(Yii::app()->request->getParam('app_client_id'));
  37. $data['device_id'] = Yii::app()->request->getParam('device_id');
  38. $data['channel'] = Yii::app()->request->getParam('channel');
  39. $data['openid'] = Yii::app()->request->getParam('openid');
  40. $data['phone_type'] = Yii::app()->request->getParam('phone_type');
  41. $data['os_version'] = Yii::app()->request->getParam('os_version');
  42. $data['register_time'] = time();
  43. $data['last_visit_time'] = time();
  44. if(!preg_match(Yii::app()->params['emailReg'], $data['email'])){
  45. CommonFn::requestAjax(false,CommonFn::getMessage('user','email_Illegal'));
  46. }
  47. $z_user = new ZUser();
  48. $z_user->validate_user_name($data['user_name']);
  49. if(strlen($data['password'])<6 || strlen($data['password'])>20){
  50. CommonFn::requestAjax(false, CommonFn::getMessage('user','password_length_6_20'));
  51. }
  52. $userAr->attributes = $data;
  53. $criteria = new EMongoCriteria();
  54. $criteria->email('==',$userAr->email);
  55. $olduser = RUser::model()->find($criteria);
  56. if($olduser){
  57. CommonFn::requestAjax(false,CommonFn::getMessage('user','email_already_registered'));
  58. }
  59. $criteria = new EMongoCriteria();
  60. $criteria->user_name('==',$userAr->user_name);
  61. $olduser = RUser::model()->find($criteria);
  62. if($olduser){
  63. CommonFn::requestAjax(false,CommonFn::getMessage('user','username_already_registered'));
  64. }
  65. $userAr->password = md5($userAr->password);
  66. //用户注册后默认关注几个圈子
  67. $z_group = new ZGroup();
  68. $userAr->groups = $z_group->get_default_fllow_group();
  69. if($userAr->save()){
  70. $data = RUser::model()->parseRow($userAr->attributes);
  71. CommonFn::requestAjax(true,CommonFn::getMessage('user','register_success'),$data);
  72. }else{
  73. CommonFn::requestAjax(false,CommonFn::getMessage('user','register_faild'));
  74. }
  75. }
  76. //微信用户的登录
  77. public function actionWeixinLogin(){
  78. $data = array();
  79. $data['user_name'] = mb_strtolower(Yii::app()->request->getParam('user_name',''));
  80. $data['avatar'] = Yii::app()->request->getParam('avatar','');
  81. $data['city_info'] = json_decode(Yii::app()->request->getParam('city_info'),true);
  82. $position = json_decode(Yii::app()->request->getParam('position'),true);
  83. //防止city_info出现非法数据
  84. if(!isset($data['city_info']['province']) || $data['city_info']['province'] == '未知'){
  85. $data['city_info']['province'] = '';
  86. $data['city_info']['city'] = '';
  87. $data['city_info']['area'] = '';
  88. }elseif(!isset($data['city_info']['city'])){
  89. $data['city_info']['city'] = '';
  90. $data['city_info']['area'] = '';
  91. }elseif(!isset($data['city_info']['area'])){
  92. $data['city_info']['area'] = '';
  93. }
  94. $data['position'][0] = isset($position['lng'])?floatval($position['lng']):0;
  95. $data['position'][1] = isset($position['lat'])?floatval($position['lat']):0;
  96. $data['app_client_id'] = intval(Yii::app()->request->getParam('app_client_id'));
  97. $data['device_id'] = Yii::app()->request->getParam('device_id');
  98. $data['channel'] = Yii::app()->request->getParam('channel');
  99. $data['phone_type'] = Yii::app()->request->getParam('phone_type');
  100. if($data['channel'] == 'appstore'){
  101. $data['phone_type'] = Yii::app()->request->getParam('device_model');
  102. }
  103. $data['app_version'] = Yii::app()->request->getParam('app_version');
  104. $data['os_version'] = Yii::app()->request->getParam('os_version');
  105. $data['openid'] = Yii::app()->request->getParam('openid','');
  106. $data['unionid'] = Yii::app()->request->getParam('unionid','');
  107. $data['sex'] = intval(Yii::app()->request->getParam('sex'));
  108. $data['register_time'] = time();
  109. $data['last_visit_time'] = time();
  110. if ($data['openid'] == ''){
  111. CommonFn::requestAjax(false, CommonFn::getMessage('user','weixin_login_faild'));
  112. }
  113. $criteria = new EMongoCriteria();
  114. if(isset($data['unionid']) && !empty($data['unionid'])){
  115. $criteria->unionid('==',$data['unionid']);//unionid保证账号统一
  116. }else{
  117. $criteria->openid('==',$data['openid']);
  118. }
  119. $user = RUser::model()->find($criteria);
  120. if($user){
  121. $user->os_version = $data['os_version'];
  122. $user->device_id = $data['device_id'];
  123. $user->app_client_id = $data['app_client_id'];
  124. $paraArr = array('os_version','device_id','app_client_id');
  125. if(!empty($data['position'])&&!empty($data['position'][0])&&!empty($data['position'][1])){
  126. $user->position = $data['position'];
  127. $paraArr[] = 'position';
  128. }
  129. if(!empty($data['city_info']['province'])){
  130. $user->city_info = $data['city_info'];
  131. $paraArr[] = 'city_info';
  132. }
  133. $user->update($paraArr,true);
  134. $data = RUser::model()->parseRow($user->attributes);
  135. $z_action_cat = new ZActionCat();
  136. $news_count = $z_action_cat->getUnReadNews($user->_id);
  137. $data['news'] = $news_count;
  138. CommonFn::requestAjax(true,CommonFn::getMessage('user','login_success'),$data);
  139. }else{
  140. $z_user = new ZUser();
  141. $z_user->validate_user_name($data['user_name']);
  142. $userAr = new RUser();
  143. $userAr->user_name = $data['user_name'];
  144. $userAr->avatar = $data['avatar'];
  145. $userAr->city_info = $data['city_info'];
  146. $userAr->position = $data['position'];
  147. $userAr->app_client_id = $data['app_client_id'];
  148. $userAr->device_id = $data['device_id'];
  149. $userAr->phone_type = $data['phone_type'];
  150. $userAr->app_version = $data['app_version'];
  151. $userAr->os_version = $data['os_version'];
  152. $userAr->channel = $data['channel'];
  153. $userAr->openid = $data['openid'];
  154. $userAr->unionid = $data['unionid'];
  155. $userAr->sex = $data['sex']?$data['sex']:3;
  156. $userAr->register_time = $data['register_time'];
  157. $userAr->last_visit_time = $data['last_visit_time'];
  158. try {
  159. $saveResult = $userAr->save();
  160. }catch(Exception $e){
  161. $userAr->user_name = 'wz_'.dechex(time());
  162. $saveResult = $userAr->save();
  163. }
  164. if($saveResult){
  165. $z_group = new ZGroup();
  166. $default_groups = $z_group->get_default_fllow_group();
  167. $userAr->groups = $default_groups;
  168. $userAr->update(array('groups'),true);
  169. $list = new ARedisList('after_user_reg');
  170. $user_id = (string)$userAr->_id;
  171. $list->push($user_id);
  172. $data = RUser::model()->parseRow($userAr->attributes);
  173. $news = [
  174. 'like'=>0,
  175. 'message'=>0,
  176. 'reply'=>0,
  177. 'notice'=>0,
  178. 'order'=>0,
  179. 'follow'=>0,
  180. 'new_topic'=>0,
  181. 'new_card'=>0,
  182. 'total'=>0
  183. ];
  184. $data['news'] = $news;
  185. CommonFn::requestAjax(true,CommonFn::getMessage('user','register_success'),$data,200,array('is_new'=>1));
  186. }else{
  187. CommonFn::requestAjax(false,CommonFn::getMessage('user','register_faild'));
  188. }
  189. }
  190. }
  191. //用户登陆
  192. public function actionLogin(){
  193. $password = md5(Yii::app()->request->getParam('password'),'');
  194. $email = preg_replace('/\0/','',Yii::app()->request->getParam('email',''));
  195. $email = str_replace(' ','',$email);
  196. if($password&&$email){
  197. $criteria = new EMongoCriteria();
  198. $criteria->email = new MongoRegex('/' . $email . '/i');
  199. try {
  200. $userAr = RUser::model()->find($criteria);
  201. } catch (Exception $e) {
  202. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_exist'));
  203. }
  204. if(!$userAr){
  205. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_exist'));
  206. }
  207. if($password == $userAr->password){
  208. $userAr->last_visit_time = time();
  209. $userAr->update(array('last_visit_time'),true);
  210. $z_action_cat = new ZActionCat();
  211. $news_count = $z_action_cat->getUnReadNews($userAr->_id);
  212. $data = RUser::model()->parseRow($userAr->attributes);
  213. $data['news'] = $news_count;
  214. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data);
  215. }else{
  216. CommonFn::requestAjax(false,CommonFn::getMessage('user','username_or_password_error'));
  217. }
  218. }else{
  219. CommonFn::requestAjax(false,CommonFn::getMessage('message','params_miss'));
  220. }
  221. }
  222. //用户登陆前验证
  223. public function actionValidate(){
  224. $email = Yii::app()->request->getParam('email');
  225. if(!$email){
  226. CommonFn::requestAjax(false,CommonFn::getMessage('message','params_miss'));
  227. }
  228. $criteria = new EMongoCriteria();
  229. if(preg_match(Yii::app()->params['emailReg'], $email)){
  230. $criteria->email('==',$email);
  231. }else{
  232. $criteria->user_name('==',$email);
  233. }
  234. $userAr = RUser::model()->find($criteria);
  235. if($userAr){
  236. CommonFn::requestAjax(false,CommonFn::getMessage('user','email_already_registered'));
  237. }else{
  238. CommonFn::requestAjax(true,'');
  239. }
  240. }
  241. //用户信息
  242. public function actionInfo(){
  243. if(Yii::app()->request->getParam('app_client_id') == 2){
  244. $this->check_version();
  245. }
  246. $user_id = Yii::app()->getRequest()->getParam("user_id");
  247. $uid = Yii::app()->getRequest()->getParam("to_user_id");
  248. $user_name = Yii::app()->getRequest()->getParam("user_name");
  249. if($user_name){
  250. $criteria = new EMongoCriteria();
  251. $criteria->user_name('==',$user_name);
  252. $res = RUser::model()->find($criteria);
  253. if(!$res){
  254. CommonFn::requestAjax(false,CommonFn::getMessage('user','user_not_exist'),204);
  255. }else{
  256. $uid = $res->_id;
  257. }
  258. }
  259. $page = intval(Yii::app()->getRequest()->getParam("page",1));
  260. if(empty($page)){
  261. $page = 1;
  262. }
  263. $notopic = Yii::app()->getRequest()->getParam("notopic");
  264. if(empty($user_id) && empty($uid)){
  265. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_empty'),201);
  266. }
  267. $add_score = $this->today_first_login($user_id);
  268. if($user_id){
  269. $id = $user_id;
  270. }
  271. $model = new RUser();
  272. if($uid){
  273. if($user_id){
  274. $user_node = new UserNodeRecord($user_id);
  275. $relation = $user_node->relation($uid);
  276. }
  277. $id = $uid;
  278. }
  279. $user = CommonFn::apigetObJ($id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  280. $user_data = $model->parseRow($user->attributes,array(),true);
  281. $user_data['relation'] = isset($relation)?$relation:0;
  282. $criteria = new EMongoCriteria();
  283. $criteria->user('==',$user->_id);
  284. $criteria->status("==",1);
  285. $criteria->limit(3)->sort('time',EMongoCriteria::SORT_DESC);
  286. $model = new Topic();
  287. $cursor = $model->findAll($criteria);
  288. $rows = CommonFn::getRows($cursor);
  289. $topics = $model->parse($rows);
  290. $feed = array();
  291. if($topics){
  292. $feed['pics'] = array();
  293. foreach ($topics as $topic) {
  294. $feed['pics'] = array_merge($feed['pics'],$topic['pics']);
  295. $feed['pics'] = array_slice($feed['pics'],0,3);
  296. }
  297. if($feed['pics']){
  298. $feed['type'] = 'pics';
  299. $user_data['feed'] = $feed;
  300. }elseif($topics[0]['content']){
  301. $feed['type'] = 'text';
  302. $feed['content'] = $topics[0]['content'];
  303. $user_data['feed'] = $feed;
  304. }else{
  305. $feed['type'] = 'text';
  306. $feed['content'] = '';
  307. $user_data['feed'] = $feed;
  308. }
  309. }else{
  310. $feed['type'] = 'text';
  311. $feed['content'] = '';
  312. $user_data['feed'] = $feed;
  313. }
  314. $z_action_cat = new ZActionCat();
  315. $news_count = $z_action_cat->getUnReadNews($user->_id);
  316. $user_data['news'] = $news_count;
  317. $data['user'] = $user_data;
  318. if(empty($notopic)){
  319. $conditions = array(
  320. 'user'=>array('==',$user->_id),
  321. 'status'=>array('==',1)
  322. );
  323. $order = array(
  324. 'time'=>'desc',
  325. );
  326. $model = new Topic();
  327. $pagedata = CommonFn::getPagedata($model,$page,20,$conditions,$order);
  328. $user_topics = $pagedata['res'];
  329. if(!empty($user_id)){
  330. foreach ($user_topics as $key => $topic) {
  331. $z_like = new ZLike();
  332. $like = $z_like->getLikeByLikeObj($user_id,$topic['id']);
  333. if(empty($like)){
  334. $user_topics[$key]['is_liked'] = false;
  335. }else{
  336. $user_topics[$key]['is_liked'] = true;
  337. }
  338. }
  339. if(Yii::app()->getRequest()->getParam("page_size",0)==1){
  340. if(isset($user_topics[0]['pics'])&&count($user_topics[0]['pics'])<3){
  341. $criteria = new EMongoCriteria();
  342. $criteria->user('==',$user->_id);
  343. $criteria->status("==",1);
  344. $criteria->limit(2)->sort('time',EMongoCriteria::SORT_DESC)->offset(1);
  345. $model = new Topic();
  346. $cursor = $model->findAll($criteria);
  347. $rows = CommonFn::getRows($cursor);
  348. $topics = $model->parse($rows);
  349. foreach ($topics as $topic) {
  350. $user_topics[0]['pics'] = array_merge($user_topics[0]['pics'],$topic['pics']);
  351. $user_topics[0]['pics'] = array_slice($user_topics[0]['pics'],0,3);
  352. }
  353. }
  354. }
  355. }
  356. $data['topic_list'] = $user_topics;
  357. }
  358. if($add_score['status']){
  359. $score_info['score_change'] = $add_score['score'];
  360. $score_info['current_score'] = $add_score['current_score'];
  361. $score_info['score_type'] = '签到';
  362. if(isset($pagedata)){
  363. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data,303,array_merge($score_info,array('sum_count' => $pagedata['sum_count'],'sum_page'=>$pagedata['sum_page'],'page_size'=>$pagedata['page_size'],'current_page'=>$pagedata['current_page'])));
  364. }else{
  365. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data,303,$score_info);
  366. }
  367. }else{
  368. if(isset($pagedata)){
  369. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data,200,array('sum_count' => $pagedata['sum_count'],'sum_page'=>$pagedata['sum_page'],'page_size'=>$pagedata['page_size'],'current_page'=>$pagedata['current_page']));
  370. }else{
  371. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data);
  372. }
  373. }
  374. }
  375. /**
  376. * 按照时间线展现帖子列表
  377. * 当前日期的帖子没有显示完后,会追加当天剩余帖子数.并传递实际数据偏移量给前端
  378. */
  379. public function actionInfoByTimeline(){
  380. $user_id = Yii::app()->getRequest()->getParam("user_id");
  381. $uid = Yii::app()->getRequest()->getParam("to_user_id");
  382. $user_name = Yii::app()->getRequest()->getParam("user_name");
  383. if($user_name){
  384. $criteria = new EMongoCriteria();
  385. $criteria->user_name('==',$user_name);
  386. $res = RUser::model()->find($criteria);
  387. if(!$res){
  388. CommonFn::requestAjax(false,CommonFn::getMessage('user','user_not_exist'),array(),204);
  389. }else{
  390. $uid = $res->_id;
  391. }
  392. }
  393. $page = intval(Yii::app()->getRequest()->getParam("page",1));
  394. if(empty($page)){
  395. $page = 1;
  396. }
  397. $offset = Yii::app()->getRequest()->getParam('offset',0);
  398. if(empty($user_id) && empty($uid)){
  399. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_empty'),201);
  400. }
  401. if($uid){
  402. if($user_id){
  403. $user_node = new UserNodeRecord($user_id);
  404. $relation = $user_node->relation($uid);
  405. }
  406. }
  407. if($user_id){
  408. $id = $user_id;
  409. }
  410. if($uid){
  411. $id = $uid;
  412. }
  413. $model = new RUser();
  414. $user_obj = CommonFn::apigetObJ($id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  415. $user_data = $model->parseRow($user_obj->attributes);
  416. $user_data['relation'] = isset($relation)?$relation:0;
  417. //获取用户帖子信息
  418. $topic_model = new ZTopic();
  419. $user_topics = array();
  420. $pagesize = 20;
  421. $page_offset = ($page - 1) * $pagesize;
  422. if(!$offset){
  423. $offset = $offset > 0 && $page_offset < $offset ? $offset : $page_offset;
  424. }
  425. $criteria = new EMongoCriteria();
  426. $criteria->user('==',$user_obj->_id);
  427. $criteria->status("==",1);
  428. $criteria->limit($pagesize)->sort('time',EMongoCriteria::SORT_DESC)->offset($offset);
  429. $model = new Topic();
  430. $cursor = $model->findAll($criteria);
  431. $rows = CommonFn::getRows($cursor);
  432. $rows = $model->parse($rows);
  433. //获取有追加数据
  434. if(count($rows)<1){
  435. $data = array(
  436. 'user' => $user_data,
  437. 'topic_list' => array(),
  438. 'offset' => $offset,
  439. );
  440. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data,200,array('is_more'=>0));
  441. }
  442. $last_topic = $rows[count($rows)-1];
  443. $append_data = $topic_model->getAppendDateByDate($uid,$last_topic['last_post_time']);
  444. if($append_data){
  445. $rows = array_merge($rows,$append_data);
  446. }
  447. //按时间顺序排列
  448. foreach($rows as $row ){
  449. $user_topics[$row['date']]['time'] = $row['date'];
  450. $user_topics[$row['date']]['data'][] = $row;
  451. }
  452. $user_topics = array_values($user_topics);
  453. $current_offset = count($rows)+$offset; //当前实际数据偏移值
  454. if(count($rows)<20){
  455. $is_more = 0;
  456. }else{
  457. $is_more = 1;
  458. }
  459. //追加到用户数据中
  460. $data = array(
  461. 'user' => $user_data,
  462. 'topic_list' => $user_topics,
  463. 'offset' => $current_offset
  464. );
  465. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data,200,array('is_more'=>$is_more));
  466. }
  467. //用户收藏信息接口
  468. public function actionFavList(){
  469. $user_id = Yii::app()->getRequest()->getParam("user_id");
  470. $page = intval(Yii::app()->getRequest()->getParam("page",1));
  471. if(empty($page)){
  472. $page = 1;
  473. }
  474. //获取用户收藏信息
  475. $user = CommonFn::apigetObJ($user_id,'ZUser',CommonFn::getMessage('user','id_not_exist'),201);
  476. $pagesize = Yii::app()->params['userFavsPageSize'];
  477. $conditions = array(
  478. 'user'=>array('==',$user->_id)
  479. );
  480. $order = array(
  481. 'time'=>'desc',
  482. );
  483. $model = new Fav();
  484. $pagedata = CommonFn::getPagedata($model,$page,$pagesize,$conditions,$order);
  485. $user_favs = $pagedata['res'];
  486. if(!empty($user_favs)){
  487. foreach ($user_favs as $key => $value) {
  488. if($value['fav_obj']['status']!=1){
  489. unset($user_favs[$key]);
  490. }
  491. }
  492. }
  493. $data = array();
  494. foreach($user_favs as $fav){
  495. $z_like = new ZLike();
  496. $like = $z_like->getLikeByLikeObj($user_id,$fav['fav_obj']['id']);
  497. if(empty($like)){
  498. $fav['fav_obj']['is_liked'] = false;
  499. }else{
  500. $fav['fav_obj']['is_liked'] = true;
  501. }
  502. $data[] = $fav['fav_obj'];
  503. }
  504. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data,200,array('sum_count' => $pagedata['sum_count'],'sum_page'=>$pagedata['sum_page'],'page_size'=>$pagedata['page_size'],'current_page'=>$pagedata['current_page']));
  505. }
  506. //用户帖子列表页面
  507. public function actionTopicList(){
  508. $user_id = Yii::app()->getRequest()->getParam("user_id");
  509. $uid = Yii::app()->getRequest()->getParam("to_user_id");
  510. $page = intval(Yii::app()->getRequest()->getParam("page",1));
  511. if(empty($page)){
  512. $page = 1;
  513. }
  514. $offset = Yii::app()->getRequest()->getParam('offset',0);
  515. if(empty($user_id) && empty($uid)){
  516. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_empty'),201);
  517. }
  518. if($user_id){
  519. $id = $user_id;
  520. $time_list_flag = true;
  521. }
  522. if($uid){
  523. $id = $uid;
  524. $time_list_flag = false;
  525. }
  526. //获取用户帖子列表
  527. $topic_model = new ZTopic();
  528. $user_topics = array();
  529. $rows = $topic_model->getUserTopic($id,$page,$offset);
  530. if(count($rows)<1){
  531. $data = array(
  532. 'topic_list' => array(),
  533. 'offset' => $offset,
  534. );
  535. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data);
  536. }
  537. if($time_list_flag){
  538. //获取有追加数据
  539. $last_topic = $rows[count($rows)-1];
  540. $append_data = $topic_model->getAppendDateByDate($id,$last_topic['last_post_time']);
  541. if($append_data){
  542. $rows = array_merge($rows,$append_data);
  543. }
  544. //按时间顺序排列
  545. foreach($rows as $row ){
  546. $user_topics[$row['date']]['time'] = $row['date'];
  547. $user_topics[$row['date']]['data'][] = $row;
  548. }
  549. $user_topics = array_values($user_topics);
  550. }else{
  551. $user_topics = $rows;
  552. }
  553. $current_offset = count($rows); //当前实际数据偏移值
  554. $data = array(
  555. 'topic_list' => $user_topics,
  556. 'offset' => $current_offset,
  557. );
  558. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data);
  559. }
  560. //修改用户资料
  561. public function actionEdit(){
  562. $data['_id'] = Yii::app()->getRequest()->getParam('user_id');
  563. if(!CommonFn::isMongoId($data['_id'])){
  564. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_exist'),201);
  565. }
  566. $model = new RUser();
  567. $user = CommonFn::apigetObJ($data['_id'],"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  568. //需要进行修改的数据内容
  569. $data['avatar'] = Yii::app()->getRequest()->getParam('avatar','');
  570. $data['mobile'] = Yii::app()->getRequest()->getParam('mobile','');
  571. $data['sex'] = intval(Yii::app()->getRequest()->getParam('sex'));
  572. $data['user_name']= Yii::app()->getRequest()->getParam('user_name','');
  573. $data['city_info'] = json_decode(Yii::app()->request->getParam('city_info'),true);
  574. //防止city_info出现非法数据
  575. if(!isset($data['city_info']['province'])){
  576. $data['city_info']['province'] = '';
  577. $data['city_info']['city'] = '';
  578. $data['city_info']['area'] = '';
  579. }elseif(!isset($data['city_info']['city'])){
  580. $data['city_info']['city'] = '';
  581. $data['city_info']['area'] = '';
  582. }elseif(!isset($data['city_info']['area'])){
  583. $data['city_info']['area'] = '';
  584. }
  585. if($data['avatar']){
  586. if(!CommonFn::checkPicFormat($data['avatar'])){
  587. CommonFn::requestAjax(false,CommonFn::getMessage('user','user_avatar_illegal'));
  588. }
  589. }
  590. if($user->certify_status == 1 && $data['user_name'] && $user->user_name != $data['user_name']){
  591. CommonFn::requestAjax(false,'你已通过认证,不允许修改昵称');
  592. }
  593. //过滤user_id ,检测本接口所需参数是否完整
  594. $item_count = 0;
  595. unset($data['_id']);
  596. //用户名检测
  597. if(isset($data['user_name']) && $data['user_name']){
  598. if(mb_strlen($data['user_name'],'utf-8')<2||mb_strlen($data['user_name'],'utf-8')>16){
  599. CommonFn::requestAjax(false,CommonFn::getMessage('user','username_length_illegal'));
  600. }
  601. $z_user = new ZUser();
  602. $z_user->validate_user_name($data['user_name']);
  603. $u_criteria = new EMongoCriteria();
  604. $u_criteria->user_name('==',$data['user_name']);
  605. $olduser = RUser::model()->find($u_criteria);
  606. if($olduser&&$olduser->_id!=$user->_id){
  607. CommonFn::requestAjax(false,CommonFn::getMessage('user','username_already_registered'));
  608. }
  609. }elseif(empty($data['user_name'])){
  610. $data['user_name'] = $user->user_name;
  611. }
  612. foreach($data as $key => $val){
  613. if(!empty($val)){
  614. if($key=='city_info' && empty($val['province'])){
  615. continue;
  616. }
  617. $item_count++;
  618. $user->{$key} = $val;
  619. }
  620. }
  621. //更新数据
  622. if($item_count){
  623. if($user->save(true)){
  624. $data = $user->parseRow($user->attributes,array(),true);
  625. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data);
  626. }else{
  627. CommonFn::requestAjax(false,CommonFn::getMessage('message','operation_faild'));
  628. }
  629. }else{
  630. CommonFn::requestAjax(false,CommonFn::getMessage('message','params_illegal'));
  631. }
  632. }
  633. //用户爪币记录
  634. public function actionScoreLog(){
  635. $user_id = Yii::app()->getRequest()->getParam("user_id");
  636. $page = intval(Yii::app()->getRequest()->getParam("page",1));
  637. if(empty($page)){
  638. $page = 1;
  639. }
  640. if(empty($user_id) ){
  641. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_exist'),201);
  642. }
  643. if($user_id){
  644. $id = $user_id;
  645. }
  646. $deviceid = Yii::app()->request->getParam('device_id');
  647. //设置首次访问时间,保证一次浏览的回复列表不变
  648. $actiontime = CommonFn::getFirstTime(ActionTimeRedis::TYPE_GET_SCORELOG,$deviceid,$page);
  649. $pagesize = Yii::app()->params['userScoreLogPageSize'];
  650. $conditions = array(
  651. 'user'=>array('==',$id),
  652. 'time'=>array('<=',$actiontime)
  653. );
  654. $order = array(
  655. 'time'=>'desc',
  656. );
  657. $model = new UserScoreLog();
  658. $pagedata = CommonFn::getPagedata($model,$page,$pagesize,$conditions,$order);
  659. $logs = $pagedata['res'];
  660. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$logs,200,array('sum_count' => $pagedata['sum_count'],'sum_page'=>$pagedata['sum_page'],'page_size'=>$pagedata['page_size'],'current_page'=>$pagedata['current_page']));
  661. }
  662. //用户拒绝接受推送
  663. public function actionSetPush(){
  664. $user_id = Yii::app()->getRequest()->getParam("user_id");
  665. $user = CommonFn::apigetObJ($user_id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  666. if($user->receive_push == 0){
  667. $user->receive_push = 1;
  668. if($user->update(array('receive_push'),true)){
  669. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),array('op'=>'receive'));
  670. }
  671. }else{
  672. $user->receive_push = 0;
  673. if($user->update(array('receive_push'),true)){
  674. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),array('op'=>'unreceive'));
  675. }
  676. }
  677. }
  678. //用户分享成功后增加爪币
  679. public function actionShareSuccess(){
  680. $user_id = Yii::app()->getRequest()->getParam("user_id");
  681. $user = CommonFn::apigetObJ($user_id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  682. $add_score = $this->addScore($user_id,'score_share');
  683. $result = array();
  684. if($add_score['status']){
  685. $add_score['score_change'] = $add_score['score'];
  686. $add_score['current_score'] = $add_score['current_score'];
  687. $add_score['score_type'] = '分享成功';
  688. CommonFn::requestAjax(true,'分享增加爪币成功',array(),301,$add_score);
  689. }else{
  690. CommonFn::requestAjax(false,'分享增加爪币失败');
  691. }
  692. }
  693. //用户申请认证接口
  694. public function actionApplyCertify(){
  695. $data = array();
  696. $data['content'] = '您好,目前握爪仅开放认证宠物医生、营养师、训犬师、美容师,认证需要您相关的资格证书或学校就读证书照片及您与证书合影的照片,直接在私信里发给爪爪就好了。';
  697. $data['from_user'] = Yii::app()->params['kefu_user'];
  698. $data['to_user'] = Yii::app()->request->getParam('user_id','');
  699. $date = date('Ymd');
  700. $Key = HelperKey::generateUserActionKey('applycertify',$date,$data['to_user']);
  701. $status = UserActionRedis::get($Key);
  702. if($status){
  703. CommonFn::requestAjax(false,'你今天已提交过认证申请,请不要重复申请');
  704. }else{
  705. UserActionRedis::set($Key,true);
  706. }
  707. $data['voice'] = json_decode(Yii::app()->request->getParam('voice'),true);
  708. $data['video'] = json_decode(Yii::app()->request->getParam('video'),true);
  709. $data['pics'] = json_decode(Yii::app()->request->getParam('pics'),true);
  710. $z_message = new ZMessage();
  711. $result = $z_message->addMessage($data);
  712. if($result['status']){
  713. CommonFn::requestAjax(true,'已提交认证申请');
  714. }else{
  715. CommonFn::requestAjax(false,'提交申请失败,请重试');
  716. }
  717. }
  718. //用户加与取消关注接口
  719. public function actionFollow(){
  720. $user_id = Yii::app()->getRequest()->getParam("user_id");
  721. $user = CommonFn::apigetObJ($user_id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  722. $f_id = Yii::app()->getRequest()->getParam("to_user_id");
  723. $f_id_list = json_decode(Yii::app()->getRequest()->getParam("to_user_list"),true);
  724. if(!$f_id_list && !CommonFn::isMongoId($f_id)){
  725. CommonFn::requestAjax(false,CommonFn::getMessage('message','params_illegal'));
  726. }
  727. $user_node = new UserNodeRecord($user->_id);
  728. //批量关注
  729. if(is_array($f_id_list) && !empty($f_id_list)){
  730. foreach ($f_id_list as $value) {
  731. $user_node->follow($value);
  732. }
  733. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),array('op'=>'follow','follow_count'=>$user_node->follow_count(),'fans_count'=>$user_node->follower_count()));
  734. }
  735. if($user_node->is_following($f_id)){
  736. $user_node->unfollow($f_id);
  737. $op = 'unfollow';
  738. $message = '取消关注成功';
  739. }else{
  740. $user_node->follow($f_id);
  741. $message = '关注成功';
  742. $op = 'follow';
  743. }
  744. CommonFn::requestAjax(true,$message,array('op'=>$op,'follow_count'=>$user_node->follow_count(),'fans_count'=>$user_node->follower_count()));
  745. }
  746. //好友帖子列表
  747. public function actionFriendsTopicList(){
  748. $last_obj_id = Yii::app()->getRequest()->getParam("last_object_id",'');
  749. $user_id = Yii::app()->getRequest()->getParam("user_id");
  750. $user = CommonFn::apigetObJ($user_id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  751. if(CommonFn::isMongoId($last_obj_id)){
  752. $last_topic_obj = Topic::get(new MongoId($last_obj_id));
  753. if($last_topic_obj){
  754. $last_obj_time = $last_topic_obj->time;
  755. }
  756. }else{
  757. $last_obj_time = time();
  758. }
  759. if(!isset($last_obj_time)){
  760. CommonFn::requestAjax(false,CommonFn::getMessage('message','params_illegal'));
  761. }
  762. //设置小红点
  763. // $cache = new ARedisCache();
  764. // $cache->set('friend_topic_'.$user_id,0);
  765. $user_node = new UserNodeRecord($user_id);
  766. $follow_list = $user_node->following();
  767. $f_ids = array();
  768. foreach ($follow_list as $key => $value) {
  769. $f_ids[] = new MongoId($value);
  770. }
  771. $conditions = array(
  772. 'user'=>array('in',$f_ids),
  773. 'status'=>array('==',1),
  774. 'time'=>array('<',$last_obj_time)
  775. );
  776. $order = array(
  777. '_id'=>'desc',
  778. );
  779. $model = new Topic();
  780. $pagedata = CommonFn::getPagedataById($model,20,$conditions,$order);
  781. $topics = $pagedata['res'];
  782. foreach ($topics as $key=>$value) {
  783. if($user){
  784. //判断用户是否收藏过该帖子
  785. $z_fav = new ZFav();
  786. $fav = $z_fav->getFavByFavObj($user_id,$value['id']);
  787. if(empty($fav)){
  788. $value['is_faved'] = false;
  789. }else{
  790. $value['is_faved'] = true;
  791. }
  792. //判断用户是否喜欢过该帖子
  793. $z_like = new ZLike();
  794. $like = $z_like->getLikeByLikeObj($user_id,$value['id']);
  795. if(empty($like)){
  796. $value['is_liked'] = false;
  797. }else{
  798. $value['is_liked'] = true;
  799. }
  800. }else{
  801. $value['is_faved'] = false;
  802. $value['is_liked'] = false;
  803. }
  804. $topics[$key] = $value;
  805. }
  806. $data['topic_list'] = $topics;
  807. CommonFn::requestAjax(true,'',$data,200,array('has_more' => $pagedata['has_more'],'page_size'=>$pagedata['page_size']));
  808. }
  809. //我的关注接口
  810. public function actionFollowList(){
  811. $user_id = Yii::app()->getRequest()->getParam("user_id");
  812. $to_user = Yii::app()->getRequest()->getParam("to_user_id");
  813. $page = Yii::app()->getRequest()->getParam("page");
  814. $page_size = Yii::app()->getRequest()->getParam("page_size",20);
  815. if($to_user){
  816. $uid = $to_user;
  817. $user_node = new UserNodeRecord($to_user);
  818. $current_user_node = new UserNodeRecord($user_id);
  819. $need_refresh = true;
  820. }else{
  821. $uid = $user_id;
  822. $user_node = new UserNodeRecord($user_id);
  823. }
  824. $follow_list = $user_node->following();
  825. $sum = count($follow_list);
  826. $follow_list = array_slice($follow_list,$page_size*($page-1),$page_size*$page);
  827. $user_model = new RUser();
  828. foreach ($follow_list as $key => $f_user) {
  829. $follow_list[$key] = $user_model->parseRow(RUser::get(new MongoId($f_user)),array('id','user_name','sex','avatar','level','city_info','pets','certify_status','certify_info','can_access'));
  830. if(isset($need_refresh)){
  831. $follow_list[$key]['relation'] = $current_user_node->relation($f_user);
  832. }else{
  833. $follow_list[$key]['relation'] = $user_node->relation($f_user);
  834. }
  835. }
  836. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$follow_list,200,array('sum_count' => $sum ,'sum_page'=> ceil($sum/$page_size),'page_size'=>$page_size,'current_page'=>$page));
  837. }
  838. //粉丝列表
  839. public function actionFansList(){
  840. $user_id = Yii::app()->getRequest()->getParam("user_id");
  841. $to_user = Yii::app()->getRequest()->getParam("to_user_id");
  842. $page = Yii::app()->getRequest()->getParam("page");
  843. $page_size = Yii::app()->getRequest()->getParam("page_size",20);
  844. if($to_user){
  845. $uid = $to_user;
  846. $user_node = new UserNodeRecord($to_user);
  847. $current_user_node = new UserNodeRecord($user_id);
  848. $need_refresh = true;
  849. }else{
  850. $uid = $user_id;
  851. $user_node = new UserNodeRecord($user_id);
  852. }
  853. $followed_by = $user_node->followed_by();
  854. $sum = count($followed_by);
  855. $followed_by = array_slice($followed_by,$page_size*($page-1),$page_size*$page);
  856. $user_model = new RUser();
  857. foreach ($followed_by as $key => $f_user) {
  858. $followed_by[$key] = $user_model->parseRow(RUser::get(new MongoId($f_user)),array('id','user_name','sex','avatar','level','city_info','pets','certify_status','certify_info','can_access'));
  859. if(isset($need_refresh)){
  860. $followed_by[$key]['relation'] = $current_user_node->relation($f_user);
  861. }else{
  862. $followed_by[$key]['relation'] = $user_node->relation($f_user);
  863. }
  864. }
  865. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$followed_by,200,array('sum_count' => $sum ,'sum_page'=> ceil($sum/$page_size),'page_size'=>$page_size,'current_page'=>$page));
  866. }
  867. //推荐关注用户
  868. public function actionRecommendUsers(){
  869. $user_id = Yii::app()->getRequest()->getParam("user_id");
  870. $city_info = Yii::app()->getRequest()->getParam("city_info");
  871. $city_info = json_decode($city_info,true);
  872. $user_obj = CommonFn::apigetObJ($user_id,"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  873. $user_node = new UserNodeRecord($user_obj->_id);
  874. $follow_list = $user_node->following();
  875. $follow_users = array();
  876. foreach ($follow_list as $key => $value) {
  877. $follow_users[] = new MongoId($value);
  878. }
  879. $follow_users[] = $user_obj->_id;
  880. $criteria = new EMongoCriteria;
  881. $criteria->certify_status('==',1);
  882. $criteria->_id('notin',$follow_users);
  883. $criteria->is_fake_user('!=',1);
  884. $criteria->sort('last_visit_time',EMongoCriteria::SORT_DESC);
  885. $criteria->limit(5);
  886. $cursor = RUser::model()->findAll($criteria);
  887. $rows = RUser::model()->parse($cursor,true,array('id','user_name','sex','avatar','level','city_info','certify_status','certify_info','can_access'));
  888. $certify_users = array();
  889. foreach ($rows as $value) {
  890. $value['recommend_reason'] = $value['certify_info'];
  891. $certify_users[] = $value;
  892. }
  893. $criteria = new EMongoCriteria;
  894. if(isset($city_info['province']) && $city_info['province']){
  895. $criteria->city_info->province('==',$city_info['province']);
  896. }else{
  897. $criteria->city_info->province('==','上海市');
  898. }
  899. $criteria->_id('notin',$follow_users);
  900. $criteria->is_fake_user('!=',1);
  901. $criteria->certify_status('!=',1);
  902. $criteria->sort('last_visit_time',EMongoCriteria::SORT_DESC);
  903. $criteria->limit(10);
  904. $cursor = RUser::model()->findAll($criteria);
  905. $rows = RUser::model()->parse($cursor,true,array('id','user_name','sex','avatar','level','city_info','certify_status','certify_info','can_access'));
  906. $local_user = array();
  907. foreach ($rows as $value) {
  908. $value['recommend_reason'] = '同城用户';
  909. $local_user[] = $value;
  910. }
  911. $criteria = new EMongoCriteria;
  912. if(isset($city_info['province']) && $city_info['province']){
  913. $criteria->city_info->province('!=',$city_info['province']);
  914. }else{
  915. $criteria->city_info->province('!=','上海市');
  916. }
  917. $criteria->_id('notin',$follow_users);
  918. $criteria->is_fake_user('!=',1);
  919. $criteria->certify_status('!=',1);
  920. $criteria->sort('posts_count',EMongoCriteria::SORT_DESC);
  921. $criteria->sort('last_visit_time',EMongoCriteria::SORT_DESC);
  922. $criteria->limit(5);
  923. $cursor = RUser::model()->findAll($criteria);
  924. $rows = RUser::model()->parse($cursor,true,array('id','user_name','sex','avatar','level','city_info','certify_status','certify_info','can_access'));
  925. $hot_users = array();
  926. foreach ($rows as $value) {
  927. $value['recommend_reason'] = '活跃用户';
  928. $hot_users[] = $value;
  929. }
  930. $result = array_merge($certify_users,$local_user,$hot_users);
  931. shuffle($result);
  932. foreach ($result as $key => $user) {
  933. $result[$key]['relation'] = $user_node->relation($user['id']);
  934. }
  935. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),array('recommend_list'=>$result));
  936. }
  937. //用户登出接口
  938. public function actionLogout(){
  939. $user_id = Yii::app()->getRequest()->getParam("user_id");
  940. $xinge_token = Yii::app()->getRequest()->getParam("xinge_token");
  941. $app_client_id = Yii::app()->getRequest()->getParam("app_client_id");
  942. require_once(APP_PATH."/protected/vendors/tencent/XingeApp.php");
  943. if($app_client_id == '2'){
  944. $xinge_config = Yii::app()->params['xingeConfig']['android'];
  945. $push = new XingeApp($xinge_config['accessId'],$xinge_config['secretKey']);
  946. $ret = $push->DeleteTokenOfAccount($user_id,$xinge_token);
  947. CommonFn::requestAjax(true,'注销成功');
  948. }elseif($app_client_id == '1'){
  949. $xinge_ios_config = Yii::app()->params['xingeConfig']['ios'];
  950. $push = new XingeApp($xinge_ios_config['accessId'],$xinge_ios_config['secretKey']);
  951. $ret = $push->DeleteTokenOfAccount($user_id,$xinge_token);
  952. CommonFn::requestAjax(true,'注销成功');
  953. }else{
  954. CommonFn::requestAjax(false,'操作失败');
  955. }
  956. }
  957. }