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


微信小程序截图:











后台截图:












package com.yiyue.service.system;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yiyue.common.exception.CustomException;
import com.yiyue.common.util.Assert;
import com.yiyue.common.util.PageUtil;
import com.yiyue.interceptor.SystemUserContextHolder;
import com.yiyue.mapper.system.SysOrganMapper;
import com.yiyue.mapper.system.SysUserMapper;
import com.yiyue.model.bean.system.SysOrgan;
import com.yiyue.model.bean.system.SysUser;
import com.yiyue.model.dto.system.SysUserDTO;
import com.yiyue.model.dto.system.UserPasswordDTO;
import com.yiyue.model.vo.system.SysUserVO;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.DefaultPasswordService;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.Date;@Service
@Transactional
public class SysUserService {@Autowiredprivate SysUserMapper sysUserMapper;@Autowiredprivate SysOrganMapper sysOrganMapper;@Autowiredprivate DefaultPasswordService passwordService;public IPage<SysUserVO> findSysUserList(SysUserDTO sysUserDTO) {QueryWrapper<SysUserVO> queryWrapper=new QueryWrapper<>();if(!StringUtils.isBlank(sysUserDTO.getUserName())){queryWrapper.like("su.user_name","%"+sysUserDTO.getUserName()+"%");}if(!StringUtils.isBlank(sysUserDTO.getLoginName())){queryWrapper.like("su.login_name","%"+sysUserDTO.getLoginName()+"%");}if(!StringUtils.isBlank(sysUserDTO.getPhone())){queryWrapper.like("su.phone","%"+sysUserDTO.getPhone()+"%");}if(!StringUtils.isBlank(sysUserDTO.getUserSex())){queryWrapper.eq("su.user_sex",sysUserDTO.getUserSex());}if(!StringUtils.isBlank(sysUserDTO.getOrgName())){queryWrapper.like("so.org_name","%"+sysUserDTO.getOrgName()+"%");}if(!StringUtils.isBlank(sysUserDTO.getOrgId())){queryWrapper.eq("su.org_id",sysUserDTO.getOrgId());}queryWrapper.eq("su.user_state",0);queryWrapper.eq("so.org_state",0);IPage<SysUserVO> ipage=sysUserMapper.findSysUserListByParam(PageUtil.getPagination(sysUserDTO),queryWrapper);return ipage;}public SysUser findSysUserByUserId(String userId) {SysUser sysUser=this.sysUserMapper.selectById(userId);SysOrgan sysOrgan=this.sysOrganMapper.selectById(sysUser.getOrgId());sysUser.setOrgName(sysOrgan.getOrgName());return sysUser;}public void insertSysUser(SysUser sysUser) {//验证用户登录名是否已注册过QueryWrapper<SysUser> queryWrapper=new QueryWrapper<>();queryWrapper.eq("login_name",sysUser.getLoginName());SysUser user=this.sysUserMapper.selectOne(queryWrapper);if(null!=user){throw new CustomException("用户登录名已被注册过,请换个登录名");}sysUser.setLoginPass(passwordService.encryptPassword(sysUser.getLoginPass()));sysUser.setCreateDate(new Date());sysUser.setUserState(0);this.sysUserMapper.insert(sysUser);}public void deleteSysUserById(String userId) {SysUser sysUser=sysUserMapper.selectById(userId);sysUser.setUserState(-1);this.sysUserMapper.updateById(sysUser);}public void updateSysUser(SysUser sysUser) {this.sysUserMapper.updateById(sysUser);}public void reset_user_login_pass(String userId) {SysUser sysUser=this.sysUserMapper.selectById(userId);sysUser.setLoginPass(passwordService.encryptPassword("123456"));this.sysUserMapper.updateById(sysUser);}public void updateLoginPassword(UserPasswordDTO userPasswordDTO) {SysUser sysUser = sysUserMapper.selectById(SystemUserContextHolder.getUserId());Assert.isBlank(userPasswordDTO.getOldPassword(), "用户旧密码不能为空");Assert.isMaxLength(userPasswordDTO.getOldPassword(), 20, "用户旧密码长度不能超过20位");try {Subject subject = SecurityUtils.getSubject();UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(sysUser.getLoginName(), userPasswordDTO.getOldPassword());subject.login(usernamePasswordToken);}catch (Exception e){throw new CustomException("用户旧密码错误");}Assert.isBlank(userPasswordDTO.getNewPassword(), "用户新密码不能为空");Assert.isMaxLength(userPasswordDTO.getNewPassword(), 20, "用户新密码长度不能超过20位");Assert.isBlank(userPasswordDTO.getConfirmPassword(), "用户确认密码不能为空");Assert.isMaxLength(userPasswordDTO.getConfirmPassword(), 20, "用户确认密码长度不能超过20位");if (!userPasswordDTO.getNewPassword().equals(userPasswordDTO.getConfirmPassword())) {throw new CustomException("用户新密码和确认密码不同");}sysUser.setLoginPass(passwordService.encryptPassword(userPasswordDTO.getNewPassword()));sysUserMapper.updateById(sysUser);}public IPage<SysUser> selectAllList(SysUserDTO sysUserDTO) {QueryWrapper<SysUser> queryWrapper=new QueryWrapper<>();if(!StringUtils.isBlank(sysUserDTO.getUserName())){queryWrapper.like("user_name","%"+sysUserDTO.getUserName()+"%");}if(!StringUtils.isBlank(sysUserDTO.getPhone())){queryWrapper.like("phone","%"+sysUserDTO.getPhone()+"%");}queryWrapper.eq("user_state",0);IPage<SysUser> ipage=sysUserMapper.selectPage(PageUtil.getPagination(sysUserDTO),queryWrapper);return ipage;}
}
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.BooksManger;
import com.yiyue.model.dto.wx.BooksMangerDTO;
import com.yiyue.mapper.wx.BooksMangerMapper;
@Service
@Transactional
public class BooksMangerService {
@Autowired
private BooksMangerMapper booksMangerMapper;
public IPage<BooksManger> findBooksMangerListPageByParam(BooksMangerDTO booksMangerDTO) {
// 从dto对象中获得查询条件,添加到queryWrapper对象中, 查询条件还需要视情况自行修改
QueryWrapper<BooksManger> queryWrapper=getQueryWrapper(booksMangerDTO);
IPage<BooksManger> booksMangerList=booksMangerMapper.findBooksMangerPageList(PageUtil.getPagination(booksMangerDTO),queryWrapper);
return booksMangerList;
}
private QueryWrapper getQueryWrapper(BooksMangerDTO booksMangerDTO){
QueryWrapper<BooksManger> queryWrapper=new QueryWrapper<>();
// 序号
if(!StringUtils.isBlank(booksMangerDTO.getId())){
queryWrapper.eq("id",booksMangerDTO.getId());
}
// 书名
if(!StringUtils.isBlank(booksMangerDTO.getBookName())){
queryWrapper.like("book_name","%"+booksMangerDTO.getBookName()+"%");
}
// 图片
if(!StringUtils.isBlank(booksMangerDTO.getBookImg())){
queryWrapper.eq("book_img",booksMangerDTO.getBookImg());
}
// 内容
if(!StringUtils.isBlank(booksMangerDTO.getBookText())){
queryWrapper.eq("book_text",booksMangerDTO.getBookText());
}
// 借阅状态(0,可借,1已借)
if(!StringUtils.isBlank(booksMangerDTO.getUseState())){
queryWrapper.eq("use_state",booksMangerDTO.getUseState());
}
// 备注
if(!StringUtils.isBlank(booksMangerDTO.getBookMark())){
queryWrapper.eq("book_mark",booksMangerDTO.getBookMark());
}
// 创建时间
if(!StringUtils.isBlank(booksMangerDTO.getCreateDate())){
queryWrapper.eq("create_date",booksMangerDTO.getCreateDate());
}
return queryWrapper;
}
public void insertBooksManger(BooksManger booksManger) {
booksMangerMapper.insert(booksManger);
}
public void updateBooksManger(BooksManger booksManger) {
this.booksMangerMapper.updateById(booksManger);
}
public void deleteBooksMangerById(String id) {
this.booksMangerMapper.deleteById(id);
}
public BooksManger findBooksMangerById(String id) {
return booksMangerMapper.selectById(id);
}
}
相关文章:
基于微信小程序图书馆座位预约管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis本系统分微信小程序和管理后台两部分,项目采用…...
剑指 Offer Day1——栈与队列(简单)
本专栏将记录《剑指 Offer》的刷题,传送门:https://leetcode.cn/study-plan/lcof/。 目录剑指 Offer 09. 用两个栈实现队列剑指 Offer 30. 包含min函数的栈剑指 Offer 09. 用两个栈实现队列 原题链接:09. 用两个栈实现队列 class CQueue { pu…...
详解Python正则表达式中group与groups的用法
在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息。 group方法是re.MatchObject类中的一个函数,用于返回匹配对象的整个匹配结果或特定的分组匹配结果。而groups方法同样是re.MatchObject类中的函数&am…...
Spring面试重点(三)——AOP循环依赖
Spring面试重点 AOP 前置通知(Before):在⽬标⽅法运行之前运行;后置通知(After):在⽬标⽅法运行结束之后运行;返回通知(AfterReturning):在⽬标…...
计算机网络之HTTP04ECDHE握手解析
DH算法 离散读对数问题是DH算法的数学基础 (1)计算公钥 (2)交换公钥,并计算 对方公钥^我的私钥 mod p 离散对数的交换幂运算交换律使二者算出来的值一样,都为K k就是对称加密的秘钥 2. DHE算法 E&#…...
【MySQL数据库】主从复制原理和应用
主从复制和读写分离1. 主从复制的原理2. 主从复制的环境配置2.1 准备好数据库服务器2.2 配置master2.3 配置slave2.4 测试3. 主从复制的应用——读写分离3.1 读写分离的背景3.2 Sharding-JDBC介绍3.3 Sharding-JDBC使用步骤1. 主从复制的原理 MySQL主从复制是一个异步的过程&a…...
复现随记~
note(美团2022) 比较简单的越界漏洞,堆本身并没有什么漏洞,而且保护并没全开,所以逆向思维。必然是ROP类而非指针类,故我们着重注意unsigned int等无符号数前后是否不一致 int __fastcall edit(__int64 a1) {int idx; // [rsp14…...
【计组】设计大型DMP系统--《深入浅出计算机组成原理》(十四)
目录 一、DMP:数据管理平台 二、MongoDB 真的万能吗 三、关系型数据库:不得不做的随机读写 (一)Cassandra:顺序写和随机读 1、Cassandra 的数据模型 2、Cassandra 的写操作 3、Cassandra 的读操作 (…...
66 使用注意力机制的seq2seq【动手学深度学习v2】
66 使用注意力机制的seq2seq【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV1v44y1C7Tg/?spm_id_from…top_right_bar_window_history.content.click&vd_source75dce036dc8244310435eaf03de4e330 在机器翻译时,…...
NextJS(ReactSSR)
pre-render: 预渲染 1. 静态化 发生的时间:next build 1). 纯静态化 2). SSG: server static generator getStaticProps: 当渲染组件之前会运行 生成html json //该函数只可能在服务端运行 //该函数运行在组件渲染之前 //该函数只能在build期间运…...
JointBERT代码复现详解【上】
BERT for Joint Intent Classification and Slot Filling代码复现【上】 源码链接:JointBERT源码复现(含注释) 一、准备工作 源码架构 data:存放两个基准数据集;model:JointBert模型的实现;…...
进程间通信(上)
进程间通信(上)背景进程间通信目的进程间通信发展进程间通信分类管道什么是管道匿名管道实例代码简单的匿名管道实现一个父进程控制单个子进程完成指定任务父进程控制一批子进程完成任务(进程池)用fork来共享管道站在文件描述符角…...
【Unity3D】Unity 3D 连接 MySQL 数据库
1.Navicat准备 test 数据库,并在test数据库下创建 user 数据表,预先插入测试数据。 2.启动 Unity Hub 新建一个项目,然后在Unity编辑器的 Project视图 中,右击新建一个 Plugins 文件夹将连接 MySQL的驱动包 导入(附加驱…...
vue通用后台管理系统
用到的js库 遇到的问题 vuex和 localStorage区别 vuex在内存中,localStorage存在本地localStorage只能存储字符串类型数据,存储对象需要JSON.stringify() 和 parse()…读取内存比读取硬盘速度要快刷新页面vuex数据丢失,localStorage不会vuex…...
IDEA设置只格式化本次迭代变更的代码
趁着上海梅雨季节,周末狠狠更新一下。平常工作在CR的时候,经常发现会有新同事出现大量代码变更行..一看原因竟是在格式化代码时把历史代码也格式化掉了这样不仅坑了自己(覆盖率问题等),也可能会影响原始代码责任到人&a…...
算法训练——剑指offer(Hash集合问题)
摘要 数据结构中有一个用于存储重要的数据结构,它们就是HashMap,HasSet,它典型特征就是存储key:value键值对。在查询制定的key的时候查询效率最高O(1)。Hashmap,HasSet的底层结构是如图所示。它们的区别就是是否存在重复的元素。 二、HashMa…...
Element UI框架学习篇(七)
Element UI框架学习篇(七) 1 新增员工 1.1 前台部分 1.1.1 在vue实例的data里面准备好需要的对象以及属性 addStatus:false,//判断是否弹出新增用户弹窗dailog,为true就显示depts:[],//部门信息mgrs:[],//上级领导信息jobs:[],//工作岗位信息//新增用户所需要的对象newEmp:…...
【项目实战】32G的电脑启动IDEA一个后端服务要2min!谁忍的了?
一、背景 本人电脑性能一般,但是拥有着一台高性能的VDI(虚拟桌面基础架构),以下是具体的配置 二、问题描述 但是,即便是拥有这么高的性能,每次运行基于Dubbo微服务架构下的微服务都贼久,以下…...
2022年山东省中职组“网络安全”赛项比赛任务书正式赛题
2022年山东省中职组“网络安全”赛项 比赛任务书 一、竞赛时间 总计:360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 Nginx安全策略 A-3 日志监控 A-4 中间件服务加固 A-5 本地安全策略…...
RibbitMQ 入门到应用 ( 二 ) 安装
3.安装基本操作 3.1.下载安装 3.1.1.官网 下载地址 https://rabbitmq.com/download.html 与Erlang语言对应版本 https://rabbitmq.com/which-erlang.html 3.1.2.安装 Erlang 在确定了RabbitMQ版本号后,先下载安装Erlang环境 Erlang下载链接 https://packa…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
