首页 > 其他分享 >无聊时整一个仿qq版用户注册

无聊时整一个仿qq版用户注册

时间:2024-10-10 21:52:23浏览次数:3  
标签:qq username account COMMENT String 用户注册 private import 整一个

springboot+mybatisplus

开始展示

相信很多小伙伴在写注册用户时应该都是传统的账号加密码进行用户注册

此时为什么不动动自己聪明的小脑袋瓜写一个另类的注册功能呢

我们常用的qq这种注册方法到现在也是很新颖的,这是我们就应该想到他这个账号是如何形成的。

qq注册就是输入用户名加密码产生一个账号,分析结束。这只是一个简易的分析模式。后面应该还涉及更多的功能和技术。但是只需要这些,我们已经完全可以在代码上开始翱翔了。ok,不废话了,让我们开始吧

首先建表:我们分析应有账号,用户名,密码这几个字段。ok

CREATE TABLE `t_user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `account` varchar(60) NOT NULL COMMENT '账号',
  `username` varchar(60) NOT NULL COMMENT '用户名',
  `password` varchar(60) NOT NULL COMMENT '密码',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',
  `is_deleted` tinyint(2) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0:未删除 1:已删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_account` (`account`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

ok,这是我们的用户表

接下来我们就要开始在idea中写我们的代码了

1.User.java

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("t_user")
/**
 * @since 2024/10/6
 * @description: TODO
 */
public class UserDO {

    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;

    private String password;

    private String account;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    private Boolean isDeleted;

}

2.RegisterUserReqVO.java

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "注册用户 VO")
public class RegisterUserReqVO {

    @ApiModelProperty(value = "用户名")
    private String username;

    @NotBlank(message = "用户名不能为空")
    @ApiModelProperty(value = "账号")
    private String account;

    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
    @Length(min = 11, max = 11, message = "手机号长度为11位")
    @ApiModelProperty(value = "手机号")
    private String phone;

}

3.UserService.java

 Response registerUser(RegisterUserReqVO registerUserReqVO);

4.UserServiceImpl.java

  public Response registerUser(RegisterUserReqVO registerUserReqVO) {
        // 1. 判断用户名是否已存在
        String username = generateAccount();
        String password = registerUserReqVO.getPassword();
        UserDO userDO = userMapper.findByUsername(username);

        if (Objects.nonNull(userDO)) {
            log.warn("用户名称: {}, 此用户已存在", username);
            throw new BizException(ResponseCodeEnum.USER_OR_IS_EXISTED);
        }
        String account = registerUserReqVO.getAccount();
        UserDO userDO1 = userMapper.findByAccount(account);

        if (Objects.nonNull(userDO1)) {
            log.warn("用户名称: {}, 此用户已存在", account);
            throw new BizException(ResponseCodeEnum.USER_OR_IS_EXISTED);
        }
        String encodePassword = passwordEncoder.encode(password);
        // 插入到数据库
        int userCount = userMapper.insert(UserDO.builder()
                .username(username)
                .password(encodePassword)
                .account(registerUserReqVO.getAccount())
                .phone(registerUserReqVO.getPhone())
                .build());

        if (userCount != 1) {
            return Response.fail(ResponseCodeEnum.USERNAME_NOT_FOUND);
        }

        // 插入角色信息
        int roleCount = userRoleMapper.insert(UserRoleDO.builder()
                .username(username)
                .build());

        if (roleCount != 1) {
            return Response.fail(ResponseCodeEnum.USERNAME_NOT_FOUND);
        }

        return Response.success();

    }
    public static String generateAccount() {
        Random random = new Random();
        int length = random.nextInt(3) + 5; // 生成 5 到 8 位长度的账号
        StringBuilder accountBuilder = new StringBuilder();
        for (int i = 0; i < length; i++) {
            accountBuilder.append(random.nextInt(10)); // 生成 0 到 9 的数字
        }
        return accountBuilder.toString();
    }

4.UserMapper

  default UserDO findByAccount(String account) {
        LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserDO::getAccount, account);
        return selectOne(wrapper);
    }
  default UserDO findByUsername(String username) {
        LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserDO::getUsername, username);
        return selectOne(wrapper);
    }

这里我们要去查询两个字段,目的应该为了防止用户注册时重复,不然的话就会出现很大的事故。

注册开始

ok呀,我们可以看到没有问题,

接下来看看工作台

工作台也是正常请求

看看我们的数据库

数据库也是成功插入了这条数据

这样我们就基本的复刻qq的注册方法

快去拿走炫耀一下吧,希望对你的思路展开有帮助。

南慕小白,一个爱胡思乱想的程序员

标签:qq,username,account,COMMENT,String,用户注册,private,import,整一个
From: https://blog.csdn.net/weixin_46730272/article/details/142832641

相关文章

  • 《QQ阅读》小说下载提示DLL文件丢失:修复步骤详解
    当QQ阅读或其他软件提示丢失DLL文件时,通常意味着某个动态链接库文件缺失或损坏,这可能会影响到软件的正常运行。以下是一些解决这个问题的方法:重新启动电脑有时候简单的重启可以解决问题,因为系统可能会自动修复一些临时性的问题。更新或重新安装QQ阅读确保你的QQ阅读是最新......
  • QQ登录(第三方登录)
    login.html<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en"><head>......
  • 基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云平台系统(附配置告警至QQ、钉钉)
    目录一、机器规划二、部署安装node-exporter、prometheus、Grafana、kube-state-metrics1、创建monitor-sa命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据3、k8s集群中部署prometheus3.1、创建一个sa账号3.2、将sa账号moni......
  • Windows应急响应-QQ巨盗病毒
    目录病毒背景样本分析开启监控感染病毒分析病毒行为C盘文件监控D盘文件监控进程监控排查服务排查启动项排查查杀1.杀掉进程2.异常服务3.映像劫持处理4.hosts文件处理5.D盘文件删除6.其他异常排查重启排查病毒背景简介:Win32.PSWTroj.QQPass,名为:【QQ伪装盗号者】是一种QQ盗号木马,......
  • 静态QQ登录代码学习
    记录学习@搬砖界泰斗这只小狐狸的静态QQ登陆页面源码,了解静态登陆页面如何书写&&拓宽自己对css的理解Q1:用css调节子级元素位置时什么时候调节margin,什么时候调节padding?A1:margin对外,padding对内e.g.要实现一个这样的排版有一个大大盒子fafather,里面其中一个是大盒子father,再......
  • 闲话即时通讯:腾讯的成长史本质就是一部QQ成长史
    1、前言在猴年新春的时候,腾讯当时推出了新春广告片(点击观看视频),作为《弹指间心无间》的延续。片中通过春节期间发送QQ红包让家人打车回家团聚,让我们感受到了“最温暖的红包,给最爱的人”那种弹指间的感动。而就在这弹指一挥间,此次腾讯新春广告片距离2011年腾讯发布《弹指间心无......
  • pbootcms如何实现留言内容自动发送到QQ邮箱
    要在PbootCMS中实现留言内容自动发送到QQ邮箱,需要完成以下几个步骤:准备两个QQ邮箱配置发件邮箱的SMTP服务在PbootCMS后台设置邮件发送1.准备两个QQ邮箱发件邮箱:用于发送邮件的邮箱。收件邮箱:用于接收留言内容的邮箱。2.配置发件邮箱的SMTP服务登录QQ邮箱登录发......
  • 【qt】QQ仿真项目1
    一览全局:QQ仿真项目一.创建项目添加资源文件二.创建数据库三.自定义标题栏Qt类四.加载样式表标题栏按钮的搭配五.标题栏实现移动窗体六.标题栏按钮连接信号槽七.标题栏双击最大化和还原八.基类窗口实现标题栏按钮信号九.重写基类窗口绘图事件确保设置样式表生效十.用......
  • 14 hashlib 案例2 用户注册
    问题:无法反向解密时,我们知道密码明文吗用户注册importhashlib#1、用户注册user=input("请输入用户名:").strip()pwd=input("请输入密码:").strip()#2、加密obj=hashlib.md5('testaa'.encode('utf-8'))obj.update(pwd.encode('utf-8'))encryp......
  • QQ空间协议重要参数获取login_sig、ptqrtoken、g_tk、p等
    QQ空间协议login_sig、ptqrtoken、p、g_tk、E.salt参数逆向获取QQ空间协议所有需要加密算法的重要参数汇总除了这些参数,其他所有参数都可在相关请求包的响应中找到,只要有这几个参数便可以玩转QQ空间协议本专栏包含QQ空间协议登录、点赞、发|删说说、留言等login_sig、ptqr......