【开发篇】10分钟快速上手spring boot+react登录前后端分离

10 篇文章 2 订阅
订阅专栏

【开发篇】10分钟快速上手spring boot+react登录前后端分离

之前的预备知识:

  • 10分钟快速上手git与github
  • 10分钟快速上手springboot
  • 10分钟快速springboot+react前后端分离
  • 10分钟快速上手springboot+mybatis增删改查

本次将带来前后端分离的spring boot+react的登录demo。

接下来,让我们在学习的海洋中畅游吧!!!

一、前后端分离

1.1 前后端分离

在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的显示,前端与后端耦合度很高。

1.2 前后端分离

在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。至于前端用户看到的效果,从后端请求的数据如何加载到前后端中,都有前端自己决定,网页有网页的处理方法,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。

二、后端设计

2.1 数据库表设计

2.2 技术

  • spring boot
  • mybatis

2.3 项目结构

1.entity

package com.lcz.login.entity;

/**
 * @author : codingchao
 * @date : 2020-08-16 14:02
 * @Description:
 **/
public class User {
    private int id;
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
package com.lcz.login.entity;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * @author : codingchao
 * @date : 2020-08-16 14:15
 * @Description:
 **/
public class Result<T>  {
    // 错误码
    private Integer code;
    // 提示信息
    private String msg;
    // 具体内容
    private T data;

    public Integer getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

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

    public T getData() {
        return data;
    }

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

2.mapper

package com.lcz.login.mapper;

/**
 * @author : codingchao
 * @date : 2020-08-16 14:04
 * @Description:
 **/

import com.lcz.login.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface  UserMapper {
    // 通过账户名来查询密码
    User findUserByName(String username);
}

3.service

package com.lcz.login.service;

import com.lcz.login.entity.User;
import com.lcz.login.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author : codingchao
 * @date : 2020-08-16 14:07
 * @Description:
 **/
public interface UserSerice {
    public User findUserByName(String name);
}

4.service/impl

package com.lcz.login.service.impl;

import com.lcz.login.entity.Result;
import com.lcz.login.entity.User;
import com.lcz.login.mapper.UserMapper;
import com.lcz.login.service.UserSerice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author : codingchao
 * @date : 2020-08-16 14:09
 * @Description:
 **/
@Service
public class UserServiceImpl implements UserSerice {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User findUserByName(String name) {
        User user = userMapper.findUserByName(name);

        return user;
    }
}

5.controller

package com.lcz.login.controller;

import com.lcz.login.entity.Result;
import com.lcz.login.entity.User;
import com.lcz.login.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author : codingchao
 * @date : 2020-08-16 14:10
 * @Description:
 **/
@RestController
@RequestMapping(value="/crud",method = {RequestMethod.GET,RequestMethod.POST})
public class UserController {

    @Autowired
    private UserServiceImpl userService;

    @PostMapping("/listUserByName")
    public Result<User> findUserByName(@RequestParam("username")String username,
                                     @RequestParam("password")String password){
        User user = userService.findUserByName(username);
        Result result = new Result();
        if (user.getPassword().equals(password)){
            result.setCode(0);
            result.setMsg("成功");
            result.setData(user);
        }else{
            result.setCode(-1);
            result.setMsg("失败");
            result.setData("");
        }
        return result;
    }
}

6.resource/mapper/UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.lcz.login.mapper.UserMapper">
    <resultMap id="result" type="com.lcz.login.entity.User">
        <result property="username" column="username"/>
        <result property="password" column="password"/>
    </resultMap>


    <select id="findUserByName" resultMap="result">
        SELECT * FROM user where username=#{username}
    </select>
</mapper>

其余的配置,可参考 [开发篇]10分钟快速上手spring
boot+mybatis增删改查

三、前端设计

前端在一个bootstrap开源框架上进行操作的。

3.1 技术

  • React
  • Bootstrap
  • font-awesome

3.2 功能实现

登录界面输入账号密码->发送请求到后端进行验证->验证成功进入主页->选择退出账号->回到登录页面

3.3 重要技术

1.跨域请求

  • 前端的端口在localhost:3000
  • 后端的端口在localhost:8081

属于跨域请求,本次在前端通过http-proxy-middleware模块来实现跨域请求

在src下新建setupProxy.js

// 跨域请求

const {createProxyMiddleware} = require('http-proxy-middleware');



module.exports = function (app) {

  app.use(createProxyMiddleware('/listUserByName', {target: 'http://localhost:8081/crud/', changeOrigin: true}))

} 

2.LocalStoage存取

//localstorage读取

  setStorage(name,data){

    let dataType = typeof data;
    
    // json
    
    if(dataType === 'object'){
    
      window.localStorage.setItem(name,JSON.stringify(data));
    
    }else if( ['number','string','boolean'].indexOf(dataType) >=0 ){
    
      window.localStorage.setItem(name,data);
    
    }else{
    
      alert("该类型不能用于本地存储");
    
    }

  }


  getStorage(name){

    let data = window.localStorage.getItem(name);
    
    if(data){
    
      return JSON.parse(data);
    
    }else{
    
      return '';
    
    }

  }

  removeStorage(name){

    window.localStorage.removeItem(name);

  }

3.登录

  • 表单验证在前端,看账号和密码是否为空以及是否满足要求
  • 回车提交表单请求
  • 登录成功之后将用户存入localstorage
  • 主页界面读取localstorage的信息并显示用户名
request(param) {
        return new Promise((resolve, reject) => {
            $.ajax({
                type: param.type || 'get',
                url: param.url || '',
                dataType: param.dataType || 'json',
                data: param.data || null,
                success: res => {
                    resolve(res);
                },
                error: err => {
                    resolve(err);
                }
            })
        })
    }
    onSubmit = () => {
        let loginInfo = {
            username: this.state.username,
            password: this.state.password,
            redirect : '/'
        };
    // 表单验证
    let checkResult = _mm.checkLoginInfo(loginInfo);

    // console.log(checkResult);
    if (checkResult.status) {
        _mm.request({
            type : 'post',
            url: '/listUserByName',
            data:{
                username: this.state.username,
                password: this.state.password
            }
        }).then((res) => {
            if(res.code==-1){
                _mm.errorTips("账号密码错误");
            }else if(res.code==0){
                _mm.setStorage('userInfo',res);
                this.props.history.push(this.state.redirect);
            }
           
        }, (errMsg) => {
            console.log(errMsg);
        })
    } else {
        _mm.errorTips(checkResult.msg);
    }
}

4.退出

  • 点击退出,删除localstorage中的信息
  • 游览器获得不到localstorage信息,则进入登录界面
// 这是退出登录
    onLogout = () => {
        _mm.removeStorage('userInfo');
        window.location.href = ("/login");
    }
    // 验证是否有登录信息
    componentWillMount(){
        if(_mm.getStorage("userInfo") == ''){
            window.location.href = ("/login");
        }
    }

好了,本次学习的旅程,到此结束!!!

SpringBootReact集成
程序员光剑
01-21 1237
1.背景介绍 1. 背景介绍 Spring BootReact 是两个非常受欢迎的开源框架,它们各自在不同领域取得了显著的成功。Spring Boot 是一个用于构建新 Spring 应用的优秀起点,而 React 是一个用于构建用户界面的 JavaScript 库。在现代 Web 开发中,这两个框架的组合是非常常见的,因为它们可以为开发人员提供强大的功能和灵活性。 在本文中,我们将讨...
springboot+react前后端分离项目.zip
07-25
基于springreact开发前后端分离项目,后台使用springboot+hibernate+security等技术,前端使用react+axios+antd等框架,数据库使用mysql5.5+。项目已经开发了后台管理模块,包括用户、角色、组织、菜单、字典、系统参数、操作日志等模块,并整合了微信小程序、百度ocr等资源。可直接用于项目开发使用,也可以用于技术学习。
SpringBoot2 和 React 全栈开发实用指南(一)
最新发布
龙哥盟
07-23 1000
原文:zh.annas-archive.org/md5/B5164CAFF262E48113020BA46AD77AF2 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 在本书中,我们将使用 Spring Boot 2.0 和 React 创建一个现代 Web 应用程序。我们将从后端开始,使用 Spring Boot 和 MariaDB 开发 RESTful Web 服务。我们还将保护后端并为其创建单元测试。前端将使用 React JavaScript 库开发。将使用不同的第三方 React
开发10分快速spring boot+react前后端分离
Mind_programmonkey的博客
08-07 1万+
开发10分快速上手spring boot+react后端分离教程 我又又回来了,本次快速建立一个spring boot+react前后端的hello world的demo!!! 1.前后端分离 前后端分离(解耦)的核心思想:前端HTML页面通过Ajax调用后端的RestFul API并使用JSON数据进行交互。 1.1 传统的MVC设计流程 传统的MVC的设计模式: 即Model-View-Controller 即模型-视图-控制器 MVC设计流程: 模型和视图通过控制器来进行黏合,例如,用户发送
关于springbootreact前后端分离
erose的博客
04-29 403
@CrossOrigin(origins = {“http://localhost:3000”},maxAge = 3600) 跨域支持 @CrossOrigin 注解 origins : 允许可访问的域列表;* 表示允许所有域。 maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。 allowCredentials=“true”:否允许cookie随请求发送。 SWR swr接受的数据类型必须为json格式。 注意:springboot中,实例化一个类,然后return这个类,springb
spring-boot项目二:Spring Boot整合react-app实现前后端分离
heshengfu1211的博客
06-20 9668
前言:目前web开发越来越采用前后端分离开发模式,使从事后台和前端开发的程序员分别精通于自己的方向,同时也有效提高团队的工作效率。后台接口主要返回Json格式的数据,无需按照Spring-MVC模式把渲染视图的工作也交给后台完成;而前端比较流行的三框架有Vue,React和Angular,它们比起传统的js都具有显著的优势。其中React采用虚拟dom节点渲染视图,即每次dom节点发生变化只渲染...
(十六) React整合SpringBoot
Felix的小黑板
09-26 4552
目录背景正文build 前端build 后端build完后前后端目录结构疑惑消除完善功能总结 背景 之前所做的一个项目是一个完全的前后端分离的项目, 所采用技术或者组件分别如下: 前端: React 路由以及数据请求: Nginx 后端: SpringBoot 正常情况的开发一般是一个这样的流程: 前端通过npm进行依赖的管理, 代码编写完之后直接进行前端打包 后端通过maven进行管理,......
基于Spring Boot + Vue 前后端分离个人博客网站设计
Lv Zejiang
06-17 9396
个人博客网站摘要一、绪论1.1 课题背景、目的、意义1.2 国内外研究现状1.3 技术介绍1.3.1 Spring Boot1.3.2 MyBatisPlus1.3.3 Shiro1.3.4 Redis1.3.5 Jwt1.3.6 Vue1.3.7 Element-ui1.3.8 Axios1.3.9 前后端分离二、可行性分析2.1 技术可行性分析2.2 时间和资源可行性三、需求分析3.1 用户分析3.2 功能需求分析3.3 流程分析四、结构设计4.1 实体e-r图4.2 数据库设计五、详细设计六、系统测试
创建ReactSpringboot前后端分离项目实践系列开坑
ariso_software的博客
12-17 467
创建spring boot项目工程目录并创建主界面也是流行了几年的技术。 虽然 React 和 Angular 已经流行了很多年,但目前仍然是最流行的。 尽管较新的 Vue正在取得进展,但它们与前两者仍有一定差距。 那么我们该如何选择呢? 我推荐使用React.js,主要是因为它更容易学,社区大,生态完整,工具多样。关键是工作机会多。
Oryx - 基于 Spring Boot 构建 的 Java Web 平台企业级前后端分离应用快速开发框架,适合中.zip
03-23
Oryx 是一个基于 Spring Boot 开发的企业级 Java Web 应用框架,特别适合构建前后端分离的现代化应用程序。Spring Boot 是一个用于简化 Spring 应用程序初始搭建以及开发过程的框架,它通过预配置的特性,使得开发者...
Spring Boot+Vue前后端分离商城实战(十二)Vue 前端路由介绍
程序员有故事
05-30 630
Vue-Router 是什么 简介 单页面开发模式的路由全权交由前端来控制,这里的路由不是我们说的路由器等硬件设备,它是前端的路径管理器。而 Vue-Router 是官方提供的路由插件,市面上也不乏路由管理插件,但是只有 Vue-Router 能和 Vue 深度集成完美搭配。 单页面与传统页面跳转的区别 单页面 Vue 的单页面开发模式是基于组件和路由的配合,所有的页面均可视为组件,路由控制着访问路径,而每个路径映射一个组件。在单页模式中使用 a 标签做路由跳转是行不通的,因为本质上单页模式就只有一个
react-and-spring:一个带有React前端的Spring Boot项目示例
05-02
带有Create React App和Spring Boot的Webapp 使用Spring Boot开发Spring应用程序可以节省大量时间。 它可以使您快速启动并运行,并在您开始投入生产并开始向应用程序发布增量更新时继续简化您的生活。 Create React App对您的React前端做同样的事情。 它通过将使React前端正常工作所需的所有东西组合在一起来加快初始阶段,并通过启用热重载来缩短反馈循环。 这样,您就可以保存文件,并且更改将立即在浏览器中可见。 本教程向您展示如何将Create React App与Spring Boot结合使用,为您提供一个要部署的jar文件。 目标: 轻松部署到测试和生产环境 前端和后端在一个罐子里 使用Create React App环境保持收益,包括: 热装 内置从ES6到ES5的编译器 优化生产结构 入门 首先,使用创建一个sprin
springboot+scala+react
11-27
springboot中用scala编写,实现数据库操作和restapi,并整合react项目
Spring boot2.0和React 全栈开发 2018年6月最新版本
06-25
Full-Stack.Development.with.Spring.5.and.React.1789138086
react_board:使用SpringBoot + ReactJS开发板项目
03-05
使用SpringBootreact_board 概述 为这个项目做准备 JDK:1.8 IDE:Eclipse 后端框架:带有JPA的SpringBoot 4.0 前端框架:ReactJS,React-Route-Dom(页面检查) 交流每台服务器:Axios 设计包:BootStrap 数据库:MySql 5.7 目前的进展(03.02.2021) 董事会名单 板写,读,修改 板文件上传(使用Axios,MultiPart) 发展时间表 董事会文件的数据库系统构建(值对象/数据库表设计) 同时插入Board Files数据文件上传 插入董事会信息数据和董事会文件数据 用户帐户系统构建(TBD)
SpringBoot框架,前后端分离写的新闻管理系统
10-22
SpringBoot框架,前后端分离写的新闻管理系统,采用Ajax传输数据
任务书(基于Spring Boot+Vue的大学生心里健康咨询平台).docx
06-27
### 任务书(基于Spring Boot+Vue的大学生心里健康咨询平台) #### 一、背景与研究目的 在当前社会环境中,随着生活节奏的加快及竞争压力的增大,人们的心理健康问题日益受到重视。尤其是大学生群体,面临着学业、...
一步步带你用react+spring boot搭建后台之二(登录与首页)
wh_xia_jun的专栏
12-01 2609
react+spring boot搭建后台
springboot+react实现前后端交互
热门推荐
Jarvis_F的博客
01-08 1万+
一、搭建springboot后台 1. 创建一个Springboot项目, 然后导入pom依赖, 本着一切从简的原则,如果不连接数据库的话,有个spring-boot-starter-web的依赖就够用了。 <!--mybatis--> <dependency> <groupId>org.mybat...
写文章

热门文章

  • win10下pytorch-gpu安装以及CUDA详细安装过程 136294
  • 卷积神经网络交通标志识别 83860
  • 【实战】如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列) 48963
  • 【实战】javaweb学生信息管理系统 41364
  • 数据库 部分函数依赖 完全函数依赖 传递函数依赖 第一范式、第二范式、第三范式、BCNF范式区别 36546

分类专栏

  • 毕设项目 1篇
  • Spring封神之路 42篇
  • 年终总结 1篇
  • 读书笔记
  • 人工智能 机器学习 深度学习 76篇
  • 项目篇 71篇
  • 开发篇 10篇
  • 计算机视觉 23篇
  • 面试篇 199篇
  • LeetCode刷题篇 310篇
  • 工具篇 17篇
  • 玩转数据结构与算法 40篇

最新评论

  • 【人工智能项目】LSTM实现数据预测分类实验

    jfbbjf: units=len(df['Label'].unique()),目标y的值的类别数量,就是几分类

  • 【人工智能项目】LSTM实现数据预测分类实验

    jfbbjf: 学习了,感谢作者!但units=8这里最好改为 units=len(df['Label'].unique());1755最好改为df.shape[1]。尽量用变量代替常量,增加代码的通用性。

  • 【人工智能项目】LSTM实现数据预测分类实验

    jfbbjf: 可改为:y_pred = model.predict(X_test) predict_y = np.argmax(y_pred,axis=1)

  • 【人工智能项目】深度学习实现汉字书法识别

    摆渡。: 请问兄弟你拿到数据集了吗

  • Urbansound8k声音分类深度学习实战

    tg-t: 这也不是卷积网络啊

大家在看

  • Java基础:I/O流 335
  • harbor私有镜像仓库,搭建及管理
  • C语言结构体 1
  • 构建高可用和高防御力的云服务架构第一部分:深入解析DDoS高防(1/5)
  • 11----mtk芯片专用解锁工具 解除FRP 很小的工具 去除屏幕锁 免授权等等 工具预览与步骤解析 1

最新文章

  • 【毕设】基于深度学习的中文情感分析系统,助力毕设完美收官
  • 【SpringBoot之旅】手把手教你Swagger接口文档神器使用
  • 【RPC学习之旅】手把手实现一个RPC框架
2024年1篇
2022年12篇
2021年355篇
2020年273篇
2019年170篇
2018年153篇
2017年162篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳SEO优化公司汕尾百度网站优化南城电子网站优化哪个品牌好网站的优化过程虎林网站推广优化外贸网站怎么优化英语淮安网站优化方案东莞首页网站关键词优化公司黔江优化网站定制宁陵专业网站优化推广电话开封鹤壁网站优化网站图片多 如何优化高新区网站优化公司联系方式优化网站排名服务网站优化之网站生成静态页面山南徐州网站建站优化邯郸五金行业网站优化推广汕头优化网站方法辽宁优化网站公司有效网站优化及营销方案东莞网站权重优化漯河网站关键词优化工具管城回族区信息化网站搭建优化中牟一站式网站搭建优化网站优化排名就靠它了如何优化自己网站打开速度镇平县网站优化排名承德专业网站优化哪家公司好徐汇区官方网站优化定制方案余干网站优化.网站结构优化建议歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化