Json工具类

工具类

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 {@Resourceprivate DefaultKaptcha defaultKaptcha;@Resourceprivate UserService userService;@Resourceprivate UserConverter userConverter;@Resourceprivate 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();//验证码放入RedisjsonRedisUtil.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.rhkb.cn/news/181046.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4 Niagara Module Script 初次使用笔记

这里可以创建一个Niagara模块脚本 创建出来长这样 点击号&#xff0c;输出staticmesh&#xff0c;点击它 这样就可以拿到对应的一些模型信息 这里的RandomnTriCoord是模型的坐标信息 根据坐标信息拿到位置信息 最后的Position也是通过Map Set的号&#xff0c;选择Particles的P…

LeetCode题:83删除排序链表中的重复元素 141环形链表

83删除排序链表中的重复元素 题目内容 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xf…

STL-set和map

目录 一、pair和make_pair 1. pair 2. make_pair 二、set &#xff08;一&#xff09;set的模板参数列表 &#xff08;二&#xff09;set的构造 &#xff08;三&#xff09;set的插入 1. 测试1 2. 测试2 &#xff08;四&#xff09;low_bound和upper_bound&#xff…

【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队

在云原生领域&#xff0c;无论使用哪种编排调度平台&#xff0c;Kubernetes&#xff0c;DockerSwarm&#xff0c;OpenShift等&#xff0c;业务都需要基于镜像进行交付&#xff0c;我们在内部实践“Source-to-image”和链式构建&#xff0c;总而总结出“OneBuild”模式。 其核心…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

内网渗透-域防火墙+入站出站规则+组策略对象同步+不出网隧道上线

一.单机-防火墙-限制端口出入站-熟悉常见主机配置不出网的方式 配置防火墙属性 1.win10虚拟机本地搭建一个网站&#xff0c;配置防火墙属性的入站连接为默认值。 局域网中另一台主机能正常访问 2.入站连接设置为 阻止所有连接 。 因为是我们去访问他的网站&#xff0c;所以是入…

【JAVA学习笔记】 57 - 本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/homework 1. (1)封装个新闻类&#xff0c;包含标题和内容属性&#xff0c;提供get, set方法&#xff0c; 重写toString方法&#xff0c;打印对象时只打印标题; (2)只提供…

第8章_聚合函数

文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处&#xff0c;都有一根共地线和两根数据线。但是传递外部信息&#xff0c;串口有两根数据线可以进行双向通信&#xff0c;也就是全双工通信。而在IIC通信下&#xff0c;其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…

学电脑编程零基础,计算机编程入门先学什么

学电脑编程零基础&#xff0c;计算机编程入门先学什么&#xff0c;建议先从容易学习的语言入手&#xff0c;比如中文编程。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&…

【unity3D】使用RawImage实现UI上的帧动画

&#x1f4a6;本专栏是我关于游戏开发的笔记 &#x1f236;本篇是一个简短的小知识点 使用RawImage实现帧动画 找一个帧动画连续的图片拖到工程中&#xff0c;将Texture Type改成Sprite&#xff08;2D和UI&#xff09;&#xff0c;点击apply应用上 在工程中新建一个RawImage,将…

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)

目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书&#xff0c;你可以使用Certbot工具&#xff0c;它是一个自动化证书颁发工具&#xff0c;用于管理Let’s Encrypt证书。以下是在Cent…

【优秀毕设】基于vue+ssm+springboot的校园交友网站系统设计(附源码论文)

摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

freertos静态创建任务

在开始前先有个小插曲&#xff0c;我的keil的自动补全代码功能使用不了&#xff0c;经过查找是因为之前装51把有的文件覆盖了&#xff0c;照这篇博客就可以解决。 然后之前那份代码我们是动态创建任务&#xff0c;先来说一下动态创建任务和静态创建任务的区别&#xff1a; Fre…

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备?

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 这里以win10系统为例进行说明: 如下图所示,打开右下角的“网络和Internet设置”, 如下图所示,点击进入“更改适配器选项”, 如下图所示…

windwos10搭建我的世界服务器,并通过内网穿透实现联机游戏Minecraft

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图&#xff1a; Sapera Configuration 缓存与内存管理&#xff0c;以及通信端口配置工具&#xff0c;部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…

CSS与基本选择器

<div class"c1" id"d1"></div> CSS基本知识 什么是css&#xff1a;CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;他就会按照这个样式l来进行渲染。其实就是让HT…

Codeforces Round 882 (Div. 2)

目录 A. The Man who became a God 题目分析: B. Hamon Odyssey 题目分析: C. Vampiric Powers, anyone? 题目分析: A. The Man who became a God 题目分析: n个人分成k组&#xff0c;每一组的力量都是这样的&#xff0c;那么如果分成k组那么就会有k-1个力量不被统计…