Vue3学习(三)前后端数据交互

news2024/9/25 15:26:50

一、前后端分离

        IDEA软件、JDK1.8、Mysql5.7+、Navicat、SpringBoot2.x

 

         pom配置阿里云仓库

<repositories>

	<repository>
		<id>nexus-aliyun</id>
		<name>nexus-aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
		<releases>
			<enabled>true</enabled>
		</releases>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
	</repository>
	
	<pluginRepositories>
		<pluginRepository>
			<id>public</id>
			<name>aliyun nexus</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>

</repositories>

application.yml

server:
  port: 9090

spring:
  datasource:
    url: jdbc://mysql//localhost:3306/springboot-vue3
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root

         启动成功

        创建数据库表t_user

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '姓名',
  `date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '日期',
  `address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

        实现增删改查sql语句

        新增:

INSERT INTO `t_user`(name, date, address) VALUES('张三', '2023-06-25', '江苏省南京市');

        修改:

UPDATE t_user SET name = "李四" WHERE id = 1;

        删除:

DELETE FROM t_user WHERE id = 1;

        查询:

SELECT * FROM t_user WHERE name LIKE '%张%'

        分页查询:

SELECT * FROM t_user WHERE address LIKE '%南京%' LIMIT 0,2;

        SQL语句打印:        

logging:
  level:
    com.example.springboot.mapper: debug

        Mybatis开启下划线自动转驼峰

mybatis:
  configuration:
    map-underscore-to-camel-case: true  #  开启下划线自动转驼峰

        统一包装类Result

/**
 * Controller统一返回的包装类
 */
public class Result {
    private static final String SUCCESS_CODE = "200";
    private static final String ERROR_CODE = "500";

    private String code;   // 返回的状态码。告诉前端这次请求成功还是失败
    private String msg;    // 错误信息
    private Object data;   // 包装的数据

    public Result(String code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Result(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Result() {
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public static Result success(Object data) {
        return new Result(SUCCESS_CODE, "", data);
    }

    public static Result success() {
        return new Result(SUCCESS_CODE, "");
    }

    public static Result error(String msg) {
        return new Result(SUCCESS_CODE, msg);
    }
}

二、Vue配置

        安装axios 1.4.0:

npm i axios

        配置环境变量

        .env.dev

VITE_ENV = dev
VITE_BASE_URL = 'http://localhost:9090'

        utils/request.js

import axios from "axios";

const request = axios.create({
    baseURL: 'http://localhost:9091',
    timeout: 30000
})

request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    return config
}, error => {
    console.log('request error:' + error)//for error debug
    return Promise.reject(error)
})

request.interceptors.response.use(response =>{
    let res = response.data
    // res.code
    return res
},error => {
    console.log('response error:' +error)
    return Promise.reject(error)
    })

export default request

                导入request对象

import request from "../../utils/request";

         因为没有返回request的config

         跨域错误

         在后端修改配置即可

        1.在controller加个注解@CrossOrigin解决

        2.在全局配置跨域

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CrossOriginConfig {

    // 当前跨域请求最大有效时长。这里默认1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}

查询数据:

<el-button type="primary" @click="load" style="margin-left: 5px">查询数据</el-button>



const state = reactive({
         tableData: [],
         form:{}
    })



//请求后台数据 load去加载表格里
    const load = () =>{
        request.get('/user/selectAll?name='+name.value).then(res =>{
            //res.data就是后台返回的数组
            state.tableData = res.data
            
        })
    }
    load();

重置数据:

<el-button type="info" @click="reset">重置数据</el-button>



const reset = () =>{
        name.value = '';
        load();
    }

User

package com.example.springboot.entity;

/**
 * author: zx
 * time: 2023-06-25
 */
public class User {

    private Integer id;

    private String name;

    private String date;

    private String address;

    private String userNo;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getUserNo() {
        return userNo;
    }

    public void setUserNo(String userNo) {
        this.userNo = userNo;
    }
}

UserController

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

    @Resource
    private UserMapper userMapper;

    @GetMapping("/selectAll")
    //user/selectAll?name=xxx
    public Result selectAll(@RequestParam String name){
        List<User> userList =  userMapper.selectAll(name);
        return Result.success(userList);
    }
}

UserMapper

@Mapper
public interface UserMapper {

    @Select("select * from t_user where name like concat('%',#{name},'%') or date like concat('%',#{name},'%') or address like concat('%',#{name},'%') or user_no like concat('%',#{name},'%')  ")
    List<User> selectAll(String name);
}

分页查询

国际化

import zhCn from 'element-plus/dist/locale/zh-cn.mjs'


app.use(ElementPlus, {
    locale: zhCn,
})

UserController

//分页查询
    @GetMapping("/selectPage")
    //user/selectAll?name=xxx
    public Result selectPage(@RequestParam String name, @RequestParam Integer start, @RequestParam Integer pageSize){
        List<User> userList =  userMapper.selectPage(name,start,pageSize);
        Integer total = userMapper.selectTotal(name);
        Map<String,Object> map = new HashMap<>();
        map.put("list",userList);
        map.put("total",total);
        return Result.success(map);
    }

UserMapper

@Select("select * from t_user where name like concat('%',#{name},'%') or date like concat('%',#{name},'%') or address like concat('%',#{name},'%') or user_no like concat('%',#{name},'%') order by id desc limit #{start},#{pageSize}  ")
    List<User> selectPage(@Param("name") String name, @Param("start") Integer start, @Param("pageSize") Integer pageSize);

    @Select("select count(id) from t_user where name like concat('%',#{name},'%') or date like concat('%',#{name},'%') or address like concat('%',#{name},'%') or user_no like concat('%',#{name},'%')")
    Integer selectTotal(@Param("name") String name);
<div style="margin: 10px">
                <el-pagination background layout=" prev, pager, next,total,sizes"
                               v-model:current-page="pageNum"
                               v-model:page-size="pageSize"
                               :page-sizes="[1, 2,5]"
                               @size-change="load"
                               @current-change="load"
                               :total="total"/>
            </div>



 const total = ref(0)
    const pageNum = ref(1)
    const pageSize = ref(1)


//请求后台数据 load去加载表格里
    const load = () => {
        //pageNum => start
        let start = (pageNum.value - 1) * pageSize.value
        request.get('/user/selectPage?name=' + name.value + '&start=' + start + '&pageSize=' + pageSize.value).then(res => {
            //res.data就是后台返回的数组
            state.tableData = res.data.list
            total.value = res.data.total
        })
    }
    load();

新增数据

UserController

@PostMapping("save")
    public Result save(@RequestBody User user){
        userMapper.save(user);
        return Result.success();
    }

UserMapper

@Insert("insert into t_user(name,date,address,user_no) values(#{name},#{date},#{address},#{userNo})")
    void save(User user);
<el-button type="primary" @click="handleAdd">新增数据</el-button>



<!--弹窗-->
        <el-dialog v-model="dialogFormVisible" title="信息" width="40%">
            <el-form :model="state.form" label-width="100px" style="padding-right:30px ">
                <el-form-item label="日期">
                    <el-date-picker v-model="state.form.date" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" style="width:100%"/>
                </el-form-item>
                <el-form-item label="姓名">
                    <el-input v-model="state.form.name" autocomplete="off"/>
                </el-form-item>
                <el-form-item label="地址">
                    <el-input v-model="state.form.address" autocomplete="off"/>
                </el-form-item>
                <el-form-item label="编号">
                    <el-input v-model="state.form.userNo" autocomplete="off"/>
                </el-form-item>
            </el-form>
            <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取消</el-button>
        <el-button type="primary" @click="save">确认</el-button>
      </span>
            </template>
        </el-dialog>


import {ElMessage} from "element-plus";


//新增数据 设置新的空的绑值对象 打开弹窗
    const handleAdd = () => {
        state.form = {}
        //打开弹窗
        dialogFormVisible.value = true
    }




//保存数据,把数据插入到tableData中,并刷新页面,弹窗关闭
    const save = () => {
        request.post('/user/save', state.form).then(res => {
            if (res.code === '200') {
                ElMessage.success('操作成功')
                dialogFormVisible.value = false
            } else {
                ElMessage.error(res.msg)
            }
        })
    }

编辑数据

UserController

@PutMapping("/update")
    public Result update(@RequestBody User user){
        userMapper.update(user);
        return Result.success();
    }

UserMapper

 @Update("update t_user set name = #{name},date = #{date},address = #{address},user_no = #{userNo} where id = #{id}")
    void update(User user);
//保存数据,把数据插入到tableData中,并刷新页面,弹窗关闭
    const save = () => {
        request({
            url: state.form.id ? '/user/update' : '/user/save',
            method: state.form.id ? 'PUT' : 'POST',
            data: state.form
        }).then(res => {
            if (res.code === '200') {
                ElMessage.success('操作成功')
                //调用查询方法,更新表格数据
                load()
                dialogFormVisible.value = false
            } else {
                ElMessage.error(res.msg)
            }
        })
    }

删除数据

UserController

@DeleteMapping("/delete")
    public Result delete(@RequestParam Integer id){
        userMapper.delete(id);
        return Result.success();
    }

UserMapper

    @Delete("delete from t_user where id = #{id}")
    void delete(Integer id);
 <el-button link type="danger" size="default" @click.prevent="remove(scope.row.id)">删除</el-button>



//删除数据 从index位置开始,删除一行即可
    const remove = (id) => {
        request.delete('/user/delete?id=' + id).then(res => {
            if (res.code === '200') {
                ElMessage.success('操作成功')
                //调用查询方法,更新表格数据
                load()
                dialogFormVisible.value = false
            } else {
                ElMessage.error(res.msg)
            }
        })
    }

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

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

相关文章

JavaWeb网络安全-弱口令自查

1.背景 项目中&#xff0c;创建用户没有校验密码强度&#xff0c;弱口令会导致一系列安全问题。然而用户表数据加密加盐&#xff0c;我们无法直接知道哪些用户使用了弱口令。 网络安全的首要步骤是检查系统中的弱口令。一旦网络攻击者获取了我们的弱口令并成功登录系统&#x…

利用MAP函数计算一系类数字的平方

1 问题 如何使用map函数计算一系列数字平方。 2 方法 通过使用定义函数&#xff08;add&#xff09;&#xff0c;创建一个list&#xff0c;包含这一系列数字&#xff0c;再使用map函数。 通过实验、实践等证明提出的方法是有效的&#xff0c;是能够解决开头提出的问题。 代码清…

linux更改 docker 为非 root 用户运行

首先创建docker用户组&#xff0c;如果docker用户组存在可以忽略 sudo groupadd docker把用户添加进docker组中 sudo gpasswd -a ${user} docker使用普通账户重启docker sudo service docker restart使用root用户修改/var/run/docker.sock权限 sudo chmod arw /var/run/doc…

【Flink】Flink 中的时间和窗口之水位线(Watermark)

1. 时间语义 这里先介绍一下什么是时间语义&#xff0c;时间语义在Flink中是一种很重要的概念&#xff0c;下面介绍的水位线就是基于时间语义来讲的。 在Flink中我们提到的时间语义一般指的是事件时间和处理时间&#xff1a; 处理时间(Processing Time)&#xff0c;一般指执…

git介绍和安装/git,github,gitee,gitlab区别/git使用流程/ git常用命令/git忽略文件

git介绍和安装 # 版本管理软件-1 对代码版本进行管理---》首页功能完成---》课程功能完成---》可以回退到某个版本-2 协同开发--》多人开发--》合并代码---》可能会有冲突&#xff0c;解决冲突# 版本管理软件&#xff1a;主流就两个-git&#xff1a;现在用的最多&#xff08;学…

100天精通Golang(基础入门篇)——第10天:Go语言中的数组

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

python与adb无缝衔接控制手机(手机截屏实例)

目录 连接 常用操作 截图到PC端 使用pure-python-adb库可以实现python控制手机&#xff0c;支持input输入&#xff0c;支持shell命令&#xff0c;支持pull/push上传下载文件等。 安装库&#xff1a;pip install pure-python-adb 电脑端需要安装adb程序&#xff0c;在命令行…

技术管理第二板斧建团队-建机制

1.机制作用&#xff1f; 站在团队的角度&#xff0c;建机制尤为重要&#xff0c;你要通过机制让团队有统一的行为与规则&#xff0c;让组织像人一样&#xff0c;言行举止有规律可循。 听起来很容易&#xff0c;可要设计一个有效、持续发挥作用的机制并不简单。你不但清晰地认识…

10 Debug功能及方法简述

常见的Debug方法 原文链接&#xff1a;MDK5 Debug调试方法总结_keil5debug调试_小z不会累&#xff5e;的博客-CSDN博客 连接好硬件DAP之后&#xff0c;需要进行一些设置 开始仿真调试 Debug调试按钮分别对应的功能 按钮1->reset复位按钮按钮2->run按钮&#xff0c;程序运…

Keil V5版本开发STM32缺少PACKDFP解决办法 (Error Flash Downloadfailed-“Cortex-M7)

Keil V5版本开发STM32缺少PACKDFP解决办法 Error Flash Downloadfailed-“Cortex-M7 这个网址里有各个固件包的最新版&#xff0c;下载速度快&#xff0c;滋溜一下就下好啦 固件包

CISP-PTE-考前综合题记录

CISP-PTE-考前综合题记录 http://10.1.10.71/&#xff08;文件上传传不上去&#xff09; 获取key6 端口扫描只扫到80端口开放 输入用户名密码&#xff0c;抓包 对Authorization Basic的值进行base64解码&#xff0c;为爆破做准备 猜测用户名为admin,所有留下admin:这一段…

设计模式第15讲——模板模式(Template)

目录 一、什么是模板模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 OrderFood——抽象类&#xff08;Abstract&#xff09; 5.2 具体类&#xff08;Concrete Class&#xff09; 5.3 testTemplate 六、总结…

JMeter工具使用

1. Jmeter设置语言为简体中文 2. Jmeter添加线程组 3. Jmeter添加http请求 4. Jmeter添加数据统计结果 5. JMeterAddress Already in use 错误解决 windows本身提供的端口访问机制的问题。 Windows提供给 TCP/IP链接的端口为1024-5000&#xff0c;并且要四分钟来循环回收他们。…

PostgreSQL

一. PostgreSQL 简介 1 资料来源&#xff1a; 中文手册&#xff1a;http://www.postgres.cn/docs/14/index.html 知乎链接&#xff1a;https://www.zhihu.com/column/c_1452567507496689664 视频链接&#xff1a;https://www.bilibili.com/video/BV1uW4y1m7pD/?spm_id_frompa…

win下docker安装和使用

安装 下载安装包&#xff1a;https://docs.docker.com/desktop/install/windows-install/ 下载 Linux 内核更新包 适用于 x64 计算机的 WSL2 Linux 内核更新包 解决docker下载镜像速度慢问题 阿里云镜像加速器&#xff1a;https://阿里ID.mirror.aliyuncs.com 复制上面镜像…

轮廓检测,高斯模糊及功能

轮廓检测 一、实验介绍 1. 实验内容 本实验将学习轮廓检测及功能。 2. 实验要点 生成二进制图像来查找轮廓找到并画出轮廓轮廓特征边界矩形 3. 实验环境 Python 3.6.6numpymatplotlibcv2 二、实验步骤 1 导入资源并显示图像 import numpy as np import matplotlib.py…

rabbitmq第四课-RabbitMQ高可用集群架构详解以及生产环境最佳实践

一、如何保证RabbitMQ服务高可用 1、RabbitMQ如何保证消息安全 之前通过单机环境搭建起来的RabbitMQ服务有一个致命的问题&#xff0c;那就是服务不稳定的问题。如果只是单机RabbitMQ的服务崩溃了&#xff0c;那还好&#xff0c;大不了重启下服务就是了。 但是如果是服务器的…

MySQL 逻辑备份mysqldump

逻辑备份mysqldump MySQL 自带的逻辑备份工具。可以保证数据的一致性和服务的可用性原理是通过协议连接到 MySQL 数据库&#xff0c;将需要备份的数据查询出来&#xff0c;将查询出的数据转换成对应的 insert 语句&#xff0c;当我们需要还原这些数据时&#xff0c;只要执行这些…

红帽“背叛”开源:限制RHEL源码访问,突袭下游发行版

红帽决定停止公开提供其企业发行版 Red Hat Enterprise Linux (RHEL) 源代码。 从现在开始&#xff0c;CentOS Stream 将成为公共 RHEL 相关源代码发布的唯一仓库&#xff0c;付费客户和合作伙伴可通过 Red Hat Customer Portal 访问到源代码。 CentOS Stream 是由 Red Hat 公…

UNIX环境高级编程——网络IPC:套接字

16.1 引言 本章将考察不同计算机&#xff08;通过网络相连&#xff09;上的进程相互通信的机制&#xff1a;网络进程间通信&#xff08;network IPC&#xff09;。 16.2 套接字描述符 为创建一个套接字&#xff0c;调用socket函数&#xff1a; #include <sys/socket.h&g…