From f39a33819e1f67e8b3c4b2e36341c30ecf45bbb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AC=94=E8=AE=B0=E6=9C=AC=E9=87=8C=E7=9A=84=E6=B0=B8?= =?UTF-8?q?=E5=B9=B3?= Date: Thu, 17 Jul 2025 22:42:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=AC=E6=AC=A1=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E5=AE=B9=E5=A6=82=E4=B8=8B=20?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6=E5=AE=8C=E6=88=90=EF=BC=8C?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/src/router/index.tsx | 26 +++++++++++----- nkebao/src/store/createPersistStore.ts | 16 ++++++++++ nkebao/src/store/module/user.ts | 43 ++++++++++++++------------ nkebao/src/vite-env.d.ts | 1 + 4 files changed, 58 insertions(+), 28 deletions(-) create mode 100644 nkebao/src/store/createPersistStore.ts create mode 100644 nkebao/src/vite-env.d.ts diff --git a/nkebao/src/router/index.tsx b/nkebao/src/router/index.tsx index 0c58db7e..2c7c0311 100644 --- a/nkebao/src/router/index.tsx +++ b/nkebao/src/router/index.tsx @@ -1,10 +1,23 @@ import React from "react"; -import { BrowserRouter, useRoutes } from "react-router-dom"; -import homeRoutes from "./module/home"; -import aboutRoutes from "./module/about"; +import { BrowserRouter, useRoutes, RouteObject } from "react-router-dom"; import PermissionRoute from "./permissionRoute"; -function wrapWithPermission(route) { +// 动态导入所有 module 下的 ts/tsx 路由模块 +const modules = import.meta.glob("./module/*.{ts,tsx}", { eager: true }); + +// 合并所有模块的默认导出(假设每个模块都是 export default 路由数组) +const allRoutes: (RouteObject & { auth?: boolean; requiredRole?: string })[] = + []; +Object.values(modules).forEach((mod: any) => { + if (Array.isArray(mod.default)) { + allRoutes.push(...mod.default); + } +}); + +// 权限包装 +function wrapWithPermission( + route: RouteObject & { auth?: boolean; requiredRole?: string } +) { if (route.auth) { return { ...route, @@ -18,10 +31,7 @@ function wrapWithPermission(route) { return route; } -const routes = [ - ...homeRoutes.map(wrapWithPermission), - ...aboutRoutes.map(wrapWithPermission), -]; +const routes = allRoutes.map(wrapWithPermission); const AppRoutes = () => useRoutes(routes); diff --git a/nkebao/src/store/createPersistStore.ts b/nkebao/src/store/createPersistStore.ts new file mode 100644 index 00000000..cdfbbb07 --- /dev/null +++ b/nkebao/src/store/createPersistStore.ts @@ -0,0 +1,16 @@ +// src/store/createPersistStore.ts +import { create } from 'zustand'; +import { persist, PersistOptions } from 'zustand/middleware'; + +export function createPersistStore( + createState: (set: any, get: any) => T, + name: string, + partialize?: (state: T) => Partial +) { + return create()( + persist(createState, { + name, + partialize, + } as PersistOptions) + ); +} diff --git a/nkebao/src/store/module/user.ts b/nkebao/src/store/module/user.ts index 63202e04..876c8a77 100644 --- a/nkebao/src/store/module/user.ts +++ b/nkebao/src/store/module/user.ts @@ -1,20 +1,23 @@ -// src/store/user.ts -import { create } from 'zustand'; - -export interface User { - name: string; - role: string; - token: string; -} - -interface UserState { - user: User | null; - setUser: (user: User) => void; - clearUser: () => void; -} - -export const useUserStore = create((set) => ({ - user: null, - setUser: (user) => set({ user }), - clearUser: () => set({ user: null }), -})); \ No newline at end of file +import { createPersistStore } from '@/store/createPersistStore'; + +export interface User { + name: string; + role: string; + token: string; +} + +interface UserState { + user: User | null; + setUser: (user: User) => void; + clearUser: () => void; +} + +export const useUserStore = createPersistStore( + (set) => ({ + user: null, + setUser: (user) => set({ user }), + clearUser: () => set({ user: null }), + }), + 'user-store', + (state) => ({ user: state.user }) +); \ No newline at end of file diff --git a/nkebao/src/vite-env.d.ts b/nkebao/src/vite-env.d.ts new file mode 100644 index 00000000..7d0ff9ef --- /dev/null +++ b/nkebao/src/vite-env.d.ts @@ -0,0 +1 @@ +///