Vue + Spring Boot 项目实战(四):前后端结合测试(登录页面开发)

前面我们已经完成了前端项目 DEMO 的构建,这一篇文章主要目的如下:
①打通前后端之间的联系,为接下来的开发打下基础
②登录页面的开发(无数据库情况下)

文章目录

  • 一、后端项目创建
    • 1.1. 项目/包名称
    • 1.2. web依赖
    • 1.3. 运行 Application.java
  • 二、登录页面开发
    • 2.1. 关于前后端结合
    • 2.2. 前端页面开发
      • 2.2.1. Login.vue
      • 2.2.2. AppIndex.vue
    • 2.3. 前端相关配置
    • 2.4. 配置页面路由
    • 2.5. 跨域支持
    • 2.6. 运行项目
  • 三、后端开发
    • 3.1. User 类
    • 3.2. Result 类
    • 3.3. LoginController
    • 3.4. 修改端口
    • 3.5. 测试项目

一、后端项目创建

在 IDEA 中新建项目,选择 Spring Initializr,点击 Next
在这里插入图片描述

1.1. 项目/包名称

在这里插入图片描述

1.2. web依赖

在这里插入图片描述
最后是项目名称和项目地址,Finish 后等待项目自动初始化即可。
在这里插入图片描述
在这里插入图片描述

1.3. 运行 Application.java

在这里插入图片描述

访问 http://localhost:8080,发现弹出了错误页面,OK,这就对了,因为我们啥页面都没做啊。
在这里插入图片描述

二、登录页面开发

2.1. 关于前后端结合

注意我们的项目是前后端分离的,这里的结合意思不是就不分离了,是如何把这俩分离的项目串起来用。

前面提到过前后端分离的意思是前后端之间通过 RESTful API 传递 JSON 数据进行交流。不同于 JSP 之类,后端是不涉及页面本身的内容的。

在开发的时候,前端用前端的服务器(Ngix),后端用后端的服务器(Tomcat),当我开发前端内容的时候,可以把前端的请求通过前端服务器转发给后端(称为反向代理),这样就能实时观察结果,并且不需要知道后端怎么实现,而只需要知道接口提供的功能,两边的开发人员(两个我)就可以各司其职啦。

艾玛做一个完整的教程真不容易,遇到的每个知识点感觉都能讲一堆。上次的文章被一位老哥反问是不是太着急了,也不知道是什么意思,我自己反思可能是讲的不够细吧,这里我就再啰嗦一下讲两句 正向代理 和 反向代理。

正向代理就是,你要访问一个网站,比如“谷弟弟”,然后发现访问不到,于是你访问了一个能访问到“谷弟弟”的代理服务器,让它帮你拿到你想浏览的页面。

反向代理就是,你访问了一个网站,你以为它是“谷弟弟”,但其实它是“谷姐”,“谷姐”知道你其实是想找她弟,就取回“谷弟弟”的内容给你看。作为用户的你,是不知道有这个过程的,这么做是为了保护服务器,不暴露服务器的真实地址。

知乎上有张神图可以描述这两种过程
在这里插入图片描述

2.2. 前端页面开发

2.2.1. Login.vue

首先我们开发登录页面组件,右键 src\components 文件夹,New -> Vue Component,命名为 Login,如果没有 Vue Component 这个选项,可以选择新建一个 File,命名为 Login.vue 即可。
在这里插入图片描述
代码如下:

<template><div>用户名:&nbsp;<input type="text" v-model="loginForm.username" placeholder="请输入用户名"/><br><br>&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<input type="password" v-model="loginForm.password" placeholder="请输入密码"/><br><br><button v-on:click="login">登录</button></div>
</template><script>export default {name: 'Login',data () {return {loginForm: {username: '',password: ''},responseResult: []}},methods: {login () {this.$axios.post('/login', {username: this.loginForm.username,password: this.loginForm.password}).then(successResponse => {if (successResponse.data.code === 200) {this.$router.replace({path: '/index'})}}).catch(failResponse => {})}}
}
</script>

<template> 标签中随便写了一个登录的界面, methods 中定义了登录按钮的点击方法,即向后端 /login 接口发送数据,获得成功的响应后,页面跳转到 /index。因为之前我们设置了默认的 URL,所以请求实际上发到了 http://localhost:8443/api/login。

2.2.2. AppIndex.vue

右键 src\components 文件夹,新建一个 directory,命名为 home,再在 home 下新建一个 AppIndex.vue ,即首页组件,这里暂时不做过多开发,先随便写个 Hello World。

<template><div>Hello World!</div>
</template><script>
export default {name: 'AppIndex'
}
</script><style scoped></style>

2.3. 前端相关配置

设置反向代理
修改 src\main.js 代码如下:

import Vue from 'vue'
import App from './App'
import router from './router'
// 设置反向代理,前端请求默认发送到 http://localhost:8443/api
var axios = require('axios')
axios.defaults.baseURL = 'http://localhost:8443/api'
// 全局注册,之后可在其它组件中通过 this.$axios 发送数据
Vue.prototype.$axios = axios
Vue.config.productionTip = false/* eslint-disable no-new */
new Vue({el: '#app',router,components: {App},template: '<App/>'
})

因为使用了新的模块 axios,所以需要进入到项目文件夹中,执行 npm install --save axios,以安装这个模块。
在这里插入图片描述
在这里插入图片描述

2.4. 配置页面路由

修改 src\router\index.js 代码如下

import Vue from 'vue'
import Router from 'vue-router'
// 导入刚才编写的组件
import AppIndex from '@/components/home/AppIndex'
import Login from '@/components/Login'Vue.use(Router)export default new Router({routes: [// 下面是固定写法{path: '/login',name: 'Login',component: Login},{path: '/index',name: 'AppIndex',component: AppIndex}]
})

2.5. 跨域支持

为了让后端能够访问到前端的资源,需要配置跨域支持。

config\index.js 中,找到 proxyTable 位置,修改为以下内容

proxyTable: {'/api': {target: 'http://localhost:8443',changeOrigin: true,pathRewrite: {'^/api': ''}}}

注意如果不是在最后的位置,大括号外需要添加一个逗号。

2.6. 运行项目

执行 npm run dev,或双击 dev(start 也一样)脚本,查看登录页面效果。

注意地址是 localhost:8080/#/login ,中间有这个 # 是因为 Vue 的路由使用了 Hash 模式,是单页面应用的经典用法,但连尤雨溪本人都觉得不太好看,所以可以在路由配置中选择使用 History 模式,但会引发一些问题,需要在后端作出处理,所以这里先不更改,之后我单独写一篇关于这个的文章。

在这里插入图片描述
教程的内容简化了一下,我做的是这个样子的。。。
在这里插入图片描述
呃,总之这个页面的功能都是一样的。

三、后端开发

3.1. User 类

在 Login.vue 中,前端发送数据的代码段为

.post('/login', {username: this.loginForm.username,password: this.loginForm.password})

后端如何接收这个 JS 对象呢?我们很自然地想到在需要创建一个形式上一致的 Java 类。

打开我们的后端项目 wj,首先在 src\main\java\com\gblfy\wj 文件夹(就是你自己的 web 项目的包)下,新建一个 pojo 包(package),然后新建 User类,代码如下:

package com.gblfy.wj.pojo;public class User {int id;String username;String password;public int getId() {return id;}public void setId(int id) {this.id = id;}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;}
}

3.2. Result 类

Result 类是为了构造 response,主要是响应码。新建 result 包,创建 Result 类,代码如下:

package com.gblfy.wj.result;public class Result {//响应码private int code;public Result(int code) {this.code = code;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}}

实际上由于响应码是固定的,code 属性应该是一个枚举值,这里作了一些简化。

3.3. LoginController

Controller 是对响应进行处理的部分。这里我们设定账号是 admin,密码是 123456,分别与接收到的 User 类的 username 和 password 进行比较,根据结果返回不同的 Result,即不同的响应码。前端如果接收到成功的响应码(200),则跳转到 /index 页面。

在 wj 下新建 controller 包,新建 LoginController 类,代码如下:

package com.gblfy.wj.controller;import com.gblfy.wj.pojo.User;
import com.gblfy.wj.result.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.HtmlUtils;import java.util.Objects;@Controller
public class LoginController {@CrossOrigin@PostMapping(value = "api/login")@ResponseBodypublic Result login(@RequestBody User requestUser) {// 对 html 标签进行转义,防止 XSS 攻击String username = requestUser.getUsername();username = HtmlUtils.htmlEscape(username);if (!Objects.equals("admin", username) || !Objects.equals("123456", requestUser.getPassword())) {String message = "账号密码错误";System.out.println("test");return new Result(400);} else {return new Result(200);}}
}

最后,在 src\main\resources 文件夹下找到 application.yml文件配置端口,即加上 server.port=8443(初始应该是空白的,后期还要配置数据库等)

3.4. 修改端口

application.yml

server:port: 8443

3.5. 测试项目

同时运行前端和后端项目,访问 localhost:8080/#/login,输入用户名 admin,密码 123456
前端项目启动,端口8080:

npm run dev

在这里插入图片描述
后端项目启动端口8443:
在这里插入图片描述

看到此图说明前端项目启动成功:
在这里插入图片描述
看到此图说明后端项目启动成功:
在这里插入图片描述

测试:
输入用户名密码
admin/123456
如果账号密码正确,机会跳转index首页,如下图所示:
在这里插入图片描述
通过这篇文章,希望大家可以直观地感受到前后端分离项目中前后端的过程,之后的功能开发基本思路就是在后端开发 Controller,在前端开发不同的组件,这个顺序可以随意。实际的项目应该是前后端人员根据功能需求约定好接口,然后齐头并进,以提高开发效率。

接下来一段时间需要写的内容大概有以下这些:

  • 数据库的引入
  • 后端拦截器的配置
  • 部署项目时会遇到的一些坑
  • 使用 Element 辅助前端开发
  • 公共组件的开发

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

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

相关文章

探秘盒马机器人餐厅:老外目瞪口呆,90岁奶奶狂点赞

摘要&#xff1a; “菜来了。”一台小车停在餐桌旁&#xff0c;“张开”透明盒盖&#xff0c;瓮声瓮气的机器声提示取餐&#xff0c;它的“肚子”里&#xff0c;是一条热腾腾的清蒸鱼。 刚刚点菜的顾客兴奋地宣布&#xff0c;从下单到拿到菜&#xff0c;只花了11分钟。此时不到…

【漫画】AI小猪的一生

摘要&#xff1a; 6月7日&#xff0c;在上海云栖大会上&#xff0c;阿里云发布ET农业大脑。希望将人工智能与农业深入结合&#xff0c;目前已应用于生猪养殖、苹果及甜瓜种植&#xff0c;具备数字档案生成、全生命周期管理、智能农事分析、全链路溯源等功能。AI可以记录猪完整的…

oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)

Oracle数据库并行处理技术是数据库的一项核心技术&#xff0c;它使组织能够高效地管理和访问TB级的数据。如果不能提供高效的Oracle数据库并行处理技术&#xff0c;这些大型数据库(通常用于数据仓库但也越来越多地出现在业务系统中)将不会存在。简而言之&#xff0c;并行处理就…

tcp实时传输kafka数据_tcp怎么传输大数据

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":7,"count":7}]},"card":[{"des":"阿里云实时计算(Alibaba Cloud Realtime Com…

苹果手机数据线充不了电_手机充电器充不了电?其实4招就能解决

无论科技有多么发达&#xff0c;智能手机怎么样变化&#xff0c;至少就目前使用的智能手机上来看&#xff0c;使用手机就离不开"电"。哪怕是即将开售的折叠手机&#xff0c;也还是需要充电才能够正常使用。所以说&#xff0c;对于是手机而言&#xff0c;"有电&q…

Vue + Spring Boot 项目实战(五):数据库的引入

文章目录一、引入数据库1.安装数据库2. 安装mysql3. MySQL客户端4. .使用 Navicat 创建数据库与表二、使用数据库验证登录1.项目相关配置2.登录控制器2.1. User 类2.2. UserDAO2.3. UserService2.4. LoginController2.5. 测试一、引入数据库 1.安装数据库 官网地址&#xff1…

三招提升数据不平衡模型的性能(附python代码)

摘要&#xff1a; 本文的主要目标是处理数据不平衡问题。文中描述了用来克服数据不平衡问题的三种技术&#xff0c;分别是集成交叉验证、类别权重以及过大预测 。对于深度学习而言&#xff0c;数据集非常重要&#xff0c;但在实际项目中&#xff0c;或多或少会碰见数据不平衡问…

为什么说「中台」程序员将来会最值钱?

戳蓝字“CSDN云计算”关注我们哦&#xff01;今年在国内互联网公司中真的是很流行中台这个概念&#xff0c;不&#xff0c;是非常流行&#xff0c;是相当流行。作为程序员真的非常有必要了解一下。国内中台概念的由来国内中台的这个概念最早是由阿里巴巴提出来的。据说故事是这…

springboot导包显示不存在_BOOT项目依赖另外一个模块的包,开发的时候都正常,执行clean package打包成jar时却提示依赖的模块包不存在。...

我在service1模块里依赖了common模块&#xff0c;开发的时候包都能正常引用到&#xff0c;启动也能正常测试访问&#xff0c;可是奇怪的是&#xff0c;当我要打包成jar包时&#xff0c;就提示service1里依赖common的包都不存在&#xff0c;之前从没遇到过这种问题&#xff0c;有…

别把机器学习和人工智能搞混了!

摘要&#xff1a; 原来机器学习就是人工智能的一小部分啊&#xff01;智力就是理性思考和控制行为的能力。人类有智慧去思考和利用常识来作出决定。人工智能就是一个构建智能代理的研究领域&#xff0c;因此未来我们打造出来的人工智能可以像人一样思考并理性行事。图灵测试由艾…

varclus变量聚类对变量有啥要求_互助问答第208期:递归的双变量probit模型问题...

递归的双变量probit模型的stata命令是什么&#xff1f;比如二元被解释变量为y1&#xff0c;内生的二元变量为t1&#xff0c;x1和x2是其他外生协变量&#xff0c;iv1为内生二元解释变量的工具变量&#xff0c;那么&#xff0c;递归双变量probit模型是否可以写为&#xff1a;bipr…

Vue + Spring Boot 项目实战(六):使用 Element 辅助前端开发

文章目录一、安装并引入 Element1.安装 Element2.引入 Element二、优化登录页面1.使用 Form 组件2.添加样式3.设置背景4.完整代码之前我们实现了登录功能&#xff0c;但不得不说登录页面实在是太简陋了。在这个看脸的社会&#xff0c;如果代码写的烂&#xff0c;界面也做得不好…

不止 5G 和鸿蒙,华为最新大招,扔出 AI 计算核弹

戳蓝字“CSDN云计算”关注我们哦&#xff01;华为发布全世界最快AI产品&#xff0c;集成1024颗业内最强芯片&#xff0c;训练ResNet-50只需59.8秒。近日&#xff0c;华为全联接大会开幕&#xff0c;推出又一重量级AI产品Atlas900。此前接受外媒采访时&#xff0c;任正非就已经预…

阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”

摘要&#xff1a; 本文以安卓8终端为载体&#xff0c;介绍阿里安全潘多拉实验室成员研究并提出的内核空间镜像攻击利用技巧。文/图 阿里安全潘多拉实验室 团控编者按&#xff1a;团控&#xff0c;阿里安全潘多拉实验室研究人员&#xff0c;该实验室主要聚焦于移动安全领域&…

linux环境下企业基于域名访问的web于电子邮件服务器 论文,基于Linux平台的企业邮件服务器搭建...

我失骄杨君失柳&#xff0c;杨柳轻飏直上重霄九。得道多助&#xff0c;失道寡助。身后有余忘缩手&#xff0c;眼前无路想回头。鸟宿池边树&#xff0c;僧敲月下门。想当年&#xff0c;金戈铁马&#xff0c;气吞万里如虎。 本文由418133804贡献pdf文档可能在WAP端浏览体验不佳。…

python多进程写入mysql_Python实现 多进程导入CSV数据到 MySQL

前段时间帮同事处理了一个把 CSV 数据导入到 MySQL 的需求。两个很大的 CSV 文件&#xff0c; 分别有 3GB、2100 万条记录和 7GB、3500 万条记录。对于这个量级的数据&#xff0c;用简单的单进程&#xff0f;单线程导入 会耗时很久&#xff0c;最终用了多进程的方式来实现。具体…

【HBase从入门到精通系列】误删数据如何抢救?

摘要&#xff1a; 前言 有时候我们操作数据库的时候不小心误删数据&#xff0c;这时候如何找回&#xff1f;mysql里有binlog可以帮助我们恢复数据&#xff0c;但是没有开binlog也没有备份就尴尬了。如果是HBase&#xff0c;你没有做备份误删了又如何恢复呢&#xff1f; 数据保护…

神龙X-Dragon,这技术“范儿”如何?

戳蓝字“CSDN云计算”关注我们哦&#xff01;在CSDN总部会议室&#xff0c;阿晶首次见到了阿里云智能研究员、弹性计算技术负责人张献涛——这位不仅仅在阿里云智能内部&#xff0c;在业内也是响当当的虚拟化技术大牛。现在回想起来&#xff0c;当时聊了没两句&#xff0c;阿晶…

python 如何判断一个函数执行完成_三步搞定 Python 中的文件操作

当程序运行时&#xff0c;变量是保存数据的好方法&#xff0c;但变量、序列以及对象中存储的数据是暂时的&#xff0c;程序结束后就会丢失&#xff0c;如果希望程序结束后数据仍然保持&#xff0c;就需要将数据保存到文件中。Python 提供了内置的文件对象&#xff0c;以及对文件…

一位资深程序员大牛给予Java初学者的学习路线建议

摘要&#xff1a; java学习这一部分其实也算是今天的重点&#xff0c;这一部分用来回答很多群里的朋友所问过的问题&#xff0c;那就是我你是如何学习Java的&#xff0c;能不能给点建议&#xff1f;今天我是打算来点干货&#xff0c;因此咱们就不说一些学习方法和技巧了&#x…