javaScript蓝桥杯-----不能说的秘密


一、介绍

密码生成器是一个实用的随机密码生成软件,有了它,你就不用绞尽脑汁想复杂的密码来守护你的个人隐私,只要动一下手指,一个新的密码就会生成。

如此好用的工具,下面就让我们亲自动手来制作一个吧~

二、目标

请完善 generatePassword.js 中的 generatePassword 函数,实现根据规则随机生成密码的功能。密码长度已由 input 框(id=passwordLength)的属性进行了限制最小 4,最大 20。

  1. 生成的密码必须包含已选中的选项且只能由已选中的选项组成。
  2. 特殊符号如下:!@#$%^&*(){}[]=<>/,.
  3. 本题封装方法时只需要考虑长度符合要求( 4-20 )且有已选中条件的情况,其他情况无需处理。

完成后,最终页面效果如下:
在这里插入图片描述

三、代码

html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>不能说的秘密</title>
    <link rel="stylesheet" href="./css/style.css" />
  </head>
  <body>
    <div class="container">
      <div class="frame">
        <div class="nav">
          <ul>
            <li><a class="btn">密码生成器</a></li>
          </ul>
        </div>
        <div class="form-signin">
          <label for="username">生成的密码</label>
          <input
            id="result"
            class="form-styling"
            type="text"
            name="username"
            disabled
            placeholder=""
          />
          <div class="settings">
            <div class="setting">
              <label>密码长度</label>
              <input
                type="number"
                id="passwordLength"
                min="4"
                max="20"
                value="20"
              />
            </div>
            <div class="setting">
              <label>包含大写字母</label>
              <input type="checkbox" value="uppercase" id="uppercase" />
            </div>
            <div class="setting">
              <label>包含小写字母</label>
              <input value="lowercase" type="checkbox" id="lowercase" />
            </div>
            <div class="setting">
              <label>包含数字</label>
              <input value="numbers" type="checkbox" id="numbers" />
            </div>
            <div class="setting">
              <label>包含特殊符号</label>
              <input value="symbols" type="checkbox" id="symbols" />
            </div>
          </div>
          <div class="btn-animate" id="generate">生成密码</div>
        </div>
      </div>
    </div>
    <script src="./js/generatePassword.js"></script>
  </body>
</html>

css

html,
body * {
    
    
  box-sizing: border-box;
  font-family: "Open Sans", sans-serif;
}

.container {
    
    
  width: 100%;
  padding-top: 60px;
  padding-bottom: 100px;
}

.frame {
    
    
  height: 575px;
  width: 430px;
  background: linear-gradient(rgba(35, 43, 85, 0.75), rgba(35, 43, 85, 0.95));
  margin-left: auto;
  margin-right: auto;
  border-top: solid 1px rgba(255, 255, 255, 0.5);
  border-radius: 5px;
  box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.2);
  overflow: hidden;
  transition: all 0.5s ease;
}

.nav {
    
    
  width: 100%;
  height: 100px;
  padding-top: 40px;
  opacity: 1;
  transition: all 0.5s ease;
}

li {
    
    
  padding-left: 10px;
  font-size: 18px;
  display: inline;
  text-align: left;
  text-transform: uppercase;
  padding-right: 10px;
  color: #ffffff;
}

.form-signin {
    
    
  width: 430px;
  height: 375px;
  font-size: 16px;
  font-weight: 300;
  padding-left: 37px;
  padding-right: 37px;
  padding-top: 55px;
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.form-styling {
    
    
  width: 100%;
  height: 35px;
  padding-left: 15px;
  border: none;
  border-radius: 20px;
  margin-bottom: 20px;
  background: rgba(255, 255, 255, 0.2);
}

label {
    
    
  font-weight: 400;
  text-transform: uppercase;
  font-size: 13px;
  padding-left: 15px;
  padding-bottom: 10px;
  color: rgba(255, 255, 255, 0.7);
  display: block;
}

:focus {
    
    
  outline: none;
}

.btn-signin {
    
    
  float: left;
  padding-top: 8px;
  width: 100%;
  height: 35px;
  border: none;
  border-radius: 20px;
  margin-top: -8px;
}

.btn-animate {
    
    
  font-weight: 700;
  text-transform: uppercase;
  font-size: 13px;
  text-align: center;
  color: rgba(255, 255, 255, 1);
  width: 100%;
  height: 35px;
  line-height: 35px;
  border: none;
  border-radius: 20px;
  margin-top: 23px;
  background-color: rgba(16, 89, 255, 1);
}
.setting {
    
    
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin: 15px 0;
}

js

const resultEl = document.getElementById("result");
const lengthEl = document.getElementById("passwordLength");
const uppercaseEl = document.getElementById("uppercase");
const lowercaseEl = document.getElementById("lowercase");
const numbersEl = document.getElementById("numbers");
const symbolsEl = document.getElementById("symbols");
const generateEl = document.getElementById("generate");

generateEl.addEventListener("click", () => {
    
    
  const length = +lengthEl.value; // 获取密码长度
  const hasLower = lowercaseEl.checked; // 获取包含小写是否选中
  const hasUpper = uppercaseEl.checked; // 获取包含大写是否选中
  const hasNumber = numbersEl.checked; // 获取包含数字是否选择
  const hasSymbol = symbolsEl.checked; // 获取包含特殊字母是否选中
  // 将随机生成的密码显示到 input 框中
  resultEl.value =
    generatePassword(hasLower, hasUpper, hasNumber, hasSymbol, length) ?? "";
});

/**
 * @function_name generatePassword ->生成密码的函数
 * @param {*} lower 是否小写
 * @param {*} upper 是否大写
 * @param {*} number 是否是数字
 * @param {*} symbol 是否是特殊符号
 * @param {*} length 密码长度
 * @return {*} string
 */
function generatePassword(lower, upper, number, symbol, length) {
    
    
  //TODO:待补充代码
}

四、答案

 function generatePassword(lower, upper, number, symbol, length) {
    
    
  //TODO:待补充代码
  //26个小写字母
  const lowerCase = 'abcdefghijklmnopqrstuvwxyz'
  //26个大写字母
  const upperCase = lowerCase.toUpperCase()
  //特殊字符
  const specialCase = '!@#$%^&*(){}[]=<>/,.'
  //封装获取随机数字 长度为0-length
  function getRandom(max) {
    
    
    let random = Math.random() //[0,1)
    random = random * max //[0,max)
    random = Math.round(random) //[0,max]
    return random
  }
  //定义密码
  let str = ''
  //记录已经生成的密码长度
  while (str.length < length) {
    
    
    //包含小写
    if (lower) {
    
    
      str += lowerCase.charAt(getRandom(lowerCase.length))
      if (str.length >= length) {
    
    
        break
      }
    }
    //包含大写
    if (upper) {
    
    
      str += upperCase.charAt(getRandom(upperCase.length))
      if (str.length >= length) {
    
    
        break
      }
    }
    //包含数字
    if (number) {
    
    
      str += getRandom(9)
      if (str.length >= length) {
    
    
        break
      }
    }
    //包含特殊字符
    if (symbol) {
    
    
      str += specialCase.charAt(getRandom(specialCase.length))
      if (str.length >= length) {
    
    
        break
      }
    }
  }
  //循环走出来说明密码已经生成
  return str
}

猜你喜欢

转载自blog.csdn.net/m0_58065010/article/details/129919844