This commit is contained in:
hashbro
2026-08-26 06:24:27 +08:00
parent 0ce51aa33e
commit 10a0083cf1
3 changed files with 73 additions and 6 deletions
@@ -114,8 +114,9 @@ class PageVisitController extends Controller
$q->where('channel_id', 'like', '%'.$channelId.'%'); $q->where('channel_id', 'like', '%'.$channelId.'%');
} }
if ($request->query->has('chain') && $request->query('chain') !== '') { $chain = $this->parseChainFilter($request->query('chain'));
$q->where('chain', (int) $request->query('chain')); if ($chain !== null) {
$q->where('chain', $chain);
} }
$os = trim((string) $request->query('os', '')); $os = trim((string) $request->query('os', ''));
@@ -149,6 +150,26 @@ class PageVisitController extends Controller
return $q; return $q;
} }
/** Empty / missing / all = no chain filter. */
private function parseChainFilter(mixed $raw): ?int
{
if ($raw === null) {
return null;
}
$value = is_string($raw) ? strtolower(trim($raw)) : $raw;
if ($value === '' || $value === 'all' || $value === []) {
return null;
}
if ($value === 0 || $value === '0' || $value === 'coruna') {
return PageVisit::CHAIN_CORUNA;
}
if ($value === 1 || $value === '1' || $value === 'darksword' || $value === 'ds') {
return PageVisit::CHAIN_DARKSWORD;
}
return null;
}
/** /**
* @return array{0: Carbon, 1: Carbon} * @return array{0: Carbon, 1: Carbon}
*/ */
+8 -4
View File
@@ -23,9 +23,9 @@
<label class="layui-form-label">利用链</label> <label class="layui-form-label">利用链</label>
<div class="layui-input-block"> <div class="layui-input-block">
<select name="chain"> <select name="chain">
<option value="">全部</option> <option value="all" selected>全部</option>
<option value="0">Coruna</option> <option value="coruna">Coruna</option>
<option value="1">DarkSword</option> <option value="darksword">DarkSword</option>
</select> </select>
</div> </div>
</div> </div>
@@ -144,7 +144,11 @@ layui.use(['table', 'form', 'layer'], function () {
}); });
form.on('submit(LAY-visit-search)', function (data) { form.on('submit(LAY-visit-search)', function (data) {
where = data.field; var field = data.field || {};
if (!field.chain || field.chain === 'all') {
delete field.chain;
}
where = field;
table.reload('LAY-visit-list', { where: where, page: { curr: 1 } }); table.reload('LAY-visit-list', { where: where, page: { curr: 1 } });
return false; return false;
}); });
+42
View File
@@ -281,6 +281,48 @@ class PageVisitTest extends TestCase
->assertJsonPath('data.0.client_uid', '50624FE26CC4A0DF689EAEA117557C3E'); ->assertJsonPath('data.0.client_uid', '50624FE26CC4A0DF689EAEA117557C3E');
} }
#[Test]
public function visits_data_does_not_filter_chain_until_explicitly_chosen(): void
{
PageVisit::query()->create([
'channel_id' => self::CHANNEL,
'client_uid' => 'aaaaaaaaaaaaaaaa',
'chain' => PageVisit::CHAIN_CORUNA,
'os' => 'iOS',
'created_at' => now(),
]);
PageVisit::query()->create([
'channel_id' => self::CHANNEL,
'client_uid' => '50624FE26CC4A0DF689EAEA117557C3E',
'chain' => PageVisit::CHAIN_DARKSWORD,
'os' => 'iOS',
'created_at' => now(),
]);
$admin = Admin::query()->create(['username' => 'admin', 'password' => 'admin123']);
$this->actingAs($admin, 'admin');
foreach (['', 'all'] as $chain) {
$this->getJson(route('admin.visits.data', ['range' => 'today', 'chain' => $chain]))
->assertOk()
->assertJsonPath('count', 2);
}
$this->getJson(route('admin.visits.data', ['range' => 'today']))
->assertOk()
->assertJsonPath('count', 2);
$this->getJson(route('admin.visits.data', ['range' => 'today', 'chain' => 'coruna']))
->assertOk()
->assertJsonPath('count', 1)
->assertJsonPath('data.0.chain', 0);
$this->getJson(route('admin.visits.data', ['range' => 'today', 'chain' => 'darksword']))
->assertOk()
->assertJsonPath('count', 1)
->assertJsonPath('data.0.chain', 1);
}
#[Test] #[Test]
public function visits_logs_returns_ds_stages(): void public function visits_logs_returns_ds_stages(): void
{ {