【SpringBoot】初学项目,编写一个功能模块的思路是什么?——用户注册和登录

在这里插入图片描述
我是要进大厂的男人!

唠一唠

​ 我经历了一个痛苦的十月qwq,振作过后打算找个实习。最近我在纠结的问题是选c++开发还是java开发,目前我给自己定的方向和计划就是java后端开发。相比于底层代码,我还是更喜欢上层的一些业务实现,而且通过了解发现java后端的市场需求要比C++多,进互联网大厂的话还是java会好一点。其次,我本科学的是java,虽然学的不咋地或多或少还是有点基础,最近想找一份实习,c++无法速成,再加之毕业设计,想做一个java的项目。所以还是走java后端开发的道路了。

​ 我目前找工作最需要的是项目经历,所以现在在网上找当下比较热门的SpringBoot的MyBatis的项目。
内容如果有误的话麻烦告诉我!阿里嘎多!

概要

目前在学一个商城类的项目,最近刚学完注册和登录的实现,总结一下,以便之后复习。目前的项目结构:
在这里插入图片描述

代码仓库:WangXiuhao/store (github.com)

一个项目的开始

  1. 新建项目
  2. 在properties文件中配置数据库的连接信息
  3. 测试连接:启动SpringBoot主类,数据库是否可以正常加载
  4. 访问项目的静态资源是都可以正常加载

整体开发流程

一个模块的开发大体上分为四个部分

  1. 持久层开发:依据前端页面的设置规划相关的SQL语句,进行配置
  2. 业务层开发:核心功能控制、业务操作以及异常处理
  3. 控制层开发:接受请求、处理响应
  4. 前端开发

用户注册

先得有实体类,下面是对用户操作的前期准备

  1. 创建用户的数据表
  2. 创建实体基类BaseEntity

    包含创建时间、创建者、修改时间、修改者,以便于以后的类进行继承

  3. 创建用户类

    通过表的结构,添加用户的属性,要创建get、set、equals、hashCode、toString方法

接下来是用户注册的业务开发

  1. 持久层开发

    通过MyBatis来操作数据库,做MyBatis开发的流程:

    1. 规划需要执行的SQL

      注册的操作主要用到插入和查询两种:插入一个新用户、查询当前用户名是否存在

      insert into t_user (username,password) values (值列表)
      
      select * from t_user where username = ?
      
    2. 设计接口

      定义Mapper接口,在项目的目录结构创建mapper包,在这个包下根据不同的功能模块来创建mapper接口,创建一个usermapper接口,编写抽象方法

      SpringBoot要做两件事:创建mapper实现类、怎么实现mapper

      创建mapper实现类两种方法

      1. @Mapper

      2. @MapperScan

        @MapperScan("com.cy.store.mapper")
        

      怎么实现mapper有两种方法

      1. @Insert、@Delete、@Update、@Select

      2. 在properties文件

        mybatis.mapper-locations=classpath:mapper/*.xml
        
    3. 编写映射

      编写xml文件

    4. 单元测试

      要注意添加注解

      @SpringBootTest
      //@RunWith表示的是启动单元测试类,需要传递固定的参数
      @RunWith(SpringRunner.class)
      
  2. 业务层开发

    service下有三个部分:1.异常 2.接口 3.具体实现

    1. 异常

      根据业务层不同的功能,统一去继承ServiceException异常类

      插入异常、用户名重复异常 实现五种方法

    2. 设计接口

      在service包下创建一个IUserService接口

    3. 实现

      在impl包下继承IUserService接口,实现功能,要加@Service注解

    4. 测试

      这里有个小问题是关于@Autowired的,长大后再学习

  3. 控制层开发

    1. 创建一个JasonResult类作为返回给前端的数据类型,包括状态码、状态描述信息、数据,记得实现相应的构造方法和setget方法

    2. 设计请求

      根据注册功能设计请求,模板如下

      请求路径:/user/reg
      请求参数:User user
      请求类型:POST
      响应结果:JsonResult<void>
      
    3. 处理请求

      创建UserController类来接受前端传来的请求,这个类要继承一个BaseController类,这里可以把异常处理的操作都放在BaseController里,自动地统一处理异常

      @ExceptionHandler(ServiceException.class) //用于统一处理抛出的异常
          public JsonResult<Void> handleException(Throwable e){
              JsonResult<Void> result = new JsonResult<>(e);
              if(e instanceof UsernameDuplicatedException){
                  result.setState(4000);
                  result.setMessage("用户名已经被占用1");
              }else if(e instanceof UserNotFoundException){
                  result.setState(4001);
                  result.setMessage("用户数据不存在的异常");
              }else if(e instanceof InsertException){
                  result.setState(5000);
                  result.setMessage("注册时产生未知的异常");
              }else if(e instanceof PasswordNotMatchException){
                  result.setState(4002);
                  result.setMessage("密码错误的异常");
              }
              return result;
          }
      
  4. 前端页面(长大后再学习)

    1. 在register页面中编写发送请求的方法,借助于点击事件来完成。涉及到两个问题:1.选中相对应的按钮 ( ( " 选择器 " ) ) 2. 再去添加点击的事件, ("选择器")) 2.再去添加点击的事件, ("选择器"))2.再去添加点击的事件,.ajax()函数发送异步请求。

    2. JQUery封装了一个函数,称之为$.ajax(),可以异步加载相关的请求,页面没有重新加载,但是需要的内容会被填充过来。依靠的是JavaScript提供的一个对象XmlHttpResponse(XHR),封装了这个对象。

    3. ajax()使用方法。需要传递一个方法体 作为方法的参数来使用,语法结构:ajax接受多个参数,参数之间要使用","进行分割,参数的值要求用字符串,声明顺序没有要求

      $.ajax({
          url:"",
          type:"",
          data:"",
          datatype:"",
          success:function(){
                  
          },
          error:function(){
                  
          }
      });
      
    4. ajax函数参数的含义

      参数功能描述
      url请求的地址,不能包含参数的列表部分的内容
      type请求类型
      data向指定url地址提交的数据
      datatype数据的类型
      success当服务器正常响应客户端时,会自动调用success参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上
      error当服务器未正常响应客户端时,会自动调用error参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上
    5. js代码可以独立生命在一个js的文件里或者声明在一个script标签中

    6. js代码无法被服务器解析执行,体现在点击页面中的按钮没有任何的相应,解决方案:

      1. 在项目的maven下clear install
      2. 在项目的file选项下 cash清理缓存
      3. build选项下 rebulid
      4. 重启idea 或者 重启电脑

用户登录

​ 大致的功能:当用户输入用户名和密码将数据提交到数据库进行查询,如果存在对应的则表示登录成功,跳转index.htnl页面,跳转在前端使用jquery来完成

持久层

  1. 规划需要执行的SQL语句

    查询是否存在对应用户名和密码,先查询用户名,再比对密码,之前sql都有

  2. 接口设计和方法

    不用重复开发了,单元测试也无需单独执行

业务层

  1. 异常

    有两个异常:用户名对应的密码错误、用户名没有被找到,继承ServiceException异常类,有5个构造方法

  2. 实现

    步骤如下:

    1. 在IUserService接口中编写抽象方法, login(String username,String password),将当前登录成功的用户数据以当前用户对象的形式进行返回。
    2. 实现抽象方法
    3. 测试

控制层

  1. 业务层抛出异常,控制层负责处理异常

    业务层抛出的异常,需要在统一异常处理类中进行统一的捕获和处理 细节异常从4000开始,大的异常从5000开始

  2. 设计请求
    请求路径:/users/login
    请求方式:POST
    请求数据:String username, String password,HttpSession session
    响应结果:JsonResult<User>
    
  3. 处理请求
    用户会话Session

    session对象主要存服务器端,可以用于保存服务器的临时数据的对象,所保存的数据可以在整个项目中都可以通过访问来获取,把session的数据看作一个共享的数据。首次登录的时候所获取的用户的数据,转移到session对象即可

    Session.setAttribute(“key”)可以将获取session中的数据这种行为进行封装,封装在BaseController类中

    1. 封装session对象中数据的获取(可以封装父类中)、数据的设置(当用户登录成功后进行数据的设置,设置到全局的session对象)
    2. 在BaseController父类中封装两个数据:获取uid、获取username对应的两个方法(用户头像暂不考虑,将来封装到cookie中)
    3. 在登陆方法中将数据封装到session对象中。服务器本身自动创建session对象,已经是一个全局的session对象。SpringBoot直接使用session对象,直接将HttpSession类型的对象作为请求处理方法的参数,会自动将全局的session对象注入到请求处理方法的session形参上。

前端

  1. 在login.html页面中依据前面所设置的请求来发送ajax请求
  2. 访问页面进行用户的登录操作

拦截器

​ 首先将所有的请求首先统一拦截到拦截器中,可以在拦截其中定义过滤的规则,如果不满足系统设置的过滤规则,统一的处理是重新打开login.html,(重定向和转发两种)推荐使用重定向,因为重定向时的网址可以是任何网址,转发的网址必须是本站点的网址

插一个重定向和请求转发的区别
1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向
2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址
3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变
4、重定向是两次request,转发只有一次请求
5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址

在SpringBoot项目中拦截器的定义和使用。SpringBoot是依靠SpringMVC来完成的,SpringMVC提供了一个HandlerInterceptor接口,可以定义拦截器,使用方法:自定义一个类,在这个类上实现这个接口,具体步骤如下:

  1. 首先自定义一个类,在这个类实现这个HandlerInterceptor

要实现三个方法preHandle、postHandle、afterCompletion

  • preHandle

在调用所有请求处理的方法之前被自动调用执行的方法

  • postHandle

在modleandview对象返回之后调用的方法

  • afterCompletion

在整个请求所有相关联的资源被执行完毕最后所执行的方法

  1. 注册这个过滤器,做两件事情:添加白名单、添加黑名单

白名单(哪些资源可以在不登陆的情况下访问):login.html \ register.html \ login \ reg \ index \ product.html

黑名单(只有在用户登陆的状态下进行访问)

  1. 注册过滤器的技术

配置信息存放在项目的config包结构下,添加@Configuration注释

定义一个类LoginIntercepterConfigurer,借助WebMvcConfigure接口,实现addInterceptors方法,可以将用户定义的拦截器进行注册。

小结

​ 在SpringBoot项目中,一个模块的编写主要是以下几个步骤,持久层->业务层->控制层->控制层->前端,再加上拦截器

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值