SpringBoot结合Vue实现投票系统过程详解

yizhihongxing

标题:SpringBoot结合Vue实现投票系统过程详解

简介

在这个教程中,我们将介绍如何使用Spring Boot和Vue来构建一个简单的投票系统。我们将使用Spring Boot构建后端API,使用Vue创建UI并前后端相结合。

投票系统架构

我们将采用前后端分离的架构来构建这个投票系统。常见的做法是将前端和后端分别放置在不同的服务器上。在我们的示例中,我们将前端和后端都放在同一个服务器上。

后端API构建

我们将使用以下工具来构建后端API:
- Spring Boot 2.0.4.RELEASE
- Spring Data JPA
- MySQL 5.7.x
- Java 8

创建Spring Boot应用程序

首先,我们需要创建一个Spring Boot应用,可以使用Spring Initializr(https://start.spring.io/)或者使用IDE自带的Spring Boot工具快速创建应用程序。

添加Spring Data JPA依赖

pom.xml 中添加下面的依赖:

<!-- Spring Data JPA -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- MySQL JDBC Driver -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

创建实体类

创建一个实体类来表示投票。

@Entity
public class Vote {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @NotNull
  private String name;

  @NotNull
  private int count;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getCount() {
    return count;
  }

  public void setCount(int count) {
    this.count = count;
  }
}

创建DAO层

创建一个DAO接口来操作投票实体。

@Repository
public interface VoteDao extends JpaRepository<Vote, Long> {}

创建Service层

创建一个Service类来处理投票逻辑。

@Service
public class VoteService {
  @Autowired private VoteDao voteDao;

  public List<Vote> getVotes() {
    return voteDao.findAll();
  }

  public Vote getVoteById(Long id) {
    return voteDao.findById(id).orElse(null);
  }

  public void addVote(Vote vote) {
    vote.setCount(0);
    voteDao.save(vote);
  }

  public void deleteVoteById(Long id) {
    voteDao.deleteById(id);
  }

  public void updateVoteCount(Long id) {
    Vote vote = voteDao.findById(id).orElse(null);
    vote.setCount(vote.getCount() + 1);
    voteDao.save(vote);
  }
}

创建控制层

创建一个控制层来处理投票API的请求。

@RestController
public class VoteController {
  @Autowired private VoteService voteService;

  @GetMapping("/votes")
  public List<Vote> getVotes() {
    return voteService.getVotes();
  }

  @GetMapping("/votes/{id}")
  public Vote getVoteById(@PathVariable Long id) {
    return voteService.getVoteById(id);
  }

  @PostMapping("/votes")
  public void addVote(@RequestBody Vote vote) {
    voteService.addVote(vote);
  }

  @DeleteMapping("/votes/{id}")
  public void deleteVoteById(@PathVariable Long id) {
    voteService.deleteVoteById(id);
  }

  @PutMapping("/votes/{id}/count")
  public void updateVoteCount(@PathVariable Long id) {
    voteService.updateVoteCount(id);
  }
}

至此,我们通过Spring Boot创建了后台API,可以通过API来获取、添加、删除和更新投票数据。

前端UI构建

我们将使用Vue创建前端UI。

创建Vue组件

在src/components目录下创建一个名为Vote.vue的Vue组件。

<template>
  <div>
    <h3>{{ title }}</h3>
    <ul>
      <li v-for="vote in votes" :key="vote.id">
        {{ vote.name }}({{ vote.count }}票)
        <button @click="voteCount(vote.id)">投票</button>
        <button @click="deleteVote(vote.id)">删除</button>
      </li>
    </ul>
    <label>名称</label>
    <input type="text" v-model="name" />
    <button @click="addVote()">添加</button>
  </div>
</template>

<script>
export default {
  name: "Vote",
  data() {
    return {
      title: "投票系统",
      votes: [],
      name: "",
    };
  },
  created() {
    this.getVotes();
  },
  methods: {
    getVotes() {
      fetch("/votes")
        .then((response) => response.json())
        .then((data) => {
          this.votes = data;
        });
    },
    addVote() {
      const vote = { name: this.name };
      fetch("/votes", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(vote),
      })
        .then(() => {
          this.name = "";
          this.getVotes();
        });
    },
    deleteVote(id) {
      fetch(`/votes/${id}`, { method: "DELETE" }).then(() =>
        this.getVotes()
      );
    },
    voteCount(id) {
      fetch(`/votes/${id}/count`, { method: "PUT" }).then(() =>
        this.getVotes()
      );
    },
  },
};
</script>

该组件显示了一个投票列表,其中每个投票都有一个投票和删除按钮。还有一个表单用于添加新的投票。

在App.vue中引用Vote组件

<template>
  <div id="app">
    <Vote />
  </div>
</template>

<script>
import Vote from "./components/Vote.vue";

export default {
  name: "App",
  components: {
    Vote,
  },
};
</script>

运行前端应用

在命令行中进入到前端目录中,然后运行下面的命令来运行Vue应用:

npm install
npm run serve

在浏览器中访问 http://localhost:8080 就可以看到我们的投票系统。

示例1:添加新投票

我们在前端UI的输入框中输入新投票的名称,点击添加按钮,就会向后台API发送POST请求来添加新的投票。投票列表会自动更新,新添加的投票会出现在列表中。

示例2:投票

我们在前端UI的投票按钮中点击一个投票,就会向后台API发送PUT请求来更新投票计数器。投票列表会自动更新,投票的计数器会增加。

至此,我们使用Spring Boot和Vue组合来构建投票系统的教程到这里就结束了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot结合Vue实现投票系统过程详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 深入理解Vue父子组件生命周期执行顺序及钩子函数

    下面是“深入理解Vue父子组件生命周期执行顺序及钩子函数”的完整攻略: 什么是Vue组件生命周期? Vue组件是Vue.js中最重要的概念之一。一个Vue组件可以看作是一个拥有预定义选项的Vue实例。与Vue实例一样,Vue组件也有它们自己的生命周期。Vue组件的生命周期包括创建、挂载、更新和销毁四个阶段。 为了更好地理解Vue组件生命周期,我们需要明确每个…

    Vue 2023年5月28日
    00
  • 在vue中如何使用Mock.js模拟数据

    在vue中使用Mock.js模拟数据,需要安装mockjs库,然后在vue组件中引入mockjs并编写mock数据接口。下面是具体的步骤: 安装mockjs 可以使用npm或者yarn进行安装: npm install mockjs –save-dev 引入mockjs 在vue组件引入mockjs,并编写mock数据接口,例如: import Mock …

    Vue 2023年5月27日
    00
  • vue3如何实现PDF文件在线预览功能

    Vue 3是基于前端开发框架Vue.js的最新版本,其具有更强大的响应式系统和优化后的编译器,使得开发体验更加简单、高效。本文将详细讲解如何使用Vue 3实现PDF文件在线预览功能的完整攻略。 步骤1 安装pdf.js PDF.js是一个用于在Web平台上显示PDF文档的开源项目,它基于HTML5 Canvas技术,可以解析PDF文档并将其转换为可供浏览器渲…

    Vue 2023年5月28日
    00
  • vue中使用element日历组件的示例代码

    下面是使用Element UI中日历组件在Vue项目中的示例代码攻略,包含两个示例: 步骤1:安装Element UI 在Vue项目中使用Element UI之前,需要先安装Element UI。可以使用npm或yarn进行安装,这里以npm为例进行说明。 先在项目根目录下执行以下命令安装Element UI: npm install element-ui …

    Vue 2023年5月29日
    00
  • Vue.js之VNode的使用

    下面就为大家详细讲解如何使用Vue.js中的VNode。 1. 什么是VNode VNode是Vue.js中的一种虚拟节点,它是Vue.js中的一个核心概念。 在Vue.js中,每个组件的视图分为模板(template)和渲染函数(render function)两种实现方式。而VNode就是在渲染函数中构建的虚拟DOM节点。 与真实的DOM节点不同,VNo…

    Vue 2023年5月28日
    00
  • JavaScript+CSS实现的可折叠二级菜单实例

    下面是“JavaScript+CSS实现的可折叠二级菜单实例”的完整攻略。 1. 实现思路 该二级菜单实例的实现思路如下: 初始状态二级菜单处于收缩状态,点击主菜单可以展开或关闭对应的二级菜单。 主菜单和二级菜单分别定义为一组HTML结构,通过CSS样式实现布局和样式。 通过JavaScript事件绑定实现主菜单点击后对应的二级菜单的展开和收缩。 2. HT…

    Vue 2023年5月28日
    00
  • vue自定义指令实现方法详解

    你要了解关于“vue自定义指令实现方法”的详细攻略,下面为你详细讲解。 什么是Vue自定义指令? 在Vue中,自定义指令是一种用来扩展标准的HTML指令的一种方式。除了内置的$v-cloak指令,Vue还允许注册自定义指令,使开发者可以在模板中直接使用自定义的指令。 Vue自定义指令的注册 定义一个全局自定义指令的方式: Vue.directive(‘my-…

    Vue 2023年5月27日
    00
  • Vue与Axios的传参方式实例详解

    标题:Vue与Axios的传参方式实例详解 介绍:Vue是一款流行的前端框架,而Axios则是一个非常强大的异步请求库。在Vue项目中,我们经常需要发送请求到服务器,因此Vue和Axios的结合使用非常常见。本文将详细讲解Vue和Axios的传参方式,包括两个示例说明,帮助大家更好地掌握相应的技能。 1. GET请求的传参方式 GET请求将参数放在URL的后…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部