凯发k8天生赢家一触即发

vue2 koa2 typescript前后端框架教程-凯发k8天生赢家一触即发

2023-08-16,,

本篇开始分享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 -s
npm install mysql2 -s

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

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)

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中复杂查询进行详细分享,敬请期待。

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;

vue2 koa2 typescript前后端框架教程--05sequelize的使用(orm)的相关教程结束。

网站地图