【Nest教程】实现一个简单的用户增删改查功能

简介: 【Nest教程】实现一个简单的用户增删改查功能

前面几章我们讲了项目的初始,连接MySQL,这章我们主要实现增删改查接口,在src下新建user文件夹,我们的所有功能都写在这个文件夹下。

1 新建entity

项目开始配置连接数据库的时候,我们 synchronize 选择的事true,即使我们库里没有表,通过entity也可以自动生成表

import { Column, Entity, PrimaryGeneratedColumn, BaseEntity } from 'typeorm';
/**
 * 列选项参考
 * https://typeorm.biunav.com/zh/entities.html#%E5%88%97%E9%80%89%E9%A1%B9
 **/
@Entity()
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;
  @Column({ type: 'varchar', name: 'name', comment: '用户名' })
  name: string;
  @Column({ type: 'varchar', name: 'nickname', comment: '昵称' })
  nickname: string;
  @Column({ type: 'varchar', name: 'password', comment: '密码' })
  password: string;
  @Column({ type: 'varchar', length: 11, name: 'mobile', comment: '手机号' })
  mobile: string;
  @Column({ type: 'varchar', nullable: true, name: 'avatar', comment: '头像' })
  avatar: string;
  @Column({ type: 'varchar', default: '未知', name: 'gender', comment: '性别' })
  gender: string;
  @Column({
    type: 'varchar',
    default: '普通会员',
    name: 'user_level',
    comment: '用户级别',
  })
  userLevel: string;
  @Column({
    type: 'varchar',
    nullable: true,
    name: 'province',
    comment: '省份',
  })
  province: string;
  @Column({ type: 'varchar', nullable: true, name: 'city', comment: '城市' })
  city: string;
  @Column({ type: 'datetime', nullable: true, name: 'create_time' })
  createTime: number;
  @Column({ type: 'datetime', nullable: true, name: 'update_time' })
  updateTime: number;
}

复制

上面的内容定义的是表的字段及字段类型等


2 新建controller

这里定义了四个路由,全部为post请求方式

import { ApiTags, ApiParam, ApiQuery, ApiHeader } from '@nestjs/swagger';
import { Controller, Get, Post, Body, Logger } from '@nestjs/common';
import { UserService } from './user.service';
import { QueryUserDto } from './Dto/queryUser.dto';
import { AddUserDto } from './Dto/addUser.dto';
import { UpdateUserDto } from './Dto/updateUser.dto';
import { DeleteUserDto } from './Dto/deleteUser.dto';
/**
 *
 * @author lidonghui
 * @version 1
 * @date 2021/01/18 09:57
 */
@ApiTags('用户管理')
@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}
  /**
   * 用户管理-分页查询
   */
  @ApiQuery({
    name: 'name',
    description: '用户名',
  })
  @Post('/page')
  findAll(@Body() queryUserDto: QueryUserDto): Promise<{}> {
    Logger.log(`分页查询接收参数:${JSON.stringify(queryUserDto)}`);
    return this.userService.pageQuery(queryUserDto);
  }
  /**
   * 用户管理-增加用户
   */
  @Post('/add')
  addUser(@Body() addUserDto: AddUserDto): Promise<boolean> {
    Logger.log(`增加用户接收参数:${JSON.stringify(addUserDto)}`);
    return this.userService.save(addUserDto);
  }
  /**
   * 用户管理-编辑用户
   */
  @Post('/edit')
  updateUser(@Body() updateUserDto: UpdateUserDto): Promise<boolean> {
    Logger.log(`编辑用户接收参数:${JSON.stringify(updateUserDto)}`);
    return this.userService.save(updateUserDto);
  }
  /**
   * 用户管理-删除用户
   */
  @Post('/delete')
  deleteUser(@Body() deleteUserDto: DeleteUserDto): Promise<boolean> {
    Logger.log(`删除用户接收参数:${JSON.stringify(deleteUserDto)}`);
    return this.userService.delete(deleteUserDto);
  }
}

复制


3 新建service

这里主要的实现是对库的操作,这里面就包含了增删改查

import { Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private readonly UserRepository: Repository<User>,
  ) {}
  private readonly User: User[] = [];
  // 分页查询
  async pageQuery(parameter: any): Promise<any> {
    Logger.log(`请求参数:${JSON.stringify(parameter)}`);
    // 定义返回格式
    let result = {
      pageNo: Number(parameter.pageNo),
      pageSize: Number(parameter.pageSize),
      totalPage: 0,
      totalRows: 0,
      rows: [],
    };
    // 返回条数
    let SQLwhere: any = {};
    if (parameter.name != undefined) {
      SQLwhere.name = parameter.name;
    }
    result.rows = await this.UserRepository.find({
      where: SQLwhere,
      order: {
        id: 'DESC',
      },
      skip: (parameter.pageNo - 1) * Number(parameter.pageSize), // 分页,跳过几项
      take: parameter.pageSize, // 分页,取几项
      cache: true,
    });
    // 总条数
    result.totalRows = await this.UserRepository.count();
    // 总页数
    result.totalPage = Math.ceil(
      (await this.UserRepository.count()) / parameter.pageSize,
    );
    return result;
  }
  // 增加/更新
  async save(parameter: any): Promise<boolean> {
    Logger.log(`请求参数:${JSON.stringify(parameter)}`);
    try {
      let a = await this.UserRepository.save(parameter);
      return true;
    } catch (error) {
      Logger.log(`请求失败:${JSON.stringify(error)}`);
      return false;
    }
  }
  // 删除
  async delete(ids: any): Promise<boolean> {
    Logger.log(`请求参数:${JSON.stringify(ids)}`);
    try {
      let a = await this.UserRepository.delete(ids.id);
      Logger.log(`删除返回数据:${JSON.stringify(a)}`);
      if (a.affected == 0) {
        return false;
      } else {
        return true;
      }
    } catch (error) {
      return false;
    }
  }
}

复制


4 新建module

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService],
  controllers: [UserController],
})
export class UserModule {}

复制


5 新建Dto

Dto文件夹有四个文件,分别为addUser.dto.ts、deleteUser.dto.ts、queryUser.dto.ts和updateUser.dto.ts,这四个是查询及验证使用

1 addUser.dto.ts

import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty } from 'class-validator';
export class AddUserDto {
  @ApiProperty()
  @IsNotEmpty({ message: '用户名不为空' })
  readonly name: string;
  @ApiProperty()
  @IsNotEmpty({ message: '昵称不为空' })
  readonly nickname: string;
  @ApiProperty()
  @IsNotEmpty({ message: '密码不为空' })
  readonly password: string;
  @ApiProperty()
  @IsNotEmpty({ message: '手机号不为空' })
  readonly mobile: string;
  @ApiProperty()
  readonly avatar: string;
  @ApiProperty()
  readonly gender: string;
  @ApiProperty()
  readonly userLevel: string;
  @ApiProperty()
  readonly province: string;
  @ApiProperty()
  readonly city: string;
}

复制

2 deleteUser.dto.ts

import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsInt } from 'class-validator';
export class DeleteUserDto {
  @ApiProperty()
  @IsInt({ message: 'id应为数字' })
  @IsNotEmpty({ message: 'id不为空' })
  readonly id: number;
}

复制

3 queryUser.dto.ts

import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, Min, IsInt } from 'class-validator';
export class QueryUserDto {
  @ApiProperty()
  readonly name: string;
  @ApiProperty()
  @Min(1, { message: '分页不能小于1' })
  @IsInt({ message: '分页应为数字' })
  @IsNotEmpty({ message: '分页不能为空' })
  readonly pageNo: number;
  @ApiProperty()
  @Min(1, { message: '分页条数不能小于1' })
  @IsInt({ message: '分页条数应为数字' })
  @IsNotEmpty({ message: '分页条数不能为空' })
  readonly pageSize: number;
}

复制

4 updateUser.dto.ts

import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsInt } from 'class-validator';
export class UpdateUserDto {
  @ApiProperty()
  @IsInt({ message: 'id应为数字' })
  @IsNotEmpty({ message: 'id不为空' })
  readonly id: number;
  @ApiProperty()
  readonly name: string;
  @ApiProperty()
  readonly nickname: string;
  @ApiProperty()
  readonly password: string;
  @ApiProperty()
  readonly mobile: string;
  @ApiProperty()
  readonly avatar: string;
  @ApiProperty()
  readonly gender: string;
  @ApiProperty()
  readonly userLevel: string;
  @ApiProperty()
  readonly province: string;
  @ApiProperty()
  readonly city: string;
}

复制


6 运行项目

上面的是全部的配置,主要因为是此项目没有开源,所以代码全部复制,基本能运行。最后结果

image.png

目录
打赏
0
0
0
0
41
分享
相关文章
Unity连接Mysql数据库 增 删 改 查
在 Unity 中连接 MySQL 数据库,需使用 MySQL Connector/NET 作为数据库连接驱动,通过提供服务器地址、端口、用户名和密码等信息建立 TCP/IP 连接。代码示例展示了如何创建连接对象并执行增删改查操作,确保数据交互的实现。测试代码中,通过 `MySqlConnection` 类连接数据库,并使用 `MySqlCommand` 执行 SQL 语句,实现数据的查询、插入、删除和更新功能。
PolarDB开源数据库进阶课17 集成数据湖功能
本文介绍了如何在PolarDB数据库中接入pg_duckdb、pg_mooncake插件以支持数据湖功能, 可以读写对象存储的远程数据, 支持csv, parquet等格式, 支持delta等框架, 并显著提升OLAP性能。
22 0
让PolarDB更了解您--PolarDB云原生数据库核心功能体验馆
让PolarDB更了解您——PolarDB云原生数据库核心功能体验馆,由阿里云数据库产品事业部负责人宋震分享。内容涵盖PolarDB技术布局、开源进展及体验馆三大部分。技术布局包括云计算加速数据库演进、数据处理需求带来的变革、软硬协同优化等;开源部分介绍了兼容MySQL和PostgreSQL的两款产品;体验馆则通过实际操作让用户直观感受Serverless、无感切换、SQL2Map等功能。
121 7
PolarDB 开源基础教程系列 8 数据库生态
PolarDB是一款开源的云原生分布式数据库,源自阿里云商业产品。为降低使用门槛,PolarDB携手伙伴打造了完整的开源生态,涵盖操作系统、芯片、存储、集成管控、监控、审计、开发者工具、数据同步、超融合计算、ISV软件、开源插件、人才培养、社区合作及大型用户合作等领域。通过这些合作伙伴,PolarDB提供了丰富的功能和服务,支持多种硬件和软件环境,满足不同用户的需求。更多信息请访问[PolarDB开源官方网站](https://openpolardb.com/home)。
54 4
新手教程:数据库操作(使用PDO或MySQLi扩展)
本文为新手介绍如何使用PDO和MySQLi扩展连接与操作MySQL数据库。PDO更现代灵活,支持多种数据库,适合大多数应用;MySQLi提供面向过程和面向对象两种API,适合直接控制数据库操作。教程涵盖安装配置、创建连接、执行查询(查询、插入、更新、删除)及错误处理等内容。希望这篇教程能帮助你快速上手PHP中的数据库操作!
165 32
PolarDB开源数据库进阶课16 接入PostGIS全功能及应用举例
本文介绍了如何在PolarDB数据库中接入PostGIS插件全功能,实现地理空间数据处理。此外,文章还提供了使用PostGIS生成泰森多边形(Voronoi diagram)的具体示例,帮助用户理解其应用场景及操作方法。
27 0
时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级
TDengine 3.3.5.0 版本正式发布,带来多项更新与优化。新特性包括提升 MQTT 稳定性和高并发性能、新增 taosX 增量备份与恢复、支持 JDBC 和 Rust 连接器 STMT2 接口、灵活配置 Grafana Dashboard 等。性能优化涵盖查询内存管控、多级存储迁移、强密码策略等,全面提升时序数据管理的效率和可靠性。欢迎下载体验并提出宝贵意见。
52 5
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
127 13
南大通用GBase 8s数据库onbar基础使用教程
数据备份与恢复是确保数据安全和业务连续性的关键。onbar作为GBase 8s数据库的备份工具,需配合存储管理器使用,通过配置BAR_BSALIB_PATH等参数,实现数据的备份与恢复。本文详细介绍了onbar的配置、备份、恢复及监控流程,帮助数据库管理员构建高效的数据保护方案。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等