likes
comments
collection
share

Midwayjs 之 编写baseEntity和baseService以及思考

作者站长头像
站长
· 阅读数 25

介绍

基于model生成service和controller

根据组件TypeORM,快速生成相关实体后,以user实体为样本,配置相关的baseEntity以及service、controller。

编写baseEntity

大多数的实体中都存在通用的字段,包含id、createTime、updateTime、operatorId。所以创建通用实体如下:

import {
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
  Column,
} from 'typeorm';

export class BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @CreateDateColumn({ comment: '创建时间', type: 'timestamp' })
  createTime: Date;

  @UpdateDateColumn({ comment: '更新时间', type: 'timestamp' })
  updateTime: Date;

  @Column('varchar', {
    name: 'operatorId',
    nullable: true,
    comment: '操作人账号',
    length: 45,
  })
  operatorId: string;
}

然后,用户实体继承基础实体,如下图:

Midwayjs 之 编写baseEntity和baseService以及思考

注意:在配置数据库连接时,有一个属性【synchronize: true】,如果为true,则在运行程序后,程序会根据当前配置的实体,反向在数据库中生成user表。

service的编写

单表操作,一般包含:新增、删除、修改、查询、列表几个通用接口。为此可以生成一个通用的基类:如下代码:

import { Provide } from '@midwayjs/core';
import { Repository } from 'typeorm';
import { BaseEntity } from '../entity/BaseEntity';

@Provide()
export class BaseService<T extends BaseEntity> {
  public entity: Repository<T>;
  add(query) {
    return this.entity.save(query);
  }
  update(query) {
    return this.entity.update(query.id, query);
  }
  delete(ids: number | string | string[]) {
    return this.entity.delete(ids);
  }
  info(data) {
    return this.entity.findOne({ where: data });
  }
  async page(data, where = {}) {
    const { page = 1, size = 10 } = data;
    const [list, total] = await this.entity.findAndCount({
      where: where,
      take: size,
      skip: (page - 1) * size,
    });
    return { list, pagination: { total, size, page } };
  }
  list(data?) {
    return this.entity.find({ where: data } as any);
  }
}

有了上述的这个基类后,可以为user单独在创建一个service类,如下图:

Midwayjs 之 编写baseEntity和baseService以及思考

注意:这里有个细节,就是实体对象的声明,必须与基类一致。也就是实体对象名称必须为【entity】的Repository对象。不然无法实现父对象的重写,则会抛出异常:【entity.findOne】等这些基础方法不存在的异常。

controller的编写

这里简单描述下,在控制器中使用service的逻辑,如下代码:

import { Inject, Controller, Get, Query, Body, Post } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';
import { UserService } from '../service/user.service';

@Controller('/user')
export class APIController {
  @Inject()
  ctx: Context;

  @Inject()
  userService: UserService;

  @Get('/get_user')
  async getUser(@Query('account') account) {
    const user = await this.userService.info({ account: account });
    return { success: true, message: 'OK', data: user };
  }

  @Post('/save')
  async saveUser(@Body() userInfo) {
    userInfo.operator_id = 'testUser';
    const user = await this.userService.add(userInfo);
    return { success: true, message: 'OK', data: user };
  }
}

思考和总结

思考

model是一键生成的,现在文章中提到,编写baseEntity,那么所有的model,都需要继承该基类。需要修改所有的model,难受啊。

这么难受,那么为啥还要这个实体基类呢?

对的,如果自动生成的频率很高的话,也不建议编写baseEntity。BaseService也可以直接编写成【BaseService <T>】的。

总结

到目前为止,简单的一个MVC的架子就已经搭建完成,运行程序,就能访问相关的接口。

转载自:https://juejin.cn/post/7376197082204766217
评论
请登录