6云图书管理系统-图书展示

1 /src/store中新增userInfo.js,用于保存用户的登录信息

import { defineStore } from "pinia"
import { ref } from 'vue'export const userInfoStore = defineStore('userInfo', () => {//1.定义用户信息const info = ref({})const isAdmin = ref(false)//2.定义修改用户信息的方法const setInfo = (newInfo) => {info.value = newInfoisAdmin.value = newInfo.userRole === 'ADMIN'}//3.定义清空用户信息的方法const removeInfo = () => {info.value = {}}return { info, isAdmin, setInfo, removeInfo }
}, {persist: true
})

2 Login.vue组件登录成功之后,保存token

import { useTokenStore } from '@/stores/token.js'const tokenStore = useTokenStore()
c
onst login = async () => {let result = await loginService(registerData.value)//保存tokenconsole.log("结果是" + result);tokenStore.setToken(result.data)//  保存用户登录信息ElMessage.success(result.msg ? result.msg : '登录成功')router.push('/')
}

3 /api/user.js中添加获取用户个人信息的接口

//获取用户信息
export const userInfoGetService = () => {return request.get('/user/userinfo');
}

4 首页LayoutVue.vue组件添加如下代码,用户登录成功之后,在首页获取用户信息,并根据是管理员还是普通用户,实现不同组件显示

// 导入ref
import { ref } from 'vue'
//导入接口函数
import { userInfoGetService } from '@/api/user.js'
//导入pinia
import { userInfoStore } from '@/stores/userInfo.js'
const useruserInfoStore = userInfoStore();
// 管理员状态
const isAdmin = ref(useruserInfoStore.isAdmin)import { useTokenStore } from '@/stores/token.js'
const tokenStore = useTokenStore();
//获取个人信息
const getUserInf = async () => {let result = await userInfoGetService();//存储piniauseruserInfoStore.setInfo(result.data);
}
getUserInf()

5 首页LayoutVue完整代码如下

<script setup>
import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom
} from '@element-plus/icons-vue'
import avatar from '@/assets/default.png'// 导入ref
import { ref } from 'vue'
//导入接口函数
import { userInfoGetService } from '@/api/user.js'
//导入pinia
import { userInfoStore } from '@/stores/userInfo.js'
const useruserInfoStore = userInfoStore();import { useTokenStore } from '@/stores/token.js'
const tokenStore = useTokenStore();//获取个人信息
const getUserInf = async () => {let result = await userInfoGetService();//存储piniauseruserInfoStore.setInfo(result.data);
}
getUserInf()// 管理员状态
const isAdmin = ref(useruserInfoStore.isAdmin.value)// 导入路由
import router from '@/router'
import { ElMessage, ElMessageBox } from 'element-plus'
//条目被点击后,调用的函数
const handleCommand = (command) => {if (command == 'logout') {//退出登录ElMessageBox.confirm('你确认退出登录码?','温馨提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async () => {//用户点击了确认//清空pinia中的token和个人信息useruserInfoStore.setInfo('')tokenStore.token = ''//跳转到登录页router.push('/login')}).catch(() => {//用户点击了取消ElMessage({type: 'info',message: '取消退出',})})} else {router.push(`/user/${command}`);}
}</script><template><el-container class="layout-container"><!-- 左侧菜单 --><el-aside width="200px"><div class="el-aside__logo"></div><el-menu active-text-color="#ffd04b" background-color="#232323" text-color="#fff" router><el-menu-item index="/book/resources"><el-icon><Book /></el-icon><span>图书资源</span></el-menu-item><!-- 如果是管理员就显示用户管理组件 否则就显示借阅记录组件 --><el-menu-item v-if="!useruserInfoStore.isAdmin" index="/book/records"><el-icon><User /></el-icon><span>借阅记录</span></el-menu-item><el-menu-item v-else index="/user/manage"><el-icon><Document /></el-icon><span>用户管理</span></el-menu-item><el-sub-menu><template #title><el-icon><UserFilled /></el-icon><span>个人中心</span></template><el-menu-item index="/user/info"><el-icon><User /></el-icon><span>基本资料</span></el-menu-item><el-menu-item index="/user/avatar"><el-icon><Crop /></el-icon><span>更换头像</span></el-menu-item><el-menu-item index="/user/password"><el-icon><EditPen /></el-icon><span>重置密码</span></el-menu-item></el-sub-menu></el-menu></el-aside><!-- 右侧主区域 --><el-container><!-- 头部区域 --><el-header><div>当前用户:<strong>{{ useruserInfoStore.info.userName }}</strong></div><el-dropdown placement="bottom-end" @command="handleCommand"><span class="el-dropdown__box"><el-avatar src="@/assets/default.png" /><el-icon><CaretBottom /></el-icon></span><template #dropdown><el-dropdown-menu><el-dropdown-item command="info" :icon="User">基本资料</el-dropdown-item><el-dropdown-item command="avatar" :icon="Crop">更换头像</el-dropdown-item><el-dropdown-item command="password" :icon="EditPen">重置密码</el-dropdown-item><el-dropdown-item command="logout" :icon="SwitchButton">退出登录</el-dropdown-item></el-dropdown-menu></template></el-dropdown></el-header><!-- 中间区域 --><el-main><!-- <div style="width: 1290px; height: 570px;border: 1px solid red;">内容展示区</div> --><router-view></router-view></el-main><!-- 底部区域 --><el-footer>软件之声论坛 ©2024 Created by xumj</el-footer></el-container></el-container>
</template><style lang="scss" scoped>
.layout-container {height: 100vh;.el-aside {background-color: #232323;&__logo {height: 120px;background: url('@/assets/logo.png') no-repeat center / 120px auto;}.el-menu {border-right: none;}}.el-header {background-color: #fff;display: flex;align-items: center;justify-content: space-between;.el-dropdown__box {display: flex;align-items: center;.el-icon {color: #999;margin-left: 10px;}&:active,&:focus {outline: none;}}}.el-footer {display: flex;align-items: center;justify-content: center;font-size: 14px;color: #666;}
}
</style>

6 /api/book.js中添加图书查询接口

// 导入request.js请求工具
import request from '@/utils/request.js'//图书列表
export const bookListService = () => {return request.get('/book/allBook')
}

7 后台Java处理代码

    //查询所有的图书@GetMapping("/allBook")public Result getAllBook(){System.out.println("收到查询请求");List<Book> bookList = iBookService.list();return Result.success(bookList);}

8 /books/BookResourcesVue.vue组件中添加如下代码

<script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus, Edit, Delete } from '@element-plus/icons-vue'import { userInfoStore } from '@/stores/userInfo.js'
const useruserInfoStore = userInfoStore();
const isAdmin = ref(useruserInfoStore.isAdmin)// 图书表单数据模型
const bookModel = ref({bookId: '',bookName: '',bookIsbn: '',bookPress: '',bookAuthor: '',bookPagination: '',bookPrice: '',bookUploadtime: '',bookStatus: '',bookBorrower: '',bookBorrowtime: '',bookReturntime: ''
})// 表单引用
const formRef = ref(null)// 用户搜索时选中的状态
const state = ref('全部')// 图书列表数据模型
const books = ref([{"bookId": 1,"bookName": "西游记","bookIsbn": "978-7-115-58402-8","bookPress": "人民邮电出版社","bookAuthor": "张三","bookPagination": "256页","bookPrice": "45.00元","bookUploadtime": "2023-09-03 11:55:30","bookStatus": "可借阅","bookBorrower": "","bookBorrowtime": "","bookReturntime": ""},// 其他图书项...
])// 表单验证规则
const rules = {bookName: [{ required: true, message: '请输入书名', trigger: 'blur' }],bookIsbn: [{ required: true, message: '请输入ISBN', trigger: 'blur' }],bookPress: [{ required: true, message: '请输入出版社', trigger: 'blur' }],bookAuthor: [{ required: true, message: '请输入作者', trigger: 'blur' }],bookPagination: [{ required: true, message: '请输入页数', trigger: 'blur' },{ type: 'number', message: '页数必须是数字', trigger: 'blur' }],bookPrice: [{ required: true, message: '请输入价格', trigger: 'blur' }]
}// // 图书列表查询
import { bookListService } from '@/api/book.js'
const getBooks = async () => {let result = await bookListService()// 渲染列表数据books.value = result.data
}
getBooks()// 控制抽屉是否显示
const visibleDrawer = ref(false)// 导入 token
import { useTokenStore } from '@/stores/token.js'
const tokenStore = useTokenStore()// 添加图书
const addBook = () => {console.log("借书功能");
}
// 写借阅图书的方法 borrowBook
const borrowBook = (bookId) => {console.log("借书功能");
}</script><template><el-card class="page-container"><template #header><div class="header"><!-- <span>图书管理</span> --><!-- 如果isAdmin值为真就显示组件 --><span v-if="isAdmin"><el-button type="primary" @click="visibleDrawer = true">添加图书</el-button></span></div></template><!-- 搜索表单 --><el-form inline><el-form-item label="状态:"><el-select placeholder="请选择" v-model="state"><el-option label="可借阅" value="可借阅"></el-option><el-option label="已借出" value="已借出"></el-option></el-select></el-form-item><el-form-item><el-button type="primary" @click="getBooks">搜索</el-button><el-button @click="state = ''">重置</el-button></el-form-item></el-form><!-- 图书列表 --><el-table :data="books" style="width: 100%"><el-table-column label="书名" prop="bookName"></el-table-column><el-table-column label="ISBN" prop="bookIsbn"></el-table-column><el-table-column label="出版社" prop="bookPress"></el-table-column><el-table-column label="作者" prop="bookAuthor"></el-table-column><el-table-column label="页数" prop="bookPagination"></el-table-column><el-table-column label="价格" prop="bookPrice"></el-table-column><el-table-column label="上传时间" prop="bookUploadtime"></el-table-column><el-table-column label="状态" prop="bookStatus"></el-table-column><el-table-column label="借阅人" prop="bookBorrower"></el-table-column><el-table-column label="借阅时间" prop="bookBorrowtime"></el-table-column><el-table-column label="归还时间" prop="bookReturntime"></el-table-column><el-table-column v-if="isAdmin" label="操作" width="100"><template #default="{ row }"><el-button :icon="Edit" circle plain type="primary"></el-button><el-button :icon="Delete" circle plain type="danger"></el-button></template></el-table-column><!-- 如果是普通用户并且图书状态为0 就显示  row.bookStatus == 0--><el-table-column v-else label="操作" width="100"><template #default="{ row }"><el-button v-if="row.bookStatus == 0" plain type="primary"@click="borrowBook(row.bookId)">借阅</el-button><el-button v-if="row.bookStatus == 1" plain disabled type="primary"@click="borrowBook(row.bookId)">借阅</el-button></template></el-table-column><template #empty><el-empty description="没有数据" /></template></el-table><!-- 抽屉 --><el-drawer v-model="visibleDrawer" title="添加图书" direction="rtl" size="50%"><!-- 添加图书表单 --><el-form :model="bookModel" :rules="rules" ref="formRef" label-width="100px"><el-form-item label="书名" prop="bookName"><el-input v-model="bookModel.bookName" placeholder="请输入书名"></el-input></el-form-item><el-form-item label="ISBN" prop="bookIsbn"><el-input v-model="bookModel.bookIsbn" placeholder="请输入ISBN"></el-input></el-form-item><el-form-item label="出版社" prop="bookPress"><el-input v-model="bookModel.bookPress" placeholder="请输入出版社"></el-input></el-form-item><el-form-item label="作者" prop="bookAuthor"><el-input v-model="bookModel.bookAuthor" placeholder="请输入作者"></el-input></el-form-item><el-form-item label="页数" prop="bookPagination"><el-input v-model.number="bookModel.bookPagination" placeholder="请输入页数"></el-input></el-form-item><el-form-item label="价格" prop="bookPrice"><el-input v-model="bookModel.bookPrice" placeholder="请输入价格"></el-input></el-form-item><el-form-item><el-button type="primary" @click="addBook">保存</el-button></el-form-item></el-form></el-drawer></el-card>
</template><style scoped>
/* 保持原有样式 */
</style>

9 普通用户登录

在这里插入图片描述

10 管理员登录

在这里插入图片描述

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

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

相关文章

css 仿微信朋友圈图片自适应九宫格

不好用请移至评论区揍我 原创代码,请勿转载,谢谢! 示例效果 1 ~ 5张图与5 ~ 9张图 代码实现 <view style="

卸载Python

1、查看安装框架位置并删除 Sudo rm -rf /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8 2、查看应用并删除 在 /Applications/Python 3.x 看是否存在&#xff0c;如果存在并删除。 3、删除软连接 ls -l /usr/bin/py* 或 ls -…

什么是分布式锁?Redis的分布式锁又是什么?

什么是分布式锁&#xff1f; 分布式锁是一种用于解决分布式系统中多节点对共享资源并发访问问题的机制。在分布式系统中&#xff0c;多个服务器实例或服务进程可能同时操作某个共享资源&#xff08;如数据库记录、缓存条目、文件等&#xff09;&#xff0c;导致数据不一致或竞…

千鹿 AI:强大的抠图神器,让你的工作效率飙升99%

宝子们&#xff0c;今天一定要给大家分享一款超厉害的抠图工具 —— 千鹿 AI。千鹿 AI 用起来真的是极其方便&#xff0c;仅仅上传一张图片&#xff0c;短短几秒钟的时间&#xff0c;就能够获得一张边缘超级清晰的抠图成品&#xff0c;实在是令人惊叹。 鹿 AI 的厉害之处有很多…

【Linux系统编程】环境基础开发工具使用

目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…

二百六十九、Kettle——ClickHouse清洗ODS层原始数据增量导入到DWD层表中

一、目的 清洗ClickHouse的ODS层原始数据&#xff0c;增量导入到DWD层表中 二、实施步骤 2.1 newtime select( select create_time from hurys_jw.dwd_statistics order by create_time desc limit 1) as create_time 2.2 替换NULL值 2.3 clickhouse输入 2.4 字段选择 2.5 …

UDP反射放大攻击防范手册

UDP反射放大攻击是一种极具破坏力的恶意攻击手段。 一、UDP反射放大攻击的原理 UDP反射放大攻击主要利用了UDP协议的特性。攻击者会向互联网上大量的开放UDP服务的服务器发送伪造的请求数据包。这些请求数据包的源IP地址被篡改为目标受害者的IP地址。当服务器收到这些请求后&…

『网络游戏』服务器启动逻辑【16】

新建Visual Studio工程命名为NetGameServer 重命名为ServerStart.cs 创建脚本&#xff1a; 编写脚本&#xff1a;ServerRoot.cs 编写脚本&#xff1a;ServerStart.cs 新建文件夹 调整脚本位置 新建文件夹 新建文件夹网络服务 创建脚本&#xff1a;NetSvc.cs 编写脚本&#xff1…

【word】文章里的表格边框是双杠

日常小伙伴们遇到word里插入的表格&#xff0c;边框是双杠的&#xff0c;直接在边框和底纹里修改边框的样式就可以&#xff0c;但我今天遇到的这个有点特殊&#xff0c;先看看表格在word里的样式是怎么样&#xff0c;然后我们聊聊如何解决。 这个双杠不是边框和底纹的设置原因…

linux线程 | 一点通你的互斥锁 | 同步与互斥

前言&#xff1a;本篇文章主要讲述linux线程的互斥的知识。 讲解流程为先讲解锁的工作原理&#xff0c; 再自己封装一下锁并且使用一下。 做完这些就要输出一堆理论性的东西&#xff0c; 但博主会总结两条结论&#xff01;&#xff01;最后就是讲一下死锁。 那么&#xff0c; 废…

《量子之歌》

第一章&#xff1a;曙光 在2045年的未来&#xff0c;人工智能不再是科幻作品中的虚构&#xff0c;而是成为了日常生活的一部分。在这个时代&#xff0c;深度学习模型已经变得如此庞大和复杂&#xff0c;以至于即使是最快的超级计算机也需要数小时才能完成一次完整的训练。 陈欣…

大华智能云网关注册管理平台 SQL注入漏洞复现(CNVD-2024-38747)

0x01 产品简介 大华智能云网关注册管理平台是一款专为解决社会面视频资源接入问题而设计的高效、便捷的管理工具,平台凭借其高效接入、灵活部署、安全保障、兼容性和便捷管理等特点,成为了解决社会面视频资源接入问题的优选方案。该平台不仅提高了联网效率,降低了联网成本,…

【前端】制作一个自己的网页(4)

刚才我们完成了网页中标题与段落元素的学习。在实际开发时&#xff0c;一个网页通常会包含多个相同元素&#xff0c;比如多个标题与段落。 对于相同标签的元素&#xff0c;我们又该如何区分定位呢&#xff1f; 对多个相同的标签分类 比如右图设置了七个段落元素&#xff0c;它…

DS堆的实际应用(10)

文章目录 前言一、堆排序建堆排序 二、TopK问题原理实战创建一个有一万个数的文件读取文件并将前k个数据创建小堆用剩余的N-K个元素依次与堆顶元素来比较将前k个数据打印出来并关闭文件 测试 三、堆的相关习题总结 前言 学完了堆这个数据结构的概念和特性后&#xff0c;我们来看…

react18中实现简易增删改查useReducer搭配useContext的高级用法

useReducer和useContext前面有单独介绍过&#xff0c;上手不难&#xff0c;现在我们把这两个api结合起来使用&#xff0c;该怎么用&#xff1f;还是结合之前的简易增删改查的demo&#xff0c;熟悉vue的应该可以看出&#xff0c;useReducer类似于vuex&#xff0c;useContext类似…

wxml 模板语法-数据绑定

mustache 语法的应用场景&#xff1a; 动态绑定内容&#xff1a; 动态绑定属性&#xff1a; 三元运算&#xff1a; 算数运算&#xff1a;

MobileNet v3(相比于MobileNet v2)

概述&#xff1a; 更新Block(bneck) 使用NAS搜索参数 &#xff08;Neural Architecture Search&#xff09; 重新设计耗时层结构 更准确&#xff0c;更高效 以及表中数据展示 更新Block 1.加入SE模块 2.更新了激活函数 首先通过一个1*1的卷积层来进行一个升维处理&#…

深入了解vcruntime140.dll:为什么会出现vcruntime140.dll丢失及修复

“找不到vcruntime140.dll”或“vcruntime140.dll丢失”是什么情况&#xff1f;出现这样的情况有什么方法可以解决&#xff1f;今天这篇文章将和大家聊聊vcruntime140.dll丢失错误的详细解决办法&#xff0c;一步步教大家修复错误vcruntime140.dll文件。 一步步修复错误vcrunti…

[含文档+PPT+源码等]精品基于springboot实现的原生微信小程序酒店管理系统[包运行成功+永久免费答疑辅导]

基于Spring Boot实现的原生微信小程序酒店管理系统&#xff0c;其背景主要源于酒店行业的信息化需求和移动互联网技术的快速发展。以下是对该背景的具体阐述&#xff1a; 一、酒店行业的信息化需求 信息量剧增&#xff1a; 随着旅游业的蓬勃发展&#xff0c;酒店数量不断增加&…

AI金融攻防赛:金融场景凭证篡改检测(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题&#xff0c;以及解决思路和代码实现过程。希望…