Json工具类

news2024/11/28 3:42:18

工具类

package com.wego.controller;

import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.wego.bean.ResultBean;
import com.wego.constant.CommonState;
import com.wego.constant.WeGoConstant;
import com.wego.converter.UserConverter;
import com.wego.dto.UserLoginDTO;
import com.wego.dto.UserRegisterDTO;
import com.wego.entity.User;
import com.wego.service.UserService;
import com.wego.toolkits.redis.util.JsonRedisUtil;
import com.wego.toolkits.validator.ValidatorUtil;
import com.wego.utils.JsonUtil;
import com.wego.utils.PasswordUtil;
import com.wego.utils.RandomUtil;
import com.wego.utils.RequestUtil;
import com.wego.utils.ResultBeanUtil;
import com.wego.vo.UserTokenVO;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotBlank;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Base64;
import javax.imageio.ImageIO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户控制层
 *
 * @author hc 13264494458
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private DefaultKaptcha defaultKaptcha;

    @Resource
    private UserService userService;

    @Resource
    private UserConverter userConverter;

    @Resource
    private JsonRedisUtil<String> jsonRedisUtil;

    @SaIgnore
    @PostMapping("/v1/login")
    public ResultBean<UserTokenVO> login(@RequestBody UserLoginDTO userLoginDTO) {
        //数据有效性校验
        ValidatorUtil.validateEntity(userLoginDTO);
        // TODO:判断校验码是否正确
        final QueryWrapper<User> queryWrapper = Wrappers.<User>query()
                .eq("account", userLoginDTO.getAccount())
                .eq("state", CommonState.POSITIVE);
        //根据账户查询用户
        final User user = userService.getOne(queryWrapper);
        if (user == null) {
            return ResultBeanUtil.<UserTokenVO>error().setMsg("账户不存在或账户被禁用");
        }
        final String encryptPassword = PasswordUtil.encrypt(userLoginDTO.getPassword(), user.getSalt());
        //比较密码
        if (encryptPassword.equals(user.getPassword())) {
            // 登录成功
            final UserTokenVO userTokenVO = userConverter.user2userTokenVO(user);

            // 将当前登录用户纳入sa-token管理
            StpUtil.login(JsonUtil.obj2String(userTokenVO));

            final String tokenValue = StpUtil.getTokenValue();
            return ResultBeanUtil.<UserTokenVO>success()
                    .setMsg("登录成功!")
                    .addData("token", tokenValue, "user", userTokenVO);
        }
        return ResultBeanUtil.<UserTokenVO>error().setMsg("登录失败!");
    }

    /**
     * 生成验证码
     * @throws IOException
     */
    @GetMapping("/v1/verifyCode")
    public ResultBean<String> getVerifyCode() throws IOException {
        // 生成文字验证码
        String verifyCode = defaultKaptcha.createText();

        final String ip = RequestUtil.getIp();
        //验证码放入Redis
        jsonRedisUtil.set(ip + "-verifyCode", verifyCode, WeGoConstant.VERIFY_CODE_TTL);

        // 生成图片验证码
        BufferedImage image = defaultKaptcha.createImage(verifyCode);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", out);
        // 对字节组Base64编码
        return ResultBeanUtil.success(Base64.getEncoder().encodeToString(out.toByteArray()));
    }

    /**
     * 校验验证码
     * @param verifyCode
     * @return
     */
    @ResponseBody
    @GetMapping("/v1/checkVerifyCode")
    public ResultBean<String> checkVerifyCode(@NotBlank(message = "校验码不能为空") String verifyCode) {
        final String ip = RequestUtil.getIp();
        final String redisVerifyCode = jsonRedisUtil.get(ip + "-verifyCode");

        //用户没有登录,让用户登录
        if (redisVerifyCode == null) {
            return ResultBeanUtil.error("请刷新页面生成验证码后再次请求!");
        } else {
            //比较验证码忽略大小写
            if (redisVerifyCode.equalsIgnoreCase(verifyCode)) {
                return ResultBeanUtil.success("验证码正确!");
            } else {
                return ResultBeanUtil.error("请刷新页面生成验证码后再次请求!");
            }
        }
    }

}

测试代码


    /**
     * 注册逻辑
     * @param userRegisterDTO
     * @return
     */
    @PostMapping("/v1/register")
    public ResultBean<String> register(@RequestBody UserRegisterDTO userRegisterDTO) {
        ValidatorUtil.validateEntity(userRegisterDTO);
        //判断两个密码是否一致
        if (!userRegisterDTO.getPassword1().equals(userRegisterDTO.getPassword2())) {
            return ResultBeanUtil.error("两次密码不一致");
        }

        boolean res;
        //比较验证码是否正确
        final String ip = RequestUtil.getIp();
        final String veriyCode = jsonRedisUtil.get(ip + "-verifyCode");
        //用户没有登录,让用户登录
        if (veriyCode == null) {
            res = false;
        } else {
            //比较验证码忽略大小写
            res = veriyCode.equalsIgnoreCase(userRegisterDTO.getVerifyCode());
        }

        final String salt = RandomUtil.genString(5, 22);
        final String encryptPassword = PasswordUtil.encrypt(userRegisterDTO.getPassword1(), salt);
        final User user = User.builder()
                .account(userRegisterDTO.getAccount())
                .salt(salt)
                .password(encryptPassword)
                .state(CommonState.POSITIVE)
                .createTime(LocalDateTime.now())
                .updateTime(LocalDateTime.now())
                .build();
        res = res && userService.save(user);

        if (res) {
            return ResultBeanUtil.success("用户注册成功!");
        }

        return ResultBeanUtil.error("用户注册失败!");
    }

测试结果

在这里插入图片描述

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

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

相关文章

C++ Package继承层次,采用继承实现快递包裹的分类计价(分为空运2日达、陆运3日达)。

一、问题描述&#xff1a; Package继承层次&#xff0c;采用继承实现快递包裹的分类计价&#xff08;分为空运2日达、陆运3日达&#xff09;。自定义一个或多个快递公司&#xff0c;自定义计价方法&#xff0c;设计合适、合理的界面文本提示&#xff0c;以广东省内某市为起点&…

『 MySQL数据库 』之数据库基础

文章目录 mysql的登陆选项什么是数据库mysql与mysqld的区别mysql与数据库为什么存储数据时不用文件而用数据库? 在Linux中如何显式观察数据库?在Linux中如何使用mysql建立一个数据库,建立一张表结构,插入一些数据;服务器与数据库、表之间的关系SQL分类 mysql的登陆选项 mysq…

httpclient工具类(支持泛型转换)

1、网上搜到的httpclient工具类的问题&#xff1a; 1.1、如下图我们都能够发现这种封装的问题&#xff1a; 代码繁杂、充斥了很多重复性代码返回值单一&#xff0c;无法拿到对应的Java Bean对象及List对象集合实际场景中会对接大量第三方的OPEN API&#xff0c;下述方法的扩展…

最亮那颗星的中年危机 —— 程序员的职场困境与破局

如果说最近的这十年国内市场什么工作是最受瞩目的&#xff0c;那么程序员绝对算得上是夜空中最闪亮的那颗星。 伴随科技的迅猛发展&#xff0c;计算机走进千家万户&#xff0c;智能终端深深融入每个人的生活&#xff0c;程序员这一职业群体也逐渐成为了现代社会中不可或缺的一…

分享一个抖音视频解析神器~

怎么样下载抖音视频&#xff1f;相信很多人都有过这样的困惑。作为一个资深短视频剪辑工作者&#xff0c;常常需要用到各种视频素材&#xff0c;其中不乏需要从抖音上下载的&#xff0c;因此我也尝试过许多下载工具&#xff0c;但是效果都不大满意&#xff0c;直到有一次朋友给…

最近面试者对接口测试的理解真把我给笑拥了~

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

建议收藏《2023华为海思实习笔试-数字芯片真题+解析》(附下载)

华为海思一直以来是从业者想要进入的热门公司。但是岗位就那么多&#xff0c;在面试的时候&#xff0c;很多同学因为准备不充分&#xff0c;与岗位失之交臂&#xff0c;无缘进入该公司。今天为大家带来《2023华为海思实习笔试-数字芯片真题解析》题目来源于众多网友对笔试的记录…

CSS基础知识点速览

1 基础认识 1.1 css的介绍 CSS:层叠样式表(Cascading style sheets) CSS作用&#xff1a; 给页面中的html标签设置样式 css写在style标签里&#xff0c;style标签一般在head标签里&#xff0c;位于head标签下。 <style>p{color: red;background-color: green;font-size…

路由器基础(五): OSPF原理与配置

开放式最短路径优先 (Open Shortest Path First,OSPF) 是一个内部网关协议 (Interior Gateway Protocol,IGP),用于在单一自治系统(Autonomous System,AS) 内决策路由。OSPF 适合小型、中型、较大规模网络。OSPF 采用Dijkstra的最短路径优先算法 (Shortest Pat…

Go Gin中间件

Gin是一个用Go语言编写的Web框架&#xff0c;它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念&#xff0c;它可以用来处理HTTP请求和响应&#xff0c;或者在处理请求之前和之后执行一些操作。 以下是关于Gin中间件开发的一些基本信息&am…

【计算机网络 - 自顶向下方法】第一章习题答案

P2 Question&#xff1a;   式 (1-1) 给出了经传输速率为 R 的 N 段链路发送长度为 L 的一个分组的端到端时延。 对于经过 N 段链路一个接一个地发送 P 个这样的分组&#xff0c;一般化地表示出这个公式。 Answer&#xff1a;    N ∗ L R \frac{N*L}{R} RN∗L​ 时&…

【移远QuecPython】EC800M物联网开发板的内置GNSS定位获取(北斗、GPS和GNSS)

【移远QuecPython】EC800M物联网开发板的内置GNSS定位获取&#xff08;北斗、GPS和GNSS&#xff09; 测试视频&#xff08;其中的恶性BUG会在下一篇文章阐述&#xff09;&#xff1a; 【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG&#xff08;目前没有完全的…

Python语言:容器操作知识点总结清单

容器通用操作表格&#xff1a; 列表知识点清单&#xff1a; 元组知识点清单&#xff1a; 字典知识点清单&#xff1a; 集合知识点清单&#xff1a; 字符串知识点清单&#xff1a; 说明&#xff1a;本次知识点总结可能会有遗漏&#xff0c;没有做到面面俱到。

联通智网科技正式入选国家级专精特新“小巨人”企业

近日&#xff0c;北京市经济和信息化局发布《第五批专精特新“小巨人”企业公告名单》&#xff0c;根据工业和信息化部发布的《工业和信息化部关于公布第五批专精特新“小巨人”企业和通过复核的第二批专精特新“小巨人”企业名单的通告》&#xff0c;联通智网科技股份有限公司…

Java自学第3课:Java语言流程控制和字符串

1 复合语句 复合语句是以区块为单位的语句&#xff0c;也就是{}内的内容。 2 条件语句 if (布尔表达式){语句序列}else{语句序列} 有个好玩的是&#xff0c;对年龄段的分段&#xff0c;其实以前的思维是有点冗余的&#xff0c;比如a<100 & a>90&#xff0c;在复合…

蛋白质N端测序服务

表达纯化后的蛋白产物&#xff0c;特别是蛋白品的分析过程中&#xff0c;需要对蛋白的末端进行验证&#xff0c;以保证表达纯化产物的N端和C端序列准确。Edman降解法是蛋白的N端序列分析中非常成熟的方法之一&#xff0c;有着广泛的应用。卡梅德生物采用岛津公司Edman测序系统&…

C++定义一个 Student 类,在该类定义中包括:一个数据成员 score(分数)及两个静态数据 成员 total(总分)和学生人数 count

完整代码&#xff1a; /*声明一个Student类&#xff0c;在该类中包括一个数据成员score&#xff08;分数&#xff09;、两个静态数据成员total_score&#xff08;总分&#xff09;和count&#xff08;学生人数&#xff09;&#xff1b;还包括一个成员函数account&#xff08;&…

Redis缓存穿透、击穿、雪崩问题原理和解决方案

目录 一、Redis缓存穿透1.1、缓存穿透原理1.2、缓存穿透代码演示1.3、缓存穿透解决方案解决方案一&#xff08;数据库中查询不到数据也将key进行缓存&#xff09;解决方案二&#xff08;使用布隆过滤器&#xff09; 二、Redis缓存击穿&#xff08;缓存失效&#xff09;三、Redi…

KV STUDIO对plc的读取与电焊机的配料设置

今天又开始了明天的工作总结&#xff0c;希望对于看小编博客的粉丝有所帮助&#xff0c;前程似锦&#xff01;&#xff01;&#xff01; KV STUDIO对plc的读取 一&#xff0c;先将电脑与设备相连接&#xff0c;有许多种发生&#xff0c;小编这使用的是以太网方式 二&#xff0…