《Nest系列 - 4. 听说人人都会CRUD,可是我还不会怎么办???-《4.2结合前端使用实现CRUD》

终于到了这一步,今天我们就将实现一个CRUD,主要是编写nest 部分,前端部分后面可以看git 代码
下面是效果演示(大部分是参考满哥实现,🤣🤣🤣)

在这里插入图片描述

前期准备

前端接口处理

import axios from 'axios'
axios.defaults.baseURL = 'http://127.0.0.1:3000' // 服务器地址,就是nest 项目的运行地址
// 添加用户
export const addUser = (data) => axios.post('/user', data).then(res => res.data)
// 获取列表:可以通过参数查询
export const getList = (data) => axios.get('/user', { params: data }).then(res => res.data)
// 根据id 删除用户
export const delUser = (data) => axios.delete(`/user/${data.id}`).then(res => res.data)
// 根据id 更新用户信息
export const updateUser = (data) => axios.patch(`/user/${data.id}`, data).then(res => res.data)

通过前端的接口请求,我们知道要访问/user 地址,那么对应的Nest的 controller 就知道怎么回事了,并且入参和出参 前端和后端都是 一一匹配的

Nest 处理

controller 层

import { Controller, Get, Post, Body, Patch, Param, Delete, Query, HttpCode } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';


@Controller('user') // 匹配user 路由
export class UserController {
  constructor(private readonly userService: UserService) {}
  /**
   * 新增用户数据
   * @param createUserDto 参数
   * @returns 
   */
  @Post()
  creates(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }
  /**
   * 获取列表数据
   * @param query 查询参数,
   * @param page 当前页码
   * @param pageSize 每页显示条数
   *  @param keyWord 关键字
   * @returns 
   */

  @Get()
  async findAll (@Query() query:{keyWord: string, page: number, pageSize: number}) {
    return  await this.userService.findAll(query);
  }
  
/**
 * 更新根据用户id,跟新数据
 * @param id  用户id
 * @param updateUserDto 参数
 * @returns 
 */
  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    return this.userService.update(+id, updateUserDto);
  }

  /**
   * 根据用户id 删除用户
   * @param id 用户id
   * @returns 
   */

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.userService.remove(+id);
  }
}

上面controller 层口就是接口地址匹配,怎么解析客户端传来的数据,然后将解析出来的参数,传递给server层做具体的数据库操作

server层

// 使用InjectRepository装饰器并引入Repository即可使用typeorm的操作
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user.entity';
import { Like, Repository } from 'typeorm';

@Injectable()
export class UserService {
   constructor(@InjectRepository(User)private readonly usersRepository: Repository<User>,) { }
   /**
    * 
    * @param createUserDto 入参
    * @returns  创建用户
    */
   create(createUserDto: CreateUserDto) {
    const data = new User()
    data.name = createUserDto.name
    data.age = createUserDto.age
    return this.usersRepository.save(data)

  }
  /**
   * 
   * @param query  查询参数
   * @returns  查询用户
   */
   async findAll(query:{keyWord: string, page: number, pageSize: number }) {
   // Like 用于模糊查询
    const data =  await this.usersRepository.find({
      where: {
        name: Like(`%${query.keyWord}%`)
      },
      order: {
        id: "DESC"
      },
      skip: (query.page - 1)* query.pageSize,
      take: query.pageSize,
    })
    const total = await this.usersRepository.count({
      where: {
        name: Like(`%${query.keyWord}%`)
      },
    })

    return {
      data,
      total
    }

  }

  /**
   * 
   * @param id 用户id
   * @param updateUserDto  入参
   * @returns   更新用户信息
   */
  update(id: number, updateUserDto: UpdateUserDto) {
    return this.usersRepository.update(id, updateUserDto)
  }
/**
 * 
 * @param id 用户id
 * @returns  删除用户
 */

  remove(id: number) {
    return this.usersRepository.delete(id)
  }
}

server 层就是 接收controller 传递来的参数,然后利用InjectRepository 和 Repository 来操作相应的CRUD的方式即可

比如

新增数据: 直接调用 save(),

查找数据: 直接调用 find()

更新数据: 直接调用 update()

删除数据: 直接调用 delete()

是不是感觉so easy

image.png

跨域处理

这个就是服务端容许那个地址,方法来访问,这里就是容许的前端的访问地址


// 启用 CORS
  app.enableCors({
    origin: 'http://localhost:3000', // 允许访问的来源,前端项目的访问地址
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS', // 允许的 HTTP 方法
    credentials: true, // 允许发送凭据(如 Cookie 等)
  });

项目地址

  • Vue 前端地址:
    https://gitee.com/Big_Cat-AK-47/vue-project

  • nest 后端地址:https://gitee.com/Big_Cat-AK-47/nest

总结

  • 服务端在controller 层定义好路由信息(接口地址),在server 层做逻辑处理,将数据返回给客户端
  • 前端根据路由匹配后端地址,通过网络请求库做数据请求
  • 前端传递参数,后端接收参数,通过装饰器解析,解析出参数,再传递给server 层做逻辑处理
  • server 层 通过typeOrm 库做数据库的增删改查,主要就是savefindupdatedelete
  • 如果想做一些数据库的查询,可以利用一些关键字来实现where Like等,详细更多可以查看官网https://typeorm.bootcss.com/working-with-entity-manager

Nest 系列 往期文章

1. 《Nest系列 - 1. 🔥运行一个Nest项目以及整体目录学习》

2. 《Nest系列 - 2. 🔥Nest 代码生成器,让你告别base代码书写!!!》

3. 《 Nest系列 - 3. 🔥掌握常见Nest 装饰器,奠定坚实基础!!!!!!》

4. 《Nest系列 - 4. 🔥听说人人都会CRUD,可是我还不会怎么办???-《 4.1-数据库连接和实体》》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/745909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化学习专题:强化学习知识梳理(一)

2024/6/23&#xff1a; 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别&#xff08;在线 or 离线&#xff09; 首先&#xff0c;一切的开始是强化学习中时序差分方程&#xff0c;这体现了强化学习方法的优化策略。在…

仓库驱鸟设备,仓库专用集束强声驱鸟器

在仓库&#xff0c;鸟类活动可能带来一系列不便和隐患。例如鸟类的排泄物&#xff0c;不仅难以清理&#xff0c;而且其携带大量病菌&#xff0c;严重影响仓库的卫生环境。在鸟害频发的仓库区域&#xff0c;采取相应的驱鸟措施是非常必要的。 安装驱鸟设备&#xff0c;可以有效地…

HuatuoGPT2本地运行失败

transformer 版本不能太高 transformer<4.3.32 查看config.json文件 其实 https://huggingface.co/FreedomIntelligence/HuatuoGPT2-7B/blob/main/config.json

海南聚广众达电子商务咨询有限公司抖音电商服务专家

在当下这个数字化浪潮汹涌的时代&#xff0c;电子商务无疑是商业领域的一颗璀璨明星。而在这其中&#xff0c;抖音电商以其独特的魅力&#xff0c;吸引了无数目光。海南聚广众达电子商务咨询有限公司&#xff0c;作为抖音电商领域的佼佼者&#xff0c;以其敏锐的洞察力和卓越的…

Swift开发——简单App设计

App的界面设计需要具有大量的图像并花费大量的时间,这样的应用不方便学习和交流,这里重点介绍SwiftUI界面元素的用法,通过简单App设计过程的讲解,展示图形用户界面应用程序的设计方法。 01、简单App设计 按照9.1节工程MyCh0901的创建方法,创建一个新的工程MyCh0902,此时工…

C++STL 6大组件—你必知必会的编程利器

课程总目录 文章目录 一、vector容器二、deque和list容器三、vector、deque、list横向对比四、详解容器是配置stack、queue、priority_queue五、无序关联容器六、有序关联容器七、迭代器八、函数对象九、泛型算法和绑定器 一、vector容器 底层数据结构是动态开辟的数组&#x…

Python在Excel中设置数字格式和获取应用数字格式后的值

目录 安装Python Excel库 Python在Excel中设置数字格式 Python获取Excel中应用数字格式的单元格的显示值 总结 Excel 数字格式是用于控制单元格中数字显示方式的一组规则或代码。通过设置不同的数字格式&#xff0c;可以定义数字的显示方式&#xff0c;如小数位数、货币符号…

树形结构的勾选、取消勾选、删除、清空已选、回显、禁用

树形结构的勾选、取消勾选、删除、清空已选、回显、禁用 基本页面&#xff1a; 分为上传文件和编辑的页面 代码实现要点&#xff1a; 上传文件页面&#xff1a; 点开选择范围弹窗&#xff0c;三个radio单选框都为可选状态&#xff0c;默认显示的是第一个单选框&#xff08;按…

前端实战:实现块级元素的拖拽与缩放功能

在现代网页开发中&#xff0c;用户交互是一个非常重要的部分。在这篇文章中&#xff0c;我们将详细介绍如何使用原生 JavaScript 实现块级元素的拖拽与缩放功能。具体来说&#xff0c;我们将实现以下功能&#xff1a; 点击并拖动 outer 元素&#xff0c;可以移动整个块。点击并…

GPT-5的即将登场

人工智能领域正经历着一场前所未有的变革&#xff0c;而其中大语言模型的进步尤为瞩目。继GPT-4取得巨大成功后&#xff0c;OpenAI即将推出的GPT-5被寄予厚望。作为新一代大语言模型&#xff0c;GPT-5在各个方面都有望实现显著突破。本文将探讨GPT-5的潜在特性、应用前景以及其…

基于Flask开发的前后端交互项目(可用于期末大作业) MySQL数据库 文件上传 Spider爬虫 Echarts可视化展示 JS动态

项目描述&#xff1a; 开发一个基于Flask框架开发的前后端交互项目&#xff0c;项目内容为 东京奥运会 。对各个需要填写的字段做了数据验证&#xff0c;非法信息会被JS拦截提醒不合法&#xff1b;还对未登录就访问做了拦截&#xff0c;阻止未登录就访问。 前端&#xff1a;HT…

优思学院|精益生产3大特征、5个步骤、8大浪费、10大工具

前言 精益生产作为一种先进的生产管理理念&#xff0c;起源于丰田汽车公司的生产方式&#xff0c;其核心在于消除浪费、优化流程&#xff0c;以最少的投入获取最大的产出。本文将详细解析精益生产的三大特征、五个步骤、八大浪费和十大工具&#xff0c;帮助读者深入理解这一理…

含着“金钥匙”出生,“凤凰”重塑骨科未来!

凤凰&#xff0c;作为中华传统文化中的神鸟&#xff0c;象征着吉祥、和谐与重生。而Phoenix&#xff08;凤凰&#xff09;&#xff0c;这个名字本身就带有传奇色彩。 2024年6月20日-23日&#xff0c;由中国医师协会、中国医师协会骨科医师分会主办&#xff0c;江苏省医师协会骨…

【openmpi】怎样使用openmpi并行运行python脚本?

创作日志&#xff1a; 装过一次openmpi&#xff0c;但是半年之后就忘记怎么用了&#xff0c;所以记录一下 1. 测试openmpi是否安装好 cd /home/xxxx/SnapHiC_Call_Loop/openmpi-4.1.6/examples make mpirun -np 4 hello_c得到如下输出就说明是装好的了 2. 没有导入路径的话导…

智能护栏碰撞监测系统:强化道路安全的智能守卫

智能护栏碰撞监测系统是提升道路安全、加强交通管理智能化的重要技术手段&#xff0c;其为道路安全带来的好处和安装的必要性体现在以下几个方面&#xff1a; 1. 即时事故响应&#xff1a;系统能够实时监测到护栏遭受的碰撞事件&#xff0c;几乎瞬间触发报警机制&#xff0c;将…

服务器如何实现SSH免密码登录?

目录 一、服务器和电脑的区别二、什么是SSH三、什么是免密码登录四、服务器如何实现SSH免密码登录 一、服务器和电脑的区别 服务器和电脑是两种不同类型的计算机系统&#xff0c;它们在设计、功能和用途上存在明显的区别。首先&#xff0c;从硬件配置上看&#xff0c;服务器通…

408计算机网络--物理层

一、物理层概述 物理层是干嘛使得&#xff1f; 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务是确定与传输媒体接口有关的一些特性。定义标准可以理解为插排上的两孔三孔 机械特性&#xff1a;定义物理连接…

ONLYOFFICE8.1版本桌面编辑器的测评

首先我们先出示一下我们所测评官网的链接&#xff1a; ONLYOFFICE官网链接&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE 我们这款ONLYOFFICE8.1版本有这一下优点 1.解决PDF痛点 ONLYOFFICE在PDF编辑方面支持高亮显示、下划线和删除线、添加批注等功能&#…

vue3集成Echarts,自定义ToolBox时无法监听参数变化

问题描述 在vue中集成echart中自定义ToolBox工具的点击事件&#xff0c;并将里面的typeBar赋给data中的变量&#xff0c;随后用watch监听这个变量的变化&#xff0c;发现监听不到&#xff01;&#xff01;&#xff01;&#xff01; 解决方案&#xff1a;一直以为是watch不能监…

jenkins构建allure报java.io.IOException: Can‘t find allure commandline <null>

jenkins构建allure报错 java.io.IOException: Can’t find allure commandline 配置allure commandline&#xff0c;注意将地址放在bin上一层