koa 实现一个翻页查询

2023-01-12 16:28:16 浏览数 (1)


「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」

今天的分享是基于我封装的框架开发的。 我的框架地址:https://gitee.com/yang-yiming1234/koa

操作数据库需要用到 sequelize

创建model

user_detail.model.js

代码语言:javascript复制
// 数据类型
const { DataTypes } = require('sequelize')
const seq = require('../db/seq')

// 创建模型   UserDetail是表名
const UserDetail = seq.define('UserDetail', {
    user_id:{
        // 整形数据类型
        type: DataTypes.INTEGER,
        // 是否允许为空
        allowNull: false,
        // 默认值
        defaultValue: 0,
        // 备注
        comment: '用户编号',
        // 是否唯一
        unique: true,
    },
    phone:{
        //字符串类型
        type: DataTypes.STRING,
        allowNull: true,
        comment: '手机号'
    },
    job:{
        type: DataTypes.STRING,
        allowNull: true,
        comment: '职业'
    },
    tag:{
        type: DataTypes.STRING,
        allowNull: true,
        comment: '标签'
    },
    signature:{
        type: DataTypes.STRING,
        allowNull: true,
        comment: '座右铭'
    },
    email:{
        type: DataTypes.STRING,
        allowNull: true,
        comment: '邮箱'
    }

})
// force如果之前存在这张表 会删了重建 文档:模型重建  用过后要注释掉
// node src/model/user.model.js 创建数据库表
// UserDetail.sync({ force: true })

module.exports = UserDetail

UserDetail.sync({ force: true })注释放开。执行命令node src/model/user_detail.model.js创建数据库表。创建完后,再进行注释。否则会将表删除再建新表。其实 UserDetail.sync({ force: true })就相当于 执行了删除表语句,再执行创建表语句。

创建成功的话,在数据库中可以看到生成了相应的表。

router路由

manage.route.js

代码语言:javascript复制
// 引入包
const Router = require('koa-router')
// 引入controller我们下面写
const { getUserManage } = require('../controller/manage.controller')
// 访问这个文件下的接口,都需要加一个前缀 /manage
const router = new Router({prefix:'/manage'})
// 我们的接口,请求方式是get  我们访问接口路径   /manage/getUserManage
router.get('/getUserManage', getUserManage),
// 导出
module.exports = router

controller

manage.controller.js

  • 获取前端查询条件,如果没有查询条件,都给个默认值''
  • 调用相应的service,去获取数据。
  • 最后将数据返回
代码语言:javascript复制
// 引入service
const { usermanage } = require('../service/usermanage.service')
class ManageController {
    async getUserManage(ctx, next) {
        // 1.获取数据
        const { username = '', is_admin = '', createdAt = '', updatedAt = '', currentPage = 1, pageSize = 10 } = ctx.request.query
        console.log(username, is_admin, createdAt, updatedAt, currentPage, pageSize)
        // 2.操作数据库
        try {
            // 调用service层最好加try catch
            const res = await usermanage({ username, is_admin, createdAt, updatedAt, currentPage, pageSize })
            res.currentPage = currentPage
            res.pageSize = pageSize
            // 3.返回给客户端
            ctx.body = {
                code: 1000,
                data: res
            }
        } catch (err) {
            console.log(err)
            ctx.app.emit('error', userRegisterError, ctx)
        }

    }
}

// 导出实例化的对象
module.exports = new ManageController()

service

usermanage.service.js

  • 整个文件是一个类,而每个service的方法是一个函数。
  • 定义一个对象用于存储查询条件
  • 如果查询条件存在将查询条件插入where对象中。[Op.like] 是模糊查询

分页

findAndCountAll是对应的分页方法。 count, rows分别是数据条数和具体的数据。

limit y offset x 分句表示: 跳过 x 条数据,读取 y 条数据

offset: (currentPage - 1) * pageSize,

limit: Number(pageSize),

代码语言:javascript复制
const User = require('../model/user.model')
const { Op } = require("sequelize");
class UserManageService {
    // 查询所有用户
    async usermanage({ username, is_admin, createdAt, updatedAt, currentPage, pageSize }) {
        const where = {};
        username && (where['username'] = {
            [Op.like]: username
        })
        is_admin && (where['is_admin'] = {
            [Op.eq]: is_admin
        })
        createdAt && (where['createdAt'] = {
            [Op.like]: createdAt
        })
        updatedAt && (where['updatedAt'] = {
            [Op.like]: createdAt
        })
        const { count, rows } = await User.findAndCountAll({
            where,
            offset: (currentPage - 1) * pageSize,
            limit: Number(pageSize),
        });
        return rows ? { rows, count } : { error: 500 }
    }
   
}
// 导出后 在控制器controller中使用
module.exports = new UserManageService()

测试

最后在没有前端的时候,我们可以在postman中进行测试。

0 人点赞