From 3f96c9c6502243b06efd4bb34a189e72e3a5557c Mon Sep 17 00:00:00 2001
From: yearning <10538594+wangweifeng1999@user.noreply.gitee.com>
Date: 星期一, 28 九月 2026 19:24:55 +0800
Subject: [PATCH] 复制项目

---
 frontend/src/scoreQueryParams.ts |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/frontend/src/scoreQueryParams.ts b/frontend/src/scoreQueryParams.ts
new file mode 100644
index 0000000..90ee1da
--- /dev/null
+++ b/frontend/src/scoreQueryParams.ts
@@ -0,0 +1,40 @@
+export type ScoreListQuery = {
+  name?: string;
+  id_card?: string;
+  subject?: string;
+  page?: number;
+  page_size?: number;
+};
+
+export function readScoreListQuery(search: string | URLSearchParams): ScoreListQuery {
+  const sp = typeof search === "string" ? new URLSearchParams(search) : search;
+  const page = parseInt(sp.get("page") || "1", 10);
+  const page_size = parseInt(sp.get("page_size") || "20", 10);
+  return {
+    name: sp.get("name") || undefined,
+    id_card: sp.get("id_card") || undefined,
+    subject: sp.get("subject") || undefined,
+    page: Number.isFinite(page) && page > 0 ? page : 1,
+    page_size: Number.isFinite(page_size) && page_size > 0 ? page_size : 20,
+  };
+}
+
+export function writeScoreListQuery(q: ScoreListQuery): URLSearchParams {
+  const sp = new URLSearchParams();
+  if (q.name) sp.set("name", q.name);
+  if (q.id_card) sp.set("id_card", q.id_card);
+  if (q.subject) sp.set("subject", q.subject);
+  if (q.page && q.page > 1) sp.set("page", String(q.page));
+  if (q.page_size && q.page_size !== 20) sp.set("page_size", String(q.page_size));
+  return sp;
+}
+
+export function scoresListPath(q: ScoreListQuery = {}): string {
+  const s = writeScoreListQuery(q).toString();
+  return s ? `/scores?${s}` : "/scores";
+}
+
+export function attemptDetailPath(attemptId: string, q: ScoreListQuery = {}): string {
+  const s = writeScoreListQuery(q).toString();
+  return s ? `/attempts/${attemptId}?${s}` : `/attempts/${attemptId}`;
+}

--
Gitblit v1.8.0