基于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项目:是;
技术栈
-
后端:SpringBoot
-
前端:JSP+CSS+JavaScript+bootstrap
使用说明
- 使用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 {