当前位置: 首页 > news >正文

微信小程序图书馆座位预约管理系统

开发工具: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;
}

}

相关文章:

微信小程序图书馆座位预约管理系统

开发工具&#xff1a;IDEA、微信小程序服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7前端技术&#xff1a;vue、uniapp服务端技术&#xff1a;springbootmybatis本系统分微信小程序和管理后台两部分&#xff0c;项目采用…...

有限元分析学习一

系列文章目录 有限元分析学习一 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、有限元方法的简单介绍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种描述符体的处理 但是还有一些问题没有解决 如…...

聊天机器人-意图识别类,开源库推荐

随着人工智能和自然语言处理技术的不断发展&#xff0c;聊天机器人在商业、教育、医疗等领域的应用越来越广泛。因此&#xff0c;开源聊天机器人代码库也逐渐成为了热门话题。 开源聊天机器人代码库可以帮助开发者快速构建功能强大的聊天机器人&#xff0c;而不必从头开始编写…...

Java 标识符以及修饰符

Java 标识符Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。关于 Java 标识符&#xff0c;有以下几点需要注意&#xff1a;所有的标识符都应该以字母&#xff08;A-Z 或者 a-z&#xff09;,美元符&#xff08;$&#xff09;、或者下划线&#xff08;_&…...

封装、继承、Super、重写、多态instanceof类型转换的使用以及个人见解

这里写目录标题封装继承supersuper和this的区别重写多态instanceof类型转换封装 之前我们调用共有的属性&#xff0c;是直接可以调用的 但是属性私有后&#xff0c;无法在直接.调用 只能通过getset调用 继承 super 可以直接调用父类中属性和方法&#xff0c;私有的无法做 其…...

day13_面向对象的三大特征之一(封装)

封装概述 为什么需要封装&#xff1f; 现实生活中&#xff0c;每一个个体与个体之间是有边界的&#xff0c;每一个团体与团体之间是有边界的&#xff0c;而同一个个体、团体内部的信息是互通的&#xff0c;只是对外有所隐瞒。例如&#xff1a;我们使用的电脑&#xff0c;内部…...

越界访问数组

越界访问是指访问&#xff08;操作修改&#xff09;了不属于自己的空间 我们以如下代码为例&#xff1a;此代码在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…...

软件设计(十)--计算机系统知识

软件设计&#xff08;九&#xff09;https://blog.csdn.net/ke1ying/article/details/128990035 一、效验码 奇偶效验&#xff1a;是一种最简单的效验方法。基本思想是&#xff1a;通过在编码中增加一个效验位来使编码中1的个数为奇数&#xff08;奇效验&#xff09;或者为偶…...

【不知道是啥】浅保存哈

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

2021 WAIC 世界人工智能大会参会总结

前言 2021 年世界人工智能大会&#xff08;WAIC&#xff09;于2021年7月7日至10日在上海世博展览馆举办&#xff0c;本届大会继续秉持「智联世界」的理念&#xff0c;以「众智成城」为主题&#xff0c;促进全球人工智能创新思想、技术、应用、人才和资本的集聚和交流&#xff…...

ThingsBoard-实现定时任务调度器批量RPC

1、概述 ThingsBoard-CE版是不支持调度器的,只有PE版才支持,但是系统中很多时候需要使用调度器来实现功能,例如:定时给设备下发rpc查询数据,我们如何来实现呢?下面我将教你使用巧妙的方法来实现。 2、使用什么实现 我们可以使用规则链提供的一个节点来实现,这个节点可…...

MySQL数据库调优————数据库调优维度及测试数据准备

MySQL性能优化金字塔法则 不合理的需求&#xff0c;会造成很多问题。&#xff08;比如未分页&#xff0c;数据需要多表联查等&#xff09;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择&#xff08;比如是否要读写分离&#xff0c;…...

电子货架标签多种固定方式

2.1寸和2.9寸电子价格标签多种固定方式&#xff1a; 1、桌面支架&#xff0c;放置在桌面或是货架上&#xff0c;用于桌面产品的价格或是信息显示 2、粘贴架&#xff0c;方便用于墙面桌面等应用 3、半透明支架&#xff0c;用于货架上的商品吊挂显示价格信息 4、轨道架&#xff…...

基于JavaEE的智能化跨境电子商务平台的设计

技术&#xff1a;Java、JSP、框架等摘要&#xff1a;伴随着近年来互联网的迅猛发展&#xff0c;网上零售逐渐成为了一种影响广泛、方便快捷的购物渠道。我国网上零售业发展的步伐很快。在如今经济全球化的影响下&#xff0c;消费者的网购行为趋于开放化、多元化&#xff0c;对于…...

C语言学习笔记(二): 简单的C程序设计

数据的表现形式 常量 在C语言中常量有以下几种&#xff1a; 整型常量&#xff1a; 0,-1,100实型常量&#xff1a; 小数形式(12.12)&#xff1b;指数形式(12.1e312.110312.1\times 10^312.1103)字符常量&#xff1a; 普通字符(’a’,’Z’,’#’)&#xff1b;转义字符(’\n’…...

十、STM32端口复用重映射

目录 1.什么是端口复用&#xff1f; 2.如何配置端口复用&#xff1f; 3.什么是端口重映射 &#xff1f; 4.什么是部分重映射和完全重映射&#xff1f; 5.重映射的配置过程 1.什么是端口复用&#xff1f; STM32有很多外设&#xff0c;外设的外部引脚与GPIO复用。也就是说一…...

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号

文章目录1.函数重载&#xff1a;writetofile()&#xff0c;Ctrue和false&#xff0c;C0和非02.类和对象&#xff1a;vprintf2.1 构造函数&#xff1a;对成员变量初始化2.2 析构函数&#xff1a;一个类只有一个&#xff0c;不允许被重载3.引用&#xff1a;C中&取地址&#x…...

Spring基础知识

1 简介官网&#xff1a;https://spring.io/projects&#xff0c;Spring发展到今天已经形成了一种开发生态圈&#xff0c;Spring提供了若干个项目&#xff0c;每个项目用于完成特定的功能。Spring Framework是最底层的框架&#xff0c;是其他项目的根基。Spring Boot Spring MVC…...

proxy代理与reflect反射

proxy代理与reflect 在这之前插入一个知识点arguments&#xff0c;每个函数里面都有一个arguments&#xff0c;执行时候不传默认是所有参数&#xff0c;如果传了就是按顺序匹配&#xff0c;箭头函数没有 代理函数 代理对象也就是生成一个替身&#xff0c;然后这个替身处理一切的…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【Linux】Linux 系统默认的目录及作用说明

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

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...