FastAPI和前端框架LayUImini及mysql之间的交互示范(一、FastAPI后端查询数据在前端进行分页展示)

前言

小编知道FastAPI是一个高效异步的python WEB框架、之前也接触过flask。

这篇文章主要针对Fastapi异步WEB框架的前后端分离实战,到底是怎么分?怎么离?怎么交互数据?相信很多小伙伴也是模模糊糊,网络上各种零碎的知识让很多人头晕目眩,不知道从何下手。

今天小编就来讲讲FastAPI如何与LayUImini及mysql实行交互数据,目前互联网上的这块资料非常少,现在小编将简单的介绍一下。该程序主要是演示通过F查询数据在前端进行分页展示。
主要用的技术有:
1、fastAPI的主路由和分路由的建立(大型工程需要用该技术)
2、fastAPI查询参数的写法
3、后端SQL语句查询
4、分页技术

最后展示的效果如下图:(搜索和编辑功能未做)
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考。

我们先来说说mysql 的使用。因为要用到数据库,小编觉得先从数据开始说起比较好。

一、mysql的使用?

mysql的安装运用不是本文的重点,请自行搜索相关资料。mysql应该有400多M。下载社区版进行安装。

数据准备

下载:https://download.csdn.net/download/weixin_43354347/16795733
2016城市编码(身份证号归属地查询),该数据有46966条。

将该文件导入mysql数据库并起表名:address_code

address_code里面的数据大概是这个样子的:
在这里插入图片描述

二、FastAPI的使用步骤

1.建立主程序文件app.py

代码如下(示例):

import  uvicorn                 #导入异步WEB服务器uvicorn       
from fastapi import FastAPI
from starlette.requests import Request #后面会用到,请求静态资源文件要用到请求的类型
from starlette.templating import Jinja2Templates #主要功能是导入jinjia2的模板引擎类
from fastapi.staticfiles import StaticFiles #主要功能是导入静态文件类,因为我们要用到js、CSS
import address_code #导入自己编写的模块,主要是要用到注册到主路由上面
from starlette.templating import Jinja2Templates

templates = Jinja2Templates(directory='templates')  # 模板实例化,一会要用到
app = FastAPI()   #app的实例化
app.mount("/static", StaticFiles(directory="static"), name="static")  # 加载静态文件


@app.get("/")   # 访问html,固定写法
async def main(request: Request): 
    return templates.TemplateResponse('list.html', {'request': request})  


app.include_router(address_code.router) #将导入的address_code路由注册到主路由上


if __name__ == '__main__':
    uvicorn.run('app:app', host="0.0.0.0",port=8000, reload=True)


2.建立一个address_code.py文件

代码如下(示例):

from fastapi import APIRouter,Request
import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456',
  database='各种数据', charset='utf8', cursorclass=pymysql.cursors.DictCursor)


router=APIRouter(tags=['身份和地址查询']) #

@router.get("/item/") #访问接口,要与前端js代码里面的一致
async def read_item(page: int, limit: int): #使用的FastAPI查询参数的固定写法,因为前端layuimini传送page和limit参数过来,现在后端来处理
    sql = "select * from address_code limit %s,%s" % ((page-1)*limit, limit)  # 第一页的0加到14条,%s是python字符串占位符的,请深刻理解这条语句
    print(sql)
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        print("所有数据查询语句已经执行了")
        print(sql)
        result = cursor.fetchall()
        print(result)
        return {"code": 0, "msg": "信息有了", "count": count_db(), "data": result} #这是layuimini返回json的要求格式,主要的要得到count和data,注意 count_db()调用了下面的函数主要统计条数
    except pymysql.Error as e:
        print(e)
   

  
def count_db(): #统计数据的条目的函数,要用到
    sql = "select count(*) from address_code"  #统计条数
    print(sql)
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        d= cursor.fetchall()
        for x in d:
            a=x.get('count(*)')
            print(a)
            return (a)
    except pymysql.Error as e:
        print(e)
    finally:
        cursor.close()

三、前端框架LayUImini的使用?

1、LayUI是什么?

layui是我们国人开发的前端框架
layui(谐音:类 UI) 是一套开源的 Web UI 解决方案,采用自身经典的模块化规范,并遵循原生 HTML/CSS/JS 的开发方式,极易上手,拿来即用。其风格简约轻盈,而组件优雅丰盈,从源代码到使用方法的每一处细节都经过精心雕琢,非常适合网页界面的快速开发。layui 区别于那些基于 MVVM 底层的前端框架,却并非逆道而行,而是信奉返璞归真之道。准确地说,它更多是面向后端开发者,你无需涉足前端各种工具,只需面对浏览器本身,让一切你所需要的元素与交互,从这里信手拈来。

基于Layui编写的一套最简洁、易用的后台框架模板

2、LayUImini又是什么?

LayUImini基于Layui编写的一套最简洁、易用的后台框架模板。 实际上基于LayUI前端框架开发的模板很多,今天就只介绍LayUImini。

主要特性:

  • 界面足够简洁清爽,响应式且适配手机端。
  • 一个接口几行代码而已直接初始化整个框架,无需复杂操作。
  • 页面支持多配色方案,可自行选择喜欢的配色。
  • 支持多tab,可以打开多窗口。
  • 支持无限级菜单和对font-awesome图标库的完美支持。
  • 失效以及报错菜单无法直接打开,并给出弹出层提示完美的线上用户体验。
  • url地址hash定位,可以清楚看到当前tab的地址信息。
  • 刷新页面会保留当前的窗口,并且会定位当前窗口对应左侧菜单栏。
  • 支持font-awesome图标选择插件

在这里插入图片描述
下载LayUImini,一般建议下载: iframe版 - v2
( V2版本相比于V1,核心代码进行重构,更加更加规范,配置使用起来也更方便(建议直接使用v2版本)。 iframe版是多标签版本,index.html包含头部、侧边栏、底部等部分, 中间部分通过iframe嵌入子页面,并且可配置是否开启多标签布局,iframe版本功能丰富,是目前常用的后台 布局方式,相比单页面版本更容易上手。)

就像下面这个样子:(是不是很漂亮)
在这里插入图片描述

下载iframe版 - v2版本后,我们可以看到非常多的文件。将所有的html文件统一放在templates文件件下,将所有js、css、api、images等都统一的放在static文件下。我这里为了做演示只保留了list.html,其余都删除了。

整体的目录结构
在这里插入图片描述

3、建立list.html如下,注意JS和CSS路径

在这里插入图片描述
在这里插入图片描述

list.html代码如下(示例):


<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>layui</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="/static/lib/layui-v2.5.5/css/layui.css" media="all">
    <link rel="stylesheet" href="/static/css/public.css" media="all">
</head>

<body>
    <div class="layuimini-container">
        <div class="layuimini-main">

            <fieldset class="table-search-fieldset">
                <legend>搜索信息</legend>
                <div style="margin: 10px 10px 10px 10px">
                    <form class="layui-form layui-form-pane" action="">
                        <div class="layui-form-item">
                            <div class="layui-inline">
                                <label class="layui-form-label">根据ID</label>
                                <div class="layui-input-inline">
                                    <input type="text" name="id" id="dataRelad" autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-inline">
                                <label class="layui-form-label">地区名字</label>
                                <div class="layui-input-inline">
                                    <input type="text" name="class_l" id="data_class" autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-inline">
                                <label class="layui-form-label">地区类型</label>
                                <div class="layui-input-inline">
                                    <input type="text" name="performer" id="data_performer" autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-inline">
                                <label class="layui-form-label">根据标题</label>
                                <div class="layui-input-inline">
                                    <input type="text" name="title" autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-inline">
                                <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button>
                            </div>
                        </div>
                    </form>
                </div>
            </fieldset>

            <script type="text/html" id="toolbarDemo">
                <div class="layui-btn-container">
                    <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加 </button>
                    <button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除 </button>
                </div>
            </script>

            <table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>

            <script type="text/html" id="currentTableBar">
                <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
                <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
            </script>

        </div>
    </div>
    <script src="/static/lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
    <script>
        layui.use(['form', 'table'], function() {
            var $ = layui.jquery,
                form = layui.form,
                table = layui.table;

            table.render({
                elem: '#currentTableId',
                url: '/item/',//这里要非常注意,要与后端一致。
                toolbar: '#toolbarDemo',
                defaultToolbar: ['filter', 'exports', 'print', {
                    title: '提示',
                    layEvent: 'LAYTABLE_TIPS',
                    icon: 'layui-icon-tips'
                }],
                cols: [
                    [{
                        type: "checkbox",
                        width: 50
                    }, {
                        field: 'id',
                        width: 100,
                        title: 'ID',
                        sort: true
                    }, {
                        field: 'areaName',
                        width: 300,
                        title: '地区名字'
                    }, {
                        field: 'areaCode',
                        width: 300,
                        title: '地区代码',
                        sort: true
                    }, {
                        field: 'pid',
                        width: 300,
                        title: '上级区域编码'
                    }, {
                        field: 'areaType',
                        title: '地区类型编码',
                        minWidth: 300
                    }, {
                        title: '操作',
                        minWidth: 150,
                        toolbar: '#currentTableBar',
                        align: "center"
                    }]
                ],
                limits: [10, 15, 20, 25, 50, 100],
                limit: 15,
                page: true,
                skin: 'line'
            });

            // 监听搜索操作
            form.on('submit(data-search-btn)', function() {
                var id = $('#dataRelad').val();
                var data_performer = $('#data_performer').val(); //取值
                console.log(id);
                table.reload('currentTableId', {
                    method: 'post',
                    url: '/address_code',
                    //page: true,
                    // page: {
                    //     curr: 1
                    // },
                    where: {
                        'id': id,
                        'data_performer': data_performer //
                    }
                }, );
                return false;
            });

            //执行搜索,表格重载

            /**
             * toolbar监听事件
             */
            table.on('toolbar(currentTableFilter)', function(obj) {
                if (obj.event === 'add') { // 监听添加操作
                    var index = layer.open({
                        title: '添加用户',
                        type: 2,
                        shade: 0.2,
                        maxmin: true,
                        shadeClose: true,
                        area: ['100%', '100%'],
                        content: '/table/add.html',
                    });
                    $(window).on("resize", function() {
                        layer.full(index);
                    });

                } else if (obj.event === 'delete') { // 监听删除操作
                    var checkStatus = table.checkStatus('currentTableId'),
                        data = checkStatus.data;
                    layer.alert(JSON.stringify(data));
                }
            });

            //监听表格复选框选择
            table.on('checkbox(currentTableFilter)', function(obj) {
                console.log(obj)
            });

            table.on('tool(currentTableFilter)', function(obj) {
                var data = obj.data;
                if (obj.event === 'edit') {

                    var index = layer.open({
                        title: '编辑用户',
                        type: 2,
                        shade: 0.2,
                        maxmin: true,
                        shadeClose: true,
                        area: ['100%', '100%'],
                        content: 'table/edit.html',
                    });
                    $(window).on("resize", function() {
                        layer.full(index);
                    });
                    return false;
                } else if (obj.event === 'delete') {
                    layer.confirm('真的删除行么', function(index) {
                        obj.del();
                        layer.close(index);
                    });
                }
            });

        });
    </script>

</body>

</html>

上述代码下载的地址:https://download.csdn.net/download/weixin_43354347/17079306(包括html 、 py、电子表格数据等)

注意事项一:html文件放在templates文件下,js等文件放在static文件夹下,这是jinjia2模板的要求。

注意事项二:js代码里面 table.render({

            elem: '#currentTableId',
            url: '/item/',//这里要非常注意,要与后端请求的地址一致。 后端address_code.py文件里面的@router.get("/item/")

结语:上面所有操作基本完了,可以在本地看到后端查询,前端分页的效果了,小编我自己码字已经尽力了,看到这里的同学请点赞支持我一下吧!谢谢!

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 为了搭建一个网站前端框架后端的管理系统,可以使用前端框架如React、Vue或Angular,而后端的管理系统可以使用Node.js或PHP来构建,可以使用RESTful API和JSON来连接前后端。另外,为了让前端后端更好的协作,可以使用数据库系统(如MySQL)来存储、管理和处理数据。 ### 回答2: 搭建一个完整的网站需要考虑前端框架后端管理系统的配合使用。下面是一个简单的搭建过程及配合使用的方式。 第一步:选择前端框架 首先,根据项目需求选择合适的前端框架,常用的有React、Vue、Angular等。然后,通过npm或者yarn等包管理工具安装前端框架,并创建一个新的项目。 第二步:搭建前端页面 在前端项目中,根据设计稿进行页面布局和样式设计,引入合适的UI组件库,编写页面的HTML、CSS和JavaScript代码。使用前端框架的组件和路由功能,实现页面的模块化和动态路由。 第三步:选择后端管理系统 根据项目需求选择合适的后端管理系统,比如Django、Laravel、Spring Boot等。后端管理系统可以提供用户认证、权限管理、数据管理等功能。 第四步:设计数据库 在后端管理系统中,设计数据库结构并创建数据库表,定义表之间的关系。使用ORM工具,如Django的ORM,操作数据库,实现数据的增删改查。 第五步:实现前后端数据交互 通过前端框架的网络请求功能,与后端管理系统进行数据交互前端发送请求并接收后端返回的数据,并根据需要进行展示或者修改。 第六步:前后端联调和测试 在开发过程中,前后端需要联调和测试,确保前端后端的功能可以正常配合使用和交互。 第七步:部署网站 完成开发和测试后,将前端代码和后端管理系统部署到服务器上。前端代码可以使用静态文件服务器进行部署,后端管理系统可以使用Web服务器进行部署。 总结:搭建一个网站前端框架后端管理系统需要确保两者之间的配合使用。前端负责页面的展示交互后端负责处理数据和逻辑。通过前后端数据交互,实现网站的功能和需求。 ### 回答3: 搭建一个网站前端框架后端的管理系统,可以通过以下步骤进行: 1. 做好规划和设计:首先确定网站的需求和功能,设计网站前端的用户界面和交互流程,以及后端管理系统的数据结构和交互方式。 2. 选择合适的前端框架:根据网站需求和设计,选择适合的前端框架,如React、Vue等,并搭建基本的项目结构。 3. 前端开发:根据设计稿和需求,进行前端页面的开发,包括页面布局、样式设计、交互逻辑等。使用HTML、CSS和JavaScript等技术进行页面的编写和交互实现。 4. 后端架构设计:根据网站需求,选择合适的后端技术栈,如Java、Python等,并设计后端管理系统的数据库结构和接口设计。 5. 后端开发:根据设计的数据库结构和接口设计,进行后端管理系统的开发。使用所选择的后端技术进行业务逻辑的实现、数据的处理和管理。 6. 前后端联调:前端开发完成后,与后端进行接口对接和交互,确保数据的传输和交互正常。针对接口调试中的问题进行修改和优化。 7. 测试和优化:进行系统整体的功能测试和性能测试,保证网站正常运行和用户体验。根据测试结果对系统进行优化和改进,提升性能和用户体验。 两者的配合使用可以通过接口进行数据的传递和交互前端通过调用后端提供的接口,获取和提交数据,并展示在用户界面上。后端处理前端发送的请求,进行业务逻辑的处理和数据库操作,然后返回相应的数据前端前端后端的配合需要保持接口的一致性和稳定性,确保数据的准确性和安全性。同时,与后端开发人员之间的良好沟通和密切合作也是保证系统顺利开发和运行的重要因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值