2
0

11-standard-crud.md 3.4 KB

标准通用CRUD开发流程规范

适用场景

适用于简单数据模型,无复杂业务逻辑,仅需基础CRUD操作的场景。采用GenericCrudServicecreateCrudRoutes快速生成接口。

开发流程

1. 创建实体

  • 位置: src/server/modules/[模块名]/[实体名].entity.ts
  • 参考已有实体文件如user.entity.ts
  • 注意: 必须包含Zod Schema定义

2. 注册实体到数据源

  • src/server/data-source.ts中添加实体导入和注册:

     // 实体类导入
     import { YourEntity } from "./modules/[模块名]/[实体名].entity"
         
     export const AppDataSource = new DataSource({
       // ...其他配置
       entities: [
         User, Role, YourEntity // 添加新实体到数组
       ],
       // ...其他配置
     });
    

3. 创建Service

  • 位置: src/server/modules/[模块名]/[实体名].service.ts
  • 继承GenericCrudService
  • 通过构造函数注入DataSource

    import { GenericCrudService } from '@/server/utils/generic-crud.service';
    import { DataSource } from 'typeorm';
    import { YourEntity } from './your-entity.entity';
       
    export class YourEntityService extends GenericCrudService<YourEntity> {
     constructor(dataSource: DataSource) {
       super(dataSource, YourEntity);
     }
    }
    

4. 创建API路由

  • 使用createCrudRoutes快速生成CRUD路由:

     import { createCrudRoutes } from '@/server/utils/generic-crud.routes';
     import { YourEntity } from '@/server/modules/your-module/your-entity.entity';
     import { YourEntitySchema, CreateYourEntityDto, UpdateYourEntityDto } from '@/server/modules/your-module/your-entity.entity';
     import { authMiddleware } from '@/server/middleware/auth.middleware';
         
     const yourEntityRoutes = createCrudRoutes({
       entity: YourEntity,
       createSchema: CreateYourEntityDto,
       updateSchema: UpdateYourEntityDto,
       getSchema: YourEntitySchema,
       listSchema: YourEntitySchema,
       searchFields: ['name', 'description'], // 可选,指定搜索字段
       middleware: [authMiddleware] // 可选,添加中间件
     });
         
     export default yourEntityRoutes;
    

5. 注册路由

  • src/server/api.ts中添加路由注册:

     import yourEntityRoutes from '@/server/api/your-entity/index';
         
     // 注册路由
     api.route('/api/v1/your-entities', yourEntityRoutes);
    

6. 创建客户端API

  • src/client/api.ts中添加客户端定义:

     import { hc } from 'hono/client';
     import { YourEntityRoutes } from '@/server/api';
         
     export const yourEntityClient = hc<YourEntityRoutes>('/api/v1', {
       fetch: axiosFetch,
     }).api.v1['your-entities'];
    

7. 前端调用

  • 在页面组件(如Users.tsx)中:

    • 使用InferResponseType提取响应类型
    • 使用InferRequestType提取请求类型
    • 示例:

      type EntityResponse = InferResponseType<typeof entityClient.$get, 200>;
      type CreateRequest = InferRequestType<typeof entityClient.$post>['json'];
      

8. 注册管理后台路由和菜单

- **注册路由**:在`src/client/admin/routes.tsx`中添加路由配置

- **注册菜单**:在`src/client/admin/menu.tsx`中添加菜单配置