From 452b807b62401b81bb39ccc4e7253661c31a1c97 Mon Sep 17 00:00:00 2001 From: zihluwang Date: Mon, 6 Apr 2026 20:40:42 +0800 Subject: [PATCH] feat: add firearm page for display firearms --- src/index.css | 4 +- src/page/firearms/index.tsx | 223 ++++++++++-------------------------- 2 files changed, 64 insertions(+), 163 deletions(-) diff --git a/src/index.css b/src/index.css index bd25a93..f48439e 100644 --- a/src/index.css +++ b/src/index.css @@ -1,4 +1,6 @@ -@import "tailwindcss"; +@layer theme, base, antd, components, utilities; + +@import 'tailwindcss'; html, body { margin: 0; diff --git a/src/page/firearms/index.tsx b/src/page/firearms/index.tsx index c6363c8..5095d06 100644 --- a/src/page/firearms/index.tsx +++ b/src/page/firearms/index.tsx @@ -1,9 +1,7 @@ -import { useEffect, useMemo, useState } from "react" -import { Link } from "react-router-dom" +import { useEffect, useState } from "react" import { FirearmApi } from "@/api" import { Firearm, FirearmType } from "@/types" -import { setFirearmsPage } from "@/store/firearms-slice" -import { useAppDispatch, useAppSelector } from "@/store" +import { Card, Col, Pagination, Row, Tag, Typography } from "antd" const firearmTypeText: Record = { RIFLE: "步枪", @@ -17,171 +15,72 @@ const firearmTypeText: Record = { } export default function FirearmsPage() { - const pageSize = 12 - const dispatch = useAppDispatch() - const firearmsState = useAppSelector((state) => state.firearms) - const firearms = firearmsState.items - const [isLoading, setIsLoading] = useState(true) - const [isRefreshing, setIsRefreshing] = useState(false) - const [loadError, setLoadError] = useState(null) - const [keyword, setKeyword] = useState("") - const [activeType, setActiveType] = useState<"全部" | FirearmType>("全部") - const [currentPage, setCurrentPage] = useState(firearmsState.page) - - const fetchFirearms = (page: number, forceRefresh = false) => { - if (!forceRefresh && firearms.length > 0 && page === firearmsState.page) { - setIsLoading(false) - setLoadError(null) - return - } - - setIsLoading(true) - setLoadError(null) - - if (forceRefresh) { - setIsRefreshing(true) - } + const [page, setPage] = useState(1) + const [firearms, setFirearms] = useState([]) + const [total, setTotal] = useState(0) + useEffect(() => { FirearmApi.getFirearms({ - page, - size: pageSize, - sortBy: "name", + page: page - 1, + size: 12, + sortBy: "id", direction: "ASC", + }).then((pagedData) => { + setFirearms(pagedData.items) + setTotal(pagedData.totalElements) }) - .then((page) => { - dispatch(setFirearmsPage(page)) - }) - .catch(() => { - setLoadError("武器列表加载失败,请确认后端服务是否已启动。") - }) - .finally(() => { - setIsLoading(false) - setIsRefreshing(false) - }) - } - - useEffect(() => { - fetchFirearms(currentPage, false) - }, [currentPage, dispatch]) - - useEffect(() => { - if (firearmsState.page !== currentPage) { - setCurrentPage(firearmsState.page) - } - }, [currentPage, firearmsState.page]) - - const filteredFirearms = useMemo(() => { - const trimmed = keyword.trim().toLowerCase() - return firearms.filter((item) => { - const matchKeyword = !trimmed || item.name.toLowerCase().includes(trimmed) - const matchType = activeType === "全部" || item.type === activeType - return matchKeyword && matchType - }) - }, [activeType, firearms, keyword]) + }, [page]) return ( -
-
-
-

先选择武器,再进入该武器的改枪码列表。

- -
- {isLoading ?

正在加载武器列表...

: null} - {loadError ?

{loadError}

: null} - -
- - - -
- + <> +
+ + {firearms.map((firearm) => ( + + +
+
+ {firearmTypeText[firearm.type]} + ID: {firearm.id} +
+ + 解锁等级: + {firearm.level} + + + {firearm.review || "暂无描述"} + +
+
+ + ))} + {firearms.length === 0 && ( + + + 暂无武器数据 + + + )} +
- -
- {filteredFirearms.map((item) => ( -
-
-

{item.name}

- - {firearmTypeText[item.type]} - -
- -
- {item.level ? ( - {item.level} - ) : null} -
- - {item.review ? ( -

{item.review}

- ) : null} - - - 查看改枪码 - -
- ))} +
+ { + setPage(nextPage) + }} + showSizeChanger={false} + />
- - {!isLoading && filteredFirearms.length === 0 ? ( -
- 未找到匹配的武器,请尝试其他关键字或类别。 -
- ) : null} - -
-

- 第 {firearmsState.page + 1} / {Math.max(firearmsState.totalPages, 1)} 页,共 {firearmsState.totalElements} 条 -

-
- - -
-
-
+ ) }