前言

每次开发一个后端利用,基本上都要编写一个admin后盾来治理(CRUD)各种资源,在Python生态中,Django和Flask框架都有对应的admin包,通过简略设置就能够领有一个CRUD的admin后盾。我也始终在寻找相似性能的NPM包,终于找到了AdminBro。因为目前AdminBro官网上的NestJS+AdminBro文档写得不是很清晰,所以写下这篇文章,记录下如何在NestJS利用中应用AdminBro

以下代码演示环境为:

  • 数据库:MongoDB 4.4.3
  • 操作系统: Windows10
  • 开发工具: VSCode
  • 技术栈: NodeJS 10.20.1 + NestJS 7.2.4 + AdminBro 3.4.0 + Mongoose 5.12.3

装置

npm i admin-bro @admin-bro/nestjs @admin-bro/mongoosenpm i express @admin-bro/express express-formidablenpm i express-session

配置

// comment.schema.tsimport { Prop, Schema, SchemaFactory } from "@nestjs/mongoose";import { Document } from "mongoose";@Schema()export class Comment extends Document {  @Prop({    default: Date.now,  })  created_at: Date;  @Prop()  user_id: string;  @Prop()  content: string;  @Prop()  liked_num: number;  @Prop()  client_name: string;  @Prop()  connect_key: string;}export const CommentSchema = SchemaFactory.createForClass(Comment);
// app.module.tsimport { Module } from '@nestjs/common';import AdminBro from 'admin-bro';import { AppController } from './app.controller';import { AppService } from './app.service';import { Database, Resource } from '@admin-bro/mongoose';import { Model } from 'mongoose';import { getModelToken, MongooseModule } from '@nestjs/mongoose';import { AdminModule } from '@admin-bro/nestjs';import { Comment, CommentSchema } from '../comment/comment.schema';AdminBro.registerAdapter({ Database, Resource });@Module({  imports: [    MongooseModule.forRoot('mongodb://127.0.0.1/comment'),    AdminModule.createAdminAsync({      useFactory: (commentModel: Model<Comment>) => {        return {          auth: {            authenticate: async () => {              // 认证逻辑              return Promise.resolve({ email: 'test' }            }),            cookieName: 'admin_panel',            cookiePassword: 'xxx2arfa',          },          adminBroOptions: {            rootPath: '/admin',            resources: [commentModel],          },        };      },      inject: [getModelToken(Comment.name)],      imports: [        MongooseModule.forFeature([          { name: Comment.name, schema: CommentSchema },        ]),      ],    }),  ],  controllers: [AppController],  providers: [AppService],})export class AppModule {}

成果

演示代码

https://github.com/demo-box/adminbro-nestjs-demo