- Vite + React + TypeScript 项目初始化 - Tailwind CSS v4 + shadcn/ui 配置(button, card, input, label) - React Router v7 路由:登录页、数据看板、题库/分类/用户/设置占位页 - AdminLayout 布局:侧边栏导航 + 顶栏 - ky v2 HTTP 客户端,自动附加 Bearer token - Zustand auth store + localStorage 持久化 - 认证保护:未登录自动重定向到 /login - 数据看板骨架(4 统计卡片 + 图表占位) - 类型定义:question, user, category, api
27 lines
606 B
TypeScript
27 lines
606 B
TypeScript
import ky from "ky"
|
|
import { API_BASE_URL } from "./constants"
|
|
import { getStoredToken, removeStoredToken } from "./auth"
|
|
|
|
export const apiClient = ky.create({
|
|
baseUrl: API_BASE_URL,
|
|
prefix: "/admin",
|
|
hooks: {
|
|
beforeRequest: [
|
|
({ request }) => {
|
|
const token = getStoredToken()
|
|
if (token) {
|
|
request.headers.set("Authorization", `Bearer ${token}`)
|
|
}
|
|
},
|
|
],
|
|
afterResponse: [
|
|
({ response }) => {
|
|
if (response.status === 401) {
|
|
removeStoredToken()
|
|
window.location.href = "/login"
|
|
}
|
|
},
|
|
],
|
|
},
|
|
})
|