Spring boot 简单开发接口

spring boot 开发简单接口

        • [1. 首先我们先把 package 的结构创建好 package com.](#1. 首先我们先把 package 的结构创建好 package com.)
        • [2.在pojo放实体类 (实体类中的@Data注解是来源于lombok用于省略get set)](#2.在pojo放实体类 (实体类中的@Data注解是来源于lombok用于省略get set))
        • [3.在Mapper 中编写 登录和注册方法](#3.在Mapper 中编写 登录和注册方法)
        • [4. 在Service中 添加 UserService 重写 mapper 中的方法 (降低了代码耦合度)](#4. 在Service中 添加 UserService 重写 mapper 中的方法 (降低了代码耦合度))
        • [5. 在 Service 下的 Impl 包中,添加 UserServiceImpl 类来实现 UserService 接口并依赖 UserMapper 接口](#5. 在 Service 下的 Impl 包中,添加 UserServiceImpl 类来实现 UserService 接口并依赖 UserMapper 接口)
        • [6. 在controller中编写登录和注册、查询用户详细信息的接口](#6. 在controller中编写登录和注册、查询用户详细信息的接口)

springboot 开发用户登录 用户注册 和 获取 用户信息 接口

1. 首先我们先把 package 的结构创建好 package com.
java 复制代码
	com/
└── YJZE/
    ├── controller/
    │   └── ...
    ├── mapper/
    │   └── ...
    ├── pojo/
    │   └── ...
    ├── service/
    │   └── ...
    └── service/
    │    └── Impl/
    │        └── ...
    └──utils/
   	   └──...       
xml 复制代码
<!-- 需要在pom.xml配置的文件 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.3</version>
  </parent>
  <groupId>com.YJZE</groupId>
  <artifactId>big-event</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>big-event</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>3.0.3</version>
    </dependency>

    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.34</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>4.4.0</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

  </dependencies>
</project>
2.在pojo放实体类 (实体类中的@Data注解是来源于lombok用于省略get set)
java 复制代码
//放User实体类 用于登录和注册、查询用户信息
package com.YJZE.pojo;



import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;


import java.time.LocalDateTime;

@Data
public class User {
    private Integer id;//主键ID
    private String username;//用户名
    @JsonIgnore //此注解用于指示 Jackson 库在将对象序列化为 JSON 时忽略该字段。
    private String password;//密码
    private String nickname;//昵称
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间



}

//放Result实体类 用在请求成功后 中data和message的显示
package com.YJZE.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//统一响应结果
@NoArgsConstructor
@AllArgsConstructor
@Data
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);
    }
}
3.在Mapper 中编写 登录和注册方法
java 复制代码
package com.YJZE.mapper;

import com.YJZE.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {

    @Select("select * from user where username = #{username}") //用于注册用户查重 和 登录时校验 password
    User findByUserName(String username);

    @Select("insert  into  user(username,password,create_time,update_time)" + 
            "values (#{username},#{password},now(),now())")
    void add(String username, String password); //注册用户
//    User findByUserName(String username);
}
4. 在Service中 添加 UserService 重写 mapper 中的方法 (降低了代码耦合度)
java 复制代码
package com.YJZE.service;

import com.YJZE.mapper.UserMapper;
import com.YJZE.pojo.User;
import org.springframework.stereotype.Service;

@Service
public interface UserService {

    //根据用户名查询用户
    User findByUserName(String username);

    //注册用户
    void register(String username, String password);
}
5. 在 Service 下的 Impl 包中,添加 UserServiceImpl 类来实现 UserService 接口并依赖 UserMapper 接口
java 复制代码
package com.YJZE.service.Impl;

import com.YJZE.mapper.UserMapper;
import com.YJZE.pojo.User;
import com.YJZE.service.UserService;
import com.YJZE.utils.Md5Util;
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 u = userMapper.findByUserName(username);
        return u;
    }

    @Override
    public void register(String username, String password) {
        //加密
        //md5
        String md5String = Md5Util.getMD5String(password);

        userMapper.add(username,md5String);
        //添加

    }
}
6. 在controller中编写登录和注册、查询用户详细信息的接口
java 复制代码
package com.YJZE.controller;

import com.YJZE.pojo.Result;
import com.YJZE.pojo.User;
import com.YJZE.service.UserService;
import com.YJZE.utils.JwtUtil;
import com.YJZE.utils.Md5Util;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/user") // 设置请求路径前缀为 /user
@Validated // 开启参数校验
public class UserController {

    @Autowired // 自动注入UserService
    private UserService userService;

    /**
     * 用户注册接口
     * @param username 用户名,长度为5-16位,不能包含空格
     * @param password 密码,长度为5-16位,不能包含空格
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result register(@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("用户名被占用"); // 用户名已存在
        }
    }

    /**
     * 用户登录接口
     * @param username 用户名,长度为5-16位,不能包含空格
     * @param password 密码,长度为5-16位,不能包含空格
     * @return 登录结果,包含JWT Token
     */
    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {
        User loginUser = userService.findByUserName(username);
        if (loginUser == null) {
            return Result.error("用户名错误"); // 用户名不存在
        }

        // 验证密码
        if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
            // 密码正确,生成JWT Token
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", loginUser.getId());
            claims.put("username", loginUser.getUsername());
            String token = JwtUtil.genToken(claims);
            return Result.success(token); // 登录成功,返回Token
        }

        return Result.error("密码错误"); // 密码错误
    }

    /**
     * 获取用户信息接口
     * @param token JWT Token,从请求头Authorization获取
     * @return 用户信息
     */
    @GetMapping("/userInfo")
    public Result<User> userinfo(@RequestHeader(name = "Authorization") String token) {
        // 解析JWT Token获取用户名
        Map<String, Object> map = JwtUtil.parseToken(token);
        String username = (String) map.get("username");

        // 根据用户名查询用户信息
        User user = userService.findByUserName(username);
        return Result.success(user); // 返回用户信息
    }
}
//在utils工具包里面添加 MD5加密密码 和 JWt 用于用户登录后返回token
package com.YJZE.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtil {

    private static final String KEY = "itheima";
	
	//接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }

	//接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }

}

package com.YJZE;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTest {

    @Test
    public  void testGEn(){
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("username","张三");
        String token = JWT.create()
                .withClaim("user",claims)
                .withExpiresAt(new Date(System.currentTimeMillis()))
                .sign(Algorithm.HMAC256("itheima"));//指定算吗
        System.out.println(token);
    }

    @Test
    public void textParse(){
        //定义字符串模拟token

        String token =  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +
                "eyJ1c2VyIjp7I mlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3NDY4ODM3NzZ9" +
                ".qK-oXtJqEhzdp8Sa0JgSojky_DH_sEBBFyF3Vtv-HOs";
        JWTVerifier jw = JWT.require(Algorithm.HMAC256("itheima")).build();
        DecodedJWT decodedJWT = jw.verify(token);
        Map<String, Claim> claims = decodedJWT.getClaims();
        System.out.println(claims.get("user"));
        //如果篡改了头部和载荷的数据 验证事变
        //token
    }
}

注意

如有错误请告知

如有侵权请带着截图发邮件

邮箱 [email protected]

相关推荐
随风奔跑的十八岁15 分钟前
java 破解aspose.words 18.6 使用
java·linux·word转pdf·aspose-words
居然是阿宋35 分钟前
C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比
java·c语言·kotlin
sco52821 小时前
SpringBoot 自动装配原理 & 自定义一个 starter
java·spring boot·后端
曼岛_1 小时前
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
java·spring boot·http
_Itachi__1 小时前
LeetCode 热题 100 543. 二叉树的直径
java·算法·leetcode
风吹落叶32571 小时前
线程的一些事(2)
java·java-ee
海风极客2 小时前
《Go小技巧&易错点100例》第三十三篇
开发语言·后端·golang
喜欢便码3 小时前
xml与注解的区别
xml·java·开发语言
Rubypyrrha3 小时前
Spring MVC常见注解详解
java·spring·mvc