个人技术总结——实现用户的登录、注册、更新

222200229曹品顺 2024-12-11 15:33:06

目录

  • 一、技术概述
  • 二、技术详述
  • 2.1 登录操作
  • 2.2 注册新用户
  • 2.3 更新用户信息
  • 2.4 重置密码、找回密码
  • 三、遇到的问题和解决方案
  • 3.1 问题1:用户注册时,邮箱或手机号重复
  • 3.2 问题2:用户状态检查不准确
  • 四、总结
  • 五、参考博客

一、技术概述

用户登录和注册是基本上所有的网站都需要用到的功能,所以我就想夯实这方面的基础。

用户注册:提供一个接口供用户注册,并保存用户基本信息(如用户名、密码、邮箱)。
用户登录:用户输入用户名与密码,后端校验信息。
用户信息更新:用户输入新的信息,后端进行更新。

二、技术详述

设置一个CommonResult类,将其用来返回给前端的信息。

  1. 用户首先要进行注册,前端发送来用户注册的信息之后,通过后端把用户的注册信息保存到数据库中。返回前端"注册成功"语句和用户的信息(所有返回给前端的用户信息都是密码为空)。
  2. 用户进行登录时,接收到来自前端的账号密码,后端查询在数据库中是否存在该用户,如果存在,返回前端“登录成功”语句和用户的信息,否则,返回“帐号不存在”语句。如果密码不对,返回“用户名或者密码错误”语句。
  3. 用户可以重置密码、找回密码,接收到来自前端的请求之后,后端根据新的用户信息,对数据库的数据进行更新。如果用户信息不存在,返回“用户数据不存在”语句。后端更新数据操作成功,则返回“重置密码成功”语句和用户的新信息,操作不成功,则返回“重置密码失败”语句。
  4. 可以更新用户信息。前端发送来新的用户信息请求之后,首先判断用户状态是否有效或激活,如果有效,则进行更新操作,操作成功,返回"信息保存成功"语句和用户新信息,操作失败, 就返回“信息保存失败”语句。

2.1 登录操作

    public CommonResult doLogin(String username, String password) {
        User user;
        if (username.contains(EMAIL_FLAG)) {
            //包含@符号,代表用户通过邮箱账号登录
            user = userService.selectByKey(username);
        } else {
            //不包含@符号,代表用户通过手机号登录
            user = userService.selectByPhon e(username);
        }
        if (user == null) {
            return CommonResult.error("账号不存在");
        }

        if (!password.equals(user.getPassword())) {
            return CommonResult.error("用户名或密码错误");
        }
        // 账号被锁定
        if (!user.getUserState()) {
            StpUtil.disable(user.getUserId(), -1);
        }
        StpUtil.login(user.getUserId());
        //更新最后登录时间
        user.setLoginTime(new Date());
        userService.updateById(user);
        //存放用户信息
        Map<String, Object> info = new HashMap<>(4);
        info.put("user", user);
        //存放sessionId, 即 token
        info.put("sessionId", StpUtil.getTokenInfo().getTokenValue());
        List<Role> roles = userService.getRoleList(user.getUserId());
        Set<String> roseNames = roles.stream().map(Role::getRoleName).collect(Collectors.toSet());
        Set<String> roseDescribes = roles.stream().map(Role::getRoleDescribe).collect(Collectors.toSet());
        info.put("role", roseNames);
        info.put("roleInfo", roseDescribes);
        return CommonResult.success("登录成功", info);
    }

2.2 注册新用户

    @RequestMapping(value = "/allow/add")
    public CommonResult add(User user) {
        if (user.getPassword() != null && user.getUserName() != null) {
/*//            String encodePassword = SaSecureUtil.md5BySalt(user.getPassword(), user.getAccountNumber());*/
            user.setPassword(user.getPassword());
            user.setUserState(true);
            user.setStatus(UserStatusEnum.CUSTOMER);
            if (userService.insertData(user)) {
                log.info("用户添加成功,用户信息:{}", user);
                return CommonResult.success("注册成功", user);
            } else {
                return CommonResult.error("注册失败");
            }
        }
        return CommonResult.error("用户数据不存在");
    }

2.3 更新用户信息

@RequestMapping(value = "/allow/update")
    public CommonResult update(User user) {
        if (user.getUserState() != null && user.getUserState()) {
            StpUtil.untieDisable(user.getUserId());
        }
        if (userService.updateById(user)) {
            return CommonResult.success("信息保存成功", user);
        }
        return CommonResult.error("信息保存失败");
    }

2.4 重置密码、找回密码

@RequestMapping(value = "/allow/resetpwd")
    public CommonResult resetPwd(String account, String password) {
        if (account != null && password != null) {
            Integer id = userService.selectIdByKey(account);

/*//           String encodePassword = SaSecureUtil.md5BySalt(password, account);*/
            User user = new User();
            user.setUserId(id);
            user.setPassword(password);
            if (userService.updateById(user)) {
                return CommonResult.success("重置密码成功", user);
            }
            return CommonResult.error("重置密码失败");
        }
        return CommonResult.error("用户数据不存在");
    }

三、遇到的问题和解决方案

3.1 问题1:用户注册时,邮箱或手机号重复

用户在注册时,系统没有正确检测到邮箱或手机号已经存在,导致注册失败。
原因:
检查邮箱或手机号是否存在的方法返回值处理不当,或者数据库查询逻辑有误。
解决方案:
优化查询逻辑:确保在检查邮箱或手机号是否存在时,返回值处理正确。

3.2 问题2:用户状态检查不准确

用户在被锁定状态下仍然能够登录系统。
原因:
在检查用户状态时,逻辑判断有误,没有正确地禁用被锁定的用户。
解决方案:
检查用户状态:在用户登录时,先检查用户的锁定状态,如果用户被锁定,则禁止登录并返回相应提示。

四、总结

用户登录、注册、更新还是后端开发比较基础的部分,通过写完这部分的代码,让我对项目开发有了更加明确的认识。

五、参考博客

登录注册保姆级教程

springboot学习

...全文
1980 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

113

社区成员

发帖
与我相关
我的任务
社区描述
202401_CS_SE_FZU
软件工程 高校
社区管理员
  • FZU_SE_TeacherL
  • 助教_林日臻
  • 防震水泥
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧