该实战教程旨在指导开发者通过前后端分离的方式,搭建一个结合Vue.js前端框架和Spring Boot后端框架的登录系统。首先,从创建前端项目开始,利用Vue CLI快速生成项目结构,安装axios以实现HTTP请求功能,vue-router处理路由导航,less与less-loader用于样式预处理增强前端开发体验。完成基础设置后,开发者在IDEA中打开并继续构建前端页面,分别创建登录组件、首页组件以及配置路由视图。编写应用根组件,并设置主入口脚本,同时为解决跨域问题设置了反向代理。
接着进行后端项目的搭建,创建Spring Boot应用,配置服务器运行端口号,并启动服务确保能访问到后端首页。然后,为后端设计数据模型,创建用户实体类和结果实体类,以便于业务逻辑处理。最后,开发登录控制器以对接前端发送的登录请求。
整合测试阶段,分别启动前端login-vue项目和后端LoginDemo项目,前端调用后端接口进行登录验证,确保用户登录功能正常运作。此实战涵盖了项目初始化、模块安装、组件开发、路由配置、实体类设计、控制器编写及跨域解决方案等关键环节,有助于开发者理解和实践前后端交互开发流程。
用户名 密 码
Welcome to Vue 3 World~
// 引入Vue3以及新的vue-router import { createRouter, createWebHistory } from 'vue-router'; import Login from '@/components/LoginView.vue'; import Index from "@/components/IndexView.vue"; // 定义路由 const routes = [ { path: '/login', name: 'LoginView', component: Login }, { path: '/index', name: 'IndexView', component: Index } ]; // 创建路由器实例 const router = createRouter({ history: createWebHistory(), routes, }); // 导出全局注册 export default router;
// 导入Vue3的核心API,用于创建Vue应用实例 import {createApp} from 'vue'; // 导入根组件App.vue,它是整个应用程序的主视图模板 import App from './App.vue'; // 导入已配置好的路由模块(index.js或router.ts等),它管理着应用内的页面跳转逻辑 import router from "@/router"; // 使用createApp方法创建一个Vue应用实例,并注册全局路由配置 const app = createApp(App).use(router); // 将Vue应用挂载到HTML文档中id为'app'的元素上 // 这将把整个应用程序渲染到这个DOM元素内部 app.mount('#app');
module.exports = { // 设置在保存文件时禁用ESLint自动检查 lintOnSave: false, // 配置Vue开发服务器相关选项 devServer: { // 配置HTTP代理,以便在开发过程中将特定请求转发到其他服务器 proxy: { // 当请求以 '/api' 开头时进行代理 '/api': { // 指定目标服务器地址(例如后台API接口) target: 'http://localhost:8888', // 设置为true,允许跨域请求时重写源信息(Origin header) changeOrigin: true, // 路径重写规则,将前端应用中'/api'前缀去掉,映射到后端服务器的实际路径上 pathRewrite: { '^/api': '' }, } } } }
设置项目名称 LoginDemo、保存位置、语言、类型、组标识、构件名、包名、JDK版本、Java语言级、打包类型
单击【Next】按钮,在弹出的对话框里选择Spring Boot版本,添加项目相关依赖
单击【Create】按钮,得到初始化项目
在前端项目里配置了目标服务器地址,端口是8888
在应用属性文件application.properties里配置服务器端口号
首页 Welcome to Spring Boot World~
package net.huawei.login.bean; /** * 功能:用户实体类 * 作者:华卫 * 日期:2024年01月14日 */ public class User { private int id; private String username; private 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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
package net.huawei.login.result; /** * 功能:结果实体类 * 作者:华卫 * 日期:2024年01月14日 */ 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; } }
package net.huawei.login.controller; import net.huawei.login.bean.User; import net.huawei.login.result.Result; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.util.HtmlUtils; /** * 功能:登录控制器 * 作者:华卫 * 日期:2024年01月14日 */ @Controller public class LoginController { @CrossOrigin @PostMapping(value = "api/login") @ResponseBody public Result login(@RequestBody User requestUser) { // 获取用户名和密码 String username = requestUser.getUsername(); String password = requestUser.getPassword(); // 对html标签进行转义,防止XSS攻击 username = HtmlUtils.htmlEscape(username); // 判断登录是否成功 if (username.equals("无心剑") && password.equals("903213")) { return new Result(200); } else { System.out.println("用户名或密码有误!"); return new Result(400); } } }
访问http://localhost:8080/login登录页面
如果输入的用户名或密码有误,弹出消息框提示用户
输入正确的用户名或密码(无心剑 :903213)
单击【登录】按钮,跳转到首页
操作录屏演示