FastAPI+Vue3零基础开发ERP系统项目实战课 20240831上课笔记 查询参数和分页实现

news2024/11/22 18:12:21

回顾

  • 获取路径参数
  • 什么是路径参数?/user/{id}
  • 什么时候使用?需要传递参数
  • 怎么实现类型转换?声明参数的类型
  • 怎么捕获文件路径?{file_path:path}

什么是查询参数

查询字符串是键值对的集合,这些键值对位于 URL 的 ? 之后,以 & 分隔。

http://127.0.0.1:8000/items/?skip=0&limit=10

上面的 skip=0&limit=10 就是查询参数,表示:

  • skip:0
  • limit:10

怎么定义查询参数

示例代码:

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

这段代码中,没有路径参数,但是又有其他的方法参数:

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):

在方法参数中,除了路径参数之外,就是查询参数。

所以定义查询参数,实际上就是定义方法的参数。

案例:分页查询

在这里插入图片描述

当数据量非常大的时候,我们使用一个网页可能放不下那么多数据,所以就需要把数据分成一组一组的进行返回并渲染。这里的一组数据就是一页数据,每页数据到底有多少条这个叫每页的数量。分页一般用page表示,每页数量一般用size表示。

比如我们说访问第三页数据,实际上就是page=3的时候,返回的数据。

这里的page和size一般来讲就是查询参数,查询参数一般是放在GET方法中,用来作为查询数据的过滤条件的参数。

简单案例:

from fastapi import FastAPI

app = FastAPI()


# 查询用户
@app.get("/user")
async def get_user(page: int = 1, size: int = 20):
    """
    查询用户信息
    :param page: 第几页
    :param size: 每页数量
    :return: 分页用户信息
    """
    return {
        "page": page,
        "size": size,
        "count": 1000,  # 数据库里面符合查询条件的数据个数
        "data": [  # 当前页的具体信息
            {"id": 1, "name": "张三", "age": 23},
            {"id": 2, "name": "李四", "age": 33},
            {"id": 3, "name": "王五", "age": 25},
        ]
    }


if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='0.0.0.0', port=8888)

使用postman进行测试:
在这里插入图片描述

练习:返回所有用户

生成1000条用户信息,当我访问 http://127.0.0.1:8888/user?page=1&size=1000 把所有1000条用户信息,全部给我返回。每一条用户信息要包含ID,姓名,年龄三个字段。要求姓名不能重复,年龄不能全部相同,ID要唯一。

from fastapi import FastAPI

app = FastAPI()


# 查询用户
@app.get("/user")
async def get_user(page: int = 1, size: int = 20):
    """
    查询用户信息
    :param page: 第几页
    :param size: 每页数量
    :return: 分页用户信息
    """
    data = []
    for i in range(1, 1001):
        data.append({"id": i, "name": f"张三{i}", "age": 20 + i % 10})
    return {
        "page": page,
        "size": size,
        "count": 1000,  # 数据库里面符合查询条件的数据个数
        "data": data
    }


if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='0.0.0.0', port=8888)

代码优化

from fastapi import FastAPI

data = []
for i in range(1, 1001):
    data.append({"id": i, "name": f"张三{i}", "age": 20 + i % 10})
app = FastAPI()


# 查询用户
@app.get("/user")
async def get_user(page: int = 1, size: int = 20):
    """
    查询用户信息
    :param page: 第几页
    :param size: 每页数量
    :return: 分页用户信息
    """
    return {
        "page": page,
        "size": size,
        "count": len(data),  # 数据库里面符合查询条件的数据个数
        "data": data
    }


if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='0.0.0.0', port=8888)

练习:只需要返回前20条数据

现在是整个1000条数据都返回了,我现在只想要前20条,也就是第一页的数据。

@app.get("/user")
async def get_user(page: int = 1, size: int = 20):
    """
    查询用户信息
    :param page: 第几页
    :param size: 每页数量
    :return: 分页用户信息
    """
    return {
        "page": page,
        "size": size,
        "count": len(data),  # 数据库里面符合查询条件的数据个数
        "data": data[:size]
    }

练习:想要第二页的20条数据

第一页:切片 [0:20]

第二页:切片 [20:40]

第三页:切片 [40:60]

用代码表示:page=2 size=20

  • page:1 size:20 ===>> start:0 end:20
  • page:2 size:20 ===>> start:20 end:40
  • page:3 size:20 ===>> start:40 end:60

end = start + size

  • start=0 size=20 end=0+20=20
  • start=20 size=20 end=20+20=40
  • start=40 size=20 end=40+20=60

start = (page - 1) x size

  • page=1 size=20 start=(1-1) x 20=0x20=0
  • page=2 size=20 start=(2-1)x20=1x20=20
  • page=3 size=20 start=(3-1)x20=2x20=40
@app.get("/user")
async def get_user(page: int = 1, size: int = 20):
    """
    查询用户信息
    :param page: 第几页
    :param size: 每页数量
    :return: 分页用户信息
    """
    start = (page - 1) * size
    end = start + size
    return {
        "page": page,
        "size": size,
        "count": len(data),  # 数据库里面符合查询条件的数据个数
        "data": data[start:end]
    }

使用postman测试:
在这里插入图片描述

遗留的问题

  • 3、FastAPI
  • 4、MySQL8
  • 5、SQLModel,和FastAPI框架是同一个作者,两者结合比较好用,但是学习成本较高,使用难度稍大
  • 6、Vue3
  • 7、Tailwindcss
  • 8、Ant Design Vue,UI组件库
  • 9、数据同步:有一个API,这个API提供了一些数据,需要在ERP系统中进行展示。
  • 10、登录注册需要吗?需要
  • 11、第三方平台管理:对接哪些接口平台飞书,钉钉,聚水潭等等
  • 12、用户管理
  • 13、Docker
  • 14、Linux
  • 15、Nginx
  • 16、项目部署实战

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

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

相关文章

深兰科技荣登《2024胡润中国元宇宙潜力企业榜》Top100

8月29日,“胡润中国元宇宙高峰论坛”在广州南沙隆重召开。论坛期间,胡润研究院发布了《2024胡润中国元宇宙潜力企业榜》,列出了元宇宙领域最具发展潜力和影响力的中国企业,深兰科技成功入围《2024胡润中国元宇宙潜力企业榜》Top10…

基质粘弹性咋回事?与组织生长啥关系?快来看看!

大家好,今天我们要来了解一个关于细胞外基质的有趣话题——《Matrix viscoelasticity controls spatio-temporal tissue organization》发表于《Nature materials》。细胞外基质的粘弹性对组织的时空组织起着重要作用,但这一作用尚未被完全理解。我们将通…

生成图片的base64编码(纯C语言实现)

一、前言 Base64编码是一种广泛使用的编码方案,将任意二进制数据转换为可打印的ASCII字符字符串。这种编码方式之所以重要,是因为许多通信协议和存储介质对数据的可传输性和可存储性有特定的要求,它们可能无法直接处理或有效传输二进制数据。…

[进阶]面向对象之static关键字

文章目录 一、什么是static关键字为什么要设置static关键字二、static的使用规则1、static修饰变量:2.static的修饰方法 练习(定义数组工具类)练习2(定义学生工具类)三、static的注意事项 一、什么是static关键字 static关键字是…

美国高防服务器运行《黑神话:悟空》配置需求及优化方法

《黑神话:悟空》作为一款备受关注的动作角色扮演游戏,其对计算资源和图形处理能力的需求相当高。在这种背景下,云服务器成为了一个能够提供强大支持的选项。下面将分析美国高防服务器在运行《黑神话:悟空》时的配置需求及优化方法…

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Node服务

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)服务器先决准备 微服务CI/CD实践(三)gitlab部署及nexus3部署 微服务CI/CD实践(四&#xff09…

为什么现在那么多人用骨传导耳机?怎么选骨传导耳机?答案来了!

随着健康生活观念的深入人心,运动健身已成为一种生活态度,而音乐则是这场健康之旅中不可或缺的伴侣。然而,传统耳机在运动时的不便促使市场呼唤更加人性化的产品。骨传导耳机的出现,正是对这一需求的精准把握。它采用非入耳技术&a…

VTK平面切割

文章目录 一、vtkClipPolyData二、CapClip三、SolidClip四、vtkClipClosedSurface 本文的主要内容:简单介绍VTK中通过平面切割模型的相关功能。 哪些人适合阅读本文:有一定VTK基础的人。 一、vtkClipPolyData VTK官网描述: vtkClipPolyData使…

AI绘画 | Stable diffusion 修复老照片

大家好呀!今天我要和大家分享一个使用Stable diffusion修复老照片的功能。 你有没有遇到这样的问题:想要修复一张老照片,但是发现照片质量太差,噪点太多,根本无法修复? 别担心!Stable diffusio…

DS18B20温度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作时序 3.工作原理:复位脉冲与应答脉冲 4.工作原理:写时序 5.工作原理:读时序 6.工作原理:DS18B20读取的数据格式 7.工作原理:DS18B20配置步骤 三、程序设计 ma…

vue 批量自动引入并注册组件或路由

有时候有大量的组件.vue后缀的,或.js,或.ts文件, 需要一个个的手动引入很麻烦,那么你可以尝试这样创建一个index.js 本项目使用vue3.x, vue2.x也可以照样用; 这里在components里面创建了一个idnex.js 文件 require.context 可以读取文件, 第一个参数是指当前文件夹, 第二个参…

路径优化 minimum-snap(对A*的全局路径进行优化)

实现效果: 介绍: 使用Astar进行路径规划,使用minimum-snap进行路径优化处理,建议参考文章: 【附源码和详细的公式推导】Minimum Snap轨迹生成,闭式求解Minimum Snap问题,机器人轨迹优化&#…

泥水位监测站——水文百科

传统的水位监测往往依赖于人工定期巡检,这不仅费时费力,而且可能受到天气、交通等多种因素的限制。而水位监测站的全自动化监测则能够24小时不间断地工作,无需人员现场值守,从而显著减少了人工巡检的次数和成本。自动化监测系统能…

全面解析BotSharp:如何利用.Net和LLMs革新你的业务系统

作为一名关注.Net与AI相关技术的博主,今天我要推荐一个开源项目——BotSharp。BotSharp 是一个基于 .Net的智能代理应用程序构建框架,专注于连接大型语言模型(LLMs)到现有业务系统中,以促进会话即平台(Conversation as…

模型案例:| 垃圾桶识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…

【Java|Stream流】不可变集合

文章目录 1.什么是不可变集合2.创建不可变集合的方式2.1 List类型2.2 Set2.3 Map 1.什么是不可变集合 不可变集合:不可以被修改的集合 不可变集合优点: 安全性 由于不可变集合不能被修改,所以可以安全地在多个线程之间共享,而不用担心被意外修改&#xf…

H264编码

H264是一种针对视频的压缩编码方式。 一、压缩方法 H264主要基于以下几种方法,将数据进行压缩: 1.帧内预测压缩:解决空间域数据冗余的问题 2.帧间预测压缩:(运动估计与补偿)解决时间域数据冗余的问题 3…

AD5270 AD5271 STM32 SPI驱动设计

硬件设计 AD5270 AD5271 简介:1024位、1%电阻容差误差、SPI接口和50-TP存储器数字变阻器。特性:单通道、1024/256位分辨率;标称电阻:20 kΩ,50 kΩ和100 kΩ;标称电阻容差误差:1%(最…

Android 11添加系统服务,并封装jar包供第三方应用使用

概述: 如果你是做技术支持,有没有遇到这种情况,客户既要实现具备系统权限的功能,但是呢,又不想把自己的应用做成系统应用。这时候你咋办。 我们可以添加一个具备系统权限的服务,不管前台的,还是…

原来这就是 布隆过滤器

1.布隆过滤器的引出 一个有趣的现象 不知道大家有没有发现这么一个现象,当我们在使用一些软件的时候,比如像 CSDN、这种具有推荐算法的应用,他并不会给我们推送我们已经浏览过的内容,这是怎么做到的呢? 说白了就是人…