springboot+vue项目基础开发(二)注册接口

注册接口

设置用户注册接口的响应数据类Result

Result类

在这里插入图片描述

package com.example.Pojo;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@NoArgsConstructor//无参数构造方法
@AllArgsConstructor//全参数构造方法
public class Result <T>{
    private Integer code;//业务状态码,0成功,1失败
    private String message;//提示消息
    private T date;//响应数据,泛型

    //快速返回操作成功响应结果,带响应数据
    public static <E> Result<E> success(E data){
        return new Result<>(0,"操作成功",data);
    }
    //快速返回操作成功响应结果
    public static Result success(){
        return  new Result(0,"操作成功",null);
    }

    public static Result error(String message){
        return  new Result(1,message,null);
    }
}

设计注册功能

设计controller层的UserController

controller类

package com.example.Controller;

import com.example.Pojo.Result;
import com.example.Pojo.User;
import com.example.Service.UserService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("register")
    public Result result(String username,String password){
        //查询用户
        User user=userService.findByUserName(username);
        if (user==null){
            //注册用户
            userService.register(username,password);
            return Result.success();
        }else {
            //用户名以及被占用
            return Result.error("用户名以及被占用");
        }

    }

}

设计Service和接口implement

service层

package com.example.Service;

import com.example.Pojo.User;

public interface UserService {
    //根据用户名查询用户
    User findByUserName(String username);

    //注册用户
    void register(String username, String password);
}

package com.example.Service.Impl;

import com.example.Mapper.UserMapper;
import com.example.Pojo.User;
import com.example.Service.UserService;
import com.example.Utils.MdUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User findByUserName(String username) {
        User user=userMapper.findByUserName(username);
        return user;
    }

    @Override
    public void register(String username, String password) {
        //密码加密处理
        String mdString = MdUtil.getMDString(password);
        //密文密码添加
        userMapper.add(username,mdString);
    }
}

在Utils曾设置一个密码加密类MDUtil

加密类MDUtil

package com.example.Utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MdUtil {//密码加密
    //将密码转化为16进制字符,apache校验下载文件的正确性就是用的它
    protected static char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

    protected static MessageDigest messageDigest=null;

    static {
        try {
            messageDigest=MessageDigest.getInstance("MD5");
        }catch (NoSuchAlgorithmException nsaex){
            System.err.println(MdUtil.class.getName()+"初始化失败,MessageDigest不支持");
            nsaex.printStackTrace();
        }
    }

    //生成字符串校验码
    public static String getMDString(String s){
        return getMDString(s.getBytes());//分割成字节
    }

    public static String getMDString(byte[] bytes) {
        messageDigest.update(bytes);
        return bufferToHex(messageDigest.digest());
    }


    private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }


    private static String bufferToHex(byte bytes[], int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;//加密长度
        for (int l = m; l < k; l++) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }

    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>
        // 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }

}

设计Mapper

Mapper类

package com.example.Mapper;

import com.example.Pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
    //查询用户
    @Select("select * from user where username=#{username}")
    User findByUserName(String username);

    //添加用户
    @Insert("insert into user(username ,password,create_time,update_time)" +
            " values(#{username},#{password},now(),now())")
    void add(String username, String password);
}

测试

启动报错

在这里插入图片描述

说是没有扫描到Mapper,但我看idea明显是已经装配上了

在这里插入图片描述

注销@Autowired,我发现mapper没有注册成功

在这里插入图片描述

没办法,我只好,在启动类上添加@MapperScan(basePackages = “com.example.Mapper”)

在这里插入图片描述

这次注册成功了

打开postman,创建工作空间

在这里插入图片描述

创建一个post请求,发送,发现报406,但查看数据库,我们发现数据以及加进来了

在这里插入图片描述

在这里插入图片描述

在Result添加@Data注解,再删除数据,再启动一下

在这里插入图片描述

在这里插入图片描述

校验参数

导入springboot,validation依赖,

<!--参数校验-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

在参数上添加@Pattern注解

在controller类添加@Validated注解

package com.example.Controller;

import com.example.Pojo.Result;
import com.example.Pojo.User;
import com.example.Service.UserService;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
@Validated
public class UserController {

    @Resource
    private UserService userService;

    @PostMapping("register")
    public Result result(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$")  String password){
            //查询用户
            User user=userService.findByUserName(username);
            if (user==null){
                //注册用户
                userService.register(username,password);
                return Result.success();
            }else {
                //用户名以及被占用
                return Result.error("用户名以及被占用");
            }
    }

}

对参数校验失败异常进行处理

在这里插入图片描述

创建一个异常处理类GlobalExceptionHandler
在这里插入图片描述

package com.example.Exception;

import com.example.Pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice//用于全局处理控制器里的异常
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public Result HandlerException(Exception e){
        e.printStackTrace();
        return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage():"操作失败");
    }
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜了再学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值