微信小程序图书馆座位预约管理系统
开发工具:IDEA、微信小程序
服务器:Tomcat9.0, jdk1.8
项目构建:maven
数据库:mysql5.7
前端技术:vue、uniapp
服务端技术:springboot+mybatis
本系统分微信小程序和管理后台两部分,项目采用前后端分离
项目功能描述:
1.微信小程序:登录、注册、主页、公告、轮播图、图书馆预约(座位选择、时间选择),图书借阅、个人中心(预约状态、扫码签到、修改密码、设置、退出登录)
2.后台管理:登录、修改密码、系统管理(用户管理、角色管理、菜单管理、组织管理)、图书馆管理、座位管理、通知管理、预约管理、借阅管理、图书管理
文档截图:


微信小程序截图:











后台截图:












package com.yiyue.service.wx;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yiyue.common.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.lang3.StringUtils;
import com.yiyue.model.bean.wx.NoticeAdvise;
import com.yiyue.model.dto.wx.NoticeAdviseDTO;
import com.yiyue.mapper.wx.NoticeAdviseMapper;@Service
@Transactional
public class NoticeAdviseService {@Autowiredprivate NoticeAdviseMapper noticeAdviseMapper;public IPage<NoticeAdvise> findNoticeAdviseListPageByParam(NoticeAdviseDTO noticeAdviseDTO) {// 从dto对象中获得查询条件,添加到queryWrapper对象中, 查询条件还需要视情况自行修改QueryWrapper<NoticeAdvise> queryWrapper=getQueryWrapper(noticeAdviseDTO);IPage<NoticeAdvise> noticeAdviseList=noticeAdviseMapper.findNoticeAdvisePageList(PageUtil.getPagination(noticeAdviseDTO),queryWrapper);return noticeAdviseList;}private QueryWrapper getQueryWrapper(NoticeAdviseDTO noticeAdviseDTO){QueryWrapper<NoticeAdvise> queryWrapper=new QueryWrapper<>();// 序号if(!StringUtils.isBlank(noticeAdviseDTO.getId())){queryWrapper.eq("id",noticeAdviseDTO.getId());}// 标题if(!StringUtils.isBlank(noticeAdviseDTO.getTitle())){queryWrapper.like("title","%"+noticeAdviseDTO.getTitle()+"%");}// 内容if(!StringUtils.isBlank(noticeAdviseDTO.getNoticeContent())){queryWrapper.eq("notice_content",noticeAdviseDTO.getNoticeContent());}// 时间if(!StringUtils.isBlank(noticeAdviseDTO.getCreateDate())){queryWrapper.eq("create_date",noticeAdviseDTO.getCreateDate());}return queryWrapper;}public void insertNoticeAdvise(NoticeAdvise noticeAdvise) {noticeAdviseMapper.insert(noticeAdvise);}public void updateNoticeAdvise(NoticeAdvise noticeAdvise) {this.noticeAdviseMapper.updateById(noticeAdvise);}public void deleteNoticeAdviseById(String id) {this.noticeAdviseMapper.deleteById(id);}public NoticeAdvise findNoticeAdviseById(String id) {return noticeAdviseMapper.selectById(id);}}
package com.yiyue.service.wx;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yiyue.common.util.PageUtil;
import com.yiyue.mapper.wx.SeatStatusMapper;
import com.yiyue.model.bean.wx.SeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.lang3.StringUtils;
import com.yiyue.model.bean.wx.OrderMange;
import com.yiyue.model.dto.wx.OrderMangeDTO;
import com.yiyue.mapper.wx.OrderMangeMapper;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;@Service
@Transactional
public class OrderMangeService {@Autowiredprivate OrderMangeMapper orderMangeMapper;@Autowiredprivate SeatStatusMapper seatStatusMapper;public IPage<OrderMange> findOrderMangeListPageByParam(OrderMangeDTO orderMangeDTO) {// 从dto对象中获得查询条件,添加到queryWrapper对象中, 查询条件还需要视情况自行修改QueryWrapper<OrderMange> queryWrapper=getQueryWrapper(orderMangeDTO);IPage<OrderMange> orderMangeList=orderMangeMapper.findOrderMangePageList(PageUtil.getPagination(orderMangeDTO),queryWrapper);return orderMangeList;}private QueryWrapper getQueryWrapper(OrderMangeDTO orderMangeDTO){QueryWrapper<OrderMange> queryWrapper=new QueryWrapper<>();// 序号if(!StringUtils.isBlank(orderMangeDTO.getId())){queryWrapper.eq("s1.id",orderMangeDTO.getId());}// 订单编号if(!StringUtils.isBlank(orderMangeDTO.getOrderId())){
// queryWrapper.eq("s1.order_id",orderMangeDTO.getOrderId());queryWrapper.eq("s1.id",orderMangeDTO.getOrderId());}// 用户if(!StringUtils.isBlank(orderMangeDTO.getUserId())){queryWrapper.eq("s1.user_id",orderMangeDTO.getUserId());}// 图书馆idif(!StringUtils.isBlank(orderMangeDTO.getLibraryId())){queryWrapper.eq("s1.library_id",orderMangeDTO.getLibraryId());}// 图书馆if(!StringUtils.isBlank(orderMangeDTO.getLibraryName())){queryWrapper.eq("s1.library_name",orderMangeDTO.getLibraryName());}// 座位idif(!StringUtils.isBlank(orderMangeDTO.getSeatId())){queryWrapper.eq("s1.seat_id",orderMangeDTO.getSeatId());}// 座位if(!StringUtils.isBlank(orderMangeDTO.getSeatName())){queryWrapper.eq("s1.seat_name",orderMangeDTO.getSeatName());}// 订单状态if(!StringUtils.isBlank(orderMangeDTO.getOrderStatus())){queryWrapper.eq("s1.order_status",orderMangeDTO.getOrderStatus());}// 预约时间if(!StringUtils.isBlank(orderMangeDTO.getPlanTime())){queryWrapper.eq("s1.plan_time",orderMangeDTO.getPlanTime());}// 创建时间if(!StringUtils.isBlank(orderMangeDTO.getCreateDate())){queryWrapper.eq("create_date",orderMangeDTO.getCreateDate());}return queryWrapper;}public void insertOrderMange(OrderMange orderMange) {orderMangeMapper.insert(orderMange);}public void updateOrderMange(OrderMange orderMange) {this.orderMangeMapper.updateById(orderMange);}public void deleteOrderMangeById(String id) {this.orderMangeMapper.deleteById(id);}public OrderMange findOrderMangeById(String id) {return orderMangeMapper.selectById(id);}public int findUserIdOrOrder(String userId) {QueryWrapper<OrderMange> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id",userId);queryWrapper.eq("order_status",0);return orderMangeMapper.selectCount(queryWrapper);}public OrderMange findOrderState(OrderMangeDTO orderMangeDTO) {QueryWrapper<OrderMange> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id",orderMangeDTO.getUserId());queryWrapper.eq("order_status",0);if (orderMangeMapper.selectList(queryWrapper).size()==0){return null;}return orderMangeMapper.selectList(queryWrapper).get(0);}public void findSeatState(String id) {OrderMange orderMange = orderMangeMapper.selectById(id);int seatId = orderMange.getSeatId();SeatStatus seatStatus = new SeatStatus();seatStatus.setId(seatId);seatStatus.setStatus(0);seatStatusMapper.updateById(seatStatus);}public void selectOrOrderState() {//取消座位预约findSeatStateSimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/* QueryWrapper<OrderMange> queryWrapper = new QueryWrapper<>();queryWrapper.eq("order_status","0");*/List<OrderMange> list = orderMangeMapper.selectList(null);if (list.size()==0){return;}for (int i = 0; i < list.size(); i++) {Date planDate = new Date(list.get(i).getPlanTime().getTime() + 900000);if (planDate.getTime()<new Date().getTime()){orderMangeMapper.deleteById(list.get(i).getId());SeatStatus seatStatus = new SeatStatus();seatStatus.setId(list.get(i).getSeatId());seatStatus.setStatus(0);seatStatusMapper.updateById(seatStatus);}}//时间到时的确认时间QueryWrapper<OrderMange> queryWrapper2 = new QueryWrapper<>();queryWrapper2.eq("order_status","1");List<OrderMange> list2 = orderMangeMapper.selectList(queryWrapper2);if (list.size()==0){return;}for (int i = 0; i < list2.size(); i++) {if (list2.get(i).getEndTime().getTime()<new Date().getTime()){orderMangeMapper.deleteById(list.get(i).getId());SeatStatus seatStatus = new SeatStatus();seatStatus.setId(list.get(i).getSeatId());seatStatus.setStatus(0);seatStatusMapper.updateById(seatStatus);}}}
}
package com.yiyue.service.wx;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yiyue.common.util.PageUtil;
import com.yiyue.common.vo.ItemVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.lang3.StringUtils;
import com.yiyue.model.bean.wx.SeatStatus;
import com.yiyue.model.dto.wx.SeatStatusDTO;
import com.yiyue.mapper.wx.SeatStatusMapper;
import java.util.ArrayList;
import java.util.List;
@Service
@Transactional
public class SeatStatusService {
@Autowired
private SeatStatusMapper seatStatusMapper;
public IPage<SeatStatus> findSeatStatusListPageByParam(SeatStatusDTO seatStatusDTO) {
// 从dto对象中获得查询条件,添加到queryWrapper对象中, 查询条件还需要视情况自行修改
QueryWrapper<SeatStatus> queryWrapper=getQueryWrapper(seatStatusDTO);
IPage<SeatStatus> seatStatusList=seatStatusMapper.findSeatStatusPageList(PageUtil.getPagination(seatStatusDTO),queryWrapper);
return seatStatusList;
}
private QueryWrapper getQueryWrapper(SeatStatusDTO seatStatusDTO){
QueryWrapper<SeatStatus> queryWrapper=new QueryWrapper<>();
// 序号
if(!StringUtils.isBlank(seatStatusDTO.getId())){
queryWrapper.eq("id",seatStatusDTO.getId());
}
// 状态(0空闲;1预约;2占用)
if(!StringUtils.isBlank(seatStatusDTO.getStatus())){
queryWrapper.eq("status",seatStatusDTO.getStatus());
}
// 座位
if(!StringUtils.isBlank(seatStatusDTO.getSeatName())){
queryWrapper.eq("seat_name",seatStatusDTO.getSeatName());
}
// 图书馆
if(!StringUtils.isBlank(seatStatusDTO.getLibraryType())){
queryWrapper.eq("library_type",seatStatusDTO.getLibraryType());
}
return queryWrapper;
}
public void insertSeatStatus(SeatStatus seatStatus) {
seatStatusMapper.insert(seatStatus);
}
public void updateSeatStatus(SeatStatus seatStatus) {
this.seatStatusMapper.updateById(seatStatus);
}
public void deleteSeatStatusById(String id) {
this.seatStatusMapper.deleteById(id);
}
public SeatStatus findSeatStatusById(String id) {
return seatStatusMapper.selectById(id);
}
public List<ItemVO> findSeatListName(String typeId) {
ArrayList<ItemVO> arrayList = new ArrayList<>();
QueryWrapper<SeatStatus> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("library_type",typeId);
queryWrapper.eq("status",0);
List<SeatStatus> seatStatusList=this.seatStatusMapper.selectList(queryWrapper);
seatStatusList.forEach(item->{
ItemVO itemVO = new ItemVO();
itemVO.setKey(item.getId()+"");
itemVO.setValue(item.getId()+"");
itemVO.setTitle(item.getSeatName());
arrayList.add(itemVO);
});
return arrayList;
}
public List<SeatStatus> findSeatListGetLibrary(int id) {
QueryWrapper<SeatStatus> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("library_type",id);
List<SeatStatus> list = seatStatusMapper.selectList(queryWrapper);
return list;
}
}
相关文章:
微信小程序图书馆座位预约管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis本系统分微信小程序和管理后台两部分,项目采用…...
有限元分析学习一
系列文章目录 有限元分析学习一 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、有限元方法的简单介绍1.1 有限元的基础概念1.2 有限元软件发展历史1.3 有限元软件二、弹性力学的简单介绍2.1.…...
android avb2.0 总结
1、android vbmeta结构深入解析 2、android libavb深入解读 看完结构与代码,进一步了解了avb 比如vbmeta的结构、5种描述符、hash公钥签名存储位置 多层vbmeta结构、无vbmeta分区的验证逻辑、hash计算对比、公钥验证、签名验签、5种描述符体的处理 但是还有一些问题没有解决 如…...
聊天机器人-意图识别类,开源库推荐
随着人工智能和自然语言处理技术的不断发展,聊天机器人在商业、教育、医疗等领域的应用越来越广泛。因此,开源聊天机器人代码库也逐渐成为了热门话题。 开源聊天机器人代码库可以帮助开发者快速构建功能强大的聊天机器人,而不必从头开始编写…...
Java 标识符以及修饰符
Java 标识符Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。关于 Java 标识符,有以下几点需要注意:所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_&…...
封装、继承、Super、重写、多态instanceof类型转换的使用以及个人见解
这里写目录标题封装继承supersuper和this的区别重写多态instanceof类型转换封装 之前我们调用共有的属性,是直接可以调用的 但是属性私有后,无法在直接.调用 只能通过getset调用 继承 super 可以直接调用父类中属性和方法,私有的无法做 其…...
day13_面向对象的三大特征之一(封装)
封装概述 为什么需要封装? 现实生活中,每一个个体与个体之间是有边界的,每一个团体与团体之间是有边界的,而同一个个体、团体内部的信息是互通的,只是对外有所隐瞒。例如:我们使用的电脑,内部…...
越界访问数组
越界访问是指访问(操作修改)了不属于自己的空间 我们以如下代码为例:此代码在vs中进行 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello\n");}r…...
软件设计(十)--计算机系统知识
软件设计(九)https://blog.csdn.net/ke1ying/article/details/128990035 一、效验码 奇偶效验:是一种最简单的效验方法。基本思想是:通过在编码中增加一个效验位来使编码中1的个数为奇数(奇效验)或者为偶…...
【不知道是啥】浅保存哈
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...
2021 WAIC 世界人工智能大会参会总结
前言 2021 年世界人工智能大会(WAIC)于2021年7月7日至10日在上海世博展览馆举办,本届大会继续秉持「智联世界」的理念,以「众智成城」为主题,促进全球人工智能创新思想、技术、应用、人才和资本的集聚和交流ÿ…...
ThingsBoard-实现定时任务调度器批量RPC
1、概述 ThingsBoard-CE版是不支持调度器的,只有PE版才支持,但是系统中很多时候需要使用调度器来实现功能,例如:定时给设备下发rpc查询数据,我们如何来实现呢?下面我将教你使用巧妙的方法来实现。 2、使用什么实现 我们可以使用规则链提供的一个节点来实现,这个节点可…...
MySQL数据库调优————数据库调优维度及测试数据准备
MySQL性能优化金字塔法则 不合理的需求,会造成很多问题。(比如未分页,数据需要多表联查等)做架构设计的时候,应充分考虑业务的实际情况,考虑好数据库的各种选择(比如是否要读写分离,…...
电子货架标签多种固定方式
2.1寸和2.9寸电子价格标签多种固定方式: 1、桌面支架,放置在桌面或是货架上,用于桌面产品的价格或是信息显示 2、粘贴架,方便用于墙面桌面等应用 3、半透明支架,用于货架上的商品吊挂显示价格信息 4、轨道架ÿ…...
基于JavaEE的智能化跨境电子商务平台的设计
技术:Java、JSP、框架等摘要:伴随着近年来互联网的迅猛发展,网上零售逐渐成为了一种影响广泛、方便快捷的购物渠道。我国网上零售业发展的步伐很快。在如今经济全球化的影响下,消费者的网购行为趋于开放化、多元化,对于…...
C语言学习笔记(二): 简单的C程序设计
数据的表现形式 常量 在C语言中常量有以下几种: 整型常量: 0,-1,100实型常量: 小数形式(12.12);指数形式(12.1e312.110312.1\times 10^312.1103)字符常量: 普通字符(’a’,’Z’,’#’);转义字符(’\n’…...
十、STM32端口复用重映射
目录 1.什么是端口复用? 2.如何配置端口复用? 3.什么是端口重映射 ? 4.什么是部分重映射和完全重映射? 5.重映射的配置过程 1.什么是端口复用? STM32有很多外设,外设的外部引脚与GPIO复用。也就是说一…...
【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号
文章目录1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf2.1 构造函数:对成员变量初始化2.2 析构函数:一个类只有一个,不允许被重载3.引用:C中&取地址&#x…...
Spring基础知识
1 简介官网:https://spring.io/projects,Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。Spring Framework是最底层的框架,是其他项目的根基。Spring Boot Spring MVC…...
proxy代理与reflect反射
proxy代理与reflect 在这之前插入一个知识点arguments,每个函数里面都有一个arguments,执行时候不传默认是所有参数,如果传了就是按顺序匹配,箭头函数没有 代理函数 代理对象也就是生成一个替身,然后这个替身处理一切的…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
