本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize。

上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是MySQL,通过Sequelize,实现简单的增删改查的API。

1. MySQL中创建数据库和班级表。

1.1 创建数据库demo_node

CREATE DATABASE `demo_node` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

1.2 创建班级表t_class

CREATE TABLE `demo_node`.`t_class` (

`id` VARCHAR(36) NOT NULL,

`class_name` VARCHAR(45) NULL,

`class_code` VARCHAR(20) NULL,

`head_teacher_id` VARCHAR(45) NULL,

PRIMARY KEY (`id`))

COMMENT = '班级表';

2. 安装Sequelize。

npm install sequelize -snpm install mysql2 -s

注:Sequelize连接哪种数据库就要安装对应数据库的驱动

https://zhuanlan.zhihu.com/p/342122373

https://zhuanlan.zhihu.com/p/342119434

3. src根目录下添加数据库配置文件:db_config.ts

import { Sequelize } from 'sequelize';const DbSequelize = new Sequelize({

host: "localhost",//本地:localhost,其他服务器使用ip地址

dialect: "mysql",//连接数据库类型

database: "demo_node",//数据库名称

username: "root",//数据库账户用户名

password: "123456",//数据库账户密码    define: {

timestamps: false,//是否开启时间戳createAt  deleteAt  updateAt

underscored: true,//下划线

freezeTableName: true, //禁止sequelize修改表名,默认会在表后边添加一个字母`s`表示复数

paranoid: true //开启假删除    },

pool: {

max: 10,

min: 0,

acquire: 30000,

idle: 10000

},

timezone: '+08:00',//时区设置,东八区});

export default DbSequelize;

4. 定义Model:在models文件夹中修改class.ts,定义班级模型。(上一篇使用的是sequelize-typescript,这里没有使用,所以模型定义有所区别,但是思路一致)

import { Sequelize, DataTypes } from "sequelize";

import DbSequelize from "../db_config";//班级模型export default DbSequelize.define('ClassModel', {

id: {

type: DataTypes.STRING,

primaryKey: true//设为主键    },

className: {

type: DataTypes.STRING

},

classCode: {

type: DataTypes.STRING

},

headTeacherId: {

type: DataTypes.STRING

},

}, {

tableName: 't_class'//定义对应数据库表名});

5. 定义Service,在services中修改class.ts:

import ClassModel from '../models/class';//班级管理服务export default class ClassService {    //获取所有班级

async findClassList() {        try {            return ClassModel.findAll({

attributes: ['id', 'className', 'classCode', 'headTeacherId']

});

}        catch (err) {            throw (err);

}

}    //获取单个班级

async findClassById(classId: string) {        try {            return ClassModel.findOne({

attributes: ['id', 'className', 'classCode', 'headTeacherId'],                where: { id: classId }

});

}        catch (err) {            throw (err);

}

}    //删除班级

async deleteClass(classId: string) {        try {            return await ClassModel.destroy({ where: { id: classId } });

}        catch (err) {            throw (err);

}

}    //修改班级

async editClass(classObj: any) {        try {            return await ClassModel.update(classObj, { where: { id: classObj.id }, individualHooks: true });

}        catch (err) {            throw (err);

}

}    //添加班级

async addClass(classObj: any) {        try {            return await ClassModel.create(classObj);

}        catch (err) {            throw (err);

}

}

}

6. 定义Controller,在controllers文件夹中修改班级控制器class.ts:

import ClassService from '../services/class';const clsService = new ClassService();//班级管理控制器export default class ClassController {    //查找所有班级

static async findClassList(ctx: any) {        try {            //调用查询列表服务,获取结果

let res = await clsService.findClassList();

ctx.body = {

status: 1,//返回码:1操作成功,0操作错误                data: {

classList: res

}

}

}        catch (err) {

ctx.throw(err.message);

}

}    //根据班级id获取班级详细信息

static async findClassById(ctx: any) {        try {

let id = ctx.request.query.id;            if (!id) {

ctx.body = {

status: 0

}                return;

}            //调用查询详情服务,获取结果

let res = await clsService.findClassById(id);

ctx.body = {

status: 1,

data: {                    class: res

}

}

}        catch (err) {

ctx.throw(err.message);

}

}    //删除班级

static async deleteClass(ctx: any) {        try {

let id: string = ctx.request.body.id;            //调用删除服务,获取结果

let res: any = await clsService.deleteClass(id);            if (res === 1) {

ctx.body = {

status: 1

}

}            else {

ctx.body = {

status: 0

}

}

}        catch (err) {

ctx.throw(err.message);

}

}    //修改班级

static async editClass(ctx: any) {        try {

let obj: any = ctx.request.body;            //调用修改服务,获取结果

let res: any = await clsService.editClass(obj);            if (res[0] !== 1) {

ctx.body = {

status: 0

}

}            else {

ctx.body = {

status: 1,

data: {

classId: res[1][0].id

}

}

}

}        catch (err) {

ctx.throw(err.message);

}

}    //添加班级

static async addClass(ctx: any) {        try {

let obj: any = ctx.request.body;            //调用添加服务,获取结果

let res: any = await clsService.addClass(obj);            if (!res) {

ctx.body = {

status: 0

}

}            else {

ctx.body = {

status: 1,

data: {

classId: res.id

}

}

}

}        catch (err) {

ctx.throw(err.message);

}

}

}

7. router如上篇一致,如下:

import KoaRouter from 'koa-router';

import ClassController from './controllers/class';const router = new KoaRouter();

router.post('/api/class/addClass', ClassController.addClass);

router.post('/api/class/editClass', ClassController.editClass);

router.post('/api/class/deleteClass', ClassController.deleteClass);

router.get('/api/class/findClassById', ClassController.findClassById);

router.get('/api/class/findClassList', ClassController.findClassList);

export default router;

8.开始测试:

8.1 安装koa-body: 由于添加修改删除定义为post方法,所以首先要安装koa-body,才能获取到post过来的数据(删除也可以使用get)

https://zhuanlan.zhihu.com/p/342431505

https://zhuanlan.zhihu.com/p/342430038

https://zhuanlan.zhihu.com/p/342431776

npm install koa-body -s

8.2 修改app.ts,添加koa-body中间件引用

const Koa = require('koa');

import KoaBody from "koa-body";const app = new Koa();

app.use(KoaBody({

multipart: true,

formidable: {

maxFileSize: 1000 * 1024 * 1024    // 设置上传文件大小最大限制,默认2M  },

formLimit: "10mb",

jsonLimit: "10mb",

textLimit: "10mb"}));//引入路由import router from './router';//添加中间件app.use(router.routes());

app.use(router.allowedMethods());

app.use(async (ctx: any) => {

ctx.body = 'Hello World...Hello LaoLv';

});

console.log('app server start on port 3000...')

app.listen(3000);

8.3 添加班级,使用postman,操作如下:

数据库表展示如下:

8.4 更新班级,操作如下:

数据库表展示如下:

8.5 查询班级,操作如下:

8.6 删除班级,操作如下:

数据库表展示如下:

9. 如上所示,使用sequelize简单实现三层模式对班级的增删改查。文件结构图如上篇一致:

这样,基础的增删改查数据流向基本完成。后面会对sequelize中复杂查询进行详细分享,敬请期待。

weibo.com/ttarticle/p/show?id=2309404590530032959630

koa2 mysql sequelize_Vue2+Koa2+Typescript前后端框架教程--05Sequelize(ORM)的使用实现基础的班级增删...相关推荐

  1. 装修行业通用版小程序源码 前后端+搭建教程

    分享一个装修行业的小程序源码,完整前后端+搭建教程,后台可视化操作,新增了一键初始化功能. 功能列表: 1.首页模块化,支持显示.隐藏首页内容模块 2.颜色文字配置,支持自定义 3.幻灯片功能,支持链 ...

  2. 汽车4s店新车二手车租卖小程序源码系统 汽车行业通用版 含完整前后端+搭建教程

    分享一个汽车行业通用版系统源码,汽车4s店新车二手车租卖小程序源码系统,含完整前后端+搭建教程. 系统支持新车二手车的汽车在线展示.在线预约.购车计算器.贷款计算器,门店介绍,新闻资讯,汽车详情介绍等 ...

  3. 如何在30分钟完成表格增删改查的前后端框架搭建

    30分钟,你可以做什么? 可以风卷残云的饱餐一顿:可以简单地打扫一下房间:或者可以跳10十遍刘畊宏<本草纲目>毽子操. 而今天,本葡萄要带你在30分钟内完成一套拥有增删改查表格系统的前后端 ...

  4. Spring Boot+Ext JS准前后端框架应用的会话(Session)处理

    文章目录 准前后端分离的Session机制 Session失效的场景 Session失效的解决 后端处理 前端处理 是否回调 主要代码示例片段 准前后端分离的Session机制 Spring Boot ...

  5. SpringBoot 和 Vue 前后端分离教程(附源码)

    编辑:业余草 来源:https://www.xttblog.com/?p=4851 昨天,一位网友问我要 SpringBoot + Vue 的源码项目.其实网上有很多,我这里分享一个项目的简单教程,授 ...

  6. Spring Boot 和 Vue 前后端分离教程(附源码)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | 梁小生0101 juejin.im/post/5c622 ...

  7. 若依(RuoYi-Vue)+Flowable工作流前后端整合教程

    此教程适合若依前后端分离项目,其他项目可以在扩展列表中进行查找. 近期公司里需要对很久以前的RuoYi-Vue前后端分离项目扩展出flowable的功能,当然这个重任也是落在了我的身上(不然也不会有这 ...

  8. 开源智能电子名片系统源码 含小程序完整前后端+搭建教程

    分享一个开源版智能电子名片小程序系统源码,系统为平台版,基于微信,代码包含了完整前后端+数据库+搭建教程.一张名片打通6大系统:名片+商城+官网+AI雷达+CRM+客服.   系统特色功能一览: 1. ...

  9. 全新开源版知识付费系统源码 支持多终端合一 含完整前后端+搭建教程

    分享一个全新的开源版知识付费系统源码,支持多终端合一管理,含微信小程序端.微信公众号端.H5端.PC端,含完整前后端.数据库代码包和搭建教程. 系统特色功能一览: 1.支持视频课程.音频课程.图文课程 ...

最新文章

  1. 数据库监视器(SQL Server Profilter)
  2. xp框架下载官方_斐讯路由器系列「K1-K2-K2P-K2T」-Breed刷入工具v1.1支持XP系统
  3. mysql创建存储函数报错:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL...
  4. linux主机解析虚拟机超时_Linux 内核超时导致虚拟机无法正常启动
  5. python画roc曲线_使用Python画ROC曲线以及AUC值
  6. java des加密解密_Java实现的DES加密解密工具类实例
  7. [转载] 【python】str与json类型转换
  8. 几组数据的相关性python_Python数据相关系数矩阵和热力图轻松实现(参数解释)...
  9. wps的range对象
  10. TB6612FNG电机驱动替代方案
  11. 对研发团队里技术分享的一些思考
  12. 字符串匹配——朴素算法Brute-Force(布鲁特-福斯算法)
  13. 斗音视频制作技巧和分享技巧
  14. 智能时代:大数据与人工智能
  15. java sequencer_UVM学习笔记--sequence和sequencer(转)
  16. flutter显示图标_flutter中密码输入如何切换隐藏/显示?
  17. Android仿抖音加载框之两颗小球转动控件
  18. TVS二极管、环流二极管、稳压(齐纳)二极管、肖特基二极管、开关二极管的分类说明
  19. 文儿结婚生子再被提起!利、文两家互喷,老利回怼:豆豆妈好!文儿暴怒:阴损至极!小洲专场欠礼之人!利、曼等人名利其中!
  20. Linux命令·rm

热门文章

  1. 从Spring-Session源码看Session机制的实现细节
  2. java语法结构是什么意思_java - 基础 - 语法结构
  3. windows 安装cython-bbox
  4. TensorRT5 yoloV3加速
  5. Can't get attribute '_rebuild_tensor_v2' on module 'torch._utils'
  6. win10 vs2015 编译caffe2
  7. python判断对象是否有属性
  8. numpy/arrayobject.h”: No such file or directory
  9. Windows10 右键 cmd
  10. 图像低频高频区域分离 小波变换