spring-boot 整合 前端框架 React 增删改查(附源码)

news/2024/7/15 18:08:17 标签: 前端框架, react.js, 前端, springboot

在这里插入图片描述

看了很多 关于 SpringBoot 增删改查 的文章 ,但是 React 前端框架>前端框架这块似乎没什么人玩,一般都是Vue进行整合 ,所以想写一篇关于 React 整合 SpringBoot 增删改查的项目

在这里插入图片描述

React 学习区域

  • React中文教程: https://www.php.cn/doc/react/tutorial/tutorial.html

  • React 社区: https://www.php.cn/doc/react/tutorial/tutorial.html

  • 其他React技术社区 : https://www.duidaima.com/Group/Category/React

搭建环境

  • 导入依赖

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-text</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>

这里我们使用的Spring Data JPA 来作为持久层, 当然你也可以使用MyBATIS ,或者其他方案

为什么选择 JPA

因为JPA ,他可以自动根据实体类进行生成表

  • 配置对应的数据库 连接

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/react
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

在这里插入图片描述

  • 编写实体类
import lombok.*;
import lombok.experimental.Accessors;

import javax.persistence.*;

@Table(name = "t_user")
@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}

  • 编写 Dao层(Mapper)

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserDao extends JpaRepository<User,Long> {


}

大家这里可以 把 ddl-auto : create
在这里插入图片描述

前端环境

  • 使用create-react-app创建react应用

xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目
包含了所有需要的配置(语法检查、jsx编译、devServer…)
下载好了所有相关的依赖
可以直接运行一个简单效果
react提供了一个用于创建react项目的脚手架库: create-react-app
项目的整体技术架构为: react + webpack + es6 + eslint
使用脚手架开发的项目的特点: 模块化, 组件化, 工程化
1.2. 创建项目并启动

第一步,全局安装:

npm install -g create-react-app

第二步,切换到想创项目的目录,使用命令:

create-react-app hello-react

第三步,进入项目文件夹:

cd hello-react

第四步,启动项目:

npm start

React 脚手架项目结构

public ---- 静态资源文件夹
	favicon.icon ------ 网站页签图标
	index.html -------- 主页面
	logo192.png ------- logo图
	logo512.png ------- logo图
	manifest.json ----- 应用加壳的配置文件
	robots.txt -------- 爬虫协议文件
src ---- 源码文件夹
	App.css -------- App组件的样式
	App.js --------- App组件
	App.test.js ---- 用于给App做测试
	index.css ------ 样式
	index.js ------- 入口文件
	logo.svg ------- logo图
	reportWebVitals.js
		--- 页面性能分析文件(需要web-vitals库的支持)
	setupTests.js
		---- 组件单元测试的文件(需要jest-dom库的支持)

Index.js 是入口文件

import React from 'react';
import ReactDOM from 'react-dom';
import 'bootstrap/dist/css/bootstrap.min.css'


import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));



import React, {Component} from 'react';
import axios from 'axios'
import './App.css'

class App extends Component {

    constructor(props) {
        super(props);
        this.state = {
            id:'',
            name:'',
            list:[]
        }
    }

    render() {
        return (
            <div className="container-fluid" style={{marginTop: '20px'}}>
                <div className="row">
                    <div className="col-xs-4 col-xs-offset-1">
                        <table className="table table-bordered">
                            <thead>
                            <tr>
                                <th>ID</th>
                                <th>用户名</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {
                                this.state.list.map(item=>{
                                    return (
                                        <tr key={item.id}>
                                            <td>{item.id}</td>
                                            <td>{item.name}</td>
                                            <td>
                                                <button className="btn btn-primary" onClick={()=>{this.setState({id:item.id,name:item.name})}}>修改</button>
                                                <button className="btn btn-danger" style={{marginLeft:'5px'}} onClick={()=>{this.deleteItem(item)}}>删除</button>
                                            </td>
                                        </tr>
                                    )
                                })
                            }
                            </tbody>
                        </table>
                    </div>
                    <div className="col-xs-3 col-xs-offset-1">
                        <form className="form-horizontal">
                            <div className="form-group">
                                <label htmlFor="name" className="col-xs-3">用户名</label>
                                <div className="col-xs-8">
                                    <input type="text" id="name" className="form-control" value={this.state.name} onChange={(e)=>{this.setState({name:e.target.value})}}/>
                                </div>

                            </div>
                            <div className="form-group">
                                <div className="col-sm-offset-2 col-sm-10">
                                    <button className="btn btn-default" onClick={this.handleFormSubmit}>提交</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>

            </div>
        );
    }

    componentDidMount(){
        this.query();
    }

    query = () => {
        axios.get('/user').then(({data})=>{
            this.setState({
                list:data
            });
        })
    }
    deleteItem = (item) => {
        axios.delete(`/user/${item.id}`).then(({data})=>{
            console.log(data);
            this.query();
        })
    }

    handleFormSubmit = (e) => {
       e.preventDefault();
       if(this.state.name != ''){
            axios.post('/user',{id:!this.state.id?'':this.state.id,name:this.state.name}).then(({data})=>{
                this.setState({
                    id:'',
                    name:''
                });
                this.query();
            })
       }
    }
}

export default App;

  • 前端源码 : https://github.com/jaywhen/springboot-react-crud-frontend
  • 后端源码: https://github.com/jaywhen/springboot-react-crud-backend

http://www.niftyadmin.cn/n/81248.html

相关文章

Hadoop HDFS的主要架构与读写文件

一、Hadoop HDFS的架构 HDFS&#xff1a;Hadoop Distributed File System&#xff0c;分布式文件系统 &#xff11;&#xff0c;NameNode 存储文件的metadata&#xff0c;运行时所有数据都保存到内存&#xff0c;整个HDFS可存储的文件数受限于NameNode的内存大小一个Block在…

2023最新网络工程师面试大全,全都答得上offer绝对拿到手软

一、目录 TCP和UDP都可以实现客户端/服务端通信&#xff0c;这两个协议有何区别&#xff1f; 是第几层的协议&#xff0c;其作用是什么&#xff1f; 请说一下FTP&#xff0c;SSH&#xff0c;TELNET&#xff0c;DNS&#xff0c;HTTP&#xff0c;HTTPS&#xff0c;SMTP协议的端口…

C/C++面试汇总---C++语法篇

1、C和C的区别 1&#xff09;C是面向过程的语言&#xff0c;是一个结构化的语言&#xff0c;考虑如何通过一个过程对输入进行处理得到输出&#xff1b;C是面向对象的语言&#xff0c;主要特征是“封装、继承和多态”。封装隐藏了实现细节&#xff0c;使得代码模块化&#xff1…

C++【类与对象】

文章目录类与对象&#xff08;1&#xff09;类与对象一1.0.面向过程和面向对象初步认识1.1.类的引入1.2.类的定义1.3.类的访问限定符及封装1.4.类的作用域1.5.类的实例化1.6.类的对象大小的计算1.8.类成员函数的this指针&#xff08;2&#xff09;类与对象二2.0类的6个默认成员…

华为OD机试题 - 数据分类(JavaScript)| 代码+思路+重要知识点

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…

Linux基础-学会使用命令帮助

概述使用 whatis使用 man查看命令程序路径 which总结参考资料概述Linux 命令及其参数繁多&#xff0c;大多数人都是无法记住全部功能和具体参数意思的。在 linux 终端&#xff0c;面对命令不知道怎么用&#xff0c;或不记得命令的拼写及参数时&#xff0c;我们需要求助于系统的…

统一观测丨使用 Prometheus 监控云原生网关,我们该关注哪些指标?

作者&#xff1a; 如葑 Metrics 指标在可观测体系的应用 可观测体系的概念由来已有&#xff0c;随着分布式微服务迅猛发展&#xff0c;对可观测体系的依赖也越来越深&#xff0c;可观测体系通常包括 Metrics、Tracing、Logging 三类数据&#xff0c;再外加报警机制&#xff0…

全网超详细的VMware虚拟机安装Kali Linux系统以及首次启动Kali Linux系统的注意事项

文章目录1. 简述Kali Linux2. 下载Kali Linux的镜像文件3. 安装Kali Linux4. 首次启动Kali Linux5. 其他方法安装Kali Linux1. 简述Kali Linux 引入知乎上的一句话&#xff0c;如下所示&#xff1a; 如果你听到一个 13 岁的黑客吹嘘他是多么的牛逼&#xff0c;是有可能的&…