mybatis-plus自定义用户注册方法及Slf4j日志打印<自导自演SpringBoot项目第三天>


前言

例如:今天内容包含通过页面的方式实现登录和注册、mybatis-plus如何使用自定义的方法实现注册功能、及日志打印。


提示:以下是本篇文章正文内容,下面案例可供参考

一、如何自定义用户注册接口?

示例:为什么要自定义注册接口?这是由于mybatis-plus提供的接口不能实现当下业务需求的时候,或是比较复杂的业务逻辑便需要我们自定义接口来实现功能了,比如注册功能通过boolean save(T entity); 方法需要传一个实体类,而在controller接收的是一个Map,如果把Map转成User实体类在去调用save方法就有点耽误喝茶了,废话不多说上代码。
1、在自动生成的mapper包下有个**mapping.xml,找到用户模块对应的xml并添加新增方法。
在这里插入图片描述

<insert id="insertUserInfo" parameterType="java.util.Map">
        INSERT INTO t_user_info(
            `userName`
            ,`userPwd`
        <if test='param.userEmail != null and param.userEmail !="" '>
            ,`userEmail`
        </if>
        <if test='param.userPhone != null and param.userPhone !=""  '>
            ,`userPhone`
        </if>
            ,`createTime`)
        VALUE(
            #{param.userName}
            ,#{param.userPwd}
        <if test='param.userEmail != null and param.userEmail !="" '>
            ,#{param.userEmail}
        </if>
        <if test='param.userPhone != null and param.userPhone !=""  '>
            ,#{param.userPhone}
        </if>
            ,(SELECT SYSDATE()))
    </insert>

2、在UserInfoMapper中新增insertUserInfo方法,方法名与xml中inset标签的 id 属性的值保持一致,否之执行之后会出现找不到方法的异常

	/**
     * 用户注册接口
     * @param param
     * @return
     */
    Integer insertUserInfo(@Param("param") Map param);

3、在IUserInfoService中添加方法,方法名没有要求,看的懂就行

default Integer insertUserInfo(Map param) throws Exception {
        return null;
    }

4、在UserInfoServiceImpl实现类中重写新增方法

	
	// 把userInfoMapper通过注解注入
	@Autowired
    private UserInfoMapper userInfoMapper;

    @Override
    public Integer insertUserInfo(Map param){
        log.info(" ------ 执行 UserInfoServiceImpl.insertUserInfo 创建用户 ------");
        log.info(param.toString());
        Integer count=0;
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.allEq(param,false);
        
        /**
        * 这里不要用userInfoMapper.this.getOne(wrapper);
        * 而是通过this.getOne(wrapper)去执行mapper中的方法
        * 不然会出现参数传递异常
		*/
		// 先根据输入的用户名去数据库查一遍,校验用户是否存在
        UserInfo userInfo = this.getOne(wrapper);
        if (userInfo == null){
            count=userInfoMapper.insertUserInfo(param);
        }else{
            throw new Exception("用户已存在");
        }
        return count;
    }

5、在UserController中调用 UserInfoServiceImpl的新增方法

@PostMapping("/createUserInfo")
    public JsonResult createUserInfo(@RequestBody Map param){
        JsonResult jsonResult=new JsonResult();
        Integer count = userInfoService.insertUserInfo(param);
        if (count>0) {
            jsonResult = JsonResult.success(200, "用户" + param.get("userName") + "新增成功", count);
        }else{
            throw new Exception("用户已存在");
        }
        return jsonResult;
    }

6、在application.properties添加扫描xml文件的配置

#mapping.xml文件扫描 方式1
mybatis-plus.mapper-locations=classpath*:**/mapper/mapping/*.xml

#mapping.xml文件扫描 方式2
mybatis-plus.mapper-locations=classpath*:/mapper/mapping/*.xml

有的项目结构需要用方式2,但如果是自动生成的代码就用方式1,不然会出现 userInfoMapper 找不到的异常,如果不行就换方式2;除非你的mapping不在mapper文件下面

二、通过页面的ajax请求完成注册与登录

1、登录功能
在这里插入图片描述

		<h1>Login</h1>
        <form id="userLoginFrom">
            <div class="imgcontainer"><img src="../../img/project-img5-2.png" alt="Avatar" class="avatar"></div>
            <label id="userName" for="userName"><b>Username</b></label>
            <input type="text" placeholder="Enter Username" name="userName" required>

            <label id="userPwd" for="userPwd"><b>Password</b></label>
            <input type="password" placeholder="Enter Password" name="userPwd" required>

            <button type="submit">Login</button><button type="button" id="creUserBtn">create user</button>
            <!--<label> <input type="checkbox" checked="checked" name="remember"> Remember me </label>-->
        </form>

1.1、通过外部引入js的方式调用ajax发送请求,这里只展示ajax的核心代码;

$("#userLoginFrom").submit(function (event) {
        event.preventDefault(); //阻止默认提交行为
        var formData = $(this).serialize(); // 获取表单数据
        /*$(this).serialize();  获取表单需要转换*/
        formData=strToObj(formData);
        $.ajax({
            url:"http://127.0.0.1:8888/project/userInfo/userLogin",//"协议://IP地址:端口号/请求路径"
            type:"Post",
            data:JSON.stringify(formData),
            dataType:"json",
            sync:false,
            contentType: "application/json;charset=UTF-8",// 这行代码一定要带上不然会包415错误
            success:function (rstData) {
                window.location.href="登录成功后要跳转的页面路径"
            },
            error:function (rstData) {
                alert(rstData.message);
                window.location.href="请求失败后的统一异常页面路径"
            }
            /*, compact:function (XMLHttpRequest,textStatus) {

            }*/
        });
    });
    

1.2、controller代码

	@ResponseBody
    @PostMapping("/userLogin")
    public JsonResult userLogin(@RequestBody Map param){
        log.info("请求参数:"+param.toString());
        JsonResult jsonResult= null;
        Map resultMap=new HashMap();
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.allEq(param,false);
        UserInfo userBean = userInfoService.getOne(queryWrapper);
        if(userBean!=null){
            String token=JwtUtils.generateToken(userBean);
            log.info("生成tuoken:"+token);
            resultMap.put("token",token);
            resultMap.put("userInfo",userBean);
            jsonResult=JsonResult.success(resultMap);
        }else{
            throw new Exception("用户不存在");
        }
        return jsonResult;
    }

效果图就不展示了,按照这个标准来就不会报错了

2、注册功能实现

<form id="register-form">
        <div class="form-group">
            <label for="username">用户名称<span class="text-danger">*</span></label>
            <input type="text" id="username" name="userName" required>
            <i class="fas fa-times-circle d-none"></i>
        </div>
        <div class="form-group">
            <label for="password">用户密码<span class="text-danger">*</span></label>
            <input type="password" id="password" name="userPwd" required>
            <i class="fas fa-times-circle d-none"></i>
        </div>
        <div class="form-group">
            <label for="email">邮箱</label>
            <input type="email" id="email" name="userEmail">
            <i class="fas fa-times-circle d-none"></i>
        </div>
        <div class="form-group">
            <label for="phone">联系电话</label>
            <input type="tel" id="phone" name="userPhone">
            <i class="fas fa-times-circle d-none"></i>
        </div>
        <button type="submit" class="btn-submit" id="createComitBtn">注册</button>
    </form>

2.1、ajax核心代码

$("#createComitBtn").click(function () {
        $('#register-form').submit(function(event) {
            event.preventDefault(); //阻止默认提交行为
            var formData = $(this).serialize(); // 获取表单数据
            formData=strToObj(formData);
            $.ajax({
                url: "http://127.0.0.1:8888/project/userInfo/createUserInfo",
                type: "Post",
                data: JSON.stringify(formData),
                dataType: "json",
                contentType: "application/json;charset=UTF-8",
                success: function (rstData) {
                    alert(rstData.message);
                    // 判断登录成功条转到登录页面
                    if (rstData.code == 200) {
                        window.location.href = "../userModule/loginPage.html"
                    }
                },
                error: function (rstData) {
                    console.log("error" + rstData.message)
                    alert(rstData.message);
                    // window.location.href="../projectModule/error.html"
                }
                /*, compact:function (XMLHttpRequest,textStatus) {

            }*/
            });

        });
    })

2.2、注册controller就是开头改造的那段
非常标准的Jquery+SpringBoot前后端分离实现登录注册的代码,只要不出意外就不会有意外

3、日志打印

1、@Slf4j 注解:在类名上放加上 @Slf4j 注解实,通过log.info()实现日常业务日志的答应,例如打印参数和响应结果和debug调试等。这个日志是打印到控制台的,以后专门出一期关于日志配置的,可以打印到本地文件夹;

@Slf4j // lombok 自带的
@RestController
@RequestMapping("/project/userInfo")
public class UserInfoController {

2、mybatis-plus自带的日志打印功能:当调用某个接口执行某段sql的时候,想看具体的sql语句的时候就需要用到mybatis-plus来打印日志才能实现效果,具体配置如下:
在application.properties配置文件中加上下面这行代码

#mybatis-puls日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这个也是打印到控制台的,但是也可以打印到本地文件夹,具体怎么实现后面在写;


总结

提示:需要注意的细节点:
1、自定义执行sql的方法xml标签中的id的值一定要和mapper接口中的方法名一致,否则抛出异常找不到要执行的方法;
2、application.properties扫描xml配置文件的两个方式要根据项目结构来选择,而且一定要记得加上这个配置,不然也会出现找不到xxxmapper找不到的情况;
3、补充之前漏掉的一个点:项目的启动类上要加上扫秒mapper的注解,现有启动类扫描mapper文件才能通过配置文件扫描到mapping.xml
在这里插入图片描述
括号里面就是mapper包的路径
4、ajax发送请求这两个属性一个不能错,另一个不能漏
不能错:dataType: “json”,
contentType: “application/json;charset=UTF-8”,
contentType这个是不能漏;

今天到此结束,茶叶上潮了,我该去收茶叶了;下一章讲解登录验证,异常统一处理和密码加密解密,及前端验证

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值