houde_web_api/app/common/model/Flow/Flow.php
2023-04-16 23:05:17 +08:00

259 lines
8.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\model\Flow;
use app\Request;
use think\Db;
use Throwable;
use Zhiyun\Adjfut\Traverse;
use app\BaseModel;
use app\model\Product as ModelProduct;
use think\db\Query;
use think\Exception;
use think\facade\Config;
use think\model\concern\SoftDelete;
use think\model\relation\BelongsToMany;
use think\model\relation\HasMany;
use think\model\relation\HasOne;
class Flow extends BaseModel
{
use SoftDelete;
// 删除字段
protected $deleteTime = 'flow_delete_time';
// 设置主键名
protected $pk = 'flow_guid';
// 设置废弃字段
protected $disuse = [];
// 设置字段信息
protected $schema = [
'flow_id' => 'int',
'flow_visitor_ip' => 'string',
'flow_location' => 'string',
'flow_source' => 'string',
'flow_browser' => 'string',
'flow_record_no' => 'string',
'flow_os'=>'string',
'flow_target'=>'string',
'flow_create_user_guid' => 'string',
'flow_create_time' => 'datetime',
'flow_update_time' => 'datetime',
'flow_update_user_guid' => 'string',
'flow_delete_time' => 'datetime',
'flow_delete_user_guid' => 'string',
];
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'datetime';
// 创建时间
protected $createTime = 'flow_create_time';
// 修改时间
protected $updateTime = 'flow_update_time';
/**
* 新增前
*/
public static function onBeforeInsert(self $model): void
{
// self::checkRepeatData($model);
// $model->completeCreateField();
}
/**
* 更新前
*/
public static function onBeforeUpdate(self $model): void
{
// self::checkRepeatData($model);
// $model->completeUpdateField();
}
/**
* 删除前
*/
public static function onBeforeDelete(self $model): void
{
// $model->completeDeleteField();
}
/**
* @throws Throwable
*/
public function track($flow_target)
{
$res = [];
//获取访问者ip
$res['flow_visitor_ip'] = $this->getIp();
//获取访问者操作系统
$res['flow_os'] = $this->getOs();
//获取访问者浏览器
$res['flow_browser'] = $this->getBrowser();
//获取访问者地址
$res['flow_location'] = $this->getLocation();
//获取访问者来源
$res['flow_source'] = $this->getSource();
//生成记录号
$res['flow_record_no'] = $this->createRecordNumber();
//访问目的地
$res['flow_target'] = $this->getTarget($flow_target);
$res['flow_create_time'] = date("Y-m-d H:i:s");
// return json($_SERVER);
// return json($res);
try {
$this::create($res);
}catch (Throwable $th){
throw $th;
}
}
private function getTarget($flow_target):string
{
$url = $flow_target;
// $res_url = explode('/',$url)[1];
$match_res_pool = [
'index'=>'首页',
'product'=>'产品页',
'product-details-id'=>'产品详情页',
'news'=>'新闻页',
'news-details-id'=>'新闻详情页',
'serviceSupport'=>'服务支持页',
'contactUs'=>'联系我们页',
'aboutUs'=>'关于我们页'
];
if(!isset($match_res_pool[$url])){
return '未知页面';
}
return $match_res_pool[$url];
}
private function createRecordNumber(): string
{
return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}
private function getSource(){
if(isset($_SERVER['HTTP_REFERER'])){
$colon_index = stripos($_SERVER['HTTP_REFERER'], ':');
$ds = '/';
$ds_count = 0; //冒号后斜杠的数量
for ($i = $colon_index + 1; $i < strlen($_SERVER['HTTP_REFERER']); $i++) {
if ($_SERVER['HTTP_REFERER'][$i] != $ds) break;
$ds_count++;
}
$url_data = explode('/', $_SERVER['HTTP_REFERER']);
$url = "";
foreach ($url_data as $key => $val) {
if ($key > $ds_count-1) $url .= $ds . $val;
};
return explode('/',$url)[1];
}
return '直接访问';
}
private function getOs(): string
{
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
$OS = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/win/i', $OS)) {
$OS = 'window';
} elseif (preg_match('/mac/i', $OS)) {
$OS = 'mac';
} elseif (preg_match('/linux/i', $OS)) {
$OS = 'linux';
} elseif (preg_match('/unix/i', $OS)) {
$OS = 'unix';
} elseif (preg_match('/bsd/i', $OS)) {
$OS = 'bsd';
} else {
$OS = '其他操作系统';
}
return $OS;
} else {
return "获取访客操作系统信息失败!";
}
}
private function getBrowser()
{
if (isset($_SERVER["HTTP_USER_AGENT"])) {
$user_agent = strtolower($_SERVER["HTTP_USER_AGENT"]);
} else {
return null;
}
$user_agent=strtolower($_SERVER["HTTP_USER_AGENT"]);
// 固定检测
if (strrpos($user_agent, 'micromessenger')) {
$user_bs = 'Weixin';
} elseif (strrpos($user_agent, 'qq')) {
$user_bs = 'QQ';
} elseif (strrpos($user_agent, 'weibo')) {
$user_bs = 'Weibo';
} elseif (strrpos($user_agent, 'alipayclient')) {
$user_bs = 'Alipay';
} elseif (strrpos($user_agent, 'trident/7.0')) {
$user_bs = 'IE11';
// 新版本IE优先避免360等浏览器的兼容模式检测错误
} elseif (strrpos($user_agent, 'trident/6.0')) {
$user_bs = 'IE10';
} elseif (strrpos($user_agent, 'trident/5.0')) {
$user_bs = 'IE9';
} elseif (strrpos($user_agent, 'trident/4.0')) {
$user_bs = 'IE8';
} elseif (strrpos($user_agent, 'msie 7.0')) {
$user_bs = 'IE7';
} elseif (strrpos($user_agent, 'msie 6.0')) {
$user_bs = 'IE6';
} elseif (strrpos($user_agent, 'edg')) {
$user_bs = 'Edge';
} elseif (strrpos($user_agent, 'firefox')) {
$user_bs = 'Firefox';
} elseif (strrpos($user_agent, 'chrome') || strrpos($user_agent, 'android')) {
$user_bs = 'Chrome';
} elseif (strrpos($user_agent, 'safari')) {
$user_bs = 'Safari';
} elseif (strrpos($user_agent, 'mj12bot')) {
$user_bs = 'MJ12bot';
} else {
$user_bs = '其他浏览器';
}
return $user_bs;
}
private function getIp() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP") , "unknown")) {
$ip = getenv("HTTP_CLIENT_IP");
} else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR") , "unknown")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR") , "unknown")) {
$ip = getenv("REMOTE_ADDR");
} else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "unknown";
}
return $ip;
}
private function getLocation($ip = '') {
empty($ip) && $ip = $this->getIp();
$location = '';
if ($ip == "127.0.0.1") return ("本机地址");
$bLocalIp = !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
if($bLocalIp)return '局域网IP';
try {
$api = "https://www.fkcoder.com/ip?ip=$ip"; //请求新浪ip地址库
$json = @file_get_contents($api);
$res = json_decode($json, true);
$location = $res['country'].$res['province'].$res['city'];
return $location;
}catch (Throwable $th){
return 'ip获取异常';
}
}
}