Midwayjs 之 编写baseEntity和baseService以及思考
介绍
基于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;
}
然后,用户实体继承基础实体,如下图:
注意:在配置数据库连接时,有一个属性【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类,如下图:
注意:这里有个细节,就是实体对象的声明,必须与基类一致。也就是实体对象名称必须为【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