基于 Vue 3 和 Element Plus 构建图书管理系统

基于 Vue 3 和 Element Plus 构建图书管理系统

本文将介绍如何使用 Vue 3 和 Element Plus 构建一个简单的图书管理系统。这个系统将包括以下功能:

  • 添加新书
  • 显示图书列表
  • 分页显示图书
  • 删除图书

相关链接

接口地址
elementplus中文地址

项目结构

我们的项目结构如下:

src/
├── components/
│   └── BookManager.vue
├── App.vue
└── main.js

BookManager.vue 是我们主要的组件文件,它包含了图书管理的所有逻辑。App.vuemain.js 是 Vue 3 项目的基础文件。

引入必要的库

main.js 文件中,我们引入 Vue 3 和 Element Plus,并进行初始化:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

图书管理组件

components/BookManager.vue 文件中,我们将实现图书管理功能。

模板部分
<template><div class="button-container"><el-button type="primary" @click="dialogFormVisible = true">新增图书</el-button></div><el-dialog v-model="dialogFormVisible" title="新增图书" width="300px"><el-form :model="form" label-position="right" label-width="100px"><el-form-item label="书名"><el-input v-model="form.bookname" /></el-form-item><el-form-item label="作者"><el-input v-model="form.author" /></el-form-item><el-form-item label="出版社"><el-input v-model="form.publisher" /></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="dialogFormVisible = false">取消</el-button><el-button type="primary" @click="addBook">提交</el-button></div></template></el-dialog><el-table :data="paginatedBooks" style="width: 100%"><el-table-column prop="id" label="ID" width="80" /><el-table-column prop="bookname" label="书名" width="120" /><el-table-column prop="author" label="作者" width="120" /><el-table-column prop="publisher" label="出版社" width="120" /><el-table-column prop="createdAt" label="创建时间" width="220" /><el-table-column prop="updatedAt" label="更新时间" width="220" /><el-table-column label="选项操作" min-width="100"><template #default="scope"><el-buttonlinktype="danger"size="small"@click.prevent="deleteRow(scope.row.id)">删除</el-button></template></el-table-column></el-table><div class="pagination-container"><el-pagination@current-change="handleCurrentChange":current-page="currentPage":page-size="pageSize":total="books.length"layout="prev, pager, next"style="margin-top: 20px;"/></div>
</template>

在模板部分,我们使用 Element Plus 的组件来创建一个对话框,用于添加新书,并显示图书列表和分页功能。

脚本部分
<script setup>
import { ref, onMounted, computed } from 'vue';
import { ElMessage } from 'element-plus';
import axios from 'axios';const dialogFormVisible = ref(false);
const books = ref([]);
const form = ref({bookname: '',author: '',publisher: ''
});
const currentPage = ref(1);
const pageSize = ref(10);const getBooksAll = async () => {const config = {method: 'get',url: 'http://ajax-api.itheima.net/api/books',};try {const response = await axios(config);if (Array.isArray(response.data.data)) {books.value = response.data.data.sort((a, b) => a.id - b.id);} else {throw new Error("数据格式错误");}} catch (error) {console.log(error);ElMessage({showClose: true,message: error.message || error,type: 'error',});}
};const paginatedBooks = computed(() => {const start = (currentPage.value - 1) * pageSize.value;return books.value.slice(start, start + pageSize.value);
});const handleCurrentChange = (newPage) => {currentPage.value = newPage;
};const addBook = async () => {const config = {method: 'post',url: "http://ajax-api.itheima.net/api/books",headers: {'Content-Type': 'application/json'},data: JSON.stringify(form.value)};try {await axios(config);ElMessage({showClose: true,message: '添加图书成功',type: "success",});await getBooksAll();form.value = { bookname: '', author: '', publisher: '' };dialogFormVisible.value = false;} catch (error) {console.log(error);}
};const deleteRow = async (id) => {const config = {method: 'delete',url: `http://ajax-api.itheima.net/api/books/${id}`,headers: {'User-Agent': 'Apifox/1.0.0 (https://apifox.com)'}};try {await axios(config);await getBooksAll();ElMessage({showClose: true,message: '删除成功',type: 'success',});} catch (error) {console.log(error);}
};onMounted(async () => {await getBooksAll();
});
</script>
样式部分
<style scoped>
.button-container {margin: 20px 0;padding-left: 10px;
}
.pagination-container {display: flex;justify-content: center;margin-top: 5px;
}
</style>

关键实现细节

  1. 获取图书列表
    使用 axios 发送 GET 请求,从服务器获取图书列表,并将其存储在 books 变量中。使用 onMounted 钩子在组件挂载时调用 getBooksAll 方法。

  2. 分页显示图书
    使用 computed 计算属性 paginatedBooks 来实现分页功能,根据当前页码和每页显示的数量来切割图书列表。

  3. 添加新书
    使用 axios 发送 POST 请求,将新书信息发送到服务器。成功添加后,刷新图书列表,并重置表单和对话框状态。

  4. 删除图书
    使用 axios 发送 DELETE 请求,根据图书 ID 删除图书。成功删除后,刷新图书列表。

  5. 消息提示
    使用 Element Plus 的 ElMessage 组件在操作成功或失败时显示消息提示。

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

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

相关文章

Langchain[4]:Langchain 0.2革命性突破:结合工具调用与结构化数据处理、@Chain修饰符使用,解决LLM输出难题,提升AI效能

Langchain[4]:Langchain 0.2革命性突破:结合工具调用与结构化数据处理,解决LLM输出难题,提升AI效能 1.工具调用 大型语言模型 (LLM) 可以通过工具调用功能与外部数据源交互。工具调用是一种强大的技术,允许开发人员构建复杂的应用程序,这些应用程序可以利用 LLM 访问、交…

websocket-react使用

问题 在一个应用中&#xff0c;如果需要在不同的组件之间共享同一个WebSocket连接&#xff0c;可以采用多种方法来实现。 比如&#xff1a;单例模式、全局变量、react context React上下文&#xff08;React Context&#xff09; 如果你使用的是React&#xff0c;可以使用Re…

C++ | Leetcode C++题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n nums.size();vector<int> prefixMax(n), suffixMax(n);for (int i 0; i < n; i) {if (i % k 0) {prefixMax[i] num…

Writing Bazel rules: data and runfiles

Bazel has a neat feature that can simplify a lot of work with tests and executables: the ability to make data files available at run-time using data attributes. You may have seen these in rules like this:Bazel 有一个巧妙的功能&#xff0c;可以简化测试和可执…

简单实用的企业舆情安全解决方案

前言&#xff1a;企业舆情安全重要吗&#xff1f;其实很重要&#xff0c;尤其面对负面新闻&#xff0c;主动处理和应对&#xff0c;可以掌握主动权&#xff0c;避免股价下跌等&#xff0c;那么如何做使用简单实用的企业舆情解决方案呢&#xff1f; 背景 好了&#xff0c;提取词…

CSS技巧专栏:一日一例 7 - 纯CSS实现炫光边框按钮特效

CSS技巧专栏&#xff1a;一日一例 7 - 纯CSS实现炫光边框按钮特效 本例效果图 案例分析 相信你可能已经在网络见过类似这样的流光的按钮&#xff0c;在羡慕别人做的按钮这么酷的时候&#xff0c;你有没有扒一下它的源代码的冲动&#xff1f;或者你当时有点冲动&#xff0c;却…

【PostgreSQL】PostgreSQL简史

博主介绍&#xff1a;✌全网粉丝20W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

基于python的百度资讯爬虫的设计与实现

研究背景 随着互联网和信息技术的飞速发展&#xff0c;网络已经成为人们获取信息的主要来源之一。特别是搜索引擎&#xff0c;作为信息检索的核心工具&#xff0c;极大地改变了人们获取信息的方式。其中&#xff0c;百度作为中国最受欢迎的搜索引擎之一&#xff0c;其新闻搜索…

开发扫地机器人系统时无法兼容手机解决方案

在开发扫地机器人系统时&#xff0c;遇到无法兼容手机的问题&#xff0c;可以从以下几个方面寻求解决方案&#xff1a; 一、了解兼容性问题根源 ① 操作系统差异&#xff1a;不同手机可能运行不同的操作系统&#xff08;如iOS、Android&#xff09;&#xff0c;且即使是同一操…

leetcode简单题27 N.119 杨辉三角II rust描述

// 直接生成杨辉三角当前行 pub fn get_row(row_index: i32) -> Vec<i32> {let mut row vec![1; (row_index 1) as usize];for i in 1..row_index as usize {for j in (1..i).rev() {row[j] row[j] row[j - 1];}}row } // 空间优化的方法 pub fn get_row2(row_ind…

Java中的final关键字详解

Java中的final关键字详解 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. final关键字的基本用法 在Java中&#xff0c;final关键字可以用来修饰类、方法和变量&#xff0c;具有不同的含义和作用…

【QT】label适应图片(QImage)大小;图片适应label大小

目录 0.简介 1.详细代码 1&#xff09;label适应img大小 2&#xff09;img适应label大小 0.简介 一个小demo &#xff0c;想在QLabel中放一张QImage的图片&#xff0c;我有一张图片叫【bird.jpg】&#xff0c;是提前放在资源文件中的&#xff0c;直接显示在label上后&#…

【机器学习入门】拥抱人工智能,从机器学习开始

拥抱人工智能&#xff0c;从机器学习开始 目录&#xff1a; 1. 机器学习&#xff1a;一种实现人工智能的方法 2. 机器学习算法&#xff1a;是使计算机具有智能的关键 3. Anaconda&#xff1a;初学Python、入门机器学习的首选 4. 总结 转载链接&#xff1a; 文章-阿里云开发者社…

【LeetCode:试题 16.06. 最小差 + 双指针 + 防止整型溢出】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

ELK企业级日志分析

目 录 一、ELK简介 1.1 elasticsearch简介 1.2 logstash简介 1.3 kibana简介 1.4 ELK的好处 1.5 ELK的工作原理 二、部署ELK 2.1 部署elasticsearch(集群) 2.1.1 修改配置文件 2.1.2 修改系统参数 2.1.2.1 修改systemmd服务管理器 2.1.2.2 性能调优参数 2.1.2.3 …

Python编程工具PyCharm和Jupyter Notebook的使用差异

在编写Python程序时需要用到相应的编程工具&#xff0c;PyCharm和Jupyter Notebook是最常用2款软件。 PyCharm是很强大的综合编程软件&#xff0c;代码提示、代码自动补全、语法检验、文本彩色显示等对于新手来说实在太方便了&#xff0c;但在做数据分析时发现不太方便&#xf…

phpinfo

phpinfo() 是 PHP 中的一个内置函数&#xff0c;用于显示关于 PHP 配置的大量信息&#xff0c;包括已安装的扩展、PHP 版本、服务器信息、环境变量、注册的流封装器和包装器、路径、内存使用情况、上传文件大小限制、脚本运行时间限制等等。这对于调试和优化 PHP 应用程序非常有…

手写实现简单Redis命令客户端功能

RESP协议 Redis 的客户端和服务端之间采取了一种名为 Redis序列化的协议&#xff08;REdis Serialization Protocol&#xff0c;简称RESP&#xff09;&#xff0c;是基于 TCP 的应用层协议 &#xff0c;RESP 底层采用的是 TCP 的连接方式&#xff0c;通过 TCP 进行数据传输&am…

layui前端开发-记录一次弹窗嵌套表格功能的开发

1.碎碎念&#xff1a; 前端是真的难写哇&#xff0c;写的巨烂&#xff0c;毕竟平时很少写前端&#xff0c;很容易忘记。每次写都要抱着官方文档看&#xff0c;特此记录一下layui的使用。 大概就是打开一个弹窗实现一些button然后再渲染一个表格上去。 2.code&#xff1a; <…

基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术

随着汽车智能化的发展&#xff0c;车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能&#xff0c;旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…