SpringBoot项目----图书管理系统(详解)

这篇具有很好参考价值的文章主要介绍了SpringBoot项目----图书管理系统(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

项目业务

 技术栈

数据库表的设计 

数据库表关系图

关于字典表 

前后端接口实现

1.初始化数据库、表、数据

2.数据库连接池配置

3.统一响应封装

 4.统一异常处理

5.实现统一会话管理(登录) 

5.通过Mybatis生成工具,生成mapper接口,xml文件,实体类

 6.准备所有的Controller和servise类

7.实现接口

(1)登录接口

(2)实现注销接口

 (3)实现数据字典下拉菜单

(4)获取班级信息

(5)获取学生信息

(6)班级管理页面-表格展示

说明 

(7)新增接口

(8)获取数据详情(每一条) 

(9)修改接口

(10) 删除接口

 总结


项目业务

使用者:图书馆管理员

业务:管理学校图书信息,记录并管理学生借阅图书信息

有以下几个模块 

SpringBoot项目----图书管理系统(详解) 

 技术栈

  • SpringBoot
  • SpringMVC
  • MyBatis

数据库表的设计 

数据库表关系图

SpringBoot项目----图书管理系统(详解)

关于字典表 

数据字典表和数据字典标签表主要用在一些通用的下拉菜单选项。
像本项目在班级表中的专业和毕业年份
SpringBoot项目----图书管理系统(详解)

如果单独设计需要单独一张表,实际存放的数据也不会太多,可以考虑设计在整体的一张表中。

一般在设计上考虑为两张表:数据字典表和数据字典标签表(一对多关系)来保存。两张表都是 key、 value 的形式,字典表是父节点对应下拉菜单,字典标签表是子节点对应下拉菜单选项,下拉菜单通过父节点的 key 查询出所 有关联的子节点,再使用子节点的key、 value 进行下拉菜单选项的初始化。

 SpringBoot项目----图书管理系统(详解)

前后端接口实现

我这里只给大家说后端接口的实现,前端大家可以在github上找

  • 需要说明的是,接口的定义一般是前后端约定好的,所以也和前端代码息息相关,前端需要什么数据, 需要什么格式的数据,也会在接口中体现。

1.初始化数据库、表、数据

这里大家就创建以上那几个表,然后插入一些数据,在自己的MySQL执行一下

2.数据库连接池配置

在pom.xml插入以下代码,并替换成自己的用户名和密码

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=***
spring.datasource.password=*******

3.统一响应封装

SpringBoot项目----图书管理系统(详解)

一次http请求,调用Controller请求映射方法(返回值Object)

正常返回:ResponseResult(success=true,data=obj)

出现异常:ResponseResult(success=false,message=错误信息)

 4.统一异常处理

若程序内部错误:如语法错误、SQL写错,这种错是一大段英文,不能给用户看,这里设置返回中文的json字符串

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handleException(Exception e){
        log.error("系统出错啦", e);
        ResponseResult json = new ResponseResult();
        json.setMessage("系统出错了,请联系管理员");
        return json;
    }

还有一种是返回自定义异常:如用户名不存在、密码错误……

   @ExceptionHandler(AppException.class)
    @ResponseBody
    public Object handleAppException(AppException e){
        log.debug("自定义异常", e);
        ResponseResult json = new ResponseResult();
        json.setMessage(e.getMessage());
        return json;
    }

5.实现统一会话管理(登录) 

这里是用springMVC的HandlerInterceptor拦截器实现的,登录成功可以访问,未登录重定向到登录界面

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断是否登录
        HttpSession session = request.getSession(false);
        if(session != null){//获取登录时保存的用户信息
            User user = (User) session.getAttribute("user");
            if(user != null){//登录,允许访问
                return true;
            }
        }
        //未登陆,不允许访问
        String servletPath = request.getServletPath();//服务路径
        if(servletPath.startsWith("/api/")){//后端接口,未登陆返回401,json
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            response.setStatus(401);
            ResponseResult json = new ResponseResult();
            json.setMessage("未登陆,不允许访问");
            response.getWriter().println(objectMapper.writeValueAsString(json));
        }else{//前端页面,未登陆,重定向到登录页面
            String schema = request.getScheme();// http
            String host = request.getServerName();//服务端ip或域名
            int port = request.getServerPort();//port
            String contextPath = request.getContextPath();//应用上下文路径
            String basePath = schema+"://"+host+":"+port+contextPath;
            response.sendRedirect(basePath+"/index.html");
        }
        return false;
    }

添加要拦截的前端页面,和所有后端接口,除了注册、登录

registry.addInterceptor(new LoginInterceptor(objectMapper))
                //前端:添加要拦截的页面
                .addPathPatterns("/page/main.html")
                //拦截所有后端接口,排除用户注册,登录
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/user/login")
                .excludePathPatterns("/api/user/register");

5.通过Mybatis生成工具,生成mapper接口,xml文件,实体类

SpringBoot项目----图书管理系统(详解)SpringBoot项目----图书管理系统(详解)

 6.准备所有的Controller和servise类

每个实体类对应一个Controller和一个Service

例:

@RestController  //注册到容器中
@RequestMapping("/book")  //设置路径
public class BookController {
    @Autowired  //注入
    private BookService bookService;
@Service
public class BookService {
    @Autowired
    private BookMapper bookMapper;

7.实现接口

(1)登录接口

SpringBoot项目----图书管理系统(详解)

点击登录抓包可得:

SpringBoot项目----图书管理系统(详解)

可见请求路径为:POST http://localhost:8080/api/user/login

在UserController中写登录接口

//POST http://localhost:8080/api/user/login
    @RequestMapping("/login")
    public Object login(@RequestBody User user, HttpServletRequest request){
        //  1.根据账号查询数据
        User param=new User();
        param.setUsername(user.getUsername());
        User exist=userService.selectOne(param);
//        未查询到用户
        if(exist==null){
            throw new AppException("账号不存在");
        }
//        2.若查询到用户校验密码是否正确
        if(!exist.getPassword().equals(user.getPassword())){
            throw new AppException("账号或密码错误");
        }
//        3.验证成功,创建session,保存用户信息
        HttpSession session=request.getSession();
//        保存用户信息,和拦截器的键一致
        session.setAttribute("user",exist);
        return null;
    }

然后生成selectOne方法,并返回 userMapper.selectOne();

 

public User selectOne(User param) {
        return userMapper.selectOne(param);
    }

(2)实现注销接口

登录后会创建JSESSIONID及session,返回JSESSIONID(set-Cookie:JSEESION=xxx)

每次请求会自动携带Cookie:JSESSIONID=xxx

实现注销功能只用删除session即可

//    GET http://localhost:8080/api/user/logout
    @RequestMapping("/logout")
    public Object logout(HttpSession session){
        session.invalidate();
        return null;
    }

 (3)实现数据字典下拉菜单

SpringBoot项目----图书管理系统(详解)

//    实现数据字典接口: 获取下拉菜单的选项
//    GET dict/tag/query?dictionaryKey=000002
    @RequestMapping("query")
    public Object query(String dictionaryKey){
        List<DictionaryTag> tags=dictionaryTagService.query(dictionaryKey);
        return tags;
    }
   public List<DictionaryTag> query(String dictionaryKey) {
        return dictionaryTagMapper.queryTagsByKey(dictionaryKey);
    }

Mybatis生成工具并未生成这个queryTagsByKey方法,需要自己写(关联查询)

  <select id="queryTagsByKey" resultMap="BaseResultMap">
    select
      concat(d.dictionary_key,dt.dictionary_tag_key) dictionary_tag_key,
      dt.dictionary_tag_value
    from
      dictionary d, dictionary_tag dt
    where
      d.id=dt.dictionary_id
    and
      d.dictionary_key=#{dictionaryKey}
  </select>

(4)获取班级信息

SpringBoot项目----图书管理系统(详解)

//    获取班级(下拉菜单选项)信息接口
//    GET http://localhost:8080/api/classes/queryAsDict
    @RequestMapping("/queryAsDict")
    public Object queryAsDict(){
        List<Classes> classes=classesService.queryAsDict();
        return classes;
    }

(5)获取学生信息

SpringBoot项目----图书管理系统(详解)

//    获取学生信息(下拉菜单)
//    GET student/queryAsDict?dictionaryKey=2
    @RequestMapping("/queryAsDict")
    public Object queryAsDict(@RequestParam("dictionaryKey") String classesId){
        List<Student> students=studentService.queryAsDict(classesId);
        return students;
    }

(6)班级管理页面-表格展示

SpringBoot项目----图书管理系统(详解)

//    获取班级信息(表格展示)
//    GET /api/classes/query
    @RequestMapping("/query")
    public Object query(Classes cla){
//        分页功能
        PageHelper.startPage(cla);
        List<Classes> classes=classesService.query();
        PageHelper.clearPage();
        return classes;
    }

说明 

每个页面都有5个接口 :

  • 获取数据(表格展示)
  • 新增
  • 修改删除
  • 获取数据详情

SpringBoot项目----图书管理系统(详解)

 

我这里以班级管理为例,实现的方法都是一样的(否则博客太长了SpringBoot项目----图书管理系统(详解),分两篇的话,第二篇内容又不多)

(7)新增接口

//    新增班级
//    POST /api/classes/add
    @RequestMapping("/add")
    public Object add(@RequestBody Classes classes){
        int n=classesService.add(classes);
        return null;
    }
    public int add(Classes classes) {
        return classesMapper.insertSelective(classes);
    }

(8)获取数据详情(每一条) 

//    获取班级详情
//    GET http://localhost:8080/api/classes/queryById?id=4
    @RequestMapping("/queryById")
    public Object queryById(@RequestParam Integer id){
        Classes classes=classesService.queryById(id);
        return classes;
    }
    public Classes queryById(Integer id) {
        return classesMapper.selectByPrimaryKey(id);
    }

(9)修改接口

//    修改信息
//    POST http://localhost:8080/api/classes/update HTTP/1.1
//    抓包
//    {"id":"4","classesName":"二年级(1)班","classesGraduateYear":"000001004","classesMajor":"000002001","classesDesc":"无"}
    @RequestMapping("/update")
    public Object update(@RequestBody Classes classes){
        int n=classesService.update(classes);
        return null;
    }

接收json格式的数据 加@RequestBody注解---(抓包看接收啥数据格式)

(10) 删除接口

//    删除数据
//    GET http://localhost:8080/api/classes/delete?ids=2&ids=3
    @RequestMapping("/delete")
    public Object delete(@RequestParam List<Integer> ids){
        int n=classesService.delete(ids);
        return null;
    }
  public int delete(List<Integer> ids) {
        return classesMapper.deleteByIds(ids);
    }

 总结

项目到这里就结束了,其他四个页面大家可参考班级管理的代码实现,此外,还可以实现分页功能,搜索功能,忘记密码等等。如果大家想让自己的项目变得丰富起来的话,可以在网上找资料自己实现这些功能。SpringBoot项目----图书管理系统(详解)SpringBoot项目----图书管理系统(详解)

 

 也可以来问我哦~~

SpringBoot项目----图书管理系统(详解)文章来源地址https://www.toymoban.com/news/detail-492250.html

到了这里,关于SpringBoot项目----图书管理系统(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot图书管理系统

    图书管理系统助力于图书馆中图书的管理,功能包含图书管理、借阅、归还,三块业务的解决方案,可对图书进行查询、查询图书剩余数量及借阅记录和状态、监控数量不足的图书。 SpringBoot+MyBatis+Thymeleaf+MySQL 借书申请流程: 1.管理员首先将申请链接制作成二维码,张贴到图

    2024年02月19日
    浏览(37)
  • 图书管理系统|基于Springboot的图书管理系统设计与实现(源码+数据库+文档)

    图书管理系统目录 目录 基于Springboot的图书管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、个人中心 2、管理员管理 3、用户管理 4、图书出版社管理 四、数据库设计 1、实体ER图 五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取:

    2024年03月26日
    浏览(90)
  • 图书管理系统项目测试

    添加依赖如下: 在被测试类中使用快捷键 Ctrl+Shift+T,选择要测试的方法,编写测试类,完成单元测试。 (1)登录: 1.输入正确的账号密码,是否正确登录并跳转至主页面 2.账号为空,输入密码,是否提示输入密码 3.输入账号,密码为空,是否提示输入用户名 4.账号密码均为

    2024年02月11日
    浏览(44)
  • 基于SpringBoot的图书管理系统毕业设计

    图书管理系统 摘要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在图书馆管理的要求下,开发一款整体式结构的图书管理系统,将复杂的系统进行拆分,能

    2024年02月03日
    浏览(45)
  • Django项目之图书管理系统

    1、创建好 Django 项目 2、准备好数据库 —— 创建数据库:book_system 3、配置项目中的数据库引擎 4、配置静态文件的搜索路径 , 以及在项目的根目录中创建一个 static 存放静态文件数据文件夹 5、导入 html 模板文件和静态文件数据。 1、响应用户注册页面的视图 2、定义用户数

    2024年04月29日
    浏览(47)
  • 数据结构项目:图书管理系统

    随着科技的不断进步,图书的种类也随之日益增多。图书馆所需要处理的图书管理问题从而突出,而读者也许需要能够更方便的查找和查看图书馆的书籍。为解决以上问题,本系统设计时主要针对图书管理人员需求做出对图书信息的录入、删除、修改、导出等功能。 (1)用

    2024年02月04日
    浏览(49)
  • springboot+springsecurity+jwt+elementui图书管理系统

    1.1添加pom.xml 1.2创建CodeGenerator代码生成类 1.3生成crontroller、service、mapper、entity等业务实体类 运行CodeGenerator,生成业务实体类 请输入表名,多个英文逗号分割: t_user,t_menu,t_role,t_user_role,t_role_menu 2.1整合springsecurity 1) 2.2认证授权流程 认证管理 流程图解读: 1、用户提交用户名

    2024年02月06日
    浏览(47)
  • [项目]PHP图书管理系统(附源码)

    📔这里是一个喜欢编程的小程序员,KSaMar 📕如果此文章对您有些许帮助,您可以选择赞助本作作者,让作者有更强的更新文章动力! 📒如果您喜欢此文章,您可以 点赞👍 收藏⭐ 一下,这将对我书写有很大的帮助! 📘如果您通过阅读此文章发现了BUG,请及时私信联系我

    2024年02月08日
    浏览(44)
  • 项目篇 | 图书管理系统 | 账号模块 | 登录

    该系统实现了管理员登录和用户登录,二者的实现和逻辑几乎完全一致,这里以用户登录为例进行讲解。 userLoginPage:功能页,用户登录页,实现用户登录页的界面 userLogin:功能,用户登录,实现用户登录逻辑

    2024年01月20日
    浏览(50)
  • 【JavaSE语法】图书管理系统实现详解

            在学完JavaSE语法后,我们就可以去尝试写一个简单的图书管理系统来进一步提升我们面对对象编程的思想。在该系统中会涉及到数组,接口,封装,继承,多态等等语法知识,希望能够帮助到大家! 目录  导言 1,需求分析 (1)找对象 (2)功能设计 2,创建对象

    2024年01月21日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包