From ffc89fd069cf6a081877d8ac79261fcc3ea9fdfc Mon Sep 17 00:00:00 2001 From: KirinBaka Date: Tue, 22 Apr 2025 15:34:22 +0800 Subject: [PATCH] feat: prefix and anti multi-check --- common/index.tsx | 7 +++++-- components/Timetable.tsx | 16 +++++++++++----- components/UserInputWrap.tsx | 7 ++++--- data.zip | Bin 0 -> 21269 bytes package.json | 2 +- pages/api/record.ts | 20 +++++++++++++++----- pages/index.tsx | 4 ++-- pages/report-tool.tsx | 7 +++---- pages/report.tsx | 7 +++---- pages/tool.tsx | 4 ++-- 10 files changed, 46 insertions(+), 28 deletions(-) create mode 100644 data.zip diff --git a/common/index.tsx b/common/index.tsx index 5b4563e..229ff08 100644 --- a/common/index.tsx +++ b/common/index.tsx @@ -1,14 +1,17 @@ +const API_PREFIX = "/duty"; + export const get = async (url: string) => { - const resp = await fetch(url); + const resp = await fetch(`${API_PREFIX}${url}`); const json = await resp.json(); return json; }; + export const post = async ( url: string, json: any, headers: Record = {} ) => { - const resp = await fetch(url, { + const resp = await fetch(`${API_PREFIX}${url}`, { method: "POST", headers: { "Content-Type": "application/json", ...headers }, body: JSON.stringify(json), diff --git a/components/Timetable.tsx b/components/Timetable.tsx index 1db3379..f93d232 100644 --- a/components/Timetable.tsx +++ b/components/Timetable.tsx @@ -79,10 +79,13 @@ const Timetable = ({ if (disableNetwork) return; + // Immediately revert the checkbox state + target.checked = !target.checked; + // post request const json = await post("/api/record", { name: target.name, - checked: target.checked, + checked: !target.checked, user, }); if (json.error !== undefined) { @@ -100,6 +103,7 @@ const Timetable = ({ const handleInput = (event: React.ChangeEvent): boolean => { const { target } = event; + // validate if (target?.children[0]?.tagName !== "TABLE") { console.log("not a table"); @@ -202,7 +206,7 @@ const Timetable = ({ } const occupied: string[] = json.occupied; const myselect: string[] = json.myselect; - console.log(json); + // console.log(json); for (const index in indexToElement) { if (occupied.includes(index)) { indexToElement[index].style.display = "none"; @@ -226,7 +230,7 @@ const Timetable = ({ const interval = setInterval(() => { refresh(); - }, 1000); + }, 1500); return () => { clearInterval(interval); }; @@ -264,7 +268,9 @@ const Timetable = ({ return ( <> -

Login as {user}

+

ITSC 学 生 助 理 抢 班 系 统

+

Login as {user}

+

请勿在短时间内多次操作同一时段的选择,选择后请耐心等待状态更新以确认是否选择成功

{" "} + > {!hideDownloadButton && (

diff --git a/components/UserInputWrap.tsx b/components/UserInputWrap.tsx index 42c82e4..dec1e2f 100644 --- a/components/UserInputWrap.tsx +++ b/components/UserInputWrap.tsx @@ -6,7 +6,7 @@ const UserInputWrap = ({ children, setUser }) => { const [begin, setBegin] = React.useState(false); React.useEffect(() => { - setInputUser(localStorage.getItem("user") || ""); + setInputUser(localStorage.getItem("username") || ""); }, []); return ( @@ -17,9 +17,10 @@ const UserInputWrap = ({ children, setUser }) => { display: "grid", placeItems: "center", alignItems: "center", - minHeight: "100vh", + // minHeight: "100vh", }} > +

ITSC 学 生 助 理 抢 班 系 统

{ } setUser(inputUser.trim()); setBegin(true); - localStorage.setItem("user", inputUser.trim()); + localStorage.setItem("username", inputUser.trim()); }} > Login diff --git a/data.zip b/data.zip new file mode 100644 index 0000000000000000000000000000000000000000..e03d9bf645e4410b0598ef8bc7772283ea7bad7c GIT binary patch literal 21269 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index c3afce1..36ddace 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "esbuild": "./node_modules/.bin/esbuild --bundle --tsconfig=entrypoints/tsconfig.json --alias:'@'='./' --outdir=entrypoints --splitting --format=esm entrypoints/index.tsx entrypoints/edit/index.tsx entrypoints/report/index.tsx entrypoints/control/index.tsx --minify", - "dev": "next dev", + "dev": "next dev -p 4000", "build": "next build", "start": "next start -p 4000", "lint": "next lint" diff --git a/pages/api/record.ts b/pages/api/record.ts index c0472cc..518fd90 100644 --- a/pages/api/record.ts +++ b/pages/api/record.ts @@ -22,25 +22,35 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) { count += 1; if (count >= config.limit) { res.status(403).json({ - error: `超过选择数量限制,您至多选 ${config.limit} 个班.`, + error: `超过选择数量限制,您至多选 ${config.limit} 个班次`, }); return; } } } - // check whether it is already occupied - if (store[json.name] !== undefined) { + // check whether the user repeatly select + if (store[json.name] === json.user) { + console.log("api::request: repeat select", json); res.status(403).json({ - error: `当前位置已被他人占用`, + error: `您已经选择了这个班次,请勿重复选择`, + }); + return; + } + // check whether it is already occupied + else if (store[json.name] !== undefined) { + console.log("api::request: occupied", json); + res.status(403).json({ + error: `当前位置已被他人占用,请选择其他班次`, }); return; } store[json.name] = json.user; } else { + // console.log(store, json); // check whether the request name match the taken name if (store[json.name] !== json.user) { res.status(403).json({ - error: `失败:您未选择到当前位置`, + error: `您已经取消了这个班次,请勿重复点击复选框`, }) return; } diff --git a/pages/index.tsx b/pages/index.tsx index 7d9c67c..595bd60 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -10,8 +10,8 @@ export default function Home() { <> 抢 班 - - {/* */} + +

diff --git a/pages/report-tool.tsx b/pages/report-tool.tsx index 8e1b7ce..b71f232 100644 --- a/pages/report-tool.tsx +++ b/pages/report-tool.tsx @@ -1,14 +1,13 @@ import React from "react"; import Head from "next/head"; +import { get, post } from "@/common"; const ReportPage = () => { const ref = React.useRef(); const getReport = async () => { - const resp = await fetch("/api/html").then((resp) => resp.json()); + const resp = await get("/api/html"); ref.current.innerHTML = resp.html; - const json: Record = await fetch("/api/tool").then((resp) => - resp.json() - ); + const json: Record = await get("/api/tool"); const table = ref.current.children[0]; const tbody = table.children[table.children.length - 1]; for (const tr_index in tbody.children) { diff --git a/pages/report.tsx b/pages/report.tsx index edf2dae..69489cd 100644 --- a/pages/report.tsx +++ b/pages/report.tsx @@ -1,14 +1,13 @@ import React from "react"; import Head from "next/head"; +import { get, post } from "@/common"; const ReportPage = () => { const ref = React.useRef(); const getReport = async () => { - const resp = await fetch("/api/html").then((resp) => resp.json()); + const resp = await get("/api/html"); ref.current.innerHTML = resp.html; - const json: Record = await fetch("/api/admin").then( - (resp) => resp.json() - ); + const json: Record = await get("/api/admin"); const table = ref.current.children[0]; const tbody = table.children[table.children.length - 1]; for (const tr_index in tbody.children) { diff --git a/pages/tool.tsx b/pages/tool.tsx index d6089ab..f94a63f 100644 --- a/pages/tool.tsx +++ b/pages/tool.tsx @@ -7,7 +7,7 @@ export default function Home() { const [begin, setBegin] = React.useState(false); React.useEffect(() => { - setUser(localStorage.getItem("user") || ""); + setUser(localStorage.getItem("username") || ""); }, []); return ( @@ -34,7 +34,7 @@ export default function Home() { } setUser(user.trim()); setBegin(true); - localStorage.setItem("user", user); + localStorage.setItem("username", user); }} > Login