* @version : HUOSDK 8.0 */ namespace huo\model\log; use huo\model\game\GameModel; use huo\model\member\MemberModel; use huo\model\user\UserModel; class MemLoginLogModel extends LogModel { protected $name = 'log_mem_login'; public function agent() { return $this->hasOne(UserModel::className(), 'id', 'agent_id') ->field('id,user_login,user_nicename'); } public function game() { return $this->hasOne(GameModel::className(), 'id', 'app_id') ->field(['id', 'name']); } public function mem() { return $this->hasOne(MemberModel::className(), 'id', 'mem_id') ->field(['id', 'username', 'nickname']); } /** * @param $data * @param bool $replace * @param bool $get_last_insert_id * * @return bool|int|string */ public function insertLog($data, $replace = false, $get_last_insert_id = true) { $_data['mem_id'] = get_val($data, 'mem_id', 0); $_data['mg_mem_id'] = get_val($data, 'mg_mem_id', 0); $_data['agent_id'] = get_val($data, 'agent_id', 0); $_data['agent_game'] = get_val($data, 'agent_game', ''); $_data['app_id'] = get_val($data, 'app_id', 0); $_data['device_id'] = get_val($data, 'device_id', ''); $_data['idfv'] = get_val($data, 'idfv', ''); $_data['mac'] = get_val($data, 'mac', ''); $_data['ip'] = get_val($data, 'ip', ''); $_data['brand'] = get_val($data, 'brand', ''); $_data['model'] = urldecode(get_val($data, 'model', '')); $_data['os'] = get_val($data, 'os', ''); $_data['os_version'] = urldecode(get_val($data, 'os_version', '')); $_data['screen'] = get_val($data, 'screen', ''); $_data['net'] = get_val($data, 'net', ''); $_data['imsi'] = get_val($data, 'imsi', ''); $_data['longitude'] = get_val($data, 'longitude', ''); $_data['latitude'] = get_val($data, 'latitude', ''); $_data['userua'] = get_val($data, 'userua', ''); $_data['from'] = get_val($data, 'from', 0); $_data['reg_time'] = get_val($data, 'reg_time', 0); $_data['create_time'] = get_val($data, 'create_time', time()); $_data['open_cnt'] = get_val($data, 'from', 0); $_data['reg_app_id'] = get_val($data, 'reg_app_id', 0); $_data['date'] = date('Y-m-d', $_data['create_time']); return parent::insertLog($_data, $replace, $get_last_insert_id); } /** * @param string $date * * @return int|void * @throws \think\db\exception\BindParamException * @throws \think\exception\PDOException */ function checkTable($date = '') { $this->table = $this->getPartitionTableName( $this->partition_data, $this->partition_field, $this->partition_rule ); $_sql = "CREATE TABLE IF NOT EXISTS `$this->table` ("; $_sql .= " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',"; $_sql .= " `date` date NOT NULL DEFAULT '2020-01-01' COMMENT '日期',"; $_sql .= " `mem_id` int(11) NOT NULL DEFAULT '0' COMMENT '玩家ID',"; $_sql .= " `mg_mem_id` int(11) NOT NULL DEFAULT '0' COMMENT '登陆游戏唯一标识ID 与mem_game的mg_mem_id对应',"; $_sql .= " `agent_id` int(11) NOT NULL DEFAULT '0' COMMENT '玩家归属的ch_id',"; $_sql .= " `agent_game` varchar(32) NOT NULL COMMENT '子渠道编号',"; $_sql .= " `app_id` int(11) NOT NULL DEFAULT '0' COMMENT '游戏id',"; $_sql .= " `device_id` varchar(64) NOT NULL DEFAULT '' COMMENT '手机设备码',"; $_sql .= " `idfv` varchar(64) NOT NULL DEFAULT '' COMMENT 'IOS idfv',"; $_sql .= " `mac` varchar(32) NOT NULL DEFAULT '' COMMENT '设备的mac',"; $_sql .= " `ip` varchar(32) NOT NULL DEFAULT '' COMMENT '设备网络IP地址',"; $_sql .= " `brand` varchar(16) NOT NULL DEFAULT '' COMMENT '设备品牌',"; $_sql .= " `model` varchar(64) NOT NULL DEFAULT '' COMMENT '机型',"; $_sql .= " `os` varchar(8) NOT NULL DEFAULT '' COMMENT '操作系统',"; $_sql .= " `os_version` varchar(16) NOT NULL DEFAULT '' COMMENT '操作系统版本',"; $_sql .= " `screen` varchar(16) NOT NULL DEFAULT '' COMMENT '分辨率',"; $_sql .= " `net` varchar(8) NOT NULL DEFAULT '' COMMENT '3G,4G,WIFI',"; $_sql .= " `imsi` varchar(16) NOT NULL DEFAULT '' COMMENT '设备的imsi',"; $_sql .= " `longitude` varchar(32) NOT NULL DEFAULT '' COMMENT '经度',"; $_sql .= " `latitude` varchar(32) NOT NULL DEFAULT '' COMMENT '纬度',"; $_sql .= " `userua` varchar(255) NOT NULL DEFAULT '' COMMENT '用户使用的移动终端的UA信息',"; $_sql .= " `from` smallint(4) NOT NULL DEFAULT '0' COMMENT '3 ANDROID、4 IOS、5 H5、 401 IOS切换',"; $_sql .= " `reg_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '注册时间',"; $_sql .= " `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '登录时间',"; $_sql .= " `open_cnt` int(11) NOT NULL DEFAULT '0' COMMENT '打开此应用次数',"; $_sql .= " `reg_app_id` int(11) NOT NULL DEFAULT '0' COMMENT '注册游戏ID',"; $_sql .= " PRIMARY KEY (`id`),"; $_sql .= " KEY `lml_time_index` (`create_time`),"; $_sql .= " KEY `lml_mem_index` (`mem_id`),"; $_sql .= " KEY `lml_date_index` (`date`)"; $_sql .= ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家登陆LOG';"; return $this->execute($_sql); } /** * 玩家登录记录 * * @param $param * @param int $offset * * @return bool|\think\Paginator * @throws \think\exception\DbException */ public function memLoginInfo($param, $offset = 10) { if (isset($param['date']) && !empty($param['date'])) { $_date = $param['date']; } else { $_date = time(); } if (isset($param['mem_id']) && !empty($param['mem_id'])) { $_map['mem_id'] = $param['mem_id']; } else { return false; } $_field = 'mem_id, app_id, create_time login_time, ip, os'; $_data = $this->computeTable($_date)->with('game')->with('agent')->field($_field) ->where($_map) ->paginate($offset); return $_data; } /** * 获取设备-游戏登陆记录 * @param $param * @param string $page * * @return int | array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getDeviceGameUser($param, $page = '1,10') { if (empty($param['device_id']) || empty($param['app_id'])) { $_rdata['count'] = 0; $_rdata['list'] = []; return $_rdata; } $_date = empty($param['time']) ? time() : $param['time']; $_map['app_id'] = $param['app_id']; $_map['device_id'] = $param['device_id']; $_count = $this->computeTable($param['time'])->where($_map)->group('mem_id')->count(); if (empty($_count)) { $_rdata['count'] = 0; $_rdata['list'] = []; return $_rdata; } $_rdata = []; $_rdata['count'] = $_count; $_field = 'mem_id,app_id,create_time'; $_log_data = $this->computeTable($_date)->with('mem')->with('game')->group('mem_id')->order('create_time desc') ->field($_field) ->where($_map) ->page($page)->select(); if (is_object($_log_data)) { $_log_data = $_log_data->toArray(); } $_list = []; foreach ($_log_data as $_k => $_v) { $_data = []; $_data['last_login_time'] = date('Y-m-d H:i:s', $_v['create_time']); $_data['username'] = isset($_v['mem']['username']) ? $_v['mem']['username'] : ''; $_data['nickname'] = isset($_v['mem']['nickname']) ? $_v['mem']['nickname'] : ''; $_data['last_login_game'] = isset($_v['game']['name']) ? $_v['game']['name'] : ''; $_list[] = $_data; } $_rdata['count'] = $_count; $_rdata['list'] = $_list; return $_rdata; } }