SpringBoot3 + Vue3 由浅入深的交互 基础交互教学

news2024/11/28 5:48:09

说明:这篇文章是适用于已经学过SpringBoot3和Vue3理论知识,但不会具体如何实操的过程的朋友,那么我将手把手从教大家从后端与前端交互的过程教学。

目录

一、创建一个SpringBoot3项目的和Vue3项目并进行配置

1.1后端配置:

1.1.1application.yml:

1.2前端配置:

1.2.1安装相应的依赖:

1.2.2utils/request.js:

1.2.3api/user.js:

1.2.4router/index.js:

1.2.5main.js:

1.2.6vite.config.js:

二、从打印一个字符串开始

2.1 后端:

2.1.1 Controller:

2.2前端:

2.2.1api/user.js:

2.2.2App.vue:

2.3 实现效果:

三、实现登录功能(多个参数的传递)

3.1后端:

3.1.1 Controller:

3.2前端:

3.2.1api/user.js:

3.2.2App.vue:

3.3 实现效果:

四、单个参数传递

4.1后端:

4.1.1 Controller:

4.2 前端:

4.2.1api/user.js:

4.2.2App.vue:

4.3 实现效果:


一、创建一个SpringBoot3项目的和Vue3项目并进行配置

Vue创建的过程可以参考我之前写的文章

Vue 工程化项目创建快速入门这篇就够了-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_69183322/article/details/135747832

1.1后端配置:

1.1.1application.yml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_demo
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 1234

server:
  port: 8080

1.2前端配置:

要创建utils、api、router、views文件夹

1.2.1安装相应的依赖:

npm install axios
npm install element-plus --save
npm install vue-router@4

1.2.2utils/request.js:

import axios from "axios";
 
const baseURL = '/api';
 
const instance = axios.create({baseURL})
 
instance.interceptors.response.use(
    result=>{
        return result.data;
    },
    err=>{
        alert('服务错误');
        return Promise.reject(err);
    }
 
)
 
export default instance;

1.2.3api/user.js:

注意:api里的js文件名和文件内容,要根据实际的接口文档写,这里先写了一个打印功能的接口,方便教学

import request from '@/utils/request.js'

export const userHelloService = ()=>{
    return request.get('/user/hello')
}

1.2.4router/index.js:

注意:别忘记在views文件夹下创建Login.vue和Layout.vue(本次教学没用到)

import { createRouter,createWebHistory } from "vue-router";
 
import LoginVue from '@/views/Login.vue'
import LayoutVue from '@/views/Layout.vue'

//定义路由关系
const routes = [
    { path:'/login',component:LoginVue},
    { path:'/',component:LayoutVue}
]
 
//创建路由器
const router = createRouter({
    history: createWebHistory(),
    routes: routes
})
 
export default router

1.2.5main.js:

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

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

1.2.6vite.config.js:

注意:target里的url要根据后端的端口号进行修改

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server:{
    proxy:{
      '/api':{
        target:'http://localhost:8080',
        changeOrigin:true,
        rewrite:(path)=>path.replace(/^\/api/,'')
      }
    }
  }
})

二、从打印一个字符串开始

2.1 后端:

2.1.1 Controller:

启动该SpringBoot项目后,通过Get方式访问locahost:8080/user/hello,就会返回"Hello World! 2024 year"字符串

package com.example.test_demo.Controller;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("/hello")
    public String hello(){
        return "Hello World! 2024 year";
    }
    

}

2.2前端:

2.2.1api/user.js:

import request from '@/utils/request.js'

export const userHelloService = ()=>{
    return request.get('/user/hello')
}

2.2.2App.vue:

为了方便演示,我直接在App.vue(Vue.js 项目的入口文件)中输出后端传递的字符串

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

import { userHelloService } from './api/user.js';

const variable1 = ref('')
const hello = async()=>{
  let result = await userHelloService();
  variable1.value = result
 
}

function clear(){
  variable1.value = ''
}
</script>

<template>
  <el-button type="default" @click="hello" style="margin-top:10px">Hello</el-button>
  <el-button type="primary" @click="clear" style="margin-top:10px">清空</el-button>
  <h1>输出:{{variable1}}</h1>
</template>

<style scoped>

</style>

2.3 实现效果:

 

点击Hello按钮时,打印后端返回的字符串"Hello World! 2024 year"

三、实现登录功能(多个参数的传递)

想要实现登录功能,那么在页面输入的username(用户名)和password(密码)信息要传递到后端,这样后端才能调用数据库进行验证该用户信息是否存在

3.1后端:

3.1.1 Controller:

package com.example.test_demo.Controller;


import com.example.test_demo.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("/hello")
    public String hello(){
        return "Hello World! 2024 year";
    }

    @PostMapping("/login")
    public String login(String username,String password){
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);

        return "用户名:"+username+"\n密码:"+password;
    }

}

3.2前端:

3.2.1api/user.js:

import request from '@/utils/request.js'

export const userHelloService = ()=>{
    return request.get('/user/hello')
}

export const userLoginService = (loginData)=>{
    const params = new URLSearchParams();
    for(let key in loginData){
        params.append(key,loginData[key])
    }
    return request.post('/user/login',params)
}

3.2.2App.vue:

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

import { userHelloService, userLoginService } from './api/user.js';

const variable1 = ref('')
const hello = async()=>{
  let result = await userHelloService();
  variable1.value = result
 
}

function clear(){
  variable1.value = ''
}



 const loginData = ref({
    username: '',
    password: ''
   
})

const login = async()=>{
  let result = await userLoginService(loginData.value);
  alert(result)
  
}


</script>

<template>
  <el-button type="default" @click="hello" style="margin-top:10px">Hello</el-button>
  <el-button type="primary" @click="clear" style="margin-top:10px">清空</el-button>
  <h1>输出:{{variable1}}</h1>
  <el-input v-model="loginData.username" placeholder="Please username" />
  <el-input v-model="loginData.password" placeholder="Please password" />
  <el-button type="primary" @click="login" style="margin-top:10px">登录</el-button>
  <h1>username:{{loginData.username}}</h1>
  <h1>password:{{loginData.password}}</h1>

</template>

<style scoped>

.el-input{
  width: 200px;
  display: flex;
  justify-items: flex-start;
}
</style>

3.3 实现效果:

在页面输入用户名和密码后点击登录按钮,弹出登录用户信息后点击确认

 后端显示:

 可以看到后端接收到页面输入的登录信息了

四、单个参数传递

我们常常需要获取单个参数进行查询或者校验,例如,我们想通过获取id来查询信息,或者获取某一类的名字来查询该类的内容,这时候就需要传递单个参数信息了

4.1后端:

4.1.1 Controller:

package com.example.test_demo.Controller;


import com.example.test_demo.pojo.User;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("/hello")
    public String hello(){
        return "Hello World! 2024 year";
    }

    @PostMapping("/login")
    public String login(String username,String password){
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);

        return "用户名:"+username+"\n密码:"+password;
    }

    @DeleteMapping("/{id}")
    public String delete(@PathVariable Integer id){
        System.out.println("获取删除的id="+id);
        return "删除 id="+id+"的用户信息";
    }
}

4.2 前端:

4.2.1api/user.js:

import request from '@/utils/request.js'

export const userHelloService = ()=>{
    return request.get('/user/hello')
}

export const userLoginService = (loginData)=>{
    const params = new URLSearchParams();
    for(let key in loginData){
        params.append(key,loginData[key])
    }
    return request.post('/user/login',params)
}

export const userDeletService = (id)=>{
    return request.delete('user/'+id)
}

4.2.2App.vue:

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

import { userDeletService, userHelloService, userLoginService } from './api/user.js';

const variable1 = ref('')
const hello = async()=>{
  let result = await userHelloService();
  variable1.value = result
 
}

function clear(){
  variable1.value = ''
}



 const loginData = ref({
    username: '',
    password: ''
   
})

const login = async()=>{
  let result = await userLoginService(loginData.value);
  
}

const id = ref()
const deleteById = async()=>{
  let result = await userDeletService(id.value);
  id.value = result
}


</script>

<template>
  <el-button type="default" @click="hello" style="margin-top:10px">Hello</el-button>
  <el-button type="primary" @click="clear" style="margin-top:10px">清空</el-button>
  <h1>输出:{{variable1}}</h1>
  <el-input v-model="loginData.username" placeholder="Please username" />
  <el-input v-model="loginData.password" placeholder="Please password" />
  <el-button type="primary" @click="login" style="margin-top:10px">登录</el-button>
  <h1>username:{{loginData.username}}</h1>
  <h1>password:{{loginData.password}}</h1>
  输入删除的ID:<el-input v-model="id" placeholder="Please deleteId" />
  <el-button type="danger" @click="deleteById" style="margin-top:10px">删除</el-button>
  <h1>deleteById:{{id}}</h1>

</template>

<style scoped>

.el-input{
  width: 200px;
  display: flex;
  justify-items: flex-start;
}
</style>

4.3 实现效果:

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

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

相关文章

php基础学习之作用域和静态变量

作用域 变量&#xff08;常量&#xff09;能够被访问的区域&#xff0c;变量可以在常规代码中定义&#xff0c;也可以在函数内部定义 变量的作用域 在 PHP 中作用域严格来说分为两种&#xff0c;但是 PHP内部还定义一些在严格意义之外的一种&#xff0c;所以总共算三种—— 局部…

紫微斗数双星组合:廉贞天相在子午

文章目录 前言内容总结 前言 紫微斗数双星组合&#xff1a;廉贞天相在子午 内容 紫微斗数双星组合&#xff1a;廉贞天相在子午 性格分析 廉贞星最喜天相星同度来制其恶&#xff0c;因天相星之水可剋制廉贞星之火。廉贞星最喜天相星同度来制其恶&#xff0c;使廉贞星变为较温…

MySQL 基础知识(六)之数据查询(二)

目录 6 数值型函数 7 字符串函数 8 流程控制函数 9 聚合函数 10 分组查询 (group by) 11 分组过滤 (having) 12 限定查询 (limit) 13 多表查询 13.1 连接条件关键词 (on、using) 13.2 连接算法 13.3 交叉连接 (cross join) 13.4 内连接 (inner join) 13.5 外连接 …

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱6(附带项目源码)

效果演示 文章目录 效果演示系列目录前言存储加载物品信息源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制作、快…

【leetcode994】腐烂的橘子(BFS)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 首先将所有烂橘子入队&#xff0c;然后常规BFS遍历&#xff0c;注意while的截止条件除了队列为空&#xff0c;新鲜橘子数量大于0&#xff08;没新鲜橘子也没必要继续遍历&#xff0c;保证时间计算的正确性&#xff09;&a…

Compose自定义动画API指南

很多动画API都可以自定义其参数达到不同的效果&#xff0c;Compose也提供了相应的API供开发者进行自定义动画规范。 AnimationSpec 主要用存储动画规格&#xff0c;可以自定义动画的行为&#xff0c;在animate*AsState和updateTransition函数中&#xff0c;此函数默认参数为s…

机器学习——聚类问题

&#x1f4d5;参考&#xff1a;西瓜书ysu老师课件博客&#xff08;3&#xff09;聚类算法之DBSCAN算法 - 知乎 (zhihu.com) 目录 1.聚类任务 2.聚类算法的实现 2.1 划分式聚类方法 2.1.1 k均值算法 k均值算法基本原理&#xff1a; k均值算法算法流程&#xff1a; 2.2 基于…

语言与真实世界的关系(超级语言生成能力将促进世界深刻变化)

语言与真实世界之间存在着紧密且复杂的关系。在人类社会中&#xff0c;语言是认知、表达和交流现实世界的主要工具&#xff0c;它帮助我们构建并理解周围环境&#xff0c;并将我们的思维和经验概念化。 1. 符号与指代&#xff1a; 语言是一种符号系统&#xff0c;通过词汇、句…

SG3225EEN晶体振荡器规格书

SG3225EEN 晶振是EPSON/爱普生的一款额定频率25 MHz至500 MHz的石英晶体振荡器&#xff0c;6脚贴片&#xff0c;LV-PECL输出&#xff0c;3225封装常规有源晶振&#xff0c;具有小尺寸&#xff0c;轻薄型&#xff0c;高稳定性&#xff0c;低相位抖动&#xff0c;低电源电压&…

17.3.1.2 曝光

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 基本算法&#xff1a;先定义一个阈值&#xff0c;通常取得是128 原图像&#xff1a;颜色值color&#xff08;R&#xff0c;G&#…

OpenTitan- 开源安全芯片横空出世

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【前端web入门第六天】02 flex布局

文章目录 Flex布局1.Flex组成2.主轴与侧轴对齐方式2.1 主轴对齐方式(横轴)2.2 侧轴对齐方式 (纵轴)2.3 修改主轴方向 3.弹性伸缩比4.弹性换行与行对齐方式4.1 弹性换行4.2 行对齐方式 Flex布局 1.Flex组成 设置方式:给父元素设置display: flex&#xff0c;子元素可以自动挤压…

找负环(图论基础)

文章目录 负环spfa找负环方法一方法二实际效果 负环 环内路径上的权值和为负。 spfa找负环 两种基本的方法 统计每一个点的入队次数&#xff0c;如果一个点入队了n次&#xff0c;则说明存在负环统计当前每个点中的最短路中所包含的边数&#xff0c;如果当前某个点的最短路所…

【C++】---类和对象(上)入门

一、类的定义 1.那么众所周知&#xff0c;C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解的步骤&#xff0c;通过函数的调用来逐步解决问题 2.而C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间交…

【自然语言处理】:实验1布置,Word2VecTranE的实现

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;答案链接http://t.csdnimg.cn/5cyMG 如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 实验1&#xff1a; Word2Vec&TranE的…

使用HTML、CSS和JavaScript构建响应式企业官网

使用HTML、CSS和JavaScript构建响应式企业官网&#xff0c;web网页设计与制作-htmlcssjs实现企业官网展示。 页面效果展示 pc端和移动端 动态演示 文件目录 assets文件夹&#xff1a;静态资源目录&#xff0c;主要存放css、fonts、images、js等静态资源文件&#xff1b; fa…

Unity如何修改预制体(预制件)?

文章目录 19 复制复制复制&#xff0c;预制体与变体 19 复制复制复制&#xff0c;预制体与变体 【预制件】 预制件作用&#xff1a;方便复用 【预制件】的制作 直接拖拽&#xff0c;从层级面板 -> 项目面板。层级面板中当前图标会变蓝&#xff0c;子物体名字变蓝色。预制件…

《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(5)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术&#xff08;4&#xff09; 13.1 IOMMU 13.1.3 AMD处理器的IOMMU AMD处理器的IOMMU技术与Intel的VT-d技术类似&#xff0c;其完成的主要功能也类似。AMD率先提出了IOMMU的概念…

(11)Hive调优——explain执行计划

一、explain查询计划概述 explain将Hive SQL 语句的实现步骤、依赖关系进行解析&#xff0c;帮助用户理解一条HQL 语句在底层是如何实现数据的查询及处理&#xff0c;通过分析执行计划来达到Hive 调优&#xff0c;数据倾斜排查等目的。 官网指路&#xff1a; https://cwiki.ap…

【网站项目】228高校教师电子名片系统

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