UserController.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  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. public function actionEdit(){
  377. $data['_id'] = Yii::app()->getRequest()->getParam('user_id');
  378. if(!CommonFn::isMongoId($data['_id'])){
  379. CommonFn::requestAjax(false,CommonFn::getMessage('user','id_not_exist'),201);
  380. }
  381. $model = new RUser();
  382. $user = CommonFn::apigetObJ($data['_id'],"ZUser",CommonFn::getMessage('user','id_not_exist'),201);
  383. //需要进行修改的数据内容
  384. $data['avatar'] = Yii::app()->getRequest()->getParam('avatar','');
  385. $data['mobile'] = Yii::app()->getRequest()->getParam('mobile','');
  386. $data['sex'] = intval(Yii::app()->getRequest()->getParam('sex'));
  387. $data['user_name']= Yii::app()->getRequest()->getParam('user_name','');
  388. $data['city_info'] = json_decode(Yii::app()->request->getParam('city_info'),true);
  389. //防止city_info出现非法数据
  390. if(!isset($data['city_info']['province'])){
  391. $data['city_info']['province'] = '';
  392. $data['city_info']['city'] = '';
  393. $data['city_info']['area'] = '';
  394. }elseif(!isset($data['city_info']['city'])){
  395. $data['city_info']['city'] = '';
  396. $data['city_info']['area'] = '';
  397. }elseif(!isset($data['city_info']['area'])){
  398. $data['city_info']['area'] = '';
  399. }
  400. if($data['avatar']){
  401. if(!CommonFn::checkPicFormat($data['avatar'])){
  402. CommonFn::requestAjax(false,CommonFn::getMessage('user','user_avatar_illegal'));
  403. }
  404. }
  405. if($user->certify_status == 1 && $data['user_name'] && $user->user_name != $data['user_name']){
  406. CommonFn::requestAjax(false,'你已通过认证,不允许修改昵称');
  407. }
  408. //过滤user_id ,检测本接口所需参数是否完整
  409. $item_count = 0;
  410. unset($data['_id']);
  411. //用户名检测
  412. if(isset($data['user_name']) && $data['user_name']){
  413. if(mb_strlen($data['user_name'],'utf-8')<2||mb_strlen($data['user_name'],'utf-8')>16){
  414. CommonFn::requestAjax(false,CommonFn::getMessage('user','username_length_illegal'));
  415. }
  416. $z_user = new ZUser();
  417. $z_user->validate_user_name($data['user_name']);
  418. $u_criteria = new EMongoCriteria();
  419. $u_criteria->user_name('==',$data['user_name']);
  420. $olduser = RUser::model()->find($u_criteria);
  421. if($olduser&&$olduser->_id!=$user->_id){
  422. CommonFn::requestAjax(false,CommonFn::getMessage('user','username_already_registered'));
  423. }
  424. }elseif(empty($data['user_name'])){
  425. $data['user_name'] = $user->user_name;
  426. }
  427. foreach($data as $key => $val){
  428. if(!empty($val)){
  429. if($key=='city_info' && empty($val['province'])){
  430. continue;
  431. }
  432. $item_count++;
  433. $user->{$key} = $val;
  434. }
  435. }
  436. //更新数据
  437. if($item_count){
  438. if($user->save(true)){
  439. $data = $user->parseRow($user->attributes,array(),true);
  440. CommonFn::requestAjax(true,CommonFn::getMessage('message','operation_success'),$data);
  441. }else{
  442. CommonFn::requestAjax(false,CommonFn::getMessage('message','operation_faild'));
  443. }
  444. }else{
  445. CommonFn::requestAjax(false,CommonFn::getMessage('message','params_illegal'));
  446. }
  447. }
  448. }