koa2 mysql sequelize_Vue2+Koa2+Typescript前后端框架教程--05Sequelize(ORM)的使用实现基础的班级增删...
本篇开始分享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.首页模块化,支持显示.隐藏首页内容模块 2.颜色文字配置,支持自定义 3.幻灯片功能,支持链 ...
- 汽车4s店新车二手车租卖小程序源码系统 汽车行业通用版 含完整前后端+搭建教程
分享一个汽车行业通用版系统源码,汽车4s店新车二手车租卖小程序源码系统,含完整前后端+搭建教程. 系统支持新车二手车的汽车在线展示.在线预约.购车计算器.贷款计算器,门店介绍,新闻资讯,汽车详情介绍等 ...
- 如何在30分钟完成表格增删改查的前后端框架搭建
30分钟,你可以做什么? 可以风卷残云的饱餐一顿:可以简单地打扫一下房间:或者可以跳10十遍刘畊宏<本草纲目>毽子操. 而今天,本葡萄要带你在30分钟内完成一套拥有增删改查表格系统的前后端 ...
- Spring Boot+Ext JS准前后端框架应用的会话(Session)处理
文章目录 准前后端分离的Session机制 Session失效的场景 Session失效的解决 后端处理 前端处理 是否回调 主要代码示例片段 准前后端分离的Session机制 Spring Boot ...
- SpringBoot 和 Vue 前后端分离教程(附源码)
编辑:业余草 来源:https://www.xttblog.com/?p=4851 昨天,一位网友问我要 SpringBoot + Vue 的源码项目.其实网上有很多,我这里分享一个项目的简单教程,授 ...
- Spring Boot 和 Vue 前后端分离教程(附源码)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | 梁小生0101 juejin.im/post/5c622 ...
- 若依(RuoYi-Vue)+Flowable工作流前后端整合教程
此教程适合若依前后端分离项目,其他项目可以在扩展列表中进行查找. 近期公司里需要对很久以前的RuoYi-Vue前后端分离项目扩展出flowable的功能,当然这个重任也是落在了我的身上(不然也不会有这 ...
- 开源智能电子名片系统源码 含小程序完整前后端+搭建教程
分享一个开源版智能电子名片小程序系统源码,系统为平台版,基于微信,代码包含了完整前后端+数据库+搭建教程.一张名片打通6大系统:名片+商城+官网+AI雷达+CRM+客服. 系统特色功能一览: 1. ...
- 全新开源版知识付费系统源码 支持多终端合一 含完整前后端+搭建教程
分享一个全新的开源版知识付费系统源码,支持多终端合一管理,含微信小程序端.微信公众号端.H5端.PC端,含完整前后端.数据库代码包和搭建教程. 系统特色功能一览: 1.支持视频课程.音频课程.图文课程 ...
最新文章
- 数据库监视器(SQL Server Profilter)
- xp框架下载官方_斐讯路由器系列「K1-K2-K2P-K2T」-Breed刷入工具v1.1支持XP系统
- mysql创建存储函数报错:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL...
- linux主机解析虚拟机超时_Linux 内核超时导致虚拟机无法正常启动
- python画roc曲线_使用Python画ROC曲线以及AUC值
- java des加密解密_Java实现的DES加密解密工具类实例
- [转载] 【python】str与json类型转换
- 几组数据的相关性python_Python数据相关系数矩阵和热力图轻松实现(参数解释)...
- wps的range对象
- TB6612FNG电机驱动替代方案
- 对研发团队里技术分享的一些思考
- 字符串匹配——朴素算法Brute-Force(布鲁特-福斯算法)
- 斗音视频制作技巧和分享技巧
- 智能时代:大数据与人工智能
- java sequencer_UVM学习笔记--sequence和sequencer(转)
- flutter显示图标_flutter中密码输入如何切换隐藏/显示?
- Android仿抖音加载框之两颗小球转动控件
- TVS二极管、环流二极管、稳压(齐纳)二极管、肖特基二极管、开关二极管的分类说明
- 文儿结婚生子再被提起!利、文两家互喷,老利回怼:豆豆妈好!文儿暴怒:阴损至极!小洲专场欠礼之人!利、曼等人名利其中!
- Linux命令·rm
热门文章
- 从Spring-Session源码看Session机制的实现细节
- java语法结构是什么意思_java - 基础 - 语法结构
- windows 安装cython-bbox
- TensorRT5 yoloV3加速
- Can't get attribute '_rebuild_tensor_v2' on module 'torch._utils'
- win10 vs2015 编译caffe2
- python判断对象是否有属性
- numpy/arrayobject.h”: No such file or directory
- Windows10 右键 cmd
- 图像低频高频区域分离 小波变换