You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

629 lines
20 KiB
PHTML

5 years ago
<?php
namespace Mobile\Model;
use Think\Model;
use Mobile\Logic\SetLogic;
/**
* 文档基础模型
*/
class GameModel extends Model{
/* 自动验证规则 */
protected $_validate = array(
array('game_name', 'require', '游戏名称不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
array('game_name', '1,30', '游戏名称不能超过30个字符', self::VALUE_VALIDATE, 'length', self::MODEL_BOTH),
array('game_appid', 'require', '游戏APPID不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
);
/* 自动完成规则 */
protected $_auto = array(
array('create_time', 'getCreateTime', self::MODEL_BOTH,'callback'),
array('recommend_level', 0, self::MODEL_BOTH),
array('game_score', 0, self::MODEL_BOTH),
);
/**
* 构造函数
* @param string $name 模型名称
* @param string $tablePrefix 表前缀
* @param mixed $connection 数据库连接信息
*/
public function __construct($name = '', $tablePrefix = '', $connection = '') {
/* 设置默认的表前缀 */
$this->tablePrefix ='tab_';
/* 执行构造方法 */
parent::__construct($name, $tablePrefix, $connection);
}
/**
* 游戏列表
*/
public function lists($p=1,$map=array()) {
}
/**
* 游戏信息
* @param integer $game_id
* @author 鹿文学
*/
public function get_info($game_id=0) {
if(is_numeric($game_id) && $game_id > 0) {
$data = $this->field('id as game_id,icon,game_name,sdk_version')->where(['id'=>$game_id])->find();
$icon = get_cover($data['icon'],'path');
$data['icon_url'] = is_file(MROOT.substr($icon,1))?$icon:'';
return $data;
} else {
return '';
}
}
/**
* 充值游戏列表
* @param integer $p 页码
* @param array $map 条件数组
* @param string $fields 字段列表
* @param integer $row 每页数量
* @return array 结果数据集
* @author 鹿文学
*/
public function lists_by_spend($p=1,$map=array(),$fields=true,$row=10) {
$page = intval($p);
$page = $page ? $page : 1; //默认显示第一页数据
$map['g.game_status'] = 1;
$user = D('User')->getLoginInfo();
if(is_array($user)) {
$map1 = $map;
$sql = $this->alias('g')->field($fields)
->join('tab_merchandise as m on (g.id=m.game_id and m.status=1) ')
->join('tab_user as u on (u.id=m.small_id and u.lock_status=1 and source_puid>0 and source_time>0 and u.puid='.$user['user_id'].') ')
->where($map1)->group('g.id')->select(false);
$map2 = $map;
$lists = $this->alias('g')->field($fields)
->join('tab_spend as s on(g.id = s.game_id and s.pay_status=1 and s.small_id>0) ')
->join('tab_user as u on (u.id=s.small_id and u.lock_status=1 and source_puid=0 and source_time=0 and u.puid='.$user['user_id'].') ')
->union($sql)
->where($map2)->group('g.id')->select(false);
$lists = $this->table(' ('.$lists.') as a ')->field('a.*')->group('a.id')->page($page,$row)->select();
}
if(is_array($lists)) {
$data['lists'] = $lists;$data['status']=1;
if($count > $row){
$data['total'] = ceil($count/$row);
} else {
$data['total']=1;
}
} else {
$data['lists']='';$data['total'] = 1;$data['status'] = 0;
}
$data['current'] = $page;
return $data;
}
public function lists_by_spend2($p=1,$map=array(),$fields=true,$row=10) {
$page = intval($p);
$page = $page ? $page : 1; //默认显示第一页数据
$map['s.pay_status'] = 1;
$map['g.game_status'] = 1;
$user = D('User')->getLoginInfo();
if(is_array($user)) {
$map['s.user_id'] = $user['user_id'];
$lists = $this->alias('g')->field($fields)
->join('tab_spend as s on(g.id = s.game_id and s.small_id>0) ')
->join('tab_user as u on (u.id=s.small_id and u.puid='.$user['user_id'].') ')
->where($map)->page($page,$row)->group('g.id')->order('sort desc')->select();
$fcount = $this->field('count(DISTINCT g.id) as count')->alias('g')
->join('tab_spend as s on(g.id = s.game_id and s.small_id>0) ')
->join('tab_user as u on (u.id=s.small_id and u.puid='.$user['user_id'].') ')
->where($map)->select();
$count = $fcount['count'];
}
if(is_array($lists)) {
$data['lists'] = $lists;$data['status']=1;
if($count > $row){
$data['total'] = ceil($count/$row);
} else {
$data['total']=1;
}
} else {
$data['lists']='';$data['total'] = 1;$data['status'] = 0;
}
$data['current'] = $page;
return $data;
}
/**
* 获取热门游戏列表或不推荐游戏列表
* @param integer $devices 游戏类型1安卓2苹果
* @return array
* @author 鹿文学
*/
public function listsByRecommend($devices=0) {
$map['recommend_status'] = 2;
$map['game_status'] = 1;
$devices<1 || $map['sdk_version'] = $devices;
$result = $this->field('id,game_name,icon')->where($map)->order('sort desc')->select();
if(count($result)<5) {
$map['recommend_status'] =0;
$result = $this->field('id,game_name,icon')->where($map)->order('sort desc')->select();
}
return $result;
}
/**
* 获取游戏列表
* @param integer $p 页码
* @param string $game_name 游戏名称
* @param integer $devices 游戏类型1安卓2苹果
* @return array
* @author 鹿文学
*/
public function listsByName($p=1,$game_name='',$devices=0,$row=10) {
$page = intval($p);
$page = $page ? $page : 1; //默认显示第一页数据
$map['game_status'] = 1;
$devices<1 || $map['sdk_version'] = $devices;
$map['game_name'] = array('like','%'.$game_name.'%');
$lists = $this->field('id,game_name,bind_recharge_discount')->where($map)->page($page,$row)->select();
$count = $this->where($map)->count();
if(is_array($lists)) {
$data['lists'] = $lists;$data['status']=1;
if($count > $row){
$data['total'] = ceil($count/$row);
} else {
$data['total']=1;
}
} else {
$data['lists']='';$data['total'] = 1;$data['status'] = 0;
}
$data['current'] = $page;
return $data;
}
/**
* 获取详情页数据
* @param integer $id 文档ID
* @return array 详细数据
*/
public function detail($id){
/* 获取基础数据 */$map['relation_game_id']=$id;
$info = $this->field(true)->where($map)->group('relation_game_id')->select();
$info= game_merge($info,$map);
$info=reset($info);
if(!(is_array($info) || 1 !== $info['status'])){
$this->error = '游戏被禁用或已删除!';
return false;
}
$info=game_merge($info,$info['map']);
/* 获取模型数据 */
$logic = new SetLogic();
$detail = $logic->detail($id); //获取指定ID的数据
if(!$detail){
$this->error = $logic->getError();
return false;
}
$info = array_merge($info, $detail);
return $info;
}
public function getinfo($id) {
$info = $this->field(true)->find($id);
if(!(is_array($info) || 1 !== $info['status'])){
$this->error = '游戏被禁用或已删除!';
return false;
}
return $info;
}
public function giftbygame($p=1,$limit=10,$order="g.id desc") {
$start = mktime(0,0,0,date('m'),date('d'),date('Y'));
$end = mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
$time= time();
$map['_string'] = "g.game_status=1 and gb.status=1 and (gb.end_time>=$time)";
$lists = $this->table("__GAME__ as g")
->field("g.id,g.game_name,g.icon,count(gb.id) as count")
->join("__GIFTBAG__ as gb on (gb.game_id = g.id)","left")
->where($map)
->page($p,$limit)
->group("gb.game_id")
->order($order)
->select();
if (empty($lists) || !is_array($lists)) {return '';}
foreach ($lists as $k=>$v) {
$ids[] = $v['id'];
}
$map['gb.create_time'] = array('between',array($start,$end));
$map['g.id'] = array('in',$ids);
$lists2 = $this->table("__GAME__ as g")
->field("g.id,count(gb.id) as tcount")
->join("__GIFTBAG__ as gb on (gb.game_id = g.id)","left")
->where($map)
->group("gb.game_id")
->order($order)
->select();
if (!empty($lists2) && is_array($lists2))
foreach ($lists as $k => $v) {
foreach ($lists2 as $v2) {
if ($v2['id'] == $v['id']) {
$lists[$k]['tcount'] = $v2['tcount'];
}
}
$lists[$k]['picurl'] = get_cover($v['icon'],'path');
}
return $lists;
}
/**
* 新增或更新一个游戏
* @param array $data 手动传入的数据
* @return boolean fasle 失败 int 成功 返回完整的数据
* @author 王贺
*/
public function update($data = null){
/* 获取数据对象 */
$data = $this->token(false)->create($data);
if(empty($data)){
return false;
}
/* 添加或新增基础内容 */
if(empty($data['id'])){ //新增数据
$id = $this->add(); //添加基础内容
if(!$id){
$this->error = '新增基础内容出错!';
return false;
}
} else { //更新数据
$status = $this->save(); //更新基础内容
if(false === $status){
$this->error = '更新基础内容出错!';
return false;
}
}
/* 添加或新增扩展内容 */
$logic = $this->logic('Info');
$logic->checkModelAttr(5);
if(!$logic->update($id)){
if(isset($id)){ //新增失败,删除基础数据
$this->delete($id);
}
$this->error = $logic->getError();
return false;
}
return $data;
}
/**
* 创建时间不写则取当前时间
* @return int 时间戳
* @author huajie <banhuajie@163.com>
*/
protected function getCreateTime(){
$create_time = I('post.create_time');
return $create_time?strtotime($create_time):NOW_TIME;
}
/**
* 获取扩展模型对象
* @param integer $model 模型编号
* @return object 模型对象
*/
private function logic($model){
$name = $model;//parse_name(get_document_model($model, 'name'), 1);
$class = is_file(MODULE_PATH . 'Logic/' . $name . 'Logic' . EXT) ? $name : 'Base';
$class = MODULE_NAME . '\\Logic\\' . $class . 'Logic';
return new $class($name);
}
public function index($show_status='',$page=1,$order='id desc',$limit=20,$field=true,$where='') {
$map = array();
if (!empty($show_status))
$map['show_status'] = array('in',explode(',',$show_status));
if ($where) {
$w = explode(',',$where);
foreach ($w as $v) {
if (strstr($v,'!=')) {
$k=explode('!=',$v);
$map[$k[0]] = array('neq',$k[1]);
continue;
}
$k=explode('=',$v);
$map[$k[0]] = $k[1];
}
}
$data = $this->field($field)->where($map)->group('relation_game_id')->order($order)->page($page,$limit)->select();
$data=game_merge($data,$data['map']);
return $data;
}
public function type($type='',$gamenumber=false,$isall=false) {
$sum=0;
$result = array();
if (empty($type)) {return '';}
switch($type) {
case 'open_type':
$data = $this->field("gt.id,gt.open_name,count(DISTINCT tab_game.relation_game_id) as count")
->join("tab_opentype as gt on (tab_game.category=gt.id and tab_game.game_status=1)","right")
->where("gt.status=1 ")
->group("gt.id")->order("gt.id")->select();
if ($gamenumber) {
$arr = ['id'=>0,'open_name'=>'公测','count'=>$this->where('category = 0')->count()];
$data[] = $arr;
foreach ($data as $k=> $v) {
$id = $v['id'];
$result[$id]['id'] = $id;
$result[$id]['type_name'] = $v['open_name'];
$sum += $result[$id]['count'] = $v['count'];
}
} else {
foreach ($data as $k=> $v) {
$id = $v['id'];
$result[$id] = $v['open_name'];
}
}
;break;
case 'game_type':
default:
$data = M()
->table('tab_game_type as gt')
->field("gt.id,gt.type_name,count(DISTINCT tab_game.relation_game_id) as count,gt.icon")
->join("tab_game on (tab_game.game_type_id=gt.id and tab_game.game_status=1)","left")
->where("gt.status_show=1")
->group("gt.id")
->order("gt.id")
->select();
if ($gamenumber) {
foreach ($data as $k=> $v) {
$id = $v['id'];
$result[$id]['id'] = $id;
$result[$id]['type_name'] = $v['type_name'];
$sum += $result[$id]['count'] = $v['count'];
$result[$id]['icon'] = $v['icon'];
}
} else {
foreach ($data as $k=> $v) {
$id = $v['id'];
$result[$id] = $v['type_name'];
}
}
}
if ($isall)
if ($gamenumber) {
$result[0]['id']=0;
$result[0]['type_name']='全部';
$result[0]['count']=$sum;
} else {
$result[0]="全部";
}
ksort($result);
return $result;
}
public function server($show_status='',$page=1,$order='id desc',$limit=10,$field=true) {
$map = array();
if (!empty($show_status))
$map['show_status'] = array('in',explode(',',$show_status));
$field = $field?"s.*,g.game_name,g.icon,g.cover,g.relation_game_id":$field;
$data = M('Server','tab_')->table("__SERVER__ as s")
->field($field)
->join("__GAME__ as g on (g.id=s.game_id) ","left")
->where($map)->group('relation_game_id')->order($order)->page($page,$limit)->select();
$data=game_merge($data,$data['map']);
return $data;
}
public function multiple($model,$num=10) {
$field = isset($model['field'])?$model['field']:true;
$order = isset($model['order'])?$model['order']:" id DESC ";
$where = isset($model['where'])?$model['where']:"";
$data = $this->field($field)
->where($where)
->order($order)->limit($num)->select();
return $data;
}
/**
* 检查标识是否已存在(只需在同一根节点下不重复)
* @param string $name
* @return true无重复false已存在
* @author huajie <banhuajie@163.com>
*/
protected function checkName(){
$name = I('post.name');
$category_id = I('post.category_id', 0);
$id = I('post.id', 0);
$map = array('name' => $name, 'id' => array('neq', $id), 'status' => array('neq', -1));
$category = get_category($category_id);
if ($category['pid'] == 0) {
$map['category_id'] = $category_id;
} else {
$parent = get_parent_category($category['id']);
$root = array_shift($parent);
$map['category_id'] = array('in', D("Category")->getChildrenId($root['id']));
}
$res = $this->where($map)->getField('id');
if ($res) {
return false;
}
return true;
}
/**
* 生成不重复的name标识
* @author huajie <banhuajie@163.com>
*/
private function generateName(){
$str = 'abcdefghijklmnopqrstuvwxyz0123456789'; //源字符串
$min = 10;
$max = 39;
$name = false;
while (true){
$length = rand($min, $max); //生成的标识长度
$name = substr(str_shuffle(substr($str,0,26)), 0, 1); //第一个字母
$name .= substr(str_shuffle($str), 0, $length);
//检查是否已存在
$res = $this->getFieldByName($name, 'id');
if(!$res){
break;
}
}
return $name;
}
/**
* 生成游戏下载链接
* @param $game_id
* @return string
* author: xmy 280564871@qq.com
*/
public static function generateDownUrl($game_id){
$url = U('AjaxDown/down_file?',['game_id'=>$game_id,'promote_id'=>PROMOTE_ID],'',true);
return $url;
}
/**
* 游戏列表
* @param string $map
* @param string $order
* @param int $p
* @return mixed
* author: xmy 280564871@qq.com
*/
public function getGameLists($map="",$order="sort desc",$p=0){
$page = intval($p);
$page = $page ? $page : 1; //默认显示第一页数据
$row = 10;
$map['g.game_status'] = 1;
$map['g.apply_status'] = 1;
$promote_id = empty(PROMOTE_ID) ? 0 : PROMOTE_ID;
$rebate_join = "and (r.promote_id = {$promote_id} or r.promote_id = -1)";
$time = NOW_TIME;
$data = $this->table('tab_game as g')
->field('g.id,g.game_name,g.icon,g.dow_num,g.marking,g.game_size,g.game_score,g.dow_status,g.features,g.bind_recharge_discount as discount,s.pack_name,IFNULL(r.ratio,0) as ratio')
//游戏原包
->join("left join tab_game_source as s on s.game_id = g.id")
//返利
->join("left join tab_rebate r on r.game_id = g.id {$rebate_join} and r.starttime < {$time} and endtime = 0 or endtime > {$time}")
->where($map)
->page($page, $row)
->order($order)
->group("g.id")
->select();
foreach ($data as $key => $val){
$data[$key]['icon'] = get_img_url($val['icon']);
$data[$key]['game_score'] = round($val['game_score'] / 2);
if($val['dow_status'] == 0){
$data[$key]['down_url'] = "";
}else{
$data[$key]['down_url'] = $this::generateDownUrl($val['id']);
}
}
return $data;
}
/**
* 我的游戏收藏
* @param $account
* @param $p
* @return mixed
* author: xmy 280564871@qq.com
*/
public function getMyCollectGame($account,$p){
$map['account'] = $account;
$map['status'] = 1;
$devices = get_devices_type();
$collect = M("collect_game",'tab_')->field("game_id")->where($map)->select();
if(empty($collect)){
return $collect;
}
$game_map['g.id'] = ['in',array_column($collect,"game_id")];
$game_map['g.sdk_version'] = array('like','%'.$devices.'%');
$data = $this->getGameLists($game_map,'',$p);
return $data;
}
/**
* 游戏收藏
* @param $game_id
* @param $account
* @param $status 1 收藏 2 取消收藏
* @return mixed
* author: xmy 280564871@qq.com
*/
public function collectGame($game_id,$account,$status){
$data['game_id'] = $game_id;
$data['account'] = $account;
$collect = M("collect_game",'tab_')->where($data)->find();
if(empty($collect)){
$data['create_time'] = time();
$data['status'] = $status;
$result = M("collect_game",'tab_')->add($data);
}else{
$result = M("collect_game",'tab_')->where($data)->setField(['status'=>$status]);
}
return $result;
}
}