diff --git a/Application/Base/Service/ApplyService.class.php b/Application/Base/Service/ApplyService.class.php index 9d9577554..e41bfda6f 100644 --- a/Application/Base/Service/ApplyService.class.php +++ b/Application/Base/Service/ApplyService.class.php @@ -3,6 +3,7 @@ namespace Base\Service; use Base\Model\PromoteModel; use Base\Model\ApplyModel; +use Base\Tool\Request; class ApplyService { @@ -22,4 +23,29 @@ class ApplyService { M('apply', 'tab_')->where(['game_id' => $gameId, 'promote_id' => ['in', $ids]])->save($save); } + + public function getDownloadUrl($apply, $game = null) + { + $host = Request::getHost(); + if(empty($apply['dow_url'])) { + if ($game == null) { + $columns = ['sdk_version', 'add_game_address', 'and_dow_address', 'ios_game_address', 'ios_dow_address']; + $game = M('game','tab_')->field($columns)->where(['id' => $apply['game_id']])->find(); + } + if($game['sdk_version'] == 1){ + if($game['add_game_address'] != '') { + return $game['add_game_address']; + }else{ + return $host . substr($game['and_dow_address'], 1); + } + } else { + if($game['ios_game_address'] != ''){ + return $game['ios_game_address']; + }else{ + return $host . substr($game['ios_dow_address'], 1); + } + } + } + return $host . $apply['dow_url']; + } } \ No newline at end of file diff --git a/Application/Base/Tool/Request.class.php b/Application/Base/Tool/Request.class.php new file mode 100644 index 000000000..1176fe064 --- /dev/null +++ b/Application/Base/Tool/Request.class.php @@ -0,0 +1,138 @@ + + */ +class Request { + + private static $instance; + + private $serverInfo; + private $scheme; + + private function __construct() + { + $this->serverInfo = $_SERVER; + } + + public static function getInstance() + { + if (self::$instance == null) { + self::$instance = new static(); + } + return self::$instance; + } + + public function isWechat() + { + $userAgent = $this->getUserAgent(); + if (strpos($userAgent, 'MicroMessenger') == false && strpos($userAgent, 'Windows Phone') == false) { + return false; + } else { + return true; + } + } + + public function getUserAgent() + { + return $this->serverInfo['HTTP_USER_AGENT'] ?? ''; + } + + public function isMobile() + { + $isMobile = false; + $userAgent = $this->getUserAgent(); + $mobileAgents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad','iPod']; + foreach ($mobileAgents as $mobileAgent) { + if (stripos($userAgent, $mobileAgent) !== false) { + $isMobile = true; + } + } + return $isMobile; + } + + public function isIOS() + { + $userAgent = $this->getUserAgent(); + if(stripos($userAgent, 'iphone') !== false || strpos($userAgent, 'ipad') !== false) { + return true; + } + return false; + } + + public function isAndroid() + { + $userAgent = $this->getUserAgent(); + if(strpos($userAgent, 'android')) { + return true; + } + return false; + } + + public function isIOS13() + { + if (preg_match('/OS [1][3-9]_[1-9][_\d]* like Mac OS X/i')) { + return true; + } + return false; + } + + /** + * 获取客户端IP + */ + public function getClientIP() + { + $serverInfo = $this->serverInfo; + $ip = '0.0.0.0'; + if (isset($serverInfo['HTTP_X_FORWARDED_FOR'])) { + $items = explode(',', $serverInfo['HTTP_X_FORWARDED_FOR']); + $position = array_search('unknown', $items); + if (false !== $position) { + unset($items[$position]); + } + $ip = trim($items[0]); + } elseif (isset($serverInfo['HTTP_CLIENT_IP'])) { + $ip = $serverInfo['HTTP_CLIENT_IP']; + } elseif (isset($this->serverInfo['REMOTE_ADDR'])) { + $ip = $serverInfo['REMOTE_ADDR']; + } + return $ip; + } + + public function getHost() + { + $host = $this->getScheme() . '://' . $this->serverInfo['SERVER_NAME']; + if (in_array($this->serverInfo['SERVER_PORT'], [80, 443])) { + return $host; + } + return $host . ':' . $this->serverInfo['SERVER_PORT']; + } + + public function getScheme() + { + if ($this->scheme) { + return $this->scheme; + } + $serverInfo = $this->serverInfo; + if (isset($serverInfo['REQUEST_SCHEME'])) { + $this->scheme = $serverInfo['REQUEST_SCHEME']; + return $this->scheme; + } + if ((isset($serverInfo['HTTPS']) && $serverInfo['HTTPS'] == 'on') + || (isset($serverInfo['HTTP_X_FORWARDED_PROTO']) && $serverInfo['HTTP_X_FORWARDED_PROTO'] == 'https' + || (isset($serverInfo['SERVER_PORT']) && $serverInfo['SERVER_PORT'] == 443)) + ) { + $this->scheme = 'https'; + } else { + $this->scheme = 'http'; + } + return $this->scheme; + } + + public static function __callStatic($name, $arguments) + { + $instance = self::getInstance(); + return call_user_func_array([$instance, $name], $arguments); + } +} \ No newline at end of file diff --git a/Application/Home/Controller/DownloadController.class.php b/Application/Home/Controller/DownloadController.class.php new file mode 100644 index 000000000..30a46f3ea --- /dev/null +++ b/Application/Home/Controller/DownloadController.class.php @@ -0,0 +1,329 @@ + + */ +class DownloadController extends Controller { + + public function down_error($message='') + { + $this->assign("message",$message); + $this->display(); + } + + public function index($game_id=0,$promote_id=0){ + $applyModel = M('Apply','tab_'); + $map['status'] = 1; + $map['enable_status'] = 1; + $data = $applyModel + ->field('game_id,tab_apply.game_name,promote_id,promote_account,relation_game_id,pack_url,plist_url,`status`,enable_status,tab_apply.sdk_version') + ->join("tab_game ON tab_apply.game_id = tab_game.id AND promote_id = $promote_id AND game_id = $game_id ") + ->where($map) + ->find(); + $system_type = 1; + if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){ + $system_type = 2; + } + $gamemodel = new GameModel(); + $source = $gamemodel->getGameDownInfo($game_id); + $pack_url = $this->package($source['packet'],$promote_id); + M('Game','tab_')->where('id='.$data['game_id'])->setInc('dow_num'); + if(is_mobile_request()){ + if($data['sdk_version'] == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载")); + // if($data['sdk_version'] == 1 && is_weixin()) $this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载")); + if($data['sdk_version'] == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载")); + } + switch ($data['sdk_version']) { + case 1: + if(!empty($pack_url)){ + if(preg_match("/oss/", $pack_url)){ + $url=str_replace('-internal', '', $pack_url); + echo ""; + }elseif(preg_match("/clouddn/", $pack_url)){ + $url = "http://".$pack_url; + redirect($url); + }elseif(preg_match("/myqcloud/", $pack_url)){ + redirect($pack_url); + }elseif(preg_match("/bcebos/", $pack_url)){ + redirect($pack_url); + }else{ + if (!file_exists($pack_url)){ + $this->error('文件不存在哦 亲!'); + }else{ + redirect("http://".$_SERVER['HTTP_HOST'].ltrim($pack_url,'.')); + } + } + }else{ + $this->error('原包地址不存在'); + } + break; + default: + switch ($system_type) { + case 1: + if(!empty($pack_url)){ + if(preg_match("/oss/", $pack_url)){ + $url=str_replace('-internal', '', $pack_url); + echo ""; + }elseif(preg_match("/clouddn/", $pack_url)){ + $url = "http://".$pack_url; + redirect($url); + }elseif(preg_match("/myqcloud/", $pack_url)){ + redirect($pack_url); + }elseif(preg_match("/bcebos/", $pack_url)){ + redirect($pack_url); + }else{ + $this->down($pack_url); + } + }else{ + $this->error('原包地址不存在'); + } + break; + default: + $plist_url = substr($data['plist_url'],'1',strlen($data['plist_url'])); + Header("HTTP/1.1 303 See Other"); + Header("Location: "."itms-services://?action=download-manifest&url="."https://".$_SERVER["HTTP_HOST"]."/".$plist_url); + break; + } + break; + } + } + + /** + * 投放包下载 + * @param + * @author 鹿文学 + */ + public function launch_down_file($game_id=0,$promote_id=0,$platform_id=0,$position=1) { + + /* 检查游戏是否存在 */ + //$game = M('game','tab_')->field('id,game_name')->where(['id'=>$game_id])->find(); + //if(!is_array($game)) {$this->error('游戏不存在');} + + /* 检查渠道包是否存在或更改 */ + $applymodel = M('apply','tab_'); + + $apply = $applymodel->field('id,sdk_version,pack_url,plist_url') + ->where(['game_id'=>$game_id,'promote_id'=>$promote_id])->find(); + //if(!is_array($apply)) {$this->error('渠道不存在');} + + $launchmodel = M('apply_launch','tab_'); + + $map = array( + 'platform_id'=>$platform_id, + 'apply_id'=>$apply['id'], + 'position'=>$position, + ); + + $launch = $launchmodel->where($map)->find(); + + //if(!is_array($launch)) {$this->error('游戏包不存在');} + + /* 检查原包是否存在或更改 */ + $gamesource = M('game_source','tab_')->field('id,file_name,source_version')->where(['game_id'=>$game_id])->find(); + if(!is_array($gamesource)) {$this->error('文件不存在哦');} + + if($gamesource['file_name'] == $launch['game_source_filename']) { + + + $system_type = 1; + if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){ + $system_type = 2; + } + + $pack_url = $launch['launch_down_url']; + M('Game','tab_')->where(['id'=>$game_id])->setInc('dow_num'); + if(is_mobile_request()){ + if($apply['sdk_version'] == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载")); + if($apply['sdk_version'] == 1 && is_weixin())$this->redirect("Home/promotionofregistration",array('pid'=>$promote_id,'gid'=>$game_id,'lid'=>$platform_id,'p'=>$position,'message'=>"请使用安卓浏览器下载")); + if($apply['sdk_version'] == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载")); + } + switch ($apply['sdk_version']) { + case 1: + if(!empty($pack_url)){ + if(preg_match("/oss/", $pack_url)){ + $url=str_replace('-internal', '', $pack_url); + echo ""; + }elseif(preg_match("/clouddn/", $pack_url)){ + $url = "http://".$pack_url; + redirect($url); + }elseif(preg_match("/myqcloud/", $pack_url)){ + redirect($pack_url); + }elseif(preg_match("/bcebos/", $pack_url)){ + redirect($pack_url); + }else{ + + $url = ROOTTT . substr($pack_url,stripos($pack_url,'uploads')); + + if (!file_exists($url)){ + $this->error('文件不存在哦 亲!'); + }else{ + redirect($pack_url); + } + } + }else{ + $this->error('原包地址不存在'); + } + break; + default: + switch ($system_type) { + case 1: + if(!empty($pack_url)){ + if(preg_match("/oss/", $pack_url)){ + $url=str_replace('-internal', '', $pack_url); + echo ""; + }elseif(preg_match("/clouddn/", $pack_url)){ + $url = "http://".$pack_url; + redirect($url); + }elseif(preg_match("/myqcloud/", $pack_url)){ + redirect($pack_url); + }elseif(preg_match("/bcebos/", $pack_url)){ + redirect($pack_url); + }else{ + $this->down($pack_url); + } + }else{ + $this->error('原包地址不存在'); + } + break; + default: + $plist_url = $launch['launch_plist_url']; + if(stripos($plist_url,'https://') === false) { + $plist_url = 'https://'.$_SERVER['HTTP_HOST'].str_replace('./','/',$plist_url); + } + Header("HTTP/1.1 303 See Other"); + Header("Location: "."itms-services://?action=download-manifest&url=".$plist_url); + break; + } + break; + } + + + + + } else { + + $applymodel->where(['id'=>$apply['id']])->setField('enable_status',2); + + $this->error('游戏正在打包,请稍候'); + + } + + } + + + public function media_down_file($game_id=0,$type=1){ + $model = M('Game','tab_'); + $map['tab_game.id'] = $game_id; + $map['file_type'] = $type; + $data = $model + ->field('tab_game_source.*,tab_game.game_name,tab_game.add_game_address,tab_game.ios_game_address') + ->join("left join tab_game_source on tab_game.id = tab_game_source.game_id")->where($map)->find(); + if($type==1){ + if($data['file_url']!=''||!varify_url($data['add_game_address'])){ + $this->down($data['file_url']); + } + else{ + Header("HTTP/1.1 303 See Other"); + Header("Location: ".$data['add_game_address']); + } + }else{ + if($data['file_url']!=''||!varify_url($data['ios_game_address'])){ + $this->down($data['file_url']); + } + else{ + Header("HTTP/1.1 303 See Other"); + Header("Location: ".$data['ios_game_address']); + } + } + } + + public function down($file, $isLarge = false, $rename = NULL) + { + if(headers_sent())return false; + if(!$file) { + $this->error('文件不存在哦 亲!'); + } + if($rename==NULL){ + if(strpos($file, '/')===false && strpos($file, '\\')===false) + $filename = $file; + else{ + $filename = basename($file); + } + }else{ + $filename = $rename; + } + + header('Content-Description: File Transfer'); + header("Content-Type: application/force-download;"); + header('Content-Type: application/octet-stream'); + header("Content-Transfer-Encoding: binary"); + header("Content-Disposition: attachment; filename=\"$filename\""); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + header('Content-Length: '.filesize($file));//$_SERVER['DOCUMENT_ROOT']. + header("Pragma: no-cache"); //不缓存页面 + ob_clean(); + flush(); + if($isLarge) + self::readfileChunked($file); + else + readfile($file); + } + + public function down_material($game_id){ + $map['status'] = 1; + $game = M("game",'tab_')->where($map)->find($game_id); + $material = $game['material_url']; + if(file_exists($material) && is_file($material)){ + clearstatcache(); + $this->down($material); + }else{ + clearstatcache(); + $this->error('下载地址错误'); + } + + } + + /** + * 安卓打包渠道信息 + * @param $source_info 原包信息 + * @param $promote_id + * @return string + * author: xmy 280564871@qq.com + */ + public function package($source_info, $promote_id) + { + $file_path = $source_info['file_url']; + //验证原包是否存在 + if (!varify_url($file_path)) { + $this->error("未上传原包"); + } else { + + $result = M('apply', 'tab_') + ->alias('a') + ->field('id, pack_url, plist_url') + ->where(['a.game_id'=>$source_info['game_id'],'a.promote_id'=>$promote_id]) + ->find(); + if(empty($result)) { + $this->error('此游戏不存在'); + } + + if(GameModel::ANDROID == $source_info['sdk_version']){ + if(varify_url($result['pack_url'])) { + return $result['pack_url']; + } + }elseif(GameModel::IOS == $source_info['sdk_version']){ + if(varify_url($result['plist_url'])) { + return $result['plist_url']; + } + }else{ + $this->error('游戏版本错误'); + } + } + } +} diff --git a/Application/Home/Controller/HomeController.class.php b/Application/Home/Controller/HomeController.class.php index f8b481a16..53696a362 100644 --- a/Application/Home/Controller/HomeController.class.php +++ b/Application/Home/Controller/HomeController.class.php @@ -1,24 +1,9 @@ - -// +---------------------------------------------------------------------- - - namespace Home\Controller; use Think\Controller; use User\Api\MemberApi; +use Base\Tool\Request; /** * 前台公共控制器 @@ -142,6 +127,66 @@ class HomeController extends Controller $this->display(); } + public function landingPage() + { + $code = I('code', ''); + $data = []; + + $isWechat = Request::isWechat(); + $isIOS = Request::isIOS(); + $isAndroid = Request::isAndroid(); + $isIOS13 = Request::isIOS13(); + + $columns = [ + 'id', + 'sdk_version', + 'icon', + 'screenshot', + 'relation_game_id', + 'relation_game_name', + 'dow_status', + 'features', + 'flooring_page_imgs', + ]; + $map = ['id' => intval($data['game_id'])]; + + $game = M('game', 'tab_')->field($columns)->where($map)->find(); + if ($game['sdk_version'] == 1 && $isIOS) { + $map['relation_game_id'] = $game['relation_game_id']; + $map['sdk_version'] = 2; + $game = M('game', 'tab_')->field($columns)->where($map)->find(); + } elseif ($game['sdk_version'] == 2 && $isAndroid) { + $map['relation_game_id'] = $game['relation_game_id']; + $map['sdk_version'] = 1; + $game = M('game', 'tab_')->field($columns)->where($map)->find(); + } + + $apply = M('apply', 'tab_')->field(['game_id', 'enable_status']) + ->where(['promote_id' => $data['promote_id'], 'game_id' => $game['id']]) + ->find(); + $game['flooring_page_imgs'] = explode(',', $game['flooring_page_imgs']); + $game['icon'] = get_cover($game['icon'], 'path'); + + $downloadUrl = ''; + if ($isIOS13) { + $gameSource = M('GameSource', 'tab_')->where(array('game_id' => $gameId))->getField('org_plist_url'); + $downloadUrl = 'itms-services://?action=download-manifest&url=' . Request::getHost() . ltrim($gameSource['org_plist_url'], '.'); + } else { + $applyService = new ApplyService(); + $downloadUrl = $applyService->getDownloadUrl($apply, $game); + } + + $this->assign('downloadUrl', $downloadUrl); + $this->assign('isIOS13', $isIOS13); + $this->assign('isWechat', $isWechat); + $this->assign('isIOS', $isIOS); + $this->assign('isAndroid', $isAndroid); + $this->assign('apply', $apply); + $this->assign('game', $game); + $this->display(); + } + + public function iosDown() { $gameId = I('get.gid'); diff --git a/Application/Home/View/default/Home/landingPage.html b/Application/Home/View/default/Home/landingPage.html new file mode 100644 index 000000000..4bcfd3e2d --- /dev/null +++ b/Application/Home/View/default/Home/landingPage.html @@ -0,0 +1,133 @@ + + + + + + + + + + + + + {$game['relation_game_name']} + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
+ + + + + \ No newline at end of file diff --git a/Public/Home/css/landing_page.css b/Public/Home/css/landing_page.css new file mode 100644 index 000000000..fcbcc4a93 --- /dev/null +++ b/Public/Home/css/landing_page.css @@ -0,0 +1,102 @@ +.weixin { + position: absolute; + top: -80px; + right: 0; + width: 17rem; + height: 30rem; + margin-top: 2px; + background: url(../images/img_sign.png) left top no-repeat; + background-size: 100% 100%; + z-index: 99; + } + + html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + } + + body, div { + margin: 0; + padding: 0; + } + + .bn-rule { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: #333; + } + + .bn-rule img { + margin-top: 21px; + width: 100%; + } + + .register-box-max { + width: 80%; + height: 280px; + top: calc(50% - 140px); + left: 10%; + position: fixed; + z-index: 10; + background-color: #fff; + border-radius: 10px; + } + + @media screen and (min-width: 768px) { + .register-box-max { + width: 50%; + left: 25%; + } + } + + .register-bg { + width: 100%; + height: inherit; + position: fixed; + background-color: #0a0a0a; + opacity: 0.5; + } + + .register-title-box { + padding: 10px 10px; + margin-top: 10px; + text-align: center; + font-size: 1.2rem; + } + + .register-title-box span { + font-weight: 600; + } + + .register-input-box { + text-align: center; + font-size: 1rem; + } + + .register-input-box input { + width: calc(80% - 5px); + height: 2rem; + padding-left: 5px; + margin-top: 10px; + margin-bottom: 10px; + border: 1px solid #6f6f6f; + border-radius: 3px; + } + + .register-btn-box { + margin-top: 40px; + text-align: center; + } + + .register-btn-box button { + width: 80%; + height: 2.5rem; + border: 0; + border-radius: 18px; + background-color: #1993ff; + color: #fff; + font-size: 1.1rem; + } \ No newline at end of file