基于微信小程序图书馆座位预约管理系统
开发工具: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…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...
