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的注册方法
快去拿走炫耀一下吧,希望对你的思路展开有帮助。
南慕小白,一个爱胡思乱想的程序员