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

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的注册方法

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值