Vue.js教程实战项目开发:构建现代化全栈应用
在当今快速发展的Web开发领域,前端框架的选择至关重要。Vue.js以其渐进式、易上手和功能强大的特点,成为了众多开发者的首选。然而,一个完整的应用不仅仅是漂亮的前端界面,它还需要健壮的后端服务和稳定的运行环境。本教程将通过一个实战项目——“个人任务管理系统”,带你从零开始,整合Vue.js前端、Java Spring Boot后端,并部署到Linux服务器,同时运用CSS3为界面添加生动的交互效果。你将学习到如何将这些看似独立的技术栈串联起来,构建一个可部署、可维护的全栈应用。
项目概述与技术栈选型
我们的目标是开发一个功能完整的个人任务管理应用,核心功能包括任务的增删改查、状态标记以及可视化展示。
- 前端 (Vue.js 3 + Composition API):负责用户界面和交互逻辑。使用Vue Router进行页面导航,Pinia进行状态管理,Axios与后端通信。
- 后端 (Spring Boot 2.x):提供RESTful API接口,处理业务逻辑,连接数据库。它负责用户认证、任务数据的持久化与验证。
- 数据库 (H2 / MySQL):开发阶段使用内嵌的H2数据库便于测试,生产环境可切换为MySQL。
- 部署环境 (Linux - Ubuntu):应用最终将运行在Linux服务器上,我们将使用Nginx作为反向代理服务器。
- UI/UX (CSS3):利用CSS3的过渡、变换和动画特性,提升前端界面的动态视觉效果和用户体验。
这种组合确保了应用的前后端分离、高可维护性以及生产级的可靠性。
后端基石:使用Spring Boot构建RESTful API
后端是应用的大脑和数据中心。我们首先使用Spring Initializr快速生成一个项目,依赖选择Spring Web, Spring Data JPA和H2 Database。
1. 定义数据模型与仓库:
// Task.java 实体类
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
private boolean completed;
private LocalDateTime createTime;
// 省略构造函数、Getter和Setter
}
// TaskRepository.java 数据访问层
import org.springframework.data.jpa.repository.JpaRepository;
public interface TaskRepository extends JpaRepository {
}
2. 创建控制器提供API:控制器接收前端请求,调用服务层处理,并返回JSON数据。
// TaskController.java
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/tasks")
@CrossOrigin(origins = "http://localhost:8080") // 允许Vue前端跨域访问
public class TaskController {
private final TaskService taskService;
public TaskController(TaskService taskService) {
this.taskService = taskService;
}
@GetMapping
public List getAllTasks() {
return taskService.findAll();
}
@PostMapping
public Task createTask(@RequestBody Task task) {
task.setCreateTime(LocalDateTime.now());
return taskService.save(task);
}
@PutMapping("/{id}")
public Task updateTask(@PathVariable Long id, @RequestBody Task task) {
// 更新逻辑
return taskService.update(id, task);
}
@DeleteMapping("/{id}")
public void deleteTask(@PathVariable Long id) {
taskService.deleteById(id);
}
}
运行Spring Boot应用,你就拥有了一个完整的、提供CRUD操作的REST API后端,可以通过http://localhost:8080/api/tasks进行访问。
前端交互:使用Vue.js 3构建动态界面
前端负责将数据以友好的方式呈现给用户,并处理所有交互。我们使用Vite快速搭建Vue 3项目。
1. 项目初始化与依赖安装:
npm create vue@latest vue-task-manager
cd vue-task-manager
npm install axios pinia
2. 创建Pinia Store管理任务状态:Pinia是Vue的官方状态管理库,用于集中管理跨组件共享的任务数据。
// stores/task.js
import { defineStore } from 'pinia'
import { ref } from 'vue'
import axios from 'axios'
const API_URL = 'http://localhost:8080/api/tasks';
export const useTaskStore = defineStore('task', () => {
const tasks = ref([])
const fetchTasks = async () => {
const response = await axios.get(API_URL)
tasks.value = response.data
}
const addTask = async (newTask) => {
const response = await axios.post(API_URL, newTask)
tasks.value.push(response.data)
}
const deleteTask = async (id) => {
await axios.delete(`${API_URL}/${id}`)
const index = tasks.value.findIndex(task => task.id === id)
if (index !== -1) tasks.value.splice(index, 1)
}
return { tasks, fetchTasks, addTask, deleteTask }
})
3. 构建主组件:在App.vue或页面组件中,我们连接Store,渲染任务列表并处理用户输入。
<template>
<div class="container">
<h1>我的任务清单</h1>
<form @submit.prevent="handleSubmit">
<input v-model="newTaskTitle" placeholder="输入新任务..." required />
<button type="submit">添加</button>
</form>
<ul class="task-list">
<li v-for="task in taskStore.tasks" :key="task.id" class="task-item">
<span :class="{ completed: task.completed }">{{ task.title }}</span>
<button @click="() => taskStore.deleteTask(task.id)">删除</button>
</li>
</ul>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useTaskStore } from './stores/task'
const taskStore = useTaskStore()
const newTaskTitle = ref('')
onMounted(() => {
taskStore.fetchTasks()
})
const handleSubmit = () => {
if (newTaskTitle.value.trim()) {
taskStore.addTask({ title: newTaskTitle.value, completed: false })
newTaskTitle.value = ''
}
}
</script>
点睛之笔:利用CSS3动画提升用户体验
静态的列表是枯燥的。CSS3动画可以极大地增强界面的反馈感和活力。我们将为任务项的添加和删除添加平滑的过渡效果。
<style scoped>
/* 基础容器样式 */
.container {
max-width: 600px;
margin: 2rem auto;
padding: 1rem;
}
/* 任务列表样式 */
.task-list {
list-style: none;
padding: 0;
}
/* 单个任务项 - 定义进入和离开的动画 */
.task-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 1rem;
margin-bottom: 0.5rem;
background-color: #f8f9fa;
border-left: 4px solid #007bff;
border-radius: 4px;
/* CSS3过渡:所有可动画属性在0.3秒内以ease-out曲线变化 */
transition: all 0.3s ease-out;
}
/* 悬停效果 */
.task-item:hover {
background-color: #e9ecef;
transform: translateX(5px); /* CSS3变换:水平移动 */
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
/* 已完成任务的样式 */
.completed {
text-decoration: line-through;
color: #6c757d;
}
/* Vue的过渡类名配合CSS实现列表动画 */
/* 进入动画的初始状态 */
.task-item-enter-from {
opacity: 0;
transform: translateX(-30px);
}
/* 进入动画的激活和结束状态 */
.task-item-enter-active,
.task-item-leave-active {
transition: all 0.5s ease;
}
/* 离开动画的结束状态 */
.task-item-leave-to {
opacity: 0;
transform: translateX(30px);
}
/* 确保离开动画期间布局保持稳定 */
.task-item-leave-active {
position: absolute;
width: 100%;
}
</style>
在模板中,我们需要使用Vue的<TransitionGroup>组件来包裹列表,以实现列表项的进入和离开动画。
<TransitionGroup name="task-item" tag="ul" class="task-list">
<li v-for="task in taskStore.tasks" :key="task.id" class="task-item">
<!-- 内容不变 -->
</li>
</TransitionGroup>
部署上线:在Linux服务器上运行全栈应用
开发完成后,我们需要将应用部署到生产环境。这里以Ubuntu服务器和Nginx为例。
1. 后端部署:
- 在服务器上安装Java运行环境(JRE 11或以上)。
- 将Spring Boot项目打包成可执行的JAR文件:
./mvnw clean package。 - 将JAR文件上传到服务器,例如
/opt/app/backend.jar。 - 使用Systemd创建一个后台服务来管理应用:
# /etc/systemd/system/taskapp.service
[Unit]
Description=Task Manager Backend Service
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar backend.jar
SuccessExitStatus=143
Restart=always
[Install]
WantedBy=multi-user.target
然后启动服务:sudo systemctl start taskapp。
2. 前端部署:
- 构建Vue项目生成静态文件:
npm run build,输出在dist目录。 - 将
dist目录内的所有文件上传到服务器,例如/var/www/vue-task-manager。
3. 配置Nginx反向代理:Nginx将用户请求转发给前端静态文件或后端API。
# /etc/nginx/sites-available/taskapp
server {
listen 80;
server_name your-domain.com; # 替换为你的域名或IP
# 前端静态文件
location / {
root /var/www/vue-task-manager;
index index.html;
try_files $uri $uri/ /index.html; # 支持Vue Router的history模式
}
# 反向代理到后端Spring Boot应用
location /api/ {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
启用站点并重启Nginx:sudo systemctl restart nginx。现在,通过访问服务器IP或域名,你的全栈Vue.js任务管理应用就正式上线了!
总结
通过这个“个人任务管理系统”的实战开发,我们完成了一次从前端到后端,再到部署上线的完整全栈开发旅程。我们利用Vue.js 3的响应式和组件化构建了交互丰富的前端界面,通过Spring Boot快速搭建了稳健高效的REST API后端,运用CSS3动画为应用注入了流畅的视觉体验,最后在Linux服务器上使用Nginx完成了生产环境的部署。这个过程清晰地展示了现代Web开发中,如何将不同的技术栈有机地结合,各司其职,共同构建出一个可用、可用的软件产品。掌握这种整合能力,将使你能够应对更复杂、更真实的开发挑战。




