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

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

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

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

相关链接

接口地址
elementplus中文地址

项目结构

我们的项目结构如下:

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

BookManager.vue 是我们主要的组件文件,它包含了图书管理的所有逻辑。App.vue 和 main.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.tpcf.cn/pingmian/47410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. 项目概述 随着汽车智能化的发展&…