💕🌸🍀开发接口的流程:明确需求 -》阅读接口文档-》思路分析-》开发-》测试🍀🌸💕
开始前小知识-配置lombok👈🍀
lombok 在编译阶段,为实体类自动生成setter getter toString
步骤:
(1)pom文件中引入依赖<!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
(2)在实体类上添加注解
1 明确需求
2 阅读接口文档
2.1基本信息
2.2请求参数
2.3响应数据
响应样例
3 思路分析
三层架构
(1)UserController
@PostMapping(“/register”)
public 返回值类型 register(String username, String password){
//用户名是否已被占用//注册
}
(2)UserService
//根据用户名查询用户
public User findByUsername(String username) {
}//注册
public void register(String username,String password) {
}
(3)UserMapper
-- 查询
select * from user where username=?;
-- 插入
insert into user(username,password,create_time,update_time) values (?,?,?,?);
4 开发
4.1三层架构
(1)UserController.java💕
package com.aaa.controller; import com.aaa.pojo.Result; import com.aaa.pojo.User; import com.aaa.service.UserService; import com.aaa.utils.JwtUtil; import com.aaa.utils.Md5Util; import com.aaa.utils.ThreadLocalUtil; import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.URL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/user") @Validated public class UserController { @Autowired private UserService userService; @PostMapping("/register") public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) { //查询用户 User u = userService.findByUserName(username); if (u == null) { //没有占用 //注册 userService.register(username, password); return Result.success(); } else { //占用 return Result.error("用户名已被占用"); } } }
(2)UserService💕
接口UserService.java
package com.aaa.service; import com.aaa.pojo.User; public interface UserService { //根据用户名查询用户 User findByUserName(String username); //注册 void register(String username, String password); }
接口实现类UserServiceImpl.java
package com.aaa.service.impl; import com.aaa.mapper.UserMapper; import com.aaa.pojo.User; import com.aaa.service.UserService; import com.aaa.utils.Md5Util; import com.aaa.utils.ThreadLocalUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.Map; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User findByUserName(String username) { User u = userMapper.findByUserName(username); return u; } @Override public void register(String username, String password) { //加密 String md5String = Md5Util.getMD5String(password); //添加 userMapper.add(username,md5String); } }
(3)UserMapper.java💕
package com.aaa.mapper; import com.aaa.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; @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); }
4.2工具类--- 密码加密
作用:传入明文,返回加密的密码
package com.aaa.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Util {
/**
* 默认的密码字符串组合,用来将字节转换成 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(Md5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");
nsaex.printStackTrace();
}
}
/**
* 生成字符串的md5校验值
*
* @param s
* @return
*/
public static String getMD5String(String s) {
return getMD5String(s.getBytes());
}
/**
* 判断字符串的md5校验码是否与一个已知的md5码相匹配
*
* @param password 要校验的字符串
* @param md5PwdStr 已知的md5校验码
* @return
*/
public static boolean checkPassword(String password, String md5PwdStr) {
String s = getMD5String(password);
return s.equals(md5PwdStr);
}
public static String getMD5String(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);
}
}
4.3实体类Result 返回统一响应结果
1
package com.aaa.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; //统一响应结果 @NoArgsConstructor @AllArgsConstructor @Data//lombok生效 public class Result<T> { private Integer code;//业务状态码 0-成功 1-失败 private String message;//提示信息 private T data;//响应数据 //快速返回操作成功响应结果(带响应数据) 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); } }
4.4参数进行合法性校验Spring Validation
4.5全局异常处理
package com.aaa.exception; import com.aaa.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 handleException(Exception e){ e.printStackTrace(); return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage() : "操作失败"); } }
5 测试🤏
pastman测试
官网:postman.org.cn