Procházet zdrojové kódy

🔧 fix: 修复多租户模块文件命名和编译错误

- 统一多租户文件命名为 .mt.ts 后缀
- 修复包导出配置以使用正确的多租户文件
- 更新测试文件以匹配新的多租户结构
- 修复文件模块中的租户隔离问题
- 将GenericCrudService中的repository属性从protected改为public

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname před 1 měsícem
rodič
revize
0db685819b
58 změnil soubory, kde provedl 121 přidání a 731 odebrání
  1. 20 20
      packages/auth-module-mt/package.json
  2. 0 0
      packages/auth-module-mt/src/entities/index.mt.ts
  3. 4 0
      packages/auth-module-mt/src/index.mt.ts
  4. 0 4
      packages/auth-module-mt/src/index.ts
  5. 1 1
      packages/auth-module-mt/src/middleware/auth.middleware.mt.ts
  6. 1 0
      packages/auth-module-mt/src/middleware/index.mt.ts
  7. 0 1
      packages/auth-module-mt/src/middleware/index.ts
  8. 8 8
      packages/auth-module-mt/src/routes/index.mt.ts
  9. 2 2
      packages/auth-module-mt/src/routes/login.route.mt.ts
  10. 3 3
      packages/auth-module-mt/src/routes/logout.route.mt.ts
  11. 2 2
      packages/auth-module-mt/src/routes/me.route.mt.ts
  12. 4 4
      packages/auth-module-mt/src/routes/mini-login.route.mt.ts
  13. 5 5
      packages/auth-module-mt/src/routes/phone-decrypt.route.mt.ts
  14. 4 4
      packages/auth-module-mt/src/routes/register.route.mt.ts
  15. 1 1
      packages/auth-module-mt/src/routes/sso-verify.route.mt.ts
  16. 2 2
      packages/auth-module-mt/src/routes/update-me.route.mt.ts
  17. 0 0
      packages/auth-module-mt/src/schemas/auth.schema.mt.ts
  18. 1 1
      packages/auth-module-mt/src/schemas/index.mt.ts
  19. 0 0
      packages/auth-module-mt/src/services/auth.service.mt.ts
  20. 2 0
      packages/auth-module-mt/src/services/index.mt.ts
  21. 0 2
      packages/auth-module-mt/src/services/index.ts
  22. 0 0
      packages/auth-module-mt/src/services/mini-auth.service.mt.ts
  23. 2 2
      packages/auth-module-mt/tests/integration/auth.integration.test.ts
  24. 7 6
      packages/auth-module-mt/tests/integration/phone-decrypt.integration.test.ts
  25. 2 2
      packages/auth-module-mt/tests/unit/mini-auth.service.test.ts
  26. 1 1
      packages/file-module-mt/src/index.ts
  27. 2 2
      packages/file-module-mt/src/schemas/file.schema.mt.ts
  28. 2 2
      packages/file-module-mt/tests/integration/file.routes.integration.test.ts
  29. 1 1
      packages/shared-crud/src/services/generic-crud.service.ts
  30. 12 12
      packages/user-module-mt/package.json
  31. 2 0
      packages/user-module-mt/src/entities/index.mt.ts
  32. 0 2
      packages/user-module-mt/src/entities/index.ts
  33. 0 0
      packages/user-module-mt/src/entities/role.entity.mt.ts
  34. 1 2
      packages/user-module-mt/src/entities/user.entity.mt.ts
  35. 11 0
      packages/user-module-mt/src/index.mt.ts
  36. 0 11
      packages/user-module-mt/src/index.ts
  37. 0 187
      packages/user-module-mt/src/routes/custom.routes.ts
  38. 2 0
      packages/user-module-mt/src/routes/index.mt.ts
  39. 0 4
      packages/user-module-mt/src/routes/index.ts
  40. 1 1
      packages/user-module-mt/src/routes/role.routes.mt.ts
  41. 0 26
      packages/user-module-mt/src/routes/role.routes.ts
  42. 1 1
      packages/user-module-mt/src/routes/user.routes.mt.ts
  43. 0 26
      packages/user-module-mt/src/routes/user.routes.ts
  44. 2 0
      packages/user-module-mt/src/schemas/index.mt.ts
  45. 0 4
      packages/user-module-mt/src/schemas/index.ts
  46. 0 28
      packages/user-module-mt/src/schemas/role.schema.ts
  47. 0 180
      packages/user-module-mt/src/schemas/user.schema.ts
  48. 2 0
      packages/user-module-mt/src/services/index.mt.ts
  49. 0 4
      packages/user-module-mt/src/services/index.ts
  50. 1 1
      packages/user-module-mt/src/services/role.service.mt.ts
  51. 0 20
      packages/user-module-mt/src/services/role.service.ts
  52. 1 1
      packages/user-module-mt/src/services/user.service.mt.ts
  53. 0 137
      packages/user-module-mt/src/services/user.service.ts
  54. 1 1
      packages/user-module-mt/tests/entities/test-user.entity.ts
  55. 1 1
      packages/user-module-mt/tests/integration/role.integration.test.ts
  56. 3 3
      packages/user-module-mt/tests/integration/user.routes.integration.test.ts
  57. 2 2
      packages/user-module-mt/tests/utils/integration-test-db.ts
  58. 1 1
      packages/user-module-mt/tests/utils/integration-test-utils.ts

+ 20 - 20
packages/auth-module-mt/package.json

@@ -3,23 +3,23 @@
   "version": "1.0.0",
   "type": "module",
   "description": "D8D Multi-Tenant Authentication Module",
-  "main": "src/index.ts",
-  "types": "src/index.ts",
+  "main": "src/index.mt.ts",
+  "types": "src/index.mt.ts",
   "exports": {
     ".": {
-      "types": "./src/index.ts",
-      "import": "./src/index.ts",
-      "require": "./src/index.ts"
+      "types": "./src/index.mt.ts",
+      "import": "./src/index.mt.ts",
+      "require": "./src/index.mt.ts"
     },
     "./services": {
-      "types": "./src/services/index.ts",
-      "import": "./src/services/index.ts",
-      "require": "./src/services/index.ts"
+      "types": "./src/services/index.mt.ts",
+      "import": "./src/services/index.mt.ts",
+      "require": "./src/services/index.mt.ts"
     },
     "./schemas": {
-      "types": "./src/schemas/index.ts",
-      "import": "./src/schemas/index.ts",
-      "require": "./src/schemas/index.ts"
+      "types": "./src/schemas/index.mt.ts",
+      "import": "./src/schemas/index.mt.ts",
+      "require": "./src/schemas/index.mt.ts"
     },
     "./schemas/*": {
       "types": "./src/schemas/*",
@@ -27,19 +27,19 @@
       "require": "./src/schemas/*"
     },
     "./routes": {
-      "types": "./src/routes/index.ts",
-      "import": "./src/routes/index.ts",
-      "require": "./src/routes/index.ts"
+      "types": "./src/routes/index.mt.ts",
+      "import": "./src/routes/index.mt.ts",
+      "require": "./src/routes/index.mt.ts"
     },
     "./middleware": {
-      "types": "./src/middleware/index.ts",
-      "import": "./src/middleware/index.ts",
-      "require": "./src/middleware/index.ts"
+      "types": "./src/middleware/index.mt.ts",
+      "import": "./src/middleware/index.mt.ts",
+      "require": "./src/middleware/index.mt.ts"
     },
     "./entities": {
-      "types": "./src/entities/index.ts",
-      "import": "./src/entities/index.ts",
-      "require": "./src/entities/index.ts"
+      "types": "./src/entities/index.mt.ts",
+      "import": "./src/entities/index.mt.ts",
+      "require": "./src/entities/index.mt.ts"
     }
   },
   "scripts": {

+ 0 - 0
packages/auth-module-mt/src/entities/index.ts → packages/auth-module-mt/src/entities/index.mt.ts


+ 4 - 0
packages/auth-module-mt/src/index.mt.ts

@@ -0,0 +1,4 @@
+export * from './services/index.mt';
+export * from './schemas/index.mt';
+export * from './routes/index.mt';
+export * from './middleware/index.mt';

+ 0 - 4
packages/auth-module-mt/src/index.ts

@@ -1,4 +0,0 @@
-export * from './services';
-export * from './schemas';
-export * from './routes';
-export * from './middleware';

+ 1 - 1
packages/auth-module-mt/src/middleware/auth.middleware.ts → packages/auth-module-mt/src/middleware/auth.middleware.mt.ts

@@ -1,5 +1,5 @@
 import { Context, Next } from 'hono';
-import { AuthService } from '../services';
+import { AuthService } from '../services/index.mt';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { AppDataSource } from '@d8d/shared-utils';
 import { AuthContext } from '@d8d/shared-types';

+ 1 - 0
packages/auth-module-mt/src/middleware/index.mt.ts

@@ -0,0 +1 @@
+export { authMiddleware } from './auth.middleware.mt';

+ 0 - 1
packages/auth-module-mt/src/middleware/index.ts

@@ -1 +0,0 @@
-export { authMiddleware } from './auth.middleware';

+ 8 - 8
packages/auth-module-mt/src/routes/index.ts → packages/auth-module-mt/src/routes/index.mt.ts

@@ -1,13 +1,13 @@
 import { OpenAPIHono } from '@hono/zod-openapi';
 import { AuthContext } from '@d8d/shared-types';
-import loginRoute from './login.route';
-import registerRoute from './register.route';
-import miniLoginRoute from './mini-login.route';
-import meRoute from './me.route';
-import updateMeRoute from './update-me.route';
-import logoutRoute from './logout.route';
-import ssoVerifyRoute from './sso-verify.route';
-import phoneDecryptRoute from './phone-decrypt.route';
+import loginRoute from './login.route.mt';
+import registerRoute from './register.route.mt';
+import miniLoginRoute from './mini-login.route.mt';
+import meRoute from './me.route.mt';
+import updateMeRoute from './update-me.route.mt';
+import logoutRoute from './logout.route.mt';
+import ssoVerifyRoute from './sso-verify.route.mt';
+import phoneDecryptRoute from './phone-decrypt.route.mt';
 
 // 创建统一的路由应用
 const authRoutes = new OpenAPIHono<AuthContext>()

+ 2 - 2
packages/auth-module-mt/src/routes/login.route.ts → packages/auth-module-mt/src/routes/login.route.mt.ts

@@ -1,11 +1,11 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
-import { AuthService } from '../services';
+import { AuthService } from '../services/index.mt';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { ErrorSchema } from '@d8d/shared-utils';
 import { AppDataSource } from '@d8d/shared-utils';
 import { AuthContext } from '@d8d/shared-types';
 import { parseWithAwait } from '@d8d/shared-utils';
-import { LoginSchema, TokenResponseSchema } from '../schemas';
+import { LoginSchema, TokenResponseSchema } from '../schemas/index.mt';
 
 const loginRoute = createRoute({
   method: 'post',

+ 3 - 3
packages/auth-module-mt/src/routes/logout.route.ts → packages/auth-module-mt/src/routes/logout.route.mt.ts

@@ -1,12 +1,12 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from '@hono/zod-openapi';
 import { AuthContext } from '@d8d/shared-types';
-import { authMiddleware } from '../middleware';
+import { authMiddleware } from '../middleware/index.mt';
 import { AppDataSource } from '@d8d/shared-utils';
-import { AuthService } from '../services';
+import { AuthService } from '../services/index.mt';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { ErrorSchema } from '@d8d/shared-utils';
-import { SuccessSchema } from '../schemas';
+import { SuccessSchema } from '../schemas/index.mt';
 
 
 // 定义路由

+ 2 - 2
packages/auth-module-mt/src/routes/me.route.ts → packages/auth-module-mt/src/routes/me.route.mt.ts

@@ -1,9 +1,9 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { ErrorSchema } from '@d8d/shared-utils';
-import { authMiddleware } from '../middleware';
+import { authMiddleware } from '../middleware/index.mt';
 import { AuthContext } from '@d8d/shared-types';
 import { UserSchemaMt } from '@d8d/user-module-mt';
-import { UserResponseSchema } from '../schemas';
+import { UserResponseSchema } from '../schemas/index.mt';
 
 const routeDef = createRoute({
   method: 'get',

+ 4 - 4
packages/auth-module-mt/src/routes/mini-login.route.ts → packages/auth-module-mt/src/routes/mini-login.route.mt.ts

@@ -1,10 +1,10 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { z } from '@hono/zod-openapi';
-import { MiniAuthService } from '../services';
+import { MiniAuthService } from '../services/index.mt';
 import { AppDataSource } from '@d8d/shared-utils';
 import { ErrorSchema } from '@d8d/shared-utils';
-import { UserEntity } from '@d8d/user-module';
-import { MiniLoginSchema, MiniLoginResponseSchema } from '../schemas';
+import { UserEntityMt } from '@d8d/user-module-mt';
+import { MiniLoginSchema, MiniLoginResponseSchema } from '../schemas/index.mt';
 
 
 const miniLoginRoute = createRoute({
@@ -64,7 +64,7 @@ const app = new OpenAPIHono().openapi(miniLoginRoute, async (c) => {
       });
 
       // 重新获取更新后的用户信息
-      const updatedUser = await AppDataSource.getRepository(UserEntity).findOne({
+      const updatedUser = await AppDataSource.getRepository(UserEntityMt).findOne({
         where: { id: result.user.id },
         relations: ['avatarFile']
       });

+ 5 - 5
packages/auth-module-mt/src/routes/phone-decrypt.route.ts → packages/auth-module-mt/src/routes/phone-decrypt.route.mt.ts

@@ -1,11 +1,11 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
-import { MiniAuthService } from '../services';
+import { MiniAuthService } from '../services/index.mt';
 import { AppDataSource, redisUtil } from '@d8d/shared-utils';
 import { ErrorSchema } from '@d8d/shared-utils';
-import { UserEntity } from '@d8d/user-module';
-import { authMiddleware } from '../middleware';
+import { UserEntityMt } from '@d8d/user-module-mt';
+import { authMiddleware } from '../middleware/index.mt';
 import { AuthContext } from '@d8d/shared-types';
-import { PhoneDecryptSchema, PhoneDecryptResponseSchema } from '../schemas';
+import { PhoneDecryptSchema, PhoneDecryptResponseSchema } from '../schemas/index.mt';
 
 const phoneDecryptRoute = createRoute({
   method: 'post',
@@ -74,7 +74,7 @@ const app = new OpenAPIHono<AuthContext>().openapi(phoneDecryptRoute, async (c)
     }
 
     // 获取用户信息
-    const userRepository = AppDataSource.getRepository(UserEntity);
+    const userRepository = AppDataSource.getRepository(UserEntityMt);
     const userEntity = await userRepository.findOne({
       where: { id: user.id },
       relations: ['avatarFile']

+ 4 - 4
packages/auth-module-mt/src/routes/register.route.ts → packages/auth-module-mt/src/routes/register.route.mt.ts

@@ -1,13 +1,13 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
-import { AuthService } from '../services';
+import { AuthService } from '../services/index.mt';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { z } from '@hono/zod-openapi';
 import { AppDataSource } from '@d8d/shared-utils';
 import { ErrorSchema } from '@d8d/shared-utils';
 import { AuthContext } from '@d8d/shared-types';
-import { UserSchema } from '@d8d/user-module-mt';
+import { UserSchemaMt } from '@d8d/user-module-mt';
 import { parseWithAwait } from '@d8d/shared-utils';
-import { TokenResponseSchema } from '../schemas';
+import { TokenResponseSchema } from '../schemas/index.mt';
 
 const RegisterSchema = z.object({
   username: z.string().min(3).openapi({
@@ -78,7 +78,7 @@ const app = new OpenAPIHono<AuthContext>().openapi(registerRoute, async (c) => {
   const token = authService.generateToken(user);
   return c.json({
     token,
-    user: await parseWithAwait(UserSchema, user)
+    user: await parseWithAwait(UserSchemaMt, user)
   }, 201);
 });
 

+ 1 - 1
packages/auth-module-mt/src/routes/sso-verify.route.ts → packages/auth-module-mt/src/routes/sso-verify.route.mt.ts

@@ -1,5 +1,5 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
-import { AuthService } from '../services';
+import { AuthService } from '../services/index.mt';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { ErrorSchema } from '@d8d/shared-utils';
 import { AppDataSource } from '@d8d/shared-utils';

+ 2 - 2
packages/auth-module-mt/src/routes/update-me.route.ts → packages/auth-module-mt/src/routes/update-me.route.mt.ts

@@ -1,12 +1,12 @@
 import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
 import { ErrorSchema } from '@d8d/shared-utils';
-import { authMiddleware } from '../middleware';
+import { authMiddleware } from '../middleware/index.mt';
 import { AuthContext } from '@d8d/shared-types';
 import { UserSchema, UpdateUserDto } from '@d8d/user-module';
 import { UserServiceMt } from '@d8d/user-module-mt';
 import { AppDataSource } from '@d8d/shared-utils';
 import { parseWithAwait } from '@d8d/shared-utils';
-import { UserResponseSchema } from '../schemas';
+import { UserResponseSchema } from '../schemas/index.mt';
 
 const routeDef = createRoute({
   method: 'put',

+ 0 - 0
packages/auth-module-mt/src/schemas/auth.schema.ts → packages/auth-module-mt/src/schemas/auth.schema.mt.ts


+ 1 - 1
packages/auth-module-mt/src/schemas/index.ts → packages/auth-module-mt/src/schemas/index.mt.ts

@@ -8,4 +8,4 @@ export {
   SuccessSchema,
   PhoneDecryptSchema,
   PhoneDecryptResponseSchema
-} from './auth.schema';
+} from './auth.schema.mt';

+ 0 - 0
packages/auth-module-mt/src/services/auth.service.ts → packages/auth-module-mt/src/services/auth.service.mt.ts


+ 2 - 0
packages/auth-module-mt/src/services/index.mt.ts

@@ -0,0 +1,2 @@
+export { AuthService } from './auth.service.mt';
+export { MiniAuthService } from './mini-auth.service.mt';

+ 0 - 2
packages/auth-module-mt/src/services/index.ts

@@ -1,2 +0,0 @@
-export { AuthService } from './auth.service';
-export { MiniAuthService } from './mini-auth.service';

+ 0 - 0
packages/auth-module-mt/src/services/mini-auth.service.ts → packages/auth-module-mt/src/services/mini-auth.service.mt.ts


+ 2 - 2
packages/auth-module-mt/tests/integration/auth.integration.test.ts

@@ -6,8 +6,8 @@ import {
 } from '@d8d/shared-test-util';
 import { RoleMt, UserEntityMt, UserServiceMt } from '@d8d/user-module-mt';
 import { FileMt } from '@d8d/file-module-mt';
-import authRoutes from '../../src/routes';
-import { AuthService } from '../../src/services';
+import authRoutes from '../../src/routes/index.mt';
+import { AuthService } from '../../src/services/index.mt';
 import { DisabledStatus } from '@d8d/shared-types';
 import { TestDataFactory } from '../utils/test-data-factory';
 

+ 7 - 6
packages/auth-module-mt/tests/integration/phone-decrypt.integration.test.ts

@@ -1,13 +1,13 @@
 import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
 import { testClient } from 'hono/testing';
-import { authRoutes } from '../../src/routes';
+import { authRoutes } from '../../src/routes/index.mt';
 import { IntegrationTestDatabase, setupIntegrationDatabaseHooksWithEntities } from '@d8d/shared-test-util';
 import { RoleMt, UserEntityMt } from '@d8d/user-module-mt';
 import { redisUtil, JWTUtil } from '@d8d/shared-utils';
 import { FileMt } from '@d8d/file-module-mt';
 
 // Mock MiniAuthService 的 decryptPhoneNumber 方法
-vi.mock('../../src/services/mini-auth.service', () => ({
+vi.mock('../../src/services/mini-auth.service.mt', () => ({
   MiniAuthService: vi.fn().mockImplementation(() => ({
     decryptPhoneNumber: vi.fn().mockImplementation(async (encryptedData: string, iv: string, sessionKey: string) => {
       // 模拟解密过程
@@ -33,7 +33,7 @@ setupIntegrationDatabaseHooksWithEntities([UserEntityMt, FileMt, RoleMt])
 describe('手机号解密API集成测试', () => {
   let client: ReturnType<typeof testClient<typeof authRoutes>>;
   let testToken: string;
-  let testUser: UserEntity;
+  let testUser: UserEntityMt;
   let getSessionKeySpy: any;
 
   beforeEach(async () => {
@@ -44,13 +44,14 @@ describe('手机号解密API集成测试', () => {
     const dataSource = await IntegrationTestDatabase.getDataSource();
 
     // 创建测试用户
-    const userRepository = dataSource.getRepository(UserEntity);
+    const userRepository = dataSource.getRepository(UserEntityMt);
     testUser = userRepository.create({
       username: `test_user_${Date.now()}`,
       password: 'test_password',
       nickname: '测试用户',
       phone: null, // 初始手机号为null
-      registrationSource: 'web'
+      registrationSource: 'web',
+      tenantId: 1 // 设置租户ID
     });
     await userRepository.save(testUser);
 
@@ -109,7 +110,7 @@ describe('手机号解密API集成测试', () => {
 
       // 验证数据库中的用户手机号已更新
       const dataSource = await IntegrationTestDatabase.getDataSource();
-      const userRepository = dataSource.getRepository(UserEntity);
+      const userRepository = dataSource.getRepository(UserEntityMt);
       const updatedUser = await userRepository.findOne({
         where: { id: testUser.id }
       });

+ 2 - 2
packages/auth-module-mt/tests/unit/mini-auth.service.test.ts

@@ -1,7 +1,7 @@
 import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
 import { DataSource } from 'typeorm';
-import { MiniAuthService } from '../../src/services';
-import { UserEntity } from '@d8d/user-module';
+import { MiniAuthService } from '../../src/services/index.mt';
+import { UserEntityMt } from '@d8d/user-module-mt';
 
 // Mock 依赖
 vi.mock('@d8d/shared-utils', async (importOriginal) => {

+ 1 - 1
packages/file-module-mt/src/index.ts

@@ -2,7 +2,7 @@
 export { FileMt } from './entities';
 
 // 导出服务
-export { FileService, MinioService } from './services';
+export { FileServiceMt, MinioService } from './services';
 
 // 导出Schema
 export * from './schemas';

+ 2 - 2
packages/file-module-mt/src/schemas/file.schema.mt.ts

@@ -1,5 +1,5 @@
 import { z } from '@hono/zod-openapi';
-import { UserSchema } from '@d8d/user-module-mt/schemas';
+import { UserSchemaMt } from '@d8d/user-module-mt/schemas';
 
 export const FileSchema = z.object({
   id: z.number().int().positive().openapi({
@@ -38,7 +38,7 @@ export const FileSchema = z.object({
     description: '上传用户ID',
     example: 1
   }),
-  uploadUser: UserSchema,
+  uploadUser: UserSchemaMt,
   uploadTime: z.coerce.date().openapi({
     description: '上传时间',
     example: '2023-01-15T10:30:00Z'

+ 2 - 2
packages/file-module-mt/tests/integration/file.routes.integration.test.ts

@@ -7,7 +7,7 @@ import {
 import {
   IntegrationTestAssertions
 } from '../utils/integration-test-utils';
-import fileRoutes from '../../src/routes';
+import fileRoutes from '../../src/routes/index.mt';
 import { FileMt } from '../../src/entities';
 import { UserEntityMt, RoleMt } from '@d8d/user-module-mt';
 import { TestDataFactory } from '../utils/integration-test-db';
@@ -856,7 +856,7 @@ describe('文件路由API集成测试 (使用hono/testing)', () => {
 
         // 调试输出
         console.debug(`租户2删除租户1文件响应状态: ${response.status}`);
-        if (response.status !== 200) {
+        if (response.status as number !== 200) {
           const responseData = await response.json();
           console.debug(`响应数据:`, responseData);
         }

+ 1 - 1
packages/shared-crud/src/services/generic-crud.service.ts

@@ -3,7 +3,7 @@ import { z } from '@hono/zod-openapi';
 import { DataPermissionOptions, validateDataPermissionOptions, PermissionError } from '../types/data-permission.types';
 
 export abstract class GenericCrudService<T extends ObjectLiteral> {
-  protected repository: Repository<T>;
+  public repository: Repository<T>;
   private userTrackingOptions?: UserTrackingOptions;
   private dataPermissionOptions?: DataPermissionOptions;
   private tenantOptions?: TenantOptions;

+ 12 - 12
packages/user-module-mt/package.json

@@ -3,32 +3,32 @@
   "version": "1.0.0",
   "type": "module",
   "description": "D8D Multi-Tenant User Management Module",
-  "main": "src/index.ts",
-  "types": "src/index.ts",
+  "main": "src/index.mt.ts",
+  "types": "src/index.mt.ts",
   "exports": {
     ".": {
-      "import": "./src/index.ts",
-      "require": "./src/index.ts"
+      "import": "./src/index.mt.ts",
+      "require": "./src/index.mt.ts"
     },
     "./entities": {
-      "import": "./src/entities/index.ts",
-      "require": "./src/entities/index.ts"
+      "import": "./src/entities/index.mt.ts",
+      "require": "./src/entities/index.mt.ts"
     },
     "./services": {
-      "import": "./src/services/index.ts",
-      "require": "./src/services/index.ts"
+      "import": "./src/services/index.mt.ts",
+      "require": "./src/services/index.mt.ts"
     },
     "./schemas": {
-      "import": "./src/schemas/index.ts",
-      "require": "./src/schemas/index.ts"
+      "import": "./src/schemas/index.mt.ts",
+      "require": "./src/schemas/index.mt.ts"
     },
     "./schemas/*": {
       "import": "./src/schemas/*",
       "require": "./src/schemas/*"
     },
     "./routes": {
-      "import": "./src/routes/index.ts",
-      "require": "./src/routes/index.ts"
+      "import": "./src/routes/index.mt.ts",
+      "require": "./src/routes/index.mt.ts"
     }
   },
   "scripts": {

+ 2 - 0
packages/user-module-mt/src/entities/index.mt.ts

@@ -0,0 +1,2 @@
+export { UserEntityMt } from './user.entity.mt';
+export { RoleMt } from './role.entity.mt';

+ 0 - 2
packages/user-module-mt/src/entities/index.ts

@@ -1,2 +0,0 @@
-export { UserEntityMt, UserMt } from './user.entity';
-export { RoleMt } from './role.entity';

+ 0 - 0
packages/user-module-mt/src/entities/role.entity.ts → packages/user-module-mt/src/entities/role.entity.mt.ts


+ 1 - 2
packages/user-module-mt/src/entities/user.entity.ts → packages/user-module-mt/src/entities/user.entity.mt.ts

@@ -1,5 +1,5 @@
 import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
-import { RoleMt } from './role.entity';
+import { RoleMt } from './role.entity.mt';
 import { DeleteStatus, DisabledStatus } from '@d8d/shared-types';
 import { FileMt } from '@d8d/file-module-mt';
 
@@ -66,4 +66,3 @@ export class UserEntityMt {
   }
 }
 
-export { UserEntityMt as UserMt };

+ 11 - 0
packages/user-module-mt/src/index.mt.ts

@@ -0,0 +1,11 @@
+// 导出实体
+export * from './entities/index.mt';
+
+// 导出服务
+export * from './services/index.mt';
+
+// 导出 Schema
+export * from './schemas/index.mt';
+
+// 导出路由
+export * from './routes/index.mt';

+ 0 - 11
packages/user-module-mt/src/index.ts

@@ -1,11 +0,0 @@
-// 导出实体
-export * from './entities';
-
-// 导出服务
-export * from './services';
-
-// 导出 Schema
-export * from './schemas';
-
-// 导出路由
-export * from './routes';

+ 0 - 187
packages/user-module-mt/src/routes/custom.routes.ts

@@ -1,187 +0,0 @@
-import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
-import { z } from '@hono/zod-openapi';
-import { UserService } from '../services/user.service';
-import { AppDataSource, ErrorSchema } from '@d8d/shared-utils';
-import { CreateUserDto, UpdateUserDto, UserSchema } from '../schemas/user.schema';
-import { parseWithAwait } from '@d8d/shared-utils';
-import { authMiddleware } from '@d8d/auth-module';
-import { AuthContext } from '@d8d/shared-types';
-
-// 创建用户路由 - 自定义业务逻辑(密码加密等)
-const createUserRoute = createRoute({
-  method: 'post',
-  path: '/',
-  middleware: [authMiddleware],
-  request: {
-    body: {
-      content: {
-        'application/json': { schema: CreateUserDto }
-      }
-    }
-  },
-  responses: {
-    201: {
-      description: '用户创建成功',
-      content: {
-        'application/json': { schema: UserSchema }
-      }
-    },
-    400: {
-      description: '参数错误',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    401: {
-      description: '认证失败',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    500: {
-      description: '创建用户失败',
-      content: { 'application/json': { schema: ErrorSchema } }
-    }
-  }
-});
-
-// 更新用户路由 - 自定义业务逻辑
-const updateUserRoute = createRoute({
-  method: 'put',
-  path: '/{id}',
-  middleware: [authMiddleware],
-  request: {
-    params: z.object({
-      id: z.coerce.number().openapi({
-        param: { name: 'id', in: 'path' },
-        example: 1,
-        description: '用户ID'
-      })
-    }),
-    body: {
-      content: {
-        'application/json': { schema: UpdateUserDto }
-      }
-    }
-  },
-  responses: {
-    200: {
-      description: '用户更新成功',
-      content: {
-        'application/json': { schema: UserSchema }
-      }
-    },
-    400: {
-      description: '参数错误',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    401: {
-      description: '认证失败',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    404: {
-      description: '用户不存在',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    500: {
-      description: '更新用户失败',
-      content: { 'application/json': { schema: ErrorSchema } }
-    }
-  }
-});
-
-// 删除用户路由 - 自定义业务逻辑
-const deleteUserRoute = createRoute({
-  method: 'delete',
-  path: '/{id}',
-  middleware: [authMiddleware],
-  request: {
-    params: z.object({
-      id: z.coerce.number().openapi({
-        param: { name: 'id', in: 'path' },
-        example: 1,
-        description: '用户ID'
-      })
-    })
-  },
-  responses: {
-    204: { description: '用户删除成功' },
-    401: {
-      description: '认证失败',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    404: {
-      description: '用户不存在',
-      content: { 'application/json': { schema: ErrorSchema } }
-    },
-    500: {
-      description: '删除用户失败',
-      content: { 'application/json': { schema: ErrorSchema } }
-    }
-  }
-});
-
-const app = new OpenAPIHono<AuthContext>()
-  .openapi(createUserRoute, async (c) => {
-    try {
-      const data = c.req.valid('json');
-      const userService = new UserService(AppDataSource);
-      const result = await userService.createUser(data);
-
-      return c.json(await parseWithAwait(UserSchema, result), 201);
-    } catch (error) {
-      if (error instanceof z.ZodError) {
-        return c.json({
-          code: 400,
-          message: '参数错误',
-          errors: error.issues
-        }, 400);
-      }
-      return c.json({
-        code: 500,
-        message: error instanceof Error ? error.message : '创建用户失败'
-      }, 500);
-    }
-  })
-  .openapi(updateUserRoute, async (c) => {
-    try {
-      const { id } = c.req.valid('param');
-      const data = c.req.valid('json');
-      const userService = new UserService(AppDataSource);
-      const result = await userService.updateUser(id, data);
-
-      if (!result) {
-        return c.json({ code: 404, message: '资源不存在' }, 404);
-      }
-
-      return c.json(await parseWithAwait(UserSchema, result), 200);
-    } catch (error) {
-      if (error instanceof z.ZodError) {
-        return c.json({
-          code: 400,
-          message: '参数错误',
-          errors: error.issues
-        }, 400);
-      }
-      return c.json({
-        code: 500,
-        message: error instanceof Error ? error.message : '更新用户失败'
-      }, 500);
-    }
-  })
-  .openapi(deleteUserRoute, async (c) => {
-    try {
-      const { id } = c.req.valid('param');
-      const userService = new UserService(AppDataSource);
-      const success = await userService.deleteUser(id);
-
-      if (!success) {
-        return c.json({ code: 404, message: '资源不存在' }, 404);
-      }
-
-      return c.body(null, 204);
-    } catch (error) {
-      return c.json({
-        code: 500,
-        message: error instanceof Error ? error.message : '删除用户失败'
-      }, 500);
-    }
-  });
-
-export default app;

+ 2 - 0
packages/user-module-mt/src/routes/index.mt.ts

@@ -0,0 +1,2 @@
+export { default as userRoutesMt } from './user.routes.mt';
+export { default as roleRoutesMt } from './role.routes.mt';

+ 0 - 4
packages/user-module-mt/src/routes/index.ts

@@ -1,4 +0,0 @@
-export { default as userRoutes } from './user.routes';
-export { default as roleRoutes } from './role.routes';
-export { default as userRoutesMt } from './user.routes.mt';
-export { default as roleRoutesMt } from './role.routes.mt';

+ 1 - 1
packages/user-module-mt/src/routes/role.routes.mt.ts

@@ -1,5 +1,5 @@
 import { createCrudRoutes } from '@d8d/shared-crud';
-import { RoleMt } from '../entities/role.entity';
+import { RoleMt } from '../entities/role.entity.mt';
 import { RoleSchemaMt, CreateRoleDtoMt, UpdateRoleDtoMt } from '../schemas/role.schema.mt';
 import { OpenAPIHono } from '@hono/zod-openapi';
 import { authMiddleware } from '@d8d/auth-module-mt';

+ 0 - 26
packages/user-module-mt/src/routes/role.routes.ts

@@ -1,26 +0,0 @@
-import { createCrudRoutes } from '@d8d/shared-crud';
-import { Role } from '../entities/role.entity';
-import { RoleSchema, CreateRoleDto, UpdateRoleDto } from '../schemas/role.schema';
-import { OpenAPIHono } from '@hono/zod-openapi';
-import { authMiddleware } from '@d8d/auth-module';
-
-// 创建角色CRUD路由
-const roleRoutes = createCrudRoutes({
-  entity: Role,
-  createSchema: CreateRoleDto,
-  updateSchema: UpdateRoleDto,
-  getSchema: RoleSchema,
-  listSchema: RoleSchema,
-  searchFields: ['name', 'description'],
-  middleware: [
-    authMiddleware,
-    // permissionMiddleware(checkPermission(['role:manage']))
-  ]
-})
-
-const app = new OpenAPIHono()
-  .route('/', roleRoutes)
-
-// .route('/', customRoute)
-
-export default app;

+ 1 - 1
packages/user-module-mt/src/routes/user.routes.mt.ts

@@ -1,6 +1,6 @@
 import { OpenAPIHono } from '@hono/zod-openapi';
 import { createCrudRoutes } from '@d8d/shared-crud';
-import { UserEntityMt } from '../entities/user.entity';
+import { UserEntityMt } from '../entities/user.entity.mt';
 import { UserSchemaMt, CreateUserDtoMt, UpdateUserDtoMt } from '../schemas/user.schema.mt';
 import customRoutesMt from './custom.routes.mt';
 import { authMiddleware } from '@d8d/auth-module-mt';

+ 0 - 26
packages/user-module-mt/src/routes/user.routes.ts

@@ -1,26 +0,0 @@
-import { OpenAPIHono } from '@hono/zod-openapi';
-import { createCrudRoutes } from '@d8d/shared-crud';
-import { UserEntity } from '../entities/user.entity';
-import { UserSchema, CreateUserDto, UpdateUserDto } from '../schemas/user.schema';
-import customRoutes from './custom.routes';
-import { authMiddleware } from '@d8d/auth-module';
-
-// 创建通用CRUD路由配置
-const userCrudRoutes = createCrudRoutes({
-  entity: UserEntity,
-  createSchema: CreateUserDto,
-  updateSchema: UpdateUserDto,
-  getSchema: UserSchema,
-  listSchema: UserSchema,
-  searchFields: ['username', 'nickname', 'phone', 'email'],
-  relations: ['roles', 'avatarFile'],
-  middleware: [authMiddleware],
-  readOnly: true // 创建/更新/删除使用自定义路由
-});
-
-// 创建混合路由应用
-const app = new OpenAPIHono()
-  .route('/', customRoutes)   // 自定义业务路由(创建/更新/删除)
-  .route('/', userCrudRoutes); // 通用CRUD路由(列表查询和获取详情)
-
-export default app;

+ 2 - 0
packages/user-module-mt/src/schemas/index.mt.ts

@@ -0,0 +1,2 @@
+export * from './user.schema.mt';
+export * from './role.schema.mt';

+ 0 - 4
packages/user-module-mt/src/schemas/index.ts

@@ -1,4 +0,0 @@
-export * from './user.schema';
-export * from './role.schema';
-export * from './user.schema.mt';
-export * from './role.schema.mt';

+ 0 - 28
packages/user-module-mt/src/schemas/role.schema.ts

@@ -1,28 +0,0 @@
-import { z } from '@hono/zod-openapi';
-
-// 定义 Permission 类型
-export type Permission = string;
-
-export const RoleSchema = z.object({
-  id: z.number().int().positive().openapi({
-    description: '角色ID',
-    example: 1
-  }),
-  name: z.string().max(50).openapi({
-    description: '角色名称,唯一标识',
-    example: 'admin'
-  }),
-  description: z.string().max(500).nullable().openapi({
-    description: '角色描述',
-    example: '系统管理员角色'
-  }),
-  permissions: z.array(z.string()).min(1).openapi({
-    description: '角色权限列表',
-    example: ['user:create', 'user:delete']
-  }),
-  createdAt: z.date().openapi({ description: '创建时间' }),
-  updatedAt: z.date().openapi({ description: '更新时间' })
-});
-
-export const CreateRoleDto = RoleSchema.omit({ id: true , createdAt: true, updatedAt: true });
-export const UpdateRoleDto = RoleSchema.partial();

+ 0 - 180
packages/user-module-mt/src/schemas/user.schema.ts

@@ -1,180 +0,0 @@
-import { z } from '@hono/zod-openapi';
-import { DeleteStatus, DisabledStatus } from '@d8d/shared-types';
-import { RoleSchema } from './role.schema';
-
-// 基础用户 schema(包含所有字段)
-export const UserSchema = z.object({
-  id: z.number().int().positive().openapi({ description: '用户ID' }),
-  username: z.string().min(3, '用户名至少3个字符').max(255, '用户名最多255个字符').openapi({
-    example: 'admin',
-    description: '用户名,3-255个字符'
-  }),
-  password: z.string().min(6, '密码至少6位').max(255, '密码最多255位').openapi({
-    example: 'password123',
-    description: '密码,最少6位'
-  }),
-  phone: z.string().max(255, '手机号最多255个字符').nullable().openapi({
-    example: '13800138000',
-    description: '手机号'
-  }),
-  email: z.email('请输入正确的邮箱格式').max(255, '邮箱最多255个字符').nullable().openapi({
-    example: 'user@example.com',
-    description: '邮箱'
-  }),
-  nickname: z.string().max(255, '昵称最多255个字符').nullable().openapi({
-    example: '昵称',
-    description: '用户昵称'
-  }),
-  name: z.string().max(255, '姓名最多255个字符').nullable().openapi({
-    example: '张三',
-    description: '真实姓名'
-  }),
-  avatarFileId: z.number().int().positive().nullable().openapi({
-    example: 1,
-    description: '头像文件ID'
-  }),
-  avatarFile: z.object({
-    id: z.number().int().positive().openapi({ description: '文件ID' }),
-    name: z.string().max(255).openapi({ description: '文件名', example: 'avatar.jpg' }),
-    fullUrl: z.string().openapi({ description: '文件完整URL', example: 'https://example.com/avatar.jpg' }),
-    type: z.string().nullable().openapi({ description: '文件类型', example: 'image/jpeg' }),
-    size: z.number().nullable().openapi({ description: '文件大小(字节)', example: 102400 })
-  }).nullable().optional().openapi({
-    description: '头像文件信息'
-  }),
-  openid: z.string().max(255).nullable().optional().openapi({
-    example: 'oABCDEFGH123456789',
-    description: '微信小程序openid'
-  }),
-  unionid: z.string().max(255).nullable().optional().openapi({
-    example: 'unionid123456789',
-    description: '微信unionid'
-  }),
-  registrationSource: z.string().max(20).default('web').openapi({
-    example: 'miniapp',
-    description: '注册来源: web, miniapp'
-  }),
-  isDisabled: z.nativeEnum(DisabledStatus).default(DisabledStatus.ENABLED).openapi({
-    example: DisabledStatus.ENABLED,
-    description: '是否禁用(0:启用,1:禁用)'
-  }),
-  isDeleted: z.number().int().min(0).max(1).default(DeleteStatus.NOT_DELETED).openapi({
-    example: DeleteStatus.NOT_DELETED,
-    description: '是否删除(0:未删除,1:已删除)'
-  }),
-  roles: z.array(RoleSchema).optional().openapi({
-    example: [
-      {
-        id: 1,
-        name: 'admin',
-        description: '管理员',
-        permissions: ['user:create'],
-        createdAt: new Date(),
-        updatedAt: new Date()
-      }
-    ],
-    description: '用户角色列表'
-  }),
-  createdAt: z.coerce.date().openapi({ description: '创建时间' }),
-  updatedAt: z.coerce.date().openapi({ description: '更新时间' })
-});
-
-// 创建用户请求 schema
-export const CreateUserDto = z.object({
-  username: z.string().min(3, '用户名至少3个字符').max(255, '用户名最多255个字符').openapi({
-    example: 'admin',
-    description: '用户名,3-255个字符'
-  }),
-  password: z.string().min(6, '密码至少6位').max(255, '密码最多255位').openapi({
-    example: 'password123',
-    description: '密码,最少6位'
-  }),
-  phone: z.string().max(255, '手机号最多255个字符').nullable().optional().openapi({
-    example: '13800138000',
-    description: '手机号'
-  }),
-  email: z.email('请输入正确的邮箱格式').max(255, '邮箱最多255个字符').nullable().optional().openapi({
-    example: 'user@example.com',
-    description: '邮箱'
-  }),
-  nickname: z.string().max(255, '昵称最多255个字符').nullable().optional().openapi({
-    example: '昵称',
-    description: '用户昵称'
-  }),
-  name: z.string().max(255, '姓名最多255个字符').nullable().optional().openapi({
-    example: '张三',
-    description: '真实姓名'
-  }),
-  avatarFileId: z.number().int().positive().nullable().optional().openapi({
-    example: 1,
-    description: '头像文件ID'
-  }),
-  isDisabled: z.number().int().min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').default(DisabledStatus.ENABLED).optional().openapi({
-    example: DisabledStatus.ENABLED,
-    description: '是否禁用(0:启用,1:禁用)'
-  })
-});
-
-// 更新用户请求 schema
-export const UpdateUserDto = z.object({
-  username: z.string().min(3, '用户名至少3个字符').max(255, '用户名最多255个字符').optional().openapi({
-    example: 'admin',
-    description: '用户名,3-255个字符'
-  }),
-  password: z.string().min(6, '密码至少6位').max(255, '密码最多255位').optional().openapi({
-    example: 'password123',
-    description: '密码,最少6位'
-  }),
-  phone: z.string().max(255, '手机号最多255个字符').nullable().optional().openapi({
-    example: '13800138000',
-    description: '手机号'
-  }),
-  email: z.email('请输入正确的邮箱格式').max(255, '邮箱最多255个字符').nullable().optional().openapi({
-    example: 'user@example.com',
-    description: '邮箱'
-  }),
-  nickname: z.string().max(255, '昵称最多255个字符').nullable().optional().openapi({
-    example: '昵称',
-    description: '用户昵称'
-  }),
-  name: z.string().max(255, '姓名最多255个字符').nullable().optional().openapi({
-    example: '张三',
-    description: '真实姓名'
-  }),
-  avatarFileId: z.number().int().positive().nullable().optional().openapi({
-    example: 1,
-    description: '头像文件ID'
-  }),
-  isDisabled: z.number().int().min(0, '状态值只能是0或1').max(1, '状态值只能是0或1').optional().openapi({
-    example: DisabledStatus.ENABLED,
-    description: '是否禁用(0:启用,1:禁用)'
-  })
-});
-
-// 用户列表响应 schema
-export const UserListResponse = z.object({
-  data: z.array(UserSchema.omit({ password: true })),
-  pagination: z.object({
-    total: z.number().openapi({
-      example: 100,
-      description: '总记录数'
-    }),
-    current: z.number().openapi({
-      example: 1,
-      description: '当前页码'
-    }),
-    pageSize: z.number().openapi({
-      example: 10,
-      description: '每页数量'
-    })
-  })
-});
-
-// 单个用户查询响应 schema
-export const UserResponseSchema = UserSchema.omit({password:true})
-
-// 类型导出
-export type User = z.infer<typeof UserSchema>;
-export type CreateUserRequest = z.infer<typeof CreateUserDto>;
-export type UpdateUserRequest = z.infer<typeof UpdateUserDto>;
-export type UserListResponseType = z.infer<typeof UserListResponse>;

+ 2 - 0
packages/user-module-mt/src/services/index.mt.ts

@@ -0,0 +1,2 @@
+export { UserServiceMt } from './user.service.mt';
+export { RoleServiceMt } from './role.service.mt';

+ 0 - 4
packages/user-module-mt/src/services/index.ts

@@ -1,4 +0,0 @@
-export { UserService } from './user.service';
-export { RoleService } from './role.service';
-export { UserServiceMt } from './user.service.mt';
-export { RoleServiceMt } from './role.service.mt';

+ 1 - 1
packages/user-module-mt/src/services/role.service.mt.ts

@@ -1,5 +1,5 @@
 import { DataSource } from 'typeorm';
-import { RoleMt } from '../entities/role.entity';
+import { RoleMt } from '../entities/role.entity.mt';
 import { ConcreteCrudService } from '@d8d/shared-crud';
 
 export class RoleServiceMt extends ConcreteCrudService<RoleMt> {

+ 0 - 20
packages/user-module-mt/src/services/role.service.ts

@@ -1,20 +0,0 @@
-import { DataSource } from 'typeorm';
-import { Role } from '../entities/role.entity';
-import { GenericCrudService } from '@d8d/shared-crud';
-
-export class RoleService extends GenericCrudService<Role> {
-  constructor(dataSource: DataSource) {
-    super(dataSource, Role);
-  }
-
-  // 可以添加角色特有的业务逻辑方法
-  async getRoleByName(name: string): Promise<Role | null> {
-    return this.repository.findOneBy({ name });
-  }
-
-  async hasPermission(roleId: number, permission: string): Promise<boolean> {
-    const role = await this.getById(roleId);
-    if (!role) return false;
-    return role.permissions.includes(permission);
-  }
-}

+ 1 - 1
packages/user-module-mt/src/services/user.service.mt.ts

@@ -1,5 +1,5 @@
 import { DataSource } from 'typeorm';
-import { UserEntityMt } from '../entities/user.entity';
+import { UserEntityMt } from '../entities/user.entity.mt';
 import { RoleServiceMt } from './role.service.mt';
 import { ConcreteCrudService } from '@d8d/shared-crud';
 import * as bcrypt from 'bcrypt';

+ 0 - 137
packages/user-module-mt/src/services/user.service.ts

@@ -1,137 +0,0 @@
-import { DataSource } from 'typeorm';
-import { UserEntity as User } from '../entities/user.entity';
-import * as bcrypt from 'bcrypt';
-import { Repository } from 'typeorm';
-import { Role } from '../entities/role.entity';
-
-const SALT_ROUNDS = 10;
-
-export class UserService {
-  private userRepository: Repository<User>;
-  private roleRepository: Repository<Role>;
-  private readonly dataSource: DataSource;
-
-  constructor(dataSource: DataSource) {
-    this.dataSource = dataSource;
-    this.userRepository = this.dataSource.getRepository(User);
-    this.roleRepository = this.dataSource.getRepository(Role);
-  }
-
-  async createUser(userData: Partial<User>): Promise<User> {
-    try {
-      if (userData.password) {
-        userData.password = await bcrypt.hash(userData.password, SALT_ROUNDS);
-      }
-      const user = this.userRepository.create(userData);
-      return await this.userRepository.save(user);
-    } catch (error) {
-      console.error('Error creating user:', error);
-      throw new Error(`Failed to create user: ${error instanceof Error ? error.message : String(error)}`)
-    }
-  }
-
-  async getUserById(id: number): Promise<User | null> {
-    try {
-      return await this.userRepository.findOne({
-        where: { id },
-        relations: ['roles', 'avatarFile']
-      });
-    } catch (error) {
-      console.error('Error getting user:', error);
-      throw new Error('Failed to get user');
-    }
-  }
-
-  async getUserByUsername(username: string): Promise<User | null> {
-    try {
-      return await this.userRepository.findOne({
-        where: { username },
-        relations: ['roles', 'avatarFile']
-      });
-    } catch (error) {
-      console.error('Error getting user:', error);
-      throw new Error('Failed to get user');
-    }
-  }
-
-  async getUserByPhone(phone: string): Promise<User | null> {
-    try {
-      return await this.userRepository.findOne({
-        where: { phone: phone },
-        relations: ['roles', 'avatarFile']
-      });
-    } catch (error) {
-      console.error('Error getting user by phone:', error);
-      throw new Error('Failed to get user by phone');
-    }
-  }
-
-  async updateUser(id: number, updateData: Partial<User>): Promise<User | null> {
-    try {
-      if (updateData.password) {
-        updateData.password = await bcrypt.hash(updateData.password, SALT_ROUNDS);
-      }
-      await this.userRepository.update(id, updateData);
-      return this.getUserById(id);
-    } catch (error) {
-      console.error('Error updating user:', error);
-      throw new Error('Failed to update user');
-    }
-  }
-
-  async deleteUser(id: number): Promise<boolean> {
-    try {
-      const result = await this.userRepository.delete(id);
-      return result.affected !== null && result.affected !== undefined &&  result.affected > 0;
-    } catch (error) {
-      console.error('Error deleting user:', error);
-      throw new Error('Failed to delete user');
-    }
-  }
-
-  async verifyPassword(user: User, password: string): Promise<boolean> {
-    return password === user.password || bcrypt.compare(password, user.password)
-  }
-
-  async assignRoles(userId: number, roleIds: number[]): Promise<User | null> {
-    try {
-      const user = await this.getUserById(userId);
-      if (!user) return null;
-
-      const roles = await this.roleRepository.findByIds(roleIds);
-      user.roles = roles;
-      return await this.userRepository.save(user);
-    } catch (error) {
-      console.error('Error assigning roles:', error);
-      throw new Error('Failed to assign roles');
-    }
-  }
-
-  async getUsers(): Promise<User[]> {
-    try {
-      const users = await this.userRepository.find({
-        relations: ['roles', 'avatarFile']
-      });
-      return users;
-    } catch (error) {
-      console.error('Error getting users:', error);
-      throw new Error(`Failed to get users: ${error instanceof Error ? error.message : String(error)}`)
-    }
-  }
-
-  getUserRepository(): Repository<User> {
-    return this.userRepository;
-  }
-
-  async getUserByAccount(account: string): Promise<User | null> {
-    try {
-      return await this.userRepository.findOne({
-        where: [{ username: account }, { email: account }],
-        relations: ['roles', 'avatarFile']
-      });
-    } catch (error) {
-      console.error('Error getting user by account:', error);
-      throw new Error('Failed to get user by account');
-    }
-  }
-}

+ 1 - 1
packages/user-module-mt/tests/entities/test-user.entity.ts

@@ -1,5 +1,5 @@
 import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable, CreateDateColumn, UpdateDateColumn } from 'typeorm';
-import { RoleMt } from '../../src/entities/role.entity';
+import { RoleMt } from '../../src/entities/role.entity.mt';
 import { DeleteStatus, DisabledStatus } from '@d8d/shared-types';
 
 @Entity({ name: 'users_mt' })

+ 1 - 1
packages/user-module-mt/tests/integration/role.integration.test.ts

@@ -1,7 +1,7 @@
 import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest';
 import { DataSource } from 'typeorm';
 import { RoleServiceMt } from '../../src/services/role.service.mt';
-import { RoleMt } from '../../src/entities/role.entity';
+import { RoleMt } from '../../src/entities/role.entity.mt';
 import { AppDataSource, initializeDataSource } from '@d8d/shared-utils';
 
 // 确保测试环境变量被设置

+ 3 - 3
packages/user-module-mt/tests/integration/user.routes.integration.test.ts

@@ -7,9 +7,9 @@ import {
 import {
   IntegrationTestAssertions
 } from '../utils/integration-test-utils';
-import { userRoutesMt } from '../../src/routes';
-import { UserEntityMt } from '../../src/entities/user.entity';
-import { RoleMt } from '../../src/entities/role.entity';
+import { userRoutesMt } from '../../src/routes/index.mt';
+import { UserEntityMt } from '../../src/entities/user.entity.mt';
+import { RoleMt } from '../../src/entities/role.entity.mt';
 import { TestDataFactory } from '../utils/integration-test-db';
 import { AuthService } from '@d8d/auth-module-mt';
 import { UserServiceMt } from '../../src/services/user.service.mt';

+ 2 - 2
packages/user-module-mt/tests/utils/integration-test-db.ts

@@ -1,6 +1,6 @@
 import { DataSource } from 'typeorm';
-import { UserEntityMt } from '../../src/entities/user.entity';
-import { RoleMt } from '../../src/entities/role.entity';
+import { UserEntityMt } from '../../src/entities/user.entity.mt';
+import { RoleMt } from '../../src/entities/role.entity.mt';
 
 /**
  * 测试数据工厂类

+ 1 - 1
packages/user-module-mt/tests/utils/integration-test-utils.ts

@@ -1,5 +1,5 @@
 import { IntegrationTestDatabase } from '@d8d/shared-test-util';
-import { UserEntityMt } from '../../src/entities/user.entity';
+import { UserEntityMt } from '../../src/entities/user.entity.mt';
 
 /**
  * 集成测试断言工具