UserCenter.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\model\UserLevelRank;
  4. use app\common\model\UserMessage;
  5. use app\common\model\UserVitality;
  6. use app\common\validate\UserVali;
  7. use think\Db;
  8. use app\common\model\User;
  9. /**
  10. * @title 会员个人中心
  11. * @controller UserCenter
  12. * @group base
  13. */
  14. class UserCenter extends Base
  15. {
  16. public function initialize()
  17. {
  18. parent::initialize();
  19. parent::checkLogin();
  20. }
  21. /**
  22. * @title 获取个人信息
  23. * @desc 个人信息
  24. * @author qc
  25. * @url /api/User_center/getUserInfo
  26. * @method GET
  27. * @tag 个人信息
  28. * @header name:Authorization require:1 desc:Token
  29. * @return name:phone type:int default:-- desc:手机号
  30. * @return name:name type:string default:-- desc:昵称
  31. * @return name:headimg type:string default:-- desc:头像地址
  32. * @return name:sex type:int default:1 desc:性别(1男2女)
  33. * @return name:true_name type:string default:-- desc:真实姓名
  34. * @return name:invite_code type:string default:-- desc:邀请码
  35. * @return name:account_type type:int default:-- desc:账号类型1公司,2个人
  36. * @return name:hx_username type:string default:-- desc:环信账号用户名
  37. * @return name:hx_uuid type:string default:-- desc:环信账号uuid
  38. * @return name:hx_password type:string default:-- desc:环信密码
  39. * @return name:is_first type:int default:-- desc:企业组是否是第一个注册(1是0否【第一个注册有会员会员重置权限,公司其他人会员权限读取公司第一个注册的会员权限】)
  40. * @return name:user_level type:array default:-- desc:开通会员信息[为空就不是vip]
  41. * @return name:user_level.level_id type:int default:-- desc:等级id
  42. * @return name:user_level.end_date type:string default:-- desc:过期时间
  43. * @return name:user_level.name type:string default:-- desc:会员等级名称
  44. * @return name:user_level.logo type:string default:-- desc:会员等级logo
  45. *
  46. */
  47. public function getUserInfo()
  48. {
  49. $field = 'id,phone,name,level_id,headimg,openid,true_name,sex,invite_code,account_type,group_id,is_first,group_first,hx_username,hx_password,hx_uuid';
  50. $user_info = User::field($field)->where('id',$this->user_id)->find()->toArray();
  51. if($user_info['account_type'] == 2 || ($user_info['account_type']== 1 && $user_info['is_first'])){
  52. $user_level = UserLevelRank::field('r.id,r.level_id,r.end_time,r.end_date,l.name,l.logo')
  53. ->alias('r')
  54. ->leftJoin('UserLevel l','l.id = r.level_id')
  55. ->where([['r.user_id','=',$this->user_id],['r.end_time','>',time()]])->order('r.level_id desc')->find();
  56. }else{
  57. $user_level = UserLevelRank::field('r.id,r.level_id,r.end_time,r.end_date,l.name,l.logo')
  58. ->alias('r')
  59. ->leftJoin('UserLevel l','l.id = r.level_id')
  60. ->where([['r.user_id','=',$user_info['group_first']],['r.end_time','>',time()]])->order('r.level_id desc')->find();
  61. }
  62. $this->success('获取成功',['detail'=>$user_info,'user_level'=>$user_level ? $user_level->toArray() :null]);
  63. }
  64. /**
  65. * @title 编辑个人信息
  66. * @desc 编辑个人信息
  67. * @author qc
  68. * @url /api/User_center/updateUserInfo
  69. * @method POST
  70. * @tag 编辑信息
  71. * @header name:Authorization require:1 desc:Token
  72. * @param name:name type:string default:-- desc:昵称
  73. * @param name:headimg type:string default:-- desc:头像地址
  74. */
  75. public function updateUserInfo()
  76. {
  77. $headimg = input('post.headimg');
  78. $name = trim(input('post.name',''));
  79. $update_data= [];
  80. $update_data['name'] = $name;
  81. $update_data['headimg'] = $headimg;
  82. Db::name('store_member')->where('id',$this->user_id)->update($update_data);
  83. $field = 'phone,name,headimg';
  84. $user_info = Db::name('store_member')->field($field)->where('id',$this->user_id)->find();
  85. $this->success('编辑成功',['detail'=>$user_info]);
  86. }
  87. /**
  88. * @title 绑定手机号
  89. * @desc 绑定手机号
  90. * @author qc
  91. * @url /api/User_center/modifyPhone
  92. * @method POST
  93. * @header name:Authorization require:1 desc:Token
  94. * @param name:phone type:int require:1 default:-- desc:手机号
  95. * @param name:code type:int require:1 default:-- desc:手机号验证码
  96. * @return name:phone type:int default:-- desc:手机号
  97. * @return name:name type:string default:-- desc:昵称
  98. * @return name:headimg type:string default:-- desc:头像地址
  99. */
  100. public function modifyPhone()
  101. {
  102. $uid = $this->user_id;
  103. $phone = input('post.phone');
  104. $code = input('post.code');
  105. if(empty($phone) || empty($code) ) $this->error('参数错误');
  106. $field = 'id,phone,name,headimg';
  107. $user_info = Db::name('store_member')->field($field)->where('id',$this->user_id)->find();
  108. if($user_info['phone'] == $phone)$this->error('更换手机号与绑定手机号一致!');
  109. $check_code = $this->checkPhoneCode($phone,$code);
  110. if(!$check_code) $this->error('验证码错误');
  111. //判断手机号是否已注册
  112. $member_id = Db::name('store_member')
  113. ->where('phone','=',$phone)->where('is_deleted','=',0)->where('id','<>',$this->user_id)->value('id');
  114. if($member_id) $this->error('手机号已注册过');
  115. Db::name('store_member')->where('id',$uid)->update(['phone'=>$phone]);
  116. $user_info['phone'] = $phone;
  117. $this->updatePhoneCode($check_code);
  118. $this->success('绑定成功',$user_info);
  119. }
  120. /**
  121. * @title 更换或设置登录密码
  122. * @desc 更换或设置登录密码
  123. * @author qc
  124. * @url /api/User_center/modifyPassword
  125. * @method POST
  126. * @header name:Authorization require:1 desc:Token
  127. * @param name:phone type:int require:1 default:-- desc:手机号
  128. * @param name:code type:int require:1 default:-- desc:手机号验证码
  129. * @param name:password type:string default:-- desc:密码
  130. */
  131. public function modifyPassword()
  132. {
  133. $uid = $this->user_id;
  134. $phone = input('post.phone');
  135. $code = input('post.code');
  136. $password = input('post.password');
  137. if(empty($phone) || empty($code) || empty($password) ) $this->error('参数错误');
  138. $field = 'id,phone';
  139. $user_info = User::field($field)->where('id',$this->user_id)->find()->toArray();
  140. if(!$user_info['phone']) $this->error('请先绑定手机号');
  141. if($user_info['phone'] != $phone) $this->error('与绑定手机号不一致');
  142. $check_code = $this->checkPhoneCode($phone,$code);
  143. if(!$check_code) $this->error('验证码错误');
  144. $validate = new UserVali();
  145. if (!$validate->scene('reset_password')->check(['phone'=>$phone,'password'=>$password])) {
  146. $this->error($validate->getError());
  147. }
  148. $encryption_password = encrypt_password($password);
  149. User::where('id',$uid)->update(['password'=>$password,'encryption_password'=>$encryption_password]);
  150. $this->updatePhoneCode($check_code);
  151. $this->success('更换成功');
  152. }
  153. /**
  154. * @title 完善用户openid
  155. * @desc 完善用户openid
  156. * @author qc
  157. * @method POST
  158. * @tag 编辑信息
  159. * @url /api/User_center/saveOpenid
  160. * @header name:Authorization require:1 desc:Token
  161. * @param name:code type:string require:1 default:-- desc:code
  162. */
  163. public function saveOpenid()
  164. {
  165. $code = input('post.code');
  166. if (empty($code)) $this->error('参数错误');
  167. $res = http_get('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.config('app.official_account')['appid'].'&secret='.config('app.official_account')['secret'].'&code='.$code.'&grant_type=authorization_code');
  168. $res = json_decode($res,true);
  169. if (empty($res['openid'])) $this->error('未获取到openid');
  170. $member_data = ['openid' => $res['openid']];
  171. Db::name('store_member')->where('id',$this->user_id)->update($member_data);
  172. $this->success('已绑定openid');
  173. }
  174. /**
  175. * @title 获取消息未读量
  176. * @desc 获取消息未读量
  177. * @author qc
  178. * @method GET
  179. * @url /api/User_center/getUnreadNum
  180. * @header name:Authorization require:1 desc:Token
  181. * @param name:num type:int default:0 desc:未读数量
  182. */
  183. public function getUnreadNum()
  184. {
  185. $num = UserMessage::where(['user_id'=>$this->user_id])->where('is_read',0)->count();
  186. $this->success('ok',['num'=>$num]);
  187. }
  188. /**
  189. * @title 消息列表【会员消息】
  190. * @desc 我的点赞
  191. * @author qc
  192. * @method GET
  193. * @url /api/User_center/getMessageList
  194. * @header name:Authorization require:1 desc:Token
  195. * @param name:title type:string default:-- desc:标题
  196. * @param name:page type:int default:-- desc:页数
  197. * @param name:page_num type:int default:-- desc:每页数
  198. *
  199. * @return name:id type:int default:-- desc:记录id
  200. * @return name:title type:string default:-- desc:标题
  201. * @return name:content type:string default:-- desc:内容
  202. * @return name:create_at type:string default:-- desc:时间
  203. * @return name:is_read type:int default:-- desc:是否已读【0否1是】
  204. */
  205. public function getMessageList()
  206. {
  207. $list = UserMessage::where(['user_id'=>$this->user_id])
  208. ->limit($this->off_set,$this->page_num)
  209. ->order(['id'=>'desc'])
  210. ->select()->toArray();
  211. //if(!empty($list)) UserMessage::where('id','in',array_column($list,'id'))->update(['is_read'=>1]);
  212. $this->success('ok',['list'=>$list]);
  213. }
  214. /**
  215. * @title 消息详情【会员消息】
  216. * @desc 消息详情
  217. * @author qc
  218. * @method GET
  219. * @url /api/User_center/getMessageInfo
  220. * @header name:Authorization require:1 desc:Token
  221. * @param name:id type:int default:-- desc:消息记录id
  222. * @return name:title type:string default:-- desc:标题
  223. * @return name:content type:string default:-- desc:内容
  224. * @return name:create_at type:string default:-- desc:时间
  225. * @return name:is_read type:int default:-- desc:是否已读【0否1是】
  226. */
  227. public function getMessageInfo()
  228. {
  229. $detail= UserMessage::where(['user_id'=>$this->user_id,'id'=>input('get.id')])->find()->toArray();
  230. UserMessage::where('id',input('get.id'))->update(['is_read'=>1]);
  231. $this->success('ok',['detail'=>$detail]);
  232. }
  233. /**
  234. * @title 用户注销
  235. * @desc 用户注销
  236. * @author qc
  237. * @method GET
  238. * @url /api/User_center/delUser
  239. * @header name:Authorization require:1 desc:Token
  240. */
  241. public function delUser()
  242. {
  243. User::where('id',$this->user_id)->update(['is_deleted' => '1','phone'=>'','email'=>'']);
  244. $this->success('注销成功');
  245. }
  246. /**
  247. * @title 以下接口为二期需求
  248. * @desc 以下接口为二期需求
  249. * @author qc
  250. * @url /api/User_center/secondPhase
  251. * @method GET
  252. * @return name:1 type:string default:-- desc:以下接口为二期需求
  253. */
  254. public function secondPhase(){}
  255. /**
  256. * @title 获取会员活跃度
  257. * @desc 获取会员活跃度
  258. * @author qc
  259. * @url /api/User_center/getUserVitality
  260. * @method GET
  261. * @param name:date_str type:int default:-- desc:时间查询【按年:2023,按月:2023-02,按天:2023-02-22】
  262. * @return name:type type:int default:-- desc:1:安卓手机,2:ios手机设备,3:安卓ipad,4:iosipad,5:h5,pc电脑
  263. * @return name:num type:int default:-- desc:1:活跃度(登录天数)
  264. */
  265. public function getUserVitality()
  266. {
  267. $date_str = input('get.date_str');
  268. $date_arr = explode('-',$date_str);
  269. $where = [];
  270. $where['user_id'] = $this->user_id;
  271. if(isset($date_arr[0])) $where['year'] =$date_arr[0];
  272. if(isset($date_arr[1])) $where['month'] =$date_arr[1];
  273. if(isset($date_arr[2])) $where['day'] =$date_arr[2];
  274. $list = UserVitality::field('type,count(id) num')->where($where)->group('type')->select()->toArray();
  275. $this->success('ok',['list'=>$list]);
  276. }
  277. /**
  278. * @title 获取会员活跃度日志
  279. * @desc 获取会员活跃度日志
  280. * @author qc
  281. * @url /api/User_center/getUserVitalityLog
  282. * @method GET
  283. * @param name:page type:int default:0 desc:页数
  284. * @param name:page_num type:int default:20 desc:每页数
  285. * @param name:date_str type:int default:-- desc:时间查询【按年:2023,按月:2023-02,按天:2023-02-22】
  286. * @param name:type type:int default:-- desc:1:安卓手机,2:ios手机设备,3:安卓ipad,4:iosipad,5:h5,pc电脑
  287. * @return name:type type:int default:-- desc:1:安卓手机,2:ios手机设备,3:安卓ipad,4:iosipad,5:h5,pc电脑
  288. * @return name:year type:string default:-- desc:年
  289. * @return name:month type:string default:-- desc:月
  290. * @return name:day type:string default:-- desc:日
  291. * @return name:day_time type:string default:-- desc:日期
  292. * @return name:create_at type:string default:-- desc:具体时间
  293. */
  294. public function getUserVitalityLog()
  295. {
  296. $date_str = input('get.date_str');
  297. $date_arr = explode('-',$date_str);
  298. $where = [];
  299. $where['user_id'] = $this->user_id;
  300. $where['type'] = input('get.type');
  301. if(isset($date_arr[0])) $where['year'] =$date_arr[0];
  302. if(isset($date_arr[1])) $where['month'] =$date_arr[1];
  303. if(isset($date_arr[2])) $where['day'] =$date_arr[2];
  304. $list = UserVitality::where($where)->order('id desc')->select()->toArray();
  305. $this->success('ok',['list'=>$list]);
  306. }
  307. }