若依框架——注册解析

668 阅读3分钟

注册

一:注册接口

@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
    if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
    {
        return error("当前系统没有开启注册功能!");
    }
    String msg = registerService.register(user);
    return StringUtils.isEmpty(msg) ? success() : error(msg);
}

1、判断功能是否开启

首先是获取键值 , 看项目配置,是否开启用户注册功能

利用的是 configService 的 selectConfigByKey 方法

先查询缓存,,如果缓存中没有的话,把键给一个实体对象,然后查询数据库

查看数据库中, sys.account.registerUser 对应的configValue的值

    /**
     * 根据键名查询参数配置信息
     * 
     * @param configKey 参数key    sys.account.registerUser
     * @return 参数键值
     */
    @Override
    public String selectConfigByKey(String configKey) 
    {
        String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
        if (StringUtils.isNotEmpty(configValue))
        {
            return configValue; // "true"
        }
        SysConfig config = new SysConfig();
        config.setConfigKey(configKey);
        SysConfig retConfig = configMapper.selectConfig(config);
        if (StringUtils.isNotNull(retConfig))
        {
            redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
            return retConfig.getConfigValue();
        }
        return StringUtils.EMPTY;
    }

2、注册实现

然后就是调用 registerService 的 register 方法,进行注册

/**
 * 注册
 */
public String register(RegisterBody registerBody)
{
    String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword();
    SysUser sysUser = new SysUser();
    sysUser.setUserName(username);

    // 验证码开关
    boolean captchaEnabled = configService.selectCaptchaEnabled();
    if (captchaEnabled)
    {
        validateCaptcha(username, registerBody.getCode(), registerBody.getUuid());
    }

    if (StringUtils.isEmpty(username))
    {
        msg = "用户名不能为空";
    }
    else if (StringUtils.isEmpty(password))
    {
        msg = "用户密码不能为空";
    }
    else if (username.length() < UserConstants.USERNAME_MIN_LENGTH
            || username.length() > UserConstants.USERNAME_MAX_LENGTH)
    {
        msg = "账户长度必须在2到20个字符之间";
    }
    else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
            || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
    {
        msg = "密码长度必须在5到20个字符之间";
    }
    else if (!userService.checkUserNameUnique(sysUser))
    {
        msg = "保存用户'" + username + "'失败,注册账号已存在";
    }
    else
    {
        sysUser.setNickName(username);
        sysUser.setPassword(SecurityUtils.encryptPassword(password));
        boolean regFlag = userService.registerUser(sysUser);
        if (!regFlag)
        {
            msg = "注册失败,请联系系统管理人员";
        }
        else
        {
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")));
        }
    }
    return msg;
}

理解解释:

        String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword();
        SysUser sysUser = new SysUser();
        sysUser.setUserName(username);
  • 首先定义一个空的 msg 字符串,方便后续使用
  • 将参数 registerBody 的 用户名 和 密码 字段,抽取出来
  • 创建一个用户对象,将 用户名 传进去
        // 验证码开关
        boolean captchaEnabled = configService.selectCaptchaEnabled();
        if (captchaEnabled)
        {
            validateCaptcha(username, registerBody.getCode(), registerBody.getUuid());
        }

  • 校验验证码的开关

  •     @Override
        public boolean selectCaptchaEnabled()
        {
            String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled"); //true 就是一个根据键 查 值得方法
            if (StringUtils.isEmpty(captchaEnabled))
            {
                return true;
            }
            return Convert.toBool(captchaEnabled); //将字符串转 boolean 的 方法
        }
    
  • 如果验证码是开的话 ,校验验证码

  •      * 校验验证码
         * 
         * @param username 用户名
         * @param code 验证码
         * @param uuid 唯一标识
         * @return 结果
         */
        public void validateCaptcha(String username, String code, String uuid)
        {
            String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); ////captcha_codes: uuid
            String captcha = redisCache.getCacheObject(verifyKey);
            redisCache.deleteObject(verifyKey);
            if (captcha == null) //缓存中,验证码为空,抛出异常
            {
                throw new CaptchaExpireException();
            }
            if (!code.equalsIgnoreCase(captcha)) // 输入得验证码和 缓存中不匹配的 报错
            {
                throw new CaptchaException();
            }
        }
    

    利用 validateCaptcha 方法,传入用户名,验证码, uuid 进行校验

 if (StringUtils.isEmpty(username))
        {
            msg = "用户名不能为空";
        }
        else if (StringUtils.isEmpty(password))
        {
            msg = "用户密码不能为空";
        }
        else if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
        {
            msg = "账户长度必须在2到20个字符之间";
        }
        else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
        {
            msg = "密码长度必须在5到20个字符之间";
        }
        else if (!userService.checkUserNameUnique(sysUser))
        {
            msg = "保存用户'" + username + "'失败,注册账号已存在";
        }
  • 验证用户名和密码不能为空
  • 用户名和密码规格符合要求
  • 用户名不能和数据库中重复
  • 如果错,统一抛出错误原因
 else
        {
            sysUser.setNickName(username);
            sysUser.setPassword(SecurityUtils.encryptPassword(password));
            boolean regFlag = userService.registerUser(sysUser);
            if (!regFlag)
            {
                msg = "注册失败,请联系系统管理人员";
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")));
            }
        }
        return msg;
  • 设置昵称

  • 设置解密后的密码

  • 利用 userService 的 refisterUser 方法 ,更新数据库

  • insert into sys_user(
     			<if test="userId != null and userId != 0">user_id,</if>
     			<if test="deptId != null and deptId != 0">dept_id,</if>
     			<if test="userName != null and userName != ''">user_name,</if>
     			<if test="nickName != null and nickName != ''">nick_name,</if>
     			<if test="email != null and email != ''">email,</if>
     			<if test="avatar != null and avatar != ''">avatar,</if>
     			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
     			<if test="sex != null and sex != ''">sex,</if>
     			<if test="password != null and password != ''">password,</if>
     			<if test="status != null and status != ''">status,</if>
     			<if test="createBy != null and createBy != ''">create_by,</if>
     			<if test="remark != null and remark != ''">remark,</if>
     			create_time
     		)values(
     			<if test="userId != null and userId != ''">#{userId},</if>
     			<if test="deptId != null and deptId != ''">#{deptId},</if>
     			<if test="userName != null and userName != ''">#{userName},</if>
     			<if test="nickName != null and nickName != ''">#{nickName},</if>
     			<if test="email != null and email != ''">#{email},</if>
     			<if test="avatar != null and avatar != ''">#{avatar},</if>
     			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
     			<if test="sex != null and sex != ''">#{sex},</if>
     			<if test="password != null and password != ''">#{password},</if>
     			<if test="status != null and status != ''">#{status},</if>
     			<if test="createBy != null and createBy != ''">#{createBy},</if>
     			<if test="remark != null and remark != ''">#{remark},</if>
     			sysdate()
     		)
    
  • 如果注册失败,设置 msg 为 “注册失败,请联系系统管理人员”。

  • 如果注册成功,通过异步方式,记录登录信息。

  • 最后方法返回 msg 字符串,表示注册的结果信息。

备注:

密码加密:

创建 BCryptPasswordEncoder 对象,然后通过 encode 方法 加密密码

    /**
     * 生成BCryptPasswordEncoder密码
     *
     * @param password 密码
     * @return 加密字符串
     */
    public static String encryptPassword(String password)
    {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.encode(password);
    }