从零实现一套低代码(保姆级教程)【后端服务】 --- 【21】实现数据库的动态建表等接口

news2025/1/10 22:46:31

摘要

在前面的两篇文章,我们主要是通过Upload组件和Image组件,真正的做到了设计器和后端服务之间的数据传递。

有了这个例子,应该比较清楚,对于低代码项目的服务端,它主要做的是一个抽象的数据存储

因为正常做开发,后端主要是对某个字段的数据进行存储,例如姓名,年龄等。但是对于低代码的后端,它的存储没有具体到某个字段,也没有具体的数量,它是和设计器里面的字段进行关系映射。

当然,这是后话,目前我们能做的,就是说如何在我们的项目里面,可以创建数据库的表,例如我创建一张学生表,创建一张教师表。用于后面我们拖拽页面的时候,作为数据存储的地方(当然具体怎么用,我们后面再说)。

当下,我们需要把数据库的动态操作给做出来。我们需要完成的事情有:

  1. 添加数据库表
  2. 获取全部数据库表
  3. 删除数据库表

这里因为数据库的操作可能比较频繁,所以建议读者下载一个可视化操作数据库的软件。我这里使用的是Studio 3T Free for MongoDB。

在这里插入图片描述

1.实现创建实体的接口

首先,我们在src下新增和数据库表相关的模块:

在这里插入图片描述

现在我们想一下,我们创建的数据库表应该在哪里,其实我们就可以放在localData这个数据库里面,但是因为我们之前这里有存放页面信息的数据库,所以localData数据库中的全量表,并非全都是通过这个模块创建的。

所以我们需要有一张表来记录,我们通过可视化建表的方式,创建的数据库表有哪些。

在这里插入图片描述

OK,现在我们可以实现创建数据库表的接口了,创建表我们需要做两件事情:

  1. 创建一张新的数据库表
  2. 将数据库表的ID放在Data-Base表中

创建一张数据库表需要的数据结构是什么样子的呢?

我们需要数据库表的名字,数据库表的编码,数据库表的Schema

为了后面方便叙述,我们统称数据库表为实体

数据库表的Schema:代表的是这个表需要什么字段,比如一张学生表需要学生姓名,学生学号,学生年级等。学生姓名是String类型,学生年龄是Number类型。而用来描述学生表信息的,就是学生表的Schema。

所以我们在dto.ts, sechema.tsinterface.ts中,可以写出创建实体需要的数据结构了:

export class createEntity {
  readonly entityName: string
  readonly entityCode: string
  readonly entitySchema: Object
}

xin-builder-server2\src\data-base\data-base.interface.ts

export interface Entity extends Document {
  readonly entityName: string
  readonly entityCode: string
  readonly entitySchema: Object
}

xin-builder-server2\src\data-base\data-base.schema.ts

import { Schema } from 'mongoose';
 
export const EntitySchema = new Schema({
  entityName: { type: String, required: true },
  entityCode: { type: String, required: true },
  entitySchema: {type: Object, required: true}
});

有了数据结构之后,我们开始编写创建实体的方法,来到service中:
xin-builder-server2\src\data-base\data-base.service.ts

import { Injectable } from "@nestjs/common";
import { InjectModel } from "@nestjs/mongoose";
import mongoose, { Model,Schema } from 'mongoose'
import {createEntity} from './data-base.dto'
import { Entity } from "./data-base.interface";
import { EntityInfo } from "./data-base.dto";

const DBRootModule = mongoose.createConnection('mongodb://127.0.0.1/localData');

@Injectable()
export class EntityService {
  constructor(@InjectModel('Entity') private readonly EntityModule:Model<Entity>){}

  async addEntity(body: createEntity): Promise<void> {
    const DBRootModule = mongoose.createConnection('mongodb://127.0.0.1/localData');
    await this.EntityModule.create(body)
    DBRootModule.model(body.entityCode,new Schema(body.entitySchema),body.entityCode);
  }
}

await this.EntityModule.create(body): 在entities表中,加入当前新建实体的信息。

DBRootModule.model(body.entityCode,new Schema(body.entitySchema),body.entityCode):
就是创建一张新的数据库表。


来到controller中:
xin-builder-server2\src\data-base\data-base.controller.ts

import { Body, Controller, Post } from "@nestjs/common";
import {EntityService} from './data-base.service'
import { createEntity, EntityInfo } from "./data-base.dto";
import { ApiTags, ApiOperation } from '@nestjs/swagger'

@Controller('entity')
@ApiTags('实体管理')
export class EntityController {
  constructor(private readonly EntityService: EntityService){}

  @Post('addEntity')
  @ApiOperation({summary: '创建实体'})
  async addEntity(@Body() createEntity: createEntity){
    return {
      code: 200,
      data: await this.EntityService.addEntity(createEntity),
      message: 'Success.'
    };
  }
}


最后来到module中:
xin-builder-server2\src\data-base\data-base.module.ts

import { Module } from "@nestjs/common";
import { EntityController } from "./data-base.controller";
import { EntityService } from "./data-base.service";
import { MongooseModule } from '@nestjs/mongoose';
import { EntitySchema } from "./data-base.schema";

const EntitySchemaTable = MongooseModule.forFeature([{ name: 'Entity', schema: EntitySchema }]);

@Module({
  imports: [EntitySchemaTable],
  controllers: [EntityController],
  providers: [EntityService]
})
export class EntityModal {}

这样我们创建实体的接口就完成了。

2.实现删除实体和获取实体列表的接口

来到service中,我们写一下获取实体列表和删除实体的方法:
删除接口也需要做两件事:

  1. 删除entities中的对应信息
  2. 删除对应的数据库表
  async getEntityList(): Promise<Entity []> {
    const entityList = await this.EntityModule.find();
    return entityList
  }

  async delEntityItem(body: EntityInfo): Promise<void> {
    if(!body.entityCode){
      return;
    }
    await this.EntityModule.deleteOne({entityCode: body.entityCode});
    DBRootModule.dropCollection(body.entityCode)
  }

在来到controller中,我们实现一下这两个方法的调用:

  @Post('getEntityList')
  @ApiOperation({summary: '获取实体列表'})
  async getEntityList(){
    return {
      code: 200,
      data: await this.EntityService.getEntityList(),
      message: 'Sucess'
    }
  }

  @Post('delEntityItem')
  @ApiOperation({summary: '删除实体'})
  async delEntityItem(@Body() EntityInfo: EntityInfo){
    return {
      code: 200,
      data: await this.EntityService.delEntityItem(EntityInfo),
      message: 'Sucess'
    }
  }

最终我们可以在Swagger文档进行测试一下:

在这里插入图片描述
这里,我们就实现了数据库表的添加,查询,和删除了。

相关的代码提交在github上:
https://github.com/TeacherXin/XinBuilderServer2
commit: fix: 第四节:实现添加,查询,删除实体的接口

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat运维

目录 一、Tomcat简介 二、系统环境说明 1、关闭防火墙&#xff0c;selinux 2、安装JDK 3、安装Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍&#xff08;conf&#xff09; 4、Tomcat的管理 四、Tomcat 配置管理页面(了解) …

分享 7 个最佳短信恢复应用程序,帮助恢复已删除短信

对于 Android 用户来说&#xff0c;丢失重要短信可能是一种令人沮丧的经历。幸运的是&#xff0c;有许多短信恢复应用程序可以帮助恢复丢失或删除的短信。在本文中&#xff0c;我们将与您分享 7 个最佳短信恢复应用程序&#xff0c;并帮助您找到可用于恢复已删除消息的最佳应用…

新能源+储能新模式 新创新

新型储能技术的兴起主要原因是&#xff1a;187.210.98.782 能源需求增长&#xff1a;随着全球人口和经济的增长&#xff0c;对能源的需求量也在不断上升&#xff0c;传统的化石燃料资源日益减少&#xff0c;因此需要开发新型的可再生能源和储能技术。 环境保护要求&#xff1a…

2024年生物技术与医学科学国际学术研讨会(ISBAMS 2024)

2024年生物技术与医学科学国际学术研讨会&#xff08;ISBAMS 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.isbams.com会议地址&#xff1a;上海召开日期&#xff1a;2024/2/20截稿日期&#xff1a;2024/2/10 &#xff08;先投稿&#xff0c;先审核&#xff0c;先…

股票交易维度和概念

股票&#xff1a;股份公司为筹集资金而发行给各个股东作为持股凭证并借以取得股息和红利的一种有价证券 好处&#xff1a;分红、送股配股、交易收益、本金少、易变现、避免货币贬值 金融标的投资风险与收益 股票分类 蓝筹股 经营业绩长期稳定增长的大公司&#xff0c;一般是…

数据分析 - python 数据处理

数据处理 去除重复数据 # 删除重复值 保留重复行 第一行的数据 data.drop_duplicates(inplaceTrue, keepfirst)数据格式转化 日期格式化 data[order_date] pd.to_datetime(data[order_dt], format%Y%m%d)data[销售时间] pd.to_datetime(data[销售时间]) # 交货时间 销售…

Apache Shiro 安全框架

前言 Apache Shiro 是一个强大且容易使用的Java安全矿建&#xff0c;执行身份验证&#xff0c;授权&#xff0c;密码和会话管理。使用Shiro的易于理解的API您可以快速轻松的获得任何应用程序直到大的项目。 一丶什么是Shiro 1.Shiro是什么 Apache Shiro是一个强大且易于使用…

RabbitMQ简单模式和工作模式

RabbitMQ 是一个消息队列中间件&#xff0c;用于在分布式系统中进行消息传递。在 RabbitMQ 中&#xff0c;有几种工作模式&#xff0c;其中简单模式和工作模式是其中两种基本的模式之一。 简单模式&#xff08;Simple Mode&#xff09;&#xff1a; 在简单模式中&#xff0c;有…

找不到d3dx9_43.dll怎么办?有什么方法能解决这个问题

d3dx9_43.dll 是一个与 Microsoft DirectX 9.0c 版本相关的动态链接库&#xff08;DLL&#xff09;文件。DirectX 是由微软开发的一个应用程序接口&#xff08;API&#xff09;&#xff0c;用于处理多媒体相关任务&#xff0c;尤其是在游戏和高性能图形应用中。具体到 d3dx9_43…

我的隐私计算学习——联邦学习(5)

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具&#xff0c;经由自己阅读后整理而成。 &#xff08;七&#xff09;联邦迁移学习 ​ 相关研究表明&#xff0c;联邦迁移学习不需要主服务器作为各参与方间的协调者&#xff0c;旨在让模型具备举一反三能力&#xff0c;在…

C++ 11 多线程库初步学习

在C11标准中&#xff0c;可以简单通过使用thread库&#xff0c;来管理多线程。 thread库可以看做对不同平台多线程API的一层包装&#xff1b;因此使用新标准提供的线程库编写的程序是跨平台的。 使用时需要#include <thread>头文件&#xff1b; #include <iostream&g…

【SpringCloud Nacos】 微服务治理介绍及Nacos引入初体验

文章目录 前言服务治理介绍什么是服务治理1、服务发现2、服务配置3、服务健康检测 常见的注册中心ZookeeperEurekaConsulNacos Nacos 简介Nacos 实战入门搭建nacos环境1、安装nacos2、配置nacos3、访问nacos 将商品微服务注册到 nacos1、在 pom. xml 中添加 nacos 的依赖2、在主…

Pycharm2023.3.2使用conda创建工程

1 conda环境 举个例子&#xff0c;创建一个环境&#xff0c;名叫Pytorch&#xff0c;使用的python版本是3.7 &#xff08;1&#xff09;创建环境 conda create -n Pytorch python3.7&#xff08;2&#xff09;激活环境 conda activate Pytorch&#xff08;3&#xff09;查看…

小型商用机器人,如何做到小而强?

兼顾体型和性能。 体型和性能的矛盾 一直以来&#xff0c;商用清洁机器人的应用场景主要集中在大型商场、超市、写字楼等&#xff0c;为什么1000平米以下的小型商超等中小场景却很少涉足&#xff1f;原因可以说有很多&#xff0c;但核心为两方面&#xff0c;一方面&#xff0…

windows?linux?如何使用JMeter

windows?linux?如何使用JMeter 安装JMeter的步骤以GUI模式启动JMeter如何在非GUI模式下运行JMeter在linux中使用JMeter 安装JMeter的步骤 JMeter 是一个纯 Java应用程序&#xff0c;应该在任何具有兼容Java实现的系统上正确运行。 安装 JMeter 的步骤 步骤1&#xff09;安…

网络安全防御保护实验(一)

目录 一、规划ip地址 二、配ip地址 三、交换机和防火墙的配置 四、进行测试 实验要求&#xff1a;防火墙向下使用子接口连接生产区和办公区&#xff0c;所有分区设备可以ping通网关。 一、规划ip地址 二、配ip地址 三、交换机和防火墙的配置 四、进行测试

IP被封怎么办?访问网站时IP被阻止?解决IP禁令全方法

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

Android开发修炼之路——(一)Android App开发基础-1

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

scoped属性和深度选择器

在Vue单文件组件&#xff08;SFC&#xff09;中&#xff0c;为了防止样式全局污染&#xff0c;可以给 所有的scoped的css编译出来都会变成.class[哈希值]的形式 我们只能修改带data-v-0dca3a9a作用域的样式&#xff0c;像是 如果修改el-table的宽度 .el-table {width: 60…

惠友小课堂】拇外翻常见的几个误区,来看看你中了几个?

拇外翻作为常见的足部畸形&#xff0c;在日常生活中困扰着许多人。歪脚趾不仅外观不好看&#xff0c;还会出现疼痛、影响行走运动。但大多数人对于拇外翻的认识都不足常常落入认知误区&#xff0c;快来看看你中了几个&#xff1f; 误区一 Q 我都没穿过高跟鞋&#xff0c;怎么也…