前言
例如:今天内容包含通过页面的方式实现登录和注册、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这个是不能漏;
今天到此结束,茶叶上潮了,我该去收茶叶了;下一章讲解登录验证,异常统一处理和密码加密解密,及前端验证