SpringBoot优点达项目实战:登录功能实现(四)

news2024/11/24 15:18:58

SpringBoot优点达项目实战:登录功能实现(四)


文章目录

      • SpringBoot优点达项目实战:登录功能实现(四)
        • 1、查看接口
        • 2、查看数据库
        • 3、代码实现
          • 1、创建实体类
          • 2、controller实现
          • 3、service层实现
          • 4、Mapper层
        • 4、测试

1、查看接口

POST /index/login

Body 请求参数

{
  "login_name": "admin",
  "password": "111111"
}

请求参数

名称位置类型必选说明
x-tokenheaderstringtruetoken字符串
bodybodyobjectfalsenone
» login_namebodystringtrue可用 admin
» passwordbodystringtrue可用 111111

返回示例

{
    "errno": 0,
    "errmsg": null,,
    "data": {
    "token": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NjgwMDYwMTgsInJvbGRJZCI6IltcIjFjNTRlMDAzYzFmYzRkY2Q5YjA4N2VmOGQ0OGFiYWMzXCJdIiwidXNlcklkIjoiMSJ9.mi50Gskw6sV1H-3RPKasO9f_zFw-PgE0VGItvtxxGE1bO9iXer-48i8OCZZtUsJKohX1u0a2r6eFR5e6wRWT8Q"
	}
}

返回结果

名称类型必须说明
»errnoIntegertrue编码: 0成功,1失败
»errmsgStringtrue消息
»dataObjecttrue响应数据
»»»tokenStringfalse登录成功后的唯一标识
2、查看数据库

image-20240626175336719

从password字段可以看出来,密码是进行加密的

3、代码实现
1、创建实体类
@Data
@TableName("sys_user")
public class SystemUser {

    @Schema(description = "用户id")
    @TableId(value = "id")
    private String id;

    @Schema(description = "登录账号")
    @TableField(value = "login_name")
    @JsonProperty("login_name")
    private String loginName;

    @Schema(description = "用户密码")
    @TableField(value = "password")
    private String password;

    @Schema(description = "用户名称")
    @TableField(value = "name")
    private String name;

    @Schema(description = "邮箱")
    @TableField("email")
    private String email;

    @Schema(description = "手机")
    @TableField(value = "phone")
    private String phone;

    @Schema(description = "登录时间")
    @TableField(value = "login_date")
    private Date loginDate;

    @Schema(description = "创建时间")
    @TableField(value = "create_date",fill = FieldFill.INSERT)
    @JsonIgnore
    private Date createDate;

    @Schema(description = "修改时间")
    @TableField(value = "update_date",fill = FieldFill.UPDATE)
    @JsonIgnore
    private Date updateDate;

    @Schema(description = "逻辑删除")
    @TableLogic()
    @TableField("del_flag")
    @JsonIgnore
    private Integer delFlag;

    @Schema(description = "职位id")
    @TableField(value = "role_id")
    private String roleId;

    @Schema(description = "状态")
    @TableField(value = "status")
    private BaseStatus status;

    @Schema(description = "默认数据")
    @TableField(value = "default_data")
    private String defaultData;
}
  • @Data:这是 Lombok 提供的注解,用于自动生成该类的 getter、setter、toString、equals 和 hashCode 方法。
  • @TableName(“sys_user”):这是 MyBatis-Plus 提供的注解,用于指定该类对应的数据库表名 sys_user
  • @Schema:用于生成 API 文档时描述字段。
  • @TableId 和 @TableField:用于指定数据库表中的列名和属性。
  • @JsonProperty 和 @JsonIgnore:用于控制 JSON 序列化和反序列化行为。
  • @TableLogic:用于实现逻辑删除
2、controller实现
@PostMapping("/login")
@Operation(summary = "后台登录")
public String login(@RequestBody SystemUser systemUser){
    log.info("用户登录{}",systemUser);
    String result = systemConfigService.login(systemUser);
    return result;
}
  1. 接收客户端发送的 POST 请求,路径为 /login
  2. 将请求体中的 JSON 数据反序列化为 SystemUser 对象。
  3. 记录登录信息到日志中。
  4. 调用 systemConfigServicelogin 方法进行登录逻辑处理。
  5. 返回登录结果
3、service层实现

service接口

定义操作SysUser的service

/**
 * 针对system_user表的用户操作
 */
public interface SystemUserService extends IService<SystemUser> {
}

定义操作SysUser的serviceImpl

@Service
@Slf4j
public class SystemUserServiceImpl extends ServiceImpl<SystemUserMapper, SystemUser>
implements SystemUserService {
}

在SysconfigService中获取

    /**
     * 用户等登录
     * @param systemUser
     * @return
     */
    String login(SystemUser systemUser);

在实现类中进行业务处理

@Autowired
private SystemUserService userService;

/**
     * 用户登录
     *
     * @param systemUser
     * @return
     */
@Override
public String login(SystemUser systemUser) {
    String name = systemUser.getLoginName();
    String password = systemUser.getPassword();
    //判断用户是否输入账号
    if (name == null){
        throw new youdiandaException(ResultCodeEnum.ADMIN_LOGIN_USER_NULL);
    }
    //判断用户是否输入密码
    if (password == null){
        throw new youdiandaException(ResultCodeEnum.ADMIN_LOGIN_PASSWORD_NULL);
    }

    //查询用户
    LambdaQueryWrapper<SystemUser> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SystemUser::getLoginName,name);
    SystemUser user = userService.getOne(queryWrapper);
    if (user == null){
        throw new youdiandaException(ResultCodeEnum.ADMIN_ACCOUNT_NOT_EXIST_ERROR);
    }

    //查询用户是否可用
    if (user.getStatus() == BaseStatus.DISABLE){
        throw new youdiandaException(ResultCodeEnum.ADMIN_ACCOUNT_DISABLED_ERROR);
    }

    //查看密码是否正确
    if (!user.getPassword().equals(DigestUtils.md5Hex(password))){
        log.info(DigestUtils.md5Hex(user.getPassword()));
        throw new youdiandaException(ResultCodeEnum.ADMIN_ACCOUNT_ERROR);
    }

    // 生成 JWT
    String token = JwtUtil.createToken(Long.valueOf(user.getId()), user.getName());

    // 构建响应数据
    Map<String, Object> data = new HashMap<>();
    data.put("token", token);

    Map<String, Object> response = new HashMap<>();
    response.put("errno", 0);
    response.put("errmsg", null);
    response.put("data", data);

    try {
        // 将响应数据转换为 JSON 字符串
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.writeValueAsString(response);
    } catch (Exception e) {
        e.printStackTrace();
        return "{\"errno\": 1, \"errmsg\": \"Error generating token\"}";
    }
}

这个 login 方法实现了用户登录的完整逻辑:

  1. 验证用户输入的登录名和密码。
  2. 查询用户是否存在。
  3. 检查用户状态是否可用。
  4. 验证用户密码是否正确。
  5. 生成 JWT 令牌。
  6. 构建并返回包含令牌的 JSON 响应。

生成JWT令牌

在common模块中定义工具类,进行令牌生成

public class JwtUtil {
    private static SecretKey secretKey = Keys.hmacShaKeyFor("WyjcDMViPOOsizAdpbrgtbhSXxZBYfns".getBytes());

    public static String createToken(Long userId,String username){
        String jwt = Jwts.builder()
                .setExpiration(new Date(System.currentTimeMillis() + 36000000))
                .setSubject("LOGIN_USER")
                .claim("userId", userId)
                .claim("username", username)
                .signWith(secretKey, SignatureAlgorithm.HS256)
                .compact();

        return jwt;
    }
}

JwtUtil 用于生成 JSON Web Token (JWT),主要包含一个静态方法 createToken,该方法接收用户 ID 和用户名,并生成一个包含这些信息的 JWT。

  • secretKey:这是一个静态的 SecretKey 对象,用于签署 JWT。它是使用 Keys.hmacShaKeyFor 方法生成的,参数是一个字节数组,这里是字符串 "WyjcDMViPOOsizAdpbrgtbhSXxZBYfns" 的字节表示。
  • setExpiration:设置 JWT 的过期时间,这里设置为当前时间加上 10 小时(36000000 毫秒)。
  • setSubject:设置 JWT 的主题,这里设置为 "LOGIN_USER"
  • claim:添加自定义声明(claims),这里添加了用户 ID (userId) 和用户名 (username)。
  • signWith:使用指定的 secretKey 和签名算法(HS256)对 JWT 进行签名。
  • compact:生成并返回 JWT 字符串。

业务处理中用到了一些异常,在此之前应该定义异常类

在common模块中定义

@Data
public class youdiandaException extends RuntimeException{

    //异常状态码
    private Integer code;

    public youdiandaException(String message,Integer code){
        super(message);
        this.code = code;
    }

    /**
     * 根据响应结果枚举对象创建异常对象
     */
    public youdiandaException(ResultCodeEnum resultCodeEnum){
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }
}

同时在model模块中创建枚举类统一返回的信息

/**
 * 统一返回结果状态信息类
 */
@Getter
public enum ResultCodeEnum {

    LOGIN_SUCCESS(0,"登录成功"),
    LOGIN_FAIL(1,"登录失败"),
    SUCCESS(200, "成功"),
    FAIL(201, "失败"),
    PARAM_ERROR(202, "参数不正确"),
    SERVICE_ERROR(203, "服务异常"),
    DATA_ERROR(204, "数据异常"),
    ILLEGAL_REQUEST(205, "非法请求"),
    REPEAT_SUBMIT(206, "重复提交"),

    ADMIN_LOGIN_AUTH(305, "未登陆"),
    ADMIN_ACCOUNT_NOT_EXIST_ERROR(306, "账号不存在"),
    ADMIN_ACCOUNT_ERROR(307, "用户名或密码错误"),
    ADMIN_ACCOUNT_DISABLED_ERROR(308, "该用户已被禁用"),
    ADMIN_ACCESS_FORBIDDEN(309, "无访问权限"),
    ADMIN_LOGIN_USER_NULL(310,"请输入用户"),
    ADMIN_LOGIN_PASSWORD_NULL(311,"请输入密码"),

    TOKEN_EXPIRED(601, "token过期"),
    TOKEN_INVALID(602, "token非法");

    private final Integer code;

    private final String message;

    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

4、Mapper层
@Mapper
public interface SystemUserMapper extends BaseMapper<SystemUser> {
}

因为业务层中使用的是mybatisPlus自带的查询语句,所以Mapper层不需要去进行sql自定义查询,但必须将创建出来,为业务层实现

4、测试

在knife4j进行调试

image-20240626181358834

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1865456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPFoxy Tips:匿名海外代理IP的使用方法及注意事项

在互联网上&#xff0c;隐私和安全问题一直备受关注。为了保护个人隐私和数据安全&#xff0c;使用匿名代理IP是一种常用的方法。匿名代理IP可以隐藏用户的真实IP地址&#xff0c;使用户在访问网站时更加隐秘和安全。 本文将介绍匿名代理IP的基本原理和核心功能。 基本原则 匿…

Power BI 占比函数

1&#xff0c;普通层级结构占比 占比1 DIVIDE([sum_qty], CALCULATE([sum_qty],ALLSELECTED(Item[ITEM_CODE]))) //按照line为一个整理展示数据占比2 SWITCH( true(),ISINSCOPE(Item[ITEM_CODE]),DIVIDE([sum_qty], CALCULATE([sum_qty],ALLSELECTED(Item[ITEM_CODE]))), IS…

前端 CSS 经典:mix-blend-mode 属性

前言&#xff1a;这是一个混合属性&#xff0c;作用是将两个颜色混合生成一个新颜色。可以将视频和文字相融合&#xff0c;产生动态文字效果。 效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" />&l…

数据资产风险管理与合规性:全面识别、科学评估并有效应对数据风险,确保企业数据资产的安全性与合规性,为企业稳健发展提供坚实保障

一、引言 在数字化时代&#xff0c;数据资产已成为企业运营和决策的核心要素。然而&#xff0c;随着数据量的快速增长和技术的不断演进&#xff0c;数据资产面临的风险也日益增多&#xff0c;如数据泄露、数据篡改、数据滥用等。同时&#xff0c;数据保护法律法规的不断完善&a…

文华财经盘立方均线-支撑压力自动画线多空声音预警指标公式源码

文华财经盘立方多空均线-支撑压力自动画线指标公式源码&#xff1a; //MA5:MA(C,5); //MA10:MA(C,10); MA20:MA(C,20),COLORRED; MA60:MA(C,60),COLORGREEN; TY:CLOSE; HD:FILTER(BACKSET(FILTER(REF(TY,10)HHV(TY,2*101),10),101),10); LD:FILTER(BACKSET(FILTER(REF(T…

PatchMixer:一种用于长时间序列预测的Patch混合架构

前言 《PatchMixer: A Patch-Mixing Architecture for Long-Term Time Series Forecasting》原文地址&#xff0c;Github开源代码地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了中文翻译…

jdk1.8升级到jdk11遇到的各种问题

一、第三方依赖使用了BASE64Decoder 如果项目中使用了这个类 sun.misc.BASE64Decoder&#xff0c;就会导致错误&#xff0c;因为再jdk11中&#xff0c;该类已经被删除。 Caused by: java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder 当然这个类也有替换方式&#xf…

一本好的电子画册应这样做,你做对了吗?

​一本好的电子画册&#xff0c;不仅要有吸引人的图文&#xff0c;还可能包括视频、音频等多媒体元素&#xff0c;为读者提供全方位的阅读体验。连贯性是指画册的整体设计风格、内容布局要协调一致&#xff0c;让读者在阅读过程中感受到流畅和自然。创新性则要求创作者在内容呈…

【别再用Excel了!】这款免费可视化工具能帮你轻松提升效率

现代数据分析和展示的需求已经远远超出了传统工具的能力&#xff0c;尤其是在需要快速、直观和高效地处理复杂数据的情况下。山海鲸可视化通过其强大的功能和易用性&#xff0c;成为了设计师以及各类新手用户的理想选择。下面我就以一个可视化设计师的角度&#xff0c;和大家简…

月入稳定还是创业冒险:你的选择决定未来

大家好&#xff0c;我是汇舟问卷。在现在这个环境下&#xff0c;无论是就业还是创业都不好做。在传统就业与创业之间的选择时&#xff0c;我们应避免一概而论或过度推崇某一方向。 事实上&#xff0c;并非所有人都适合创业&#xff0c;对于那些满足于稳定工作&#xff0c;每月…

深入理解计算机系统 CSAPP 家庭作业7.13

用一下496页提到的工具咯 A: whereis libm.a file lidm.a gedit libm.a libm.a是个ASCII text文件打开一看原来 libm-2.27.a 和libmvec.a才是我们要看的 所以我们cd到目标地址后 ar -t libm-2.27.a ar -t libmvec.a B: gcc -Og bar5.c foo5.c 用之前的两个文件链接后生成…

电脑复制按哪个键?还不会操作的赶紧来看!

当我们提到“电脑复制按哪个键”时&#xff0c;实际上是在讨论电脑键盘上用于执行复制操作的快捷键。复制功能在日常的电脑操作中极为常用&#xff0c;无论是文本编辑、文件处理还是图片操作&#xff0c;都离不开复制这一基本功能。以下&#xff0c;我们将深入探讨电脑复制操作…

不花一分钱也能制作出高质量的宣传册

在当今竞争激烈的市场环境中&#xff0c;拥有一份高质量的宣传册对于企业或个人来说至关重要。它能帮助您在客户心中留下深刻印象&#xff0c;有效推广您的品牌或服务。但聘请专业设计师和印刷商制作宣传册往往需要不小的开支。那么&#xff0c;有没有既省钱又能做出高质量宣传…

web图片怎么导入ps?这个方法给你轻松解决!

随着WebP格式图片因其体积小、加载快的优势在网站中日益普及&#xff0c;对于图片编辑者来说&#xff0c;能够直接在Photoshop中打开和编辑WebP文件变得尤为重要。 WebPShop插件应运而生&#xff0c;它是一个专为Photoshop设计的模块&#xff0c;支持打开和保存WebP图像&#…

如何借助物联网实现土壤监测与保护

如何借助物联网实现土壤监测与保护 高标准农田信息化是指利用现代信息技术&#xff0c;如物联网、大数据、云计算等&#xff0c;对农田进行数字化、智能化的管理&#xff0c;以提高农田的生产效率和可持续发展能力。其中&#xff0c;土壤监测与保护是农田信息化的重要内容之一…

面向对象修炼手册(四)(多态与空间分配)(Java宝典)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;面向对象修炼手册 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 1 多态 1.1 多态的形式&…

鉴权开发框架Django REST framework的应用场景

目录 一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景 一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统…

喜报!莱佛士学生斩获2024年AIFW新兴设计师奖

近日&#xff0c;2024年东盟国际时装周&#xff08;AIFW&#xff09;在新加坡滨海湾金沙艺术科学博物馆隆重举行。 在这场时尚盛宴中&#xff0c;莱佛士服装设计专业的学生Sonpavarapong SASIPIM&#xff08;Hunny&#xff09;以其出色的设计才华和独特的设计风格脱颖而出&…

二维到三维的华丽转身:3D培训大师点亮汽车维修课件制作的立体新篇章

随着汽车技术的迅猛发展与新能源汽车的快速普及&#xff0c;汽车维修领域亦呈现出日新月异的革新态势。传统的汽车维修培训通常是通过以下两种方式开展&#xff1a;在专业的汽车维修学校进行系统培训和在汽车维修企业或修理站进行实地培训。一般来说&#xff0c;后者往往以前者…

C语言 指针——从函数返回字符串

目录 从函数返回字符指针 编程实现strcat()的功能 小结 从函数返回字符指针 编程实现strcat()的功能 小结 明确字符串被保存到了哪里&#xff0c;明确字符指针指向了哪里  指向字符串常量的字符指针  指向字符数组的字符指针 向函数传递字符串的方法  向函数传…