feat: 添加短剧筛选功能和自定义Panel容器组件

1. 新增DramaQuery类型扩展分页查询参数,支持标题、状态、类型筛选
2. 重构usePageData hook,支持自定义查询类型和筛选状态管理
3. 新建Panel通用容器组件替代原生Card
4. 为短剧管理页面添加搜索筛选UI和逻辑
5. 统一所有页面的分页查询默认参数
6. 调整布局样式优化后台管理界面展示
This commit is contained in:
2026-07-02 18:48:51 +08:00
parent 718d1c7aac
commit 2dace1cf8d
14 changed files with 295 additions and 130 deletions

View File

@@ -2,4 +2,4 @@ import type { PageData, PageQuery } from "../api";
export type { PageData, PageQuery };
export type PageFetcher<T> = (query: PageQuery) => Promise<PageData<T>>;
export type PageFetcher<T, Q extends PageQuery = PageQuery> = (query: Q) => Promise<PageData<T>>;

View File

@@ -1,45 +1,53 @@
import { useEffect, useState } from "react";
import type { PageData, PageFetcher, PageQuery } from "./interface";
import type { PageData, PageQuery } from "../api";
import type { PageFetcher } from "./interface";
import { resolvePageData } from "./pageData";
export function usePageData<T>(fetcher: PageFetcher<T>, enabled = true) {
export function usePageData<T, Q extends PageQuery = PageQuery>(
fetcher: PageFetcher<T, Q>,
initialQuery: Q,
enabled = true,
) {
const [loading, setLoading] = useState(false);
const [pageQuery, setPageQuery] = useState<PageQuery>({
page: 1,
pageSize: 20,
});
const [query, setQuery] = useState<Q>(initialQuery);
const [data, setData] = useState<PageData<T>>({
list: [],
pagination: { page: 1, pageSize: 20, total: 0 },
});
const load = async (query = pageQuery) => {
const load = async (q = query) => {
if (!enabled) {
return;
}
setLoading(true);
try {
const response = await fetcher(query);
setData(resolvePageData(response, query));
const response = await fetcher(q);
setData(resolvePageData(response, q));
} finally {
setLoading(false);
}
};
const changePage = (page: number, pageSize: number) => {
setPageQuery({ page, pageSize });
setQuery((prev) => ({ ...prev, page, pageSize } as Q));
};
const setFilter = (patch: Partial<Q>) => {
setQuery((prev) => ({ ...prev, ...patch, page: 1 } as Q));
};
useEffect(() => {
if (enabled) {
void load(pageQuery);
void load(query);
}
}, [fetcher, enabled, pageQuery.page, pageQuery.pageSize]);
}, [fetcher, enabled, query]);
return {
data,
loading,
reload: () => load(pageQuery),
query,
reload: () => load(query),
changePage,
setFilter,
};
}