Browse Source

📦 build(server): 重构模块依赖结构

- 将分散的模块(user-module, auth-module, file-module)整合到统一的 core-module 中
- 更新 server 的 package.json 依赖项,简化依赖管理
- 在数据源初始化中新增 SystemConfig 实体

✨ feat(web): 引入多租户UI管理包并重构路由

- 新增多租户UI包依赖:用户管理、认证管理、文件管理、区域管理、系统配置管理
- 创建统一的 API 客户端初始化文件 (api_init.ts),集中管理所有多租户模块的 API 端点配置
- 重构管理后台路由,使用多租户UI包组件替代原有页面组件
- 更新侧边栏菜单,新增区域管理和系统配置管理菜单项,并注释掉部分暂未使用的菜单项
- 优化主布局滚动区域样式,确保内容区域正确滚动
yourname 6 days ago
parent
commit
b7bb8b7524

+ 1 - 3
packages/server/package.json

@@ -34,9 +34,7 @@
     "@d8d/shared-types": "workspace:*",
     "@d8d/shared-utils": "workspace:*",
     "@d8d/shared-crud": "workspace:*",
-    "@d8d/user-module": "workspace:*",
-    "@d8d/auth-module": "workspace:*",
-    "@d8d/file-module": "workspace:*",
+    "@d8d/core-module": "workspace:*",
     "axios": "^1.12.2",
     "bcrypt": "^6.0.0",
     "debug": "^4.4.3",

+ 7 - 6
packages/server/src/index.ts

@@ -1,17 +1,18 @@
 import { OpenAPIHono } from '@hono/zod-openapi'
 import { swaggerUI } from '@hono/swagger-ui'
 import { errorHandler, initializeDataSource } from '@d8d/shared-utils'
-import { userRoutes as userModuleRoutes, roleRoutes as roleModuleRoutes } from '@d8d/user-module'
-import { authRoutes as authModuleRoutes } from '@d8d/auth-module'
-import { fileRoutes as fileModuleRoutes } from '@d8d/file-module'
+import { userRoutes as userModuleRoutes, roleRoutes as roleModuleRoutes } from '@d8d/core-module/user-module'
+import { authRoutes as authModuleRoutes } from '@d8d/core-module/auth-module'
+import { fileRoutes as fileModuleRoutes } from '@d8d/core-module/file-module'
 import { AuthContext } from '@d8d/shared-types'
 import { AppDataSource } from '@d8d/shared-utils'
 import { Hono } from 'hono'
 import { databaseBackup } from './utils/backup'
-import { UserEntity, Role } from '@d8d/user-module'
-import { File } from '@d8d/file-module'
+import { UserEntity, Role } from '@d8d/core-module/user-module'
+import { File } from '@d8d/core-module/file-module'
+import { SystemConfig } from '@d8d/core-module/system-config-module'
 
-initializeDataSource([UserEntity, Role, File])
+initializeDataSource([UserEntity, Role, File, SystemConfig])
 
 if(!AppDataSource || !AppDataSource.isInitialized) {
   await AppDataSource.initialize();

+ 2 - 8
pnpm-lock.yaml

@@ -3259,12 +3259,9 @@ importers:
       '@asteasolutions/zod-to-openapi':
         specifier: ^8.1.0
         version: 8.1.0(zod@4.1.12)
-      '@d8d/auth-module':
-        specifier: workspace:*
-        version: link:../auth-module
-      '@d8d/file-module':
+      '@d8d/core-module':
         specifier: workspace:*
-        version: link:../file-module
+        version: link:../core-module
       '@d8d/shared-crud':
         specifier: workspace:*
         version: link:../shared-crud
@@ -3274,9 +3271,6 @@ importers:
       '@d8d/shared-utils':
         specifier: workspace:*
         version: link:../shared-utils
-      '@d8d/user-module':
-        specifier: workspace:*
-        version: link:../user-module
       '@hono/swagger-ui':
         specifier: ^0.5.0
         version: 0.5.2(hono@4.8.5)

+ 5 - 3
web/package.json

@@ -39,9 +39,11 @@
   },
   "dependencies": {
     "@d8d/server": "workspace:*",
-    "@d8d/user-module": "workspace:*",
-    "@d8d/auth-module": "workspace:*",
-    "@d8d/file-module": "workspace:*",
+    "@d8d/user-management-ui-mt": "workspace:*",
+    "@d8d/auth-management-ui-mt": "workspace:*",
+    "@d8d/file-management-ui-mt": "workspace:*",
+    "@d8d/area-management-ui-mt": "workspace:*",
+    "@d8d/system-config-management-ui-mt": "workspace:*",
     "@ant-design/icons": "^6.0.0",
     "@heroicons/react": "^2.2.0",
     "@hono/node-server": "^1.17.1",

+ 14 - 0
web/src/client/admin/api_init.ts

@@ -0,0 +1,14 @@
+// 多租户UI包API客户端初始化
+import { userClientManager } from '@d8d/user-management-ui/api';
+import { authClientManager } from '@d8d/auth-management-ui/api';
+import { fileClientManager } from '@d8d/file-management-ui/api';
+import { areaClientManager } from '@d8d/area-management-ui/api';
+import { systemConfigClientManager } from '@d8d/system-config-management-ui/api';
+
+
+// 初始化所有多租户API客户端
+userClientManager.init('/api/v1/users');
+authClientManager.init('/api/v1/auth');
+fileClientManager.init('/api/v1/files');
+areaClientManager.init('/api/v1/admin/areas');
+systemConfigClientManager.init('/api/v1/admin/system-configs');

+ 1 - 1
web/src/client/admin/layouts/MainLayout.tsx

@@ -95,7 +95,7 @@ export const MainLayout = () => {
         )}
       </div>
       
-      <ScrollArea className="flex-1">
+      <ScrollArea className="flex-1 overflow-y-auto">
         <nav className="p-2">
           {menuItems.map((item) => (
             <div key={item.key}>

+ 67 - 35
web/src/client/admin/menu.tsx

@@ -4,11 +4,9 @@ import { useAuth } from './hooks/AuthProvider';
 import {
   Users,
   Settings,
-  User,
   LogOut,
-  BarChart3,
-  LayoutDashboard,
-  File
+  File,
+  MapPin,
 } from 'lucide-react';
 
 export interface MenuItem {
@@ -74,12 +72,12 @@ export const useMenu = () => {
 
   // 基础菜单项配置
   const menuItems: MenuItem[] = [
-    {
-      key: 'dashboard',
-      label: '控制台',
-      icon: <LayoutDashboard className="h-4 w-4" />,
-      path: '/admin/dashboard'
-    },
+    // {
+    //   key: 'dashboard',
+    //   label: '控制台',
+    //   icon: <LayoutDashboard className="h-4 w-4" />,
+    //   path: '/admin/dashboard'
+    // },
     {
       key: 'users',
       label: '用户管理',
@@ -94,40 +92,74 @@ export const useMenu = () => {
       path: '/admin/files',
       permission: 'file:manage'
     },
+    // {
+    //   key: 'analytics',
+    //   label: '数据分析',
+    //   icon: <BarChart3 className="h-4 w-4" />,
+    //   path: '/admin/analytics',
+    //   permission: 'analytics:view'
+    // },
+    // {
+    //   key: 'agents',
+    //   label: '代理商管理',
+    //   icon: <UserCheck className="h-4 w-4" />,
+    //   path: '/admin/agents',
+    //   permission: 'agent:manage'
+    // },
     {
-      key: 'analytics',
-      label: '数据分析',
-      icon: <BarChart3 className="h-4 w-4" />,
-      path: '/admin/analytics',
-      permission: 'analytics:view'
+      key: 'areas',
+      label: '区域管理',
+      icon: <MapPin className="h-4 w-4" />,
+      path: '/admin/areas',
+      permission: 'area:manage'
     },
+    // {
+    //   key: 'cards',
+    //   label: '卡券管理',
+    //   icon: <CreditCard className="h-4 w-4" />,
+    //   permission: 'card:manage',
+    //   children: [
+    //     {
+    //       key: 'user-cards',
+    //       label: '用户卡管理',
+    //       path: '/admin/user-cards',
+    //       permission: 'card:manage'
+    //     },
+    //     {
+    //       key: 'user-card-balance-records',
+    //       label: '余额记录',
+    //       path: '/admin/user-card-balance-records',
+    //       permission: 'card:manage'
+    //     }
+    //   ]
+    // },
     {
-      key: 'settings',
-      label: '系统设置',
+      key: 'system-configs',
+      label: '系统置',
       icon: <Settings className="h-4 w-4" />,
-      path: '/admin/settings',
-      permission: 'settings:manage'
+      path: '/admin/system-configs',
+      permission: 'system-config:manage'
     },
   ];
 
   // 用户菜单项
   const userMenuItems = [
-    {
-      key: 'profile',
-      label: '个人资料',
-      icon: <User className="mr-2 h-4 w-4" />,
-      onClick: () => navigate('/admin/profile')
-    },
-    {
-      key: 'settings',
-      label: '账户设置',
-      icon: <Settings className="mr-2 h-4 w-4" />,
-      onClick: () => navigate('/admin/account-settings')
-    },
-    {
-      type: 'separator',
-      key: 'divider',
-    },
+    // {
+    //   key: 'profile',
+    //   label: '个人资料',
+    //   icon: <User className="mr-2 h-4 w-4" />,
+    //   onClick: () => navigate('/admin/profile')
+    // },
+    // {
+    //   key: 'settings',
+    //   label: '账户设置',
+    //   icon: <Settings className="mr-2 h-4 w-4" />,
+    //   onClick: () => navigate('/admin/account-settings')
+    // },
+    // {
+    //   type: 'separator',
+    //   key: 'divider',
+    // },
     {
       key: 'logout',
       label: '退出登录',

+ 27 - 5
web/src/client/admin/routes.tsx

@@ -4,9 +4,16 @@ import { MainLayout } from './layouts/MainLayout';
 import { ErrorPage } from './components/ErrorPage';
 import { NotFoundPage } from './components/NotFoundPage';
 import { DashboardPage } from './pages/Dashboard';
-import { UsersPage } from './pages/Users';
 import { LoginPage } from './pages/Login';
-import { FilesPage } from './pages/Files';
+
+// 多租户UI包导入
+import { UserManagement } from '@d8d/user-management-ui';
+import { AuthManagement } from '@d8d/auth-management-ui';
+import { FileManagement } from '@d8d/file-management-ui';
+import { AreaManagement } from '@d8d/area-management-ui';
+import { SystemConfigManagement } from '@d8d/system-config-management-ui';
+
+import "./api_init"
 
 export const router = createBrowserRouter([
   {
@@ -27,7 +34,7 @@ export const router = createBrowserRouter([
     children: [
       {
         index: true,
-        element: <Navigate to="/admin/dashboard" />
+        element: <Navigate to="/admin/users" />
       },
       {
         path: 'dashboard',
@@ -36,12 +43,27 @@ export const router = createBrowserRouter([
       },
       {
         path: 'users',
-        element: <UsersPage />,
+        element: <UserManagement />,
+        errorElement: <ErrorPage />
+      },
+      {
+        path: 'auth',
+        element: <AuthManagement />,
         errorElement: <ErrorPage />
       },
       {
         path: 'files',
-        element: <FilesPage />,
+        element: <FileManagement />,
+        errorElement: <ErrorPage />
+      },
+      {
+        path: 'areas',
+        element: <AreaManagement />,
+        errorElement: <ErrorPage />
+      },
+      {
+        path: 'system-configs',
+        element: <SystemConfigManagement />,
         errorElement: <ErrorPage />
       },
       {

+ 6 - 7
web/src/client/api.ts

@@ -1,8 +1,7 @@
 import axios, { isAxiosError } from 'axios';
 import { hc } from 'hono/client'
 import type {
-  AuthRoutes, UserRoutes, RoleRoutes,
-  FileRoutes
+  AuthRoutes, UserRoutes, RoleRoutes, FileRoutes,
 } from '@d8d/server';
 
 // 创建 axios 适配器
@@ -59,19 +58,19 @@ const axiosFetch = async (url: RequestInfo | URL, init?: RequestInit) => {
   )
 }
 
-
+// 创建客户端
 export const authClient = hc<AuthRoutes>('/', {
   fetch: axiosFetch,
-}).api.v1.auth;
+}).api.v1.auth
 
 export const userClient = hc<UserRoutes>('/', {
   fetch: axiosFetch,
-}).api.v1.users;
+}).api.v1.users
 
 export const roleClient = hc<RoleRoutes>('/', {
   fetch: axiosFetch,
-}).api.v1.roles;
+}).api.v1.roles
 
 export const fileClient = hc<FileRoutes>('/', {
   fetch: axiosFetch,
-}).api.v1.files;
+}).api.v1.files