feat: ds
This commit is contained in:
@@ -4,11 +4,13 @@ namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Concerns\PortalAware;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\DsChainLog;
|
||||
use App\Models\PageVisit;
|
||||
use App\Models\User;
|
||||
use App\Support\AgentScope;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PageVisitController extends Controller
|
||||
{
|
||||
use PortalAware;
|
||||
@@ -36,7 +38,7 @@ class PageVisitController extends Controller
|
||||
->orderByDesc('id')
|
||||
->forPage($page, $limit)
|
||||
->get([
|
||||
'id', 'channel_id', 'client_uid', 'os', 'os_version',
|
||||
'id', 'channel_id', 'client_uid', 'chain', 'os', 'os_version',
|
||||
'browser', 'browser_version', 'user_agent', 'ip', 'domain', 'referer', 'created_at',
|
||||
]);
|
||||
|
||||
@@ -48,6 +50,8 @@ class PageVisitController extends Controller
|
||||
'id' => $v->id,
|
||||
'channel_id' => $v->channel_id,
|
||||
'client_uid' => $v->client_uid,
|
||||
'chain' => (int) $v->chain,
|
||||
'chain_label' => PageVisit::chainLabel((int) $v->chain),
|
||||
'os' => $v->os ?: '',
|
||||
'os_version' => $v->os_version ?: '',
|
||||
'browser' => $v->browser ?: '',
|
||||
@@ -61,66 +65,35 @@ class PageVisitController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function groups(Request $request)
|
||||
public function logs(Request $request)
|
||||
{
|
||||
$group = (string) $request->query('group', 'os');
|
||||
$base = $this->scopedQuery($request);
|
||||
$builder = match ($group) {
|
||||
'os_version' => $base
|
||||
->select('os', 'os_version')
|
||||
->selectRaw('COUNT(*) as pv')
|
||||
->selectRaw('COUNT(DISTINCT client_uid) as uv')
|
||||
->groupBy('os', 'os_version'),
|
||||
'domain' => $base
|
||||
->select('domain')
|
||||
->selectRaw('COUNT(*) as pv')
|
||||
->selectRaw('COUNT(DISTINCT client_uid) as uv')
|
||||
->groupBy('domain'),
|
||||
'browser' => $base
|
||||
->select('browser')
|
||||
->selectRaw('COUNT(*) as pv')
|
||||
->selectRaw('COUNT(DISTINCT client_uid) as uv')
|
||||
->groupBy('browser'),
|
||||
'browser_version' => $base
|
||||
->select('browser', 'browser_version')
|
||||
->selectRaw('COUNT(*) as pv')
|
||||
->selectRaw('COUNT(DISTINCT client_uid) as uv')
|
||||
->groupBy('browser', 'browser_version'),
|
||||
default => $base
|
||||
->select('os')
|
||||
->selectRaw('COUNT(*) as pv')
|
||||
->selectRaw('COUNT(DISTINCT client_uid) as uv')
|
||||
->groupBy('os'),
|
||||
};
|
||||
$uid = strtoupper(preg_replace('/[^0-9A-Fa-f]/', '', (string) $request->query('client_uid', '')) ?? '');
|
||||
if ($uid === '') {
|
||||
return response()->json(['code' => 1, 'msg' => '缺少访客 UID', 'data' => []]);
|
||||
}
|
||||
|
||||
$rows = $builder
|
||||
->orderByDesc('pv')
|
||||
->limit(50)
|
||||
->get()
|
||||
->map(static function ($row) use ($group) {
|
||||
$label = match ($group) {
|
||||
'os_version' => trim(((string) ($row->os ?? '')).' '.((string) ($row->os_version ?? ''))),
|
||||
'domain' => (string) ($row->domain ?? ''),
|
||||
'browser' => (string) ($row->browser ?? ''),
|
||||
'browser_version' => trim(((string) ($row->browser ?? '')).' '.((string) ($row->browser_version ?? ''))),
|
||||
default => (string) ($row->os ?? ''),
|
||||
};
|
||||
$visible = $this->scopedQuery($request)->where('client_uid', $uid)->where('chain', PageVisit::CHAIN_DARKSWORD);
|
||||
if (! $visible->exists()) {
|
||||
return response()->json(['code' => 0, 'msg' => '', 'data' => []]);
|
||||
}
|
||||
|
||||
return [
|
||||
'label' => $label !== '' ? $label : 'Unknown',
|
||||
'pv' => (int) $row->pv,
|
||||
'uv' => (int) $row->uv,
|
||||
];
|
||||
})
|
||||
->values();
|
||||
$rows = DsChainLog::query()
|
||||
->where('client_uid', $uid)
|
||||
->orderBy('id')
|
||||
->limit(200)
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'code' => 0,
|
||||
'msg' => '',
|
||||
'data' => [
|
||||
'group' => $group,
|
||||
'rows' => $rows,
|
||||
],
|
||||
'data' => $rows->map(static fn (DsChainLog $row) => [
|
||||
'id' => $row->id,
|
||||
'stage' => $row->stage,
|
||||
'stage_label' => DsChainLog::stageTitle((string) $row->stage),
|
||||
'progress' => (int) $row->progress,
|
||||
'label' => $row->label ?: '',
|
||||
'created_at' => optional($row->created_at)?->toDateTimeString(),
|
||||
])->values(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -141,6 +114,10 @@ class PageVisitController extends Controller
|
||||
$q->where('channel_id', 'like', '%'.$channelId.'%');
|
||||
}
|
||||
|
||||
if ($request->query->has('chain') && $request->query('chain') !== '') {
|
||||
$q->where('chain', (int) $request->query('chain'));
|
||||
}
|
||||
|
||||
$os = trim((string) $request->query('os', ''));
|
||||
if ($os !== '') {
|
||||
$q->where('os', $os);
|
||||
|
||||
Reference in New Issue
Block a user