fastapi+vue3+primeflex前后端分离开发项目第一个程序

news2024/11/25 20:32:21

安装axios

axios是用来请求后端接口的。
https://www.axios-http.cn/docs/intro

pnpm 是一个前端的包管理工具,当我们需要给前端项目添加新的依赖的时候,就可以使用pnpm install 命令进行安装。

pnpm install axios

安装 primeflex

primeflex是一个css样式库,用来帮助我们快速的开发前端的界面。

pnpm install primeflex

在 src/main.js 中引入 primeflex 相关的样式文件。

import { createApp } from 'vue'

import "primeflex/primeflex.css"
import "primeflex/themes/primeone-light.css"

import App from './App.vue'

createApp(App).mount('#app')

vue3请求后端数据

修改 src/App.vue

<script setup>
import axios from "axios"

axios.get('http://127.0.0.1:8000/')
    .then(function (response) {
      // 处理成功情况
      console.log(response);
    })
    .catch(function (error) {
      // 处理错误情况
      console.log(error);
    })
    .finally(function () {
      // 总是会执行
    });
</script>

<template>
  <h1>request fastapi data</h1>
</template>

此时,前端会报一个CORS跨域错误,这个是前后端分离开发中非常常见的错误。

在本项目中,将使用 fastapi 在后端解决此错误。

在这里插入图片描述

解决后端跨域问题

修改 main.py

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "*"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    return {"message": "Hello World"}

修改以后,记得重启服务。

vue 的挂载生命周期方法

生命周期方法,就是不需要我们手动调用,vue会在特殊的时刻自动调用的方法。

示例代码:

import {onMounted} from "vue";

onMounted(() => {
  console.log("on mounted")
})

onMounted这个生命周期方法,会在组件挂载的时候,自动触发。

直白的讲,就是我们每次刷新页面的时候,都会触发这个方法。

vue3 如何定义和渲染响应式变量

响应式变量,指的是,我们在程序运行过程中,动态修改了变量的值以后,页面中的渲染效果也会自动跟着改变的变量。如果我们在页面中,反向修改了响应式变量的值,内存中真实的响应式变量的值也会跟着修改。

有点抽象,直接看代码:

<script setup>
import axios from "axios"
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

axios.get('http://127.0.0.1:8000/')
    .then(function (response) {
      // 处理成功情况
      console.log("response", response);
    })
    .catch(function (error) {
      // 处理错误情况
      console.log(error);
    })
    .finally(function () {
      // 总是会执行
    });

onMounted(() => {
  console.log("on mounted")
})

</script>

<template>
  <h1>{{ message }}</h1>
</template>

在这里插入图片描述

定义响应式变量:

import {onMounted, ref} from "vue";

const message = ref("frontend variable")

渲染响应式变量:

<h1>{{ message }}</h1>

提取后端数据

思路:

  • 在页面加载的时候,请求后端数据
  • 将请求到的后端数据,设置为响应式的变量
  • 在页面中渲染响应式变量

直接上代码:

<script setup>
import axios from "axios"
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

onMounted(() => {
  console.log("on mounted")
  axios.get('http://127.0.0.1:8000/')
      .then(function (response) {
        // 处理成功情况
        console.log("response", response);
        console.log("response", response.data.message);
        message.value = response.data.message
      })
      .catch(function (error) {
        // 处理错误情况
        console.log(error);
      })
      .finally(function () {
        // 总是会执行
      });
})

</script>

<template>
  <h1>{{ message }}</h1>
</template>


关键:将后端请求的数据赋值给前端响应式变量

message.value = response.data.message

在这里插入图片描述

练习

后端给我返回一个字符串,这个字符串有1到100的偶数组成,用逗号分隔,然后前端渲染。

后端代码:main.py

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "*"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    arr = [str(i) for i in range(2, 101, 2)]
    message = ",".join(arr)
    return {"message": message}

前端代码:App.vue

<script setup>
import axios from "axios"
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

onMounted(() => {
  console.log("on mounted")
  axios.get('http://127.0.0.1:8000/')
      .then(function (response) {
        // 处理成功情况
        console.log("response", response);
        console.log("response", response.data.message);
        message.value = response.data.message
      })
      .catch(function (error) {
        // 处理错误情况
        console.log(error);
      })
      .finally(function () {
        // 总是会执行
      });
})

</script>

<template>
  <h1>{{ message }}</h1>
</template>


在这里插入图片描述

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

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

相关文章

MySQL之复制(十二)

复制 复制的问题和解决方案 未定义的服务器ID 如果没有在my.cnf里面定义服务器ID,可以通过CHANGE MASTER TO 来设置备库&#xff0c;但却无法启动复制。 mysql>START SLAVE; ERROR 1200(HY000):The server is not configured as slave;fix in config file or with CHANG…

【shell脚本速成】mysql备份脚本

文章目录 案例需求脚本应用场景&#xff1a;解决问题脚本思路实现代码 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻…

ubuntu链接mysql

C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…

2024各省自考报名时间汇总❗所需材料❗

天津&#xff1a;5月27日-5月31日&#xff08;已结束&#xff09; 河北&#xff1a;6月10日~6月15日&#xff08;已结束&#xff09; 贵州&#xff1a;6月17日~26日 山东&#xff1a;6月18日~6月24日 江西&#xff1a;6月26日-7月7日&#xff08;6月下旬&#xff09; 浙江&…

pytest测试框架pytest-xdist插件并发执行测试用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下插件pytest-xdist&#xff0c;主要是提供并行测试、分布式测试、循环测试等功能&#xff0c;可以加快测试速度。 pytest-xdist官方显示没有严格的python和pytest版本限制。 pytest-xdist安装 使用pip命令安装: pip…

如何解决代码中if…else-过多的问题,建议收藏

逻辑表达模式固定的 if…else 实现与示例 if (param.equals(value1)) { doAction1(someParams); } else if (param.equals(value2)) { doAction2(someParams); } else if (param.equals(value3)) { doAction3(someParams); } // … 可重构为 Map<?, Function<?>…

电脑有哪些重复文件删除工具?分享四个一键去重软件!

重复文件删除工具有哪些&#xff0c;哪个重复文件删除工具好用&#xff1f;日常工作生活中&#xff0c;如果需要对重复文件进行查找和删除&#xff0c;我们可以借助专业的金舟重复删除工具、czkawka、Wise Duplicate Finder和DiskBoss四种方法解决&#xff0c;具体操作如下&…

2024年6月大众点评成都餐饮店铺POI分析22万家

2024年6月大众点评成都餐饮店铺POI共有221002家 店铺POI点位示例&#xff1a; 店铺id CACuqlcUQApLA7Ki 店铺名称 峨眉山豆腐脑(百吉街店) 十分制服务评分 7.3 十分制环境评分 7.5 十分制划算评分 7.1 人均价格 18 评价数量 38 店铺地址 百吉街86号1层 大类 美食 中类…

MySOL数据库基础

一、数据库简介 1.数据库的特点 存储大量信息&#xff0c;方便检索和访问。保持数据的完整性&#xff0c;一致性&#xff0c;降低数据冗余。应用共享和安全。 2.数据库的基本概念 数据&#xff1a;描述事物的符号记录&#xff0c;包括数字&#xff0c;文字&#xff0c;图形…

问题-小技巧-python-一键装第三方库

有网但是没第三方环境的地方&#xff0c;能快速装上环境 代码&#xff1a; import osprint(开始安装模块...) #os.system(pip install &#xff08;在这敲上你需要装的库&#xff09; -i https://pypi.tuna.tsinghua.edu.cn/simple) os.system(pip install requests -i https…

密码没有未来

无密码认证的好处 引领无密码未来之路万能钥匙 英国通过具体法律打击可预测密码 强密码是抵御网络威胁的第一道防线 如何破解价值百万美元的加密钱包密码 复制此链接到微信打开阅读全部以发布文章 新 GPU 在不到一小时内打开了网络上 59% 的密码。 现代计算机的能力不断增…

024基于SSM+Jsp的超市管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

栈和递归介绍

在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它遵循后进先出&#xff08;Last In, First Out, LIFO&#xff09;的原则。栈可以用来实现递归&#xff08;Recursion&#xff09;&#xff0c;递归是一种自我调用的方法或函数。 栈…

使用Gradle查看Android项目中库的依赖关系

| | -- com.android.support:support-compat:25.3.1 | | | — com.android.support:support-annotations:25.3.1 | | -- com.android.support:support-media-compat:25.3.1 | | | -- com.android.support:support-annotations:25.3.1 | | | — com.android.support:support…

Flutter ListView详解

文章示例代码 ListView常用构造 ListView 我们可以直接使用ListView 它的实现也是直接返回最简单的列表结构&#xff0c;粗糙没有修饰。 ListView 默认构建 效果 ///默认构建 Widget listViewDefault(List list) { List _list new List(); for (int i 0; i < list.le…

Python17 多进程multiprocessing

1.多进程与多线程的区别 在Python中&#xff0c;多线程&#xff08;multithreading&#xff09;和多进程&#xff08;multiprocessing&#xff09;是两种并行执行任务的方式&#xff0c;它们有一些关键的区别&#xff1a; 进程和线程的基本区别&#xff1a; 进程&#xff1a;进…

「GPT源码探索」:从ChatPaper到学术论文GPT的二次开发实践

前言 本文的前两个部分最早是属于此旧文的《学术论文GPT的源码解读与微调&#xff1a;从ChatPaper到七月论文审稿GPT第1版》&#xff0c;但为了每一篇文章各自的内容更好的呈现&#xff0c;于是我今天做了以下三个改动 原来属于mamba第五部分的「Mamba近似工作之线性Transfor…

【计算机毕业设计】194高校学习助手微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

CSS属性选择器学习记录(4)

目录 1、CSS 属性 选择器 1.1、CSS [attribute|value] 选择器 1.2、实例 2、具有特定属性的HTML元素样式 3、属性选择器 4、属性和值选择器 5、属性和值的选择器 - 多值 6、表单样式 1、CSS 属性 选择器 顾名思义&#xff0c;CSS 属性选择器就是指可以根据元素的属性以…