admin/app/model/system/Visit.php

471 lines
19 KiB
PHP

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace app\model\system;
use think\facade\Cache;
use think\Session;
use think\facade\Db;
use app\model\BaseModel;
/**
* 访问统计
*/
class Visit extends BaseModel
{
/**
* 获取访问信息(以日为基本单位)
* @param $condition
* @return \multitype
*/
public function getVisitInfo($condition)
{
$site_id = isset($condition["site_id"]) ? $condition["site_id"] : 0;
$cache = Cache::get("visit_info_" . $site_id . "_" . $condition["type"] . "_" . $condition["module"] . "_" . $condition["addon"] . "_" . $condition["date"]);
if (!empty($cache)) {
return $this->success($cache);
}
$visit_model = model("nc_visit");//访问统计记录表
$info = $visit_model->getInfo($condition);
Cache::tag("visit_info" . $condition["date"])->set("visit_info_" . $site_id . "_" . $condition["type"] . "_" . $condition["module"] . "_" . $condition["addon"] . "_" . $condition["date"], $info);
return $this->success($info);
}
/**
* 获取访问ip信息(以日为基本单位)
* @param $condition
* @return \multitype
*/
public function getVisitIpInfo($condition)
{
$site_id = isset($condition["site_id"]) ? $condition["site_id"] : 0;
$cache = Cache::get("visit_ip_info_" . $site_id . "_" . $condition["type"] . "_" . $condition["module"] . "_" . $condition["addon"] . "_" . $condition["ip"] . "_" . $condition["date"]);
if (!empty($cache)) {
return $this->success($cache);
}
$visit_ip_model = model("nc_visit_ip");//访问统计记录表
$info = $visit_ip_model->getInfo($condition);
Cache::tag("visit_ip_info" . $condition["date"])->set("visit_ip_info_" . $site_id . "_" . $condition["type"] . "_" . $condition["module"] . "_" . $condition["addon"] . "_" . $condition["ip"] . "_" . $condition["date"], $info);
return $this->success($info);
}
/**
* 获取用户访问记录
* @param $condition
* @return \multitype
*/
public function getVisitUserInfo($condition)
{
$site_id = isset($condition["site_id"]) ? $condition["site_id"] : 0;
$cache = Cache::get("visit_user_info_" . $site_id . "_" . $condition["uid"] . "_" . $condition["module"] . "_" . $condition["addon"]);
if (!empty($cache)) {
return $this->success($cache);
}
$visit_user_model = model("nc_visit_user");//用户访问记录表
$info = $visit_user_model->getInfo($condition);
Cache::tag("visit_user_info" . $condition["site_id"])->set("visit_user_info_" . $site_id . "_" . $condition["uid"] . "_" . $condition["module"] . "_" . $condition["addon"], $info);
return $this->success($info);
}
/**
* 当日的访问数据写入
* @param array $param
*/
public function todayVisit($param = [])
{
//加入防止写入过多无效访问
$now_time = time();
$today_date = date("Ymd");
$expire_time = 1800;//过期的周期时长
$visit_session_name = "visit_" . $param["site_id"] . "_" . $param["type"] . "_" . $param["module"] . "_" . $param["addon"] . "_" . $today_date;
if (!empty(Session::get($visit_session_name)) && (Session::get($visit_session_name) + $expire_time) > $now_time) {
return $this->success();
}
Session::set($visit_session_name, $now_time);//设置访问记录,存入时间
$yesterday = date("Ymd", strtotime('-1 days'));
Cache::clear("visit_info" . $yesterday);//清理昨天的缓存
Cache::clear("visit_ip_info" . $yesterday);//清理昨天的缓存
$visit_model = model("nc_visit");//访问统计记录表
$visit_ip_model = model("nc_visit_ip");//ip访问记录表
$visit_user_model = model("nc_visit_user");//用户模块访问记录表
// 启动事务
$ip_count = 0;
//ip访问记录
$ip = ip2long(getip());
$vivit_ip_condition = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"ip" => $ip,
"addon" => $param["addon"]
);
$visit_ip_result = $this->getVisitIpInfo($vivit_ip_condition);
$visit_ip_info = $visit_ip_result["data"];
$ip_data = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"ip" => $ip,
"addon" => $param["addon"]
);
if (empty($visit_ip_info)) {
$ip_count += 1;
$ip_data["ip_count"] = 1;
$visit_ip_res = $visit_ip_model->add($ip_data);
} else {
$ip_data["ip_count"] = $visit_ip_info["ip_count"] + 1;
$visit_ip_res = $visit_ip_model->update($ip_data, $vivit_ip_condition);
}
Cache::tag("visit_ip_info" . $today_date)->set("visit_ip_info_" . $param["site_id"] . "_" . $param["type"] . "_" . $param["module"] . "_" . $param["addon"] . "_" . $ip["ip"] . "_" . $today_date, $ip_data);
//用户模块访问记录
if ($param["uid"] > 0) {
$visit_user_condition = array(
"uid" => $param["uid"],
"site_id" => $param["site_id"],
"module" => $param["module"],
"addon" => $param["addon"]
);
$visit_user_result = $this->getVisitUserInfo($visit_user_condition);
$visit_user_info = $visit_user_result["data"];
$visit_user_data = array(
"uid" => $param["uid"],
"site_id" => $param["site_id"],
"module" => $param["module"],
"addon" => $param["addon"]
);
if (empty($visit_user_info)) {
$visit_user_data["create_time"] = time();
$visit_user_result = $visit_user_model->add($visit_user_data);
} else {
$visit_user_data["update_time"] = time();
$visit_user_result = $visit_user_model->update($visit_user_data, $visit_user_condition);
}
Cache::tag("visit_user_info" . $param["site_id"])->set("visit_user_info_" . $param["site_id"] . "_" . $param["uid"] . "_" . $param["module"] . "_" . $param["addon"], $visit_user_data);
}
//访问记录
$vivit_condition = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"addon" => $param["addon"]
);
$visit_result = $this->getVisitInfo($vivit_condition);
$visit_info = $visit_result["data"];
//如果当前日不存在访问统计数据,则需要创建
$data = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"addon" => $param["addon"]
);
if (empty($visit_info)) {
$data["count"] = 1;
$data["ip_count"] = $ip_count;
$res = $visit_model->add($data);
} else {
$data["count"] = $visit_info["count"] + 1;
$data["ip_count"] = $visit_info["ip_count"] + $ip_count;
$res = $visit_model->update($data, $vivit_condition);
}
Cache::tag("visit_info" . $today_date)->set("visit_info_" . $param["site_id"] . "_" . $param["type"] . "_" . $param["module"] . "_" . $param["addon"] . "_" . $today_date, $data);
return $res;
}
/**
* 查询统计 访问数据
* @param array $param
*/
public function getVisitStatisticsData($param = [])
{
$visit_model = model("nc_visit");//访问统计记录表
$date_range = isset($param["date_range"]) ? $param["date_range"] : [];//时间范围
$date_type = $param["date_type"];//日期类型 用于查询方式
$type = $param["type"];//访问类型查询
if (empty($type) && !in_array($type, array('HOME', 'APP', 'API', 'ALL'))) {
$type = "ALL";
}
$condition = array();
switch ($type) {
case "HOME":
$condition["type"] = ["in", ["admin", "sitehome"]];
break;
case "APP":
$condition["type"] = ["in", ["wap", "web"]];
break;
case "API":
$condition["type"] = ["in", ["api"]];
break;
}
//站点id
if (!empty($param["site_id"])) {
$condition["site_id"] = $param["site_id"];
}
$today_date = date('Ymd');//当前日日期
$today_time = strtotime($today_date);
switch ($date_type) {
case 'today':
$date_condition = $today_date;
$date_x = periodGroup($today_time, $today_time);
break;
case 'yesterday':
$yesterday = strtotime(date("Ymd", strtotime('-1 days')));
$date_condition = date('Ymd', $yesterday);
$date_x = periodGroup($yesterday, $yesterday);
break;
case 'week':
$week = strtotime(date("Ymd", strtotime('-6 days')));
$date_condition = ["between", [date('Ymd', $week), $today_date]];
$date_x = periodGroup($week, $today_date);
break;
case 'month':
$month = strtotime(date("Ymd", strtotime('-29 days')));
$date_condition = ["between", [date('Ymd', $month), $today_date]];
$date_x = periodGroup($month, $today_time);
break;
case 'daterange':
$start_time = strtotime($date_range['start_date']);
$end_time = strtotime($date_range['end_date']);
$start_date = date('Ymd', $start_time);//开始日期
$end_date = date('Ymd', $end_time);//结束日期
$date_x = periodGroup($start_time, $end_time);
$date_condition = ["between", [$start_date, $end_date]];
break;
}
if (!empty($date_condition)) {
$condition["date"] = $date_condition;
}
$data1 = $visit_model->getList($condition, "*,sum(count) as visit_count", '', '', '', "date");
$visit_ip_model = model("nc_visit_ip");//访问统计记录表
$data2 = $visit_ip_model->getList($condition, "*,count( DISTINCT ip ) as visit_ip_count", '', '', '', "date");
$visit_data = [];
$ip_visit_data = [];
foreach ($date_x as $k => $v) {
$visit_count = 0;
$visit_ip_count = 0;
foreach ($data1 as $data1_k => $data1_v) {
if ($data1_v["date"] == $v) {
$visit_count = $data1_v["visit_count"];
continue;
}
}
foreach ($data2 as $data2_k => $data2_v) {
if ($data2_v["date"] == $v) {
$visit_ip_count = $data2_v["visit_ip_count"];
continue;
}
}
$visit_data[] = $visit_count;
$ip_visit_data[] = $visit_ip_count;
}
$data = array(
"date" => $date_x,
"data" => array(
"count_data" => $visit_data,
"ip_count_data" => $ip_visit_data,
)
);
return $this->success($data);
}
/**
* 统计一段时间内的总访问量
* @param $param
* @return \multitype
*/
public function getVisitCountData($param)
{
$visit_model = Db::table("nc_visit");//访问统计记录表
$date_range = isset($param["date_range"]) ? $param["date_range"] : [];//时间范围
$date_type = $param["date_type"];//日期类型 用于查询方式
$type = isset($param["type"]) ? $param["type"] : '';//访问类型查询
if (empty($type) && !in_array($type, array('HOME', 'APP', 'API', 'ALL'))) {
$type = "ALL";
}
$condition = array();
if ($type != "ALL") {
$condition["type"] = $type;
$visit_model = $visit_model->where("type", $type);
}
//站点id
if (!empty($param["site_id"])) {
$condition["site_id"] = $param["site_id"];
$visit_model = $visit_model->where("site_id", $param["site_id"]);
}
$today_date = date('Ymd');//当前日日期
switch ($date_type) {
case 'today':
$visit_model = $visit_model->where("date", $today_date);
break;
case 'yesterday':
$visit_model = $visit_model->where("date", strtotime('-1 days'));
break;
case 'week':
$visit_model = $visit_model->whereBetween("date", date('Ymd', strtotime('-6 days')), $today_date);
break;
case 'month':
$visit_model = $visit_model->whereBetween("date", date('Ymd', strtotime('-29 days')), $today_date);
break;
case 'daterange':
$start_date = date('Ymd', strtotime($date_range['start_date']));//开始日期
$end_date = date('Ymd', strtotime($date_range['end_date']));//结束日期
$visit_model = $visit_model->whereBetween("date", $start_date, $end_date);
break;
}
$visit_count = $visit_model->count();
$visit_ip_model = model("nc_visit_ip");//访问统计记录表
$visit_ip_result = $visit_ip_model->getInfo($condition, "count( DISTINCT ip ) as ip_count");
$visit_ip_count = $visit_ip_result["ip_count"];
$data = array(
"visit_count" => $visit_count,
"visit_ip_count" => $visit_ip_count
);
return $this->success($data);
}
public function test()
{
$arr = array('HOME', 'APP', 'API');
for ($i = 0; $i <= 100; $i++) {
$param["type"] = $arr[array_rand($arr)];
$param["site_id"] = rand(11111, 12000);
$param["module"] = "";
$num = sprintf("%02d", rand(1, 30));
$today_date = date("Ym" . $num);
$visit_model = model("nc_visit");//访问统计记录表
$visit_ip_model = model("nc_visit_ip");//ip访问记录表
// 启动事务
$ip_count = 0;
//ip访问记录
$ip = ip2long($this->get_rand_ip());
$vivit_ip_condition = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"ip" => $ip
);
$visit_ip_info = $visit_ip_model->getInfo($vivit_ip_condition);
if (empty($visit_ip_info)) {
$ip_count += 1;
$ip_data = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"ip" => $ip,
"ip_count" => 1
);
$visit_ip_res = $visit_ip_model->add($ip_data);
} else {
$ip_data = array(
"ip_count" => $visit_ip_info["ip_count"] + 1
);
$visit_ip_res = $visit_ip_model->update($ip_data, $vivit_ip_condition);
}
//访问记录
$vivit_condition = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"]
);
$visit_info = $visit_model->getInfo($vivit_condition);
//如果当前日不存在访问统计数据,则需要创建
if (empty($visit_info)) {
$data = array(
"date" => $today_date,
"site_id" => $param["site_id"],
"type" => $param["type"],
"module" => $param["module"],
"count" => 1,
"ip_count" => $ip_count
);
$res = $visit_model->add($data);
} else {
$data = array(
"count" => $visit_info["count"] + 1,
"ip_count" => $visit_info["ip_count"] + $ip_count
);
$visit_model->update($data, $vivit_condition);
}
}
}
function get_rand_ip()
{
$arr_1 = array("218", "218", "66", "66", "218", "218", "60", "60", "202", "204", "66", "66", "66", "59", "61", "60", "222", "221", "66", "59", "60", "60", "66", "218", "218", "62", "63", "64", "66", "66", "122", "211");
$randarr = mt_rand(0, count($arr_1));
// $ip1id = $arr_1[$randarr];
$ip1id = "218";
$ip2id = 600000 / 10000;
$ip3id = 2550000 / 10000;
$ip4id = 2550000 / 10000 - rand(0, 10);
return $ip1id . "." . $ip2id . "." . $ip3id . "." . $ip4id;
}
/**
* 获取时间段内分组
*/
public function periodGroup($srart_time, $end_time)
{
$type_time = 3600 * 24;
$format = 'Ymd';
$data = [];
for ($i = $srart_time; $i <= $end_time; $i += $type_time) {
$data[] = date($format, $i);
}
return $data;
}
/**
* 删除站点
* @param unknown $site_id
*/
public function deleteSite($site_id)
{
$visit_model = model("nc_visit");//访问统计记录表
$visit_ip_model = model("nc_visit_ip");//ip访问记录表
$visit_user_model = model("nc_visit_user");//用户模块访问记录表
$visit_model->delete(['site_id' => $site_id]);
$visit_ip_model->delete(['site_id' => $site_id]);
$visit_user_model->delete(['site_id' => $site_id]);
return $this->success();
}
}