迅联文库开发日志(三)登陆注册

目录

一、注册

Controller层

Service层

二、登录

其他需要注意的:

需要实现 Serializable 的场景​


一、注册

先思考我们需要哪些参数:

邮箱、昵称、密码、邮箱验证码 (图片验证码会调用checkCode()验证)

Controller层

	@RequestMapping("/register")
	@GloballInterceptor(checkParams=true)// 表示该方法需要做参数校验
	public ResponseVO register(HttpSession session, @VerifyParam(required = true,regex= VerifyRegexEnum.EMAIL,max = 150) String email,
									@VerifyParam(required = true) String nickName,
									@VerifyParam(required = true,regex = VerifyRegexEnum.PASSWORD,max = 18,min = 8) String passwaord,
									@VerifyParam(required = true) String checkCode,
									@VerifyParam(required = true) String emailCode){
		try{
			//判断用户提交的图片验证码和session中的图片验证码是否一致
			if(!checkCode.equalsIgnoreCase((String) session.getAttribute(Constants.CHECK_CODE_KEY))){
				throw new BusinessException("图片验证码错误");
			}
			userInfoService.register(email,nickName,passwaord,emailCode);
			return getSuccessResponseVO(null); // 成功
		}finally {
			session.removeAttribute(Constants.CHECK_CODE_KEY_EMAIL); // 清除session中的验证码
		}

	}

关注点:

1.我们仍然要对这个方法做一个参数拦截,开启自定义拦截器,详情可以查看上一篇文章讯联云库项目开发日志(二)AOP参数拦截-CSDN博客

2.再对图片验证码进行判断,从session拿出来

3.最后登录调用service,于是我们来看看service层

Service层

service业务逻辑层是最重要的

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void register(String email, String nickName, String password, String emailCode) {
		UserInfo userInfo = userInfoMapper.selectByEmailByUserInfo(email);
		if(userInfo!=null){
			throw new BusinessException("邮箱已存在");
		}
		UserInfo nickNameUser= userInfoMapper.selectByNickName(nickName);
		if(nickNameUser!=null){
			throw new BusinessException("昵称已存在");
		}
		//校验邮箱验证码
		emailCodeService.checkEmailCode(email,emailCode);

		String userId=StringTools.getRandomNumber(Constants.LENGTH_10);
		userInfo=new UserInfo();
		userInfo.setUserId(userId);
		userInfo.setEmail(email);
		userInfo.setNickName(nickName);
		userInfo.setPassword(StringTools.encodeByMd5(password));//密码md5加密
		userInfo.setJoinTime(new Date());
		userInfo.setStatus(UserStatusEnum.ENABLE.getStatus());

		userInfo.setUseSpace(0L);
		SysSettingDto sysSettingDto = redisComponent.getSysSetting();
		userInfo.setTotalSpace(sysSettingDto.getUserInitSpance()*Constants.MB);//初始空间
		userInfoMapper.insert(userInfo);
	}

关注点:

1.先查询邮箱是否存在

2.再查询昵称是否存在

3.调用另一个Email业务逻辑层的checkEmailCode()方法校验邮箱验证码

4.设置随机id,输入用户表单信息,用md5加密,最后再用枚举类设置状态

5.设置磁盘空间,已使用空间和总空间,总空间从模板中获取之后扩大一下存入

再直接插入数据库即可

二、登录

controller层:

@RequestMapping("/login")
	@GloballInterceptor(checkParams=true)// 表示该方法需要做参数校验
	public ResponseVO login(HttpSession session,
								@VerifyParam(required = true) String email,
							   @VerifyParam(required = true) String password,
							   @VerifyParam(required = true) String checkCode){
		try{
			//判断用户提交的图片验证码和session中的图片验证码是否一致
			if(!checkCode.equalsIgnoreCase((String) session.getAttribute(Constants.CHECK_CODE_KEY))){
				throw new BusinessException("图片验证码错误");
			}
			SessionWebUserDto sessionWebUserDto = userInfoService.login(email,password);
			session.setAttribute(Constants.CHECK_CODE_KEY, sessionWebUserDto);
			return getSuccessResponseVO(sessionWebUserDto); // 发送成功
		}finally {
			session.removeAttribute(Constants.CHECK_CODE_KEY_EMAIL); // 清除session中的验证码
		}

	}

Service层:

@Override
	public SessionWebUserDto login(String email, String password) {
		UserInfo userInfo = this.userInfoMapper.selectByEmailByUserInfo(email);
		if(userInfo==null){
			throw new BusinessException("邮箱不存在");
		}
		if(!userInfo.getPassword().equals(password)){
			throw new BusinessException("密码不存在");
		}
		if(userInfo.getStatus().equals(UserStatusEnum.DISABLE.getStatus())){
			throw new BusinessException("账户被禁用");
		}
		UserInfo updateInfo = new UserInfo();
		updateInfo.setLastLoginTime(new Date());
		userInfoMapper.updateByEmail(updateInfo,email);
		SessionWebUserDto sessionWebUserDto = new SessionWebUserDto();
		sessionWebUserDto.setNickName(userInfo.getNickName());
		sessionWebUserDto.setAvater(userInfo.getQqAvatar());
		sessionWebUserDto.setUserId(userInfo.getUserId());
		if(ArrayUtils.contains(appConfig.getAdminEmails().split(","),email)){
			sessionWebUserDto.setAdmin(true);
		}else {
			sessionWebUserDto.setAdmin(false);
		}
		//用户空间
		UserSpaceDto userSpaceDto=new UserSpaceDto();
		//userSpaceDto.setUseSpace(userInfo.getUseSpace());每次登录的用户使用空间要单独查询
		userSpaceDto.setTotalSpace(userInfo.getTotalSpace());
		redisComponent.saveUserSpace(userInfo.getUserId(),userSpaceDto);
		return null;
	}

其他需要注意的:

有意思的是,在我突然看见为什么这个==可以比较,毕竟==在比较引用类型的是引用地址​,查了一下资料突然回想起之前聊天群谈到过Java 对 -128 到 127 的 Integer 对象做了缓存!!

所以-127~128只要是integer都是指向同一个地址!!

Integer a = 100;  // 自动装箱为 Integer.valueOf(100),返回缓存对象
Integer b = 100;  // 返回同一个缓存对象
System.out.println(a == b); // true(地址相同)

Integer c = 200;  // 超出缓存范围,新建对象
Integer d = 200;  // 新建另一个对象
System.out.println(c == d); // false(地址不同)

需要实现 Serializable 的场景​

对象需要持久化存储​

  • ​场景​​:将对象保存到文件、数据库(如 Redis 的二进制存储)或网络传输。

 跨 JVM 传输​

  • ​场景​​:RPC 调用(如 Dubbo)、分布式缓存(如 Redis)、消息队列(如 Kafka)等。

作为会话(Session)或缓存数据​

  • ​场景​​:HTTP Session 集群共享(如 Spring Session + Redis)、缓存对象序列化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Absinthe_苦艾酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值