快速上手:前后端分离开发(Vue+Element+Spring Boot+MyBatis+MySQL)

news2024/9/22 12:54:36

文章目录

      • 前言
      • 项目简介
      • 环境准备
      • 第一步:初始化前端项目
        • 登录页面
        • 任务管理页面
      • 第二步:初始化后端项目
        • 数据库配置
        • 数据库表结构
        • 实体类和Mapper
        • 服务层和控制器
      • 第三步:连接前后端
      • 总结

在这里插入图片描述

🎉欢迎来到架构设计专栏~探索Java中的静态变量与实例变量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

前言

随着互联网技术的迅速发展,前后端分离已经成为现代Web开发的主流模式。这种模式不仅提高了开发效率,还使得前端和后端各自独立,便于维护和升级。本文将详细介绍如何使用Vue、Element、Spring Boot、MyBatis和MySQL实现一个简单的前后端分离项目。通过本文的学习,你将能在20分钟内掌握这种开发模式的基本实现方法。

在这里插入图片描述

项目简介

我们的项目是一个简单的任务管理系统,包含以下功能:

  • 用户注册和登录
  • 任务的增删改查

项目结构如下:

  • 前端:Vue.js + Element UI
  • 后端:Spring Boot + MyBatis
  • 数据库:MySQL

环境准备

在开始之前,请确保你已经安装了以下工具:

  • Node.js(建议使用LTS版本)
  • Vue CLI
  • Java JDK 8或以上
  • Maven
  • MySQL

第一步:初始化前端项目

首先,我们使用Vue CLI初始化一个Vue项目。

vue create task-manager

选择默认配置后,进入项目目录并安装Element UI。

cd task-manager
vue add element

然后,创建一个简单的登录页面和任务管理页面。

登录页面

src/views目录下创建Login.vue文件:

<template>
  <div class="login">
    <el-form :model="form" @submit.native.prevent="handleLogin">
      <el-form-item label="用户名">
        <el-input v-model="form.username"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input type="password" v-model="form.password"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleLogin">登录</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      }
    };
  },
  methods: {
    handleLogin() {
      // 调用后端API进行登录验证
    }
  }
};
</script>
任务管理页面

src/views目录下创建TaskManager.vue文件:

<template>
  <div class="task-manager">
    <el-table :data="tasks">
      <el-table-column prop="id" label="ID"></el-table-column>
      <el-table-column prop="name" label="任务名"></el-table-column>
      <el-table-column prop="status" label="状态"></el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button @click="editTask(scope.row)">编辑</el-button>
          <el-button @click="deleteTask(scope.row.id)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-button @click="createTask">创建任务</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tasks: []
    };
  },
  methods: {
    fetchTasks() {
      // 调用后端API获取任务列表
    },
    createTask() {
      // 创建任务逻辑
    },
    editTask(task) {
      // 编辑任务逻辑
    },
    deleteTask(id) {
      // 删除任务逻辑
    }
  },
  mounted() {
    this.fetchTasks();
  }
};
</script>

第二步:初始化后端项目

使用Spring Initializr生成一个Spring Boot项目,选择以下依赖:

  • Spring Web
  • MyBatis
  • MySQL Driver

将生成的项目导入你的IDE,并进行以下配置。

数据库配置

application.properties文件中添加MySQL配置:

spring.datasource.url=jdbc:mysql://localhost:3306/task_manager?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:mappers/*.xml
数据库表结构

在MySQL中创建一个数据库,并初始化表结构:

CREATE DATABASE task_manager;

USE task_manager;

CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(100) NOT NULL
);

CREATE TABLE task (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    status VARCHAR(20) NOT NULL,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES user(id)
);
实体类和Mapper

创建实体类UserTask

public class User {
    private Integer id;
    private String username;
    private String password;

    // getters and setters
}

public class Task {
    private Integer id;
    private String name;
    private String status;
    private Integer userId;

    // getters and setters
}

创建Mapper接口和对应的XML映射文件:

public interface UserMapper {
    User findByUsername(String username);
    void insert(User user);
}

public interface TaskMapper {
    List<Task> findByUserId(Integer userId);
    void insert(Task task);
    void update(Task task);
    void delete(Integer id);
}

resources/mappers目录下创建UserMapper.xmlTaskMapper.xml

<!-- UserMapper.xml -->
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="findByUsername" resultType="com.example.demo.entity.User">
        SELECT * FROM user WHERE username = #{username}
    </select>
    <insert id="insert">
        INSERT INTO user (username, password) VALUES (#{username}, #{password})
    </insert>
</mapper>
<!-- TaskMapper.xml -->
<mapper namespace="com.example.demo.mapper.TaskMapper">
    <select id="findByUserId" resultType="com.example.demo.entity.Task">
        SELECT * FROM task WHERE user_id = #{userId}
    </select>
    <insert id="insert">
        INSERT INTO task (name, status, user_id) VALUES (#{name}, #{status}, #{userId})
    </insert>
    <update id="update">
        UPDATE task SET name = #{name}, status = #{status} WHERE id = #{id}
    </update>
    <delete id="delete">
        DELETE FROM task WHERE id = #{id}
    </delete>
</mapper>
服务层和控制器

创建服务层和控制器,实现用户注册、登录和任务管理功能。

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User findByUsername(String username) {
        return userMapper.findByUsername(username);
    }

    public void register(User user) {
        userMapper.insert(user);
    }
}

@Service
public class TaskService {
    @Autowired
    private TaskMapper taskMapper;

    public List<Task> findByUserId(Integer userId) {
        return taskMapper.findByUserId(userId);
    }

    public void createTask(Task task) {
        taskMapper.insert(task);
    }

    public void updateTask(Task task) {
        taskMapper.update(task);
    }

    public void deleteTask(Integer id) {
        taskMapper.delete(id);
    }
}
@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        User foundUser = userService.findByUsername(user.getUsername());
        if (foundUser != null && foundUser.getPassword().equals(user.getPassword())) {
            return ResponseEntity.ok(foundUser);
        }
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
    }

    @PostMapping("/register")
    public ResponseEntity<?> register(@RequestBody User user) {
        userService.register(user);
        return ResponseEntity.ok("User registered successfully");
    }
}

@RestController
@RequestMapping("/api/tasks")
public class TaskController {
    @Autowired
    private TaskService taskService;

    @GetMapping("/{userId}")
    public ResponseEntity<?> getTasks(@PathVariable Integer userId) {
        return ResponseEntity.ok(taskService.findByUserId(userId));
    }

    @PostMapping
    public ResponseEntity<?> createTask(@RequestBody Task task) {
        taskService.createTask(task);
        return ResponseEntity.ok("Task created successfully");
    }

    @PutMapping
    public ResponseEntity<?> updateTask(@RequestBody Task task) {
        taskService.updateTask(task);
        return ResponseEntity.ok("Task updated successfully");
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<?> deleteTask(@PathVariable Integer id) {
        taskService.deleteTask(id);
        return ResponseEntity.ok("Task deleted successfully");
    }
}

第三步:连接前后端

在前端项目中,配置Axios以便与后端API通信。在src/main.js中添加如下代码:

import axios from 'axios';

axios.defaults.baseURL = 'http://localhost:8080/api';
Vue.prototype.$http = axios;

然后,在登录页面和任务管理页面中调用后端API:

methods: {
    handleLogin()

 {
        this.$http.post('/login', this.form).then(response => {
            // 保存用户信息并跳转到任务管理页面
        }).catch(error => {
            console.error(error);
            alert('登录失败');
        });
    }
}
methods: {
    fetchTasks() {
        this.$http.get(`/tasks/${this.userId}`).then(response => {
            this.tasks = response.data;
        }).catch(error => {
            console.error(error);
            alert('获取任务列表失败');
        });
    },
    createTask() {
        this.$http.post('/tasks', { name: '新任务', status: '未完成', userId: this.userId }).then(response => {
            this.fetchTasks();
        }).catch(error => {
            console.error(error);
            alert('创建任务失败');
        });
    },
    editTask(task) {
        // 编辑任务逻辑
    },
    deleteTask(id) {
        this.$http.delete(`/tasks/${id}`).then(response => {
            this.fetchTasks();
        }).catch(error => {
            console.error(error);
            alert('删除任务失败');
        });
    }
}

总结

通过本文的介绍,我们快速搭建了一个基于Vue、Element、Spring Boot、MyBatis和MySQL的前后端分离项目。我们实现了用户注册、登录和任务管理的基本功能,展示了如何使用这些技术进行高效的Web开发。希望本文能对你有所帮助,欢迎在实际项目中灵活运用这些技术。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

AutoHotKey自动热键(四)WINDOWS程序窗口的9种匹配方法与Window Spy窗口检索的使用方法

我们在进行窗口匹配的时候,根据匹配类型的不同可以多种匹配方法,根据使用者目录中可以找到九种匹配方式,这些匹配方式大都需自带的SPY监视工具用以查看窗口的名称.类名.进程名.句柄ID.位置信息等等 Window Spy的使用方法★★★ 软件界面 这个软件是安装好之后自带的一个脚本…

「API取数」FDL获取金蝶云星空的单据数据

很多企业的ERP系统都在用金蝶云星空&#xff0c;金蝶云星空API是IT人员获取数据的重要来源&#xff0c; 常常用来生成定制化报表&#xff0c;进行数据分析&#xff0c;或是将金蝶云的数据与OA系统、BI工具集成。 通常情况下&#xff0c;IT人员需要使用Python、Java等语言编写脚…

十款绚丽的前端 CSS 菜单导航动画

CSS汉堡菜单是一种非常流行的PC端和移动端web菜单风格&#xff0c;特别是移动端&#xff0c;这种风格的菜单应用更为广泛。这款菜单便非常适合在手机App上使用&#xff0c;它的特点是当顶部菜单弹出时&#xff0c;页面内容将会配合菜单出现适当的联动&#xff0c;让整个页面变得…

【UE Lua】 快速入门(基础语法、与UE引擎的交互)

目录 0 引言1 基础语法1.1 变量和数据类型1.2 注释1.3 控制结构1.4 函数1.5 表&#xff08;Table&#xff09;1.6 元表&#xff08;Metatable&#xff09;1.7 字符串操作1.8 模块和包1.9 错误处理 2 数据结构 - 表2.1 表&#xff08;Table&#xff09;2.2 元表&#xff08;Meta…

ElasticSearch学习篇14_《检索技术核心20讲》进阶篇之大倒排索引

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 主要是海量数据的大倒排索引的一些原理设计思想&#xff0c;ES底层就是基于这些设计思想以及原理&#xff0c;主要涉及读写分离、索引分层等…

【DFS(深度优先搜索)详解】看这一篇就够啦

【DFS详解】看这一篇就够啦 &#x1f343;1. 算法思想&#x1f343;2. 三种枚举方式&#x1f343;2.1 指数型枚举&#x1f343;2.2 排列型枚举&#x1f343;2.3 组合型枚举 &#x1f343;3. 剪枝优化&#x1f343;4. 图的搜索&#x1f343;5. 来几道题试试手&#x1f343;5.1 选…

淘宝扭蛋机小程序搭建全攻略

一、引言 在数字化时代&#xff0c;线上娱乐方式层出不穷&#xff0c;其中扭蛋机小程序以其独特的互动性和趣味性&#xff0c;受到了广大用户的喜爱。淘宝扭蛋机小程序作为其中的佼佼者&#xff0c;不仅为用户提供了丰富的奖品选择&#xff0c;还通过创新的玩法和营销策略&…

【计算机毕业设计】018基于weixin小程序实习记录

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Scrapy crawl spider 停止工作

Scrapy是一个用于爬取网站数据的流行框架&#xff0c;有时爬虫可能会停止工作&#xff0c;这通常是由多种原因引起的。以下是一些常见问题及其解决方法&#xff1a; 1、问题背景 用户在使用 Scrapy 0.16.2 版本进行网络爬取时遇到问题&#xff0c;具体表现为爬虫在运行一段时间…

OV SSL证书—防止钓鱼攻击的最佳证书

据Menlo Security日前发布的《2023年浏览器安全状况报告》&#xff0c;针对浏览器的高度规避自适应威胁&#xff08;HEAT&#xff09;呈现激增的发展趋势。 钓鱼攻击概率激增&#xff1a; 安全研究人员发现&#xff0c;与上半年相比&#xff0c;2023年下半年基于浏览器的网络…

大野耐一是如何为丰田铸就精益生产的?

在制造业的漫长历史中&#xff0c;无数的革新者和企业家为追求更高效、更精益的生产方式而不懈努力。其中&#xff0c;大野耐一的名字无疑是这段历史中最为耀眼的星辰之一。他&#xff0c;以其卓越的才智和坚韧的毅力&#xff0c;为丰田汽车公司铸就了一套享誉全球的精益生产体…

windows上部署python3.11

hello&#xff0c;大家好&#xff0c;我是一名测试开发工程师&#xff0c;至今已在自动化测试领域深耕9个年头&#xff0c;现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦&#xff0c;在接下来的一个月里&#xff0c;我将免费指导大家使用wyTest&#xff0c;请大家…

软件安全性测试的工具有哪些?

软件安全性测试是确保软件系统在设计和实施过程中能够保护系统的机密性、完整性和可用性。为了进行软件安全性测试&#xff0c;有许多工具可供选择&#xff0c;这些工具可以帮助测试人员发现潜在的安全漏洞和弱点&#xff0c;从而提高软件系统的安全性。 以下是一些常用的软件安…

游戏提示找不到steam_api64.dll无法继续执行代码的处理方法

相信很多人在玩游戏时候打开游戏时候&#xff0c;经常会遇到各式各样的小问题&#xff0c;比如steam_api64.dll丢失或许找不到steam_api64.dll无法打开游戏就是其中常见问题之一&#xff0c;那么遇到steam_api64.dll丢失问题要如何解决呢&#xff1f;今天我就给大家详细分析一下…

无人直播怎么玩,一文带你了解AI小姐姐自动换装玩法

最近经常有小伙伴问我 就是像这种&#xff0c;一刷礼物&#xff0c;小姐姐就换装的视频到底该怎么做 今天就来教大家 如何来制作这种直播视频 第一步&#xff1a;搭建OBS 1、设置屏幕分辨率&#xff1a; 背景&#xff1a;因为一般初始状态&#xff0c;屏幕是横屏的&#xf…

【Linux】进程补充知识

文章目录 前言磁盘与物理内存 数据交互局部性原理页表 前言 磁盘是计算机唯一的一个机械设备&#xff0c;在磁盘文件系统中&#xff0c;我们了解到&#xff0c;磁盘的数据读取写入相比物理内存&#xff0c;CPU等效率低了很多。但是其作为数据的载体&#xff0c;物理内存与其交…

阿里达摩院——寻光:用AI,实现视频创作一条龙!

7 月 6 日&#xff0c;在2024 世界人工智能大会&#xff08;WAIC 2024&#xff09;上&#xff0c;阿里达摩院推出了一站式 AI 视频创作平台 —— 寻光&#xff0c;今天带大家提前来了解一下这款工具&#xff5e; 1、关于“寻光” 寻光是一个拥有辅助用户创作剧本、分镜图等&am…

NAT:地址转换技术

为什么会引入NAT&#xff1f; NAT&#xff08;网络地址转换&#xff09;的引入主要是为了解决两个问题 IPv4地址短缺&#xff1a;互联网快速发展&#xff0c;可用的公网IP地址越来越少。网络安全&#xff1a;需要一种方法来保护内部网络不被直接暴露在互联网上。 IPv4 &…

网络服务器配置与管理

网络服务器配置与管理是一个涉及多个方面的领域&#xff0c;它涵盖了从物理硬件的设置到操作系统、网络服务和应用的配置&#xff0c;再到日常维护和安全策略的实施。以下是网络服务器配置与管理的一些核心概念和步骤&#xff1a; 硬件配置&#xff1a; 选择合适的服务器硬件&a…

git简介以及git操作软件下载以及安装教程,git基础指令介绍,持续更新中~

什么是Git&#xff1f; 最近在学一些git的基础指令&#xff0c;仔细地了解了一下git&#xff0c;发现了他的强大功能&#xff0c;分享一下&#xff1a; Git是一个强大的工具&#xff0c;它在软件开发中扮演着至关重要的角色。 Git是一个开源的分布式版本控制系统&#xff0c;…