<?php /** * 登录注册 * Author: xiaojie * DateTime: 2018/11/26 13:50 */ namespace app\portal\controller; use app\portal\model\CityCategoryModel; use app\portal\model\UserModel; use app\portal\validate\UsersValidate; use cmf\controller\HomeBaseController; use app\portal\model\CollectionModel; use cmf\lib\Storage; use think\Db; use anerg\OAuth2\OAuth; use think\Config; use app\portal\model\PortalPostModel; class LoginController extends HomeBaseController { private $limit = 8;//收藏,搜索分页 private $appkey = 737607150;//微博appkey private $appsecret = 'd80b43a1e74e8ba095590b36a3459480';//微博appsecret private $redirect_uri = 'http://www.starplanet.cn/portal/login/wb_login';//回调地址 private $appkey1 = 'wx9cfa880272f186bf';//微信开放平台appkey private $appsecret1 = '11b643393b1e54d6ef5eaa984ba4e545';//微信开放平台appsecret private $appkey2 = 'wx0bd7bc2aa0f332d6';//微信公众号appkey private $appsecret2 = 'b62e49f48f48de7b7fff2ea0af3939de';//微信公众号appsecret //登录页面 public function login(){ return $this->fetch(); } //登录提交 public function loginCommit(){ //提交参数手机号(mobile),密码(user_pass) $param = $this->request->param(); $validate = new UsersValidate(); $userModel = new UserModel(); $map = [ 'mobile' => $param['mobile'], 'user_pass' => cmf_password($param['user_pass']), 'user_type' => 2, 'user_status' => 1, ]; $userInfo = $userModel->where($map)->find(); if(!$userInfo){ $this->apiResponse(0,'账号或密码错误'); } $ip = get_client_ip(); $data = [ 'id' => $userInfo['id'], 'last_login_time' => time(), 'last_login_ip' => $ip, ]; if(!$validate->scene('edit')->check($data)){ $this->apiResponse(0,$validate->getError()); } $res = $userModel->isUpdate(true)->save($data); if($res){ //用户信息存入session cmf_update_current_user($userInfo); $this->apiResponse(1,'登录成功'); } $this->apiResponse(0,'未知错误'); } //第三方登录页面 public function thirdLogin(){ return $this->fetch(); } //注册页面 public function register(){ return $this->fetch(); } //注册提交 public function registerCommit(){ //提交参数手机号(mobile),验证码(mobile_code),密码(user_pass) $param = $this->request->param(); //验证验证码是否正确 $common = new CommonController(); $common->validateMobileCode($param); //验证场景add $validate = new UsersValidate(); if(!$validate->scene('add')->check($param)){ $this->apiResponse(0,$validate->getError()); } if(empty($param['user_pass'])){ $this->apiResponse(0,'密码不能为空!'); } //是否已注册 $userModel = new UserModel(); $userInfo = $userModel->where(['mobile'=>$param['mobile'],'user_type'=>2])->find(); if($userInfo){ $this->apiResponse(0,'此账号已被注册'); } //新增注册信息 $info['mobile'] = $param['mobile']; $info['user_pass'] = cmf_password($param['user_pass']); $info['user_type'] = 2; $info['source'] = '本站'; $info['create_time'] = time(); $res = $userModel->allowField(true)->save($info); if($res){ $this->apiResponse(1,'注册成功'); } $this->apiResponse(0,'未知错误'); } //首页个人中心 public function info(){ $login = cmf_is_user_login(); if($login) { return $this->fetch(); } } //退出登录 public function logout(){ cmf_update_current_user(NULL); $this->apiResponse(1,'退出成功!'); } //首页个人中心修改头像 public function updateAvatar(){ //判断是否登录 $login = cmf_is_user_login(); if($login){ $file = $this->request->file('avatar'); if (empty($file)) { $this->apiResponse(0,'未检测出文件!'); } $result = $file->validate([ 'ext' => 'jpg,jpeg,png', 'size' => 1024 * 1024 ])->move(WEB_ROOT . 'upload' . DIRECTORY_SEPARATOR . 'avatar' . DIRECTORY_SEPARATOR); if ($result) { $avatarSaveName = str_replace('//', '/', str_replace('\\', '/', $result->getSaveName())); $avatar = 'avatar/' . $avatarSaveName; $avatarPath = WEB_ROOT . "upload/" . $avatar; $storage = new Storage(); $storage->upload($avatar, $avatarPath, 'image'); $id = cmf_get_current_user_id(); $userModel = new UserModel(); $res = $userModel->allowField(true)->update(['id'=>$id,'avatar'=>$avatar]); if($res){ $userInfo = $userModel->where('id',$id)->find(); cmf_update_current_user($userInfo); $this->apiResponse(1,'上传成功!'); }else{ $this->apiResponse(0,'上传失败!'); } } else { $this->apiResponse(0,$file->getError()); } }else{ $this->apiResponse(0,'请登录后修改头像!'); } } //个人中心编辑页面 public function editInfo(){ $login = cmf_is_user_login(); if($login) { return $this->fetch(); } } //个人中心编辑提交 public function updateNickname(){ //判断是否登录 $login = cmf_is_user_login(); $nickname = $this->request->param('nickname'); if($login){ $userModel = new UserModel(); $id = cmf_get_current_user_id(); if(empty($nickname)){ $this->apiResponse(0,'昵称不能为空!'); } $res = $userModel->allowField(true)->update(['id'=>$id,'user_nickname'=>$nickname]); if($res){ $userInfo = $userModel->where('id',$id)->find(); cmf_update_current_user($userInfo); $this->apiResponse(1,'保存成功!'); }else{ $this->apiResponse(0,'保存失败!'); } }else{ $this->apiResponse(0,'请登录后修改资料!'); } } //我的收藏列表 public function myCollection(){ $login = cmf_is_user_login(); if($login) { $limit = $this->limit; $uid = cmf_get_current_user_id(); // $collectionModel = new CollectionModel(); // $res = $collectionModel // ->where(['uid'=>$uid]) // ->field('id,post_id,category_name,city_name,post_url') // ->order('id desc') // ->paginate($limit); $res = Db::name('collection') ->alias('c') ->join('portal_post p','c.post_id = p.id') ->where(['c.uid'=>$uid,'p.delete_time'=>0]) ->field('c.id,c.category_name,c.city_name,c.post_url,p.post_title,p.post_excerpt,p.post_favorites') ->order('c.id desc') ->paginate($limit); $data = $res->toArray(); $page = $res->render(); // $post_ids = array_unique(array_column($data['data'],'post_id')); // $data1 = Db::name('portal_post') // ->whereIn('id',$post_ids) // ->where('delete_time', 0) // ->field('id,post_title,post_excerpt,post_favorites') // ->order('weigh desc') // ->select() // ->toArray(); // foreach($data['data'] as &$value){ // $value['post_title'] = ''; // $value['post_excerpt'] = ''; // $value['post_favorites'] = ''; // foreach ($data1 as $item) { // if($value['post_id'] == $item['id']){ // $value['post_title'] = $item['post_title']; // $value['post_excerpt'] = $item['post_excerpt']; // $value['post_favorites'] = $item['post_favorites']; // } // } // } $this->assign('res',$data['data']); $this->assign('page',$page); return $this->fetch(); } } //搜索列表 public function searchList(){ $keyword = $this->request->param('keyword'); if(isset($keyword) && !empty($keyword)){ $limit = $this->limit; $res = Db::name('portal_post') ->alias('p') ->join('city_category c','p.city_id = c.id','LEFT') ->join('portal_category_post c_p','p.id = c_p.post_id','LEFT') ->where('p.post_title','like','%'.$keyword.'%') ->where('c_p.category_id','<>',CityCategoryModel::xyhl) ->where('p.delete_time', 0) ->field('p.id,p.post_title,p.post_excerpt,p.post_favorites,c.name city_name,c.id city_id') ->order('p.weigh desc') ->paginate($limit,false,['query'=>request()->param()]); $data = $res->toArray(); $page = $res->render(); $post_ids = array_column($data['data'],'id'); //查找分类名称 $category = Db::name('portal_category_post') ->alias('c_p') ->join('portal_category c','c_p.category_id = c.id','LEFT') ->whereIn('c_p.post_id',$post_ids) ->field('c.id,c_p.post_id,c.name') ->select() ->toArray(); foreach($data['data'] as &$value){ $value['post_title'] = str_replace($keyword,'<span style="color:rgba(9, 255, 142, 1);">'.$keyword.'</span>',$value['post_title']); foreach($category as $item){ if($value['id'] == $item['post_id']){ $value['category_name'] = $item['name']; $value['post_url'] = $this->getDetailUrl($item['id'],$value['city_id']); } } } //查询总数 $count = Db::name('portal_post') ->alias('p') ->join('portal_category_post c_p','p.id = c_p.post_id','LEFT') ->where('p.post_title','like','%'.$keyword.'%') ->where('c_p.category_id','<>',CityCategoryModel::xyhl) ->where('p.delete_time', 0) ->count(); }else{ $count = 0; $data['data'] = []; $page = ''; } $this->assign('count',$count); $this->assign('res',$data['data']); $this->assign('page',$page); return $this->fetch(); } //获取各个板块详情页位置 public function getDetailUrl($c_id,$city_id){ $url = ''; switch ($c_id) { case CityCategoryModel::xqgs: $url = '/portal/star/getStoryDetail'; break; case CityCategoryModel::xqyy: $url = '/portal/region/getMoreVideo?city_id='.$city_id; break; case CityCategoryModel::whmj: $url = '/portal/star/getSceneryDetail'; break; case CityCategoryModel::yyzx: $url = '/portal/star/getFoodDetail'; break; case CityCategoryModel::lsmq: $url = '/portal/star/getHotelDetail'; break; case CityCategoryModel::hlst: $url = '/portal/star/getEcologyDetail'; break; case CityCategoryModel::blcx: $url = '/portal/star/getTravelDetail'; break; case CityCategoryModel::mxft: $url = '/portal/region/getStarDetail'; break; case CityCategoryModel::djkb: $url = '/portal/region/getNewsDetail'; break; case CityCategoryModel::djrz: $url = '/portal/region/getNoteDetail'; break; case CityCategoryModel::tqwl: $url = '/portal/region/getFutureDetail'; break; case CityCategoryModel::qlxc: $url = '/portal/enjoy/getEnjoyDetail'; break; case CityCategoryModel::sjmy: $url = '/portal/enjoy/getEnjoyDetail'; break; case CityCategoryModel::stsy: $url = '/portal/enjoy/getEnjoyDetail'; break; case CityCategoryModel::hwtt: $url = '/portal/enjoy/getEnjoyDetail'; break; case CityCategoryModel::lylx: $url = '/portal/scout/getTravelDetail'; break; case CityCategoryModel::ddfw: $url = '/portal/scout/getSceneryDetail'; break; case CityCategoryModel::cysj: $url = '/portal/scout/getSceneryDetail'; break; case CityCategoryModel::yjyr: $url = '/portal/scout/getSceneryDetail'; break; default: } return $url; } //第三方微信pc登录 public function wx_login(){ $code = $this->request->get('code'); $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appkey1.'&secret='.$this->appsecret1.'&code='.$code.'&grant_type=authorization_code'; $res = $this->http_get($url); $json_arr = json_decode($res,true); if(!isset($json_arr['access_token'])&&empty($json_arr['access_token'])){ //用户取消登录 $this->redirect('/portal/login/thirdLogin'); } $token = $json_arr['access_token']; $openid = $json_arr['openid']; //通过access_token获取用户信息 $url1 = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$token.'&openid='.$openid; $res1 = $this->http_get($url1); $info = json_decode($res1,true); //查询该微信用户是否存在 $where = ['wb_id'=>$info['openid'],'source'=>'微信']; $user = $this->findThird($where); //获取微博id,昵称,头像 $userModel = new UserModel(); $ip = get_client_ip(); $users['last_login_time'] = time(); $users['last_login_ip'] = $ip; if($user){ $users['user_nickname'] = $info['nickname']; $users['avatar'] = $info['headimgurl']; $userModel->where(['wb_id'=>$info['openid'],'source'=>'微信'])->update($users); }else{ $users['wb_id'] = $info['openid']; $users['user_nickname'] = $info['nickname']; $users['avatar'] = $info['headimgurl']; $users['source'] = '微信'; $users['user_type'] = 2; $users['create_time'] = time(); $userModel->create($users); } $userInfo = $this->findThird($where); cmf_update_current_user($userInfo); $this->redirect('/'); } //第三方微信移动端网页登录 public function wx_login_mobile(){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appkey2.'&secret='.$this->appsecret2; $res = $this->http_get($url); $json_arr = json_decode($res,true); if(!isset($json_arr['access_token'])&&empty($json_arr['access_token'])){ //用户取消登录 $this->redirect('/portal/login/thirdLogin'); } $token = $json_arr['access_token']; $openid = 'oYOYl5hbULoKimG5R8Uk-Paha0d8'; //通过access_token获取用户信息 $url1 = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$token.'&openid='.$openid.'&lang=zh_CN'; $res1 = $this->http_get($url1); $info = json_decode($res1,true); var_dump($info);exit; } //第三方微博登录 public function wb_login(){ $code = $this->request->get('code'); $url = 'https://api.weibo.com/oauth2/access_token'; //要传的数据 $data = [ 'client_id' => $this->appkey, 'client_secret'=>$this->appsecret, 'grant_type'=>'authorization_code', 'code'=>$code, 'redirect_uri'=>$this->redirect_uri //回调地址 ]; $res = $this->http_post($url,$data); $json_arr = json_decode($res,true); //获取access_token if(isset($json_arr['error_code'])&&!empty($json_arr['error_code'])){ //用户取消登录 $this->redirect('/portal/login/thirdLogin'); } $token = $json_arr['access_token']; //存token到session session('token', $token); $uid = $json_arr['uid']; //发送get请求,获取登陆用户的信息 $info = $this->http_get('https://api.weibo.com/2/users/show.json?access_token='.$token.'&uid='.$uid); $info = json_decode($info,true); //查询该微博用户是否存在 $where = ['wb_id'=>$info['id'],'source'=>'微博']; $user = $this->findThird($where); //获取微博id,昵称,头像 $userModel = new UserModel(); $ip = get_client_ip(); $users['last_login_time'] = time(); $users['last_login_ip'] = $ip; if($user){ $users['user_nickname'] = $info['screen_name']; $users['avatar'] = $info['profile_image_url']; $userModel->where(['wb_id'=>$info['id'],'source'=>'微博'])->update($users); }else{ $users['wb_id'] = $info['id']; $users['user_nickname'] = $info['screen_name']; $users['avatar'] = $info['profile_image_url']; $users['source'] = '微博'; $users['user_type'] = 2; $users['create_time'] = time(); $userModel->create($users); } $userInfo = $this->findThird($where); cmf_update_current_user($userInfo); $this->redirect('/'); } //微博分享 public function wb_share(){ $login = cmf_is_user_login(); if($login) { $token = session('token'); $title = $this->request->post('title');//分享标题 $share_url = $this->request->post('share_url');//分享url $article_id = $this->request->post('id');//分享文章id $url = 'https://api.weibo.com/2/statuses/share.json'; $data = [ 'access_token' => $token, 'status' => $title . " " . $share_url ]; $res = $this->http_post($url, $data); $json_arr = json_decode($res, true); if (isset($json_arr['error_code']) && !empty($json_arr['error_code'])) { $this->apiResponse(0, $json_arr['error']); } $postModel = new PortalPostModel(); $postModel->where('id', $article_id)->setInc('post_share_wb', 1); $this->apiResponse(1, '分享成功!'); }else{ $this->apiResponse(0, '请使用微博登录后操作!'); } } //取消授权 public function wb_cancel(){ $this->redirect('/'); } //查询第三方用户是否存在 public function findThird($where){ $info = Db::name('user') ->where($where) ->find(); return $info; } //获取微信分享配置信息 public function wxShare($url=''){ $jsapiTicket = $this->getSignature(); // 注意 URL 一定要动态获取,不能 hardcode. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; if($url === '') { $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; } $timestamp = time(); $nonceStr = $this->createNonceStr(); $string = 'jsapi_ticket='.$jsapiTicket.'&noncestr='.$nonceStr.'×tamp='.$timestamp.'&url='.$url; $signature = sha1($string); $data = [ "appId" => $this->appkey2, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ]; $this->assign('data',$data); return $this->fetch('./public/share'); } //获取微信分享签名随机字符串 public function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } //获取access_token public function getWxAccessToken(){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appkey2.'&secret='.$this->appsecret2; $res = $this->http_get($url); $json_arr = json_decode($res,true); $token = $json_arr['access_token']; return $token; } //获取微信分享签名 public function getSignature(){ if(isset($_SESSION['ticket_expire_time']) && $_SESSION['ticket_expire_time'] > time() && $_SESSION['ticket']){ $ticket = $_SESSION['ticket']; }else{ $token = $this->getWxAccessToken(); $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$token.'&type=jsapi'; $res = $this->http_get($url); $json_arr = json_decode($res,true); $ticket = $json_arr['ticket']; $_SESSION['ticket'] = $ticket; $_SESSION['ticket_expire_time'] = time()+7000; } return $ticket; } //curl get请求 public function http_get($url){ $curl = curl_init();//启动一个CURL会话 curl_setopt($curl, CURLOPT_URL,$url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, false);//不开启header curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回 $result = curl_exec($curl); //执行操作 curl_close($curl); return $result; } //curl post请求 public function http_post($url,$data){ $curl = curl_init();//启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_POST, true); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // Post提交的数据包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, false); // 开启header //curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//请求头部 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回 $result = curl_exec($curl); //执行操作 curl_close($curl); return $result; } }