Jelajahi Sumber

♻️ refactor(api): 更新用户模块导入路径

- 将 userRoutes 重命名为 userRoutesMt 以匹配新的模块命名规范
- 更新类型定义和客户端初始化方法以使用新的导入名称

♻️ refactor(components): 调整用户管理组件依赖

- 导入新的用户模块 schema (CreateUserDtoMt, UpdateUserDtoMt, RoleSchemaMt)
- 删除未使用的 Building2 图标导入
- 添加 Role 类型定义适配后端日期格式

♻️ refactor(tests): 完善用户管理测试用例

- 更新 mock 响应格式以包含 json() 方法
- 为 $get 请求添加默认分页数据结构
- 为 $post 请求添加返回数据示例

🔧 chore(config): 优化 tsconfig 配置

- 继承根目录 tsconfig.json 配置
- 删除重复的 compilerOptions 设置
- 简化项目配置结构

🔧 chore(deps): 更新项目依赖关系

- 将依赖从 @d8d/user-module 迁移到 @d8d/user-module-mt
- 添加 @hono/zod-openapi 依赖以支持 OpenAPI 规范验证
yourname 1 bulan lalu
induk
melakukan
adbb28843c

+ 5 - 5
packages/user-management-ui-mt/src/api/userClient.ts

@@ -1,9 +1,9 @@
-import { userRoutes } from '@d8d/user-module-mt';
+import { userRoutesMt } from '@d8d/user-module-mt';
 import { rpcClient } from '@d8d/shared-ui-components/utils/hc'
 
 class UserClientManager {
   private static instance: UserClientManager;
-  private client: ReturnType<typeof rpcClient<typeof userRoutes>> | null = null;
+  private client: ReturnType<typeof rpcClient<typeof userRoutesMt>> | null = null;
 
   private constructor() {}
 
@@ -15,12 +15,12 @@ class UserClientManager {
   }
 
   // 初始化客户端
-  public init(baseUrl: string = '/'): ReturnType<typeof rpcClient<typeof userRoutes>> {
-    return this.client = rpcClient<typeof userRoutes>(baseUrl);
+  public init(baseUrl: string = '/'): ReturnType<typeof rpcClient<typeof userRoutesMt>> {
+    return this.client = rpcClient<typeof userRoutesMt>(baseUrl);
   }
 
   // 获取客户端实例
-  public get(): ReturnType<typeof rpcClient<typeof userRoutes>> {
+  public get(): ReturnType<typeof rpcClient<typeof userRoutesMt>> {
     if (!this.client) {
       return this.init()
     }

+ 11 - 4
packages/user-management-ui-mt/src/components/UserManagement.tsx

@@ -1,9 +1,10 @@
 import React, { useState, useMemo, useCallback } from 'react';
 import { useQuery } from '@tanstack/react-query';
 import { format } from 'date-fns';
-import { Plus, Search, Edit, Trash2, Filter, X, Building2 } from 'lucide-react';
+import { Plus, Search, Edit, Trash2, Filter, X } from 'lucide-react';
 import { userClient, userClientManager } from '../api/userClient';
 import type { InferRequestType, InferResponseType } from 'hono/client';
+import { z } from 'zod';
 import { Button } from '@d8d/shared-ui-components/components/ui/button';
 import { Input } from '@d8d/shared-ui-components/components/ui/input';
 import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@d8d/shared-ui-components/components/ui/card';
@@ -16,7 +17,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
 import { toast } from 'sonner';
 import { Skeleton } from '@d8d/shared-ui-components/components/ui/skeleton';
 import { Switch } from '@d8d/shared-ui-components/components/ui/switch';
-import { CreateUserDto, UpdateUserDto } from '@d8d/user-module-mt/schemas';
+import { CreateUserDtoMt, UpdateUserDtoMt, RoleSchemaMt } from '@d8d/user-module-mt/schemas';
 import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@d8d/shared-ui-components/components/ui/select';
 import { Popover, PopoverContent, PopoverTrigger } from '@d8d/shared-ui-components/components/ui/popover';
 import { Calendar } from '@d8d/shared-ui-components/components/ui/calendar';
@@ -29,11 +30,17 @@ type UpdateUserRequest = InferRequestType<typeof userClient[':id']['$put']>['jso
 type UserResponse = InferResponseType<typeof userClient.index.$get, 200>['data'][0];
 
 // 直接使用后端定义的 schema
-const createUserFormSchema = CreateUserDto;
-const updateUserFormSchema = UpdateUserDto;
+const createUserFormSchema = CreateUserDtoMt;
+const updateUserFormSchema = UpdateUserDtoMt;
 
 type CreateUserFormData = CreateUserRequest;
 type UpdateUserFormData = UpdateUserRequest;
+// 适配后端返回的字符串日期格式
+type Role = Omit<z.infer<typeof RoleSchemaMt>, 'createdAt' | 'updatedAt'> & {
+  createdAt: string;
+  updatedAt: string;
+};
+
 
 export const UserManagement = () => {
   const [searchParams, setSearchParams] = useState({

+ 4 - 4
packages/user-management-ui-mt/tests/integration/userManagement.integration.test.tsx

@@ -27,12 +27,12 @@ const createMockResponse = (status: number, data?: any) => ({
 vi.mock('../../src/api/userClient', () => {
   const mockUserClient = {
     index: {
-      $get: vi.fn(() => Promise.resolve({ status: 200, body: null })),
-      $post: vi.fn(() => Promise.resolve({ status: 201, body: null })),
+      $get: vi.fn(() => Promise.resolve({ status: 200, json: async () => ({ data: [], pagination: { total: 0, page: 1, pageSize: 10 } }) })),
+      $post: vi.fn(() => Promise.resolve({ status: 201, json: async () => ({ id: 2, username: 'newuser' }) })),
     },
     ':id': {
-      $put: vi.fn(() => Promise.resolve({ status: 200, body: null })),
-      $delete: vi.fn(() => Promise.resolve({ status: 204, body: null })),
+      $put: vi.fn(() => Promise.resolve({ status: 200, json: async () => ({}) })),
+      $delete: vi.fn(() => Promise.resolve({ status: 204, json: async () => ({}) })),
     },
   };
   return {

+ 1 - 10
packages/user-management-ui-mt/tsconfig.json

@@ -1,22 +1,13 @@
 {
+  "extends": "../../tsconfig.json",
   "compilerOptions": {
-    "target": "ES2022",
     "lib": ["ES2022", "DOM", "DOM.Iterable"],
-    "module": "ESNext",
-    "skipLibCheck": true,
-    "moduleResolution": "bundler",
-    "allowImportingTsExtensions": true,
-    "resolveJsonModule": true,
     "isolatedModules": true,
     "noEmit": true,
     "jsx": "react-jsx",
-    "strict": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
     "noFallthroughCasesInSwitch": true,
-    "declaration": true,
-    "declarationMap": true,
-    "sourceMap": true,
     "outDir": "./dist",
     "baseUrl": ".",
     "paths": {

+ 5 - 2
pnpm-lock.yaml

@@ -2168,9 +2168,12 @@ importers:
       '@d8d/shared-ui-components':
         specifier: workspace:*
         version: link:../shared-ui-components
-      '@d8d/user-module':
+      '@d8d/user-module-mt':
         specifier: workspace:*
-        version: link:../user-module
+        version: link:../user-module-mt
+      '@hono/zod-openapi':
+        specifier: ^1.1.4
+        version: 1.1.4(hono@4.8.5)(zod@4.1.12)
       '@hookform/resolvers':
         specifier: ^5.2.1
         version: 5.2.2(react-hook-form@7.65.0(react@19.2.0))