当前位置:   article > 正文

免费分享一套SpringBoot(图书馆)自习室座位预约管理系统【论文+源码+SQL脚本】,帅呆了~~

免费分享一套SpringBoot(图书馆)自习室座位预约管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBoot(图书馆)自习室座位预约管理系统,分享下哈。

项目视频演示

【免费】SpringBoot(图书馆)自习室座位预约管理系统 Java毕业设计_哔哩哔哩_bilibili

项目介绍

在数字化转型的浪潮中,自习室座位预约业正积极采用先进的信息技术来优化客户体验和运营效率。本研究旨在开发一款基于Spring Boot后端框架的自习室座位预约客房预订管理系统,以满足现代自习室座位预约对高效、便捷、安全的预订管理需求。

座位预定系统用来方便图书馆、自习室等公共场所管理员对座位进行信息化管理,有效避免了因为个人随意占座而导致的座位浪费等资源利用效率低的问题。系统为管理员提供了:用户信息管理、用户投诉建议管理、管理员反馈投诉建议问题、对不文明用户的黑名单管理、核心的作为预约和用户上座管理、座位预约和使用记录查询、座位使用情况统计报表等功能,这些功能将原本需要纸笔记录的工作向更加信息化智能化的方向改进,在一定程度上也大大减少了场所管理员的工作量。

系统后端采用SpringBoot、Mybatis的SSM经典架构、采用MySQL数据库存储数据和Navicat管理工具、测试采用Junit和Postman进行单元测试和接口测试。系统前端采用thymeleaf模板技术,引入了BootStrap和layui组件库,还是用echars组件实现精美的图表数据展示。

系统展示

部分代码

  1. package com.zfx.controller;
  2. import com.github.pagehelper.PageHelper;
  3. import com.github.pagehelper.PageInfo;
  4. import com.zfx.entity.User;
  5. import com.zfx.service.impl.UserServiceImpl;
  6. import com.zfx.utils.Msg;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.relational.core.sql.In;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.*;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Map;
  14. @Controller
  15. public class UserController {
  16. @Autowired
  17. UserServiceImpl userService;
  18. /*
  19. * queryUserlike 通过用户姓名进行模糊查询
  20. * */
  21. @GetMapping("/queryUserlike/{username}")
  22. @ResponseBody
  23. public Msg queryUserlikeId(@RequestParam(value = "pn",defaultValue = "1") Integer pn,
  24. @PathVariable("username") String username){
  25. PageHelper.startPage(pn,20);
  26. List<User> users = userService.queryByUserName(username);
  27. PageInfo<User> page=new PageInfo<User>(users,5);
  28. return Msg.success().add("pageInfo",page);
  29. }
  30. /*
  31. * 前端发送请求后端分页数据,
  32. * */
  33. @GetMapping("/userTables")
  34. @ResponseBody
  35. public Msg userTables(@RequestParam(value = "pn",defaultValue = "1") Integer pn){
  36. PageHelper.startPage(pn,7);
  37. List<User> users = userService.getAll();
  38. PageInfo<User> page=new PageInfo<User>(users,5);
  39. return Msg.success().add("pageInfo",page);
  40. }
  41. //到tables页面
  42. @RequestMapping("/usertables")
  43. public String toUserTables(Map<String,Object> map){
  44. List<User> users = userService.getAll();
  45. map.put("users",users);
  46. return "Tables";
  47. }
  48. //点击编辑按键传入userid查询用户,返回用户信息
  49. @GetMapping("/queryUserByID/{userid}")
  50. @ResponseBody
  51. public Msg queryUserID(@PathVariable("userid") Integer userid,Map<String,Object> map){
  52. User users = userService.getUserByID(userid);
  53. return Msg.success().add("users",users);
  54. }
  55. /*
  56. * 查询全部用户
  57. */
  58. /*@GetMapping("/user22")
  59. public String getAllUser(Map<String,Object> map){
  60. List<User> users = userService.getAll();
  61. map.put("users",users);
  62. return "Dashboard";
  63. }*/
  64. /*
  65. * 用户删除请求
  66. */
  67. @DeleteMapping(value = "/user/{ids}")
  68. @ResponseBody
  69. public Msg delEmp(@PathVariable("ids") String ids) {
  70. if(ids.contains("-")) {
  71. List<Integer> delids = new ArrayList<Integer>();
  72. String[] split = ids.split("-");
  73. for (String string : split) {
  74. delids.add(Integer.parseInt(string));
  75. }
  76. userService.batchUser(delids);
  77. }else {
  78. int id = Integer.parseInt(ids);
  79. userService.deleteUser(id);
  80. }
  81. return Msg.success();
  82. }
  83. /*
  84. * 用户更新
  85. */
  86. @PutMapping(value = "/user/{userID}")
  87. @ResponseBody
  88. public Msg saveEmp(User user) {
  89. System.out.println(user);
  90. userService.updateUser(user);
  91. return Msg.success();
  92. }
  93. /*
  94. * 根据用户ID查询结果
  95. */
  96. @GetMapping(value = "user/{id}")
  97. @ResponseBody
  98. public Msg getEmp(@PathVariable(value = "id")Integer userID) {
  99. User user = userService.getUserByID(userID);
  100. return Msg.success().add("user", user);
  101. }
  102. /*
  103. * 检查用户名是否可用
  104. */
  105. @RequestMapping(value = "/checkAddUser")
  106. @ResponseBody
  107. public Msg checkAddUser(@RequestParam("username")String userName) {
  108. //先判断用户名是否合法的表达式
  109. String regex = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]+$)";
  110. boolean c = userName.matches(regex);
  111. if(!c) {
  112. return Msg.fail().add("va_msg", "用户名可以是2-5位中文,或者6-16位英文和数字的组合");
  113. }
  114. //数据库用户名重复校验
  115. boolean b = userService.checkUserName(userName);
  116. if(b) {
  117. return Msg.success().add("va_msg", "用户名可用");
  118. }else {
  119. return Msg.fail().add("va_msg", "用户名已存在");
  120. }
  121. }
  122. /*校验手机号码格式*/
  123. @RequestMapping("/checkAddTel")
  124. @ResponseBody
  125. public Msg checkAddTel(@RequestParam(value = "usertel")String userTel1) {
  126. String userTel = userTel1.trim();
  127. String regex = "(^1\\d{10}$)";
  128. boolean matches = userTel.matches(regex);
  129. if(matches == true){
  130. return Msg.success().add("va_msg","");
  131. }else{
  132. return Msg.fail().add("va_msg","手机号必须以1开头,11位的数字!");
  133. }
  134. }
  135. /*校验年龄码格式*/
  136. @RequestMapping("/checkAddAge")
  137. @ResponseBody
  138. public Msg checkAddAge(@RequestParam(value = "userage")Integer userAge1) {
  139. String s = userAge1.toString();
  140. String userTel = s.trim();
  141. String regex = "(^\\d{1,3}$)";
  142. boolean matches = userTel.matches(regex);
  143. if(matches == true){
  144. return Msg.success().add("va_msg","");
  145. }else{
  146. return Msg.fail().add("va_msg","请输入数字");
  147. }
  148. }
  149. /*校验密码格式*/
  150. @RequestMapping("/checkAddPwd")
  151. @ResponseBody
  152. public Msg checkAddPwd(@RequestParam(value = "userpwd")String userPwd1) {
  153. String userPwd = userPwd1.trim();
  154. String regex = "(^[a-zA-Z0-9_-]{6,16}$)";
  155. boolean matches = userPwd.matches(regex);
  156. if(matches == true){
  157. return Msg.success().add("va_msg","");
  158. }else{
  159. return Msg.fail().add("va_msg","密码格式不正确:必须超过6位,小于16位的英文和数字!");
  160. }
  161. }
  162. /****************************************************插入*********
  163. * 点击保存按钮,新增用户
  164. * */
  165. @PostMapping("/insertUser")
  166. @ResponseBody
  167. public Msg insertUser(User user){
  168. user.setUserid(null);
  169. userService.insertUser(user);
  170. return Msg.success().add("va_msg","插入成功!");
  171. }
  172. //点击更新按钮,更新修改的数据
  173. @PutMapping("/updateUser")
  174. @ResponseBody
  175. public Msg updateUser(User user){
  176. userService.updateUser(user);
  177. return Msg.success().add("va_msg","插入成功!");
  178. }
  179. //用户删除
  180. @DeleteMapping("/deleteUser/{userid}")
  181. @ResponseBody
  182. public Msg deleteEmployee(@PathVariable("userid") Integer userid){
  183. boolean b = userService.deleteUser(userid);
  184. if (b){
  185. return Msg.success().add("va_msg","用户删除成功!");
  186. }else {
  187. return Msg.fail().add("va_msg","用户删除失败!");
  188. }
  189. }
  190. /*
  191. * 前端ajax请求,查询userid是否在表中存在
  192. * */
  193. @GetMapping("/checkUserID")
  194. @ResponseBody
  195. public Msg checkUserID(@RequestParam("userid") Integer userid){
  196. boolean b = userService.checkUserID(userid);
  197. if(b){
  198. return Msg.success().add("va_msg","用户名存在!");
  199. }else {
  200. return Msg.fail().add("va_msg","用户名不存在,重新输入!");
  201. }
  202. }
  203. }
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
  7. <meta name="description" content="" />
  8. <meta name="author" content="" />
  9. <title>欢迎进入登陆页面</title>
  10. <link th:href="@{/css/styles.css}" rel="stylesheet"/>
  11. <script th:src="@{/js/all.min.js}" crossorigin="anonymous"></script>
  12. </head>
  13. <body >
  14. <div id="layoutAuthentication">
  15. <div class="card">
  16. <div class="card-header ">
  17. <div class="row">
  18. <div class="text-center">
  19. <h2 class="text-info">欢迎进入共享自习室管理系统登陆页面</h2>
  20. </div>
  21. </div>
  22. </div>
  23. <div class="card-body mt-2 " style="background-color: #8adbff">
  24. <div id="layoutAuthentication_content" class="mb-lg-5 mt-lg-5">
  25. <main>
  26. <div class="container">
  27. <div class="row justify-content-center">
  28. <div class="col-lg-5 ">
  29. <div class="card shadow-lg border-1 rounded-lg mt-5">
  30. <div class="card-header">
  31. <h3 class="text-center font-weight-light my-4 text-primary">登陆<br/></h3>
  32. </div>
  33. <div class="card-body ">
  34. <form th:action="@{/loginD}" method="post">
  35. <div class="form-group">
  36. <p style="color: red" th:text="${msg}" id="mima" th:if="${not #strings.isEmpty(msg)}"></p>
  37. <span class="help-block text-danger" id="info"></span>
  38. </div>
  39. <div class="form-group">
  40. <label class="small mb-1" for="inputManagerName">用户名</label>
  41. <input name="managername" class="form-control py-4" id="inputManagerName" type="text" maxlength="16" placeholder="输入用户名" />
  42. <span class="help-block text-info"></span>
  43. </div>
  44. <div class="form-group ">
  45. <label class="small mb-1" for="inputPassword">密码</label>
  46. <input name="managerpwd" class="form-control py-4" id="inputPassword" type="password" maxlength="16" placeholder="输入密码" />
  47. <span class="help-block text-info"></span>
  48. </div>
  49. <div class="form-group d-flex align-items-center justify-content-between mt-4 mb-0">
  50. <a class="small" th:href="@{/forgotPwd}">忘记密码?</a>
  51. <button class="btn btn-primary" type="submit" id="save_btn">进入</button>
  52. </div>
  53. </form>
  54. </div>
  55. <div class="card-footer text-center">
  56. <div class="small"><a th:href="@{/register}">创建账号? 注册!</a></div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. </main>
  63. </div>
  64. </div>
  65. </div>
  66. <div id="layoutAuthentication_footer">
  67. <footer class="py-4 bg-light mt-auto">
  68. <div class="container-fluid">
  69. <div class="d-flex align-items-center justify-content-between small">
  70. <div class="text-muted">Copyright &copy; Your Website 2024 &nbsp;&nbsp;&nbsp;&nbsp;
  71. </div>
  72. <div>
  73. <a href="#">联系:xxxxx@163.com</a>
  74. </div>
  75. </div>
  76. </div>
  77. </footer>
  78. </div>
  79. </div>
  80. <script src="js/jquery-3.4.1.min.js" th:href="@{/js/jquery-3.4.1.min.js}" crossorigin="anonymous"></script>
  81. <script src="js/bootstrap.bundle.min.js" th:href="@{/js/bootstrap.bundle.min.js}" crossorigin="anonymous"></script>
  82. <script src="js/scripts.js" th:href="@{/js/scripts.js}"></script>
  83. <script type="text/javascript">
  84. //点击保存,保存新增的管理员
  85. $("#save_btn").click(function(){
  86. if($("#inputManagerName").val() == ""){
  87. $("#info").text("请输入用户名!");
  88. return false;
  89. }
  90. if($("#inputPassword").val() == ""){
  91. $("#info").text("请输入密码!");
  92. return false;
  93. }
  94. //判断之前的ajax用户名校验是否成功,如果成功继续,否则终止
  95. if($(this).attr("ajax_managerName") == "error"){
  96. return false;
  97. }
  98. if($(this).attr("ajax_managerPwd") == "error"){
  99. return false;
  100. }
  101. });
  102. //显示校验的提示信息
  103. function show_validate_msg(ele,status,msg){
  104. //清楚当前元素的校验状态
  105. $(ele).parent().removeClass("has-success has-error");
  106. $(ele).next("span").text();
  107. if("success"==status){
  108. $(ele).parent().addClass("has-success");
  109. $(ele).next("span").text(msg);
  110. }else if("error"==status){
  111. $(ele).parent().addClass("has-error");
  112. $(ele).next("span").text(msg);
  113. }
  114. }
  115. //后端管理员姓名校验
  116. $("#inputManagerName").change(function(){
  117. var managerName=$("#inputManagerName").val();
  118. if(managerName != ""){
  119. //发送ajax,请求用户名是否可用
  120. $.ajax({
  121. url:"/checkLoginManagerName",
  122. type:"GET",
  123. data:"managername="+managerName,
  124. success:function(result){
  125. if(result.code == 100){
  126. show_validate_msg("#inputManagerName","success",result.extend.va_msg);
  127. // alert(result.extend.va_msg);
  128. $("#save_btn").attr("ajax_managerName","success");
  129. }else{
  130. show_validate_msg("#inputManagerName","error",result.extend.va_msg);
  131. $("#save_btn").attr("ajax_managerName","error");
  132. }
  133. }
  134. });
  135. }
  136. if(managerName.length == 0){
  137. show_validate_msg("#inputManagerName","success","");
  138. // $("#info").text("请输入用户名");
  139. }else {
  140. $("#info").text("");
  141. $("#mima").text("");
  142. }
  143. })
  144. //后端密码校验
  145. $("#inputPassword").change(function(){
  146. var managerPwd=$("#inputPassword").val();
  147. if (managerPwd != ""){
  148. //发送ajax,密码格式是否正确
  149. $.ajax({
  150. url:"/checkLoginManagerPwd",
  151. type:"GET",
  152. data:"managerpwd="+managerPwd,
  153. success:function(result){
  154. if(result.code == 100){
  155. show_validate_msg("#inputPassword","success",result.extend.va_msg);
  156. // alert(result.extend.va_msg);
  157. $("#save_btn").attr("ajax_managerPwd","success");
  158. }else{
  159. show_validate_msg("#inputPassword","error",result.extend.va_msg);
  160. $("#save_btn").attr("ajax_managerPwd","error");
  161. }
  162. }
  163. });
  164. }
  165. if(managerPwd.length>=6 && managerPwd.length<=16){
  166. show_validate_msg("#inputPassword","success","");
  167. }
  168. if(managerPwd.length == 0){
  169. show_validate_msg("#inputPassword","success","");
  170. // $("#info").text("请输入密码");
  171. }else {
  172. $("#info").text("");
  173. $("#mima").text("");
  174. }
  175. })
  176. </script>
  177. </body>
  178. </html>

源码下载

下载地址:
链接:https://pan.baidu.com/s/106e4S5s3AfLe3ab_Dv-xOg 
提取码:1234

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/999320
推荐阅读
相关标签
  

闽ICP备14008679号