vue3前端打包集成到后端fastAPI的uvicorn服务器

作者:你的大名 · 发表于:
2023-04-23T09:43:05.000000Z
· 更新于:
2023-08-13T22:54:57.580618Z
· Tag: Vue

数据分页在项目中的使用频率是非常高的,但是对于新手来说是一个难点和痛点,这里我记录一次数据分页从环境搭建到最后页面的渲染的过程,对于新手可以用来参考,大佬勿喷高抬贵手.

最终效果:

在这里插入图片描述

环境搭建

在这里插入图片描述

fastapi-backend 后端目录 vue-frontend 前端目录 这里我只贴一些关键的代码了,文末有代码仓库可以查看完整的代码.

后端

后端采用了fastapi框架,首先安装相关依赖fastapi faker uvicorn等,具体依赖可以参考文件头部的引用.后端的搭建首先是创建fastapi的实例,和解决跨域的问题,这些很简单,官方就有现成的代码,复制过来修改,然后就是在models.py中定义数据的模型,本项目中只有一个表和简单的字段:

from database import Base
from sqlalchemy import String,Column,Integer
class Item(Base):
    __tablename__ = 'item'
    id = Column(Integer,primary_key=True,autoincrement=True)
    addr = Column(String(256), nullable=False,index=True)

然后在main.py的入口处创建数据库,并添加一些假数据.

Base.metadata.create_all(engine) # create all tables
# 创建测试数据
item_count = 999
fk = Faker(locale="zh-CN")
db = get_db()
k = get_item_count(db)
if (get_item_count(db)==0):
    for i in range(item_count):
        addr = fk.address()
        item = Item(addr=addr)
        create_item(db,item)

第一行是创建数据库,后边判断表中是否有数据,没有的话创建999条虚拟数据.

crud.py中定义了添加和查询的方法.

from sqlalchemy.orm import Session
from models import Item
def create_item(db: Session, item: Item):
    db_item = Item(addr=item.addr)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
def get_item_count(db: Session):
    return db.query(Item).count()
# offset: 表示要跳过多少条数据,limit: 表示取几条数据,
def get_items(db: Session,skip: int = 0, limit: int = 10):
    return db.query(Item).offset(skip).limit(limit).all()

分页数据后端的重点就在查询语句那里:offset: 表示要跳过多少条数据,limit: 表示取几条数据,根据前端返回的参数就可以查到需要的数据了.

然后就是创建fastapi的接口函数,main.py:

@app.get("/getitems")
def get_item_list(skip: int = 0, limit: int = 10,db:Session = Depends(get_db)):
    # print(skip,limit)
    data = dict()
    data["items"] = get_items(db=db,skip=skip,limit=limit)
    data["item_count"] = get_item_count(db)
    return data

至此,后端的搭建基本完成,运行main.py后,打开http://127.0.0.1:8000/docs,就可以调试接口获取数据了: 在这里插入图片描述

如果能正常的获取数据,后端的搭建至此就结束了.

前端搭建

在项目的根目录终端下:

npm init vue@latest  # 然后一路回车即可

起好前端项目的名字:vue-frontend,当然别的也可以.

安装 ant design for vue3

npm i --save ant-design-vue

安装后 配置前端下边的main.js引入ui框架.

import { createApp } from 'vue'
import Antd from 'ant-design-vue';
import App from './App.vue'
import 'ant-design-vue/dist/antd.css';

const app = createApp(App);
app.use(Antd);
app.mount('#app');

再安装axios npm install axios

然后在前端目录的终端下:npm run dev 即可看到项目正常启动了.

前端数据的渲染

首先搭建前端的界面,这里用到了antlistpagination,在 home.vue:

<template lang="">
    <a-list bordered :data-source="items">
    <template #renderItem="{ item }">
        <a-list-item>{{ item.id }}.{{ item.addr }}</a-list-item>
    </template>
    <template #header>
        <div>列表展示</div>
    </template>
    <template #footer>
        <div><a-pagination @change="showSizeChange" v-model:current="current" :total="count" /></div>
    </template>
    </a-list>
</template>

接下来就是定义refajax的方法了:

<script setup>
import {ref} from 'vue'
import axios from 'axios'

const baseURL = 'http://localhost:8000'

const items = ref([])
const count = ref(0)
const current = ref(1)

axios.get(baseURL+'/getitems').then(function(response) {
    console.log(response.data)
    items.value = response.data.items
    count.value = response.data.item_count
})

const showSizeChange = (current,size) =>{
    console.log(current,size)
    let skip=size*(current-1)
    let limit=size
    axios.get(baseURL+'/getitems',
    {
        params:{
            skip: skip,
            limit: limit
        },
    },
    ).then(function(response) {
    console.log(response.data)
    items.value = response.data.items
    count.value = response.data.item_count
})
}
</script>

前端的代码很简答的,vue3极大的简化了代码,还有就是翻页的pagination封装了大量分页的逻辑控制,我们只要通过两个数据就可以控制这个前端的翻页组件,let skip=size*(current-1),这个是比较关键的代码,控制着数据返回的起始点.如果没有什么问题项目已经可以正常翻页了.

本文代码仓库: https://github.com/bosichong/vue3-fastapi-pagination.git