微信小程序图书馆座位预约管理系统
开发工具: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,执行时候不传默认是所有参数,如果传了就是按顺序匹配,箭头函数没有 代理函数 代理对象也就是生成一个替身,然后这个替身处理一切的…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
