基于javaweb+mysql的springboot图书管理系统(java+springboot+jsp+bootstrap+maven+mysql)

基于javaweb+mysql的springboot图书管理系统(java+springboot+jsp+bootstrap+maven+mysql)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

基于javaweb+mysql的SpringBoot图书管理系统(java+springboot+jsp+bootstrap+maven+mysql)

项目介绍

本系统分为管理员与普通用户两种角色; 管理员角色包含以下功能: 借书管理,图书信息管理,图书分类管理,用户管理,角色管理,还书管理,登录页面等功能。 用户角色包含以下功能:

借阅管理,图书检索,查看借还记录,查看图书详情,还书管理,登录页面等功能。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;

5.数据库:MySql 5.7版本;

6.是否Maven项目:是;

技术栈

  1. 后端:SpringBoot

  2. 前端:JSP+CSS+JavaScript+bootstrap

使用说明

  1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中application.properties配置文件中的数据库配置改为自己的配置; 4. 运行项目,在浏览器中输入localhost:8083/ 登录
        map.put("size", pageBean.getPageSize());
        List<LendReturnList> lendReturnLists = lendBookService.selectLendReturnRecordByUserId(map);
        int totalRecord = lendBookService.getTotalRecord(map);
        DataGridDataSource<LendReturnList> list = new DataGridDataSource<>();
        list.setTotal(totalRecord);
        list.setRows(lendReturnLists);
        return list;
    }

    @PostMapping("/lendreturnrecordAll")
    @LoginRequired
    public DataGridDataSource<LendReturnList> lendreturnrecordAll(@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                                                  @RequestParam(value = "uid", required = false) Long uid,
                                                                             @RequestParam(value = "rows", required = false, defaultValue = "5") Integer rows,
                                                                             HttpSession session) throws ParseException {

         PageBean pageBean = new PageBean(page, rows);
        Map<String, Object> map = new HashMap<>();
        if(uid!=null&&uid>0) {
            map.put("userId", uid);
        }
        map.put("start", pageBean.getStart());
        map.put("size", pageBean.getPageSize());
        List<LendReturnList> lendReturnLists = lendBookService.selectLendReturnRecordByUserId(map);
        int totalRecord = lendBookService.getTotalRecord(map);
        DataGridDataSource<LendReturnList> list = new DataGridDataSource<>();
        list.setTotal(totalRecord);
        list.setRows(lendReturnLists);
        return list;
    }
}

/**
 * @Auther: admin

    @GetMapping("/admin/bookhis")
    @LoginRequired
    public String bookhis() {
        return "admin/bookhis";
    }

}

/**
 * @Auther: admin
 * @Description:
 */
@RestControllerAdvice
public class AjaxExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public JsonData defaultErrorHandler(HttpServletRequest req,
                                        Exception e) throws Exception {

        e.printStackTrace();
        return JsonData.fail(e.getMessage());
    }

    /**
     * 注解参数校验 全局异常补获
     *
     * @param ex
     * @return
        dataGridDataSource.setTotal(totalRole);
        return dataGridDataSource;
    }

    /**
     *
     * @param roleId
     * @param permissionIds
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 角色权限设置(先删除当前角色拥有的权限关系, 再重新设置)
     */
    @PostMapping("/savePermissionSet")
    @LoginRequired
    public JsonData savePermissionSet(Integer roleId, Integer[] permissionIds) {
        //先删除当前角色拥有的权限关系
        permissionService.deleteRolePermissionRsByRoleId(roleId);
        Map<String, Object> map = new HashMap<>();
        map.put("roleId", roleId);
        map.put("permissionIds", permissionIds);
        int count = roleService.insertRolePermissions(map);
        if (count > 0) {
            return JsonData.success(count, "设置成功");
        } else {
            return JsonData.fail("设置失败");
        }

    }

}

            for (Role role : roleList) {
                stringBuffer.append("," + role.getRoleName());
            }
            user.setRoles(stringBuffer.toString().replaceFirst(",", ""));
            session.setAttribute("user", user);
            // 获取用户权限信息
            List<Permission> permissions = permissionService.queryPermissionsByUser(user);
            Map<Integer, Permission> permissionMap = new HashMap<>();
            Permission root = null;
            Set<String> uriSet = new HashSet<>();
            for (Permission permission : permissions) {
                permissionMap.put(permission.getPermissionId(), permission);
                if (permission.getPermissionUrl() != null && !"".equals(permission.getPermissionUrl())) {
                    uriSet.add(permission.getPermissionUrl());
                }
            }
            session.setAttribute("authUriSet", uriSet);
            for (Permission permission : permissions) {
                Permission child = permission;
                if (child.getPermissionParentId() == null) {
                    root = permission;
                } else {
                    Permission parent = permissionMap.get(child.getPermissionParentId());
                    parent.getChildren().add(child);
                }
            }
            session.setAttribute("rootPermission", root);
            return JsonData.success();
        } else {
            return JsonData.fail("用户名或密码错误!");
        }
    }

    /**
     * @param user
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 新增用户
     */

/**
 * @Auther: admin
 * @Description: BookInfoController
 */
@RestController
@RequestMapping("/bookinfo")
public class BookInfoController {

    @Resource
    private BookInfoService bookInfoService;

    @Resource
    private BookTypeService bookTypeService;

    /**
     * @param bookInfo
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 新增图书
     */
    @PostMapping("/save")
    @LoginRequired
    public JsonData saveBookInfo(BookInfo bookInfo) {
        int count = bookInfoService.saveBookInfo(bookInfo);
        if (count > 0) {
            return JsonData.success(count, "新增成功");
        } else {
            return JsonData.fail("新增失败");
        }
    }

    /**
     * @param bookInfo
     * @return : io.hailiang.web.book.common.JsonData
     */
    @PostMapping("/save")
    @LoginRequired
    public JsonData saveRole(Role role) {
        int count = roleService.saveRole(role);
        if (count > 0) {
            return JsonData.success(count, "添加成功");
        } else {
            return JsonData.fail("添加失败");
        }

    }

    /**
     * @param role
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 更新角色
     */
    @PutMapping("/update")
    @LoginRequired
    public JsonData updateRole(Role role) {
        int count = roleService.updateRole(role);
        if (count > 0) {
            return JsonData.success(count, "更新成功");
        } else {
            return JsonData.fail("更新失败");
        }
    }

    /**
     * @param roleId
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 删除角色(先根据角色id删除角色权限关联信息, 再根据角色id删除用户角色关联信息)
     */
    @DeleteMapping("/delete")
    @LoginRequired
    public JsonData deleteRole(@RequestParam(value = "roleId") Integer roleId) {

        //TODO 根据角色id删除角色权限关联信息,再根据角色id删除用户角色关联信息
        permissionService.deleteRolePermissionRsByRoleId(roleId);
        roleService.deleteRoleUserRsByRoleId(roleId);
        }
    }
}

public class LoginInterceptor implements HandlerInterceptor {
    @Resource
    private UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {

        // 如果不是映射到方法直接通过
        if (!(object instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) object;
        Method method = handlerMethod.getMethod();
        //检查是否有passtoken注解,有则跳过认证
        if (method.isAnnotationPresent(PassToken.class)) {
            PassToken passToken = method.getAnnotation(PassToken.class);
            if (passToken.required()) {
                return true;
        map.put("roleIds", roleIds);
        int count = userService.insertUserRoles(map);
        if (count > 0) {
            return JsonData.success(count, "设置成功");
        } else {
            return JsonData.fail("设置失败");
        }
    }

    /**
     * @param oldPassword
     * @param newPassword
     * @param session
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 修改密码
     */
    @PostMapping("/modifyPassword")
    @LoginRequired
    public JsonData modifyPassword(String oldPassword, String newPassword, HttpSession session) {

        User currentUser = (User) session.getAttribute("user");
        User user = userService.findUserByUserId(currentUser.getUserId());
        if (!Md5Util.md5(oldPassword, Md5Util.SALT).equals(user.getUserPassword())) {
            return JsonData.fail("原密码错误");
        }
        user.setUserPassword(newPassword);
        int i = userService.updateUser(user);
        if (i > 0) {
            return JsonData.success(i, "修改成功");
        } else {
            return JsonData.fail("修改失败");
        }
    }

    /**
     * @param userId
     * @return : io.hailiang.web.book.common.JsonData
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 新增分类
     */
    @PostMapping("/save")
    @LoginRequired
    public JsonData saveBookType(BookType bookType) {
        int count = bookTypeService.saveBookType(bookType);
        if (count > 0) {
            return JsonData.success(count, "新增成功");
        } else {
            return JsonData.fail("新增失败");
        }
    }

    /**
     * @param bookType
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 修改分类
     */
    @PutMapping("/update")
    @LoginRequired
    public JsonData update(BookType bookType) {
        int count = bookTypeService.updateBookType(bookType);
        if (count > 0) {
            return JsonData.success(count, "修改成功");
        } else {
            return JsonData.fail("修改失败");
        }
    }
}

        map.put("size", pageBean.getPageSize());
        List<User> userList = userService.selectUserList(map);
        //查询用户角色
        for (User u : userList) {
            List<Role> roleList = roleService.findByUserId(u.getUserId());
            StringBuffer stringBuffer = new StringBuffer();
            for (Role role : roleList) {
                stringBuffer.append("," + role.getRoleName());
            }
            u.setRoles(stringBuffer.toString().replaceFirst(",", ""));
        }
        int totalUser = userService.getTotalUser(map);
        DataGridDataSource<User> dataGridDataSource = new DataGridDataSource<>();
        dataGridDataSource.setTotal(totalUser);
        dataGridDataSource.setRows(userList);
        return dataGridDataSource;
    }

    /**
     * @param userId
     * @param roleIds
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 用户角色设置(先删除当前用户拥有的角色关系, 再重新设置)
     */
    @PostMapping("/saveRoleSet")
    @LoginRequired
    public JsonData saveRoleSet(Long userId, Integer[] roleIds) {
        //先删除当前用户拥有的角色关系
        roleService.deleteRoleUserRsByUserId(userId);
        Map<String, Object> map = new HashMap<>();
        map.put("userId", userId);
        map.put("roleIds", roleIds);
        int count = userService.insertUserRoles(map);
        if (count > 0) {
            return JsonData.success(count, "设置成功");
        } else {
            return JsonData.fail("设置失败");
        }
    }
/**
 * @Auther: admin
 * @Description: 文件上传Controller
 */
@Controller
public class UploadController {

    @Value(value = "${upload.file.path}")
    private String uploadFilePath;

    /**
     * @param file
     * @return : java.util.Map<java.lang.String,java.lang.Object>
     * @description: 文件上传
     */
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> uploadFile(MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<>();
        if (!file.isEmpty()) {
            // 获取文件名
            String fileName = file.getOriginalFilename();
            // 获取文件的后缀名
            String suffixName = fileName.substring(fileName.lastIndexOf("."));
            String newFileName = UUID.randomUUID() + suffixName;

            Date date = new Date();
            int hashcode = fileName.hashCode();
            int dir1 = hashcode & 0xf;  //0--15
            int dir2 = (hashcode & 0xf0) >> 4; //0--15
            String path = uploadFilePath + new SimpleDateFormat("yyyy/MM/dd").format(date) + "/" + dir1 + "/" + dir2 + "/";
            FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path + newFileName));
            map.put("code", 0);
            map.put("msg", "上传成功");
            System.out.println("http://localhost:8080/uploads/" + new SimpleDateFormat("yyyy/MM/dd").format(date) + "/" + dir1 + "/" + dir2 + "/" + newFileName);
        }
        return map;
    }

    /**
     * @param file
     * @param CKEditorFuncNum
     * @return : java.lang.String
        list.setTotal(totalRecord);
        list.setRows(lendReturnLists);
        return list;
    }

    @PostMapping("/lendreturnrecordAll")
    @LoginRequired
    public DataGridDataSource<LendReturnList> lendreturnrecordAll(@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                                                  @RequestParam(value = "uid", required = false) Long uid,
                                                                             @RequestParam(value = "rows", required = false, defaultValue = "5") Integer rows,
                                                                             HttpSession session) throws ParseException {

         PageBean pageBean = new PageBean(page, rows);
        Map<String, Object> map = new HashMap<>();
        if(uid!=null&&uid>0) {
            map.put("userId", uid);
        }
        map.put("start", pageBean.getStart());
        map.put("size", pageBean.getPageSize());
        List<LendReturnList> lendReturnLists = lendBookService.selectLendReturnRecordByUserId(map);
        int totalRecord = lendBookService.getTotalRecord(map);
        DataGridDataSource<LendReturnList> list = new DataGridDataSource<>();
        list.setTotal(totalRecord);
        list.setRows(lendReturnLists);
        return list;
    }
}

        }
        return map;
    }

    /**
     * @param file
     * @param CKEditorFuncNum
     * @return : java.lang.String
     * @description: ckeditor上传
     */
    @RequestMapping(value = "/ckeditorUpload", method = RequestMethod.POST)
    @ResponseBody
    public String ckeditorUpload(@RequestParam("upload") MultipartFile file, String CKEditorFuncNum) throws IOException {
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 获取文件的后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        String newFileName = UUID.randomUUID() + suffixName;
        Date date = new Date();
        int hashcode = fileName.hashCode();
        int dir1 = hashcode & 0xf;  //0--15
        int dir2 = (hashcode & 0xf0) >> 4; //0--15
        String path = uploadFilePath + new SimpleDateFormat("yyyy/MM/dd").format(date) + "/" + dir1 + "/" + dir2 + "/";
        FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path + newFileName));

        //回显
        StringBuffer sb = new StringBuffer();
        sb.append("<script type=\"text/javascript\">");
        sb.append("window.parent.CKEDITOR.tools.callFunction(" + CKEditorFuncNum + ",'" + "/uploads/" + new SimpleDateFormat("yyyy/MM/dd").format(date) + "/" + dir1 + "/" + dir2 + "/" + newFileName + "','')");
        sb.append("</script>");
        return sb.toString();
    }
}

/**

/**
 * @Auther: admin
 * @Description: BookInfoController
 */
@RestController
@RequestMapping("/bookinfo")
public class BookInfoController {

    @Resource
    private BookInfoService bookInfoService;

    @Resource
    private BookTypeService bookTypeService;

    /**
     * @param bookInfo
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 新增图书
     */
    @PostMapping("/save")
    @LoginRequired
    public JsonData saveBookInfo(BookInfo bookInfo) {
        int count = bookInfoService.saveBookInfo(bookInfo);
        if (count > 0) {
            return JsonData.success(count, "新增成功");
        } else {
            return JsonData.fail("新增失败");
        }
    }

    /**
     * @param bookInfo
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 编辑图书
     */
    @PutMapping("/update")
    @LoginRequired
    public JsonData updateBookInfo(BookInfo bookInfo) {
        int count = bookInfoService.updateBookInfo(bookInfo);
        if (count > 0) {
            return JsonData.success(count, "编辑成功");
        } else {
            return JsonData.fail("编辑失败");
    }

    /**
     * @param userName
     * @param userEmail
     * @param userPhone
     * @param page
     * @param rows
     * @return : io.hailiang.web.book.common.DataGridDataSource<io.hailiang.web.book.model.User>
     * @description: 带条件服务端分页查询用户列表
     */
    @PostMapping("/list")
    @LoginRequired
    public DataGridDataSource<User> getUserList(@RequestParam(value = "userName", required = false, defaultValue = "") String userName,
                                                @RequestParam(value = "userTrueName", required = false, defaultValue = "") String userTrueName,
                                                @RequestParam(value = "userEmail", required = false, defaultValue = "") String userEmail,
                                                @RequestParam(value = "userPhone", required = false, defaultValue = "") String userPhone,
                                                @RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                                @RequestParam(value = "rows", required = false, defaultValue = "5") Integer rows) {

        PageBean pageBean = new PageBean(page, rows);
        Map<String, Object> map = new HashMap<>();
        map.put("userName", "%" + userName + "%");
        map.put("userTrueName", "%" + userTrueName + "%");
        map.put("userEmail", "%" + userEmail + "%");
        map.put("userPhone", "%" + userPhone + "%");
        map.put("start", pageBean.getStart());
        map.put("size", pageBean.getPageSize());
        List<User> userList = userService.selectUserList(map);
        //查询用户角色
        for (User u : userList) {
            List<Role> roleList = roleService.findByUserId(u.getUserId());
            StringBuffer stringBuffer = new StringBuffer();
            for (Role role : roleList) {
                stringBuffer.append("," + role.getRoleName());
            }
            u.setRoles(stringBuffer.toString().replaceFirst(",", ""));
        }
        int totalUser = userService.getTotalUser(map);
        DataGridDataSource<User> dataGridDataSource = new DataGridDataSource<>();

    /**
     *
     * @param page
     * @param rows
     * @param session
     * @return : io.hailiang.web.book.common.DataGridDataSource<io.hailiang.web.book.model.LendReturnList>
     * @description: 根据用户ID查询借还记录
     */
    @PostMapping("/lendreturnrecord")
    @LoginRequired
    public DataGridDataSource<LendReturnList> selectLendReturnRecordByUserId(@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                                                             @RequestParam(value = "rows", required = false, defaultValue = "5") Integer rows,
                                                                             HttpSession session) throws ParseException {

        User currentUser = (User) session.getAttribute("user");
        PageBean pageBean = new PageBean(page, rows);
        Map<String, Object> map = new HashMap<>();
        map.put("userId", currentUser.getUserId());
        map.put("start", pageBean.getStart());
        map.put("size", pageBean.getPageSize());
        List<LendReturnList> lendReturnLists = lendBookService.selectLendReturnRecordByUserId(map);
        int totalRecord = lendBookService.getTotalRecord(map);
        DataGridDataSource<LendReturnList> list = new DataGridDataSource<>();
        list.setTotal(totalRecord);
        list.setRows(lendReturnLists);
        return list;
    }

    @PostMapping("/lendreturnrecordAll")
    @LoginRequired
    public DataGridDataSource<LendReturnList> lendreturnrecordAll(@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                                                  @RequestParam(value = "uid", required = false) Long uid,
                                                                             @RequestParam(value = "rows", required = false, defaultValue = "5") Integer rows,
                                                                             HttpSession session) throws ParseException {

         PageBean pageBean = new PageBean(page, rows);
     * the view. Will be called on any outcome of handler execution, thus allows
     * for proper resource cleanup.
     * <p>Note: Will only be called if this interceptor's {@code preHandle}
     * method has successfully completed and returned {@code true}!
     * <p>As with the {@code postHandle} method, the method will be invoked on each
     * interceptor in the chain in reverse order, so the first interceptor will be
     * the last to be invoked.
     * <p><strong>Note:</strong> special considerations apply for asynchronous
     * request processing. For more details see
     * {@link AsyncHandlerInterceptor}.
     *
     * @param request  current HTTP request
     * @param response current HTTP response
     * @param handler  handler (or {@link HandlerMethod}) that started asynchronous
     *                 execution, for type and/or instance examination
     * @param ex       exception thrown on handler execution, if any
     * @throws Exception in case of errors
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

}

/**
 * @Auther: admin

    /**
     *
     * @param roleId
     * @param permissionIds
     * @return : io.hailiang.web.book.common.JsonData
     * @description: 角色权限设置(先删除当前角色拥有的权限关系, 再重新设置)
     */
    @PostMapping("/savePermissionSet")
    @LoginRequired
    public JsonData savePermissionSet(Integer roleId, Integer[] permissionIds) {
        //先删除当前角色拥有的权限关系
        permissionService.deleteRolePermissionRsByRoleId(roleId);
        Map<String, Object> map = new HashMap<>();
        map.put("roleId", roleId);
        map.put("permissionIds", permissionIds);
        int count = roleService.insertRolePermissions(map);
        if (count > 0) {
            return JsonData.success(count, "设置成功");
        } else {
            return JsonData.fail("设置失败");
        }

    }

}

public class AuthInterceptor implements HandlerInterceptor {

    @Resource
    private PermissionService permissionService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值