feat: 重构前端为企业 Admin 后台布局,引入 React Router 路由
- 引入 React Router v7 (Declarative mode) 实现 SPA 路由 - 重构 Layout 为 Header + 侧边栏 + 内容区的企业 Admin 布局 - 新增侧边栏菜单组件,支持折叠/展开,状态持久化到 localStorage - 新增示例页面:仪表盘、用户管理、系统设置、404 - 菜单配置与路由统一为单一数据源 (menu.tsx) - Vite code splitting 新增 vendor-router 组 - 更新 DEVELOPMENT.md 和 README.md 文档
This commit is contained in:
16
tests/web/routes/404.test.tsx
Normal file
16
tests/web/routes/404.test.tsx
Normal file
@@ -0,0 +1,16 @@
|
||||
import { screen } from "@testing-library/react";
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { createElement } from "react";
|
||||
|
||||
import { NotFoundPage } from "../../../src/web/pages/404";
|
||||
import { renderWithProviders } from "../test-utils";
|
||||
|
||||
describe("NotFoundPage", () => {
|
||||
test("渲染 404 页面", () => {
|
||||
renderWithProviders(createElement(NotFoundPage));
|
||||
|
||||
expect(screen.getByText("404")).not.toBeNull();
|
||||
expect(screen.getByText("您访问的页面不存在")).not.toBeNull();
|
||||
expect(screen.getByText("返回首页")).not.toBeNull();
|
||||
});
|
||||
});
|
||||
22
tests/web/routes/dashboard.test.tsx
Normal file
22
tests/web/routes/dashboard.test.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
/* eslint-disable @typescript-eslint/require-await */
|
||||
import { screen } from "@testing-library/react";
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { createElement } from "react";
|
||||
|
||||
import { DashboardPage } from "../../../src/web/pages/dashboard";
|
||||
import { renderWithProviders } from "../test-utils";
|
||||
|
||||
describe("DashboardPage", () => {
|
||||
test("渲染欢迎信息", () => {
|
||||
window.fetch = (async () => {
|
||||
return new Response(JSON.stringify({ ok: true, service: "test-app", timestamp: new Date().toISOString() }), {
|
||||
headers: { "Content-Type": "application/json" },
|
||||
status: 200,
|
||||
});
|
||||
}) as unknown as typeof fetch;
|
||||
|
||||
renderWithProviders(createElement(DashboardPage));
|
||||
|
||||
expect(screen.getByText(/欢迎使用/)).not.toBeNull();
|
||||
});
|
||||
});
|
||||
15
tests/web/routes/settings.test.tsx
Normal file
15
tests/web/routes/settings.test.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
import { screen } from "@testing-library/react";
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { createElement } from "react";
|
||||
|
||||
import { SettingsPage } from "../../../src/web/pages/settings";
|
||||
import { renderWithProviders } from "../test-utils";
|
||||
|
||||
describe("SettingsPage", () => {
|
||||
test("渲染系统设置页面", () => {
|
||||
renderWithProviders(createElement(SettingsPage));
|
||||
|
||||
expect(screen.getByText("系统设置")).not.toBeNull();
|
||||
expect(screen.getByText("页面建设中...")).not.toBeNull();
|
||||
});
|
||||
});
|
||||
15
tests/web/routes/users.test.tsx
Normal file
15
tests/web/routes/users.test.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
import { screen } from "@testing-library/react";
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { createElement } from "react";
|
||||
|
||||
import { UsersPage } from "../../../src/web/pages/users";
|
||||
import { renderWithProviders } from "../test-utils";
|
||||
|
||||
describe("UsersPage", () => {
|
||||
test("渲染用户管理页面", () => {
|
||||
renderWithProviders(createElement(UsersPage));
|
||||
|
||||
expect(screen.getByText("用户管理")).not.toBeNull();
|
||||
expect(screen.getByText("页面建设中...")).not.toBeNull();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user